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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ranap: release Iu UE Context when exiting PMM Connected<br><br>PMM Connected defines a Iu signaling connection. The 2 other<br>PMM states do not have an active Iu signaling connection.<br><br>Change-Id: Ie05d2bdf8dfb593b4c7e837107a3a06f22e90119<br>---<br>M include/osmocom/sgsn/gprs_ranap.h<br>M src/sgsn/gprs_mm_state_iu_fsm.c<br>M src/sgsn/gprs_ranap.c<br>3 files changed, 52 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/gprs_ranap.h b/include/osmocom/sgsn/gprs_ranap.h</span><br><span>index b300130..62fdf6f 100644</span><br><span>--- a/include/osmocom/sgsn/gprs_ranap.h</span><br><span>+++ b/include/osmocom/sgsn/gprs_ranap.h</span><br><span>@@ -12,8 +12,19 @@</span><br><span> int sgsn_ranap_iu_event(struct ranap_ue_conn_ctx *ctx, enum ranap_iu_event_type type, void *data);</span><br><span> int iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* free the Iu UE context */</span><br><span style="color: hsl(120, 100%, 40%);">+void sgsn_ranap_iu_free(struct sgsn_mm_ctx *ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* send a Iu Release Command and free afterwards the UE context */</span><br><span style="color: hsl(120, 100%, 40%);">+void sgsn_ranap_iu_release_free(struct sgsn_mm_ctx *ctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                            const struct RANAP_Cause *cause);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int gsm0408_gprs_rcvmsg_iu(struct msgb *msg, struct gprs_ra_id *ra_id, uint16_t *sai);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#else /* ifndef BUILD_IU */</span><br><span style="color: hsl(120, 100%, 40%);">+inline static void sgsn_ranap_iu_free(void *ctx) {};</span><br><span style="color: hsl(120, 100%, 40%);">+inline static void sgsn_ranap_iu_release_free(void *ctx, void *cause) {};</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* BUILD_IU*/</span><br><span> </span><br><span> struct ranap_ue_conn_ctx;</span><br><span> /* On RANAP, Returns pointer to he associated ranap_ue_conn_ctx in msg, filled</span><br><span>diff --git a/src/sgsn/gprs_mm_state_iu_fsm.c b/src/sgsn/gprs_mm_state_iu_fsm.c</span><br><span>index 1ed5f56..b098f20 100644</span><br><span>--- a/src/sgsn/gprs_mm_state_iu_fsm.c</span><br><span>+++ b/src/sgsn/gprs_mm_state_iu_fsm.c</span><br><span>@@ -6,6 +6,7 @@</span><br><span> </span><br><span> #include <osmocom/sgsn/debug.h></span><br><span> #include <osmocom/sgsn/sgsn.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/gprs_ranap.h></span><br><span> </span><br><span> #define X(s) (1 << (s))</span><br><span> </span><br><span>@@ -45,11 +46,15 @@</span><br><span> </span><br><span> static void st_pmm_connected(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sgsn_mm_ctx *ctx = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     switch(event) {</span><br><span>      case E_PMM_PS_CONN_RELEASE:</span><br><span style="color: hsl(120, 100%, 40%);">+           sgsn_ranap_iu_free(ctx);</span><br><span>             mm_state_iu_fsm_state_chg(fi, ST_PMM_IDLE);</span><br><span>          break;</span><br><span>       case E_PMM_IMPLICIT_DETACH:</span><br><span style="color: hsl(120, 100%, 40%);">+           sgsn_ranap_iu_release_free(ctx, NULL);</span><br><span>               mm_state_iu_fsm_state_chg(fi, ST_PMM_DETACHED);</span><br><span>              break;</span><br><span>       case E_PMM_RA_UPDATE:</span><br><span>diff --git a/src/sgsn/gprs_ranap.c b/src/sgsn/gprs_ranap.c</span><br><span>index d2b3455..8f45650 100644</span><br><span>--- a/src/sgsn/gprs_ranap.c</span><br><span>+++ b/src/sgsn/gprs_ranap.c</span><br><span>@@ -119,6 +119,7 @@</span><br><span>         mm = sgsn_mm_ctx_by_ue_ctx(ctx);</span><br><span>     if (!mm) {</span><br><span>           LOGIUP(ctx, LOGL_NOTICE, "Cannot find mm ctx for IU event %d\n", type);</span><br><span style="color: hsl(120, 100%, 40%);">+             ranap_iu_free_ue(ctx);</span><br><span>               return rc;</span><br><span>   }</span><br><span> </span><br><span>@@ -131,7 +132,11 @@</span><br><span>         case RANAP_IU_EVENT_LINK_INVALIDATED:</span><br><span>                /* Clean up ranap_ue_conn_ctx here */</span><br><span>                LOGMMCTXP(LOGL_INFO, mm, "IU release for imsi %s\n", mm->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_fsm_inst_dispatch(mm->iu.mm_state_fsm, E_PMM_PS_CONN_RELEASE, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (mm->iu.mm_state_fsm->state == ST_PMM_CONNECTED)</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_fsm_inst_dispatch(mm->iu.mm_state_fsm, E_PMM_PS_CONN_RELEASE, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+                  sgsn_ranap_iu_free(mm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>            rc = 0;</span><br><span>              break;</span><br><span>       case RANAP_IU_EVENT_SECURITY_MODE_COMPLETE:</span><br><span>@@ -153,6 +158,35 @@</span><br><span>   return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* TODO: use timers */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TIMEOUT_RANAP_RELEASE_SEC 5</span><br><span style="color: hsl(120, 100%, 40%);">+void sgsn_ranap_iu_free(struct sgsn_mm_ctx *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!ctx->iu.ue_ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ranap_iu_free_ue(ctx->iu.ue_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+  ctx->iu.ue_ctx = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void sgsn_ranap_iu_release_free(struct sgsn_mm_ctx *ctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                              const struct RANAP_Cause *cause)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!ctx->iu.ue_ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ranap_iu_tx_release_free(ctx->iu.ue_ctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                            cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                                TIMEOUT_RANAP_RELEASE_SEC);</span><br><span style="color: hsl(120, 100%, 40%);">+  ctx->iu.ue_ctx = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp)</span><br><span> {</span><br><span>   struct msgb *msg;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/15482">change 15482</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/+/15482"/><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: Ie05d2bdf8dfb593b4c7e837107a3a06f22e90119 </div>
<div style="display:none"> Gerrit-Change-Number: 15482 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>