<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/26002">View Change</a></p><div style="white-space:pre-wrap">Approvals:
pespin: Looks good to me, approved; Verified
fixeria: Looks good to me, but someone else must approve
laforge: Looks good to me, but someone else must approve
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Move protocol related code in main.c to related proto files<br><br>Change-Id: I771b3d3f61207137477eed2b316a5f670fb79ef2<br>---<br>M include/osmocom/hnodeb/Makefile.am<br>M include/osmocom/hnodeb/hnodeb.h<br>A include/osmocom/hnodeb/nas.h<br>M include/osmocom/hnodeb/ranap.h<br>M include/osmocom/hnodeb/rua.h<br>M src/osmo-hnodeb/Makefile.am<br>M src/osmo-hnodeb/main.c<br>A src/osmo-hnodeb/nas.c<br>M src/osmo-hnodeb/ranap.c<br>M src/osmo-hnodeb/rua.c<br>M src/osmo-hnodeb/vty.c<br>11 files changed, 389 insertions(+), 339 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/hnodeb/Makefile.am b/include/osmocom/hnodeb/Makefile.am</span><br><span>index f6c91b4..197568c 100644</span><br><span>--- a/include/osmocom/hnodeb/Makefile.am</span><br><span>+++ b/include/osmocom/hnodeb/Makefile.am</span><br><span>@@ -1,6 +1,7 @@</span><br><span> noinst_HEADERS = \</span><br><span> hnbap.h \</span><br><span> hnodeb.h \</span><br><span style="color: hsl(120, 100%, 40%);">+ nas.h \</span><br><span> ranap.h \</span><br><span> rua.h \</span><br><span> vty.h \</span><br><span>diff --git a/include/osmocom/hnodeb/hnodeb.h b/include/osmocom/hnodeb/hnodeb.h</span><br><span>index 261fc3a..50432d1 100644</span><br><span>--- a/include/osmocom/hnodeb/hnodeb.h</span><br><span>+++ b/include/osmocom/hnodeb/hnodeb.h</span><br><span>@@ -100,12 +100,5 @@</span><br><span> struct hnb *hnb_alloc(void *tall_ctx);</span><br><span> int hnb_connect(struct hnb *hnb);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_rx_iu_release(struct hnb *hnb);</span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_rx_paging(struct hnb *hnb, const char *imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_nas_rx_dtap(struct hnb *hnb, void *data, int len);</span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_rx_secmode_cmd(struct hnb *hnb, long ip_alg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *gen_initue_lu(int is_ps, uint32_t conn_id, const char *imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> extern void *tall_hnb_ctx;</span><br><span> extern struct hnb *g_hnb;</span><br><span>diff --git a/include/osmocom/hnodeb/nas.h b/include/osmocom/hnodeb/nas.h</span><br><span>new file mode 100644</span><br><span>index 0000000..f6a7976</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/hnodeb/nas.h</span><br><span>@@ -0,0 +1,24 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2015 by Daniel Willmann <dwillmann@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program. If not, see <http://www.gnu.org/lienses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct hnb;</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_nas_rx_dtap(struct hnb *hnb, void *data, int len);</span><br><span>diff --git a/include/osmocom/hnodeb/ranap.h b/include/osmocom/hnodeb/ranap.h</span><br><span>index f68006f..df756b1 100644</span><br><span>--- a/include/osmocom/hnodeb/ranap.h</span><br><span>+++ b/include/osmocom/hnodeb/ranap.h</span><br><span>@@ -19,8 +19,15 @@</span><br><span> */</span><br><span> #pragma once</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct hnb;</span><br><span> struct ranap_message_s;</span><br><span> #include <osmocom/hnodeb/hnodeb.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_rx_iu_release(struct hnb *hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_rx_paging(struct hnb *hnb, const char *imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_rx_secmode_cmd(struct hnb *hnb, long ip_alg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void hnb_rua_dt_handle_ranap(struct hnb *hnb, struct ranap_message_s *ranap_msg);</span><br><span> void hnb_rua_cl_handle_ranap(struct hnb *hnb, struct ranap_message_s *ranap_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_tx_iu_release_req(struct hnb *hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *gen_initue_lu(int is_ps, uint32_t conn_id, const char *imsi);</span><br><span>diff --git a/include/osmocom/hnodeb/rua.h b/include/osmocom/hnodeb/rua.h</span><br><span>index 9d7cc12..52221be 100644</span><br><span>--- a/include/osmocom/hnodeb/rua.h</span><br><span>+++ b/include/osmocom/hnodeb/rua.h</span><br><span>@@ -22,5 +22,7 @@</span><br><span> #include <asn1c/ANY.h></span><br><span> </span><br><span> struct hnb;</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb;</span><br><span> </span><br><span> int hnb_rua_rx(struct hnb *hnb, struct msgb *msg);</span><br><span style="color: hsl(120, 100%, 40%);">+int hnb_tx_dt(struct hnb *hnb, struct msgb *txm);</span><br><span>diff --git a/src/osmo-hnodeb/Makefile.am b/src/osmo-hnodeb/Makefile.am</span><br><span>index 7353cd8..139b6b0 100644</span><br><span>--- a/src/osmo-hnodeb/Makefile.am</span><br><span>+++ b/src/osmo-hnodeb/Makefile.am</span><br><span>@@ -33,6 +33,7 @@</span><br><span> debug.c \</span><br><span> hnbap.c \</span><br><span> hnb.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ nas.c \</span><br><span> ranap.c \</span><br><span> rua.c \</span><br><span> vty.c \</span><br><span>diff --git a/src/osmo-hnodeb/main.c b/src/osmo-hnodeb/main.c</span><br><span>index dc662aa..9c7a548 100644</span><br><span>--- a/src/osmo-hnodeb/main.c</span><br><span>+++ b/src/osmo-hnodeb/main.c</span><br><span>@@ -33,28 +33,12 @@</span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/tlv.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm48.h></span><br><span> </span><br><span> #include <osmocom/vty/telnet_interface.h></span><br><span> #include <osmocom/vty/logging.h></span><br><span> #include <osmocom/vty/command.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/crypt/auth.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/rua/rua_msg_factory.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/iu_helpers.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/ranap_msg_factory.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/rua/RUA_RUA-PDU.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/RANAP_ProcedureCode.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/RANAP_Criticality.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/RANAP_DirectTransfer.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/ranap_common.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ranap/ranap_common.h> /* ranap_set_log_area() */</span><br><span> </span><br><span> #include <osmocom/hnodeb/hnbap.h></span><br><span> #include <osmocom/hnodeb/rua.h></span><br><span>@@ -65,326 +49,11 @@</span><br><span> void *tall_hnb_ctx;</span><br><span> struct hnb *g_hnb;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *rua_new_udt(struct msgb *inmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct msgb *gen_nas_id_resp()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t id_resp[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- GSM48_PDISC_MM,</span><br><span style="color: hsl(0, 100%, 40%);">- GSM48_MT_MM_ID_RESP,</span><br><span style="color: hsl(0, 100%, 40%);">- /* IMEISV */</span><br><span style="color: hsl(0, 100%, 40%);">- 0x09, /* len */</span><br><span style="color: hsl(0, 100%, 40%);">- 0x03, /* first digit (0000) + even (0) + id IMEISV (011) */</span><br><span style="color: hsl(0, 100%, 40%);">- 0x31, 0x91, 0x06, 0x00, 0x28, 0x47, 0x11, /* digits */</span><br><span style="color: hsl(0, 100%, 40%);">- 0xf2, /* filler (1111) + last digit (0010) */</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return ranap_new_msg_dt(0, id_resp, sizeof(id_resp));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct msgb *gen_nas_tmsi_realloc_compl()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t id_resp[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- GSM48_PDISC_MM,</span><br><span style="color: hsl(0, 100%, 40%);">- GSM48_MT_MM_TMSI_REALL_COMPL,</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return ranap_new_msg_dt(0, id_resp, sizeof(id_resp));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct msgb *gen_nas_auth_resp(uint8_t *sres)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t id_resp[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- GSM48_PDISC_MM,</span><br><span style="color: hsl(0, 100%, 40%);">- 0x80 | GSM48_MT_MM_AUTH_RESP, /* simulate sequence nr 2 */</span><br><span style="color: hsl(0, 100%, 40%);">- 0x61, 0xb5, 0x69, 0xf5 /* hardcoded SRES */</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memcpy(id_resp + 2, sres, 4);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return ranap_new_msg_dt(0, id_resp, sizeof(id_resp));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int hnb_tx_dt(struct hnb *hnb, struct msgb *txm)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct hnb_chan *chan;</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *rua;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- chan = hnb->cs.chan;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!chan) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("hnb_nas_tx_tmsi_realloc_compl(): No CS channel established yet.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rua = rua_new_dt(chan->is_ps, chan->conn_id, txm);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_wqueue_enqueue(&hnb->wqueue, rua);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct tlv_parsed *parse_mm(struct gsm48_hdr *gh, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- static struct tlv_parsed tp;</span><br><span style="color: hsl(0, 100%, 40%);">- int parse_res;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- len -= (const char *)&gh->data[0] - (const char *)gh;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(gsm48_hdr_pdisc(gh) == GSM48_PDISC_MM);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- parse_res = tlv_parse(&tp, &gsm48_mm_att_tlvdef, &gh->data[0], len, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- if (parse_res <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t msg_type = gsm48_hdr_msg_type(gh);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Error parsing MM message 0x%hhx: %d\n", msg_type, parse_res);</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return &tp;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int hnb_nas_rx_lu_accept(struct gsm48_hdr *gh, int len, int *sent_tmsi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" :D Location Update Accept :D\n");</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_loc_area_id *lai;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- lai = (struct gsm48_loc_area_id *)&gh->data[0];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_location_area_id laid;</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_decode_lai2(lai, &laid);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("LU: mcc %s mnc %s lac %hd\n",</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_mcc_name(laid.plmn.mcc), osmo_mnc_name(laid.plmn.mnc, laid.plmn.mnc_3_digits),</span><br><span style="color: hsl(0, 100%, 40%);">- laid.lac);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct tlv_parsed tp;</span><br><span style="color: hsl(0, 100%, 40%);">- int parse_res;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- len -= (const char *)&gh->data[0] - (const char *)gh;</span><br><span style="color: hsl(0, 100%, 40%);">- parse_res = tlv_parse(&tp, &gsm48_mm_att_tlvdef, &gh->data[0], len, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- if (parse_res <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Error parsing Location Update Accept message: %d\n", parse_res);</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (TLVP_PRESENT(&tp, GSM48_IE_MOBILE_ID)) {</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t type = TLVP_VAL(&tp, GSM48_IE_NAME_SHORT)[0] & 0x0f;</span><br><span style="color: hsl(0, 100%, 40%);">- if (type == GSM_MI_TYPE_TMSI)</span><br><span style="color: hsl(0, 100%, 40%);">- *sent_tmsi = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- else *sent_tmsi = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_nas_rx_mm_info(struct gsm48_hdr *gh, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" :) MM Info :)\n");</span><br><span style="color: hsl(0, 100%, 40%);">- struct tlv_parsed *tp = parse_mm(gh, len);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!tp)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (TLVP_PRESENT(tp, GSM48_IE_NAME_SHORT)) {</span><br><span style="color: hsl(0, 100%, 40%);">- char name[128] = {0};</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_7bit_decode_n(name, 127,</span><br><span style="color: hsl(0, 100%, 40%);">- TLVP_VAL(tp, GSM48_IE_NAME_SHORT)+1,</span><br><span style="color: hsl(0, 100%, 40%);">- (TLVP_LEN(tp, GSM48_IE_NAME_SHORT)-1)*8/7);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Info: Short Network Name: %s\n", name);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (TLVP_PRESENT(tp, GSM48_IE_NAME_LONG)) {</span><br><span style="color: hsl(0, 100%, 40%);">- char name[128] = {0};</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_7bit_decode_n(name, 127,</span><br><span style="color: hsl(0, 100%, 40%);">- TLVP_VAL(tp, GSM48_IE_NAME_LONG)+1,</span><br><span style="color: hsl(0, 100%, 40%);">- (TLVP_LEN(tp, GSM48_IE_NAME_LONG)-1)*8/7);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Info: Long Network Name: %s\n", name);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int hnb_nas_rx_auth_req(struct hnb *hnb, struct gsm48_hdr *gh,</span><br><span style="color: hsl(0, 100%, 40%);">- int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_auth_req *ar;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- len -= (const char *)&gh->data[0] - (const char *)gh;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (len < sizeof(*ar)) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("GSM48 Auth Req does not fit.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" :) Authentication Request :)\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ar = (struct gsm48_auth_req*) &gh->data[0];</span><br><span style="color: hsl(0, 100%, 40%);">- int seq = ar->key_seq;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Generate SRES from *HARDCODED* Ki for Iuh testing */</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_auth_vector vec;</span><br><span style="color: hsl(0, 100%, 40%);">- /* Ki 000102030405060708090a0b0c0d0e0f */</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_sub_auth_data auth = {</span><br><span style="color: hsl(0, 100%, 40%);">- .type = OSMO_AUTH_TYPE_GSM,</span><br><span style="color: hsl(0, 100%, 40%);">- .algo = OSMO_AUTH_ALG_COMP128v1,</span><br><span style="color: hsl(0, 100%, 40%);">- .u.gsm.ki = {</span><br><span style="color: hsl(0, 100%, 40%);">- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,</span><br><span style="color: hsl(0, 100%, 40%);">- 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,</span><br><span style="color: hsl(0, 100%, 40%);">- 0x0e, 0x0f</span><br><span style="color: hsl(0, 100%, 40%);">- },</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memset(&vec, 0, sizeof(vec));</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_auth_gen_vec(&vec, &auth, ar->rand);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("seq %d rand %s",</span><br><span style="color: hsl(0, 100%, 40%);">- seq, osmo_hexdump(ar->rand, sizeof(ar->rand)));</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" --> sres %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_hexdump(vec.sres, 4));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return hnb_tx_dt(hnb, gen_nas_auth_resp(vec.sres));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_tx_iu_release_req(struct hnb *hnb)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- RANAP_Cause_t cause = {</span><br><span style="color: hsl(0, 100%, 40%);">- .present = RANAP_Cause_PR_radioNetwork,</span><br><span style="color: hsl(0, 100%, 40%);">- .choice.transmissionNetwork = RANAP_CauseRadioNetwork_release_due_to_UE_generated_signalling_connection_release,</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">- hnb_tx_dt(hnb, ranap_new_msg_iu_rel_req(&cause));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_tx_iu_release_compl(struct hnb *hnb)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- hnb_tx_dt(hnb, ranap_new_msg_iu_rel_compl());</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int hnb_nas_rx_mm(struct hnb *hnb, struct gsm48_hdr *gh, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct hnb_chan *chan;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- chan = hnb->cs.chan;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!chan) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("hnb_nas_rx_mm(): No CS channel established yet.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(!chan->is_ps);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t msg_type = gsm48_hdr_msg_type(gh);</span><br><span style="color: hsl(0, 100%, 40%);">- int sent_tmsi;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (msg_type) {</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_MT_MM_ID_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">- return hnb_tx_dt(hnb, gen_nas_id_resp());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_MT_MM_LOC_UPD_ACCEPT:</span><br><span style="color: hsl(0, 100%, 40%);">- if (hnb_nas_rx_lu_accept(gh, len, &sent_tmsi))</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">- if (sent_tmsi)</span><br><span style="color: hsl(0, 100%, 40%);">- return hnb_tx_dt(hnb, gen_nas_tmsi_realloc_compl());</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_MT_MM_LOC_UPD_REJECT:</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Received Location Update Reject\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_MT_MM_INFO:</span><br><span style="color: hsl(0, 100%, 40%);">- hnb_nas_rx_mm_info(gh, len);</span><br><span style="color: hsl(0, 100%, 40%);">- hnb_tx_iu_release_req(hnb);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_MT_MM_AUTH_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">- return hnb_nas_rx_auth_req(hnb, gh, len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- printf("04.08 message type not handled by hnb-test: 0x%x\n",</span><br><span style="color: hsl(0, 100%, 40%);">- msg_type);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_nas_rx_dtap(struct hnb *hnb, void *data, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- printf("got %d bytes: %s\n", len, osmo_hexdump(data, len));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // nas_pdu == '05 08 12' ==> IMEI Identity request</span><br><span style="color: hsl(0, 100%, 40%);">- // '05 04 0d' ==> LU reject</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_hdr *gh = data;</span><br><span style="color: hsl(0, 100%, 40%);">- if (len < sizeof(*gh)) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("hnb_nas_rx_dtap(): NAS PDU is too short: %d. Ignoring.\n",</span><br><span style="color: hsl(0, 100%, 40%);">- len);</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t pdisc = gsm48_hdr_pdisc(gh);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (pdisc) {</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_PDISC_MM:</span><br><span style="color: hsl(0, 100%, 40%);">- rc = hnb_nas_rx_mm(hnb, gh, len);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc != 0)</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Error receiving MM message: %d\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- printf("04.08 discriminator not handled by hnb-test: %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">- pdisc);</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_rx_secmode_cmd(struct hnb *hnb, long ip_alg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" :) Security Mode Command :)\n");</span><br><span style="color: hsl(0, 100%, 40%);">- /* not caring about encryption yet, just pass 0 for No Encryption. */</span><br><span style="color: hsl(0, 100%, 40%);">- hnb_tx_dt(hnb, ranap_new_msg_sec_mod_compl(ip_alg, 0));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_rx_iu_release(struct hnb *hnb)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- hnb_tx_iu_release_compl(hnb);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void hnb_rx_paging(struct hnb *hnb, const char *imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" :) Paging Request for %s :)\n", imsi);</span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO reply */</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern void direct_transfer_nas_pdu_print(ANY_t *in);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static struct vty_app_info vty_info = {</span><br><span> .name = "OsmohNodeB",</span><br><span> .version = "0",</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *gen_initue_lu(int is_ps, uint32_t conn_id, const char *imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t lu[] = { GSM48_PDISC_MM, GSM48_MT_MM_LOC_UPD_REQUEST,</span><br><span style="color: hsl(0, 100%, 40%);">- 0x70, 0x62, 0xf2, 0x30, 0xff, 0xf3, 0x57,</span><br><span style="color: hsl(0, 100%, 40%);">- /* len, IMSI/type, IMSI-------------------------------- */</span><br><span style="color: hsl(0, 100%, 40%);">- 0x08, 0x29, 0x26, 0x24, 0x10, 0x32, 0x54, 0x76, 0x98,</span><br><span style="color: hsl(0, 100%, 40%);">- 0x33, 0x03, 0x57, 0x18 , 0xb2 };</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t plmn_id[] = { 0x09, 0x01, 0x99 };</span><br><span style="color: hsl(0, 100%, 40%);">- RANAP_GlobalRNC_ID_t rnc_id = {</span><br><span style="color: hsl(0, 100%, 40%);">- .rNC_ID = 23,</span><br><span style="color: hsl(0, 100%, 40%);">- .pLMNidentity.buf = plmn_id,</span><br><span style="color: hsl(0, 100%, 40%);">- .pLMNidentity.size = sizeof(plmn_id),</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: patch imsi */</span><br><span style="color: hsl(0, 100%, 40%);">- /* Note: the Mobile Identitiy IE's IMSI data has the identity type and</span><br><span style="color: hsl(0, 100%, 40%);">- * an even/odd indicator bit encoded in the first octet. So the first</span><br><span style="color: hsl(0, 100%, 40%);">- * octet looks like this:</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * 8 7 6 5 | 4 | 3 2 1</span><br><span style="color: hsl(0, 100%, 40%);">- * IMSI-digit | even/odd | type</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * followed by the remaining IMSI digits.</span><br><span style="color: hsl(0, 100%, 40%);">- * If digit count is even (bit 4 == 0), that first high-nibble is 0xf.</span><br><span style="color: hsl(0, 100%, 40%);">- * (derived from Iu pcap Location Update Request msg and TS 25.413)</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * TODO I'm only 90% sure about this</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return ranap_new_msg_initial_ue(conn_id, is_ps, &rnc_id, lu, sizeof(lu));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void handle_options(int argc, char **argv)</span><br><span> {</span><br><span> while (1) {</span><br><span>diff --git a/src/osmo-hnodeb/nas.c b/src/osmo-hnodeb/nas.c</span><br><span>new file mode 100644</span><br><span>index 0000000..163f458</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-hnodeb/nas.c</span><br><span>@@ -0,0 +1,268 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2015 by Daniel Willmann <dwillmann@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program. If not, see <http://www.gnu.org/lienses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "config.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/tlv.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm48.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/crypt/auth.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ranap/ranap_msg_factory.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/rua.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/ranap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/nas.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/hnodeb.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *gen_nas_id_resp()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t id_resp[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM48_PDISC_MM,</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM48_MT_MM_ID_RESP,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* IMEISV */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x09, /* len */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x03, /* first digit (0000) + even (0) + id IMEISV (011) */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x31, 0x91, 0x06, 0x00, 0x28, 0x47, 0x11, /* digits */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xf2, /* filler (1111) + last digit (0010) */</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return ranap_new_msg_dt(0, id_resp, sizeof(id_resp));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *gen_nas_tmsi_realloc_compl()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t id_resp[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM48_PDISC_MM,</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM48_MT_MM_TMSI_REALL_COMPL,</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return ranap_new_msg_dt(0, id_resp, sizeof(id_resp));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *gen_nas_auth_resp(uint8_t *sres)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t id_resp[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM48_PDISC_MM,</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x80 | GSM48_MT_MM_AUTH_RESP, /* simulate sequence nr 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x61, 0xb5, 0x69, 0xf5 /* hardcoded SRES */</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(id_resp + 2, sres, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return ranap_new_msg_dt(0, id_resp, sizeof(id_resp));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct tlv_parsed *parse_mm(struct gsm48_hdr *gh, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ static struct tlv_parsed tp;</span><br><span style="color: hsl(120, 100%, 40%);">+ int parse_res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ len -= (const char *)&gh->data[0] - (const char *)gh;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(gsm48_hdr_pdisc(gh) == GSM48_PDISC_MM);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ parse_res = tlv_parse(&tp, &gsm48_mm_att_tlvdef, &gh->data[0], len, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (parse_res <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t msg_type = gsm48_hdr_msg_type(gh);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Error parsing MM message 0x%hhx: %d\n", msg_type, parse_res);</span><br><span style="color: hsl(120, 100%, 40%);">+ return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return &tp;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int hnb_nas_rx_lu_accept(struct gsm48_hdr *gh, int len, int *sent_tmsi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" :D Location Update Accept :D\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_loc_area_id *lai;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ lai = (struct gsm48_loc_area_id *)&gh->data[0];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_location_area_id laid;</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm48_decode_lai2(lai, &laid);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("LU: mcc %s mnc %s lac %hd\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_mcc_name(laid.plmn.mcc), osmo_mnc_name(laid.plmn.mnc, laid.plmn.mnc_3_digits),</span><br><span style="color: hsl(120, 100%, 40%);">+ laid.lac);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct tlv_parsed tp;</span><br><span style="color: hsl(120, 100%, 40%);">+ int parse_res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ len -= (const char *)&gh->data[0] - (const char *)gh;</span><br><span style="color: hsl(120, 100%, 40%);">+ parse_res = tlv_parse(&tp, &gsm48_mm_att_tlvdef, &gh->data[0], len, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (parse_res <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Error parsing Location Update Accept message: %d\n", parse_res);</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TLVP_PRESENT(&tp, GSM48_IE_MOBILE_ID)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t type = TLVP_VAL(&tp, GSM48_IE_NAME_SHORT)[0] & 0x0f;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (type == GSM_MI_TYPE_TMSI)</span><br><span style="color: hsl(120, 100%, 40%);">+ *sent_tmsi = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ else *sent_tmsi = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_nas_rx_mm_info(struct gsm48_hdr *gh, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" :) MM Info :)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ struct tlv_parsed *tp = parse_mm(gh, len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!tp)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TLVP_PRESENT(tp, GSM48_IE_NAME_SHORT)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ char name[128] = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_7bit_decode_n(name, 127,</span><br><span style="color: hsl(120, 100%, 40%);">+ TLVP_VAL(tp, GSM48_IE_NAME_SHORT)+1,</span><br><span style="color: hsl(120, 100%, 40%);">+ (TLVP_LEN(tp, GSM48_IE_NAME_SHORT)-1)*8/7);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Info: Short Network Name: %s\n", name);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TLVP_PRESENT(tp, GSM48_IE_NAME_LONG)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ char name[128] = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_7bit_decode_n(name, 127,</span><br><span style="color: hsl(120, 100%, 40%);">+ TLVP_VAL(tp, GSM48_IE_NAME_LONG)+1,</span><br><span style="color: hsl(120, 100%, 40%);">+ (TLVP_LEN(tp, GSM48_IE_NAME_LONG)-1)*8/7);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Info: Long Network Name: %s\n", name);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int hnb_nas_rx_auth_req(struct hnb *hnb, struct gsm48_hdr *gh,</span><br><span style="color: hsl(120, 100%, 40%);">+ int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_auth_req *ar;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ len -= (const char *)&gh->data[0] - (const char *)gh;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (len < sizeof(*ar)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("GSM48 Auth Req does not fit.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" :) Authentication Request :)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ar = (struct gsm48_auth_req*) &gh->data[0];</span><br><span style="color: hsl(120, 100%, 40%);">+ int seq = ar->key_seq;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Generate SRES from *HARDCODED* Ki for Iuh testing */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_auth_vector vec;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Ki 000102030405060708090a0b0c0d0e0f */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_sub_auth_data auth = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .type = OSMO_AUTH_TYPE_GSM,</span><br><span style="color: hsl(120, 100%, 40%);">+ .algo = OSMO_AUTH_ALG_COMP128v1,</span><br><span style="color: hsl(120, 100%, 40%);">+ .u.gsm.ki = {</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x0e, 0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(&vec, 0, sizeof(vec));</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_auth_gen_vec(&vec, &auth, ar->rand);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("seq %d rand %s",</span><br><span style="color: hsl(120, 100%, 40%);">+ seq, osmo_hexdump(ar->rand, sizeof(ar->rand)));</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" --> sres %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_hexdump(vec.sres, 4));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return hnb_tx_dt(hnb, gen_nas_auth_resp(vec.sres));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int hnb_nas_rx_mm(struct hnb *hnb, struct gsm48_hdr *gh, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct hnb_chan *chan;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ chan = hnb->cs.chan;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!chan) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("hnb_nas_rx_mm(): No CS channel established yet.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(!chan->is_ps);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t msg_type = gsm48_hdr_msg_type(gh);</span><br><span style="color: hsl(120, 100%, 40%);">+ int sent_tmsi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (msg_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM48_MT_MM_ID_REQ:</span><br><span style="color: hsl(120, 100%, 40%);">+ return hnb_tx_dt(hnb, gen_nas_id_resp());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM48_MT_MM_LOC_UPD_ACCEPT:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (hnb_nas_rx_lu_accept(gh, len, &sent_tmsi))</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (sent_tmsi)</span><br><span style="color: hsl(120, 100%, 40%);">+ return hnb_tx_dt(hnb, gen_nas_tmsi_realloc_compl());</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM48_MT_MM_LOC_UPD_REJECT:</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Received Location Update Reject\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM48_MT_MM_INFO:</span><br><span style="color: hsl(120, 100%, 40%);">+ hnb_nas_rx_mm_info(gh, len);</span><br><span style="color: hsl(120, 100%, 40%);">+ hnb_tx_iu_release_req(hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM48_MT_MM_AUTH_REQ:</span><br><span style="color: hsl(120, 100%, 40%);">+ return hnb_nas_rx_auth_req(hnb, gh, len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("04.08 message type not handled by hnb-test: 0x%x\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ msg_type);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_nas_rx_dtap(struct hnb *hnb, void *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("got %d bytes: %s\n", len, osmo_hexdump(data, len));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // nas_pdu == '05 08 12' ==> IMEI Identity request</span><br><span style="color: hsl(120, 100%, 40%);">+ // '05 04 0d' ==> LU reject</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_hdr *gh = data;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (len < sizeof(*gh)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("hnb_nas_rx_dtap(): NAS PDU is too short: %d. Ignoring.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ len);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t pdisc = gsm48_hdr_pdisc(gh);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (pdisc) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM48_PDISC_MM:</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = hnb_nas_rx_mm(hnb, gh, len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Error receiving MM message: %d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("04.08 discriminator not handled by hnb-test: %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ pdisc);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-hnodeb/ranap.c b/src/osmo-hnodeb/ranap.c</span><br><span>index a6a92cc..8f1b9c0 100644</span><br><span>--- a/src/osmo-hnodeb/ranap.c</span><br><span>+++ b/src/osmo-hnodeb/ranap.c</span><br><span>@@ -18,11 +18,15 @@</span><br><span> *</span><br><span> */</span><br><span> #include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span> </span><br><span> #include <osmocom/ranap/ranap_common_cn.h></span><br><span> #include <osmocom/ranap/ranap_ies_defs.h></span><br><span> #include <osmocom/ranap/iu_helpers.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ranap/ranap_msg_factory.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/nas.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/rua.h></span><br><span> #include <osmocom/hnodeb/ranap.h></span><br><span> </span><br><span> static const char *printstr(OCTET_STRING_t *s)</span><br><span>@@ -105,3 +109,67 @@</span><br><span> return;</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *gen_initue_lu(int is_ps, uint32_t conn_id, const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t lu[] = { GSM48_PDISC_MM, GSM48_MT_MM_LOC_UPD_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x70, 0x62, 0xf2, 0x30, 0xff, 0xf3, 0x57,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* len, IMSI/type, IMSI-------------------------------- */</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x08, 0x29, 0x26, 0x24, 0x10, 0x32, 0x54, 0x76, 0x98,</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x33, 0x03, 0x57, 0x18 , 0xb2 };</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t plmn_id[] = { 0x09, 0x01, 0x99 };</span><br><span style="color: hsl(120, 100%, 40%);">+ RANAP_GlobalRNC_ID_t rnc_id = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .rNC_ID = 23,</span><br><span style="color: hsl(120, 100%, 40%);">+ .pLMNidentity.buf = plmn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ .pLMNidentity.size = sizeof(plmn_id),</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: patch imsi */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Note: the Mobile Identitiy IE's IMSI data has the identity type and</span><br><span style="color: hsl(120, 100%, 40%);">+ * an even/odd indicator bit encoded in the first octet. So the first</span><br><span style="color: hsl(120, 100%, 40%);">+ * octet looks like this:</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * 8 7 6 5 | 4 | 3 2 1</span><br><span style="color: hsl(120, 100%, 40%);">+ * IMSI-digit | even/odd | type</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * followed by the remaining IMSI digits.</span><br><span style="color: hsl(120, 100%, 40%);">+ * If digit count is even (bit 4 == 0), that first high-nibble is 0xf.</span><br><span style="color: hsl(120, 100%, 40%);">+ * (derived from Iu pcap Location Update Request msg and TS 25.413)</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * TODO I'm only 90% sure about this</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return ranap_new_msg_initial_ue(conn_id, is_ps, &rnc_id, lu, sizeof(lu));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_tx_iu_release_req(struct hnb *hnb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ RANAP_Cause_t cause = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .present = RANAP_Cause_PR_radioNetwork,</span><br><span style="color: hsl(120, 100%, 40%);">+ .choice.transmissionNetwork = RANAP_CauseRadioNetwork_release_due_to_UE_generated_signalling_connection_release,</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+ hnb_tx_dt(hnb, ranap_new_msg_iu_rel_req(&cause));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_tx_iu_release_compl(struct hnb *hnb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ hnb_tx_dt(hnb, ranap_new_msg_iu_rel_compl());</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_rx_secmode_cmd(struct hnb *hnb, long ip_alg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" :) Security Mode Command :)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ /* not caring about encryption yet, just pass 0 for No Encryption. */</span><br><span style="color: hsl(120, 100%, 40%);">+ hnb_tx_dt(hnb, ranap_new_msg_sec_mod_compl(ip_alg, 0));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_rx_iu_release(struct hnb *hnb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ hnb_tx_iu_release_compl(hnb);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void hnb_rx_paging(struct hnb *hnb, const char *imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" :) Paging Request for %s :)\n", imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO reply */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-hnodeb/rua.c b/src/osmo-hnodeb/rua.c</span><br><span>index 0839c0d..229df30 100644</span><br><span>--- a/src/osmo-hnodeb/rua.c</span><br><span>+++ b/src/osmo-hnodeb/rua.c</span><br><span>@@ -24,10 +24,26 @@</span><br><span> </span><br><span> #include <osmocom/rua/rua_ies_defs.h></span><br><span> #include <osmocom/ranap/ranap_common_cn.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/rua/rua_msg_factory.h></span><br><span> </span><br><span> #include <osmocom/hnodeb/rua.h></span><br><span> #include <osmocom/hnodeb/ranap.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int hnb_tx_dt(struct hnb *hnb, struct msgb *txm)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct hnb_chan *chan;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *rua;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ chan = hnb->cs.chan;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!chan) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("hnb_nas_tx_tmsi_realloc_compl(): No CS channel established yet.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rua = rua_new_dt(chan->is_ps, chan->conn_id, txm);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_wqueue_enqueue(&hnb->wqueue, rua);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> static void hnb_rua_dt_handle(struct hnb *hnb, ANY_t *in)</span><br><span> {</span><br><span>diff --git a/src/osmo-hnodeb/vty.c b/src/osmo-hnodeb/vty.c</span><br><span>index b8dc7da..114f1c0 100644</span><br><span>--- a/src/osmo-hnodeb/vty.c</span><br><span>+++ b/src/osmo-hnodeb/vty.c</span><br><span>@@ -33,6 +33,7 @@</span><br><span> #include <osmocom/ranap/ranap_msg_factory.h></span><br><span> </span><br><span> #include <osmocom/hnodeb/hnbap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/hnodeb/ranap.h></span><br><span> #include <osmocom/hnodeb/vty.h></span><br><span> #include <osmocom/hnodeb/hnodeb.h></span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/26002">change 26002</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-hnodeb/+/26002"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-hnodeb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I771b3d3f61207137477eed2b316a5f670fb79ef2 </div>
<div style="display:none"> Gerrit-Change-Number: 26002 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>