<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21227">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_gb_parse: Add function to determine TLLI from encoded BSSGP<br><br>This will be needed to use the TLLI as link selector parameter<br>in osmo-gbproxy in an upcoming patch.<br><br>Depends: libosmocore.git I397b32a6e6ea3e9d218446138cceafa9b27685dd<br>Change-Id: Ia6d5300e63ad23987cbdca824db620305bd583d7<br>---<br>M include/osmocom/sgsn/gprs_gb_parse.h<br>M src/gprs/gprs_gb_parse.c<br>2 files changed, 51 insertions(+), 0 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/27/21227/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/gprs_gb_parse.h b/include/osmocom/sgsn/gprs_gb_parse.h</span><br><span>index 9f43fae..58de17f 100644</span><br><span>--- a/include/osmocom/sgsn/gprs_gb_parse.h</span><br><span>+++ b/include/osmocom/sgsn/gprs_gb_parse.h</span><br><span>@@ -51,6 +51,8 @@</span><br><span> int gprs_gb_parse_bssgp(uint8_t *bssgp, size_t bssgp_len,</span><br><span>                         struct gprs_gb_parse_context *parse_ctx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_gb_parse_tlli(const uint8_t *bssgp, size_t bssgp_len, uint32_t *tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> const char *gprs_gb_message_name(const struct gprs_gb_parse_context *parse_ctx,</span><br><span>                           const char *default_msg_name);</span><br><span> </span><br><span>diff --git a/src/gprs/gprs_gb_parse.c b/src/gprs/gprs_gb_parse.c</span><br><span>index e5de4d4..779cbfc 100644</span><br><span>--- a/src/gprs/gprs_gb_parse.c</span><br><span>+++ b/src/gprs/gprs_gb_parse.c</span><br><span>@@ -437,6 +437,55 @@</span><br><span>      return gprs_gb_parse_dtap(ghp->data, ghp->data_len, parse_ctx);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Determine the TLLI from the given BSSGP message.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] bssgp pointer to start of BSSGP header</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] bssgp_len length of BSSGP message in octets</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] tlli TLLI (if any) in host byte order</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 1 if TLLI found; 0 if none found; negative on parse error */</span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_gb_parse_tlli(const uint8_t *bssgp, size_t bssgp_len, uint32_t *tlli)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  const struct bssgp_normal_hdr *bgph;</span><br><span style="color: hsl(120, 100%, 40%);">+  const struct bssgp_ud_hdr *budh = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct tlv_parsed tp;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t pdu_type;</span><br><span style="color: hsl(120, 100%, 40%);">+     const uint8_t *data;</span><br><span style="color: hsl(120, 100%, 40%);">+  size_t data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (bssgp_len < sizeof(struct bssgp_normal_hdr))</span><br><span style="color: hsl(120, 100%, 40%);">+           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     bgph = (struct bssgp_normal_hdr *)bssgp;</span><br><span style="color: hsl(120, 100%, 40%);">+      pdu_type = bgph->pdu_type;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (pdu_type == BSSGP_PDUT_UL_UNITDATA ||</span><br><span style="color: hsl(120, 100%, 40%);">+         pdu_type == BSSGP_PDUT_DL_UNITDATA) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (bssgp_len < sizeof(struct bssgp_ud_hdr))</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               budh = (struct bssgp_ud_hdr *)bssgp;</span><br><span style="color: hsl(120, 100%, 40%);">+          bgph = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+          data = budh->data;</span><br><span style="color: hsl(120, 100%, 40%);">+         data_len = bssgp_len - sizeof(*budh);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              data = bgph->data;</span><br><span style="color: hsl(120, 100%, 40%);">+         data_len = bssgp_len - sizeof(*bgph);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (budh) {</span><br><span style="color: hsl(120, 100%, 40%);">+           *tlli = osmo_load32be((const uint8_t *)&budh->tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+           return 1;</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%);">+   if (bssgp_tlv_parse(&tp, data, data_len) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (TLVP_PRESENT(&tp, BSSGP_IE_TLLI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           *tlli = osmo_load32be(TLVP_VAL(&tp, BSSGP_IE_TLLI));</span><br><span style="color: hsl(120, 100%, 40%);">+              return 1;</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%);">+   /* No TLLI present in message */</span><br><span style="color: hsl(120, 100%, 40%);">+      return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int gprs_gb_parse_bssgp(uint8_t *bssgp, size_t bssgp_len,</span><br><span>                  struct gprs_gb_parse_context *parse_ctx)</span><br><span> {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sgsn/+/21227">change 21227</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/+/21227"/><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: Ia6d5300e63ad23987cbdca824db620305bd583d7 </div>
<div style="display:none"> Gerrit-Change-Number: 21227 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>