<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>