<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9933">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Maintain per ggsn pdp ctx list<br><br>This way we can easily track all pdp context associated to a specific<br>ggsn, which is useful to handle some scenarios.<br><br>Change-Id: I3bbcc0883df2bf1290ba8d4bd70db8baa494087a<br>---<br>M include/osmocom/sgsn/gprs_sgsn.h<br>M src/gprs/gprs_sgsn.c<br>M src/gprs/sgsn_libgtp.c<br>3 files changed, 18 insertions(+), 17 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/33/9933/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/gprs_sgsn.h b/include/osmocom/sgsn/gprs_sgsn.h</span><br><span>index 64e5619..33b12dc 100644</span><br><span>--- a/include/osmocom/sgsn/gprs_sgsn.h</span><br><span>+++ b/include/osmocom/sgsn/gprs_sgsn.h</span><br><span>@@ -296,6 +296,7 @@</span><br><span>     struct sgsn_mm_ctx      *mm;    /* back pointer to MM CTX */</span><br><span>         int                     destroy_ggsn; /* destroy it on destruction */</span><br><span>        struct sgsn_ggsn_ctx    *ggsn;  /* which GGSN serves this PDP */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct llist_head       ggsn_list;      /* list_head for ggsn->pdp_list */</span><br><span>        struct rate_ctr_group   *ctrg;</span><br><span> </span><br><span>   //unsigned int          id;</span><br><span>@@ -338,6 +339,7 @@</span><br><span>                                     uint8_t tid);</span><br><span> </span><br><span> struct sgsn_pdp_ctx *sgsn_pdp_ctx_alloc(struct sgsn_mm_ctx *mm,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 struct sgsn_ggsn_ctx *ggsn,</span><br><span>                                  uint8_t nsapi);</span><br><span> void sgsn_pdp_ctx_terminate(struct sgsn_pdp_ctx *pdp);</span><br><span> void sgsn_pdp_ctx_free(struct sgsn_pdp_ctx *pdp);</span><br><span>@@ -350,12 +352,14 @@</span><br><span>       struct in_addr remote_addr;</span><br><span>  int remote_restart_ctr;</span><br><span>      struct gsn_t *gsn;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct llist_head pdp_list;     /* list of associated pdp ctx (struct sgsn_pdp_ctx*) */</span><br><span> };</span><br><span> struct sgsn_ggsn_ctx *sgsn_ggsn_ctx_alloc(uint32_t id);</span><br><span> void sgsn_ggsn_ctx_free(struct sgsn_ggsn_ctx *ggc);</span><br><span> struct sgsn_ggsn_ctx *sgsn_ggsn_ctx_by_id(uint32_t id);</span><br><span> struct sgsn_ggsn_ctx *sgsn_ggsn_ctx_by_addr(struct in_addr *addr);</span><br><span> struct sgsn_ggsn_ctx *sgsn_ggsn_ctx_find_alloc(uint32_t id);</span><br><span style="color: hsl(120, 100%, 40%);">+int sgsn_ggsn_ctx_drop_all_pdp(struct sgsn_ggsn_ctx *ggsn);</span><br><span> </span><br><span> struct apn_ctx {</span><br><span>        struct llist_head list;</span><br><span>@@ -378,10 +382,6 @@</span><br><span> uint32_t sgsn_alloc_ptmsi(void);</span><br><span> void sgsn_inst_init(void);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* High-level function to be called in case a GGSN has disappeared or</span><br><span style="color: hsl(0, 100%, 40%);">- * ottherwise lost state (recovery procedure) */</span><br><span style="color: hsl(0, 100%, 40%);">-int drop_all_pdp_for_ggsn(struct sgsn_ggsn_ctx *ggsn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> char *gprs_pdpaddr2str(uint8_t *pdpa, uint8_t len);</span><br><span> </span><br><span> /*</span><br><span>diff --git a/src/gprs/gprs_sgsn.c b/src/gprs/gprs_sgsn.c</span><br><span>index 688eaed..a58e504 100644</span><br><span>--- a/src/gprs/gprs_sgsn.c</span><br><span>+++ b/src/gprs/gprs_sgsn.c</span><br><span>@@ -388,6 +388,7 @@</span><br><span> </span><br><span> /* you don't want to use this directly, call sgsn_create_pdp_ctx() */</span><br><span> struct sgsn_pdp_ctx *sgsn_pdp_ctx_alloc(struct sgsn_mm_ctx *mm,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       struct sgsn_ggsn_ctx *ggsn,</span><br><span>                                  uint8_t nsapi)</span><br><span> {</span><br><span>  struct sgsn_pdp_ctx *pdp;</span><br><span>@@ -401,6 +402,7 @@</span><br><span>              return NULL;</span><br><span> </span><br><span>     pdp->mm = mm;</span><br><span style="color: hsl(120, 100%, 40%);">+      pdp->ggsn = ggsn;</span><br><span>         pdp->nsapi = nsapi;</span><br><span>       pdp->ctrg = rate_ctr_group_alloc(pdp, &pdpctx_ctrg_desc, nsapi);</span><br><span>      if (!pdp->ctrg) {</span><br><span>@@ -409,6 +411,7 @@</span><br><span>           return NULL;</span><br><span>         }</span><br><span>    llist_add(&pdp->list, &mm->pdp_list);</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_add(&pdp->ggsn_list, &ggsn->pdp_list);</span><br><span>   llist_add(&pdp->g_list, &sgsn_pdp_ctxts);</span><br><span> </span><br><span>     return pdp;</span><br><span>@@ -462,6 +465,8 @@</span><br><span>    rate_ctr_group_free(pdp->ctrg);</span><br><span>   if (pdp->mm)</span><br><span>              llist_del(&pdp->list);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (pdp->ggsn)</span><br><span style="color: hsl(120, 100%, 40%);">+             llist_del(&pdp->ggsn_list);</span><br><span>   llist_del(&pdp->g_list);</span><br><span> </span><br><span>  /* _if_ we still have a library handle, at least set it to NULL</span><br><span>@@ -496,6 +501,7 @@</span><br><span>        ggc->remote_restart_ctr = -1;</span><br><span>     /* if we are called from config file parse, this gsn doesn't exist yet */</span><br><span>        ggc->gsn = sgsn->gsn;</span><br><span style="color: hsl(120, 100%, 40%);">+   INIT_LLIST_HEAD(&ggc->pdp_list);</span><br><span>      llist_add(&ggc->list, &sgsn_ggsn_ctxts);</span><br><span> </span><br><span>      return ggc;</span><br><span>@@ -503,6 +509,7 @@</span><br><span> </span><br><span> void sgsn_ggsn_ctx_free(struct sgsn_ggsn_ctx *ggc)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(llist_empty(&ggc->pdp_list));</span><br><span>     llist_del(&ggc->list);</span><br><span>        talloc_free(ggc);</span><br><span> }</span><br><span>@@ -702,19 +709,14 @@</span><br><span> </span><br><span> /* High-level function to be called in case a GGSN has disappeared or</span><br><span>  * otherwise lost state (recovery procedure) */</span><br><span style="color: hsl(0, 100%, 40%);">-int drop_all_pdp_for_ggsn(struct sgsn_ggsn_ctx *ggsn)</span><br><span style="color: hsl(120, 100%, 40%);">+int sgsn_ggsn_ctx_drop_all_pdp(struct sgsn_ggsn_ctx *ggsn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct sgsn_mm_ctx *mm;</span><br><span>      int num = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        llist_for_each_entry(mm, &sgsn_mm_ctxts, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-            struct sgsn_pdp_ctx *pdp;</span><br><span style="color: hsl(0, 100%, 40%);">-               llist_for_each_entry(pdp, &mm->pdp_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (pdp->ggsn == ggsn) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             drop_one_pdp(pdp);</span><br><span style="color: hsl(0, 100%, 40%);">-                              num++;</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(120, 100%, 40%);">+     struct sgsn_pdp_ctx *pdp, *pdp2;</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_for_each_entry_safe(pdp, pdp2, &ggsn->pdp_list, ggsn_list) {</span><br><span style="color: hsl(120, 100%, 40%);">+             drop_one_pdp(pdp);</span><br><span style="color: hsl(120, 100%, 40%);">+            num++;</span><br><span>       }</span><br><span> </span><br><span>        return num;</span><br><span>diff --git a/src/gprs/sgsn_libgtp.c b/src/gprs/sgsn_libgtp.c</span><br><span>index 70112cb..2da8c4a 100644</span><br><span>--- a/src/gprs/sgsn_libgtp.c</span><br><span>+++ b/src/gprs/sgsn_libgtp.c</span><br><span>@@ -145,7 +145,7 @@</span><br><span>       const uint8_t *qos;</span><br><span>  int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     pctx = sgsn_pdp_ctx_alloc(mmctx, nsapi);</span><br><span style="color: hsl(120, 100%, 40%);">+      pctx = sgsn_pdp_ctx_alloc(mmctx, ggsn, nsapi);</span><br><span>       if (!pctx) {</span><br><span>                 LOGP(DGPRS, LOGL_ERROR, "Couldn't allocate PDP Ctx\n");</span><br><span>                return NULL;</span><br><span>@@ -160,7 +160,6 @@</span><br><span>   }</span><br><span>    pdp->priv = pctx;</span><br><span>         pctx->lib = pdp;</span><br><span style="color: hsl(0, 100%, 40%);">-     pctx->ggsn = ggsn;</span><br><span> </span><br><span>    //pdp->peer =        /* sockaddr_in of GGSN (receive) */</span><br><span>  //pdp->ipif =        /* not used by library */</span><br><span>@@ -603,7 +602,7 @@</span><br><span>                   "releasing all PDP contexts\n",</span><br><span>                    ggsn->remote_restart_ctr, recovery);</span><br><span>                 ggsn->remote_restart_ctr = recovery;</span><br><span style="color: hsl(0, 100%, 40%);">-         drop_all_pdp_for_ggsn(ggsn);</span><br><span style="color: hsl(120, 100%, 40%);">+          sgsn_ggsn_ctx_drop_all_pdp(ggsn);</span><br><span>    }</span><br><span>    return 0;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9933">change 9933</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/9933"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I3bbcc0883df2bf1290ba8d4bd70db8baa494087a </div>
<div style="display:none"> Gerrit-Change-Number: 9933 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>