<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10024">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gtp: Pass originating pdp ctx to recovery_cb<br><br>This commit breaks API and old apps will fail to compile if using the<br>cb_recovery.<br><br>Sometimes the originating pdp ctx causing the Recovery Procedure is<br>required, in order to drop all pdp ctx but this one, which specs specify<br>should be handled as valid:<br>"""<br>The SGSN receiving the Recovery information element shall handle it as when an<br>Echo Response message is received but shall consider the PDP context being created as active if the response indicates<br>successful context activation at the GGSN.<br>"""<br><br>Change-Id: I53e92298f2f6b84d662a3300d922e8c2ccb178bc<br>---<br>M gtp/gtp.c<br>M gtp/gtp.h<br>2 files changed, 18 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/24/10024/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/gtp/gtp.c b/gtp/gtp.c</span><br><span>index 95abbef..a495943 100644</span><br><span>--- a/gtp/gtp.c</span><br><span>+++ b/gtp/gtp.c</span><br><span>@@ -190,10 +190,17 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* cb_recovery()</span><br><span style="color: hsl(120, 100%, 40%);">+ * pdp may be NULL if Recovery IE was received from a message indepenendent</span><br><span style="color: hsl(120, 100%, 40%);">+ * of any PDP ctx (such as Echo Response), or because pdp ctx is unknown to the</span><br><span style="color: hsl(120, 100%, 40%);">+ * local setup. In case pdp is known, user may want to keep that pdp alive to</span><br><span style="color: hsl(120, 100%, 40%);">+ * handle subsequent msg cb as this specific pdp ctx is still valid according to</span><br><span style="color: hsl(120, 100%, 40%);">+ * specs.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span> int gtp_set_cb_recovery(struct gsn_t *gsn,</span><br><span style="color: hsl(0, 100%, 40%);">-                       int (*cb) (struct sockaddr_in * peer, uint8_t recovery))</span><br><span style="color: hsl(120, 100%, 40%);">+                      int (*cb_recovery) (struct sockaddr_in * peer, struct pdp_t * pdp, uint8_t recovery))</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      gsn->cb_recovery = cb;</span><br><span style="color: hsl(120, 100%, 40%);">+     gsn->cb_recovery = cb_recovery;</span><br><span>   return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -978,7 +985,7 @@</span><br><span>             gsn->cb_conf(type, recovery, NULL, cbp);</span><br><span> </span><br><span>      if (gsn->cb_recovery)</span><br><span style="color: hsl(0, 100%, 40%);">-                gsn->cb_recovery(peer, recovery);</span><br><span style="color: hsl(120, 100%, 40%);">+          gsn->cb_recovery(peer, NULL, recovery);</span><br><span> </span><br><span>       return 0;</span><br><span> }</span><br><span>@@ -1410,8 +1417,9 @@</span><br><span> </span><br><span>   /* Recovery (optional) */</span><br><span>    if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            /* pass null pdp since new ctx is still not known to upper layers */</span><br><span>                 if (gsn->cb_recovery)</span><br><span style="color: hsl(0, 100%, 40%);">-                        gsn->cb_recovery(peer, recovery);</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsn->cb_recovery(peer, NULL, recovery);</span><br><span>   }</span><br><span> </span><br><span>        /* Selection mode (conditional) */</span><br><span>@@ -1697,7 +1705,7 @@</span><br><span>   /* Extract recovery (optional) */</span><br><span>    if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) {</span><br><span>           if (gsn->cb_recovery)</span><br><span style="color: hsl(0, 100%, 40%);">-                        gsn->cb_recovery(peer, recovery);</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsn->cb_recovery(peer, pdp, recovery);</span><br><span>    }</span><br><span> </span><br><span>        /* Extract protocol configuration options (optional) */</span><br><span>@@ -2107,7 +2115,7 @@</span><br><span>      /* Recovery (optional) */</span><br><span>    if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) {</span><br><span>           if (gsn->cb_recovery)</span><br><span style="color: hsl(0, 100%, 40%);">-                        gsn->cb_recovery(peer, recovery);</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsn->cb_recovery(peer, pdp, recovery);</span><br><span>    }</span><br><span> </span><br><span>        if (version == 0) {</span><br><span>@@ -2268,7 +2276,7 @@</span><br><span>  /* Extract recovery (optional) */</span><br><span>    if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) {</span><br><span>           if (gsn->cb_recovery)</span><br><span style="color: hsl(0, 100%, 40%);">-                        gsn->cb_recovery(peer, recovery);</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsn->cb_recovery(peer, pdp, recovery);</span><br><span>    }</span><br><span> </span><br><span>        /* Check all conditional information elements */</span><br><span>diff --git a/gtp/gtp.h b/gtp/gtp.h</span><br><span>index f185424..f5ce517 100644</span><br><span>--- a/gtp/gtp.h</span><br><span>+++ b/gtp/gtp.h</span><br><span>@@ -270,7 +270,7 @@</span><br><span>      int (*cb_extheader_ind) (struct sockaddr_in * peer);</span><br><span>         int (*cb_conf) (int type, int cause, struct pdp_t * pdp, void *cbp);</span><br><span>         int (*cb_data_ind) (struct pdp_t * pdp, void *pack, unsigned len);</span><br><span style="color: hsl(0, 100%, 40%);">-      int (*cb_recovery) (struct sockaddr_in * peer, uint8_t recovery);</span><br><span style="color: hsl(120, 100%, 40%);">+     int (*cb_recovery) (struct sockaddr_in * peer, struct pdp_t * pdp, uint8_t recovery);</span><br><span> </span><br><span>    /* Counters */</span><br><span> </span><br><span>@@ -360,7 +360,8 @@</span><br><span>                                   void *cbp));</span><br><span> </span><br><span> int gtp_set_cb_recovery(struct gsn_t *gsn,</span><br><span style="color: hsl(0, 100%, 40%);">-                    int (*cb) (struct sockaddr_in * peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                 int (*cb_recovery) (struct sockaddr_in * peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   struct pdp_t * pdp,</span><br><span>                                  uint8_t recovery));</span><br><span> </span><br><span> /* Internal functions (not part of the API */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10024">change 10024</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/10024"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I53e92298f2f6b84d662a3300d922e8c2ccb178bc </div>
<div style="display:none"> Gerrit-Change-Number: 10024 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>