<p>pespin <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/15335">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, but someone else must approve
  osmith: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Move lots of Iu/ranap specific code into its own file<br><br>RANAP related functionalities were splitted among several files<br>(gprs_gmm.c, gprs_sgsn.c and sgsn_libgtp.c). Let's move it into its own<br>file to shrink complexity/size of existing files.<br>It also allows to keep a lot of conditionally enabled code (BUILD_IU)<br>and its dependencies (osmo-iuh) together.<br><br>Change-Id: I549042aaff045a378de77d657cc396ee08f22f33<br>---<br>M include/osmocom/sgsn/Makefile.am<br>M include/osmocom/sgsn/gprs_gmm.h<br>A include/osmocom/sgsn/gprs_ranap.h<br>M include/osmocom/sgsn/sgsn.h<br>M src/gprs/Makefile.am<br>M src/gprs/gprs_gmm.c<br>A src/gprs/gprs_ranap.c<br>M src/gprs/gprs_sgsn.c<br>M src/gprs/sgsn_libgtp.c<br>M src/gprs/sgsn_main.c<br>M tests/sgsn/Makefile.am<br>11 files changed, 274 insertions(+), 238 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/Makefile.am b/include/osmocom/sgsn/Makefile.am</span><br><span>index cbf7c51..b4cd5db 100644</span><br><span>--- a/include/osmocom/sgsn/Makefile.am</span><br><span>+++ b/include/osmocom/sgsn/Makefile.am</span><br><span>@@ -8,6 +8,7 @@</span><br><span>        gprs_gmm_attach.h \</span><br><span>  gprs_llc.h \</span><br><span>         gprs_llc_xid.h \</span><br><span style="color: hsl(120, 100%, 40%);">+      gprs_ranap.h \</span><br><span>       gprs_sgsn.h \</span><br><span>        gprs_sndcp_comp.h \</span><br><span>  gprs_sndcp_dcomp.h \</span><br><span>diff --git a/include/osmocom/sgsn/gprs_gmm.h b/include/osmocom/sgsn/gprs_gmm.h</span><br><span>index ffcebd3..047bd77 100644</span><br><span>--- a/include/osmocom/sgsn/gprs_gmm.h</span><br><span>+++ b/include/osmocom/sgsn/gprs_gmm.h</span><br><span>@@ -17,8 +17,10 @@</span><br><span> </span><br><span> int gsm0408_gprs_rcvmsg_gb(struct msgb *msg, struct gprs_llc_llme *llme,</span><br><span>                      bool drop_cipherable);</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm0408_gprs_rcvmsg_iu(struct msgb *msg, struct gprs_ra_id *ra_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                    uint16_t *sai);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0408_rcv_gsm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,</span><br><span style="color: hsl(120, 100%, 40%);">+                     struct gprs_llc_llme *llme);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,</span><br><span style="color: hsl(120, 100%, 40%);">+                        struct gprs_llc_llme *llme, bool drop_cipherable);</span><br><span> int gsm0408_gprs_force_reattach(struct sgsn_mm_ctx *mmctx);</span><br><span> int gsm0408_gprs_force_reattach_oldmsg(struct msgb *msg,</span><br><span>                                    struct gprs_llc_llme *llme);</span><br><span>@@ -33,8 +35,6 @@</span><br><span> </span><br><span> time_t gprs_max_time_to_idle(void);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> int gsm48_tx_gmm_id_req(struct sgsn_mm_ctx *mm, uint8_t id_type);</span><br><span> int gsm48_tx_gmm_att_rej(struct sgsn_mm_ctx *mm,</span><br><span>                          uint8_t gmm_cause);</span><br><span>@@ -42,9 +42,12 @@</span><br><span> </span><br><span> int gprs_gmm_attach_req_ies(struct msgb *a, struct msgb *b);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int gsm48_gmm_authorize(struct sgsn_mm_ctx *ctx);</span><br><span> /* TODO: move extract_subscr_* when gsm48_gmm_authorize() got removed */</span><br><span> void extract_subscr_msisdn(struct sgsn_mm_ctx *ctx);</span><br><span> void extract_subscr_hlr(struct sgsn_mm_ctx *ctx);</span><br><span> </span><br><span> void pdp_ctx_detach_mm_ctx(struct sgsn_pdp_ctx *pdp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void mmctx_set_pmm_state(struct sgsn_mm_ctx *ctx, enum gprs_pmm_state state);</span><br><span> #endif /* _GPRS_GMM_H */</span><br><span>diff --git a/include/osmocom/sgsn/gprs_ranap.h b/include/osmocom/sgsn/gprs_ranap.h</span><br><span>new file mode 100644</span><br><span>index 0000000..b300130</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/sgsn/gprs_ranap.h</span><br><span>@@ -0,0 +1,23 @@</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%);">+#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/gprs_sgsn.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef BUILD_IU</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ranap/ranap_ies_defs.h></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%);">+#include <osmocom/ranap/iu_client.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void activate_pdp_rabs(struct sgsn_mm_ctx *ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+int sgsn_ranap_iu_event(struct ranap_ue_conn_ctx *ctx, enum ranap_iu_event_type type, void *data);</span><br><span style="color: hsl(120, 100%, 40%);">+int iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0408_gprs_rcvmsg_iu(struct msgb *msg, struct gprs_ra_id *ra_id, uint16_t *sai);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ranap_ue_conn_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+/* On RANAP, Returns pointer to he associated ranap_ue_conn_ctx in msg, filled</span><br><span style="color: hsl(120, 100%, 40%);">+ * in by osmo-iuh's iu_recv_cb().</span><br><span style="color: hsl(120, 100%, 40%);">+ * On Gb, returns NULL */</span><br><span style="color: hsl(120, 100%, 40%);">+#define MSG_IU_UE_CTX(msg) ((struct ranap_ue_conn_ctx *)(msg)->dst)</span><br><span style="color: hsl(120, 100%, 40%);">+#define MSG_IU_UE_CTX_SET(msg, val) (msg)->dst = (val)</span><br><span>diff --git a/include/osmocom/sgsn/sgsn.h b/include/osmocom/sgsn/sgsn.h</span><br><span>index 78803c7..e1c5c4a 100644</span><br><span>--- a/include/osmocom/sgsn/sgsn.h</span><br><span>+++ b/include/osmocom/sgsn/sgsn.h</span><br><span>@@ -161,7 +161,7 @@</span><br><span> /* Main input function for Gb proxy */</span><br><span> int sgsn_rcvmsg(struct msgb *msg, struct gprs_nsvc *nsvc, uint16_t ns_bvci);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+/* sgsn_libgtp.c */</span><br><span> struct sgsn_pdp_ctx *sgsn_create_pdp_ctx(struct sgsn_ggsn_ctx *ggsn,</span><br><span>                                     struct sgsn_mm_ctx *mmctx,</span><br><span>                                   uint16_t nsapi,</span><br><span>@@ -169,6 +169,7 @@</span><br><span> int sgsn_delete_pdp_ctx(struct sgsn_pdp_ctx *pctx);</span><br><span> void sgsn_pdp_upd_gtp_u(struct sgsn_pdp_ctx *pdp, void *addr, size_t alen);</span><br><span> void sgsn_ggsn_echo_req(struct sgsn_ggsn_ctx *ggc);</span><br><span style="color: hsl(120, 100%, 40%);">+int send_act_pdp_cont_acc(struct sgsn_pdp_ctx *pctx);</span><br><span> </span><br><span> /* gprs_sndcp.c */</span><br><span> </span><br><span>diff --git a/src/gprs/Makefile.am b/src/gprs/Makefile.am</span><br><span>index ba5dfd6..384b893 100644</span><br><span>--- a/src/gprs/Makefile.am</span><br><span>+++ b/src/gprs/Makefile.am</span><br><span>@@ -62,6 +62,7 @@</span><br><span> osmo_sgsn_SOURCES = \</span><br><span>   gprs_gmm_attach.c \</span><br><span>  gprs_gmm.c \</span><br><span style="color: hsl(120, 100%, 40%);">+  gprs_ranap.c \</span><br><span>       gprs_sgsn.c \</span><br><span>        gprs_sndcp.c \</span><br><span>       gprs_sndcp_comp.c \</span><br><span>diff --git a/src/gprs/gprs_gmm.c b/src/gprs/gprs_gmm.c</span><br><span>index 00335e8..5700ee5 100644</span><br><span>--- a/src/gprs/gprs_gmm.c</span><br><span>+++ b/src/gprs/gprs_gmm.c</span><br><span>@@ -47,12 +47,6 @@</span><br><span> </span><br><span> #include <osmocom/gprs/gprs_bssgp.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BUILD_IU</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/ranap_ies_defs.h></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%);">-#include <osmocom/ranap/iu_client.h></span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #include <osmocom/sgsn/debug.h></span><br><span> #include <osmocom/sgsn/gprs_llc.h></span><br><span> #include <osmocom/sgsn/gprs_sgsn.h></span><br><span>@@ -63,6 +57,7 @@</span><br><span> #include <osmocom/sgsn/gprs_gmm_attach.h></span><br><span> #include <osmocom/sgsn/signal.h></span><br><span> #include <osmocom/sgsn/gprs_sndcp.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/gprs_ranap.h></span><br><span> </span><br><span> #include <pdp.h></span><br><span> </span><br><span>@@ -117,14 +112,6 @@</span><br><span>        { 0, NULL }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* On RANAP, Returns pointer to he associated ranap_ue_conn_ctx in msg, filled</span><br><span style="color: hsl(0, 100%, 40%);">- * in by osmo-iuh's iu_recv_cb().</span><br><span style="color: hsl(0, 100%, 40%);">- * On Gb, returns NULL */</span><br><span style="color: hsl(0, 100%, 40%);">-#define MSG_IU_UE_CTX(msg) ((struct ranap_ue_conn_ctx *)(msg)->dst)</span><br><span style="color: hsl(0, 100%, 40%);">-#define MSG_IU_UE_CTX_SET(msg, val) (msg)->dst = (val)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int gsm48_gmm_authorize(struct sgsn_mm_ctx *ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void mmctx_change_gtpu_endpoints_to_sgsn(struct sgsn_mm_ctx *mm_ctx)</span><br><span> {</span><br><span>         struct sgsn_pdp_ctx *pdp;</span><br><span>@@ -188,7 +175,7 @@</span><br><span>      mm->gb.state_T = 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void mmctx_set_pmm_state(struct sgsn_mm_ctx *ctx, enum gprs_pmm_state state)</span><br><span style="color: hsl(120, 100%, 40%);">+void mmctx_set_pmm_state(struct sgsn_mm_ctx *ctx, enum gprs_pmm_state state)</span><br><span> {</span><br><span>        OSMO_ASSERT(ctx->ran_type == MM_CTX_T_UTRAN_Iu);</span><br><span> </span><br><span>@@ -245,62 +232,6 @@</span><br><span>       ctx->pmm_state = state;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BUILD_IU</span><br><span style="color: hsl(0, 100%, 40%);">-int sgsn_ranap_rab_ass_resp(struct sgsn_mm_ctx *ctx, RANAP_RAB_SetupOrModifiedItemIEs_t *setup_ies);</span><br><span style="color: hsl(0, 100%, 40%);">-int sgsn_ranap_iu_event(struct ranap_ue_conn_ctx *ctx, enum ranap_iu_event_type type, void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct sgsn_mm_ctx *mm;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    mm = sgsn_mm_ctx_by_ue_ctx(ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define REQUIRE_MM \</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!mm) { \</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGIUP(ctx, LOGL_NOTICE, "Cannot find mm ctx for IU event %d\n", type); \</span><br><span style="color: hsl(0, 100%, 40%);">-             return rc; \</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%);">-       switch (type) {</span><br><span style="color: hsl(0, 100%, 40%);">- case RANAP_IU_EVENT_RAB_ASSIGN:</span><br><span style="color: hsl(0, 100%, 40%);">-         REQUIRE_MM</span><br><span style="color: hsl(0, 100%, 40%);">-              rc = sgsn_ranap_rab_ass_resp(mm, (RANAP_RAB_SetupOrModifiedItemIEs_t *)data);</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case RANAP_IU_EVENT_IU_RELEASE:</span><br><span style="color: hsl(0, 100%, 40%);">-         /* fall thru */</span><br><span style="color: hsl(0, 100%, 40%);">- case RANAP_IU_EVENT_LINK_INVALIDATED:</span><br><span style="color: hsl(0, 100%, 40%);">-           /* Clean up ranap_ue_conn_ctx here */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (mm)</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGMMCTXP(LOGL_INFO, mm, "IU release for imsi %s\n", mm->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-            else</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGIUP(ctx, LOGL_INFO, "IU release\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               if (mm && mm->pmm_state == PMM_CONNECTED)</span><br><span style="color: hsl(0, 100%, 40%);">-                    mmctx_set_pmm_state(mm, PMM_IDLE);</span><br><span style="color: hsl(0, 100%, 40%);">-              rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case RANAP_IU_EVENT_SECURITY_MODE_COMPLETE:</span><br><span style="color: hsl(0, 100%, 40%);">-             REQUIRE_MM</span><br><span style="color: hsl(0, 100%, 40%);">-              /* Continue authentication here */</span><br><span style="color: hsl(0, 100%, 40%);">-              mm->iu.ue_ctx->integrity_active = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              /* FIXME: remove gmm_authorize */</span><br><span style="color: hsl(0, 100%, 40%);">-               if (mm->pending_req != GSM48_MT_GMM_ATTACH_REQ)</span><br><span style="color: hsl(0, 100%, 40%);">-                      gsm48_gmm_authorize(mm);</span><br><span style="color: hsl(0, 100%, 40%);">-                else</span><br><span style="color: hsl(0, 100%, 40%);">-                    osmo_fsm_inst_dispatch(mm->gmm_att_req.fsm, E_IU_SECURITY_CMD_COMPLETE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (mm)</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGMMCTXP(LOGL_NOTICE, mm, "Unknown event received: %i\n", type);</span><br><span style="color: hsl(0, 100%, 40%);">-             else</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGIUP(ctx, LOGL_NOTICE, "Unknown event received: %i\n", type);</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Our implementation, should be kept in SGSN */</span><br><span> </span><br><span> static void mmctx_timer_cb(void *_mm);</span><br><span>@@ -1078,21 +1009,8 @@</span><br><span> </span><br><span> static int gsm48_tx_gmm_ra_upd_ack(struct sgsn_mm_ctx *mm);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BUILD_IU</span><br><span style="color: hsl(0, 100%, 40%);">-/* Send RAB activation requests for all PDP contexts */</span><br><span style="color: hsl(0, 100%, 40%);">-void activate_pdp_rabs(struct sgsn_mm_ctx *ctx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct sgsn_pdp_ctx *pdp;</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ctx->ran_type != MM_CTX_T_UTRAN_Iu)</span><br><span style="color: hsl(0, 100%, 40%);">-              return;</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(pdp, &ctx->pdp_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                iu_rab_act_ps(pdp->nsapi, pdp);</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%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Check if we can already authorize a subscriber */</span><br><span style="color: hsl(0, 100%, 40%);">-static int gsm48_gmm_authorize(struct sgsn_mm_ctx *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm48_gmm_authorize(struct sgsn_mm_ctx *ctx)</span><br><span> {</span><br><span> #ifdef BUILD_IU</span><br><span>    int rc;</span><br><span>@@ -2061,7 +1979,7 @@</span><br><span> }</span><br><span> </span><br><span> /* Rx GPRS Mobility Management. MMCTX can be NULL when called. On !Gb (Iu), llme is NULL  */</span><br><span style="color: hsl(0, 100%, 40%);">-static int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0408_rcv_gmm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,</span><br><span>                       struct gprs_llc_llme *llme, bool drop_cipherable)</span><br><span> {</span><br><span>    struct sgsn_signal_data sig_data;</span><br><span>@@ -2933,7 +2851,7 @@</span><br><span> </span><br><span> </span><br><span> /* GPRS Session Management */</span><br><span style="color: hsl(0, 100%, 40%);">-static int gsm0408_rcv_gsm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0408_rcv_gsm(struct sgsn_mm_ctx *mmctx, struct msgb *msg,</span><br><span>                     struct gprs_llc_llme *llme)</span><br><span> {</span><br><span>  struct gsm48_hdr *gh = (struct gsm48_hdr *) msgb_gmmh(msg);</span><br><span>@@ -3008,45 +2926,6 @@</span><br><span>         return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Main entry point for incoming 04.08 GPRS messages from Iu */</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm0408_gprs_rcvmsg_iu(struct msgb *msg, struct gprs_ra_id *ra_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                           uint16_t *sai)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm48_hdr *gh = (struct gsm48_hdr *) msgb_gmmh(msg);</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%);">-    struct sgsn_mm_ctx *mmctx;</span><br><span style="color: hsl(0, 100%, 40%);">-      int rc = -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       mmctx = sgsn_mm_ctx_by_ue_ctx(MSG_IU_UE_CTX(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-      if (mmctx) {</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&mmctx->ctrg->ctr[GMM_CTR_PKTS_SIG_IN]);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (ra_id)</span><br><span style="color: hsl(0, 100%, 40%);">-                      memcpy(&mmctx->ra, ra_id, sizeof(mmctx->ra));</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%);">-       /* MMCTX can be NULL */</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_GPRS:</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = gsm0408_rcv_gmm(mmctx, msg, NULL, false);</span><br><span style="color: hsl(0, 100%, 40%);">-#pragma message "set drop_cipherable arg for gsm0408_rcv_gmm() from IuPS?"</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_PDISC_SM_GPRS:</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = gsm0408_rcv_gsm(mmctx, msg, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGMMCTXP(LOGL_NOTICE, mmctx,</span><br><span style="color: hsl(0, 100%, 40%);">-                   "Unknown GSM 04.08 discriminator 0x%02x: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                       pdisc, osmo_hexdump((uint8_t *)gh, msgb_l3len(msg)));</span><br><span style="color: hsl(0, 100%, 40%);">-           /* FIXME: return status message */</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</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%);">-       /* MMCTX can be invalid */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Update the MM context state */</span><br><span> static void gsm0408_gprs_notify_pdu_gb(struct sgsn_mm_ctx *mmctx)</span><br><span> {</span><br><span>@@ -3154,30 +3033,3 @@</span><br><span>  mmctx->gmm_state = GMM_REGISTERED_NORMAL;</span><br><span>         return 0;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BUILD_IU</span><br><span style="color: hsl(0, 100%, 40%);">-int iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct sgsn_mm_ctx *mm = pdp->mm;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct ranap_ue_conn_ctx *uectx;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t ggsn_ip;</span><br><span style="color: hsl(0, 100%, 40%);">-       bool use_x213_nsap;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     uectx = mm->iu.ue_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-       use_x213_nsap = (uectx->rab_assign_addr_enc == RANAP_NSAP_ADDR_ENC_X213);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Get the IP address for ggsn user plane */</span><br><span style="color: hsl(0, 100%, 40%);">-    memcpy(&ggsn_ip, pdp->lib->gsnru.v, pdp->lib->gsnru.l);</span><br><span style="color: hsl(0, 100%, 40%);">- ggsn_ip = htonl(ggsn_ip);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGP(DRANAP, LOGL_DEBUG, "Assigning RAB: rab_id=%d, ggsn_ip=%x,"</span><br><span style="color: hsl(0, 100%, 40%);">-           " teid_gn=%x, use_x213_nsap=%d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-            rab_id, ggsn_ip, pdp->lib->teid_gn, use_x213_nsap);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  msg = ranap_new_msg_rab_assign_data(rab_id, ggsn_ip,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        pdp->lib->teid_gn, use_x213_nsap);</span><br><span style="color: hsl(0, 100%, 40%);">-    msg->l2h = msg->data;</span><br><span style="color: hsl(0, 100%, 40%);">-     return ranap_iu_rab_act(uectx, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span>diff --git a/src/gprs/gprs_ranap.c b/src/gprs/gprs_ranap.c</span><br><span>new file mode 100644</span><br><span>index 0000000..e0470f6</span><br><span>--- /dev/null</span><br><span>+++ b/src/gprs/gprs_ranap.c</span><br><span>@@ -0,0 +1,231 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Messages on the RANAP interface (Iu mode) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2009-2015 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2015 by Holger Hans Peter Freyther</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ *</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/licenses/>.</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 "bscconfig.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef BUILD_IU</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <gtp.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ranap/ranap_common.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/gprs_gmm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/sgsn.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/gprs_ranap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/gprs_gmm_attach.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Send RAB activation requests for all PDP contexts */</span><br><span style="color: hsl(120, 100%, 40%);">+void activate_pdp_rabs(struct sgsn_mm_ctx *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct sgsn_pdp_ctx *pdp;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ctx->ran_type != MM_CTX_T_UTRAN_Iu)</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</span><br><span style="color: hsl(120, 100%, 40%);">+       llist_for_each_entry(pdp, &ctx->pdp_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              iu_rab_act_ps(pdp->nsapi, pdp);</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%);">+/* Callback for RAB assignment response */</span><br><span style="color: hsl(120, 100%, 40%);">+static int sgsn_ranap_rab_ass_resp(struct sgsn_mm_ctx *ctx, RANAP_RAB_SetupOrModifiedItemIEs_t *setup_ies)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t rab_id;</span><br><span style="color: hsl(120, 100%, 40%);">+       bool require_pdp_update = false;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct sgsn_pdp_ctx *pdp = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+      RANAP_RAB_SetupOrModifiedItem_t *item = &setup_ies->raB_SetupOrModifiedItem;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rab_id = item->rAB_ID.buf[0];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    pdp = sgsn_pdp_ctx_by_nsapi(ctx, rab_id);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!pdp) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DRANAP, LOGL_ERROR, "RAB Assignment Response for unknown RAB/NSAPI=%u\n", rab_id);</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 (item->transportLayerAddress) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPC(DRANAP, LOGL_INFO, " Setup: (%u/%s)", rab_id, osmo_hexdump(item->transportLayerAddress->buf,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 item->transportLayerAddress->size));</span><br><span style="color: hsl(120, 100%, 40%);">+               switch (item->transportLayerAddress->size) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case 7:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* It must be IPv4 inside a X213 NSAP */</span><br><span style="color: hsl(120, 100%, 40%);">+                      memcpy(pdp->lib->gsnlu.v, &item->transportLayerAddress->buf[3], 4);</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 4:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* It must be a raw IPv4 address */</span><br><span style="color: hsl(120, 100%, 40%);">+                   memcpy(pdp->lib->gsnlu.v, item->transportLayerAddress->buf, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 16:</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* TODO: It must be a raw IPv6 address */</span><br><span style="color: hsl(120, 100%, 40%);">+             case 19:</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* TODO: It must be IPv6 inside a X213 NSAP */</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGP(DRANAP, LOGL_ERROR, "RAB Assignment Resp: Unknown "</span><br><span style="color: hsl(120, 100%, 40%);">+                            "transport layer address size %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                item->transportLayerAddress->size);</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%);">+             require_pdp_update = true;</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%);">+   /* The TEI on the RNC side might have changed, too */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (item->iuTransportAssociation &&</span><br><span style="color: hsl(120, 100%, 40%);">+            item->iuTransportAssociation->present == RANAP_IuTransportAssociation_PR_gTP_TEI &&</span><br><span style="color: hsl(120, 100%, 40%);">+     item->iuTransportAssociation->choice.gTP_TEI.buf &&</span><br><span style="color: hsl(120, 100%, 40%);">+     item->iuTransportAssociation->choice.gTP_TEI.size >= 4) {</span><br><span style="color: hsl(120, 100%, 40%);">+                uint32_t tei = osmo_load32be(item->iuTransportAssociation->choice.gTP_TEI.buf);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DRANAP, LOGL_DEBUG, "Updating TEID on RNC side from 0x%08x to 0x%08x\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                       pdp->lib->teid_own, tei);</span><br><span style="color: hsl(120, 100%, 40%);">+               pdp->lib->teid_own = tei;</span><br><span style="color: hsl(120, 100%, 40%);">+               require_pdp_update = true;</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 (require_pdp_update)</span><br><span style="color: hsl(120, 100%, 40%);">+               gtp_update_context(pdp->ggsn->gsn, pdp->lib, pdp, &pdp->lib->hisaddr0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (pdp->state != PDP_STATE_CR_CONF) {</span><br><span style="color: hsl(120, 100%, 40%);">+             send_act_pdp_cont_acc(pdp);</span><br><span style="color: hsl(120, 100%, 40%);">+           pdp->state = PDP_STATE_CR_CONF;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int sgsn_ranap_iu_event(struct ranap_ue_conn_ctx *ctx, enum ranap_iu_event_type type, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sgsn_mm_ctx *mm;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        mm = sgsn_mm_ctx_by_ue_ctx(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define REQUIRE_MM \</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!mm) { \</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGIUP(ctx, LOGL_NOTICE, "Cannot find mm ctx for IU event %d\n", type); \</span><br><span style="color: hsl(120, 100%, 40%);">+           return rc; \</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%);">+   switch (type) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case RANAP_IU_EVENT_RAB_ASSIGN:</span><br><span style="color: hsl(120, 100%, 40%);">+               REQUIRE_MM</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = sgsn_ranap_rab_ass_resp(mm, (RANAP_RAB_SetupOrModifiedItemIEs_t *)data);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RANAP_IU_EVENT_IU_RELEASE:</span><br><span style="color: hsl(120, 100%, 40%);">+               /* fall thru */</span><br><span style="color: hsl(120, 100%, 40%);">+       case RANAP_IU_EVENT_LINK_INVALIDATED:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Clean up ranap_ue_conn_ctx here */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (mm)</span><br><span style="color: hsl(120, 100%, 40%);">+                       LOGMMCTXP(LOGL_INFO, mm, "IU release for imsi %s\n", mm->imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGIUP(ctx, LOGL_INFO, "IU release\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mm && mm->pmm_state == PMM_CONNECTED)</span><br><span style="color: hsl(120, 100%, 40%);">+                  mmctx_set_pmm_state(mm, PMM_IDLE);</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RANAP_IU_EVENT_SECURITY_MODE_COMPLETE:</span><br><span style="color: hsl(120, 100%, 40%);">+           REQUIRE_MM</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Continue authentication here */</span><br><span style="color: hsl(120, 100%, 40%);">+            mm->iu.ue_ctx->integrity_active = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* FIXME: remove gmm_authorize */</span><br><span style="color: hsl(120, 100%, 40%);">+             if (mm->pending_req != GSM48_MT_GMM_ATTACH_REQ)</span><br><span style="color: hsl(120, 100%, 40%);">+                    gsm48_gmm_authorize(mm);</span><br><span style="color: hsl(120, 100%, 40%);">+              else</span><br><span style="color: hsl(120, 100%, 40%);">+                  osmo_fsm_inst_dispatch(mm->gmm_att_req.fsm, E_IU_SECURITY_CMD_COMPLETE, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              if (mm)</span><br><span style="color: hsl(120, 100%, 40%);">+                       LOGMMCTXP(LOGL_NOTICE, mm, "Unknown event received: %i\n", type);</span><br><span style="color: hsl(120, 100%, 40%);">+           else</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGIUP(ctx, LOGL_NOTICE, "Unknown event received: %i\n", type);</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return rc;</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 iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct sgsn_mm_ctx *mm = pdp->mm;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct ranap_ue_conn_ctx *uectx;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t ggsn_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+     bool use_x213_nsap;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ uectx = mm->iu.ue_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+     use_x213_nsap = (uectx->rab_assign_addr_enc == RANAP_NSAP_ADDR_ENC_X213);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Get the IP address for ggsn user plane */</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(&ggsn_ip, pdp->lib->gsnru.v, pdp->lib->gsnru.l);</span><br><span style="color: hsl(120, 100%, 40%);">+       ggsn_ip = htonl(ggsn_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DRANAP, LOGL_DEBUG, "Assigning RAB: rab_id=%d, ggsn_ip=%x,"</span><br><span style="color: hsl(120, 100%, 40%);">+         " teid_gn=%x, use_x213_nsap=%d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          rab_id, ggsn_ip, pdp->lib->teid_gn, use_x213_nsap);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      msg = ranap_new_msg_rab_assign_data(rab_id, ggsn_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      pdp->lib->teid_gn, use_x213_nsap);</span><br><span style="color: hsl(120, 100%, 40%);">+  msg->l2h = msg->data;</span><br><span style="color: hsl(120, 100%, 40%);">+   return ranap_iu_rab_act(uectx, msg);</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%);">+/* Main entry point for incoming 04.08 GPRS messages from Iu */</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0408_gprs_rcvmsg_iu(struct msgb *msg, struct gprs_ra_id *ra_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                     uint16_t *sai)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm48_hdr *gh = (struct gsm48_hdr *) msgb_gmmh(msg);</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%);">+  struct sgsn_mm_ctx *mmctx;</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc = -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   mmctx = sgsn_mm_ctx_by_ue_ctx(MSG_IU_UE_CTX(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+    if (mmctx) {</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(&mmctx->ctrg->ctr[GMM_CTR_PKTS_SIG_IN]);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (ra_id)</span><br><span style="color: hsl(120, 100%, 40%);">+                    memcpy(&mmctx->ra, ra_id, sizeof(mmctx->ra));</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%);">+   /* MMCTX can be NULL */</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_GPRS:</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = gsm0408_rcv_gmm(mmctx, msg, NULL, false);</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma message "set drop_cipherable arg for gsm0408_rcv_gmm() from IuPS?"</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_PDISC_SM_GPRS:</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = gsm0408_rcv_gsm(mmctx, msg, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGMMCTXP(LOGL_NOTICE, mmctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Unknown GSM 04.08 discriminator 0x%02x: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     pdisc, osmo_hexdump((uint8_t *)gh, msgb_l3len(msg)));</span><br><span style="color: hsl(120, 100%, 40%);">+         /* FIXME: return status message */</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</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%);">+   /* MMCTX can be invalid */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>diff --git a/src/gprs/gprs_sgsn.c b/src/gprs/gprs_sgsn.c</span><br><span>index 829204e..ee1902c 100644</span><br><span>--- a/src/gprs/gprs_sgsn.c</span><br><span>+++ b/src/gprs/gprs_sgsn.c</span><br><span>@@ -50,10 +50,6 @@</span><br><span> </span><br><span> #include "../../bscconfig.h"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#if BUILD_IU</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/iu_client.h></span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define GPRS_LLME_CHECK_TICK 30</span><br><span> </span><br><span> extern struct sgsn_instance *sgsn;</span><br><span>diff --git a/src/gprs/sgsn_libgtp.c b/src/gprs/sgsn_libgtp.c</span><br><span>index a8ad527..5e3f48f 100644</span><br><span>--- a/src/gprs/sgsn_libgtp.c</span><br><span>+++ b/src/gprs/sgsn_libgtp.c</span><br><span>@@ -50,11 +50,7 @@</span><br><span> #include <osmocom/sgsn/gprs_gmm.h></span><br><span> #include <osmocom/sgsn/gprs_subscriber.h></span><br><span> #include <osmocom/sgsn/gprs_sndcp.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BUILD_IU</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/iu_client.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ranap/ranap_ies_defs.h></span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/gprs_ranap.h></span><br><span> </span><br><span> #include <gtp.h></span><br><span> #include <pdp.h></span><br><span>@@ -359,7 +355,7 @@</span><br><span>    { 0, 0 }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int send_act_pdp_cont_acc(struct sgsn_pdp_ctx *pctx)</span><br><span style="color: hsl(120, 100%, 40%);">+int send_act_pdp_cont_acc(struct sgsn_pdp_ctx *pctx)</span><br><span> {</span><br><span>     struct sgsn_signal_data sig_data;</span><br><span>    int rc;</span><br><span>@@ -473,72 +469,6 @@</span><br><span>       gtp_echo_req(ggc->gsn, ggc->gtp_version, ggc, &ggc->remote_addr);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BUILD_IU</span><br><span style="color: hsl(0, 100%, 40%);">-/* Callback for RAB assignment response */</span><br><span style="color: hsl(0, 100%, 40%);">-int sgsn_ranap_rab_ass_resp(struct sgsn_mm_ctx *ctx, RANAP_RAB_SetupOrModifiedItemIEs_t *setup_ies)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t rab_id;</span><br><span style="color: hsl(0, 100%, 40%);">- bool require_pdp_update = false;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct sgsn_pdp_ctx *pdp = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-        RANAP_RAB_SetupOrModifiedItem_t *item = &setup_ies->raB_SetupOrModifiedItem;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     rab_id = item->rAB_ID.buf[0];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        pdp = sgsn_pdp_ctx_by_nsapi(ctx, rab_id);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!pdp) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DRANAP, LOGL_ERROR, "RAB Assignment Response for unknown RAB/NSAPI=%u\n", rab_id);</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 (item->transportLayerAddress) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPC(DRANAP, LOGL_INFO, " Setup: (%u/%s)", rab_id, osmo_hexdump(item->transportLayerAddress->buf,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   item->transportLayerAddress->size));</span><br><span style="color: hsl(0, 100%, 40%);">-         switch (item->transportLayerAddress->size) {</span><br><span style="color: hsl(0, 100%, 40%);">-              case 7:</span><br><span style="color: hsl(0, 100%, 40%);">-                 /* It must be IPv4 inside a X213 NSAP */</span><br><span style="color: hsl(0, 100%, 40%);">-                        memcpy(pdp->lib->gsnlu.v, &item->transportLayerAddress->buf[3], 4);</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 4:</span><br><span style="color: hsl(0, 100%, 40%);">-                 /* It must be a raw IPv4 address */</span><br><span style="color: hsl(0, 100%, 40%);">-                     memcpy(pdp->lib->gsnlu.v, item->transportLayerAddress->buf, 4);</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 16:</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* TODO: It must be a raw IPv6 address */</span><br><span style="color: hsl(0, 100%, 40%);">-               case 19:</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* TODO: It must be IPv6 inside a X213 NSAP */</span><br><span style="color: hsl(0, 100%, 40%);">-          default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGP(DRANAP, LOGL_ERROR, "RAB Assignment Resp: Unknown "</span><br><span style="color: hsl(0, 100%, 40%);">-                              "transport layer address size %u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                          item->transportLayerAddress->size);</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%);">-               require_pdp_update = true;</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%);">-       /* The TEI on the RNC side might have changed, too */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (item->iuTransportAssociation &&</span><br><span style="color: hsl(0, 100%, 40%);">-      item->iuTransportAssociation->present == RANAP_IuTransportAssociation_PR_gTP_TEI &&</span><br><span style="color: hsl(0, 100%, 40%);">-       item->iuTransportAssociation->choice.gTP_TEI.buf &&</span><br><span style="color: hsl(0, 100%, 40%);">-       item->iuTransportAssociation->choice.gTP_TEI.size >= 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-          uint32_t tei = osmo_load32be(item->iuTransportAssociation->choice.gTP_TEI.buf);</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DRANAP, LOGL_DEBUG, "Updating TEID on RNC side from 0x%08x to 0x%08x\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 pdp->lib->teid_own, tei);</span><br><span style="color: hsl(0, 100%, 40%);">-         pdp->lib->teid_own = tei;</span><br><span style="color: hsl(0, 100%, 40%);">-         require_pdp_update = true;</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 (require_pdp_update)</span><br><span style="color: hsl(0, 100%, 40%);">-         gtp_update_context(pdp->ggsn->gsn, pdp->lib, pdp, &pdp->lib->hisaddr0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (pdp->state != PDP_STATE_CR_CONF) {</span><br><span style="color: hsl(0, 100%, 40%);">-               send_act_pdp_cont_acc(pdp);</span><br><span style="color: hsl(0, 100%, 40%);">-             pdp->state = PDP_STATE_CR_CONF;</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%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Confirmation of a PDP Context Delete */</span><br><span> static int delete_pdp_conf(struct pdp_t *pdp, void *cbp, int cause)</span><br><span> {</span><br><span>diff --git a/src/gprs/sgsn_main.c b/src/gprs/sgsn_main.c</span><br><span>index 9f2e111..eef5f8f 100644</span><br><span>--- a/src/gprs/sgsn_main.c</span><br><span>+++ b/src/gprs/sgsn_main.c</span><br><span>@@ -57,6 +57,7 @@</span><br><span> #include <osmocom/sgsn/sgsn.h></span><br><span> #include <osmocom/sgsn/gprs_llc.h></span><br><span> #include <osmocom/sgsn/gprs_gmm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/gprs_ranap.h></span><br><span> </span><br><span> #include <osmocom/ctrl/control_if.h></span><br><span> #include <osmocom/ctrl/ports.h></span><br><span>@@ -354,10 +355,6 @@</span><br><span>    .num_cat = ARRAY_SIZE(gprs_categories),</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#if BUILD_IU</span><br><span style="color: hsl(0, 100%, 40%);">-int sgsn_ranap_iu_event(struct ranap_ue_conn_ctx *ctx, enum ranap_iu_event_type type, void *data);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static bool file_exists(const char *path)</span><br><span> {</span><br><span>      struct stat sb;</span><br><span>diff --git a/tests/sgsn/Makefile.am b/tests/sgsn/Makefile.am</span><br><span>index 956ef8d..ae397b3 100644</span><br><span>--- a/tests/sgsn/Makefile.am</span><br><span>+++ b/tests/sgsn/Makefile.am</span><br><span>@@ -45,6 +45,7 @@</span><br><span>     $(top_builddir)/src/gprs/gprs_llc_parse.o \</span><br><span>  $(top_builddir)/src/gprs/gprs_llc.o \</span><br><span>        $(top_builddir)/src/gprs/crc24.o \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(top_builddir)/src/gprs/gprs_ranap.o \</span><br><span>      $(top_builddir)/src/gprs/gprs_sndcp.o \</span><br><span>      $(top_builddir)/src/gprs/gprs_gmm_attach.o \</span><br><span>         $(top_builddir)/src/gprs/gprs_gmm.o \</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/15335">change 15335</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-sgsn/+/15335"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sgsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I549042aaff045a378de77d657cc396ee08f22f33 </div>
<div style="display:none"> Gerrit-Change-Number: 15335 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </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: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>