<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/22082">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;">handover_test: add lchan wildcards to meas-rep cmd<br><br>With 'set-ts-use', it is convenient to build a scenario of lchan usage,<br>but still inconvenient to send measurement reports to all lchans.<br><br>I need this for testing congestion-check, because each lchan needs to<br>have at least one measurement report, or congestion check is skipped.<br><br>Example:<br><br> set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/HH TCH/HH TCH/H-<br> meas-rep lchan * * * * rxlev 10 rxqual 0 ta 0<br><br>This patch adds the '*' for the lchan arguments, usually being bts idx,<br>trx idx, timeslot idx and subslot idx.<br><br>Use lchan wildcards at the appropriate places to shorten some tests.<br><br>Change-Id: I441f92348508d45e1069a3dfa1ff3842dbba97d6<br>---<br>M tests/handover/handover_test.c<br>M tests/handover/test_balance_congestion_2.ho_vty<br>M tests/handover/test_congestion.ho_vty<br>M tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment.ho_vty<br>M tests/handover/test_dyn_ts_favor_moving_half_used_tch_h.ho_vty<br>M tests/handover/test_no_congestion.ho_vty<br>6 files changed, 72 insertions(+), 44 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index d422a9d..dff1390 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -741,6 +741,50 @@</span><br><span>     return &ts->lchan[atoi(argv[3])];</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define LCHAN_WILDCARD_ARGS "lchan (<0-255>|*) (<0-255>|*) (<0-7>|*) (<0-7>|*)"</span><br><span style="color: hsl(120, 100%, 40%);">+#define LCHAN_WILDCARD_ARGS_DOC "identify an lchan\nBTS nr\nall BTS\nTRX nr\nall BTS\nTimeslot nr\nall TS\nSubslot nr\nall subslots\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void parse_lchan_wildcard_args(const char **argv, void (*cb)(struct gsm_lchan*, void*), void *cb_data)</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 *trx_str = argv[1];</span><br><span style="color: hsl(120, 100%, 40%);">+        const char *ts_str = argv[2];</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *ss_str = argv[3];</span><br><span style="color: hsl(120, 100%, 40%);">+ int bts_num = (strcmp(bts_str, "*") == 0)? -1 : atoi(bts_str);</span><br><span style="color: hsl(120, 100%, 40%);">+      int trx_num = (strcmp(trx_str, "*") == 0)? -1 : atoi(trx_str);</span><br><span style="color: hsl(120, 100%, 40%);">+      int ts_num = (strcmp(ts_str, "*") == 0)? -1 : atoi(ts_str);</span><br><span style="color: hsl(120, 100%, 40%);">+ int ss_num = (strcmp(ss_str, "*") == 0)? -1 : atoi(ss_str);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       int bts_i;</span><br><span style="color: hsl(120, 100%, 40%);">+    int trx_i;</span><br><span style="color: hsl(120, 100%, 40%);">+    int ts_i;</span><br><span style="color: hsl(120, 100%, 40%);">+     int ss_i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (bts_i = ((bts_num == -1) ? 0 : bts_num);</span><br><span style="color: hsl(120, 100%, 40%);">+      bts_i < ((bts_num == -1) ? bsc_gsmnet->num_bts : bts_num + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          bts_i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               struct gsm_bts *bts = gsm_bts_num(bsc_gsmnet, bts_i);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               for (trx_i = ((trx_num == -1) ? 0 : trx_num);</span><br><span style="color: hsl(120, 100%, 40%);">+              trx_i < ((trx_num == -1) ? bts->num_trx : trx_num + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                 trx_i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, trx_i);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                      for (ts_i = ((ts_num == -1) ? 0 : ts_num);</span><br><span style="color: hsl(120, 100%, 40%);">+                         ts_i < ((ts_num == -1) ? 8 : ts_num + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                          ts_i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                struct gsm_bts_trx_ts *ts = &trx->ts[ts_i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                          for (ss_i = ((ss_num == -1) ? 0 : ss_num);</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ss_i < ((ss_num == -1) ? pchan_subslots(ts->pchan_is) : ss_num + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                                    ss_i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        cb(&ts->lchan[ss_i], cb_data);</span><br><span style="color: hsl(120, 100%, 40%);">+                         }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int vty_step = 1;</span><br><span> </span><br><span> #define VTY_ECHO() \</span><br><span>@@ -814,18 +858,24 @@</span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int _meas_rep(struct vty *vty, int argc, const char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+struct meas_rep_data {</span><br><span style="color: hsl(120, 100%, 40%);">+        int argc;</span><br><span style="color: hsl(120, 100%, 40%);">+     const char **argv;</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%);">+static void _meas_rep_cb(struct gsm_lchan *lc, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_lchan *lc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct meas_rep_data *d = data;</span><br><span style="color: hsl(120, 100%, 40%);">+       int argc = d->argc;</span><br><span style="color: hsl(120, 100%, 40%);">+        const char **argv = d->argv;</span><br><span>      uint8_t rxlev;</span><br><span>       uint8_t rxqual;</span><br><span>      uint8_t ta;</span><br><span>  int i;</span><br><span>       struct neighbor_meas nm[6] = {};</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    lc = parse_lchan_args(argv);</span><br><span style="color: hsl(0, 100%, 40%);">-    argv += 4;</span><br><span style="color: hsl(0, 100%, 40%);">-      argc -= 4;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!lchan_state_is(lc, LCHAN_ST_ESTABLISHED))</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span> </span><br><span>  rxlev = atoi(argv[0]);</span><br><span>       rxqual = atoi(argv[1]);</span><br><span>@@ -863,14 +913,24 @@</span><br><span>                              nm[i].rxlev);</span><br><span>        }</span><br><span>    gen_meas_rep(lc, rxlev, rxqual, ta, argc, nm);</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%);">+static int _meas_rep(struct vty *vty, int argc, const char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct meas_rep_data d = {</span><br><span style="color: hsl(120, 100%, 40%);">+            .argc = argc - 4,</span><br><span style="color: hsl(120, 100%, 40%);">+             .argv = argv + 4,</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span style="color: hsl(120, 100%, 40%);">+    parse_lchan_wildcard_args(argv, _meas_rep_cb, &d);</span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MEAS_REP_ARGS  LCHAN_ARGS " rxlev <0-255> rxqual <0-7> ta <0-255>" \</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MEAS_REP_ARGS  LCHAN_WILDCARD_ARGS " rxlev <0-255> rxqual <0-7> ta <0-255>" \</span><br><span>    " [neighbors] [<0-255>] [<0-255>] [<0-255>] [<0-255>] [<0-255>] [<0-255>]"</span><br><span> #define MEAS_REP_DOC "Send measurement report\n"</span><br><span> #define MEAS_REP_ARGS_DOC \</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_ARGS_DOC \</span><br><span style="color: hsl(120, 100%, 40%);">+      LCHAN_WILDCARD_ARGS_DOC \</span><br><span>       "rxlev\nrxlev\n" \</span><br><span>       "rxqual\nrxqual\n" \</span><br><span>       "timing advance\ntiming advance\n" \</span><br><span>diff --git a/tests/handover/test_balance_congestion_2.ho_vty b/tests/handover/test_balance_congestion_2.ho_vty</span><br><span>index 9c8b7f9..b157478 100644</span><br><span>--- a/tests/handover/test_balance_congestion_2.ho_vty</span><br><span>+++ b/tests/handover/test_balance_congestion_2.ho_vty</span><br><span>@@ -8,14 +8,9 @@</span><br><span> codec tch/f FR</span><br><span> set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - - - -</span><br><span> set-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan * * * * rxlev 30 rxqual 0 ta 0 neighbors 20</span><br><span> meas-rep lchan 0 0 2 0 rxlev 30 rxqual 0 ta 0 neighbors 21</span><br><span> expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 3 0 rxlev 30 rxqual 0 ta 0 neighbors 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 1 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span> congestion-check</span><br><span> expect-ho from lchan 0 0 2 0 to lchan 1 0 2 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F -     TCH/F - - - -</span><br><span>diff --git a/tests/handover/test_congestion.ho_vty b/tests/handover/test_congestion.ho_vty</span><br><span>index 09815e3..529b8de 100644</span><br><span>--- a/tests/handover/test_congestion.ho_vty</span><br><span>+++ b/tests/handover/test_congestion.ho_vty</span><br><span>@@ -9,20 +9,9 @@</span><br><span>  handover2 min-free-slots tch/h 2</span><br><span> set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - TCH/HH - -</span><br><span> set-ts-use trx 1 0 states * TCH/F -     -     - TCH/H- - -</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 2 0 rxlev 30 rxqual 0 ta 0 neighbors 20 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan * * * * rxlev 30 rxqual 0 ta 0 neighbors 20 20</span><br><span> meas-rep lchan 0 0 3 0 rxlev 30 rxqual 0 ta 0 neighbors 21 20</span><br><span> expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 5 1 rxlev 30 rxqual 0 ta 0 neighbors 20 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 1 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 1 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span> expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - TCH/HH - -</span><br><span> expect-ts-use trx 1 0 states * TCH/F -     -     - TCH/H- - -</span><br><span> congestion-check</span><br><span>diff --git a/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment.ho_vty b/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment.ho_vty</span><br><span>index 3ae5997..f94ad0e 100644</span><br><span>--- a/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment.ho_vty</span><br><span>+++ b/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment.ho_vty</span><br><span>@@ -12,10 +12,7 @@</span><br><span> set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch pdch pdch</span><br><span> </span><br><span> # (there must be at leas one measurement report on each lchan for congestion check to work)</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 1 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 2 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 3 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 4 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan * * * * rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span> </span><br><span> congestion-check</span><br><span> expect-no-chan</span><br><span>diff --git a/tests/handover/test_dyn_ts_favor_moving_half_used_tch_h.ho_vty b/tests/handover/test_dyn_ts_favor_moving_half_used_tch_h.ho_vty</span><br><span>index 794bbef..3d1b009 100644</span><br><span>--- a/tests/handover/test_dyn_ts_favor_moving_half_used_tch_h.ho_vty</span><br><span>+++ b/tests/handover/test_dyn_ts_favor_moving_half_used_tch_h.ho_vty</span><br><span>@@ -8,10 +8,7 @@</span><br><span> </span><br><span> # Test with identical rxlev across lchans (trivial and unrealistic)</span><br><span> set-ts-use    trx 0 0     states *    pdch  TCH/HH TCH/H- TCH/HH pdch - -</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 2 1 rxlev 30 rxqual 0 ta 0</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 3 0 rxlev 30 rxqual 0 ta 0</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 4 0 rxlev 30 rxqual 0 ta 0</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 4 1 rxlev 30 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan * * * * rxlev 30 rxqual 0 ta 0</span><br><span> congestion-check</span><br><span> expect-ho from lchan 0 0 3 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0     states *    TCH/F TCH/HH pdch TCH/HH pdch - -</span><br><span>diff --git a/tests/handover/test_no_congestion.ho_vty b/tests/handover/test_no_congestion.ho_vty</span><br><span>index 651d648..c8328c6 100644</span><br><span>--- a/tests/handover/test_no_congestion.ho_vty</span><br><span>+++ b/tests/handover/test_no_congestion.ho_vty</span><br><span>@@ -8,17 +8,7 @@</span><br><span>  handover2 min-free-slots tch/h 2</span><br><span> set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/HH - -</span><br><span> set-ts-use trx 1 0 states * TCH/F -     - - TCH/H- - -</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 2 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 0 0 5 1 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 1 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(0, 100%, 40%);">-meas-rep lchan 1 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan * * * * rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span> expect-no-chan</span><br><span> congestion-check</span><br><span> expect-no-chan</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/22082">change 22082</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/+/22082"/><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: I441f92348508d45e1069a3dfa1ff3842dbba97d6 </div>
<div style="display:none"> Gerrit-Change-Number: 22082 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </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: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>