<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/14589">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgw: Support uppercase LCO options<br><br>MGCP RFC3435 (https://tools.ietf.org/html/rfc3435) states almost all<br>text has to be handled in a case-insensitive way, except SDP parts.<br><br>Related: OS#4001<br>Change-Id: Ic28a5eacc4c441d68e8a20d2743956ab2e01125d<br>---<br>M src/libosmo-mgcp/mgcp_protocol.c<br>M tests/mgcp/mgcp_test.c<br>M tests/mgcp/mgcp_test.ok<br>3 files changed, 76 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/89/14589/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libosmo-mgcp/mgcp_protocol.c b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>index 74926ad..841440b 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>@@ -590,7 +590,7 @@</span><br><span> static int set_local_cx_options(void *ctx, struct mgcp_lco *lco,</span><br><span>                                  const char *options)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      char *p_opt, *a_opt;</span><br><span style="color: hsl(120, 100%, 40%);">+  char *lco_id;</span><br><span>        char codec[17];</span><br><span> </span><br><span>  if (!options)</span><br><span>@@ -608,18 +608,32 @@</span><br><span>        talloc_free(lco->string);</span><br><span>         lco->string = talloc_strdup(ctx, options);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       p_opt = strstr(lco->string, "p:");</span><br><span style="color: hsl(0, 100%, 40%);">- if (p_opt && sscanf(p_opt, "p:%d-%d",</span><br><span style="color: hsl(0, 100%, 40%);">-                     &lco->pkt_period_min, &lco->pkt_period_max) == 1)</span><br><span style="color: hsl(0, 100%, 40%);">-             lco->pkt_period_max = lco->pkt_period_min;</span><br><span style="color: hsl(120, 100%, 40%);">+      lco_id = lco->string;</span><br><span style="color: hsl(120, 100%, 40%);">+      while ((lco_id = get_lco_identifier(lco_id))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               switch (tolower(lco_id[0])) {</span><br><span style="color: hsl(120, 100%, 40%);">+         case 'p':</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (sscanf(lco_id + 1, ":%d-%d",</span><br><span style="color: hsl(120, 100%, 40%);">+                               &lco->pkt_period_min, &lco->pkt_period_max) == 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                            lco->pkt_period_max = lco->pkt_period_min;</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'a':</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* FIXME: LCO also supports the negotiation of more then one codec.</span><br><span style="color: hsl(120, 100%, 40%);">+                    * (e.g. a:PCMU;G726-32) But this implementation only supports a single</span><br><span style="color: hsl(120, 100%, 40%);">+                        * codec only. */</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (sscanf(lco_id + 1, ":%16[^,]", codec) == 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           talloc_free(lco->codec);</span><br><span style="color: hsl(120, 100%, 40%);">+                           lco->codec = talloc_strdup(ctx, codec);</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGP(DLMGCP, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                          "LCO: unhandled option: '%c'/%d\n", *lco_id, *lco_id);</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* FIXME: LCO also supports the negotiation of more then one codec.</span><br><span style="color: hsl(0, 100%, 40%);">-      * (e.g. a:PCMU;G726-32) But this implementation only supports a single</span><br><span style="color: hsl(0, 100%, 40%);">-  * codec only. */</span><br><span style="color: hsl(0, 100%, 40%);">-       a_opt = strstr(lco->string, "a:");</span><br><span style="color: hsl(0, 100%, 40%);">- if (a_opt && sscanf(a_opt, "a:%16[^,]", codec) == 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                talloc_free(lco->codec);</span><br><span style="color: hsl(0, 100%, 40%);">-             lco->codec = talloc_strdup(ctx, codec);</span><br><span style="color: hsl(120, 100%, 40%);">+            lco_id = strchr(lco_id, ',');</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!lco_id)</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span>       }</span><br><span> </span><br><span>        LOGP(DLMGCP, LOGL_DEBUG,</span><br><span>diff --git a/tests/mgcp/mgcp_test.c b/tests/mgcp/mgcp_test.c</span><br><span>index c4931b2..ab6d0ce 100644</span><br><span>--- a/tests/mgcp/mgcp_test.c</span><br><span>+++ b/tests/mgcp/mgcp_test.c</span><br><span>@@ -208,8 +208,24 @@</span><br><span>         "a=rtpmap:99 AMR/8000\r\n" \</span><br><span>       "a=ptime:40\r\n"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MDCX4_SO \</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test different upper/lower case in options */</span><br><span style="color: hsl(120, 100%, 40%);">+#define MDCX4_PT4 \</span><br><span>      "MDCX 18983220 1@mgw MGCP 1.0\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+        "M: sendrecv\r" \</span><br><span style="color: hsl(120, 100%, 40%);">+   "C: 2\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+        "I: %s\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+       "L: A:AMR, NT:IN\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+     "\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+      "v=0\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+ "o=- %s 23 IN IP4 0.0.0.0\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+    "c=IN IP4 0.0.0.0\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+    "t=0 0\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+       "m=audio 4441 RTP/AVP 99\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+     "a=rtpmap:99 AMR/8000\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+        "a=ptime:40\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MDCX4_SO \</span><br><span style="color: hsl(120, 100%, 40%);">+      "MDCX 18983221 1@mgw MGCP 1.0\r\n" \</span><br><span>       "M: sendonly\r" \</span><br><span>  "C: 2\r\n" \</span><br><span>       "I: %s\r\n" \</span><br><span>@@ -224,17 +240,17 @@</span><br><span>      "a=ptime:40\r\n"</span><br><span> </span><br><span> #define MDCX4_RO \</span><br><span style="color: hsl(0, 100%, 40%);">-    "MDCX 18983221 1@mgw MGCP 1.0\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+        "MDCX 18983222 1@mgw MGCP 1.0\r\n" \</span><br><span>       "M: recvonly\r" \</span><br><span>  "C: 2\r\n" \</span><br><span>       "I: %s\r\n" \</span><br><span>      "L: p:20, a:AMR, nt:IN\r\n"</span><br><span> </span><br><span> #define MDCX_TOO_LONG_CI \</span><br><span style="color: hsl(0, 100%, 40%);">- "MDCX 18983222 1@mgw MGCP 1.0\r\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+        "MDCX 18983223 1@mgw MGCP 1.0\r\n" \</span><br><span>       "I: 123456789012345678901234567890123\n"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MDCX_TOO_LONG_CI_RET "510 18983222 FAIL\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define MDCX_TOO_LONG_CI_RET "510 18983223 FAIL\r\n"</span><br><span> </span><br><span> #define SHORT2      "CRCX 1"</span><br><span> #define SHORT2_RET "510 000000 FAIL\r\n"</span><br><span>@@ -526,8 +542,9 @@</span><br><span>       {"MDCX4_PT1", MDCX4_PT1, MDCX4_RET("18983217"), 99},</span><br><span>     {"MDCX4_PT2", MDCX4_PT2, MDCX4_RET("18983218"), 99},</span><br><span>     {"MDCX4_PT3", MDCX4_PT3, MDCX4_RET("18983219"), 99},</span><br><span style="color: hsl(0, 100%, 40%);">-        {"MDCX4_SO", MDCX4_SO, MDCX4_RET("18983220"), 99},</span><br><span style="color: hsl(0, 100%, 40%);">-  {"MDCX4_RO", MDCX4_RO, MDCX4_RO_RET("18983221"), PTYPE_IGNORE},</span><br><span style="color: hsl(120, 100%, 40%);">+   {"MDCX4_PT4", MDCX4_PT4, MDCX4_RET("18983220"), 99},</span><br><span style="color: hsl(120, 100%, 40%);">+      {"MDCX4_SO", MDCX4_SO, MDCX4_RET("18983221"), 99},</span><br><span style="color: hsl(120, 100%, 40%);">+        {"MDCX4_RO", MDCX4_RO, MDCX4_RO_RET("18983222"), PTYPE_IGNORE},</span><br><span>  {"DLCX", DLCX, DLCX_RET, PTYPE_IGNORE},</span><br><span>    {"CRCX_ZYN", CRCX_ZYN, CRCX_ZYN_RET, 97},</span><br><span>  {"EMPTY", EMPTY, EMPTY_RET},</span><br><span>diff --git a/tests/mgcp/mgcp_test.ok b/tests/mgcp/mgcp_test.ok</span><br><span>index d21eaa1..3929d79 100644</span><br><span>--- a/tests/mgcp/mgcp_test.ok</span><br><span>+++ b/tests/mgcp/mgcp_test.ok</span><br><span>@@ -193,10 +193,34 @@</span><br><span> Dummy packets: 2</span><br><span> </span><br><span> ================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing MDCX4_SO</span><br><span style="color: hsl(120, 100%, 40%);">+Testing MDCX4_PT4</span><br><span> creating message from statically defined input:</span><br><span> ---------8<---------</span><br><span> MDCX 18983220 1@mgw MGCP 1.0 </span><br><span style="color: hsl(120, 100%, 40%);">+M: sendrecv C: 2 </span><br><span style="color: hsl(120, 100%, 40%);">+I: %s </span><br><span style="color: hsl(120, 100%, 40%);">+L: A:AMR, NT:IN </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+v=0 </span><br><span style="color: hsl(120, 100%, 40%);">+o=- %s 23 IN IP4 0.0.0.0 </span><br><span style="color: hsl(120, 100%, 40%);">+c=IN IP4 0.0.0.0 </span><br><span style="color: hsl(120, 100%, 40%);">+t=0 0 </span><br><span style="color: hsl(120, 100%, 40%);">+m=audio 4441 RTP/AVP 99 </span><br><span style="color: hsl(120, 100%, 40%);">+a=rtpmap:99 AMR/8000 </span><br><span style="color: hsl(120, 100%, 40%);">+a=ptime:40 </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+---------8<---------</span><br><span style="color: hsl(120, 100%, 40%);">+checking response:</span><br><span style="color: hsl(120, 100%, 40%);">+using message with patched conn_id for comparison</span><br><span style="color: hsl(120, 100%, 40%);">+Response matches our expectations.</span><br><span style="color: hsl(120, 100%, 40%);">+(response contains a connection id)</span><br><span style="color: hsl(120, 100%, 40%);">+Dummy packets: 2</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%);">+Testing MDCX4_SO</span><br><span style="color: hsl(120, 100%, 40%);">+creating message from statically defined input:</span><br><span style="color: hsl(120, 100%, 40%);">+---------8<---------</span><br><span style="color: hsl(120, 100%, 40%);">+MDCX 18983221 1@mgw MGCP 1.0 </span><br><span> M: sendonly C: 2 </span><br><span> I: %s </span><br><span> L: p:20, a:AMR, nt:IN </span><br><span>@@ -219,7 +243,7 @@</span><br><span> Testing MDCX4_RO</span><br><span> creating message from statically defined input:</span><br><span> ---------8<---------</span><br><span style="color: hsl(0, 100%, 40%);">-MDCX 18983221 1@mgw MGCP 1.0 </span><br><span style="color: hsl(120, 100%, 40%);">+MDCX 18983222 1@mgw MGCP 1.0 </span><br><span> M: recvonly C: 2 </span><br><span> I: %s </span><br><span> L: p:20, a:AMR, nt:IN </span><br><span>@@ -446,7 +470,7 @@</span><br><span> Testing MDCX_TOO_LONG_CI</span><br><span> creating message from statically defined input:</span><br><span> ---------8<---------</span><br><span style="color: hsl(0, 100%, 40%);">-MDCX 18983222 1@mgw MGCP 1.0 </span><br><span style="color: hsl(120, 100%, 40%);">+MDCX 18983223 1@mgw MGCP 1.0 </span><br><span> I: 123456789012345678901234567890123</span><br><span> </span><br><span> ---------8<---------</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/14589">change 14589</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-mgw/+/14589"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-mgw </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic28a5eacc4c441d68e8a20d2743956ab2e01125d </div>
<div style="display:none"> Gerrit-Change-Number: 14589 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>