<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-msc/+/15948">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
  laforge: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">MNCC v6: add optional SDP to the socket protocol<br><br>Add a char buffer of 1024 characters length as space for SDP to pass to /<br>receive from MNCC.<br><br>Actually support receiving MNCC without such an SDP tail. The main reason for<br>this is to avoid the need to adjust the ttcn3 implementation of MNCC: it would<br>stop working for older osmo-msc.<br><br>Older or non-SIP MNCC peers could operate the previous MNCC protocol unchanged<br>(save the protocol number bump) without having to implement SDP.<br><br>The SDP part in the MNCC protocol will be used in upcoming patch<br>I8c3b2de53ffae4ec3a66b9dabf308c290a2c999f.<br><br>This patch must be merged at the same time as osmo-sip-connector patch<br>Iaca9ed6611fc5ca8ca749bbbefc31f54bea5e925, so that both sides have a matching<br>MNCC protocol version number.<br><br>Change-Id: Ie16f0804c4d99760cd4a0c544d0889b6313eebb7<br>---<br>M configure.ac<br>M include/osmocom/msc/mncc.h<br>M src/libmsc/mncc.c<br>M tests/Makefile.am<br>A tests/mncc/Makefile.am<br>A tests/mncc/mncc_test.c<br>A tests/mncc/mncc_test.err<br>A tests/mncc/mncc_test.ok<br>M tests/testsuite.at<br>9 files changed, 189 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index ee80900..b5cd594 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -255,6 +255,7 @@</span><br><span>     tests/sms_queue/Makefile</span><br><span>     tests/msc_vlr/Makefile</span><br><span>     tests/sdp_msg/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    tests/mncc/Makefile</span><br><span>     doc/Makefile</span><br><span>     doc/examples/Makefile</span><br><span>     doc/manuals/Makefile</span><br><span>diff --git a/include/osmocom/msc/mncc.h b/include/osmocom/msc/mncc.h</span><br><span>index 4414a8d..cf7d7ce 100644</span><br><span>--- a/include/osmocom/msc/mncc.h</span><br><span>+++ b/include/osmocom/msc/mncc.h</span><br><span>@@ -159,6 +159,9 @@</span><br><span> </span><br><span>      unsigned char   lchan_type;</span><br><span>  unsigned char   lchan_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* A buffer to contain SDP ('\0' terminated) */</span><br><span style="color: hsl(120, 100%, 40%);">+       char            sdp[1024];</span><br><span> };</span><br><span> </span><br><span> struct gsm_data_frame {</span><br><span>@@ -167,7 +170,7 @@</span><br><span>        unsigned char   data[0];</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MNCC_SOCK_VERSION     5</span><br><span style="color: hsl(120, 100%, 40%);">+#define MNCC_SOCK_VERSION    6</span><br><span> struct gsm_mncc_hello {</span><br><span>         uint32_t        msg_type;</span><br><span>    uint32_t        version;</span><br><span>@@ -190,6 +193,7 @@</span><br><span>       uint16_t        port;</span><br><span>        uint32_t        payload_type;</span><br><span>        uint32_t        payload_msg_type;</span><br><span style="color: hsl(120, 100%, 40%);">+     char            sdp[1024];</span><br><span> };</span><br><span> </span><br><span> struct gsm_mncc_bridge {</span><br><span>@@ -226,6 +230,7 @@</span><br><span>               || msg_type == GSM_BAD_FRAME)</span><br><span> </span><br><span> int mncc_prim_check(const struct gsm_mncc *mncc_prim, unsigned int len);</span><br><span style="color: hsl(120, 100%, 40%);">+int mncc_check_sdp_termination(const char *label, const struct gsm_mncc *mncc, unsigned int len, const char *sdp);</span><br><span> </span><br><span> int mncc_bearer_cap_to_channel_type(struct gsm0808_channel_type *ct, const struct gsm_mncc_bearer_cap *bc);</span><br><span> </span><br><span>diff --git a/src/libmsc/mncc.c b/src/libmsc/mncc.c</span><br><span>index d0b2ff2..0a38997 100644</span><br><span>--- a/src/libmsc/mncc.c</span><br><span>+++ b/src/libmsc/mncc.c</span><br><span>@@ -235,6 +235,34 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Make sure that the SDP section has a terminating \0. The MNCC message may end after that \0, and if SDP is omitted it</span><br><span style="color: hsl(120, 100%, 40%);">+ * must contain at least one \0 byte. */</span><br><span style="color: hsl(120, 100%, 40%);">+int mncc_check_sdp_termination(const char *label, const struct gsm_mncc *mncc, unsigned int len, const char *sdp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  size_t sdp_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+    size_t sdp_data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+  size_t sdp_str_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(((char*)mncc) < sdp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        sdp_offset = sdp - (char*)mncc;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (len < sdp_offset)</span><br><span style="color: hsl(120, 100%, 40%);">+              goto too_short;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     sdp_data_len = len - sdp_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (sdp_data_len < 1)</span><br><span style="color: hsl(120, 100%, 40%);">+              goto too_short;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     sdp_str_len = strnlen(sdp, sdp_data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* There must be a \0, so sdp_str_len must be at most sdp_data_len - 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (sdp_str_len >= sdp_data_len)</span><br><span style="color: hsl(120, 100%, 40%);">+           goto too_short;</span><br><span style="color: hsl(120, 100%, 40%);">+       return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+too_short:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DMNCC, LOGL_ERROR, "Short %s\n", label);</span><br><span style="color: hsl(120, 100%, 40%);">+       return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int mncc_prim_check(const struct gsm_mncc *mncc_prim, unsigned int len)</span><br><span> {</span><br><span>         if (len < sizeof(mncc_prim->msg_type)) {</span><br><span>@@ -262,11 +290,7 @@</span><br><span>        case MNCC_RTP_FREE:</span><br><span>  case MNCC_RTP_CONNECT:</span><br><span>       case MNCC_RTP_CREATE:</span><br><span style="color: hsl(0, 100%, 40%);">-           if (len < sizeof(struct gsm_mncc_rtp)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     LOGP(DMNCC, LOGL_ERROR, "Short MNCC RTP\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                  return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(120, 100%, 40%);">+                return mncc_check_sdp_termination("MNCC RTP", mncc_prim, len, ((struct gsm_mncc_rtp*)mncc_prim)->sdp);</span><br><span>  case MNCC_LCHAN_MODIFY:</span><br><span>      case MNCC_FRAME_DROP:</span><br><span>        case MNCC_FRAME_RECV:</span><br><span>@@ -279,10 +303,8 @@</span><br><span>                 }</span><br><span>            break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (len < sizeof(struct gsm_mncc)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGP(DMNCC, LOGL_ERROR, "Short MNCC Signalling\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         if (mncc_check_sdp_termination("MNCC Signalling", mncc_prim, len, mncc_prim->sdp))</span><br><span>                      return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span>            return mncc_prim_check_sign(mncc_prim);</span><br><span>      }</span><br><span>    return 0;</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 864ac7c..5af80a4 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -3,6 +3,7 @@</span><br><span>         msc_vlr \</span><br><span>    db_sms \</span><br><span>     sdp_msg \</span><br><span style="color: hsl(120, 100%, 40%);">+     mncc \</span><br><span>       $(NULL)</span><br><span> </span><br><span> if BUILD_SMPP</span><br><span>diff --git a/tests/mncc/Makefile.am b/tests/mncc/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..ae859ab</span><br><span>--- /dev/null</span><br><span>+++ b/tests/mncc/Makefile.am</span><br><span>@@ -0,0 +1,32 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(all_includes) \</span><br><span style="color: hsl(120, 100%, 40%);">+     -I$(top_srcdir)/include \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+      -Wall \</span><br><span style="color: hsl(120, 100%, 40%);">+       -ggdb3 \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+LDADD = \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(top_builddir)/src/libmsc/libmsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+     mncc_test.ok \</span><br><span style="color: hsl(120, 100%, 40%);">+        mncc_test.err \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_PROGRAMS = \</span><br><span style="color: hsl(120, 100%, 40%);">+        mncc_test \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+mncc_test_SOURCES = \</span><br><span style="color: hsl(120, 100%, 40%);">+      mncc_test.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.PHONY: update_exp</span><br><span style="color: hsl(120, 100%, 40%);">+update_exp:</span><br><span style="color: hsl(120, 100%, 40%);">+    $(builddir)/mncc_test >$(srcdir)/mncc_test.ok 2>$(srcdir)/mncc_test.err</span><br><span>diff --git a/tests/mncc/mncc_test.c b/tests/mncc/mncc_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..580b479</span><br><span>--- /dev/null</span><br><span>+++ b/tests/mncc/mncc_test.c</span><br><span>@@ -0,0 +1,79 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/msc/debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/msc/mncc.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define _test_sdp_termination(LABEL, MNCC, MNCC_MSG_LEN, RC) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+         int sdp_len = ((int)(MNCC_MSG_LEN)) - ((MNCC)->sdp - (char*)MNCC); \</span><br><span style="color: hsl(120, 100%, 40%);">+               size_t sdp_strlen = strnlen(MNCC->sdp, sizeof(MNCC->sdp)); \</span><br><span style="color: hsl(120, 100%, 40%);">+            int rc = mncc_check_sdp_termination("<" LABEL ">", (struct gsm_mncc*)MNCC, MNCC_MSG_LEN, MNCC->sdp); \</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("%s: len=%d sdplen=%d sdp=%s rc=%d\n", \</span><br><span style="color: hsl(120, 100%, 40%);">+                    LABEL, (int)(MNCC_MSG_LEN), sdp_len, \</span><br><span style="color: hsl(120, 100%, 40%);">+                sdp_len > 0? osmo_quote_str((MNCC)->sdp, OSMO_MIN(sdp_len, sdp_strlen+1)) : "-", rc); \</span><br><span style="color: hsl(120, 100%, 40%);">+                if (RC != rc) \</span><br><span style="color: hsl(120, 100%, 40%);">+                       printf("ERROR!\n"); \</span><br><span style="color: hsl(120, 100%, 40%);">+       } while (0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define test_sdp_termination_cases(MNCC) \</span><br><span style="color: hsl(120, 100%, 40%);">+     _test_sdp_termination("empty SDP", MNCC, sizeof(*MNCC), 0); \</span><br><span style="color: hsl(120, 100%, 40%);">+       _test_sdp_termination("empty SDP, shortest possible", MNCC, MNCC->sdp - ((char*)MNCC) + 1, 0); \</span><br><span style="color: hsl(120, 100%, 40%);">+ _test_sdp_termination("empty SDP, zero len", MNCC, MNCC->sdp - ((char*)MNCC), -EINVAL); \</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_STRLCPY_ARRAY(MNCC->sdp, "Privacy is a desirable marketing option"); \</span><br><span style="color: hsl(120, 100%, 40%);">+      _test_sdp_termination("terminated SDP str", MNCC, sizeof(*MNCC), 0); \</span><br><span style="color: hsl(120, 100%, 40%);">+      _test_sdp_termination("terminated SDP str, shortest possible", MNCC, \</span><br><span style="color: hsl(120, 100%, 40%);">+                            MNCC->sdp - ((char*)MNCC) + strlen(MNCC->sdp) + 1, 0); \</span><br><span style="color: hsl(120, 100%, 40%);">+  _test_sdp_termination("terminated SDP str, but len excludes nul", MNCC, \</span><br><span style="color: hsl(120, 100%, 40%);">+                         MNCC->sdp - ((char*)MNCC) + strlen(MNCC->sdp), -EINVAL); \</span><br><span style="color: hsl(120, 100%, 40%);">+        _test_sdp_termination("terminated SDP str, but len too short", MNCC, \</span><br><span style="color: hsl(120, 100%, 40%);">+                            MNCC->sdp - ((char*)MNCC) + 23, -EINVAL); \</span><br><span style="color: hsl(120, 100%, 40%);">+  _test_sdp_termination("len way too short", MNCC, 10, -EINVAL); \</span><br><span style="color: hsl(120, 100%, 40%);">+    _test_sdp_termination("len zero", MNCC, 0, -EINVAL);</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%);">+void test_sdp_termination(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_mncc _mncc = {};</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_mncc_rtp _mncc_rtp = {};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_mncc *mncc = &_mncc;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_mncc_rtp *mncc_rtp = &_mncc_rtp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("%s()\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\nstruct gsm_mncc:\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     test_sdp_termination_cases(mncc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   _mncc = (struct gsm_mncc){};</span><br><span style="color: hsl(120, 100%, 40%);">+  _mncc_rtp = (struct gsm_mncc_rtp){};</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("\nstruct gsm_mncc_rtp:\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ test_sdp_termination_cases(mncc_rtp);</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%);">+static const struct log_info_cat default_categories[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [DMNCC] = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .name = "DMNCC",</span><br><span style="color: hsl(120, 100%, 40%);">+            .description = "MNCC API for Call Control application",</span><br><span style="color: hsl(120, 100%, 40%);">+             .color = "\033[1;39m",</span><br><span style="color: hsl(120, 100%, 40%);">+              .enabled = 1, .loglevel = LOGL_NOTICE,</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%);">+const struct log_info log_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+  .cat = default_categories,</span><br><span style="color: hsl(120, 100%, 40%);">+    .num_cat = ARRAY_SIZE(default_categories),</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%);">+int main(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   void *ctx = talloc_named_const(NULL, 0, "smpp_test");</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_init_logging2(ctx, &log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+       log_set_use_color(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     log_set_print_filename(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_print_category(osmo_stderr_target, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_print_category_hex(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  test_sdp_termination();</span><br><span style="color: hsl(120, 100%, 40%);">+       return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/mncc/mncc_test.err b/tests/mncc/mncc_test.err</span><br><span>new file mode 100644</span><br><span>index 0000000..5ee7e2c</span><br><span>--- /dev/null</span><br><span>+++ b/tests/mncc/mncc_test.err</span><br><span>@@ -0,0 +1,10 @@</span><br><span style="color: hsl(120, 100%, 40%);">+DMNCC Short <empty SDP, zero len></span><br><span style="color: hsl(120, 100%, 40%);">+DMNCC Short <terminated SDP str, but len excludes nul></span><br><span style="color: hsl(120, 100%, 40%);">+DMNCC Short <terminated SDP str, but len too short></span><br><span style="color: hsl(120, 100%, 40%);">+DMNCC Short <len way too short></span><br><span style="color: hsl(120, 100%, 40%);">+DMNCC Short <len zero></span><br><span style="color: hsl(120, 100%, 40%);">+DMNCC Short <empty SDP, zero len></span><br><span style="color: hsl(120, 100%, 40%);">+DMNCC Short <terminated SDP str, but len excludes nul></span><br><span style="color: hsl(120, 100%, 40%);">+DMNCC Short <terminated SDP str, but len too short></span><br><span style="color: hsl(120, 100%, 40%);">+DMNCC Short <len way too short></span><br><span style="color: hsl(120, 100%, 40%);">+DMNCC Short <len zero></span><br><span>diff --git a/tests/mncc/mncc_test.ok b/tests/mncc/mncc_test.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..807904d</span><br><span>--- /dev/null</span><br><span>+++ b/tests/mncc/mncc_test.ok</span><br><span>@@ -0,0 +1,23 @@</span><br><span style="color: hsl(120, 100%, 40%);">+test_sdp_termination()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_mncc:</span><br><span style="color: hsl(120, 100%, 40%);">+empty SDP: len=1860 sdplen=1026 sdp="\0" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+empty SDP, shortest possible: len=835 sdplen=1 sdp="\0" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+empty SDP, zero len: len=834 sdplen=0 sdp=- rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+terminated SDP str: len=1860 sdplen=1026 sdp="Privacy is a desirable marketing option\0" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+terminated SDP str, shortest possible: len=874 sdplen=40 sdp="Privacy is a desirable marketing option\0" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+terminated SDP str, but len excludes nul: len=873 sdplen=39 sdp="Privacy is a desirable marketing option" rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+terminated SDP str, but len too short: len=857 sdplen=23 sdp="Privacy is a desirable " rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+len way too short: len=10 sdplen=-824 sdp=- rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+len zero: len=0 sdplen=-834 sdp=- rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_mncc_rtp:</span><br><span style="color: hsl(120, 100%, 40%);">+empty SDP: len=1048 sdplen=1024 sdp="\0" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+empty SDP, shortest possible: len=25 sdplen=1 sdp="\0" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+empty SDP, zero len: len=24 sdplen=0 sdp=- rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+terminated SDP str: len=1048 sdplen=1024 sdp="Privacy is a desirable marketing option\0" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+terminated SDP str, shortest possible: len=64 sdplen=40 sdp="Privacy is a desirable marketing option\0" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+terminated SDP str, but len excludes nul: len=63 sdplen=39 sdp="Privacy is a desirable marketing option" rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+terminated SDP str, but len too short: len=47 sdplen=23 sdp="Privacy is a desirable " rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+len way too short: len=10 sdplen=-14 sdp=- rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+len zero: len=0 sdplen=-24 sdp=- rc=-22</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index 946d0db..58855f8 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -114,3 +114,10 @@</span><br><span> cat $abs_srcdir/sdp_msg/sdp_msg_test.err > experr</span><br><span> AT_CHECK([$abs_top_builddir/tests/sdp_msg/sdp_msg_test], [], [expout], [experr])</span><br><span> AT_CLEANUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([mncc_test])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([mncc_test])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/mncc/mncc_test.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/mncc/mncc_test.err > experr</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_top_builddir/tests/mncc/mncc_test], [], [expout], [experr])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CLEANUP</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-msc/+/15948">change 15948</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-msc/+/15948"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie16f0804c4d99760cd4a0c544d0889b6313eebb7 </div>
<div style="display:none"> Gerrit-Change-Number: 15948 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </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@osmocom.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>