<p>keith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-msc/+/24236">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add support for LCLS to the MSC<br><br>This commit is largely based on work by<br>Max <msuraev@sysmocom.de><br><br>Adds LCLS parameters for A-interface transactions<br>This commit also adds a vty option to facilitate globally<br>disabling LCLS for all calls on this MSC.<br><br>Add a global call reference (GCR) to MNCC and therefore<br>bump the MNCC version to version 8. (This commit has to be<br>merged at the same time as the corresponing commit in the<br>osmo-sip-connector for mncc-external use.)<br><br>Change-Id: I705c860e51637b4537cad65a330ecbaaca96dd5b<br>---<br>M include/osmocom/msc/debug.h<br>M include/osmocom/msc/gsm_data.h<br>M include/osmocom/msc/mncc.h<br>M include/osmocom/msc/ran_msg.h<br>M include/osmocom/msc/transaction.h<br>M src/libmsc/gsm_04_08_cc.c<br>M src/libmsc/msc_a.c<br>M src/libmsc/msc_vty.c<br>M src/libmsc/ran_msg_a.c<br>M src/libmsc/transaction.c<br>M src/osmo-msc/msc_main.c<br>M tests/mncc/mncc_test.ok<br>M tests/test_nodes.vty<br>13 files changed, 129 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/36/24236/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/debug.h b/include/osmocom/msc/debug.h</span><br><span>index 3347e20..0d08ceb 100644</span><br><span>--- a/include/osmocom/msc/debug.h</span><br><span>+++ b/include/osmocom/msc/debug.h</span><br><span>@@ -8,6 +8,7 @@</span><br><span>      DCC,</span><br><span>         DMM,</span><br><span>         DRR,</span><br><span style="color: hsl(120, 100%, 40%);">+  DLCLS,</span><br><span>       DMNCC,</span><br><span>       DPAG,</span><br><span>        DMSC,</span><br><span>diff --git a/include/osmocom/msc/gsm_data.h b/include/osmocom/msc/gsm_data.h</span><br><span>index 1870804..f796004 100644</span><br><span>--- a/include/osmocom/msc/gsm_data.h</span><br><span>+++ b/include/osmocom/msc/gsm_data.h</span><br><span>@@ -257,6 +257,7 @@</span><br><span>     /* Whether to use call waiting on the network */</span><br><span>     bool call_waiting;</span><br><span>   char *sms_db_file_path;</span><br><span style="color: hsl(120, 100%, 40%);">+       bool lcls_disable;</span><br><span> };</span><br><span> </span><br><span> struct osmo_esme;</span><br><span>diff --git a/include/osmocom/msc/mncc.h b/include/osmocom/msc/mncc.h</span><br><span>index 1c8aff0..5002227 100644</span><br><span>--- a/include/osmocom/msc/mncc.h</span><br><span>+++ b/include/osmocom/msc/mncc.h</span><br><span>@@ -26,6 +26,7 @@</span><br><span> </span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/gsm/mncc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm29205.h></span><br><span> </span><br><span> #include <stdint.h></span><br><span> #include <netinet/in.h></span><br><span>@@ -160,7 +161,7 @@</span><br><span> </span><br><span>      unsigned char   lchan_type;</span><br><span>  unsigned char   lchan_mode;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_gcr_parsed gcr;</span><br><span>  /* A buffer to contain SDP ('\0' terminated) */</span><br><span>      char            sdp[1024];</span><br><span> };</span><br><span>@@ -171,7 +172,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     7</span><br><span style="color: hsl(120, 100%, 40%);">+#define MNCC_SOCK_VERSION    8</span><br><span> struct gsm_mncc_hello {</span><br><span>         uint32_t        msg_type;</span><br><span>    uint32_t        version;</span><br><span>diff --git a/include/osmocom/msc/ran_msg.h b/include/osmocom/msc/ran_msg.h</span><br><span>index 1303ba3..fd2439f 100644</span><br><span>--- a/include/osmocom/msc/ran_msg.h</span><br><span>+++ b/include/osmocom/msc/ran_msg.h</span><br><span>@@ -88,6 +88,7 @@</span><br><span>        uint8_t osmux_cid;</span><br><span>   bool call_id_present;</span><br><span>        uint32_t call_id;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_lcls *lcls;</span><br><span> };</span><br><span> </span><br><span> struct ran_cipher_mode_command {</span><br><span>diff --git a/include/osmocom/msc/transaction.h b/include/osmocom/msc/transaction.h</span><br><span>index 928b137..14b89bb 100644</span><br><span>--- a/include/osmocom/msc/transaction.h</span><br><span>+++ b/include/osmocom/msc/transaction.h</span><br><span>@@ -100,6 +100,7 @@</span><br><span>                         struct osmo_timer_list timer_guard;</span><br><span>                  struct gsm_mncc msg;    /* stores setup/disconnect/release message */</span><br><span>                        bool mncc_initiated;    /* Whether an MNCC Release is necessary on failure */</span><br><span style="color: hsl(120, 100%, 40%);">+                 struct osmo_lcls *lcls;</span><br><span>              } cc;</span><br><span>                struct {</span><br><span>                     struct gsm411_smc_inst smc_inst;</span><br><span>@@ -145,6 +146,8 @@</span><br><span>                                        const struct vlr_subscr *vsub,</span><br><span>                                       uint8_t sm_rp_mr);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_lcls *trans_lcls_compose(const struct gsm_trans *trans, bool use_lac);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct gsm_trans *trans_alloc(struct gsm_network *net,</span><br><span>                            struct vlr_subscr *vsub,</span><br><span>                             enum trans_type type, uint8_t trans_id,</span><br><span>diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c</span><br><span>index 704e596..6eb5fee 100644</span><br><span>--- a/src/libmsc/gsm_04_08_cc.c</span><br><span>+++ b/src/libmsc/gsm_04_08_cc.c</span><br><span>@@ -500,6 +500,15 @@</span><br><span>        memset(&setup, 0, sizeof(struct gsm_mncc));</span><br><span>      setup.callref = trans->callref;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        /* New Global Call Reference */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!trans->cc.lcls) {</span><br><span style="color: hsl(120, 100%, 40%);">+             trans->cc.lcls = trans_lcls_compose(trans, 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%);">+   /* Pass the LCLS GCR on to the MT call leg via MNCC */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (trans->cc.lcls)</span><br><span style="color: hsl(120, 100%, 40%);">+                setup.gcr = trans->cc.lcls->gcr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     tlv_parse(&tp, &gsm48_att_tlvdef, gh->data, payload_len, 0, 0);</span><br><span>   /* emergency setup is identified by msg_type */</span><br><span>      if (msg_type == GSM48_MT_CC_EMERG_SETUP) {</span><br><span>@@ -1969,6 +1978,16 @@</span><br><span>          log_set_context(LOG_CTX_VLR_SUBSCR, trans->vsub);</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Get the GCR from the MO call leg (if any).</span><br><span style="color: hsl(120, 100%, 40%);">+ * First make room for the LCLS info, then insert the MO call leg's GCR. */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!trans->cc.lcls) {</span><br><span style="color: hsl(120, 100%, 40%);">+             trans->cc.lcls = trans_lcls_compose(trans, true);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (trans->cc.lcls) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      trans->cc.lcls->gcr = trans->cc.msg.gcr;</span><br><span style="color: hsl(120, 100%, 40%);">+                     trans->cc.lcls->gcr_available = 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>  LOG_TRANS_CAT(trans, DMNCC, LOGL_DEBUG, "rx %s\n", get_mncc_name(msg->msg_type));</span><br><span> </span><br><span>   gsm48_start_guard_timer(trans);</span><br><span>diff --git a/src/libmsc/msc_a.c b/src/libmsc/msc_a.c</span><br><span>index daa5bc7..9675734 100644</span><br><span>--- a/src/libmsc/msc_a.c</span><br><span>+++ b/src/libmsc/msc_a.c</span><br><span>@@ -549,6 +549,7 @@</span><br><span>                   .osmux_cid = msc_a->cc.call_leg->rtp[RTP_TO_RAN]->local_osmux_cid,</span><br><span>                  .call_id_present = true,</span><br><span>                     .call_id = cc_trans->callref,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .lcls = cc_trans->cc.lcls,</span><br><span>                },</span><br><span>   };</span><br><span>   if (msc_a_ran_down(msc_a, MSC_ROLE_I, &msg)) {</span><br><span>@@ -1484,6 +1485,13 @@</span><br><span>          rc = msc_a_up_ho(msc_a, d, MSC_HO_EV_RX_FAILURE);</span><br><span>            break;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    case RAN_MSG_LCLS_STATUS:</span><br><span style="color: hsl(120, 100%, 40%);">+             /* The BSS sends us LCLS_STATUS. We do nothing for now, but it is not an error. */</span><br><span style="color: hsl(120, 100%, 40%);">+            LOG_MSC_A(msc_a, LOGL_DEBUG, "LCLS_STATUS (%s) received from MSC-I\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        gsm0808_lcls_status_name(msg->lcls_status.status));</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     default:</span><br><span>             LOG_MSC_A(msc_a, LOGL_ERROR, "Message from MSC-I not implemented: %s\n", ran_msg_type_name(msg->msg_type));</span><br><span>             rc = -ENOTSUP;</span><br><span>diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c</span><br><span>index 79b4daa..ed119f1 100644</span><br><span>--- a/src/libmsc/msc_vty.c</span><br><span>+++ b/src/libmsc/msc_vty.c</span><br><span>@@ -498,6 +498,22 @@</span><br><span>   return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_msc_lcls_disable, cfg_msc_lcls_disable_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "lcls-disable",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Globally disable LCLS (Local Call Local Switch) for all calls on this MSC.\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      gsmnet->lcls_disable = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  return CMD_SUCCESS;</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%);">+DEFUN(cfg_msc_no_lcls_disable, cfg_msc_no_lcls_disable_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "no lcls-disable",</span><br><span style="color: hsl(120, 100%, 40%);">+      NO_STR "Globally disable LCLS (Local Call Local Switch) for all calls on this MSC.\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  gsmnet->lcls_disable = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_msc_cs7_instance_a,</span><br><span>       cfg_msc_cs7_instance_a_cmd,</span><br><span>       "cs7-instance-a <0-15>",</span><br><span>@@ -763,6 +779,8 @@</span><br><span>               gsmnet->ncss_guard_timeout, VTY_NEWLINE);</span><br><span>         vty_out(vty, " %sassign-tmsi%s",</span><br><span>           gsmnet->vlr->cfg.assign_tmsi? "" : "no ", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, " %slcls-disable%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           gsmnet->lcls_disable? "" : "no ", VTY_NEWLINE);</span><br><span> </span><br><span>   vty_out(vty, " cs7-instance-a %u%s", gsmnet->a.cs7_instance,</span><br><span>            VTY_NEWLINE);</span><br><span>@@ -2082,6 +2100,8 @@</span><br><span>        install_node(&msc_node, config_write_msc);</span><br><span>       install_element(MSC_NODE, &cfg_sms_database_cmd);</span><br><span>        install_element(MSC_NODE, &cfg_msc_assign_tmsi_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(MSC_NODE, &cfg_msc_lcls_disable_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(MSC_NODE, &cfg_msc_no_lcls_disable_cmd);</span><br><span>         install_element(MSC_NODE, &cfg_msc_mncc_internal_cmd);</span><br><span>   install_element(MSC_NODE, &cfg_msc_mncc_external_cmd);</span><br><span>   install_element(MSC_NODE, &cfg_msc_mncc_guard_timeout_cmd);</span><br><span>diff --git a/src/libmsc/ran_msg_a.c b/src/libmsc/ran_msg_a.c</span><br><span>index 4cce289..da650bb 100644</span><br><span>--- a/src/libmsc/ran_msg_a.c</span><br><span>+++ b/src/libmsc/ran_msg_a.c</span><br><span>@@ -997,7 +997,8 @@</span><br><span>   if(ac->call_id_present == true)</span><br><span>           call_id = &ac->call_id;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      msg = gsm0808_create_ass(ac->channel_type, NULL, use_rtp_addr, use_scl, call_id);</span><br><span style="color: hsl(120, 100%, 40%);">+  msg = gsm0808_create_ass2(ac->channel_type, NULL, use_rtp_addr, use_scl, call_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                            NULL, ac->lcls);</span><br><span>        if (ac->osmux_present)</span><br><span>            _gsm0808_assignment_extend_osmux(msg, ac->osmux_cid);</span><br><span>     return msg;</span><br><span>diff --git a/src/libmsc/transaction.c b/src/libmsc/transaction.c</span><br><span>index 94712cc..799c496 100644</span><br><span>--- a/src/libmsc/transaction.c</span><br><span>+++ b/src/libmsc/transaction.c</span><br><span>@@ -110,6 +110,66 @@</span><br><span>      return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_lcls *trans_lcls_compose(const struct gsm_trans *trans, bool use_lac)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!trans->net->a.sri->sccp) {</span><br><span style="color: hsl(120, 100%, 40%);">+              return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_ss7_instance *ss7 = osmo_sccp_get_ss7(trans->net->a.sri->sccp);</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_lcls *lcls;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t w = osmo_ss7_pc_width(&ss7->cfg.pc_fmt);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!trans) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DCC, LOGL_ERROR, "LCLS: unable to fill parameters for unallocated transaction\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</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%);">+   if (trans->net->lcls_disable) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DCC, LOGL_NOTICE, "LCLS disabled globally\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         return NULL;</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%);">+   if (!trans->msc_a) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DCC, LOGL_ERROR, "LCLS: unable to fill parameters for transaction without connection\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              return NULL;</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%);">+   if (trans->msc_a->c.ran->type != OSMO_RAT_GERAN_A) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DCC, LOGL_ERROR, "LCLS: only A interface is supported at the moment\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               return NULL;</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%);">+   lcls = talloc_zero(trans, struct osmo_lcls);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!lcls) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DCC, LOGL_ERROR, "LCLS: failed to allocate osmo_lcls\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              return NULL;</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%);">+   LOGP(DCC, LOGL_INFO, "LCLS: using %u bits (%u bytes) for node ID\n", w, w / 8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   lcls->gcr.net_len = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+     lcls->gcr.node = ss7->cfg.primary_pc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* net id from Q.1902.3 3-5 bytes, this function gives 3 bytes exactly */</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_plmn_to_bcd(lcls->gcr.net, &trans->net->plmn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_store32be(trans->callref, lcls->gcr.cr);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_store16be(use_lac ? trans->msc_a->via_cell.lai.lac : trans->msc_a->via_cell.cell_identity, lcls->gcr.cr + 3);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DCC, LOGL_INFO, "LCLS: allocated %s-based CR-ID %s\n", use_lac ? "LAC" : "CI",</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_hexdump(lcls->gcr.cr, 5));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     lcls->config = GSM0808_LCLS_CFG_BOTH_WAY;</span><br><span style="color: hsl(120, 100%, 40%);">+  lcls->control = GSM0808_LCLS_CSC_CONNECT;</span><br><span style="color: hsl(120, 100%, 40%);">+  lcls->corr_needed = true;</span><br><span style="color: hsl(120, 100%, 40%);">+  lcls->gcr_available = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DCC, LOGL_DEBUG, "Filled %s\n", osmo_lcls_dump(lcls));</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DCC, LOGL_DEBUG, "Filled %s\n", osmo_gcr_dump(lcls));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return lcls;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static const char *trans_vsub_use(enum trans_type type)</span><br><span> {</span><br><span>    return get_value_string_or_null(trans_type_names, type) ? : "trans-type-unknown";</span><br><span>diff --git a/src/osmo-msc/msc_main.c b/src/osmo-msc/msc_main.c</span><br><span>index fcca101..ac81532 100644</span><br><span>--- a/src/osmo-msc/msc_main.c</span><br><span>+++ b/src/osmo-msc/msc_main.c</span><br><span>@@ -258,6 +258,7 @@</span><br><span> </span><br><span>       mgcp_client_conf_init(&net->mgw.conf);</span><br><span>        net->call_waiting = true;</span><br><span style="color: hsl(120, 100%, 40%);">+  net->lcls_disable = 1;</span><br><span> </span><br><span>        net->mgw.tdefs = g_mgw_tdefs;</span><br><span>     osmo_tdefs_reset(net->mgw.tdefs);</span><br><span>diff --git a/tests/mncc/mncc_test.ok b/tests/mncc/mncc_test.ok</span><br><span>index 9334706..7cb1201 100644</span><br><span>--- a/tests/mncc/mncc_test.ok</span><br><span>+++ b/tests/mncc/mncc_test.ok</span><br><span>@@ -1,15 +1,15 @@</span><br><span> test_sdp_termination()</span><br><span> </span><br><span> struct gsm_mncc:</span><br><span style="color: hsl(0, 100%, 40%);">-empty SDP: len=1860 sdplen=1026 sdp="\0" rc=0</span><br><span style="color: hsl(0, 100%, 40%);">-empty SDP, shortest possible: len=835 sdplen=1 sdp="\0" rc=0</span><br><span style="color: hsl(0, 100%, 40%);">-empty SDP, zero len: len=834 sdplen=0 sdp=- rc=-22</span><br><span style="color: hsl(0, 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(0, 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(0, 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(0, 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(0, 100%, 40%);">-len way too short: len=10 sdplen=-824 sdp=- rc=-22</span><br><span style="color: hsl(0, 100%, 40%);">-len zero: len=0 sdplen=-834 sdp=- rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+empty SDP: len=1872 sdplen=1024 sdp="\0" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+empty SDP, shortest possible: len=849 sdplen=1 sdp="\0" rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+empty SDP, zero len: len=848 sdplen=0 sdp=- rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+terminated SDP str: len=1872 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=888 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=887 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=871 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=-838 sdp=- rc=-22</span><br><span style="color: hsl(120, 100%, 40%);">+len zero: len=0 sdplen=-848 sdp=- rc=-22</span><br><span> </span><br><span> struct gsm_mncc_rtp:</span><br><span> empty SDP: len=1168 sdplen=1024 sdp="\0" rc=0</span><br><span>diff --git a/tests/test_nodes.vty b/tests/test_nodes.vty</span><br><span>index f956a12..70f77f8 100644</span><br><span>--- a/tests/test_nodes.vty</span><br><span>+++ b/tests/test_nodes.vty</span><br><span>@@ -48,6 +48,7 @@</span><br><span> ...</span><br><span>   sms-database PATH</span><br><span>   assign-tmsi</span><br><span style="color: hsl(120, 100%, 40%);">+  lcls disable <0-1></span><br><span>   mncc internal</span><br><span>   mncc external MNCC_SOCKET_PATH</span><br><span>   mncc guard-timeout <0-255></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-msc/+/24236">change 24236</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/+/24236"/><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: I705c860e51637b4537cad65a330ecbaaca96dd5b </div>
<div style="display:none"> Gerrit-Change-Number: 24236 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: keith <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>