Change in ...osmo-mgw[master]: mgw: Support uppercase LCO options

pespin gerrit-no-reply at lists.osmocom.org
Tue Jun 25 22:00:42 UTC 2019


pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-mgw/+/14589


Change subject: mgw: Support uppercase LCO options
......................................................................

mgw: Support uppercase LCO options

MGCP RFC3435 (https://tools.ietf.org/html/rfc3435) states almost all
text has to be handled in a case-insensitive way, except SDP parts.

Related: OS#4001
Change-Id: Ic28a5eacc4c441d68e8a20d2743956ab2e01125d
---
M src/libosmo-mgcp/mgcp_protocol.c
M tests/mgcp/mgcp_test.c
M tests/mgcp/mgcp_test.ok
3 files changed, 76 insertions(+), 21 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/89/14589/1

diff --git a/src/libosmo-mgcp/mgcp_protocol.c b/src/libosmo-mgcp/mgcp_protocol.c
index 74926ad..841440b 100644
--- a/src/libosmo-mgcp/mgcp_protocol.c
+++ b/src/libosmo-mgcp/mgcp_protocol.c
@@ -590,7 +590,7 @@
 static int set_local_cx_options(void *ctx, struct mgcp_lco *lco,
 				 const char *options)
 {
-	char *p_opt, *a_opt;
+	char *lco_id;
 	char codec[17];
 
 	if (!options)
@@ -608,18 +608,32 @@
 	talloc_free(lco->string);
 	lco->string = talloc_strdup(ctx, options);
 
-	p_opt = strstr(lco->string, "p:");
-	if (p_opt && sscanf(p_opt, "p:%d-%d",
-			    &lco->pkt_period_min, &lco->pkt_period_max) == 1)
-		lco->pkt_period_max = lco->pkt_period_min;
+	lco_id = lco->string;
+	while ((lco_id = get_lco_identifier(lco_id))) {
+		switch (tolower(lco_id[0])) {
+		case 'p':
+			if (sscanf(lco_id + 1, ":%d-%d",
+				   &lco->pkt_period_min, &lco->pkt_period_max) == 1)
+				lco->pkt_period_max = lco->pkt_period_min;
+			break;
+		case 'a':
+			/* FIXME: LCO also supports the negotiation of more then one codec.
+			 * (e.g. a:PCMU;G726-32) But this implementation only supports a single
+			 * codec only. */
+			if (sscanf(lco_id + 1, ":%16[^,]", codec) == 1) {
+				talloc_free(lco->codec);
+				lco->codec = talloc_strdup(ctx, codec);
+			}
+			break;
+		default:
+			LOGP(DLMGCP, LOGL_NOTICE,
+			     "LCO: unhandled option: '%c'/%d\n", *lco_id, *lco_id);
+			break;
+		}
 
-	/* FIXME: LCO also supports the negotiation of more then one codec.
-	 * (e.g. a:PCMU;G726-32) But this implementation only supports a single
-	 * codec only. */
-	a_opt = strstr(lco->string, "a:");
-	if (a_opt && sscanf(a_opt, "a:%16[^,]", codec) == 1) {
-		talloc_free(lco->codec);
-		lco->codec = talloc_strdup(ctx, codec);
+		lco_id = strchr(lco_id, ',');
+		if (!lco_id)
+			break;
 	}
 
 	LOGP(DLMGCP, LOGL_DEBUG,
diff --git a/tests/mgcp/mgcp_test.c b/tests/mgcp/mgcp_test.c
index c4931b2..ab6d0ce 100644
--- a/tests/mgcp/mgcp_test.c
+++ b/tests/mgcp/mgcp_test.c
@@ -208,8 +208,24 @@
 	"a=rtpmap:99 AMR/8000\r\n" \
 	"a=ptime:40\r\n"
 
-#define MDCX4_SO \
+/* Test different upper/lower case in options */
+#define MDCX4_PT4 \
 	"MDCX 18983220 1 at mgw MGCP 1.0\r\n" \
+	"M: sendrecv\r" \
+	"C: 2\r\n" \
+	"I: %s\r\n" \
+	"L: A:AMR, NT:IN\r\n" \
+	"\n" \
+	"v=0\r\n" \
+	"o=- %s 23 IN IP4 0.0.0.0\r\n" \
+	"c=IN IP4 0.0.0.0\r\n" \
+	"t=0 0\r\n" \
+	"m=audio 4441 RTP/AVP 99\r\n" \
+	"a=rtpmap:99 AMR/8000\r\n" \
+	"a=ptime:40\r\n"
+
+#define MDCX4_SO \
+	"MDCX 18983221 1 at mgw MGCP 1.0\r\n" \
 	"M: sendonly\r" \
 	"C: 2\r\n" \
 	"I: %s\r\n" \
@@ -224,17 +240,17 @@
 	"a=ptime:40\r\n"
 
 #define MDCX4_RO \
-	"MDCX 18983221 1 at mgw MGCP 1.0\r\n" \
+	"MDCX 18983222 1 at mgw MGCP 1.0\r\n" \
 	"M: recvonly\r" \
 	"C: 2\r\n" \
 	"I: %s\r\n" \
 	"L: p:20, a:AMR, nt:IN\r\n"
 
 #define MDCX_TOO_LONG_CI \
-	"MDCX 18983222 1 at mgw MGCP 1.0\r\n" \
+	"MDCX 18983223 1 at mgw MGCP 1.0\r\n" \
 	"I: 123456789012345678901234567890123\n"
 
-#define MDCX_TOO_LONG_CI_RET "510 18983222 FAIL\r\n"
+#define MDCX_TOO_LONG_CI_RET "510 18983223 FAIL\r\n"
 
 #define SHORT2	"CRCX 1"
 #define SHORT2_RET "510 000000 FAIL\r\n"
@@ -526,8 +542,9 @@
 	{"MDCX4_PT1", MDCX4_PT1, MDCX4_RET("18983217"), 99},
 	{"MDCX4_PT2", MDCX4_PT2, MDCX4_RET("18983218"), 99},
 	{"MDCX4_PT3", MDCX4_PT3, MDCX4_RET("18983219"), 99},
-	{"MDCX4_SO", MDCX4_SO, MDCX4_RET("18983220"), 99},
-	{"MDCX4_RO", MDCX4_RO, MDCX4_RO_RET("18983221"), PTYPE_IGNORE},
+	{"MDCX4_PT4", MDCX4_PT4, MDCX4_RET("18983220"), 99},
+	{"MDCX4_SO", MDCX4_SO, MDCX4_RET("18983221"), 99},
+	{"MDCX4_RO", MDCX4_RO, MDCX4_RO_RET("18983222"), PTYPE_IGNORE},
 	{"DLCX", DLCX, DLCX_RET, PTYPE_IGNORE},
 	{"CRCX_ZYN", CRCX_ZYN, CRCX_ZYN_RET, 97},
 	{"EMPTY", EMPTY, EMPTY_RET},
diff --git a/tests/mgcp/mgcp_test.ok b/tests/mgcp/mgcp_test.ok
index d21eaa1..3929d79 100644
--- a/tests/mgcp/mgcp_test.ok
+++ b/tests/mgcp/mgcp_test.ok
@@ -193,10 +193,34 @@
 Dummy packets: 2
 
 ================================================
-Testing MDCX4_SO
+Testing MDCX4_PT4
 creating message from statically defined input:
 ---------8<---------
 MDCX 18983220 1 at mgw MGCP 1.0
+M: sendrecv
C: 2
+I: %s
+L: A:AMR, NT:IN
+
+v=0
+o=- %s 23 IN IP4 0.0.0.0
+c=IN IP4 0.0.0.0
+t=0 0
+m=audio 4441 RTP/AVP 99
+a=rtpmap:99 AMR/8000
+a=ptime:40
+
+---------8<---------
+checking response:
+using message with patched conn_id for comparison
+Response matches our expectations.
+(response contains a connection id)
+Dummy packets: 2
+
+================================================
+Testing MDCX4_SO
+creating message from statically defined input:
+---------8<---------
+MDCX 18983221 1 at mgw MGCP 1.0
 M: sendonly
C: 2
 I: %s
 L: p:20, a:AMR, nt:IN
@@ -219,7 +243,7 @@
 Testing MDCX4_RO
 creating message from statically defined input:
 ---------8<---------
-MDCX 18983221 1 at mgw MGCP 1.0
+MDCX 18983222 1 at mgw MGCP 1.0
 M: recvonly
C: 2
 I: %s
 L: p:20, a:AMR, nt:IN
@@ -446,7 +470,7 @@
 Testing MDCX_TOO_LONG_CI
 creating message from statically defined input:
 ---------8<---------
-MDCX 18983222 1 at mgw MGCP 1.0
+MDCX 18983223 1 at mgw MGCP 1.0
 I: 123456789012345678901234567890123
 
 ---------8<---------

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-mgw/+/14589
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-mgw
Gerrit-Branch: master
Gerrit-Change-Id: Ic28a5eacc4c441d68e8a20d2743956ab2e01125d
Gerrit-Change-Number: 14589
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190625/1706f8c4/attachment.html>


More information about the gerrit-log mailing list