keith has submitted this change and it was merged. ( https://gerrit.osmocom.org/c/osmo-sip-connector/+/14995 )
Change subject: Prepare to support MO Call HOLD ...................................................................... Prepare to support MO Call HOLD Add function pointers to the call_leg struct for call hold and retrieve. Add function to send re-INVITE to SIP side when MNCC side puts call on HOLD/RETRIEVES. Add MNCC/SIP CC_HOLD to call states. Change-Id: I2595626dfa50eb2f8e29a02540b708c9c1dce88c --- M src/call.c M src/call.h M src/sip.c 3 files changed, 55 insertions(+), 0 deletions(-) Approvals: Jenkins Builder: Verified keith: Verified laforge: Looks good to me, but someone else must approve pespin: Looks good to me, approved diff --git a/src/call.c b/src/call.c index 9be6b4d..67207e5 100644 --- a/src/call.c +++ b/src/call.c @@ -40,6 +40,7 @@ { MNCC_CC_INITIAL, "INITIAL" }, { MNCC_CC_PROCEEDING, "PROCEEDING" }, { MNCC_CC_CONNECTED, "CONNECTED" }, + { MNCC_CC_HOLD, "ON HOLD" }, { 0, NULL }, }; @@ -53,6 +54,7 @@ { SIP_CC_INITIAL, "INITIAL" }, { SIP_CC_DLG_CNFD, "CONFIRMED" }, { SIP_CC_CONNECTED, "CONNECTED" }, + { SIP_CC_HOLD, "ON HOLD" }, { 0, NULL }, }; diff --git a/src/call.h b/src/call.h index 5076c01..bc772a4 100644 --- a/src/call.h +++ b/src/call.h @@ -75,6 +75,17 @@ */ void (*dtmf)(struct call_leg *, int keypad); + /** + * Call HOLD requested + */ + void (*hold_call)(struct call_leg *); + + /** + * Call HOLD ended + */ + void (*retrieve_call)(struct call_leg *); + + void (*update_rtp)(struct call_leg *); }; @@ -83,6 +94,7 @@ SIP_CC_INITIAL, SIP_CC_DLG_CNFD, SIP_CC_CONNECTED, + SIP_CC_HOLD, }; enum sip_dir { @@ -113,6 +125,7 @@ MNCC_CC_INITIAL, MNCC_CC_PROCEEDING, /* skip delivered state */ MNCC_CC_CONNECTED, + MNCC_CC_HOLD, }; enum mncc_dir { diff --git a/src/sip.c b/src/sip.c index be0d24a..8a96bed 100644 --- a/src/sip.c +++ b/src/sip.c @@ -40,6 +40,9 @@ static void sip_ring_call(struct call_leg *_leg); static void sip_connect_call(struct call_leg *_leg); static void sip_dtmf_call(struct call_leg *_leg, int keypad); +static void sip_hold_call(struct call_leg *_leg); +static void sip_retrieve_call(struct call_leg *_leg); + /* Find a SIP Call leg by given nua_handle */ static struct sip_call_leg *sip_find_leg(nua_handle_t *nh) @@ -160,6 +163,8 @@ leg->base.ring_call = sip_ring_call; leg->base.connect_call = sip_connect_call; leg->base.dtmf = sip_dtmf_call; + leg->base.hold_call = sip_hold_call; + leg->base.retrieve_call = sip_retrieve_call; leg->agent = agent; leg->nua_handle = nh; nua_handle_bind(nh, leg); @@ -441,6 +446,7 @@ } break; case SIP_CC_CONNECTED: + case SIP_CC_HOLD: LOGP(DSIP, LOGL_NOTICE, "Ending leg(%p) in con\n", leg); nua_bye(leg->nua_handle, TAG_END()); break; @@ -503,6 +509,40 @@ talloc_free(buf); } +static void sip_hold_call(struct call_leg *_leg) +{ + struct sip_call_leg *leg; + struct call_leg *other_leg; + OSMO_ASSERT(_leg->type == CALL_TYPE_SIP); + leg = (struct sip_call_leg *) _leg; + other_leg = call_leg_other(&leg->base); + char *sdp = sdp_create_file(leg, other_leg, sdp_sendonly); + nua_invite(leg->nua_handle, + NUTAG_MEDIA_ENABLE(0), + SIPTAG_CONTENT_TYPE_STR("application/sdp"), + SIPTAG_PAYLOAD_STR(sdp), + TAG_END()); + talloc_free(sdp); + leg->state = SIP_CC_HOLD; +} + +static void sip_retrieve_call(struct call_leg *_leg) +{ + struct sip_call_leg *leg; + struct call_leg *other_leg; + OSMO_ASSERT(_leg->type == CALL_TYPE_SIP); + leg = (struct sip_call_leg *) _leg; + other_leg = call_leg_other(&leg->base); + char *sdp = sdp_create_file(leg, other_leg, sdp_sendrecv); + nua_invite(leg->nua_handle, + NUTAG_MEDIA_ENABLE(0), + SIPTAG_CONTENT_TYPE_STR("application/sdp"), + SIPTAG_PAYLOAD_STR(sdp), + TAG_END()); + talloc_free(sdp); + leg->state = SIP_CC_CONNECTED; +} + static int send_invite(struct sip_agent *agent, struct sip_call_leg *leg, const char *calling_num, const char *called_num) { -- To view, visit https://gerrit.osmocom.org/c/osmo-sip-connector/+/14995 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-sip-connector Gerrit-Branch: master Gerrit-Change-Id: I2595626dfa50eb2f8e29a02540b708c9c1dce88c Gerrit-Change-Number: 14995 Gerrit-PatchSet: 7 Gerrit-Owner: keith <ke...@rhizomatica.org> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: keith <ke...@rhizomatica.org> Gerrit-Reviewer: laforge <lafo...@gnumonks.org> Gerrit-Reviewer: neels <nhofm...@sysmocom.de> Gerrit-Reviewer: pespin <pes...@sysmocom.de> Gerrit-MessageType: merged