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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Prepare to support MO Call HOLD<br><br>Add function pointers to the call_leg struct for call hold and retrieve.<br><br>Add function to send re-INVITE to SIP side when MNCC side puts call on HOLD/RETRIEVES.<br><br>Add MNCC/SIP CC_HOLD to call states.<br><br>Change-Id: I2595626dfa50eb2f8e29a02540b708c9c1dce88c<br>---<br>M src/call.c<br>M src/call.h<br>M src/sip.c<br>3 files changed, 55 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/call.c b/src/call.c</span><br><span>index 9be6b4d..67207e5 100644</span><br><span>--- a/src/call.c</span><br><span>+++ b/src/call.c</span><br><span>@@ -40,6 +40,7 @@</span><br><span>     { MNCC_CC_INITIAL,              "INITIAL"    },</span><br><span>    { MNCC_CC_PROCEEDING,           "PROCEEDING" },</span><br><span>    { MNCC_CC_CONNECTED,            "CONNECTED"  },</span><br><span style="color: hsl(120, 100%, 40%);">+     { MNCC_CC_HOLD,                 "ON HOLD"    },</span><br><span>    { 0, NULL },</span><br><span> };</span><br><span> </span><br><span>@@ -53,6 +54,7 @@</span><br><span>   { SIP_CC_INITIAL,               "INITIAL"   },</span><br><span>     { SIP_CC_DLG_CNFD,              "CONFIRMED" },</span><br><span>     { SIP_CC_CONNECTED,             "CONNECTED" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { SIP_CC_HOLD,                  "ON HOLD"   },</span><br><span>     { 0, NULL },</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/call.h b/src/call.h</span><br><span>index 5076c01..bc772a4 100644</span><br><span>--- a/src/call.h</span><br><span>+++ b/src/call.h</span><br><span>@@ -75,6 +75,17 @@</span><br><span>      */</span><br><span>  void (*dtmf)(struct call_leg *, int keypad);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      /**</span><br><span style="color: hsl(120, 100%, 40%);">+    * Call HOLD requested</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+   void (*hold_call)(struct call_leg *);</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%);">+    * Call HOLD ended</span><br><span style="color: hsl(120, 100%, 40%);">+     */</span><br><span style="color: hsl(120, 100%, 40%);">+   void (*retrieve_call)(struct call_leg *);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        void (*update_rtp)(struct call_leg *);</span><br><span> </span><br><span> };</span><br><span>@@ -83,6 +94,7 @@</span><br><span>         SIP_CC_INITIAL,</span><br><span>      SIP_CC_DLG_CNFD,</span><br><span>     SIP_CC_CONNECTED,</span><br><span style="color: hsl(120, 100%, 40%);">+     SIP_CC_HOLD,</span><br><span> };</span><br><span> </span><br><span> enum sip_dir {</span><br><span>@@ -113,6 +125,7 @@</span><br><span>       MNCC_CC_INITIAL,</span><br><span>     MNCC_CC_PROCEEDING, /* skip delivered state */</span><br><span>       MNCC_CC_CONNECTED,</span><br><span style="color: hsl(120, 100%, 40%);">+    MNCC_CC_HOLD,</span><br><span> };</span><br><span> </span><br><span> enum mncc_dir {</span><br><span>diff --git a/src/sip.c b/src/sip.c</span><br><span>index be0d24a..8a96bed 100644</span><br><span>--- a/src/sip.c</span><br><span>+++ b/src/sip.c</span><br><span>@@ -40,6 +40,9 @@</span><br><span> static void sip_ring_call(struct call_leg *_leg);</span><br><span> static void sip_connect_call(struct call_leg *_leg);</span><br><span> static void sip_dtmf_call(struct call_leg *_leg, int keypad);</span><br><span style="color: hsl(120, 100%, 40%);">+static void sip_hold_call(struct call_leg *_leg);</span><br><span style="color: hsl(120, 100%, 40%);">+static void sip_retrieve_call(struct call_leg *_leg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> /* Find a SIP Call leg by given nua_handle */</span><br><span> static struct sip_call_leg *sip_find_leg(nua_handle_t *nh)</span><br><span>@@ -160,6 +163,8 @@</span><br><span>   leg->base.ring_call = sip_ring_call;</span><br><span>      leg->base.connect_call = sip_connect_call;</span><br><span>        leg->base.dtmf = sip_dtmf_call;</span><br><span style="color: hsl(120, 100%, 40%);">+    leg->base.hold_call = sip_hold_call;</span><br><span style="color: hsl(120, 100%, 40%);">+       leg->base.retrieve_call = sip_retrieve_call;</span><br><span>      leg->agent = agent;</span><br><span>       leg->nua_handle = nh;</span><br><span>     nua_handle_bind(nh, leg);</span><br><span>@@ -441,6 +446,7 @@</span><br><span>              }</span><br><span>            break;</span><br><span>       case SIP_CC_CONNECTED:</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIP_CC_HOLD:</span><br><span>            LOGP(DSIP, LOGL_NOTICE, "Ending leg(%p) in con\n", leg);</span><br><span>           nua_bye(leg->nua_handle, TAG_END());</span><br><span>              break;</span><br><span>@@ -503,6 +509,40 @@</span><br><span>        talloc_free(buf);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void sip_hold_call(struct call_leg *_leg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct sip_call_leg *leg;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct call_leg *other_leg;</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(_leg->type == CALL_TYPE_SIP);</span><br><span style="color: hsl(120, 100%, 40%);">+  leg = (struct sip_call_leg *) _leg;</span><br><span style="color: hsl(120, 100%, 40%);">+   other_leg = call_leg_other(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+        char *sdp = sdp_create_file(leg, other_leg, sdp_sendonly);</span><br><span style="color: hsl(120, 100%, 40%);">+    nua_invite(leg->nua_handle,</span><br><span style="color: hsl(120, 100%, 40%);">+                    NUTAG_MEDIA_ENABLE(0),</span><br><span style="color: hsl(120, 100%, 40%);">+                SIPTAG_CONTENT_TYPE_STR("application/sdp"),</span><br><span style="color: hsl(120, 100%, 40%);">+                 SIPTAG_PAYLOAD_STR(sdp),</span><br><span style="color: hsl(120, 100%, 40%);">+              TAG_END());</span><br><span style="color: hsl(120, 100%, 40%);">+       talloc_free(sdp);</span><br><span style="color: hsl(120, 100%, 40%);">+     leg->state = SIP_CC_HOLD;</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%);">+static void sip_retrieve_call(struct call_leg *_leg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct sip_call_leg *leg;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct call_leg *other_leg;</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(_leg->type == CALL_TYPE_SIP);</span><br><span style="color: hsl(120, 100%, 40%);">+  leg = (struct sip_call_leg *) _leg;</span><br><span style="color: hsl(120, 100%, 40%);">+   other_leg = call_leg_other(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+        char *sdp = sdp_create_file(leg, other_leg, sdp_sendrecv);</span><br><span style="color: hsl(120, 100%, 40%);">+    nua_invite(leg->nua_handle,</span><br><span style="color: hsl(120, 100%, 40%);">+                    NUTAG_MEDIA_ENABLE(0),</span><br><span style="color: hsl(120, 100%, 40%);">+                SIPTAG_CONTENT_TYPE_STR("application/sdp"),</span><br><span style="color: hsl(120, 100%, 40%);">+                 SIPTAG_PAYLOAD_STR(sdp),</span><br><span style="color: hsl(120, 100%, 40%);">+              TAG_END());</span><br><span style="color: hsl(120, 100%, 40%);">+       talloc_free(sdp);</span><br><span style="color: hsl(120, 100%, 40%);">+     leg->state = SIP_CC_CONNECTED;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 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></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sip-connector/+/14995">change 14995</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/+/14995"/><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: I2595626dfa50eb2f8e29a02540b708c9c1dce88c </div>
<div style="display:none"> Gerrit-Change-Number: 14995 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </div>
<div style="display:none"> Gerrit-Owner: keith <keith@rhizomatica.org> </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@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>