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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Implement Cause Mapping<br><br>Adds cause field to the call_leg and sip_call_leg structs.<br><br>Translates the SIP status to MNCC cause and vice versa and<br>uses this information in the SIP/MNCC messages at call leg<br>release time.<br><br>Change-Id: Ic1b80dff7e583cd6fff2b662bc6cc4bad3f81cd4<br>---<br>M src/call.h<br>M src/mncc.c<br>M src/sip.c<br>3 files changed, 25 insertions(+), 2 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 5a11f6c..de92a24 100644</span><br><span>--- a/src/call.h</span><br><span>+++ b/src/call.h</span><br><span>@@ -43,6 +43,8 @@</span><br><span>    struct call *call;</span><br><span> </span><br><span>       bool in_release;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Field to hold GSM 04.08 Cause Value. Section 10.5.4.11 Table 10.86 */</span><br><span style="color: hsl(120, 100%, 40%);">+      int cause;</span><br><span> </span><br><span>       /**</span><br><span>   * RTP data</span><br><span>@@ -130,6 +132,8 @@</span><br><span>    int rsp_wanted;</span><br><span> </span><br><span>  struct mncc_connection *conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Field to hold GSM 04.08 Cause Value. Section 10.5.4.11 Table 10.86 */</span><br><span style="color: hsl(120, 100%, 40%);">+      int cause;</span><br><span> };</span><br><span> </span><br><span> extern struct llist_head g_call_list;</span><br><span>diff --git a/src/mncc.c b/src/mncc.c</span><br><span>index 2ecf8d0..f41bb51 100644</span><br><span>--- a/src/mncc.c</span><br><span>+++ b/src/mncc.c</span><br><span>@@ -105,12 +105,16 @@</span><br><span> </span><br><span> static void mncc_fill_header(struct gsm_mncc *mncc, uint32_t msg_type, uint32_t callref)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+       struct mncc_call_leg *mncc_leg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    mncc->msg_type = msg_type;</span><br><span>        mncc->callref = callref;</span><br><span>  if (MNCC_DISC_REQ == msg_type || MNCC_REL_REQ == msg_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+          mncc_leg = mncc_find_leg(callref);</span><br><span>           mncc->fields |= MNCC_F_CAUSE;</span><br><span>             mncc->cause.coding = GSM48_CAUSE_CODING_GSM;</span><br><span>              mncc->cause.location = GSM48_CAUSE_LOC_PUN_S_LU;</span><br><span style="color: hsl(120, 100%, 40%);">+           mncc->cause.value = mncc_leg->base.cause;</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span>@@ -511,6 +515,7 @@</span><br><span> </span><br><span>         other_leg = call_leg_other(&leg->base);</span><br><span>       if (other_leg)</span><br><span style="color: hsl(120, 100%, 40%);">+                other_leg->cause = data->cause.value;</span><br><span>          other_leg->release_call(other_leg);</span><br><span> }</span><br><span> </span><br><span>@@ -529,6 +534,7 @@</span><br><span>                struct call_leg *other_leg;</span><br><span>          other_leg = call_leg_other(&leg->base);</span><br><span>               if (other_leg)</span><br><span style="color: hsl(120, 100%, 40%);">+                        other_leg->cause = data->cause.value;</span><br><span>                  other_leg->release_call(other_leg);</span><br><span>       }</span><br><span>    LOGP(DMNCC, LOGL_DEBUG, "leg(%u) was released.\n", data->callref);</span><br><span>@@ -573,8 +579,10 @@</span><br><span>       if (!leg)</span><br><span>            return;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   leg->cause = data->cause.value;</span><br><span>        other_leg = call_leg_other(&leg->base);</span><br><span>       if (other_leg)</span><br><span style="color: hsl(120, 100%, 40%);">+                other_leg->cause = data->cause.value;</span><br><span>          other_leg->release_call(other_leg);</span><br><span>       LOGP(DMNCC, LOGL_DEBUG, "leg(%u) was rejected.\n", data->callref);</span><br><span>      mncc_leg_release(leg);</span><br><span>diff --git a/src/sip.c b/src/sip.c</span><br><span>index 07d2286..088dbc3 100644</span><br><span>--- a/src/sip.c</span><br><span>+++ b/src/sip.c</span><br><span>@@ -244,8 +244,10 @@</span><br><span>                       nua_handle_destroy(leg->nua_handle);</span><br><span>                      call_leg_release(&leg->base);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                        if (other)</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (other) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          other->cause = status2cause(status);</span><br><span>                              other->release_call(other);</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span>            }</span><br><span>    } else if (event == nua_r_bye || event == nua_r_cancel) {</span><br><span>            /* our bye or hang up is answered */</span><br><span>@@ -309,6 +311,10 @@</span><br><span> static void sip_release_call(struct call_leg *_leg)</span><br><span> {</span><br><span>      struct sip_call_leg *leg;</span><br><span style="color: hsl(120, 100%, 40%);">+     char reason[64];</span><br><span style="color: hsl(120, 100%, 40%);">+      int sip_cause;</span><br><span style="color: hsl(120, 100%, 40%);">+        const char *sip_phrase;</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *reason_text;</span><br><span> </span><br><span>         OSMO_ASSERT(_leg->type == CALL_TYPE_SIP);</span><br><span>         leg = (struct sip_call_leg *) _leg;</span><br><span>@@ -319,6 +325,10 @@</span><br><span>    * and for a connected one bye. I don't see how sofia-sip is going</span><br><span>        * to help us here.</span><br><span>   */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ cause2status(_leg->cause, &sip_cause, &sip_phrase, &reason_text);</span><br><span style="color: hsl(120, 100%, 40%);">+      snprintf(reason, sizeof reason, "Q.850;cause=%u;text=\"%s\"", _leg->cause, reason_text);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    switch (leg->state) {</span><br><span>     case SIP_CC_INITIAL:</span><br><span>                 LOGP(DSIP, LOGL_NOTICE, "Canceling leg(%p) in int state\n", leg);</span><br><span>@@ -330,7 +340,8 @@</span><br><span>            if (leg->dir == SIP_DIR_MT)</span><br><span>                       nua_cancel(leg->nua_handle, TAG_END());</span><br><span>           else {</span><br><span style="color: hsl(0, 100%, 40%);">-                  nua_respond(leg->nua_handle, SIP_486_BUSY_HERE,</span><br><span style="color: hsl(120, 100%, 40%);">+                    nua_respond(leg->nua_handle, sip_cause, sip_phrase,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        SIPTAG_REASON_STR(reason),</span><br><span>                                   TAG_END());</span><br><span>                  nua_handle_destroy(leg->nua_handle);</span><br><span>                      call_leg_release(&leg->base);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10728">change 10728</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/10728"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ic1b80dff7e583cd6fff2b662bc6cc4bad3f81cd4 </div>
<div style="display:none"> Gerrit-Change-Number: 10728 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: Keith Whyte <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Holger Freyther <holger@freyther.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Keith Whyte <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>