Change in osmo-sip-connector[master]: Implement basic Support for Global Call Reference.

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 Oct 4 01:08:21 UTC 2021


keith has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-sip-connector/+/25675 )


Change subject: Implement basic Support for Global Call Reference.
......................................................................

Implement basic Support for Global Call Reference.

* Add GCR to mncc struct and therefore bump mncc version.
* Add the GCR as a SIP Header and retrieve and such header
  from incoming sip calls, passing the GCR on to MNCC

Depends: osmo-msc I705c860e51637b4537cad65a330ecbaaca96dd5b
Change-Id: Id40d7e0fed9356f801b3627c118150055e7232b1
---
M src/call.h
M src/mncc.c
M src/mncc_protocol.h
M src/sip.c
4 files changed, 31 insertions(+), 1 deletion(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-sip-connector refs/changes/75/25675/1

diff --git a/src/call.h b/src/call.h
index d1732f9..8360711 100644
--- a/src/call.h
+++ b/src/call.h
@@ -31,6 +31,7 @@
 
 	const char *source;
 	const char *dest;
+	struct osmo_gcr_parsed gcr;
 };
 
 enum {
diff --git a/src/mncc.c b/src/mncc.c
index 9d75950..fc99400 100644
--- a/src/mncc.c
+++ b/src/mncc.c
@@ -543,6 +543,7 @@
 	leg->conn = conn;
 	leg->state = MNCC_CC_INITIAL;
 	leg->dir = MNCC_DIR_MO;
+	leg->base.call->gcr = data->gcr;
 	memcpy(&leg->called, called, sizeof(leg->called));
 	memcpy(&leg->calling, &data->calling, sizeof(leg->calling));
 	memcpy(&leg->imsi, data->imsi, sizeof(leg->imsi));
@@ -898,6 +899,7 @@
 
 	mncc.fields |= MNCC_F_CALLING;
 	mncc.calling.plan = GSM48_NPI_ISDN_E164;
+	mncc.gcr = call->gcr;
 
 	if (call->source && call->source[0] == '+') {
 		mncc.calling.type = GSM48_TON_INTERNATIONAL;
diff --git a/src/mncc_protocol.h b/src/mncc_protocol.h
index 5d35191..11969ee 100644
--- a/src/mncc_protocol.h
+++ b/src/mncc_protocol.h
@@ -26,6 +26,7 @@
 
 #include <osmocom/core/linuxlist.h>
 #include <osmocom/gsm/mncc.h>
+#include <osmocom/gsm/gsm29205.h>
 
 #include <stdint.h>
 #include <netinet/in.h>
@@ -159,6 +160,7 @@
 
 	unsigned char	lchan_type;
 	unsigned char	lchan_mode;
+	struct osmo_gcr_parsed gcr;
 
 	/* A buffer to contain SDP ('\0' terminated) */
 	char		sdp[1024];
@@ -170,7 +172,7 @@
 	unsigned char	data[0];
 };
 
-#define MNCC_SOCK_VERSION	7
+#define MNCC_SOCK_VERSION	8
 struct gsm_mncc_hello {
 	uint32_t	msg_type;
 	uint32_t	version;
diff --git a/src/sip.c b/src/sip.c
index f0bc4c3..2455ddf 100644
--- a/src/sip.c
+++ b/src/sip.c
@@ -113,9 +113,22 @@
 	struct sip_call_leg *leg;
 	const char *from = NULL, *to = NULL;
 	char ip_addr[INET6_ADDRSTRLEN];
+	char gcr_hex[sizeof(call->gcr)*2] = {0};
+	uint8_t gcr_back[28] = {0};
+
 
 	LOGP(DSIP, LOGL_INFO, "Incoming call(%s) handle(%p)\n", sip->sip_call_id->i_id, nh);
 
+	sip_unknown_t *unknown_header = sip->sip_unknown;
+	while (unknown_header != NULL) {
+		if (!strcmp("X-Global-Call-Ref", unknown_header->un_name)) {
+			memcpy(gcr_hex, unknown_header->un_value, sizeof(gcr_hex));
+			osmo_hexparse(gcr_hex, gcr_back, sizeof(gcr_back));
+			break;
+		}
+		unknown_header = unknown_header->un_next;
+	}
+
 	if (!sdp_screen_sdp(sip)) {
 		LOGP(DSIP, LOGL_ERROR, "No supported codec.\n");
 		nua_respond(nh, SIP_406_NOT_ACCEPTABLE, TAG_END());
@@ -131,6 +144,8 @@
 		return;
 	}
 
+	osmo_dec_gcr(&call->gcr, gcr_back, sizeof(gcr_back));
+
 	if (sip->sip_to)
 		to = sip->sip_to->a_url->url_user;
 	if (sip->sip_from)
@@ -594,6 +609,13 @@
 			const char *calling_num, const char *called_num)
 {
 	struct call_leg *other = leg->base.call->initial;
+	char gcr_hex[sizeof(leg->base.call->gcr)*2] = { NULL };
+
+	struct msgb *msg = msgb_alloc(128, "gcr-header");
+	uint8_t len = osmo_enc_gcr(msg, &leg->base.call->gcr);
+	osmo_strlcpy(gcr_hex, osmo_hexdump_nospc(msg->data, len*2+2), len*2+2);
+	msgb_free(msg);
+
 
 	char *from = talloc_asprintf(leg, "sip:%s@%s:%d",
 				calling_num,
@@ -605,6 +627,8 @@
 				agent->app->sip.remote_port);
 	char *sdp = sdp_create_file(leg, other, sdp_sendrecv);
 
+	char *x_gcr = talloc_asprintf(leg, "X-Global-Call-Ref: %s", gcr_hex);
+
 	leg->state = SIP_CC_INITIAL;
 	leg->dir = SIP_DIR_MT;
 	nua_invite(leg->nua_handle,
@@ -612,6 +636,7 @@
 			SIPTAG_TO_STR(to),
 			NUTAG_MEDIA_ENABLE(0),
 			SIPTAG_CONTENT_TYPE_STR("application/sdp"),
+			SIPTAG_HEADER_STR(x_gcr),
 			SIPTAG_PAYLOAD_STR(sdp),
 			TAG_END());
 

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-sip-connector/+/25675
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: Id40d7e0fed9356f801b3627c118150055e7232b1
Gerrit-Change-Number: 25675
Gerrit-PatchSet: 1
Gerrit-Owner: keith <keith at rhizomatica.org>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20211004/0f00fe55/attachment.htm>


More information about the gerrit-log mailing list