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