Change in ...osmo-sip-connector[master]: Prepare to support MO Call HOLD

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

keith gerrit-no-reply at lists.osmocom.org
Mon Aug 5 17:12:41 UTC 2019


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 <keith at rhizomatica.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: keith <keith at rhizomatica.org>
Gerrit-Reviewer: laforge <laforge at gnumonks.org>
Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190805/0c34ee1a/attachment.htm>


More information about the gerrit-log mailing list