<p>Harald Welte has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13623">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">LLC: Store the XID inside the LLC Entity, not LLC Mgmg Entity<br><br>The LLC XID exchange is negotiating parameters for a given SAPI,<br>and not for the entire connection from/to that given subscriber.<br><br>Change-Id: Iaeb54ca5ac58391be45e56c2e721f531969f3a9e<br>---<br>M include/osmocom/sgsn/gprs_llc.h<br>M src/gprs/gprs_llc.c<br>M src/gprs/gprs_sndcp.c<br>3 files changed, 25 insertions(+), 26 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/23/13623/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/gprs_llc.h b/include/osmocom/sgsn/gprs_llc.h</span><br><span>index 376ae9a..711bcd6 100644</span><br><span>--- a/include/osmocom/sgsn/gprs_llc.h</span><br><span>+++ b/include/osmocom/sgsn/gprs_llc.h</span><br><span>@@ -145,6 +145,13 @@</span><br><span>  unsigned int retrans_ctr;</span><br><span> </span><br><span>        struct gprs_llc_params params;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Copy of the XID fields we have sent with the last</span><br><span style="color: hsl(120, 100%, 40%);">+   * network originated XID-Request. Since the phone</span><br><span style="color: hsl(120, 100%, 40%);">+     * may strip the optional fields in the confirmation</span><br><span style="color: hsl(120, 100%, 40%);">+   * we need to remeber those fields in order to be</span><br><span style="color: hsl(120, 100%, 40%);">+      * able to create the compression entity. */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct llist_head *xid;</span><br><span> };</span><br><span> </span><br><span> #define NUM_SAPIS  16</span><br><span>@@ -169,13 +176,6 @@</span><br><span>    uint16_t nsei;</span><br><span>       struct gprs_llc_lle lle[NUM_SAPIS];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Copy of the XID fields we have sent with the last</span><br><span style="color: hsl(0, 100%, 40%);">-     * network originated XID-Request. Since the phone</span><br><span style="color: hsl(0, 100%, 40%);">-       * may strip the optional fields in the confirmation</span><br><span style="color: hsl(0, 100%, 40%);">-     * we need to remeber those fields in order to be</span><br><span style="color: hsl(0, 100%, 40%);">-        * able to create the compression entity. */</span><br><span style="color: hsl(0, 100%, 40%);">-    struct llist_head *xid;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>      /* Compression entities */</span><br><span>   struct {</span><br><span>             /* In these two list_heads we will store the</span><br><span>diff --git a/src/gprs/gprs_llc.c b/src/gprs/gprs_llc.c</span><br><span>index abbb742..1cb0f5d 100644</span><br><span>--- a/src/gprs/gprs_llc.c</span><br><span>+++ b/src/gprs/gprs_llc.c</span><br><span>@@ -52,7 +52,7 @@</span><br><span> /* Generate XID message */</span><br><span> static int gprs_llc_generate_xid(uint8_t *bytes, int bytes_len,</span><br><span>                            struct gprs_llc_xid_field *l3_xid_field,</span><br><span style="color: hsl(0, 100%, 40%);">-                                struct gprs_llc_llme *llme)</span><br><span style="color: hsl(120, 100%, 40%);">+                           struct gprs_llc_lle *lle)</span><br><span> {</span><br><span>      /* Note: Called by gprs_ll_xid_req() */</span><br><span> </span><br><span>@@ -89,8 +89,8 @@</span><br><span>      }</span><br><span> </span><br><span>        /* Store generated XID for later reference */</span><br><span style="color: hsl(0, 100%, 40%);">-   talloc_free(llme->xid);</span><br><span style="color: hsl(0, 100%, 40%);">-      llme->xid = gprs_llc_copy_xid(llme, &xid_fields);</span><br><span style="color: hsl(120, 100%, 40%);">+      talloc_free(lle->xid);</span><br><span style="color: hsl(120, 100%, 40%);">+     lle->xid = gprs_llc_copy_xid(lle->llme, &xid_fields);</span><br><span> </span><br><span>  return gprs_llc_compile_xid(bytes, bytes_len, &xid_fields);</span><br><span> }</span><br><span>@@ -98,7 +98,7 @@</span><br><span> /* Generate XID message that will cause the GMM to reset */</span><br><span> static int gprs_llc_generate_xid_for_gmm_reset(uint8_t *bytes,</span><br><span>                                           int bytes_len, uint32_t iov_ui,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         struct gprs_llc_llme *llme)</span><br><span style="color: hsl(120, 100%, 40%);">+                                           struct gprs_llc_lle *lle)</span><br><span> {</span><br><span>        /* Called by gprs_llgmm_reset() and</span><br><span>   * gprs_llgmm_reset_oldmsg() */</span><br><span>@@ -123,8 +123,8 @@</span><br><span>        llist_add(&xid_reset.list, &xid_fields);</span><br><span> </span><br><span>         /* Store generated XID for later reference */</span><br><span style="color: hsl(0, 100%, 40%);">-   talloc_free(llme->xid);</span><br><span style="color: hsl(0, 100%, 40%);">-      llme->xid = gprs_llc_copy_xid(llme, &xid_fields);</span><br><span style="color: hsl(120, 100%, 40%);">+      talloc_free(lle->xid);</span><br><span style="color: hsl(120, 100%, 40%);">+     lle->xid = gprs_llc_copy_xid(lle->llme, &xid_fields);</span><br><span> </span><br><span>  return gprs_llc_compile_xid(bytes, bytes_len, &xid_fields);</span><br><span> }</span><br><span>@@ -143,8 +143,8 @@</span><br><span>   struct gprs_llc_xid_field *xid_field_request_l3 = NULL;</span><br><span> </span><br><span>  /* Pick layer3 XID from the XID request we have sent last */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (lle->llme->xid) {</span><br><span style="color: hsl(0, 100%, 40%);">-             llist_for_each_entry(xid_field_request, lle->llme->xid, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (lle->xid) {</span><br><span style="color: hsl(120, 100%, 40%);">+            llist_for_each_entry(xid_field_request, lle->xid, list) {</span><br><span>                         if (xid_field_request->type == GPRS_LLC_XID_T_L3_PAR)</span><br><span>                             xid_field_request_l3 = xid_field_request;</span><br><span>            }</span><br><span>@@ -188,8 +188,8 @@</span><br><span>      }</span><br><span> </span><br><span>        /* Flush pending XID fields */</span><br><span style="color: hsl(0, 100%, 40%);">-  talloc_free(lle->llme->xid);</span><br><span style="color: hsl(0, 100%, 40%);">-      lle->llme->xid = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  talloc_free(lle->xid);</span><br><span style="color: hsl(120, 100%, 40%);">+     lle->xid = NULL;</span><br><span> </span><br><span>      return 0;</span><br><span> }</span><br><span>@@ -324,8 +324,7 @@</span><br><span> </span><br><span>     /* Generate XID */</span><br><span>   xid_bytes_len =</span><br><span style="color: hsl(0, 100%, 40%);">-     gprs_llc_generate_xid(xid_bytes, sizeof(xid_bytes),</span><br><span style="color: hsl(0, 100%, 40%);">-                           l3_xid_field, lle->llme);</span><br><span style="color: hsl(120, 100%, 40%);">+            gprs_llc_generate_xid(xid_bytes, sizeof(xid_bytes), l3_xid_field, lle);</span><br><span> </span><br><span>      /* Only perform XID sending if the XID message contains something */</span><br><span>         if (xid_bytes_len > 0) {</span><br><span>@@ -576,7 +575,6 @@</span><br><span> {</span><br><span>       gprs_sndcp_comp_free(llme->comp.proto);</span><br><span>   gprs_sndcp_comp_free(llme->comp.data);</span><br><span style="color: hsl(0, 100%, 40%);">-       talloc_free(llme->xid);</span><br><span>   llist_del(&llme->list);</span><br><span>       talloc_free(llme);</span><br><span> }</span><br><span>@@ -1084,8 +1082,8 @@</span><br><span>      }</span><br><span> </span><br><span>        /* Generate XID message */</span><br><span style="color: hsl(0, 100%, 40%);">-      xid_bytes_len = gprs_llc_generate_xid_for_gmm_reset(xid_bytes,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  sizeof(xid_bytes),llme->iov_ui,llme);</span><br><span style="color: hsl(120, 100%, 40%);">+      xid_bytes_len = gprs_llc_generate_xid_for_gmm_reset(xid_bytes, sizeof(xid_bytes),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         llme->iov_ui, lle);</span><br><span>   if (xid_bytes_len < 0)</span><br><span>            return -EINVAL;</span><br><span>      xid = msgb_put(msg, xid_bytes_len);</span><br><span>@@ -1105,6 +1103,7 @@</span><br><span>                      struct gprs_llc_llme *llme)</span><br><span> {</span><br><span>         struct msgb *msg = msgb_alloc_headroom(4096, 1024, "LLC_XID");</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gprs_llc_lle *lle = &llme->lle[sapi];</span><br><span>  uint8_t xid_bytes[1024];</span><br><span>     int xid_bytes_len, rc;</span><br><span>       uint8_t *xid;</span><br><span>@@ -1118,8 +1117,8 @@</span><br><span>        }</span><br><span> </span><br><span>        /* Generate XID message */</span><br><span style="color: hsl(0, 100%, 40%);">-      xid_bytes_len = gprs_llc_generate_xid_for_gmm_reset(xid_bytes,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  sizeof(xid_bytes),llme->iov_ui,llme);</span><br><span style="color: hsl(120, 100%, 40%);">+      xid_bytes_len = gprs_llc_generate_xid_for_gmm_reset(xid_bytes, sizeof(xid_bytes),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         llme->iov_ui, lle);</span><br><span>   if (xid_bytes_len < 0)</span><br><span>            return -EINVAL;</span><br><span>      xid = msgb_put(msg, xid_bytes_len);</span><br><span>diff --git a/src/gprs/gprs_sndcp.c b/src/gprs/gprs_sndcp.c</span><br><span>index f0239cb..23d1e9a 100644</span><br><span>--- a/src/gprs/gprs_sndcp.c</span><br><span>+++ b/src/gprs/gprs_sndcp.c</span><br><span>@@ -989,8 +989,8 @@</span><br><span>   gprs_sndcp_comp_free(lle->llme->comp.data);</span><br><span>    lle->llme->comp.proto = gprs_sndcp_comp_alloc(lle->llme);</span><br><span>   lle->llme->comp.data = gprs_sndcp_comp_alloc(lle->llme);</span><br><span style="color: hsl(0, 100%, 40%);">-       talloc_free(lle->llme->xid);</span><br><span style="color: hsl(0, 100%, 40%);">-      lle->llme->xid = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  talloc_free(lle->xid);</span><br><span style="color: hsl(120, 100%, 40%);">+     lle->xid = NULL;</span><br><span> </span><br><span>      /* Generate compression parameter bytestream */</span><br><span>      xid_len = gprs_llc_gen_sndcp_xid(l3params, sizeof(l3params), nsapi);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13623">change 13623</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/13623"/><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: Iaeb54ca5ac58391be45e56c2e721f531969f3a9e </div>
<div style="display:none"> Gerrit-Change-Number: 13623 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>