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

</div><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>Depends: osmo-sip-connector Id40d7e0fed9356f801b3627c118150055e7232b1<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, 134 insertions(+), 12 deletions(-)<br><br></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 170d884..72e33a6 100644</span><br><span>--- a/include/osmocom/msc/gsm_data.h</span><br><span>+++ b/include/osmocom/msc/gsm_data.h</span><br><span>@@ -260,6 +260,10 @@</span><br><span> </span><br><span>        /* Whether to use call waiting on the network */</span><br><span>     bool call_waiting;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Whether to use lcls on the network */</span><br><span style="color: hsl(120, 100%, 40%);">+      bool lcls_permitted;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       char *sms_db_file_path;</span><br><span> };</span><br><span> </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 a8b4665..d6a2864 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>@@ -318,6 +318,16 @@</span><br><span>                msc_a_get(msc_a, MSC_A_USE_CC);</span><br><span>              trans->msc_a = msc_a;</span><br><span>             trans->paging_request = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+              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>          osmo_fsm_inst_dispatch(msc_a->c.fi, MSC_A_EV_TRANSACTION_ACCEPTED, trans);</span><br><span>                /* send SETUP request to called party */</span><br><span>             gsm48_cc_tx_setup(trans, &trans->cc.msg);</span><br><span>@@ -502,6 +512,14 @@</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%);">+        /* 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>diff --git a/src/libmsc/msc_a.c b/src/libmsc/msc_a.c</span><br><span>index fa8e842..9b6b602 100644</span><br><span>--- a/src/libmsc/msc_a.c</span><br><span>+++ b/src/libmsc/msc_a.c</span><br><span>@@ -569,6 +569,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>@@ -1506,6 +1507,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 2a4dbbb..e4e0937 100644</span><br><span>--- a/src/libmsc/msc_vty.c</span><br><span>+++ b/src/libmsc/msc_vty.c</span><br><span>@@ -499,6 +499,24 @@</span><br><span>   return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_ATTR(cfg_msc_lcls_disable, cfg_msc_lcls_disable_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+          "lcls-permitted",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Globally allow LCLS (Local Call Local Switch) for all calls on this MSC.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+       CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    gsmnet->lcls_permitted = true;</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_ATTR(cfg_msc_no_lcls_disable, cfg_msc_no_lcls_disable_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+        "no lcls-permitted",</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%);">+      CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    gsmnet->lcls_permitted = false;</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>@@ -764,6 +782,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%);">+     if (gsmnet->lcls_permitted)</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, " lcls-permitted%s", 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>@@ -2083,6 +2103,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 273f8dd..b50259d 100644</span><br><span>--- a/src/libmsc/ran_msg_a.c</span><br><span>+++ b/src/libmsc/ran_msg_a.c</span><br><span>@@ -1004,7 +1004,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..2108ab4 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_permitted) {</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 a0f584d..cd91d54 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_permitted = false;</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 268681a..315264f 100644</span><br><span>--- a/tests/test_nodes.vty</span><br><span>+++ b/tests/test_nodes.vty</span><br><span>@@ -48,6 +48,8 @@</span><br><span> ...</span><br><span>   sms-database PATH</span><br><span>   assign-tmsi</span><br><span style="color: hsl(120, 100%, 40%);">+  lcls-permitted</span><br><span style="color: hsl(120, 100%, 40%);">+  no lcls-permitted</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: 11 </div>
<div style="display:none"> Gerrit-Owner: keith <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-Assignee: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: keith <keith@rhizomatica.org> </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-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>