<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ggsn/+/14296">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gtp: Introduce new pdp APIs (and deprecate old ones) to support multiple GSN<br><br>Move static global pdp storage arrays to be per GSN. This way now<br>several GSN per process are supported without collisions.<br><br>* pdp_init() is defined in public API but it's actually only intended<br>for use (and currently only used) internally in gtp_new(). So let's<br>document that and re-use it for backward compatibility with now<br>deprecated API, where only one GSN per process is supported.<br><br>* Back pointer to gsn_t (pdp->gsn) moved from gtp.c:gtp_new() to<br>gtp_pdp_newpdp(), since it makes more sense to have it there. This way<br>backpointer is always set, even in case were app calls pdp_newpdp() API<br>directly instead of creating them through gtp.c, like osmo-sgsn does.<br><br>* Create new versions of required APIs with a pointer to gsn_t where the<br>pdp ctx is to be created/found. Some APIs receiving a pointer to a pdp<br>ctx can be left intact because we have a backpointer to its gsn_t.<br><br>* pdp_getpdp() is nowhere used, and makes little sense now that we have<br>pdpa reachable in gsn->pdpa, so let's deprecate it without adding a<br>replacement.<br><br>* Deprecate gtp.h gtp_newpdp(), since it's nowhere used and useless<br>(does same as new gtp_pdp_newpdp() and doesn't allow for old_pdp to be<br>passed as parameter).<br><br>Fixes: OS#2873<br>Change-Id: I653cbdc185165592d985e3efab6e3f1add97877b<br>---<br>M TODO-RELEASE<br>M gtp/gtp.c<br>M gtp/gtp.h<br>M gtp/pdp.c<br>M gtp/pdp.h<br>5 files changed, 90 insertions(+), 37 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/TODO-RELEASE b/TODO-RELEASE</span><br><span>index d0852fc..a3d63ac 100644</span><br><span>--- a/TODO-RELEASE</span><br><span>+++ b/TODO-RELEASE</span><br><span>@@ -7,3 +7,6 @@</span><br><span> # If any interfaces have been added since the last public release: c:r:a + 1.</span><br><span> # If any interfaces have been removed or changed since the last public release: c:r:0.</span><br><span> #library what            description / commit summary line</span><br><span style="color: hsl(120, 100%, 40%);">+libgtp       Several new APIs added  see I653cbdc185165592d985e3efab6e3f1add97877b</span><br><span style="color: hsl(120, 100%, 40%);">+libgtp API (non-used externally) pdp_init modified       see I653cbdc185165592d985e3efab6e3f1add97877b</span><br><span style="color: hsl(120, 100%, 40%);">+libgtp Several pdp_* APIs marked as deprecated   see I653cbdc185165592d985e3efab6e3f1add97877b</span><br><span>diff --git a/gtp/gtp.c b/gtp/gtp.c</span><br><span>index 2b14026..84b8844 100644</span><br><span>--- a/gtp/gtp.c</span><br><span>+++ b/gtp/gtp.c</span><br><span>@@ -131,16 +131,12 @@</span><br><span>       { 0, NULL }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* gtp_new */</span><br><span style="color: hsl(0, 100%, 40%);">-/* gtp_free */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+/* Deprecated, use gtp_pdp_newpdp() instead */</span><br><span> int gtp_newpdp(struct gsn_t *gsn, struct pdp_t **pdp,</span><br><span>           uint64_t imsi, uint8_t nsapi)</span><br><span> {</span><br><span>    int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = pdp_newpdp(pdp, imsi, nsapi, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!rc && *pdp)</span><br><span style="color: hsl(0, 100%, 40%);">-                (*pdp)->gsn = gsn;</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = gtp_pdp_newpdp(gsn, pdp, imsi, nsapi, NULL);</span><br><span>    return rc;</span><br><span> }</span><br><span> </span><br><span>@@ -849,7 +845,7 @@</span><br><span>    queue_new(&(*gsn)->queue_resp);</span><br><span> </span><br><span>   /* Initialise pdp table */</span><br><span style="color: hsl(0, 100%, 40%);">-      pdp_init();</span><br><span style="color: hsl(120, 100%, 40%);">+   pdp_init(*gsn);</span><br><span> </span><br><span>  /* Initialise call back functions */</span><br><span>         (*gsn)->cb_create_context_ind = 0;</span><br><span>@@ -1681,9 +1677,7 @@</span><br><span>                }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   pdp_newpdp(&pdp, pdp->imsi, pdp->nsapi, pdp);</span><br><span style="color: hsl(0, 100%, 40%);">- if (pdp)</span><br><span style="color: hsl(0, 100%, 40%);">-                pdp->gsn = gsn;</span><br><span style="color: hsl(120, 100%, 40%);">+    gtp_pdp_newpdp(gsn, &pdp, pdp->imsi, pdp->nsapi, pdp);</span><br><span> </span><br><span>         /* Callback function to validate login */</span><br><span>    if (gsn->cb_create_context_ind != 0)</span><br><span>diff --git a/gtp/gtp.h b/gtp/gtp.h</span><br><span>index ec6aef3..c2c5122 100644</span><br><span>--- a/gtp/gtp.h</span><br><span>+++ b/gtp/gtp.h</span><br><span>@@ -15,6 +15,8 @@</span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/defs.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include "pdp.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define GTP_MODE_GGSN 1</span><br><span> #define GTP_MODE_SGSN 2</span><br><span> </span><br><span>@@ -263,6 +265,9 @@</span><br><span>      struct queue_t *queue_req;      /* Request queue */</span><br><span>  struct queue_t *queue_resp;     /* Response queue */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      struct pdp_t pdpa[PDP_MAX];     /* PDP storage */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct pdp_t *hashtid[PDP_MAX]; /* Hash table for IMSI + NSAPI */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* Call back functions */</span><br><span>    int (*cb_delete_context) (struct pdp_t *);</span><br><span>   int (*cb_create_context_ind) (struct pdp_t *);</span><br><span>@@ -307,7 +312,7 @@</span><br><span> extern int gtp_free(struct gsn_t *gsn);</span><br><span> </span><br><span> extern int gtp_newpdp(struct gsn_t *gsn, struct pdp_t **pdp,</span><br><span style="color: hsl(0, 100%, 40%);">-                   uint64_t imsi, uint8_t nsapi);</span><br><span style="color: hsl(120, 100%, 40%);">+                uint64_t imsi, uint8_t nsapi) OSMO_DEPRECATED("Use gtp_pdp_newpdp() instead");</span><br><span> extern int gtp_freepdp(struct gsn_t *gsn, struct pdp_t *pdp);</span><br><span> extern int gtp_freepdp_teardown(struct gsn_t *gsn, struct pdp_t *pdp);</span><br><span> </span><br><span>diff --git a/gtp/pdp.c b/gtp/pdp.c</span><br><span>index a5146e9..d745916 100644</span><br><span>--- a/gtp/pdp.c</span><br><span>+++ b/gtp/pdp.c</span><br><span>@@ -33,13 +33,6 @@</span><br><span> #include "lookupa.h"</span><br><span> </span><br><span> /* ***********************************************************</span><br><span style="color: hsl(0, 100%, 40%);">- * Global variables TODO: most should be moved to gsn_t</span><br><span style="color: hsl(0, 100%, 40%);">- *************************************************************/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct pdp_t pdpa[PDP_MAX];     /* PDP storage */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct pdp_t *hashtid[PDP_MAX]; /* Hash table for IMSI + NSAPI */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* ***********************************************************</span><br><span>  * Functions related to PDP storage</span><br><span>  *</span><br><span>  * Lifecycle</span><br><span>@@ -111,11 +104,16 @@</span><br><span>  *</span><br><span>  *************************************************************/</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int pdp_init()</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsn_t *g_gsn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int pdp_init(struct gsn_t *gsn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    memset(&pdpa, 0, sizeof(pdpa));</span><br><span style="color: hsl(0, 100%, 40%);">-     memset(&hashtid, 0, sizeof(hashtid));</span><br><span style="color: hsl(0, 100%, 40%);">-       /*  memset(&haship, 0, sizeof(haship)); */</span><br><span style="color: hsl(120, 100%, 40%);">+        if(!g_gsn) {</span><br><span style="color: hsl(120, 100%, 40%);">+          g_gsn = gsn;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DLGTP, LOGL_FATAL, "This interface is depreacted and doesn't support multiple GGSN!");</span><br><span style="color: hsl(120, 100%, 40%);">+             return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span> </span><br><span>        return 0;</span><br><span> }</span><br><span>@@ -123,6 +121,13 @@</span><br><span> int pdp_newpdp(struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi,</span><br><span>           struct pdp_t *pdp_old)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    return gtp_pdp_newpdp(g_gsn, pdp, imsi, nsapi, pdp_old);</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 gtp_pdp_newpdp(struct gsn_t *gsn, struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi,</span><br><span style="color: hsl(120, 100%, 40%);">+               struct pdp_t *pdp_old)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct pdp_t *pdpa = gsn->pdpa;</span><br><span>   int n;</span><br><span>       for (n = 0; n < PDP_MAX; n++) {      /* TODO: Need to do better than linear search */</span><br><span>             if (pdpa[n].inuse == 0) {</span><br><span>@@ -132,6 +137,7 @@</span><br><span>                      else</span><br><span>                                 memset(*pdp, 0, sizeof(struct pdp_t));</span><br><span>                       (*pdp)->inuse = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 (*pdp)->gsn = gsn;</span><br><span>                        (*pdp)->imsi = imsi;</span><br><span>                      (*pdp)->nsapi = nsapi;</span><br><span>                    (*pdp)->fllc = (uint16_t) n + 1;</span><br><span>@@ -159,6 +165,8 @@</span><br><span> </span><br><span> int pdp_freepdp(struct pdp_t *pdp)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+      struct pdp_t *pdpa = pdp->gsn->pdpa;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         pdp_tiddel(pdp);</span><br><span> </span><br><span>         /* Remove any references in primary context */</span><br><span>@@ -173,12 +181,20 @@</span><br><span> </span><br><span> int pdp_getpdp(struct pdp_t **pdp)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   *pdp = &pdpa[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  *pdp = &g_gsn->pdpa[0];</span><br><span>       return 0;</span><br><span> }</span><br><span> </span><br><span> int pdp_getgtp0(struct pdp_t **pdp, uint16_t fl)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   return gtp_pdp_getgtp0(g_gsn, pdp, fl);</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 gtp_pdp_getgtp0(struct gsn_t *gsn, struct pdp_t **pdp, uint16_t fl)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct pdp_t *pdpa = gsn->pdpa;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         if ((fl > PDP_MAX) || (fl < 1)) {</span><br><span>              return EOF;     /* Not found */</span><br><span>      } else {</span><br><span>@@ -193,6 +209,13 @@</span><br><span> </span><br><span> int pdp_getgtp1(struct pdp_t **pdp, uint32_t tei)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp_pdp_getgtp1(g_gsn, pdp, tei);</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 gtp_pdp_getgtp1(struct gsn_t *gsn, struct pdp_t **pdp, uint32_t tei)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct pdp_t *pdpa = gsn->pdpa;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         if ((tei > PDP_MAX) || (tei < 1)) {</span><br><span>            return EOF;     /* Not found */</span><br><span>      } else {</span><br><span>@@ -208,6 +231,12 @@</span><br><span> /* get a PDP based on the *peer* address + TEI-Data.  Used for matching inbound Error Ind */</span><br><span> int pdp_getgtp1_peer_d(struct pdp_t **pdp, const struct sockaddr_in *peer, uint32_t teid_gn)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  return gtp_pdp_getgtp1_peer_d(g_gsn, pdp, peer, teid_gn);</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 gtp_pdp_getgtp1_peer_d(struct gsn_t *gsn, struct pdp_t **pdp, const struct sockaddr_in *peer, uint32_t teid_gn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct pdp_t *pdpa = gsn->pdpa;</span><br><span>   unsigned int i;</span><br><span> </span><br><span>  /* this is O(n) but we don't have (nor want) another hash... */</span><br><span>@@ -230,6 +259,7 @@</span><br><span> </span><br><span> int pdp_tidset(struct pdp_t *pdp, uint64_t tid)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct pdp_t **hashtid = pdp->gsn->hashtid;</span><br><span>    int hash = pdp_tidhash(tid);</span><br><span>         struct pdp_t *pdp2;</span><br><span>  struct pdp_t *pdp_prev = NULL;</span><br><span>@@ -248,6 +278,7 @@</span><br><span> </span><br><span> int pdp_tiddel(struct pdp_t *pdp)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    struct pdp_t **hashtid = pdp->gsn->hashtid;</span><br><span>    int hash = pdp_tidhash(pdp->tid);</span><br><span>         struct pdp_t *pdp2;</span><br><span>  struct pdp_t *pdp_prev = NULL;</span><br><span>@@ -269,6 +300,12 @@</span><br><span> </span><br><span> int pdp_tidget(struct pdp_t **pdp, uint64_t tid)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    return gtp_pdp_tidget(g_gsn, pdp, tid);</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 gtp_pdp_tidget(struct gsn_t *gsn, struct pdp_t **pdp, uint64_t tid)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct pdp_t **hashtid = gsn->hashtid;</span><br><span>    int hash = pdp_tidhash(tid);</span><br><span>         struct pdp_t *pdp2;</span><br><span>  DEBUGP(DLGTP, "Begin pdp_tidget tid = %"PRIx64"\n", tid);</span><br><span>@@ -285,7 +322,12 @@</span><br><span> </span><br><span> int pdp_getimsi(struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      return pdp_tidget(pdp,</span><br><span style="color: hsl(120, 100%, 40%);">+        return gtp_pdp_getimsi(g_gsn, pdp, imsi, nsapi);</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 gtp_pdp_getimsi(struct gsn_t *gsn, struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return gtp_pdp_tidget(gsn, pdp,</span><br><span>                        (imsi & 0x0fffffffffffffffull) +</span><br><span>                         ((uint64_t) nsapi << 60));</span><br><span> }</span><br><span>diff --git a/gtp/pdp.h b/gtp/pdp.h</span><br><span>index a287113..9527464 100644</span><br><span>--- a/gtp/pdp.h</span><br><span>+++ b/gtp/pdp.h</span><br><span>@@ -15,6 +15,8 @@</span><br><span> </span><br><span> #include <stdbool.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/defs.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct gsn_t;</span><br><span> </span><br><span> #define LOGPDPX(ss, level, pdp, fmt, args...)                                \</span><br><span>@@ -235,33 +237,40 @@</span><br><span>    /* to be used by libgtp callers/users (to attach their own private state) */</span><br><span>         void *priv;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- struct gsn_t *gsn;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsn_t *gsn; /* Back pointer to GSN where this pdp ctx belongs to */</span><br><span> </span><br><span>       bool tx_gpdu_seq;               /* Transmit (true) or suppress G-PDU sequence numbers */</span><br><span> };</span><br><span> </span><br><span> /* functions related to pdp_t management */</span><br><span style="color: hsl(0, 100%, 40%);">-int pdp_init();</span><br><span style="color: hsl(0, 100%, 40%);">-int pdp_newpdp(struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi,</span><br><span style="color: hsl(0, 100%, 40%);">-               struct pdp_t *pdp_old);</span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_pdp_newpdp(struct gsn_t *gsn, struct pdp_t **pdp, uint64_t imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                 uint8_t nsapi, struct pdp_t *pdp_old);</span><br><span> int pdp_freepdp(struct pdp_t *pdp);</span><br><span style="color: hsl(0, 100%, 40%);">-int pdp_getpdp(struct pdp_t **pdp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int pdp_getgtp0(struct pdp_t **pdp, uint16_t fl);</span><br><span style="color: hsl(0, 100%, 40%);">-int pdp_getgtp1(struct pdp_t **pdp, uint32_t tei);</span><br><span style="color: hsl(0, 100%, 40%);">-int pdp_getgtp1_peer_d(struct pdp_t **pdp, const struct sockaddr_in *peer, uint32_t teid_gn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int pdp_getimsi(struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi);</span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_pdp_getgtp0(struct gsn_t *gsn, struct pdp_t **pdp, uint16_t fl);</span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_pdp_getgtp1(struct gsn_t *gsn, struct pdp_t **pdp, uint32_t tei);</span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_pdp_getgtp1_peer_d(struct gsn_t *gsn, struct pdp_t **pdp, const struct sockaddr_in *peer, uint32_t teid_gn);</span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_pdp_getimsi(struct gsn_t *gsn, struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi);</span><br><span style="color: hsl(120, 100%, 40%);">+int gtp_pdp_tidget(struct gsn_t *gsn, struct pdp_t **pdp, uint64_t tid);</span><br><span> </span><br><span> int pdp_tidhash(uint64_t tid);</span><br><span> int pdp_tidset(struct pdp_t *pdp, uint64_t tid);</span><br><span> int pdp_tiddel(struct pdp_t *pdp);</span><br><span style="color: hsl(0, 100%, 40%);">-int pdp_tidget(struct pdp_t **pdp, uint64_t tid);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+uint64_t pdp_gettid(uint64_t imsi, uint8_t nsapi);</span><br><span> void pdp_set_imsi_nsapi(struct pdp_t *pdp, uint64_t teid);</span><br><span> </span><br><span> unsigned int pdp_count_secondary(struct pdp_t *pdp);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-uint64_t pdp_gettid(uint64_t imsi, uint8_t nsapi);</span><br><span style="color: hsl(120, 100%, 40%);">+/* Deprecated APIs (support for only 1 GSN per process). Must be used only after first call to gtp_new() and until it is freed. */</span><br><span style="color: hsl(120, 100%, 40%);">+int pdp_init(struct gsn_t *gsn); /* Use only allowed inside libgtp to keep compatiblity with deprecated APIs defined here. */</span><br><span style="color: hsl(120, 100%, 40%);">+int pdp_newpdp(struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi,</span><br><span style="color: hsl(120, 100%, 40%);">+          struct pdp_t *pdp_old) OSMO_DEPRECATED("Use gtp_pdp_newpdp() instead");</span><br><span style="color: hsl(120, 100%, 40%);">+int pdp_getpdp(struct pdp_t **pdp) OSMO_DEPRECATED("Use gsn_t->pdpa field instead");</span><br><span style="color: hsl(120, 100%, 40%);">+int pdp_getgtp0(struct pdp_t **pdp, uint16_t fl) OSMO_DEPRECATED("Use gtp_pdp_getgtp0() instead");</span><br><span style="color: hsl(120, 100%, 40%);">+int pdp_getgtp1(struct pdp_t **pdp, uint32_t tei) OSMO_DEPRECATED("Use gtp_pdp_getgtp1() instead");</span><br><span style="color: hsl(120, 100%, 40%);">+int pdp_getgtp1_peer_d(struct pdp_t **pdp, const struct sockaddr_in *peer, uint32_t teid_gn) OSMO_DEPRECATED("Use gtp_pdp_getgtp1_peer_d() instead");</span><br><span style="color: hsl(120, 100%, 40%);">+int pdp_getimsi(struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi) OSMO_DEPRECATED("Use gtp_pdp_getimsi() instead");</span><br><span style="color: hsl(120, 100%, 40%);">+int pdp_tidget(struct pdp_t **pdp, uint64_t tid) OSMO_DEPRECATED("Use gtp_pdp_tidget() instead");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> #endif /* !_PDP_H */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ggsn/+/14296">change 14296</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-ggsn/+/14296"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ggsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I653cbdc185165592d985e3efab6e3f1add97877b </div>
<div style="display:none"> Gerrit-Change-Number: 14296 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-MessageType: merged </div>