<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>