Keith Whyte has submitted this change and it was merged. ( 
https://gerrit.osmocom.org/10728 )

Change subject: Implement Cause Mapping
......................................................................

Implement Cause Mapping

Adds cause field to the call_leg and sip_call_leg structs.

Translates the SIP status to MNCC cause and vice versa and
uses this information in the SIP/MNCC messages at call leg
release time.

Change-Id: Ic1b80dff7e583cd6fff2b662bc6cc4bad3f81cd4
---
M src/call.h
M src/mncc.c
M src/sip.c
3 files changed, 25 insertions(+), 2 deletions(-)

Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved



diff --git a/src/call.h b/src/call.h
index 5a11f6c..de92a24 100644
--- a/src/call.h
+++ b/src/call.h
@@ -43,6 +43,8 @@
        struct call *call;

        bool in_release;
+       /* Field to hold GSM 04.08 Cause Value. Section 10.5.4.11 Table 10.86 */
+       int cause;

        /**
         * RTP data
@@ -130,6 +132,8 @@
        int rsp_wanted;

        struct mncc_connection *conn;
+       /* Field to hold GSM 04.08 Cause Value. Section 10.5.4.11 Table 10.86 */
+       int cause;
 };

 extern struct llist_head g_call_list;
diff --git a/src/mncc.c b/src/mncc.c
index 2ecf8d0..f41bb51 100644
--- a/src/mncc.c
+++ b/src/mncc.c
@@ -105,12 +105,16 @@

 static void mncc_fill_header(struct gsm_mncc *mncc, uint32_t msg_type, 
uint32_t callref)
 {
+       struct mncc_call_leg *mncc_leg;
+
        mncc->msg_type = msg_type;
        mncc->callref = callref;
        if (MNCC_DISC_REQ == msg_type || MNCC_REL_REQ == msg_type) {
+               mncc_leg = mncc_find_leg(callref);
                mncc->fields |= MNCC_F_CAUSE;
                mncc->cause.coding = GSM48_CAUSE_CODING_GSM;
                mncc->cause.location = GSM48_CAUSE_LOC_PUN_S_LU;
+               mncc->cause.value = mncc_leg->base.cause;
        }
 }

@@ -511,6 +515,7 @@

        other_leg = call_leg_other(&leg->base);
        if (other_leg)
+               other_leg->cause = data->cause.value;
                other_leg->release_call(other_leg);
 }

@@ -529,6 +534,7 @@
                struct call_leg *other_leg;
                other_leg = call_leg_other(&leg->base);
                if (other_leg)
+                       other_leg->cause = data->cause.value;
                        other_leg->release_call(other_leg);
        }
        LOGP(DMNCC, LOGL_DEBUG, "leg(%u) was released.\n", data->callref);
@@ -573,8 +579,10 @@
        if (!leg)
                return;

+       leg->cause = data->cause.value;
        other_leg = call_leg_other(&leg->base);
        if (other_leg)
+               other_leg->cause = data->cause.value;
                other_leg->release_call(other_leg);
        LOGP(DMNCC, LOGL_DEBUG, "leg(%u) was rejected.\n", data->callref);
        mncc_leg_release(leg);
diff --git a/src/sip.c b/src/sip.c
index 07d2286..088dbc3 100644
--- a/src/sip.c
+++ b/src/sip.c
@@ -244,8 +244,10 @@
                        nua_handle_destroy(leg->nua_handle);
                        call_leg_release(&leg->base);

-                       if (other)
+                       if (other) {
+                               other->cause = status2cause(status);
                                other->release_call(other);
+                       }
                }
        } else if (event == nua_r_bye || event == nua_r_cancel) {
                /* our bye or hang up is answered */
@@ -309,6 +311,10 @@
 static void sip_release_call(struct call_leg *_leg)
 {
        struct sip_call_leg *leg;
+       char reason[64];
+       int sip_cause;
+       const char *sip_phrase;
+       const char *reason_text;

        OSMO_ASSERT(_leg->type == CALL_TYPE_SIP);
        leg = (struct sip_call_leg *) _leg;
@@ -319,6 +325,10 @@
         * and for a connected one bye. I don't see how sofia-sip is going
         * to help us here.
         */
+
+       cause2status(_leg->cause, &sip_cause, &sip_phrase, &reason_text);
+       snprintf(reason, sizeof reason, "Q.850;cause=%u;text=\"%s\"", 
_leg->cause, reason_text);
+
        switch (leg->state) {
        case SIP_CC_INITIAL:
                LOGP(DSIP, LOGL_NOTICE, "Canceling leg(%p) in int state\n", 
leg);
@@ -330,7 +340,8 @@
                if (leg->dir == SIP_DIR_MT)
                        nua_cancel(leg->nua_handle, TAG_END());
                else {
-                       nua_respond(leg->nua_handle, SIP_486_BUSY_HERE,
+                       nua_respond(leg->nua_handle, sip_cause, sip_phrase,
+                                       SIPTAG_REASON_STR(reason),
                                        TAG_END());
                        nua_handle_destroy(leg->nua_handle);
                        call_leg_release(&leg->base);

--
To view, visit https://gerrit.osmocom.org/10728
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-sip-connector
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Ic1b80dff7e583cd6fff2b662bc6cc4bad3f81cd4
Gerrit-Change-Number: 10728
Gerrit-PatchSet: 3
Gerrit-Owner: Keith Whyte <ke...@rhizomatica.org>
Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Holger Freyther <hol...@freyther.de>
Gerrit-Reviewer: Jenkins Builder (1000002)
Gerrit-Reviewer: Keith Whyte <ke...@rhizomatica.org>
Gerrit-Reviewer: Vadim Yanitskiy <axilira...@gmail.com>

Reply via email to