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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">VTY: add lchan re-assignment command<br><br>Add VTY command to trigger an intra-cell re-assignment, also allowing to<br>re-assign to a secondary VAMOS lchan.<br><br>Related: SYS#5315 OS#4940<br>Change-Id: If006f5caaf83b07675f57e5665cfa79328da55e6<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/gsm_data.c<br>M tests/osmo-bsc.vty<br>4 files changed, 129 insertions(+), 0 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 11b19ec..dccf5a1 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -131,6 +131,7 @@</span><br><span>         ASSIGN_FOR_NONE,</span><br><span>     ASSIGN_FOR_BSSMAP_REQ,</span><br><span>       ASSIGN_FOR_CONGESTION_RESOLUTION,</span><br><span style="color: hsl(120, 100%, 40%);">+     ASSIGN_FOR_VTY,</span><br><span> };</span><br><span> </span><br><span> extern const struct value_string assign_for_names[];</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 71a0f0b..430863b 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -6590,6 +6590,94 @@</span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(lchan_reassign, lchan_reassign_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "bts <0-255> trx <0-255> timeslot <0-7> (sub-slot|vamos-sub-slot) <0-7> "</span><br><span style="color: hsl(120, 100%, 40%);">+   "reassign-to trx <0-255> timeslot <0-7> (sub-slot|vamos-sub-slot) <0-7> "</span><br><span style="color: hsl(120, 100%, 40%);">+ TSC_ARGS_OPT,</span><br><span style="color: hsl(120, 100%, 40%);">+ BTS_NR_TRX_TS_STR2</span><br><span style="color: hsl(120, 100%, 40%);">+    "Primary sub-slot\n" "VAMOS secondary shadow subslot, range <0-1>, only valid for TCH type timeslots\n"</span><br><span style="color: hsl(120, 100%, 40%);">+     SS_NR_STR</span><br><span style="color: hsl(120, 100%, 40%);">+     "Trigger Assignment to an unused lchan on the same cell\n"</span><br><span style="color: hsl(120, 100%, 40%);">+  "Target TRX\nTRX nr\nTarget timeslot\ntimeslot nr\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Primary sub-slot\n" "VAMOS secondary shadow subslot, range <0-1>, only valid for TCH type timeslots\n"</span><br><span style="color: hsl(120, 100%, 40%);">+     SS_NR_STR</span><br><span style="color: hsl(120, 100%, 40%);">+     TSC_ARGS_DOC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      const char *bts_str = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+        const char *from_trx_str = argv[1];</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *from_ts_str = argv[2];</span><br><span style="color: hsl(120, 100%, 40%);">+    bool from_vamos = (strcmp(argv[3], "vamos-sub-slot") == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ int from_ss_nr = atoi(argv[4]);</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *to_trx_str = argv[5];</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *to_ts_str = argv[6];</span><br><span style="color: hsl(120, 100%, 40%);">+      bool to_vamos = (strcmp(argv[7], "vamos-sub-slot") == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   int to_ss_nr = atoi(argv[8]);</span><br><span style="color: hsl(120, 100%, 40%);">+ int tsc_set = (argc > 10) ? atoi(argv[10]) : -1;</span><br><span style="color: hsl(120, 100%, 40%);">+   int tsc = (argc > 11) ? atoi(argv[11]) : -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts_trx_ts *from_ts;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_trx_ts *to_ts;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_lchan *from_lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_lchan *to_lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ from_ts = vty_get_ts(vty, bts_str, from_trx_str, from_ts_str);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!from_ts)</span><br><span style="color: hsl(120, 100%, 40%);">+         return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   to_ts = vty_get_ts(vty, bts_str, to_trx_str, to_ts_str);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!to_ts)</span><br><span style="color: hsl(120, 100%, 40%);">+           return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!ts_is_capable_of_pchan(to_ts, from_ts->pchan_is)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "cannot re-assign, target timeslot has mismatching physical channel config: %s -> %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                    gsm_pchan_name(from_ts->pchan_is), gsm_pchan_name(to_ts->pchan_on_init), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+          return CMD_WARNING;</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 (from_ss_nr >= from_ts->max_primary_lchans) {</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "cannot re-assign, invalid source subslot number: %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                       from_ss_nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+             return CMD_WARNING;</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 (to_ss_nr >= to_ts->max_primary_lchans) {</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "cannot re-assign, invalid target subslot number: %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                       to_ss_nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               return CMD_WARNING;</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 (from_vamos)</span><br><span style="color: hsl(120, 100%, 40%);">+               from_ss_nr += from_ts->max_primary_lchans;</span><br><span style="color: hsl(120, 100%, 40%);">+ from_lchan = &from_ts->lchan[from_ss_nr];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (to_vamos)</span><br><span style="color: hsl(120, 100%, 40%);">+         to_ss_nr += to_ts->max_primary_lchans;</span><br><span style="color: hsl(120, 100%, 40%);">+     to_lchan = &to_ts->lchan[to_ss_nr];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!lchan_state_is(from_lchan, LCHAN_ST_ESTABLISHED)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "cannot re-assign, source lchan is not in ESTABLISHED state%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+          return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!lchan_state_is(to_lchan, LCHAN_ST_UNUSED)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "cannot re-assign, target lchan is already in use%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            return CMD_WARNING;</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%);">+   /* lchan_select_*() sets the lchan->type, we need to do the same here, so that activation will work out. */</span><br><span style="color: hsl(120, 100%, 40%);">+        to_lchan->type = chan_mode_to_chan_type(from_lchan->current_ch_mode_rate.chan_mode,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             from_lchan->current_ch_mode_rate.chan_rate);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     LOG_LCHAN(from_lchan, LOGL_NOTICE, "VTY requests re-assignment of this lchan to %s%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              gsm_lchan_name(to_lchan), to_lchan->vamos.is_secondary ? " (to VAMOS mode)" : "");</span><br><span style="color: hsl(120, 100%, 40%);">+   LOG_LCHAN(to_lchan, LOGL_NOTICE, "VTY requests re-assignment of %s to this lchan%s TSC %d/%d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              gsm_lchan_name(from_lchan), to_lchan->vamos.is_secondary ? " (to VAMOS mode)" : "",</span><br><span style="color: hsl(120, 100%, 40%);">+            tsc_set, tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (reassignment_request_to_lchan(ASSIGN_FOR_VTY, from_lchan, to_lchan, tsc_set, tsc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "failed to request re-assignment%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+             return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</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(ctrl_trap, ctrl_trap_cmd,</span><br><span>  "ctrl-interface generate-trap TRAP VALUE",</span><br><span>         "Commands related to the CTRL Interface\n"</span><br><span>@@ -8069,6 +8157,7 @@</span><br><span>         install_element(ENABLE_NODE, &vamos_modify_lchan_cmd);</span><br><span>   install_element(ENABLE_NODE, &lchan_mdcx_cmd);</span><br><span>   install_element(ENABLE_NODE, &lchan_set_borken_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(ENABLE_NODE, &lchan_reassign_cmd);</span><br><span> </span><br><span>   install_element(ENABLE_NODE, &handover_subscr_conn_cmd);</span><br><span>         install_element(ENABLE_NODE, &assignment_subscr_conn_cmd);</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index 33a2249..0d1395c 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -1061,6 +1061,7 @@</span><br><span>      OSMO_VALUE_STRING(ASSIGN_FOR_NONE),</span><br><span>  OSMO_VALUE_STRING(ASSIGN_FOR_BSSMAP_REQ),</span><br><span>    OSMO_VALUE_STRING(ASSIGN_FOR_CONGESTION_RESOLUTION),</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_VALUE_STRING(ASSIGN_FOR_VTY),</span><br><span>   {}</span><br><span> };</span><br><span> </span><br><span>diff --git a/tests/osmo-bsc.vty b/tests/osmo-bsc.vty</span><br><span>index cbd4985..48f3f0b 100644</span><br><span>--- a/tests/osmo-bsc.vty</span><br><span>+++ b/tests/osmo-bsc.vty</span><br><span>@@ -11,6 +11,7 @@</span><br><span>   deactivate      Manual Channel Deactivation (e.g. for BER test)</span><br><span>   modify          Manually send Channel Mode Modify (for debugging)</span><br><span>   mdcx            Modify RTP Connection</span><br><span style="color: hsl(120, 100%, 40%);">+  reassign-to     Trigger Assignment to an unused lchan on the same cell</span><br><span>   handover        Manually trigger handover (for debugging)</span><br><span>   assignment      Manually trigger assignment (for debugging)</span><br><span> </span><br><span>@@ -72,6 +73,7 @@</span><br><span>   deactivate      Manual Channel Deactivation (e.g. for BER test)</span><br><span>   modify          Manually send Channel Mode Modify (for debugging)</span><br><span>   mdcx            Modify RTP Connection</span><br><span style="color: hsl(120, 100%, 40%);">+  reassign-to     Trigger Assignment to an unused lchan on the same cell</span><br><span>   handover        Manually trigger handover (for debugging)</span><br><span>   assignment      Manually trigger assignment (for debugging)</span><br><span> </span><br><span>@@ -88,6 +90,42 @@</span><br><span> OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 activate fr 0 ?</span><br><span>   <cr>  </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# list</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  bts <0-255> trx <0-255> timeslot <0-7> (sub-slot|vamos-sub-slot) <0-7> reassign-to trx <0-255> timeslot <0-7> (sub-slot|vamos-sub-slot) <0-7> [tsc] [<1-4>] [<0-7>]</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%);">+OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 reassign-to ?</span><br><span style="color: hsl(120, 100%, 40%);">+  trx  Target TRX</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 reassign-to trx ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <0-255>  TRX nr</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 reassign-to trx 0 ?</span><br><span style="color: hsl(120, 100%, 40%);">+  timeslot  Target timeslot</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 reassign-to trx 0 timeslot ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <0-7>  timeslot nr</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 reassign-to trx 0 timeslot 0 ?</span><br><span style="color: hsl(120, 100%, 40%);">+  sub-slot        Primary sub-slot</span><br><span style="color: hsl(120, 100%, 40%);">+  vamos-sub-slot  VAMOS secondary shadow subslot, range <0-1>, only valid for TCH type timeslots</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 reassign-to trx 0 timeslot 0 vamos-sub-slot ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <0-7>  Sub-slot Number</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 reassign-to trx 0 timeslot 0 vamos-sub-slot 0 ?</span><br><span style="color: hsl(120, 100%, 40%);">+  [tsc]  Provide specific TSC Set and Training Sequence Code</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 reassign-to trx 0 timeslot 0 vamos-sub-slot 0 tsc ?</span><br><span style="color: hsl(120, 100%, 40%);">+  [<1-4>]  TSC Set</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 reassign-to trx 0 timeslot 0 vamos-sub-slot 0 tsc 1 ?</span><br><span style="color: hsl(120, 100%, 40%);">+  [<0-7>]  Training Sequence Code</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 trx 0 timeslot 0 sub-slot 0 reassign-to trx 0 timeslot 0 vamos-sub-slot 0 tsc 1 0 ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <cr>  </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> OsmoBSC# configure terminal</span><br><span> OsmoBSC(config)# network</span><br><span> OsmoBSC(config-net)# list</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24381">change 24381</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/+/24381"/><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: If006f5caaf83b07675f57e5665cfa79328da55e6 </div>
<div style="display:none"> Gerrit-Change-Number: 24381 </div>
<div style="display:none"> Gerrit-PatchSet: 29 </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: fixeria <vyanitskiy@sysmocom.de> </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>