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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">LCLS: enc/dec entire parameter set instead of GCR<br><br>In 3GPP TS 48.008 the Global Call Reference IE is only used in HANDOVER<br>REQUEST (§3.2.1.8) and ASSIGNMENT REQUEST (§3.2.1.1) messages which<br>also include LCLS Config and CSC parameters. Hence, there's no point in<br>using GCR encode/decode functions alone.<br><br>Introduce gsm0808_dec_lcls() and gsm0808_enc_lcls() as trivial wrappers<br>on top of GCR enc/dec routines which are made static. Adjust tests<br>accordingly. Test output intentionally left unchanged.<br><br>Change-Id: Icfbb2404e1a1d500243e2071173299b557369335<br>---<br>M include/osmocom/gsm/gsm0808_utils.h<br>M src/gsm/gsm0808.c<br>M src/gsm/gsm0808_utils.c<br>M src/gsm/libosmogsm.map<br>M tests/gsm0808/gsm0808_test.c<br>5 files changed, 78 insertions(+), 36 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/gsm0808_utils.h b/include/osmocom/gsm/gsm0808_utils.h</span><br><span>index 22050b5..4a2233e 100644</span><br><span>--- a/include/osmocom/gsm/gsm0808_utils.h</span><br><span>+++ b/include/osmocom/gsm/gsm0808_utils.h</span><br><span>@@ -84,8 +84,8 @@</span><br><span> int gsm0808_dec_aoip_trasp_addr(struct sockaddr_storage *ss,</span><br><span>                            const uint8_t *elem, uint8_t len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm0808_enc_gcr(struct msgb *msg, const struct osmo_gcr_parsed *g);</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm0808_dec_gcr(struct osmo_gcr_parsed *g, const struct tlv_parsed *tp);</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t gsm0808_enc_lcls(struct msgb *msg, const struct osmo_lcls *lcls);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0808_dec_lcls(struct osmo_lcls *lcls, const struct tlv_parsed *tp);</span><br><span> </span><br><span> uint8_t gsm0808_enc_speech_codec(struct msgb *msg,</span><br><span>                                const struct gsm0808_speech_codec *sc);</span><br><span>diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c</span><br><span>index 69da57d..485e063 100644</span><br><span>--- a/src/gsm/gsm0808.c</span><br><span>+++ b/src/gsm/gsm0808.c</span><br><span>@@ -488,23 +488,8 @@</span><br><span>     if (kc)</span><br><span>              msgb_tv_fixed_put(msg, GSM0808_IE_KC_128, 16, kc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (lcls) {</span><br><span style="color: hsl(0, 100%, 40%);">-             /* LCLS: §3.2.2.115 Global Call Reference */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (lcls->gcr)</span><br><span style="color: hsl(0, 100%, 40%);">-                       gsm0808_enc_gcr(msg, lcls->gcr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             /* LCLS: §3.2.2.116 Configuration */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (lcls->config != GSM0808_LCLS_CFG_NA)</span><br><span style="color: hsl(0, 100%, 40%);">-                     msgb_tv_put(msg, GSM0808_IE_LCLS_CONFIG, lcls->config);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              /* LCLS: §3.2.2.117 Connection Status Control */</span><br><span style="color: hsl(0, 100%, 40%);">-               if (lcls->control != GSM0808_LCLS_CSC_NA)</span><br><span style="color: hsl(0, 100%, 40%);">-                    msgb_tv_put(msg, GSM0808_IE_LCLS_CONN_STATUS_CTRL, lcls->control);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           /* LCLS: §3.2.2.118 Correlation-Not-Needed */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!lcls->corr_needed)</span><br><span style="color: hsl(0, 100%, 40%);">-                      msgb_v_put(msg, GSM0808_IE_LCLS_CORR_NOT_NEEDED);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lcls)</span><br><span style="color: hsl(120, 100%, 40%);">+             gsm0808_enc_lcls(msg, lcls);</span><br><span> </span><br><span>     /* push the bssmap header */</span><br><span>         msg->l3h =</span><br><span>diff --git a/src/gsm/gsm0808_utils.c b/src/gsm/gsm0808_utils.c</span><br><span>index aa0d3d7..2a458c3 100644</span><br><span>--- a/src/gsm/gsm0808_utils.c</span><br><span>+++ b/src/gsm/gsm0808_utils.c</span><br><span>@@ -512,7 +512,7 @@</span><br><span>  *  \param[out] msg Message Buffer for appending IE</span><br><span>  *  \param[in] g Global Call Reference, 3GPP TS 29.205 Table B 2.1.9.1</span><br><span>  *  \returns number of bytes added to \a msg or 0 on error */</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm0808_enc_gcr(struct msgb *msg, const struct osmo_gcr_parsed *g)</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t gsm0808_enc_gcr(struct msgb *msg, const struct osmo_gcr_parsed *g)</span><br><span> {</span><br><span>     uint8_t enc, *len = msgb_tl_put(msg, GSM0808_IE_GLOBAL_CALL_REF);</span><br><span> </span><br><span>@@ -528,7 +528,7 @@</span><br><span>  *  \param[out] gcr Caller-provided memory to store Global Call Reference</span><br><span>  *  \param[in] tp IE values to be decoded</span><br><span>  *  \returns number of bytes parsed; negative on error */</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm0808_dec_gcr(struct osmo_gcr_parsed *gcr, const struct tlv_parsed *tp)</span><br><span style="color: hsl(120, 100%, 40%);">+static int gsm0808_dec_gcr(struct osmo_gcr_parsed *gcr, const struct tlv_parsed *tp)</span><br><span> {</span><br><span>   int ret;</span><br><span>     const uint8_t *buf = TLVP_VAL_MINLEN(tp, GSM0808_IE_GLOBAL_CALL_REF, OSMO_GCR_MIN_LEN);</span><br><span>@@ -542,6 +542,56 @@</span><br><span>       return 2 + ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Add LCLS parameters to a given msgb, 3GPP TS 48.008 §3.2.2.115 - 3.2.2.120.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] msg Message Buffer for appending IE</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] lcls LCLS-related data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns number of bytes added to \a msg or 0 on error */</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t gsm0808_enc_lcls(struct msgb *msg, const struct osmo_lcls *lcls)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t enc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* LCLS: §3.2.2.115 Global Call Reference */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (lcls->gcr)</span><br><span style="color: hsl(120, 100%, 40%);">+             enc = gsm0808_enc_gcr(msg, lcls->gcr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* LCLS: §3.2.2.116 Configuration */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (lcls->config != GSM0808_LCLS_CFG_NA) {</span><br><span style="color: hsl(120, 100%, 40%);">+         msgb_tv_put(msg, GSM0808_IE_LCLS_CONFIG, lcls->config);</span><br><span style="color: hsl(120, 100%, 40%);">+            enc += 2;</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%);">+   /* LCLS: §3.2.2.117 Connection Status Control */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lcls->control != GSM0808_LCLS_CSC_NA) {</span><br><span style="color: hsl(120, 100%, 40%);">+                msgb_tv_put(msg, GSM0808_IE_LCLS_CONN_STATUS_CTRL, lcls->control);</span><br><span style="color: hsl(120, 100%, 40%);">+         enc += 2;</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%);">+   /* LCLS: §3.2.2.118 Correlation-Not-Needed */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!lcls->corr_needed) {</span><br><span style="color: hsl(120, 100%, 40%);">+          msgb_v_put(msg, GSM0808_IE_LCLS_CORR_NOT_NEEDED);</span><br><span style="color: hsl(120, 100%, 40%);">+             enc++;</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%);">+   return enc;</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%);">+/*! Decode LCLS parameters to a given msgb, 3GPP TS 48.008 §3.2.2.115 - 3.2.2.120.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[out] lcls Caller-provided memory to store LCLS-related data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] tp IE values to be decoded</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns GCR size or negative on error */</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm0808_dec_lcls(struct osmo_lcls *lcls, const struct tlv_parsed *tp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int ret = gsm0808_dec_gcr(lcls->gcr, tp);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ret < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+               return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ lcls->config = tlvp_val8(tp, GSM0808_IE_LCLS_CONFIG, GSM0808_LCLS_CFG_NA);</span><br><span style="color: hsl(120, 100%, 40%);">+ lcls->control = tlvp_val8(tp, GSM0808_IE_LCLS_CONN_STATUS_CTRL, GSM0808_LCLS_CSC_NA);</span><br><span style="color: hsl(120, 100%, 40%);">+      lcls->corr_needed = TLVP_PRESENT(tp, GSM0808_IE_LCLS_CORR_NOT_NEEDED) ? false : true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Encode TS 08.08 Encryption Information IE</span><br><span>  *  \param[out] msg Message Buffer to which IE is to be appended</span><br><span>  *  \param[in] ei Encryption Information to be encoded</span><br><span>diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map</span><br><span>index 90c2195..76b3fd0 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -220,8 +220,8 @@</span><br><span> gsm0808_lcls_config_names;</span><br><span> gsm0808_lcls_control_names;</span><br><span> gsm0808_lcls_status_names;</span><br><span style="color: hsl(0, 100%, 40%);">-gsm0808_enc_gcr;</span><br><span style="color: hsl(0, 100%, 40%);">-gsm0808_dec_gcr;</span><br><span style="color: hsl(120, 100%, 40%);">+gsm0808_enc_lcls;</span><br><span style="color: hsl(120, 100%, 40%);">+gsm0808_dec_lcls;</span><br><span> </span><br><span> gsm29118_msgb_alloc;</span><br><span> gsm29118_create_alert_req;</span><br><span>diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c</span><br><span>index ebdfc29..40e2b87 100644</span><br><span>--- a/tests/gsm0808/gsm0808_test.c</span><br><span>+++ b/tests/gsm0808/gsm0808_test.c</span><br><span>@@ -668,7 +668,7 @@</span><br><span>     msgb_free(in_msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void test_enc_dec_gcr()</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_enc_dec_lcls()</span><br><span> {</span><br><span>      static const uint8_t res[] = {</span><br><span>               GSM0808_IE_GLOBAL_CALL_REF,</span><br><span>@@ -690,11 +690,18 @@</span><br><span>  };</span><br><span>   int rc;</span><br><span>      struct tlv_parsed tp;</span><br><span style="color: hsl(0, 100%, 40%);">-   msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, "global call reference");</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_lcls lcls_out = { .gcr = &p }, lcls_in = {</span><br><span style="color: hsl(120, 100%, 40%);">+            .gcr = &g,</span><br><span style="color: hsl(120, 100%, 40%);">+                .config = GSM0808_LCLS_CFG_NA,</span><br><span style="color: hsl(120, 100%, 40%);">+                .control = GSM0808_LCLS_CSC_NA,</span><br><span style="color: hsl(120, 100%, 40%);">+               .corr_needed = true,</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%);">+  msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, "LCLS IE");</span><br><span>        if (!msg)</span><br><span>            return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     len = gsm0808_enc_gcr(msg, &g);</span><br><span style="color: hsl(120, 100%, 40%);">+   len = gsm0808_enc_lcls(msg, &lcls_in);</span><br><span>   printf("Testing Global Call Reference IE encoder...\n\t%d bytes added: %s\n",</span><br><span>             len, len == ARRAY_SIZE(res) ? "OK" : "FAIL");</span><br><span> </span><br><span>@@ -707,29 +714,29 @@</span><br><span>                 abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rc = gsm0808_dec_gcr(&p, &tp);</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = gsm0808_dec_lcls(&lcls_out, &tp);</span><br><span>       if (rc < 0) {</span><br><span>             printf("decoding failed: %s [%s]\n", strerror(-rc), msgb_hexdump(msg));</span><br><span>            abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (p.net_len != g.net_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-           printf("Network ID length parsed wrong: %u != %u\n", p.net_len, g.net_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (lcls_out.gcr->net_len != g.net_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+          printf("Network ID length parsed wrong: %u != %u\n", lcls_out.gcr->net_len, g.net_len);</span><br><span>                 abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (p.node != g.node) {</span><br><span style="color: hsl(0, 100%, 40%);">-         printf("Node ID parsed wrong: 0x%X != 0x%X\n", p.node, g.node);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lcls_out.gcr->node != g.node) {</span><br><span style="color: hsl(120, 100%, 40%);">+                printf("Node ID parsed wrong: 0x%X != 0x%X\n", lcls_out.gcr->node, g.node);</span><br><span>             abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (memcmp(p.net, g.net, g.net_len) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             printf("Network ID parsed wrong: %s\n", osmo_hexdump(p.net, p.net_len));</span><br><span style="color: hsl(120, 100%, 40%);">+    if (memcmp(lcls_out.gcr->net, g.net, g.net_len) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("Network ID parsed wrong: %s\n", osmo_hexdump(lcls_out.gcr->net, lcls_out.gcr->net_len));</span><br><span>             abort();</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (memcmp(p.cr, g.cr, 5) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("Call ref. ID parsed wrong: %s\n", osmo_hexdump(p.cr, 5));</span><br><span style="color: hsl(120, 100%, 40%);">+   if (memcmp(lcls_out.gcr->cr, g.cr, 5) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("Call ref. ID parsed wrong: %s\n", osmo_hexdump(lcls_out.gcr->cr, 5));</span><br><span>           abort();</span><br><span>     }</span><br><span> </span><br><span>@@ -1959,7 +1966,7 @@</span><br><span>        test_create_dtap();</span><br><span>  test_prepend_dtap();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        test_enc_dec_gcr();</span><br><span style="color: hsl(120, 100%, 40%);">+   test_enc_dec_lcls();</span><br><span> </span><br><span>     test_enc_dec_aoip_trasp_addr_v4();</span><br><span>   test_enc_dec_aoip_trasp_addr_v6();</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12371">change 12371</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/12371"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Icfbb2404e1a1d500243e2071173299b557369335 </div>
<div style="display:none"> Gerrit-Change-Number: 12371 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>