<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sip-connector/+/25979">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sip: use osmo_{enc,dec}_gcr() from libosmocore<br><br>Change-Id: I46fa46fc79494d337f2f4657215b91c39207eea4<br>Depends: I06babb959fdc82f4e82d92260131d60c98b0abd2<br>Fixes: Id40d7e0fed9356f801b3627c118150055e7232b1<br>Related: OS#5164<br>---<br>M src/call.h<br>M src/mncc.c<br>M src/sip.c<br>3 files changed, 34 insertions(+), 63 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/call.h b/src/call.h</span><br><span>index 8360711..a835f71 100644</span><br><span>--- a/src/call.h</span><br><span>+++ b/src/call.h</span><br><span>@@ -5,6 +5,7 @@</span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/core/timer.h></span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm29205.h></span><br><span> </span><br><span> #include <stdbool.h></span><br><span> #include <netinet/in.h></span><br><span>@@ -31,7 +32,10 @@</span><br><span> </span><br><span>         const char *source;</span><br><span>  const char *dest;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Global Call Reference */</span><br><span>  struct osmo_gcr_parsed gcr;</span><br><span style="color: hsl(120, 100%, 40%);">+   bool gcr_present;</span><br><span> };</span><br><span> </span><br><span> enum {</span><br><span>diff --git a/src/mncc.c b/src/mncc.c</span><br><span>index fc99400..c8bf4bd 100644</span><br><span>--- a/src/mncc.c</span><br><span>+++ b/src/mncc.c</span><br><span>@@ -544,6 +544,7 @@</span><br><span>     leg->state = MNCC_CC_INITIAL;</span><br><span>     leg->dir = MNCC_DIR_MO;</span><br><span>   leg->base.call->gcr = data->gcr;</span><br><span style="color: hsl(120, 100%, 40%);">+     leg->base.call->gcr_present = true;</span><br><span>    memcpy(&leg->called, called, sizeof(leg->called));</span><br><span>         memcpy(&leg->calling, &data->calling, sizeof(leg->calling));</span><br><span>        memcpy(&leg->imsi, data->imsi, sizeof(leg->imsi));</span><br><span>@@ -899,7 +900,8 @@</span><br><span> </span><br><span>    mncc.fields |= MNCC_F_CALLING;</span><br><span>       mncc.calling.plan = GSM48_NPI_ISDN_E164;</span><br><span style="color: hsl(0, 100%, 40%);">-        mncc.gcr = call->gcr;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (call->gcr_present)</span><br><span style="color: hsl(120, 100%, 40%);">+             mncc.gcr = call->gcr;</span><br><span> </span><br><span>         if (call->source && call->source[0] == '+') {</span><br><span>          mncc.calling.type = GSM48_TON_INTERNATIONAL;</span><br><span>diff --git a/src/sip.c b/src/sip.c</span><br><span>index 0e88716..9124752 100644</span><br><span>--- a/src/sip.c</span><br><span>+++ b/src/sip.c</span><br><span>@@ -107,34 +107,6 @@</span><br><span>         nua_ack(leg->nua_handle, TAG_END());</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int _osmo_dec_gcr(struct osmo_gcr_parsed *gcr, const uint8_t *elem, uint8_t len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       uint16_t parsed = 1; /* account for length byte right away */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (len < 13)</span><br><span style="color: hsl(0, 100%, 40%);">-                return -EBADMSG;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        gcr->net_len = elem[0];</span><br><span style="color: hsl(0, 100%, 40%);">-      if (gcr->net_len < 3 || gcr->net_len > 5)</span><br><span style="color: hsl(0, 100%, 40%);">-           return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memcpy(gcr->net, elem + parsed, gcr->net_len);</span><br><span style="color: hsl(0, 100%, 40%);">-    /* +1 for ignored Node ID length field */</span><br><span style="color: hsl(0, 100%, 40%);">-       parsed += (gcr->net_len + 1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        gcr->node = osmo_load16be(elem + parsed);</span><br><span style="color: hsl(0, 100%, 40%);">-    parsed += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (elem[parsed] != 5) /* see Table B 2.1.9.2 */</span><br><span style="color: hsl(0, 100%, 40%);">-                return -ENOENT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- parsed++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       memcpy(gcr->cr, elem + parsed, 5);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return parsed + 5;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void new_call(struct sip_agent *agent, nua_handle_t *nh,</span><br><span>                       const sip_t *sip)</span><br><span> {</span><br><span>@@ -142,15 +114,16 @@</span><br><span>       struct sip_call_leg *leg;</span><br><span>    const char *from = NULL, *to = NULL;</span><br><span>         char ip_addr[INET6_ADDRSTRLEN];</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t gcr_back[28] = { 0 };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ bool xgcr_hdr_present = false;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t xgcr_hdr[28] = { 0 };</span><br><span> </span><br><span>    LOGP(DSIP, LOGL_INFO, "Incoming call(%s) handle(%p)\n", sip->sip_call_id->i_id, nh);</span><br><span> </span><br><span>     sip_unknown_t *unknown_header = sip->sip_unknown;</span><br><span>         while (unknown_header != NULL) {</span><br><span>             if (!strcmp("X-Global-Call-Ref", unknown_header->un_name)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       osmo_hexparse(unknown_header->un_value, gcr_back, sizeof(gcr_back));</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_hexparse(unknown_header->un_value, xgcr_hdr, sizeof(xgcr_hdr));</span><br><span style="color: hsl(120, 100%, 40%);">+                       xgcr_hdr_present = true;</span><br><span>                     break;</span><br><span>               }</span><br><span>            unknown_header = unknown_header->un_next;</span><br><span>@@ -171,7 +144,16 @@</span><br><span>          return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   _osmo_dec_gcr(&call->gcr, gcr_back, sizeof(gcr_back));</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Decode Decode the Global Call Reference (if present) */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (xgcr_hdr_present) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (osmo_dec_gcr(&call->gcr, xgcr_hdr, sizeof(xgcr_hdr)) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGP(DSIP, LOGL_ERROR, "Failed to parse X-Global-Call-Ref.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                     nua_respond(nh, SIP_406_NOT_ACCEPTABLE, TAG_END());</span><br><span style="color: hsl(120, 100%, 40%);">+                   nua_handle_destroy(nh);</span><br><span style="color: hsl(120, 100%, 40%);">+                       return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             call->gcr_present = true;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> </span><br><span>        if (sip->sip_to)</span><br><span>          to = sip->sip_to->a_url->url_user;</span><br><span>@@ -632,38 +614,10 @@</span><br><span>  leg->state = SIP_CC_CONNECTED;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! Encode Global Call Reference. */</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t _osmo_enc_gcr(uint8_t *buf, const struct osmo_gcr_parsed *g)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t tmp[2];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!g)</span><br><span style="color: hsl(0, 100%, 40%);">-         return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (g->net_len < 3 || g->net_len > 5)</span><br><span style="color: hsl(0, 100%, 40%);">-               return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       buf = lv_put(buf, g->net_len, g->net);</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_store16be(g->node, &tmp);</span><br><span style="color: hsl(0, 100%, 40%);">-   buf = lv_put(buf, 2, tmp);</span><br><span style="color: hsl(0, 100%, 40%);">-      buf = lv_put(buf, 5, g->cr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Length: LV(Net) + LV(Node) + LV(CRef) - see 3GPP TS ยง3.2.2.115 */</span><br><span style="color: hsl(0, 100%, 40%);">-   return (g->net_len + 1) + (2 + 1) + (5 + 1);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int send_invite(struct sip_agent *agent, struct sip_call_leg *leg,</span><br><span>                        const char *calling_num, const char *called_num)</span><br><span> {</span><br><span>        struct call_leg *other = leg->base.call->initial;</span><br><span style="color: hsl(0, 100%, 40%);">- char gcr_hex[30];</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t data[15];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       gcr_hex[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-      data[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t len = _osmo_enc_gcr(data, &leg->base.call->gcr);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (len)</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_strlcpy(gcr_hex, osmo_hexdump_nospc(data, len*2+1), len*2+1);</span><br><span> </span><br><span>       char *from = talloc_asprintf(leg, "sip:%s@%s:%d",</span><br><span>                          calling_num,</span><br><span>@@ -675,7 +629,18 @@</span><br><span>                          agent->app->sip.remote_port);</span><br><span>  char *sdp = sdp_create_file(leg, other, sdp_sendrecv);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      char *x_gcr = talloc_asprintf(leg, "X-Global-Call-Ref: %s", gcr_hex);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Encode the Global Call Reference (if present) */</span><br><span style="color: hsl(120, 100%, 40%);">+   char *x_gcr = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (leg->base.call->gcr_present) {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct msgb *msg = msgb_alloc(16, "SIP GCR");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             if (msg != NULL && osmo_enc_gcr(msg, &leg->base.call->gcr) > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  x_gcr = talloc_asprintf(leg, "X-Global-Call-Ref: %s", msgb_hexdump(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+           else</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGP(DSIP, LOGL_ERROR, "Failed to encode GCR for leg(%p)\n", leg);</span><br><span style="color: hsl(120, 100%, 40%);">+          msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        leg->state = SIP_CC_INITIAL;</span><br><span>      leg->dir = SIP_DIR_MT;</span><br><span>@@ -684,7 +649,7 @@</span><br><span>                      SIPTAG_TO_STR(to),</span><br><span>                   NUTAG_MEDIA_ENABLE(0),</span><br><span>                       SIPTAG_CONTENT_TYPE_STR("application/sdp"),</span><br><span style="color: hsl(0, 100%, 40%);">-                   SIPTAG_HEADER_STR(x_gcr),</span><br><span style="color: hsl(120, 100%, 40%);">+                     TAG_IF(x_gcr, SIPTAG_HEADER_STR(x_gcr)),</span><br><span>                     SIPTAG_PAYLOAD_STR(sdp),</span><br><span>                     TAG_END());</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sip-connector/+/25979">change 25979</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-sip-connector/+/25979"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sip-connector </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I46fa46fc79494d337f2f4657215b91c39207eea4 </div>
<div style="display:none"> Gerrit-Change-Number: 25979 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: keith <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>