<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24524">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">RSL chan_nr: replace OSMO_ASSERT with error handling<br><br>It's bad to abort the program for an incompatible chan_nr.  Instead of<br>OSMO_ASSERT(), make sure that error handling happens all they way to the<br>original callers of gsm_lchan2chan_nr etc.<br><br>This is also preparation to add further error causes: Osmocom specific<br>cbits needed for a non-Osmo BTS.<br><br>Related: SYS#5315 OS#4940<br>Change-Id: I71ed6437c403a3f9336e17a94b4948fca295d853<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/abis_rsl.c<br>M src/osmo-bsc/gsm_04_08_rr.c<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/lcs_loc_req.c<br>M src/osmo-bsc/osmo_bsc_lcls.c<br>M src/osmo-bsc/system_information.c<br>M tests/handover/handover_test.c<br>8 files changed, 184 insertions(+), 60 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/24/24524/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 800dcf5..ce56952 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1027,17 +1027,17 @@</span><br><span> gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class,</span><br><span>         const struct abis_om_obj_inst *obj_inst);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                      uint8_t ts_nr, uint8_t lchan_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                              enum gsm_phys_chan_config as_pchan);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                     uint8_t ts_nr, uint8_t lchan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_lchan2chan_nr(const struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                        enum gsm_phys_chan_config as_pchan);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd,</span><br><span style="color: hsl(0, 100%, 40%);">-                      const struct gsm_lchan *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                          uint8_t tsc);</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm48_lchan2chan_desc_as_configured(struct gsm48_chan_desc *cd, const struct gsm_lchan *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      uint8_t tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd,</span><br><span style="color: hsl(120, 100%, 40%);">+                   const struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                        uint8_t tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm48_lchan2chan_desc_as_configured(struct gsm48_chan_desc *cd, const struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   uint8_t tsc);</span><br><span> </span><br><span> uint8_t gsm_ts_tsc(const struct gsm_bts_trx_ts *ts);</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c</span><br><span>index c7e9821..fe7c480 100644</span><br><span>--- a/src/osmo-bsc/abis_rsl.c</span><br><span>+++ b/src/osmo-bsc/abis_rsl.c</span><br><span>@@ -279,8 +279,12 @@</span><br><span>                          const uint8_t *data, int len)</span><br><span> {</span><br><span>         struct abis_rsl_dchan_hdr *dh;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct msgb *msg = rsl_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     msg = rsl_msgb_alloc();</span><br><span> </span><br><span>  dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span>       init_dchan_hdr(dh, RSL_MT_SACCH_INFO_MODIFY);</span><br><span>@@ -299,7 +303,9 @@</span><br><span> {</span><br><span>     struct abis_rsl_dchan_hdr *dh;</span><br><span>       struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+   int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span> </span><br><span>  db = abs(db);</span><br><span>        if (db > 30)</span><br><span>@@ -329,7 +335,9 @@</span><br><span> {</span><br><span>   struct abis_rsl_dchan_hdr *dh;</span><br><span>       struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+   int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span> </span><br><span>  LOG_LCHAN(lchan, LOGL_DEBUG, "Tx MS POWER CONTROL (ms_power_lvl=%" PRIu8 ")\n",</span><br><span>            lchan->ms_power);</span><br><span>@@ -519,6 +527,9 @@</span><br><span> </span><br><span>     struct rsl_ie_chan_mode cm;</span><br><span>  struct gsm48_chan_desc cd;</span><br><span style="color: hsl(120, 100%, 40%);">+    int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span> </span><br><span>  DEBUGP(DRSL, "%s Tx RSL Channel Activate with act_type=%s\n",</span><br><span>             gsm_ts_and_pchan_name(lchan->ts),</span><br><span>@@ -536,13 +547,17 @@</span><br><span>  }</span><br><span> </span><br><span>        memset(&cd, 0, sizeof(cd));</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_lchan2chan_desc(&cd, lchan, lchan->activate.tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = gsm48_lchan2chan_desc(&cd, lchan, lchan->activate.tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOG_LCHAN(lchan, LOGL_ERROR, "Error encoding Channel Number\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span> </span><br><span>        msg = rsl_msgb_alloc();</span><br><span>      dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span>       init_dchan_hdr(dh, RSL_MT_CHAN_ACTIV);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      dh->chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+    dh->chan_nr = chan_nr;</span><br><span> </span><br><span>        msgb_tv_put(msg, RSL_IE_ACT_TYPE, act_type);</span><br><span>         msgb_tlv_put(msg, RSL_IE_CHAN_MODE, sizeof(cm),</span><br><span>@@ -648,10 +663,13 @@</span><br><span>      struct msgb *msg;</span><br><span>    int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span>  struct rsl_ie_chan_mode cm;</span><br><span>  struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    rc = channel_mode_from_lchan(&cm, lchan, &lchan->modify.ch_mode_rate, lchan->modify.info.vamos);</span><br><span>       if (rc < 0)</span><br><span>               return rc;</span><br><span>@@ -703,11 +721,14 @@</span><br><span> {</span><br><span>      struct abis_rsl_dchan_hdr *dh;</span><br><span>       struct gsm_lchan *lchan = msg->lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span>  uint8_t encr_info[MAX_A5_KEY_LEN+2];</span><br><span>         uint8_t l3_len = msg->len;</span><br><span>        int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* First push the L3 IE tag and length */</span><br><span>    msgb_tv16_push(msg, RSL_IE_L3_INFO, l3_len);</span><br><span> </span><br><span>@@ -736,9 +757,13 @@</span><br><span>      struct abis_rsl_dchan_hdr *dh;</span><br><span>       struct msgb *msg = rsl_msgb_alloc();</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span>       init_dchan_hdr(dh, RSL_MT_DEACTIVATE_SACCH);</span><br><span style="color: hsl(0, 100%, 40%);">-    dh->chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+    dh->chan_nr = chan_nr;</span><br><span> </span><br><span>        msg->lchan = lchan;</span><br><span>       msg->dst = rsl_chan_link(lchan);</span><br><span>@@ -754,10 +779,14 @@</span><br><span>  struct abis_rsl_dchan_hdr *dh;</span><br><span>       struct msgb *msg;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    msg = rsl_msgb_alloc();</span><br><span>      dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span>       init_dchan_hdr(dh, RSL_MT_RF_CHAN_REL);</span><br><span style="color: hsl(0, 100%, 40%);">- dh->chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+    dh->chan_nr = chan_nr;</span><br><span> </span><br><span>        msg->lchan = lchan;</span><br><span>       msg->dst = rsl_chan_link(lchan);</span><br><span>@@ -886,13 +915,19 @@</span><br><span> /* Send Siemens specific MS RF Power Capability Indication */</span><br><span> int rsl_siemens_mrpci(struct gsm_lchan *lchan, struct rsl_mrpci *mrpci)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct msgb *msg = rsl_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+  struct msgb *msg;</span><br><span>    struct abis_rsl_dchan_hdr *dh;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     msg = rsl_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span>       init_dchan_hdr(dh, RSL_MT_SIEMENS_MRPCI);</span><br><span>    dh->c.msg_discr = ABIS_RSL_MDISC_DED_CHAN;</span><br><span style="color: hsl(0, 100%, 40%);">-   dh->chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+    dh->chan_nr = chan_nr;</span><br><span>    msgb_tv_put(msg, RSL_IE_SIEMENS_MRPCI, *(uint8_t *)mrpci);</span><br><span> </span><br><span>       DEBUGP(DRSL, "%s TX Siemens MRPCI 0x%02x\n",</span><br><span>@@ -908,13 +943,19 @@</span><br><span> /* Chapter 8.3.1 */</span><br><span> int rsl_data_request(struct msgb *msg, uint8_t link_id)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ int chan_nr = gsm_lchan2chan_nr(msg->lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+               return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (msg->lchan == NULL) {</span><br><span>                 LOGP(DRSL, LOGL_ERROR, "cannot send DATA REQUEST to unknown lchan\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              msgb_free(msg);</span><br><span>              return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rsl_rll_push_l3(msg, RSL_MT_DATA_REQ, gsm_lchan2chan_nr(msg->lchan),</span><br><span style="color: hsl(0, 100%, 40%);">-                 link_id, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+  rsl_rll_push_l3(msg, RSL_MT_DATA_REQ, chan_nr, link_id, 1);</span><br><span> </span><br><span>      msg->dst = rsl_chan_link(msg->lchan);</span><br><span> </span><br><span>@@ -926,9 +967,11 @@</span><br><span> int rsl_establish_request(struct gsm_lchan *lchan, uint8_t link_id)</span><br><span> {</span><br><span>   struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     msg = rsl_rll_simple(RSL_MT_EST_REQ, gsm_lchan2chan_nr(lchan),</span><br><span style="color: hsl(0, 100%, 40%);">-                       link_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     msg = rsl_rll_simple(RSL_MT_EST_REQ, chan_nr, link_id, 0);</span><br><span>   msg->dst = rsl_chan_link(lchan);</span><br><span> </span><br><span>      DEBUGP(DRLL, "%s RSL RLL ESTABLISH REQ (link_id=0x%02x)\n",</span><br><span>@@ -947,9 +990,11 @@</span><br><span> {</span><br><span> </span><br><span>        struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     msg = rsl_rll_simple(RSL_MT_REL_REQ, gsm_lchan2chan_nr(lchan),</span><br><span style="color: hsl(0, 100%, 40%);">-                       link_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     msg = rsl_rll_simple(RSL_MT_REL_REQ, chan_nr, link_id, 0);</span><br><span>   /* 0 is normal release, 1 is local end */</span><br><span>    msgb_tv_put(msg, RSL_IE_RELEASE_MODE, release_mode);</span><br><span> </span><br><span>@@ -1836,7 +1881,11 @@</span><br><span>    ia->proto_discr = GSM48_PDISC_RR;</span><br><span>         ia->msg_type = GSM48_MT_RR_IMM_ASS;</span><br><span>       ia->page_mode = GSM48_PM_SAME;</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm48_lchan2chan_desc(&ia->chan_desc, lchan, lchan->tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = gsm48_lchan2chan_desc(&ia->chan_desc, lchan, lchan->tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOG_LCHAN(lchan, LOGL_ERROR, "Error encoding Channel Number\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span> </span><br><span>        /* use request reference extracted from CHAN_RQD */</span><br><span>  memcpy(&ia->req_ref, lchan->rqd_ref, sizeof(ia->req_ref));</span><br><span>@@ -2275,13 +2324,19 @@</span><br><span>  */</span><br><span> int rsl_tx_ipacc_crcx(const struct gsm_lchan *lchan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct msgb *msg = rsl_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+  struct msgb *msg;</span><br><span>    struct abis_rsl_dchan_hdr *dh;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     msg = rsl_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span>       init_dchan_hdr(dh, RSL_MT_IPAC_CRCX);</span><br><span>        dh->c.msg_discr = ABIS_RSL_MDISC_IPACCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-   dh->chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+    dh->chan_nr = chan_nr;</span><br><span> </span><br><span>        /* 0x1- == receive-only, 0x-1 == EFR codec */</span><br><span>        msgb_tv_put(msg, RSL_IE_IPAC_SPEECH_MODE, lchan->abis_ip.speech_mode);</span><br><span>@@ -2302,14 +2357,20 @@</span><br><span>  */</span><br><span> struct msgb *rsl_make_ipacc_mdcx(const struct gsm_lchan *lchan, uint32_t dest_ip, uint16_t dest_port)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct msgb *msg = rsl_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+  struct msgb *msg;</span><br><span>    struct abis_rsl_dchan_hdr *dh;</span><br><span>       uint32_t *att_ip;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</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%);">+        msg = rsl_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span>       init_dchan_hdr(dh, RSL_MT_IPAC_MDCX);</span><br><span>        dh->c.msg_discr = ABIS_RSL_MDISC_IPACCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-   dh->chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+    dh->chan_nr = chan_nr;</span><br><span> </span><br><span>        msgb_tv16_put(msg, RSL_IE_IPAC_CONN_ID, lchan->abis_ip.conn_id);</span><br><span>  msgb_v_put(msg, RSL_IE_IPAC_REMOTE_IP);</span><br><span>@@ -2334,6 +2395,9 @@</span><br><span> {</span><br><span>         struct msgb *msg = rsl_make_ipacc_mdcx(lchan, lchan->abis_ip.connect_ip, lchan->abis_ip.connect_port);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      if (!msg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    LOG_LCHAN(lchan, LOGL_DEBUG, "Sending IPACC MDCX to BTS:"</span><br><span>            " %s:%u rtp_payload=%u rtp_payload2=%u conn_id=%u speech_mode=0x%02x\n",</span><br><span>                   ip_to_a(lchan->abis_ip.connect_ip),</span><br><span>@@ -2525,13 +2589,19 @@</span><br><span> /*! Tx simplified channel (de-)activation message for non-standard ip.access dyn TS PDCH type. */</span><br><span> static int send_ipacc_style_pdch_act(struct gsm_bts_trx_ts *ts, bool activate)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct msgb *msg = rsl_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+  struct msgb *msg;</span><br><span>    struct abis_rsl_dchan_hdr *dh;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    int chan_nr = gsm_pchan2chan_nr(GSM_PCHAN_TCH_F, ts->nr, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     msg = rsl_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span>       init_dchan_hdr(dh, activate ? RSL_MT_IPAC_PDCH_ACT : RSL_MT_IPAC_PDCH_DEACT);</span><br><span>        dh->c.msg_discr = ABIS_RSL_MDISC_DED_CHAN;</span><br><span style="color: hsl(0, 100%, 40%);">-   dh->chan_nr = gsm_pchan2chan_nr(GSM_PCHAN_TCH_F, ts->nr, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    dh->chan_nr = chan_nr;</span><br><span> </span><br><span>        msg->dst = ts->trx->rsl_link_primary;</span><br><span>       return abis_rsl_sendmsg(msg);</span><br><span>diff --git a/src/osmo-bsc/gsm_04_08_rr.c b/src/osmo-bsc/gsm_04_08_rr.c</span><br><span>index 7cc5664..dc6434b 100644</span><br><span>--- a/src/osmo-bsc/gsm_04_08_rr.c</span><br><span>+++ b/src/osmo-bsc/gsm_04_08_rr.c</span><br><span>@@ -546,7 +546,10 @@</span><br><span> </span><br><span>    /* mandatory bits */</span><br><span>         gsm48_cell_desc(&ho->cell_desc, new_lchan->ts->trx->bts);</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm48_lchan2chan_desc(&ho->chan_desc, new_lchan, gsm_ts_tsc(new_lchan->ts));</span><br><span style="color: hsl(120, 100%, 40%);">+        if (gsm48_lchan2chan_desc(&ho->chan_desc, new_lchan, gsm_ts_tsc(new_lchan->ts))) {</span><br><span style="color: hsl(120, 100%, 40%);">+          msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+               return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span>    ho->ho_ref = ho_ref;</span><br><span>      ho->power_command = power_command;</span><br><span> </span><br><span>@@ -597,6 +600,7 @@</span><br><span> /* Chapter 9.1.2: Assignment Command */</span><br><span> int gsm48_send_rr_ass_cmd(struct gsm_lchan *current_lchan, struct gsm_lchan *new_lchan, uint8_t power_command)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span>      struct msgb *msg = gsm48_msgb_alloc_name("GSM 04.08 ASS CMD");</span><br><span>     struct gsm48_hdr *gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh));</span><br><span>      struct gsm48_ass_cmd *ass =</span><br><span>@@ -618,7 +622,11 @@</span><br><span>    * the chan_desc. But as long as multi-slot configurations</span><br><span>    * are not used we seem to be fine.</span><br><span>   */</span><br><span style="color: hsl(0, 100%, 40%);">-     gsm48_lchan2chan_desc(&ass->chan_desc, new_lchan, new_lchan->tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = gsm48_lchan2chan_desc(&ass->chan_desc, new_lchan, new_lchan->tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+               return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>    ass->power_command = power_command;</span><br><span> </span><br><span>   /* Cell Channel Description (freq. hopping), TV (see 3GPP TS 44.018, 10.5.2.1b) */</span><br><span>@@ -682,6 +690,7 @@</span><br><span> /* 9.1.5 Channel mode modify: Modify the mode on the MS side */</span><br><span> int gsm48_lchan_modify(struct gsm_lchan *lchan, uint8_t mode)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span>      struct msgb *msg = gsm48_msgb_alloc_name("GSM 04.08 CHN MOD");</span><br><span>     struct gsm48_hdr *gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh));</span><br><span>      struct gsm48_chan_mode_modify *cmm =</span><br><span>@@ -694,7 +703,11 @@</span><br><span>  gh->proto_discr = GSM48_PDISC_RR;</span><br><span>         gh->msg_type = GSM48_MT_RR_CHAN_MODE_MODIF;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      gsm48_lchan2chan_desc(&cmm->chan_desc, lchan, lchan->modify.tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = gsm48_lchan2chan_desc(&cmm->chan_desc, lchan, lchan->modify.tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+               return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>    cmm->mode = mode;</span><br><span> </span><br><span>     /* in case of multi rate we need to attach a config */</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index c43fbe9..ecbf7b9 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -495,23 +495,26 @@</span><br><span> }</span><br><span> </span><br><span> /* See Table 10.5.25 of GSM04.08 */</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                         uint8_t ts_nr, uint8_t lchan_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                  uint8_t ts_nr, uint8_t lchan_nr)</span><br><span> {</span><br><span>  uint8_t cbits, chan_nr;</span><br><span> </span><br><span>  switch (pchan) {</span><br><span>     case GSM_PCHAN_TCH_F:</span><br><span>        case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-              OSMO_ASSERT(lchan_nr == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (lchan_nr != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                    return -EINVAL;</span><br><span>              cbits = 0x01;</span><br><span>                break;</span><br><span>       case GSM_PCHAN_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-            OSMO_ASSERT(lchan_nr == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (lchan_nr != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                    return -EINVAL;</span><br><span>              cbits = RSL_CHAN_OSMO_PDCH >> 3;</span><br><span>               break;</span><br><span>       case GSM_PCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-           OSMO_ASSERT(lchan_nr < 2);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (lchan_nr > 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span>              cbits = 0x02;</span><br><span>                cbits += lchan_nr;</span><br><span>           break;</span><br><span>@@ -525,19 +528,21 @@</span><br><span>               if (lchan_nr == CCCH_LCHAN)</span><br><span>                  chan_nr = 0;</span><br><span>                 else</span><br><span style="color: hsl(0, 100%, 40%);">-                    OSMO_ASSERT(lchan_nr < 4);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return -EINVAL;</span><br><span>              cbits = 0x04;</span><br><span>                cbits += lchan_nr;</span><br><span>           break;</span><br><span>       case GSM_PCHAN_SDCCH8_SACCH8C:</span><br><span>       case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:</span><br><span style="color: hsl(0, 100%, 40%);">-             OSMO_ASSERT(lchan_nr < 8);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (lchan_nr > 7)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span>              cbits = 0x08;</span><br><span>                cbits += lchan_nr;</span><br><span>           break;</span><br><span>       default:</span><br><span>     case GSM_PCHAN_CCCH:</span><br><span style="color: hsl(0, 100%, 40%);">-            OSMO_ASSERT(lchan_nr == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (lchan_nr != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                    return -EINVAL;</span><br><span>              cbits = 0x10;</span><br><span>                break;</span><br><span>       }</span><br><span>@@ -547,15 +552,23 @@</span><br><span>    return chan_nr;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_lchan2chan_nr(const struct gsm_lchan *lchan)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   int rc;</span><br><span>      uint8_t lchan_nr = lchan->nr;</span><br><span>     /* The VAMOS lchans are behind the primary ones in the ts->lchan[] array. They keep their lchan->nr as in the</span><br><span>   * array, but on the wire they are the "shadow" lchans for the primary lchans. For example, for TCH/F, there is</span><br><span>     * a primary ts->lchan[0] and a VAMOS ts->lchan[1]. Still, the VAMOS lchan should send chan_nr = 0. */</span><br><span>         if (lchan->vamos.is_secondary)</span><br><span>            lchan_nr -= lchan->ts->max_primary_lchans;</span><br><span style="color: hsl(0, 100%, 40%);">-        return gsm_pchan2chan_nr(lchan->ts->pchan_is, lchan->ts->nr, lchan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = gsm_pchan2chan_nr(lchan->ts->pchan_is, lchan->ts->nr, lchan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Log an error so that we don't need to add logging to each caller of this function */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+               LOG_LCHAN(lchan, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Error encoding Channel Number: pchan %s ts %u ss %u%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                          gsm_pchan_name(lchan->ts->pchan_from_config), lchan->ts->nr, lchan->nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                        lchan->vamos.is_secondary ? " (VAMOS shadow)" : "");</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span> }</span><br><span> </span><br><span> static const uint8_t subslots_per_pchan[] = {</span><br><span>@@ -677,23 +690,40 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd,</span><br><span style="color: hsl(0, 100%, 40%);">-                           const struct gsm_lchan *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                          uint8_t tsc)</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                        uint8_t tsc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     cd->chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+    int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Log an error so that we don't need to add logging to each caller of this function */</span><br><span style="color: hsl(120, 100%, 40%);">+           LOG_LCHAN(lchan, LOGL_ERROR, "Error encoding Channel Number\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     cd->chan_nr = chan_nr;</span><br><span>    _chan_desc_fill_tail(cd, lchan, tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span> }</span><br><span> </span><br><span> /* like gsm48_lchan2chan_desc() above, but use ts->pchan_from_config to</span><br><span>  * return a channel description based on what is configured, rather than</span><br><span>  * what the current state of the pchan type is */</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm48_lchan2chan_desc_as_configured(struct gsm48_chan_desc *cd,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    const struct gsm_lchan *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  uint8_t tsc)</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm48_lchan2chan_desc_as_configured(struct gsm48_chan_desc *cd,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    const struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        uint8_t tsc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       cd->chan_nr = gsm_pchan2chan_nr(lchan->ts->pchan_from_config, lchan->ts->nr, lchan->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+    int chan_nr = gsm_pchan2chan_nr(lchan->ts->pchan_from_config, lchan->ts->nr, lchan->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_nr < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Log an error so that we don't need to add logging to each caller of this function */</span><br><span style="color: hsl(120, 100%, 40%);">+           LOG_LCHAN(lchan, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Error encoding Channel Number: pchan %s ts %u ss %u%s (rc = %d)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        gsm_pchan_name(lchan->ts->pchan_from_config), lchan->ts->nr, lchan->nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                        lchan->vamos.is_secondary ? " (VAMOS shadow)" : "", chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                return chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     cd->chan_nr = chan_nr;</span><br><span>    _chan_desc_fill_tail(cd, lchan, tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span> }</span><br><span> </span><br><span> uint8_t gsm_ts_tsc(const struct gsm_bts_trx_ts *ts)</span><br><span>diff --git a/src/osmo-bsc/lcs_loc_req.c b/src/osmo-bsc/lcs_loc_req.c</span><br><span>index ee85c91..94c4e3b 100644</span><br><span>--- a/src/osmo-bsc/lcs_loc_req.c</span><br><span>+++ b/src/osmo-bsc/lcs_loc_req.c</span><br><span>@@ -369,7 +369,10 @@</span><br><span>                                .cause = BSSLAP_CAUSE_INTRA_BSS_HO,</span><br><span>                  },</span><br><span>           };</span><br><span style="color: hsl(0, 100%, 40%);">-              gsm48_lchan2chan_desc(&apdu->reset.chan_desc, lchan, lchan->tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (gsm48_lchan2chan_desc(&apdu->reset.chan_desc, lchan, lchan->tsc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     lcs_loc_req_fail(LCS_CAUSE_SYSTEM_FAILURE, "Error encoding Channel Number");</span><br><span style="color: hsl(120, 100%, 40%);">+                        return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>    }</span><br><span> </span><br><span>        lcs_loc_req_send(lcs_loc_req, &bsslap);</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_lcls.c b/src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>index 2c90d01..542bbf5 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>@@ -243,13 +243,19 @@</span><br><span>        uint32_t ip = enable ? conn->lcls.other->lchan->abis_ip.bound_ip : lchan->abis_ip.connect_ip;</span><br><span>        /* RSL_IE_IPAC_REMOTE_PORT */</span><br><span>        uint16_t port = enable ? conn->lcls.other->lchan->abis_ip.bound_port : lchan->abis_ip.connect_port;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct msgb *msg;</span><br><span> </span><br><span>        if (!conn->lcls.other) {</span><br><span>          LOGPFSM(conn->lcls.fi, "%s LCLS: other conn is not available!\n", enable ? "enable" : "disable");</span><br><span>                return;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       abis_rsl_sendmsg(rsl_make_ipacc_mdcx(lchan, ip, port));</span><br><span style="color: hsl(120, 100%, 40%);">+       msg = rsl_make_ipacc_mdcx(lchan, ip, port);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPFSML(conn->lcls.fi, LOGL_ERROR, "Error encoding IPACC MDCX\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+       abis_rsl_sendmsg(msg);</span><br><span> }</span><br><span> </span><br><span> static inline bool lcls_check_toggle_allowed(const struct gsm_subscriber_connection *conn, bool enable)</span><br><span>diff --git a/src/osmo-bsc/system_information.c b/src/osmo-bsc/system_information.c</span><br><span>index 21cbcae..e8b3b7d 100644</span><br><span>--- a/src/osmo-bsc/system_information.c</span><br><span>+++ b/src/osmo-bsc/system_information.c</span><br><span>@@ -1018,7 +1018,8 @@</span><br><span>                 struct gsm48_chan_desc cd;</span><br><span> </span><br><span>               /* 10.5.2.5 (TV) CBCH Channel Description IE */</span><br><span style="color: hsl(0, 100%, 40%);">-         gsm48_lchan2chan_desc_as_configured(&cd, cbch_lchan, gsm_ts_tsc(cbch_lchan->ts));</span><br><span style="color: hsl(120, 100%, 40%);">+              if (gsm48_lchan2chan_desc_as_configured(&cd, cbch_lchan, gsm_ts_tsc(cbch_lchan->ts)))</span><br><span style="color: hsl(120, 100%, 40%);">+                  return -EINVAL;</span><br><span>              tail = tv_fixed_put(tail, GSM48_IE_CBCH_CHAN_DESC,</span><br><span>                               sizeof(cd), (uint8_t *) &cd);</span><br><span>                l2_plen += 1 + sizeof(cd);</span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index e653920..b741e25 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -100,10 +100,11 @@</span><br><span> {</span><br><span>         struct msgb *msg = msgb_alloc_headroom(256, 64, "RSL");</span><br><span>    struct abis_rsl_dchan_hdr *dh;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span>  uint8_t ulm[3], l1i[2], *buf;</span><br><span>        struct gsm48_hdr *gh;</span><br><span>        struct gsm48_meas_res *mr;</span><br><span style="color: hsl(120, 100%, 40%);">+    int chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(chan_nr >= 0);</span><br><span> </span><br><span>    dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span>       dh->c.msg_discr = ABIS_RSL_MDISC_DED_CHAN;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24524">change 24524</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-bsc/+/24524"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I71ed6437c403a3f9336e17a94b4948fca295d853 </div>
<div style="display:none"> Gerrit-Change-Number: 24524 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>