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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">handover_test: saner ho request handling<br><br>Similar to chan act handling, clarify and safeguard HO Request handling.<br>Ensure that each HO Request is handled by the test script.<br><br>Place unhandled HO Requests in new_ho_req pointer, moving to last_ho_req<br>upon handling it. Instead of the got_ho_req flag and additional<br>ho_req_lchan pointer, just keep a last_ho_req pointer.<br><br>Drop a bunch of utterly useless RSL message parsing code.<br><br>Fix unhandled HO Request in test_max_handovers.ho_vty.<br><br>Change-Id: I0a664f24d7dd3d7b254b29675fdc49cd70a1a480<br>---<br>M tests/handover/handover_test.c<br>M tests/handover/test_max_handovers.ho_vty<br>2 files changed, 29 insertions(+), 50 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 eddf753..167f1ce 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -528,42 +528,8 @@</span><br><span> static struct gsm_lchan *new_chan_req = NULL;</span><br><span> static struct gsm_lchan *last_chan_req = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* parse handover request */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int got_ho_req = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-static struct gsm_lchan *ho_req_lchan = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int parse_ho_command(struct gsm_lchan *lchan, uint8_t *data, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_hdr *gh = (struct gsm48_hdr *) data;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm48_ho_cmd *ho = (struct gsm48_ho_cmd *) gh->data;</span><br><span style="color: hsl(0, 100%, 40%);">-  int arfcn;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts *neigh;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (gh->msg_type) {</span><br><span style="color: hsl(0, 100%, 40%);">-      case GSM48_MT_RR_HANDO_CMD:</span><br><span style="color: hsl(0, 100%, 40%);">-             arfcn = (ho->cell_desc.arfcn_hi << 8) | ho->cell_desc.arfcn_lo;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             /* look up trx. since every dummy bts uses different arfcn and</span><br><span style="color: hsl(0, 100%, 40%);">-           * only one trx, it is simple */</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_for_each_entry(neigh, &bsc_gsmnet->bts_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (neigh->c0->arfcn != arfcn)</span><br><span style="color: hsl(0, 100%, 40%);">-                            continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       ho_req_lchan = lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-                   return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_MT_RR_ASS_CMD:</span><br><span style="color: hsl(0, 100%, 40%);">-               ho_req_lchan = lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-           return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                fprintf(stderr, "Error, expecting HO or AS command\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsm_lchan *new_ho_req = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsm_lchan *last_ho_req = NULL;</span><br><span> </span><br><span> /* send channel activation ack */</span><br><span> static void send_chan_act_ack(struct gsm_lchan *lchan, int act)</span><br><span>@@ -683,6 +649,7 @@</span><br><span>     int rc;</span><br><span>      struct gsm_lchan *lchan = rsl_lchan_lookup(sign_link->trx, dh->chan_nr, &rc);</span><br><span>      struct gsm_lchan *other_lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm48_hdr *gh;</span><br><span> </span><br><span>    if (rc) {</span><br><span>            fprintf(stderr, "rsl_lchan_lookup() failed\n");</span><br><span>@@ -726,9 +693,18 @@</span><br><span> </span><br><span>                 break;</span><br><span>       case RSL_MT_DATA_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-           rc = parse_ho_command(lchan, msg->l3h, msgb_l3len(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-             if (rc == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                    got_ho_req = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               gh = (struct gsm48_hdr*)msg->l3h;</span><br><span style="color: hsl(120, 100%, 40%);">+          switch (gh->msg_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case GSM48_MT_RR_HANDO_CMD:</span><br><span style="color: hsl(120, 100%, 40%);">+           case GSM48_MT_RR_ASS_CMD:</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (new_ho_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             fprintf(stderr, "Test script is erratic: a handover is requested"</span><br><span style="color: hsl(120, 100%, 40%);">+                                   " while a previous handover request is still unhandled\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                         exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     new_ho_req = lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span>            break;</span><br><span>       case RSL_MT_IPAC_CRCX:</span><br><span>               break;</span><br><span>@@ -968,15 +944,17 @@</span><br><span>       fprintf(stderr, "- Expecting handover/assignment request at %s\n",</span><br><span>                 gsm_lchan_name(lchan));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (!got_ho_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!new_ho_req) {</span><br><span>           fprintf(stderr, "Test failed, because no handover was requested\n");</span><br><span>               exit(1);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       fprintf(stderr, " * Got handover/assignment request at %s\n", gsm_lchan_name(ho_req_lchan));</span><br><span style="color: hsl(0, 100%, 40%);">-  if (ho_req_lchan != lchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+  fprintf(stderr, " * Got handover/assignment request at %s\n", gsm_lchan_name(new_ho_req));</span><br><span style="color: hsl(120, 100%, 40%);">+  if (new_ho_req != lchan) {</span><br><span>           fprintf(stderr, "Test failed, because handover/assignment was not commanded on the expected lchan\n");</span><br><span>             exit(1);</span><br><span>     }</span><br><span style="color: hsl(120, 100%, 40%);">+     last_ho_req = new_ho_req;</span><br><span style="color: hsl(120, 100%, 40%);">+     new_ho_req = NULL;</span><br><span> }</span><br><span> </span><br><span> DEFUN(expect_chan, expect_chan_cmd,</span><br><span>@@ -1005,10 +983,6 @@</span><br><span>           fprintf(stderr, "Cannot ack handover/assignment, because no chan request\n");</span><br><span>              exit(1);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!got_ho_req) {</span><br><span style="color: hsl(0, 100%, 40%);">-              fprintf(stderr, "Cannot ack handover/assignment, because no ho request\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span>    send_ho_detect(last_chan_req);</span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -1021,12 +995,12 @@</span><br><span>            fprintf(stderr, "Cannot ack handover/assignment, because no chan request\n");</span><br><span>              exit(1);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!got_ho_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!last_ho_req) {</span><br><span>          fprintf(stderr, "Cannot ack handover/assignment, because no ho request\n");</span><br><span>                exit(1);</span><br><span>     }</span><br><span>    send_ho_complete(last_chan_req, true);</span><br><span style="color: hsl(0, 100%, 40%);">-  lchan_release_ack(ho_req_lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+      lchan_release_ack(last_ho_req);</span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -1056,8 +1030,11 @@</span><br><span>                fprintf(stderr, "Cannot fail handover, because no chan request\n");</span><br><span>                exit(1);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       got_ho_req = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- send_ho_complete(ho_req_lchan, false);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!last_ho_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+           fprintf(stderr, "Cannot fail handover, because no handover request\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     send_ho_complete(last_ho_req, false);</span><br><span>        lchan_release_ack(last_chan_req);</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span>diff --git a/tests/handover/test_max_handovers.ho_vty b/tests/handover/test_max_handovers.ho_vty</span><br><span>index 31482d2..e5d9ef5 100644</span><br><span>--- a/tests/handover/test_max_handovers.ho_vty</span><br><span>+++ b/tests/handover/test_max_handovers.ho_vty</span><br><span>@@ -9,8 +9,10 @@</span><br><span> set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - - - -</span><br><span> meas-rep lchan 0 0 1 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span> expect-chan lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho-req lchan 0 0 1 0</span><br><span> meas-rep lchan 0 0 2 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span> expect-chan lchan 1 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho-req lchan 0 0 2 0</span><br><span> meas-rep lchan 0 0 3 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span> expect-no-chan</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21983">change 21983</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/+/21983"/><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: I0a664f24d7dd3d7b254b29675fdc49cd70a1a480 </div>
<div style="display:none"> Gerrit-Change-Number: 21983 </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>