<p>keith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sip-connector/+/25675">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Implement basic Support for Global Call Reference.<br><br>* Add GCR to mncc struct and therefore bump mncc version.<br>* Add the GCR as a SIP Header and retrieve and such header<br>  from incoming sip calls, passing the GCR on to MNCC<br><br>Depends: osmo-msc I705c860e51637b4537cad65a330ecbaaca96dd5b<br>Change-Id: Id40d7e0fed9356f801b3627c118150055e7232b1<br>---<br>M src/call.h<br>M src/mncc.c<br>M src/mncc_protocol.h<br>M src/sip.c<br>4 files changed, 31 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sip-connector refs/changes/75/25675/1</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 d1732f9..8360711 100644</span><br><span>--- a/src/call.h</span><br><span>+++ b/src/call.h</span><br><span>@@ -31,6 +31,7 @@</span><br><span> </span><br><span>     const char *source;</span><br><span>  const char *dest;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_gcr_parsed gcr;</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 9d75950..fc99400 100644</span><br><span>--- a/src/mncc.c</span><br><span>+++ b/src/mncc.c</span><br><span>@@ -543,6 +543,7 @@</span><br><span>   leg->conn = conn;</span><br><span>         leg->state = MNCC_CC_INITIAL;</span><br><span>     leg->dir = MNCC_DIR_MO;</span><br><span style="color: hsl(120, 100%, 40%);">+    leg->base.call->gcr = data->gcr;</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>@@ -898,6 +899,7 @@</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(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/mncc_protocol.h b/src/mncc_protocol.h</span><br><span>index 5d35191..11969ee 100644</span><br><span>--- a/src/mncc_protocol.h</span><br><span>+++ b/src/mncc_protocol.h</span><br><span>@@ -26,6 +26,7 @@</span><br><span> </span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/gsm/mncc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm29205.h></span><br><span> </span><br><span> #include <stdint.h></span><br><span> #include <netinet/in.h></span><br><span>@@ -159,6 +160,7 @@</span><br><span> </span><br><span>       unsigned char   lchan_type;</span><br><span>  unsigned char   lchan_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_gcr_parsed gcr;</span><br><span> </span><br><span>      /* A buffer to contain SDP ('\0' terminated) */</span><br><span>      char            sdp[1024];</span><br><span>@@ -170,7 +172,7 @@</span><br><span>     unsigned char   data[0];</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MNCC_SOCK_VERSION     7</span><br><span style="color: hsl(120, 100%, 40%);">+#define MNCC_SOCK_VERSION    8</span><br><span> struct gsm_mncc_hello {</span><br><span>         uint32_t        msg_type;</span><br><span>    uint32_t        version;</span><br><span>diff --git a/src/sip.c b/src/sip.c</span><br><span>index f0bc4c3..2455ddf 100644</span><br><span>--- a/src/sip.c</span><br><span>+++ b/src/sip.c</span><br><span>@@ -113,9 +113,22 @@</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(120, 100%, 40%);">+       char gcr_hex[sizeof(call->gcr)*2] = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t gcr_back[28] = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+</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 style="color: hsl(120, 100%, 40%);">+      sip_unknown_t *unknown_header = sip->sip_unknown;</span><br><span style="color: hsl(120, 100%, 40%);">+  while (unknown_header != NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!strcmp("X-Global-Call-Ref", unknown_header->un_name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     memcpy(gcr_hex, unknown_header->un_value, sizeof(gcr_hex));</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_hexparse(gcr_hex, gcr_back, sizeof(gcr_back));</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             unknown_header = unknown_header->un_next;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!sdp_screen_sdp(sip)) {</span><br><span>          LOGP(DSIP, LOGL_ERROR, "No supported codec.\n");</span><br><span>           nua_respond(nh, SIP_406_NOT_ACCEPTABLE, TAG_END());</span><br><span>@@ -131,6 +144,8 @@</span><br><span>            return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_dec_gcr(&call->gcr, gcr_back, sizeof(gcr_back));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       if (sip->sip_to)</span><br><span>          to = sip->sip_to->a_url->url_user;</span><br><span>  if (sip->sip_from)</span><br><span>@@ -594,6 +609,13 @@</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(120, 100%, 40%);">+       char gcr_hex[sizeof(leg->base.call->gcr)*2] = { NULL };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       struct msgb *msg = msgb_alloc(128, "gcr-header");</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t len = osmo_enc_gcr(msg, &leg->base.call->gcr);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_strlcpy(gcr_hex, osmo_hexdump_nospc(msg->data, len*2+2), len*2+2);</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>        char *from = talloc_asprintf(leg, "sip:%s@%s:%d",</span><br><span>                          calling_num,</span><br><span>@@ -605,6 +627,8 @@</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(120, 100%, 40%);">+    char *x_gcr = talloc_asprintf(leg, "X-Global-Call-Ref: %s", gcr_hex);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    leg->state = SIP_CC_INITIAL;</span><br><span>      leg->dir = SIP_DIR_MT;</span><br><span>    nua_invite(leg->nua_handle,</span><br><span>@@ -612,6 +636,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(120, 100%, 40%);">+                 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/+/25675">change 25675</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/+/25675"/><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: Id40d7e0fed9356f801b3627c118150055e7232b1 </div>
<div style="display:none"> Gerrit-Change-Number: 25675 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: keith <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>