<p>neels <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/15137">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  neels: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ptmap: implicitly match  '/8000' and '/8000/1'<br><br>In codecs_same(), do not compare the complete audio_name. The parts of it are<br>already checked individually:<br>- subtype_name ("AMR"),<br>- rate ("8000"; defaults to 8000 if omitted) and<br>- channels ("1"; defaults to 1 if omitted)<br>So by also checking the complete audio_name, we brushed over the match of<br>implicit "/8000" and "/8000/1", which otherwise works out fine.<br><br>As a result, translating payload type numbers in RTP headers now also works if<br>one conn of an endpoint set an rtpmap with "AMR/8000" and the other conn set<br>"AMR/8000/1".<br><br>It seems to me that most PBX out there generate ptmaps omitting the "/1", so<br>fixing this should make us more interoperable with third party SDP.<br><br>See IETF RFC4566 section 6. SDP Attributes:<br>  For audio streams, <encoding parameters> indicates the number<br>  of audio channels.  This parameter is OPTIONAL and may be<br>  omitted if the number of channels is one, provided that no<br>  additional parameters are needed.<br><br>Also allowing to omit the "/8000" is a mere side effect of this patch.<br>Omitting the rate does not seem to be specified in an RFC, but is logical for<br>audio codecs defined to require exactly 8000 set as rate (most GSM codecs).<br><br>Add tests in mgcp_test.c.<br><br>Change-Id: Iab00bf9a55b1847f85999077114b37e70fb677c2<br>---<br>M src/libosmo-mgcp/mgcp_codec.c<br>M tests/mgcp/mgcp_test.c<br>M tests/mgcp/mgcp_test.ok<br>3 files changed, 108 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libosmo-mgcp/mgcp_codec.c b/src/libosmo-mgcp/mgcp_codec.c</span><br><span>index 5d7f840..7c8f6d5 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_codec.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_codec.c</span><br><span>@@ -379,8 +379,6 @@</span><br><span>              return false;</span><br><span>        if (codec_a->frame_duration_den != codec_b->frame_duration_den)</span><br><span>                return false;</span><br><span style="color: hsl(0, 100%, 40%);">-   if (strcmp(codec_a->audio_name, codec_b->audio_name))</span><br><span style="color: hsl(0, 100%, 40%);">-             return false;</span><br><span>        if (strcmp(codec_a->subtype_name, codec_b->subtype_name))</span><br><span>              return false;</span><br><span>        if (!strcmp(codec_a->subtype_name, "AMR")) {</span><br><span>diff --git a/tests/mgcp/mgcp_test.c b/tests/mgcp/mgcp_test.c</span><br><span>index 5ebe475..e5dec2a 100644</span><br><span>--- a/tests/mgcp/mgcp_test.c</span><br><span>+++ b/tests/mgcp/mgcp_test.c</span><br><span>@@ -1900,6 +1900,70 @@</span><br><span>                      { .end = true },</span><br><span>             },</span><br><span>   },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .descr = "match FOO/8000/1 and FOO/8000 as identical, single channel is implicit",</span><br><span style="color: hsl(120, 100%, 40%);">+          .codecs = {</span><br><span style="color: hsl(120, 100%, 40%);">+                   {</span><br><span style="color: hsl(120, 100%, 40%);">+                             { 0, "PCMU/8000/1", NULL, },</span><br><span style="color: hsl(120, 100%, 40%);">+                                { 111, "GSM-HR-08/8000/1", NULL, },</span><br><span style="color: hsl(120, 100%, 40%);">+                         { 112, "AMR/8000/1", &amr_param_octet_aligned_true, },</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%);">+                             { 97, "GSM-HR-08/8000", NULL, },</span><br><span style="color: hsl(120, 100%, 40%);">+                            { 0, "PCMU/8000", NULL, },</span><br><span style="color: hsl(120, 100%, 40%);">+                          { 96, "AMR/8000", &amr_param_octet_aligned_true, },</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%);">+            .expect = {</span><br><span style="color: hsl(120, 100%, 40%);">+                   { .payload_type_map = {112, 96}, },</span><br><span style="color: hsl(120, 100%, 40%);">+                   { .payload_type_map = {0, 0}, },</span><br><span style="color: hsl(120, 100%, 40%);">+                      { .payload_type_map = {111, 97} },</span><br><span style="color: hsl(120, 100%, 40%);">+                    { .payload_type_map = {123, -EINVAL} },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { .end = true },</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%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .descr = "match FOO/8000/1 and FOO as identical, 8k and single channel are implicit",</span><br><span style="color: hsl(120, 100%, 40%);">+               .codecs = {</span><br><span style="color: hsl(120, 100%, 40%);">+                   {</span><br><span style="color: hsl(120, 100%, 40%);">+                             { 0, "PCMU/8000/1", NULL, },</span><br><span style="color: hsl(120, 100%, 40%);">+                                { 111, "GSM-HR-08/8000/1", NULL, },</span><br><span style="color: hsl(120, 100%, 40%);">+                         { 112, "AMR/8000/1", &amr_param_octet_aligned_true, },</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%);">+                             { 97, "GSM-HR-08", NULL, },</span><br><span style="color: hsl(120, 100%, 40%);">+                         { 0, "PCMU", NULL, },</span><br><span style="color: hsl(120, 100%, 40%);">+                               { 96, "AMR", &amr_param_octet_aligned_true, },</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%);">+            .expect = {</span><br><span style="color: hsl(120, 100%, 40%);">+                   { .payload_type_map = {112, 96}, },</span><br><span style="color: hsl(120, 100%, 40%);">+                   { .payload_type_map = {0, 0}, },</span><br><span style="color: hsl(120, 100%, 40%);">+                      { .payload_type_map = {111, 97} },</span><br><span style="color: hsl(120, 100%, 40%);">+                    { .payload_type_map = {123, -EINVAL} },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { .end = true },</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%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .descr = "test whether channel number matching is waterproof",</span><br><span style="color: hsl(120, 100%, 40%);">+              .codecs = {</span><br><span style="color: hsl(120, 100%, 40%);">+                   {</span><br><span style="color: hsl(120, 100%, 40%);">+                             { 111, "GSM-HR-08/8000", },</span><br><span style="color: hsl(120, 100%, 40%);">+                         { 112, "GSM-HR-08/8000/2", .expect_rc = -22},</span><br><span style="color: hsl(120, 100%, 40%);">+                               { 113, "GSM-HR-08/8000/3", .expect_rc = -22},</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%);">+                             { 122, "GSM-HR-08/8000/2", .expect_rc = -22},</span><br><span style="color: hsl(120, 100%, 40%);">+                               { 121, "GSM-HR-08/8000/1", },</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%);">+            .expect = {</span><br><span style="color: hsl(120, 100%, 40%);">+                   { .payload_type_map = {111, 121}, },</span><br><span style="color: hsl(120, 100%, 40%);">+                  { .payload_type_map = {112, -EINVAL} },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { .payload_type_map = {113, -EINVAL} },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { .end = true },</span><br><span style="color: hsl(120, 100%, 40%);">+              },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span> };</span><br><span> </span><br><span> static void test_mgcp_codec_pt_translate(void)</span><br><span>diff --git a/tests/mgcp/mgcp_test.ok b/tests/mgcp/mgcp_test.ok</span><br><span>index 14d5d73..9c48147 100644</span><br><span>--- a/tests/mgcp/mgcp_test.ok</span><br><span>+++ b/tests/mgcp/mgcp_test.ok</span><br><span>@@ -1315,6 +1315,50 @@</span><br><span>  - mgcp_codec_pt_translate(conn0, conn1, 111) -> -22</span><br><span>  - mgcp_codec_pt_translate(conn0, conn1, 112) -> 122</span><br><span>  - mgcp_codec_pt_translate(conn1, conn0, 122) -> 112</span><br><span style="color: hsl(120, 100%, 40%);">+#8: match FOO/8000/1 and FOO/8000 as identical, single channel is implicit</span><br><span style="color: hsl(120, 100%, 40%);">+ - add codecs on conn0:</span><br><span style="color: hsl(120, 100%, 40%);">+    0:   0 PCMU/8000/1  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+    1: 111 GSM-HR-08/8000/1  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+    2: 112 AMR/8000/1 octet-aligned=1  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+ - add codecs on conn1:</span><br><span style="color: hsl(120, 100%, 40%);">+    0:  97 GSM-HR-08/8000  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+    1:   0 PCMU/8000  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+    2:  96 AMR/8000 octet-aligned=1  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 112) -> 96</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn1, conn0, 96) -> 112</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 0) -> 0</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn1, conn0, 0) -> 0</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 111) -> 97</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn1, conn0, 97) -> 111</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 123) -> -22</span><br><span style="color: hsl(120, 100%, 40%);">+#9: match FOO/8000/1 and FOO as identical, 8k and single channel are implicit</span><br><span style="color: hsl(120, 100%, 40%);">+ - add codecs on conn0:</span><br><span style="color: hsl(120, 100%, 40%);">+    0:   0 PCMU/8000/1  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+    1: 111 GSM-HR-08/8000/1  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+    2: 112 AMR/8000/1 octet-aligned=1  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+ - add codecs on conn1:</span><br><span style="color: hsl(120, 100%, 40%);">+    0:  97 GSM-HR-08  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+    1:   0 PCMU  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+    2:  96 AMR octet-aligned=1  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 112) -> 96</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn1, conn0, 96) -> 112</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 0) -> 0</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn1, conn0, 0) -> 0</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 111) -> 97</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn1, conn0, 97) -> 111</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 123) -> -22</span><br><span style="color: hsl(120, 100%, 40%);">+#10: test whether channel number matching is waterproof</span><br><span style="color: hsl(120, 100%, 40%);">+ - add codecs on conn0:</span><br><span style="color: hsl(120, 100%, 40%);">+    0: 111 GSM-HR-08/8000  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+    1: 112 GSM-HR-08/8000/2  -> rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+    2: 113 GSM-HR-08/8000/3  -> rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+ - add codecs on conn1:</span><br><span style="color: hsl(120, 100%, 40%);">+    0: 122 GSM-HR-08/8000/2  -> rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+    1: 121 GSM-HR-08/8000/1  -> rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 111) -> 121</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn1, conn0, 121) -> 111</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 112) -> -22</span><br><span style="color: hsl(120, 100%, 40%);">+ - mgcp_codec_pt_translate(conn0, conn1, 113) -> -22</span><br><span> </span><br><span> Testing test_conn_id_matching</span><br><span> needle='23AB' found '000023AB'</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/15137">change 15137</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/+/15137"/><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: Iab00bf9a55b1847f85999077114b37e70fb677c2 </div>
<div style="display:none"> Gerrit-Change-Number: 15137 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>