<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/25580">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gsm_lchan2chan_nr(): separate RSL specific variant of this API<br><br>The ip.access style dynamic timeslots are a bit special in a way that<br>on the A-bis/RSL we always use the Channel Number value of TCH/F,<br>even in PDCH mode.  This is why gsm_lchan2chan_nr() would always<br>return values corresponding to TCH/F for TCH/F_PDCH.<br><br>This behavior is only acceptable in the context of RSL messages, while<br>other parts of the code base may not work properly due to this trick.<br>A good example is the scheduler in osmo-bts-trx, where we have to<br>patch Channel Number value to make channel activation work.<br><br>  DPCU INFO pcu_sock.c:853 Activate request received: TRX=0 TS=5<br>  DL1C INFO l1sap.c:2043 (bts=0,trx=0,ts=5,ss=0) Activating channel TCH/F on TS5<br>  DL1C NOTICE scheduler.c:1097 (bts=0,trx=0,ts=5,ss=0) Activating PDTCH<br>  DL1C NOTICE scheduler.c:1097 (bts=0,trx=0,ts=5,ss=0) Activating PTCCH<br><br>In the code branch responsible for channel deactivation, we somehow<br>forgot to add the same workaround, so deactivation does not work:<br><br>  DL1C INFO l1sap.c:2076 (bts=0,trx=0,ts=5,ss=0) Deactivating channel TCH/F on TS5<br>  DTRX INFO trx_if.c:255 phy0.0: Enqueuing TRX control command 'CMD NOHANDOVER 5 0'<br>  DRSL NOTICE rsl.c:1286 (bts=0,trx=0,ts=5,ss=0) (bts=0,trx=0,ts=5,ss=0) not sending REL ACK<br><br>Because of that, TCH/F_PDCH timeslots actually remain active after<br>deactivation, so the scheduler keeps producing L1SAP DATA.ind.<br><br>  DL1P NOTICE l1sap.c:126 (bts=0,trx=0,ts=5,ss=0) assuming active lchan, but state is NONE<br>  DL1P ERROR l1sap.c:732 1583426/1194/00/29/14 No lchan for DATA MEAS IND (chan_nr=PDCH on TS5)<br>  DPCU NOTICE pcu_sock.c:973 PCU socket not connected, dropping message<br>  DL1P NOTICE l1sap.c:126 (bts=0,trx=0,ts=5,ss=0) assuming active lchan, but state is NONE<br>  DPCU NOTICE pcu_sock.c:973 PCU socket not connected, dropping message<br>  DL1P NOTICE l1sap.c:126 (bts=0,trx=0,ts=5,ss=0) assuming active lchan, but state is NONE<br>  DL1P ERROR l1sap.c:732 1583430/1194/04/33/18 No lchan for DATA MEAS IND (chan_nr=PDCH on TS5)<br>  DPCU NOTICE pcu_sock.c:973 PCU socket not connected, dropping message<br>  DL1P NOTICE l1sap.c:126 (bts=0,trx=0,ts=5,ss=0) assuming active lchan, but state is NONE<br>  DPCU NOTICE pcu_sock.c:973 PCU socket not connected, dropping message<br><br>Instead of patching Channel Number in various places, let's rather<br>make the RSL specific behavior configurable by having two variants<br>of gsm_lchan2chan_nr().<br><br>Change-Id: I01680140c7201bf5284b278bceaea8ae01c122b2<br>Fixes: OS#5238<br>---<br>M include/osmo-bts/gsm_data.h<br>M src/common/gsm_data.c<br>M src/common/rsl.c<br>3 files changed, 37 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/80/25580/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index 9fe68d6..19689e5 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -568,6 +568,7 @@</span><br><span> }</span><br><span> </span><br><span> uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t gsm_lchan2chan_nr_rsl(const struct gsm_lchan *lchan);</span><br><span> uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,</span><br><span>                                    enum gsm_phys_chan_config as_pchan);</span><br><span> </span><br><span>diff --git a/src/common/gsm_data.c b/src/common/gsm_data.c</span><br><span>index ee6e693..1525328 100644</span><br><span>--- a/src/common/gsm_data.c</span><br><span>+++ b/src/common/gsm_data.c</span><br><span>@@ -243,7 +243,7 @@</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%);">+static uint8_t _gsm_lchan2chan_nr(const struct gsm_lchan *lchan, bool rsl)</span><br><span> {</span><br><span>    uint8_t chan_nr;</span><br><span> </span><br><span>@@ -254,9 +254,14 @@</span><br><span>          chan_nr = gsm_lchan_as_pchan2chan_nr(lchan, lchan->ts->dyn.pchan_is);</span><br><span>          break;</span><br><span>       case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-              /* For ip.access style dyn TS, we always want to use the chan_nr as if it was TCH/F.</span><br><span style="color: hsl(120, 100%, 40%);">+          /* For ip.access style dyn TS, on RSL we want to use the chan_nr as if it was TCH/F.</span><br><span>                  * We're using custom PDCH ACT and DEACT messages that use the usual chan_nr values. */</span><br><span style="color: hsl(0, 100%, 40%);">-             chan_nr = gsm_lchan_as_pchan2chan_nr(lchan, GSM_PCHAN_TCH_F);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (rsl)</span><br><span style="color: hsl(120, 100%, 40%);">+                      chan_nr = gsm_lchan_as_pchan2chan_nr(lchan, GSM_PCHAN_TCH_F);</span><br><span style="color: hsl(120, 100%, 40%);">+         else if (~lchan->ts->flags & TS_F_PDCH_ACTIVE)</span><br><span style="color: hsl(120, 100%, 40%);">+                      chan_nr = gsm_lchan_as_pchan2chan_nr(lchan, GSM_PCHAN_TCH_F);</span><br><span style="color: hsl(120, 100%, 40%);">+         else</span><br><span style="color: hsl(120, 100%, 40%);">+                  chan_nr = gsm_lchan_as_pchan2chan_nr(lchan, GSM_PCHAN_PDCH);</span><br><span>                 break;</span><br><span>       default:</span><br><span>             chan_nr = gsm_pchan2chan_nr(lchan->ts->pchan, lchan->ts->nr, lchan->nr);</span><br><span>@@ -271,6 +276,16 @@</span><br><span>       return chan_nr;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return _gsm_lchan2chan_nr(lchan, false);</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%);">+uint8_t gsm_lchan2chan_nr_rsl(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        return _gsm_lchan2chan_nr(lchan, true);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,</span><br><span>                               enum gsm_phys_chan_config as_pchan)</span><br><span> {</span><br><span>diff --git a/src/common/rsl.c b/src/common/rsl.c</span><br><span>index 368590c..742270d 100644</span><br><span>--- a/src/common/rsl.c</span><br><span>+++ b/src/common/rsl.c</span><br><span>@@ -461,7 +461,7 @@</span><br><span>                       if (band < 0)</span><br><span>                             continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   msgb_v_put(nmsg, gsm_lchan2chan_nr(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+                   msgb_v_put(nmsg, gsm_lchan2chan_nr_rsl(lchan));</span><br><span>                      msgb_v_put(nmsg, (band & 0x07) << 5);</span><br><span>              }</span><br><span>    }</span><br><span>@@ -1225,7 +1225,7 @@</span><br><span> /* 8.4.19 sending RF CHANnel RELease ACKnowledge */</span><br><span> int rsl_tx_rf_rel_ack(struct gsm_lchan *lchan)</span><br><span> {</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span>      bool send_rel_ack;</span><br><span> </span><br><span>       switch (lchan->rel_act_kind) {</span><br><span>@@ -1314,7 +1314,7 @@</span><br><span> {</span><br><span>       struct gsm_time *gtime = get_time(lchan->ts->trx->bts);</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span>      uint8_t ie[2];</span><br><span> </span><br><span>   LOGP(DRSL, LOGL_NOTICE, "%s (ss=%d) %s Tx CHAN ACT ACK\n",</span><br><span>@@ -1340,7 +1340,7 @@</span><br><span> int rsl_tx_hando_det(struct gsm_lchan *lchan, uint8_t *ho_delay)</span><br><span> {</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span> </span><br><span>  LOGPLCHAN(lchan, DRSL, LOGL_INFO, "Sending HANDOver DETect\n");</span><br><span> </span><br><span>@@ -1382,7 +1382,7 @@</span><br><span>        return abis_bts_rsl_sendmsg(msg);</span><br><span> }</span><br><span> static int rsl_tx_chan_act_nack(struct gsm_lchan *lchan, uint8_t cause) {</span><br><span style="color: hsl(0, 100%, 40%);">-     return _rsl_tx_chan_act_nack(lchan->ts->trx, gsm_lchan2chan_nr(lchan), cause, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+   return _rsl_tx_chan_act_nack(lchan->ts->trx, gsm_lchan2chan_nr_rsl(lchan), cause, lchan);</span><br><span> }</span><br><span> </span><br><span> /* Send an RSL Channel Activation Ack if cause is zero, a Nack otherwise. */</span><br><span>@@ -1403,7 +1403,7 @@</span><br><span> int rsl_tx_conn_fail(const struct gsm_lchan *lchan, uint8_t cause)</span><br><span> {</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span> </span><br><span>  LOGPLCHAN(lchan, DRSL, LOGL_NOTICE, "Sending Connection Failure: cause = 0x%02x\n", cause);</span><br><span> </span><br><span>@@ -2011,7 +2011,7 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rsl_rll_push_l3(fake_msg, RSL_MT_DATA_IND, gsm_lchan2chan_nr(lchan),</span><br><span style="color: hsl(120, 100%, 40%);">+  rsl_rll_push_l3(fake_msg, RSL_MT_DATA_IND, gsm_lchan2chan_nr_rsl(lchan),</span><br><span>                     link_id, 1);</span><br><span> </span><br><span>     fake_msg->lchan = lchan;</span><br><span>@@ -2146,7 +2146,7 @@</span><br><span> }</span><br><span> static int rsl_tx_mode_modif_nack(struct gsm_lchan *lchan, uint8_t cause)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      return _rsl_tx_mode_modif_nack(lchan->ts->trx, gsm_lchan2chan_nr(lchan), cause, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+ return _rsl_tx_mode_modif_nack(lchan->ts->trx, gsm_lchan2chan_nr_rsl(lchan), cause, lchan);</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -2154,7 +2154,7 @@</span><br><span> static int rsl_tx_mode_modif_ack(struct gsm_lchan *lchan)</span><br><span> {</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span> </span><br><span>  LOGPLCHAN(lchan, DRSL, LOGL_INFO, "Tx MODE MODIF ACK\n");</span><br><span> </span><br><span>@@ -2432,7 +2432,7 @@</span><br><span>              return -ENOMEM;</span><br><span> </span><br><span>  /* 9.3.1 Channel Number */</span><br><span style="color: hsl(0, 100%, 40%);">-      rsl_cch_push_hdr(msg, RSL_MT_CBCH_LOAD_IND, gsm_lchan2chan_nr(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+        rsl_cch_push_hdr(msg, RSL_MT_CBCH_LOAD_IND, gsm_lchan2chan_nr_rsl(lchan));</span><br><span> </span><br><span>       /* 9.3.43 CBCH Load Information */</span><br><span>   load_info = ((overflow & 1) << 7) | (amount & 0x0F);</span><br><span>@@ -2494,7 +2494,7 @@</span><br><span>   msgb_tv16_put(nmsg, RSL_IE_IPAC_CONN_ID, htons(lchan->abis_ip.conn_id));</span><br><span>  rsl_add_rtp_stats(lchan, nmsg);</span><br><span>      msgb_tlv_put(nmsg, RSL_IE_CAUSE, 1, &cause);</span><br><span style="color: hsl(0, 100%, 40%);">-        rsl_ipa_push_hdr(nmsg, RSL_MT_IPAC_DLCX_IND, gsm_lchan2chan_nr(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+       rsl_ipa_push_hdr(nmsg, RSL_MT_IPAC_DLCX_IND, gsm_lchan2chan_nr_rsl(lchan));</span><br><span> </span><br><span>      nmsg->trx = lchan->ts->trx;</span><br><span> </span><br><span>@@ -2506,7 +2506,7 @@</span><br><span>                               uint8_t orig_msgt)</span><br><span> {</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span>      const char *name;</span><br><span>    struct in_addr ia;</span><br><span> </span><br><span>@@ -2554,7 +2554,7 @@</span><br><span> static int rsl_tx_ipac_dlcx_ack(struct gsm_lchan *lchan, int inc_conn_id)</span><br><span> {</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span> </span><br><span>  LOGPLCHAN(lchan, DRSL, LOGL_INFO, "RSL Tx IPAC_DLCX_ACK\n");</span><br><span> </span><br><span>@@ -2577,7 +2577,7 @@</span><br><span>                            uint8_t cause)</span><br><span> {</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span> </span><br><span>  LOGPLCHAN(lchan, DRSL, LOGL_INFO, "RSL Tx IPAC_DLCX_NACK\n");</span><br><span> </span><br><span>@@ -2603,7 +2603,7 @@</span><br><span>                       int inc_ipport, uint8_t orig_msgtype)</span><br><span> {</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span> </span><br><span>  /* FIXME: allocate new msgb and copy old over */</span><br><span>     LOGPLCHAN(lchan, DRSL, LOGL_NOTICE, "RSL Tx IPAC_BIND_NACK\n");</span><br><span>@@ -2918,7 +2918,7 @@</span><br><span> static int rsl_tx_dyn_pdch_ack(struct gsm_lchan *lchan, bool pdch_act)</span><br><span> {</span><br><span>     struct gsm_time *gtime = get_time(lchan->ts->trx->bts);</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span>      struct msgb *msg;</span><br><span>    uint8_t ie[2];</span><br><span> </span><br><span>@@ -2947,7 +2947,7 @@</span><br><span>                           uint8_t cause)</span><br><span> {</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span> </span><br><span>  LOGPLCHAN(lchan, DRSL, LOGL_NOTICE, "Tx PDCH %s NACK (cause = 0x%02x)\n",</span><br><span>            pdch_act ? "ACT" : "DEACT", cause);</span><br><span>@@ -3512,7 +3512,7 @@</span><br><span> {</span><br><span>       struct msgb *msg;</span><br><span>    uint8_t meas_res[16];</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%);">+   uint8_t chan_nr = gsm_lchan2chan_nr_rsl(lchan);</span><br><span>      int res_valid = lchan->meas.flags & LC_UL_M_F_RES_VALID;</span><br><span>      struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/25580">change 25580</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-bts/+/25580"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I01680140c7201bf5284b278bceaea8ae01c122b2 </div>
<div style="display:none"> Gerrit-Change-Number: 25580 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>