<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>