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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add fields to reflect nr of lchans in ts struct<br><br>So far the number of usable lchans is determined on-the-fly by the<br>physical channel config. With VAMOS, this becomes more complex, namely<br>determining whether the BTS is vamos capable.<br><br>Instead of calling a function to determine the number of lchans for<br>every use, rather place the number of valid lchans in int members of the<br>timeslot struct, and initialize those during timeslot setup.<br><br>Actual use of these new fields will follow in a subsequent patch, which<br>introduces the ts_for_n_lchans() macro to replace current lchan<br>iteration macros.<br><br>Related: SYS#5315 OS#4940<br>Change-Id: I08027d79db71a23e874b729c4e6173b0f269ee4f<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M include/osmocom/bsc/timeslot_fsm.h<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/timeslot_fsm.c<br>M tests/handover/handover_test.c<br>5 files changed, 35 insertions(+), 16 deletions(-)<br><br></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 f2e6cfa..7bfe3ab 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -821,6 +821,12 @@</span><br><span>               } rbs2000;</span><br><span>   };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        /* Maximum number of lchans that could become usable, for example by switching a dynamic timeslot's type or by</span><br><span style="color: hsl(120, 100%, 40%);">+     * enabling VAMOS secondary lchans. This does include the maximum count of possible VAMOS secondary lchans. */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t max_lchans_possible;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Currently usable lchans, according to the current pchan mode (for dynamic timeslots, this may change).</span><br><span style="color: hsl(120, 100%, 40%);">+      * Does not include count of secondary VAMOS lchans. */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t max_primary_lchans;</span><br><span>  struct gsm_lchan lchan[TS_MAX_LCHAN];</span><br><span> };</span><br><span> </span><br><span>diff --git a/include/osmocom/bsc/timeslot_fsm.h b/include/osmocom/bsc/timeslot_fsm.h</span><br><span>index da66136..f5e4b4c 100644</span><br><span>--- a/include/osmocom/bsc/timeslot_fsm.h</span><br><span>+++ b/include/osmocom/bsc/timeslot_fsm.h</span><br><span>@@ -51,3 +51,5 @@</span><br><span> bool ts_is_lchan_waiting_for_pchan(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config *target_pchan);</span><br><span> bool ts_is_pchan_switching(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config *target_pchan);</span><br><span> bool ts_usable_as_pchan(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config as_pchan, bool allow_pchan_switch);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ts_set_pchan_is(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config pchan_is);</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index c91266e..6252d06 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -6428,9 +6428,9 @@</span><br><span>              return CMD_WARNING;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (ss_nr >= pchan_subslots(ts->pchan_is)) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ss_nr >= ts->max_primary_lchans) {</span><br><span>                 vty_out(vty, "%% subslot index %d too large for physical channel %s (%u slots)%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                    ss_nr, gsm_pchan_name(ts->pchan_is), pchan_subslots(ts->pchan_is),</span><br><span style="color: hsl(120, 100%, 40%);">+                      ss_nr, gsm_pchan_name(ts->pchan_is), ts->max_primary_lchans,</span><br><span>                   VTY_NEWLINE);</span><br><span>                return CMD_WARNING;</span><br><span>  }</span><br><span>diff --git a/src/osmo-bsc/timeslot_fsm.c b/src/osmo-bsc/timeslot_fsm.c</span><br><span>index 41921cd..4fe670f 100644</span><br><span>--- a/src/osmo-bsc/timeslot_fsm.c</span><br><span>+++ b/src/osmo-bsc/timeslot_fsm.c</span><br><span>@@ -187,6 +187,14 @@</span><br><span>                 osmo_fsm_inst_state_name(fi), gsm_lchan_name(lchan));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void ts_set_pchan_is(struct gsm_bts_trx_ts *ts, enum gsm_phys_chan_config pchan_is)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   ts->pchan_is = pchan_is;</span><br><span style="color: hsl(120, 100%, 40%);">+   ts->max_primary_lchans = pchan_subslots(ts->pchan_is);</span><br><span style="color: hsl(120, 100%, 40%);">+  LOG_TS(ts, LOGL_DEBUG, "pchan_is=%s max_primary_lchans=%d max_lchans_possible=%d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               gsm_pchan_name(ts->pchan_is), ts->max_primary_lchans, ts->max_lchans_possible);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void ts_setup_lchans(struct gsm_bts_trx_ts *ts)</span><br><span> {</span><br><span>  int i, max_lchans;</span><br><span>@@ -196,8 +204,10 @@</span><br><span> </span><br><span>        max_lchans = pchan_subslots(ts->pchan_on_init);</span><br><span>   LOG_TS(ts, LOGL_DEBUG, "max lchans: %d\n", max_lchans);</span><br><span style="color: hsl(120, 100%, 40%);">+     ts->max_lchans_possible = max_lchans;</span><br><span style="color: hsl(120, 100%, 40%);">+      ts->max_primary_lchans = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < max_lchans; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < ts->max_lchans_possible; i++) {</span><br><span>                /* If we receive more than one Channel OPSTART ACK, don't fail on the second init. */</span><br><span>            if (ts->lchan[i].fi)</span><br><span>                      continue;</span><br><span>@@ -206,13 +216,13 @@</span><br><span> </span><br><span>        switch (ts->pchan_on_init) {</span><br><span>      case GSM_PCHAN_TCH_F_TCH_H_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                ts->pchan_is = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+             ts_set_pchan_is(ts, GSM_PCHAN_NONE);</span><br><span>                 break;</span><br><span>       case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-              ts->pchan_is = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+            ts_set_pchan_is(ts, GSM_PCHAN_TCH_F);</span><br><span>                break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                ts->pchan_is = ts->pchan_on_init;</span><br><span style="color: hsl(120, 100%, 40%);">+               ts_set_pchan_is(ts, ts->pchan_on_init);</span><br><span>           break;</span><br><span>       }</span><br><span> }</span><br><span>@@ -418,7 +428,7 @@</span><br><span>         case GSM_PCHAN_TCH_F_TCH_H_PDCH:</span><br><span>     case GSM_PCHAN_TCH_F_PDCH:</span><br><span>   case GSM_PCHAN_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-            ts->pchan_is = GSM_PCHAN_PDCH;</span><br><span style="color: hsl(120, 100%, 40%);">+             ts_set_pchan_is(ts, GSM_PCHAN_PDCH);</span><br><span>                 break;</span><br><span>       default:</span><br><span>             ts_fsm_error(fi, TS_ST_BORKEN, "pchan %s is incapable of activating PDCH",</span><br><span>@@ -491,10 +501,10 @@</span><br><span>                 /* Remove pchan = PDCH status, but double check. */</span><br><span>          switch (ts->pchan_on_init) {</span><br><span>              case GSM_PCHAN_TCH_F_TCH_H_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                        ts->pchan_is = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+                     ts_set_pchan_is(ts, GSM_PCHAN_NONE);</span><br><span>                         break;</span><br><span>               case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                      ts->pchan_is = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+                    ts_set_pchan_is(ts, GSM_PCHAN_TCH_F);</span><br><span>                        break;</span><br><span>               default:</span><br><span>                     ts_fsm_error(fi, TS_ST_BORKEN, "pchan %s is incapable of deactivating PDCH",</span><br><span>@@ -616,7 +626,7 @@</span><br><span>         /* Make sure dyn TS pchan_is is updated. For TCH/F_PDCH, there are only PDCH or TCH/F modes, but</span><br><span>      * for Osmocom style TCH/F_TCH/H_PDCH the pchan_is == NONE until an lchan is activated. */</span><br><span>   if (ts->pchan_on_init == GSM_PCHAN_TCH_F_TCH_H_PDCH)</span><br><span style="color: hsl(0, 100%, 40%);">-         ts->pchan_is = gsm_pchan_by_lchan_type(activating_type);</span><br><span style="color: hsl(120, 100%, 40%);">+           ts_set_pchan_is(ts, gsm_pchan_by_lchan_type(activating_type));</span><br><span>       ts_lchans_dispatch(ts, LCHAN_ST_WAIT_TS_READY, LCHAN_EV_TS_READY);</span><br><span> }</span><br><span> </span><br><span>@@ -762,7 +772,8 @@</span><br><span>                    osmo_fsm_inst_state_chg(fi, TS_ST_NOT_INITIALIZED, 0, 0);</span><br><span>            OSMO_ASSERT(fi->state == TS_ST_NOT_INITIALIZED);</span><br><span>          ts_terminate_lchan_fsms(ts);</span><br><span style="color: hsl(0, 100%, 40%);">-            ts->pchan_is = ts->pchan_on_init = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+              ts->pchan_on_init = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+                ts_set_pchan_is(ts, GSM_PCHAN_NONE);</span><br><span>                 ts_fsm_update_id(ts);</span><br><span>                break;</span><br><span> </span><br><span>@@ -771,7 +782,7 @@</span><br><span>             if (fi->state != TS_ST_NOT_INITIALIZED)</span><br><span>                   osmo_fsm_inst_state_chg(fi, TS_ST_NOT_INITIALIZED, 0, 0);</span><br><span>            OSMO_ASSERT(fi->state == TS_ST_NOT_INITIALIZED);</span><br><span style="color: hsl(0, 100%, 40%);">-             ts->pchan_is = GSM_PCHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+             ts_set_pchan_is(ts, GSM_PCHAN_NONE);</span><br><span>                 ts_lchans_dispatch(ts, -1, LCHAN_EV_TS_ERROR);</span><br><span>               break;</span><br><span> </span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index 0859a04..006e791 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -271,7 +271,7 @@</span><br><span>                        switch (trx->ts[i].pchan_on_init) {</span><br><span>                       case GSM_PCHAN_TCH_F_TCH_H_PDCH:</span><br><span>                     case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                              trx->ts[i].pchan_is = GSM_PCHAN_PDCH;</span><br><span style="color: hsl(120, 100%, 40%);">+                              ts_set_pchan_is(&trx->ts[i], GSM_PCHAN_PDCH);</span><br><span>                                 break;</span><br><span>                       default:</span><br><span>                             break;</span><br><span>@@ -392,10 +392,10 @@</span><br><span>       lchan->mgw_endpoint_ci_bts = (void*)1;</span><br><span> </span><br><span>        if (lchan->ts->pchan_on_init == GSM_PCHAN_TCH_F_TCH_H_PDCH)</span><br><span style="color: hsl(0, 100%, 40%);">-               lchan->ts->pchan_is = full_rate ? GSM_PCHAN_TCH_F : GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+            ts_set_pchan_is(lchan->ts, full_rate ? GSM_PCHAN_TCH_F : GSM_PCHAN_TCH_H);</span><br><span>        if (lchan->ts->pchan_on_init == GSM_PCHAN_TCH_F_PDCH) {</span><br><span>                OSMO_ASSERT(full_rate);</span><br><span style="color: hsl(0, 100%, 40%);">-         lchan->ts->pchan_is = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+          ts_set_pchan_is(lchan->ts, GSM_PCHAN_TCH_F);</span><br><span>      }</span><br><span> </span><br><span>        LOG_LCHAN(lchan, LOGL_DEBUG, "activated by handover_test.c\n");</span><br><span>@@ -731,7 +731,7 @@</span><br><span>                                      break;</span><br><span>                               /* else fall thru */</span><br><span>                         case GSM_PCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-                           lchan->ts->pchan_is = GSM_PCHAN_PDCH;</span><br><span style="color: hsl(120, 100%, 40%);">+                           ts_set_pchan_is(lchan->ts, GSM_PCHAN_PDCH);</span><br><span>                               break;</span><br><span>                       default:</span><br><span>                             break;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24371">change 24371</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/+/24371"/><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: I08027d79db71a23e874b729c4e6173b0f269ee4f </div>
<div style="display:none"> Gerrit-Change-Number: 24371 </div>
<div style="display:none"> Gerrit-PatchSet: 11 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </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-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>