<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24364">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hodec 2: do intra-cell congestion resolution by Assignment<br><br>So far we do all channel reassignments by Handover Command. Since<br>osmo-bsc now supports rassignment of ongoing voice calls, do intra-cell<br>congestion resolution by Assignment Command.<br><br>In effect, add support for expecting an Assignment Command in<br>handover_test, and expect assignments instead of handovers for<br>intra-cell congestion resolution test cases.<br><br>Related: SYS#5330 OS#3277<br>Change-Id: Id56a890106b93fcee67ac9401b890e7b63bba421<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/handover_decision_2.c<br>M tests/handover/handover_test.c<br>M tests/handover/test_amr_tch_f_to_h_congestion_assignment.ho_vty<br>M tests/handover/test_amr_tch_f_to_h_congestion_assignment_2.ho_vty<br>M tests/handover/test_amr_tch_f_to_h_congestion_assignment_3.ho_vty<br>M tests/handover/test_amr_tch_h_to_f_congestion.ho_vty<br>M tests/handover/test_amr_tch_h_to_f_congestion_two_cells.ho_vty<br>M tests/handover/test_balance_congestion_tchf_tchh.ho_vty<br>M tests/handover/test_congestion_intra_vs_inter_cell.ho_vty<br>M tests/handover/test_disabled_ho_and_as.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_amr_tch_f_to_h_congestion_assignment_2.ho_vty<br>M tests/handover/test_dyn_ts_amr_tch_h_to_f_congestion_assignment_2.ho_vty<br>M tests/handover/test_dyn_ts_favor_moving_half_used_tch_h.ho_vty<br>16 files changed, 172 insertions(+), 50 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/64/24364/1</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 58ec124..348735e 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -130,6 +130,7 @@</span><br><span> enum assign_for {</span><br><span>        ASSIGN_FOR_NONE,</span><br><span>     ASSIGN_FOR_BSSMAP_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+        ASSIGN_FOR_CONGESTION_RESOLUTION,</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/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index c45800a..02dce99 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -940,6 +940,7 @@</span><br><span> const struct value_string assign_for_names[] = {</span><br><span>       OSMO_VALUE_STRING(ASSIGN_FOR_NONE),</span><br><span>  OSMO_VALUE_STRING(ASSIGN_FOR_BSSMAP_REQ),</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_VALUE_STRING(ASSIGN_FOR_CONGESTION_RESOLUTION),</span><br><span>         {}</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/handover_decision_2.c b/src/osmo-bsc/handover_decision_2.c</span><br><span>index d0bd87b..1ebc853 100644</span><br><span>--- a/src/osmo-bsc/handover_decision_2.c</span><br><span>+++ b/src/osmo-bsc/handover_decision_2.c</span><br><span>@@ -29,6 +29,7 @@</span><br><span> </span><br><span> #include <osmocom/bsc/debug.h></span><br><span> #include <osmocom/bsc/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/assignment_fsm.h></span><br><span> #include <osmocom/bsc/handover_fsm.h></span><br><span> #include <osmocom/bsc/handover_decision.h></span><br><span> #include <osmocom/bsc/handover_decision_2.h></span><br><span>@@ -812,7 +813,6 @@</span><br><span> /* Trigger handover or assignment depending on the target BTS */</span><br><span> static int trigger_local_ho_or_as(struct ho_candidate *c, uint8_t requirements)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct handover_out_req req;</span><br><span>         int afs_bias = 0;</span><br><span>    bool full_rate = false;</span><br><span> </span><br><span>@@ -868,23 +868,25 @@</span><br><span>  }</span><br><span> </span><br><span>        /* trigger handover or assignment */</span><br><span style="color: hsl(0, 100%, 40%);">-    if  (c->current.bts == c->target.bts)</span><br><span style="color: hsl(120, 100%, 40%);">+   if  (c->current.bts == c->target.bts) {</span><br><span>                LOGPHOLCHAN(c->current.lchan, LOGL_NOTICE, "Triggering assignment to %s, due to %s\n",</span><br><span>                      full_rate ? "TCH/F" : "TCH/H",</span><br><span>                           ho_reason_name(global_ho_reason));</span><br><span style="color: hsl(0, 100%, 40%);">-  else</span><br><span style="color: hsl(120, 100%, 40%);">+          reassignment_request_to_chan_type(ASSIGN_FOR_CONGESTION_RESOLUTION, c->current.lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                full_rate? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct handover_out_req req = {</span><br><span style="color: hsl(120, 100%, 40%);">+                       .from_hodec_id = HODEC2,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .old_lchan = c->current.lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                     .new_lchan_type = full_rate? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H,</span><br><span style="color: hsl(120, 100%, 40%);">+               };</span><br><span style="color: hsl(120, 100%, 40%);">+            bts_cell_ab(&req.target_cell_ab, c->target.bts);</span><br><span>              LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_INFO,</span><br><span>                            "Triggering handover to %s, due to %s\n",</span><br><span>                                  full_rate ? "TCH/F" : "TCH/H",</span><br><span>                           ho_reason_name(global_ho_reason));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     req = (struct handover_out_req){</span><br><span style="color: hsl(0, 100%, 40%);">-                .from_hodec_id = HODEC2,</span><br><span style="color: hsl(0, 100%, 40%);">-                .old_lchan = c->current.lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-               .new_lchan_type = full_rate? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H,</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-      bts_cell_ab(&req.target_cell_ab, c->target.bts);</span><br><span style="color: hsl(0, 100%, 40%);">- handover_request(&req);</span><br><span style="color: hsl(120, 100%, 40%);">+           handover_request(&req);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index 9bfb789..d47e97a 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -35,6 +35,7 @@</span><br><span> #include <osmocom/bsc/bsc_subscriber.h></span><br><span> #include <osmocom/bsc/lchan_select.h></span><br><span> #include <osmocom/bsc/lchan_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/assignment_fsm.h></span><br><span> #include <osmocom/bsc/handover_decision.h></span><br><span> #include <osmocom/bsc/system_information.h></span><br><span> #include <osmocom/bsc/handover.h></span><br><span>@@ -372,6 +373,10 @@</span><br><span>    snprintf(imsi, sizeof(imsi), "%06u", next_imsi);</span><br><span>   lchan->conn->bsub = bsc_subscr_find_or_create_by_imsi(net->bsc_subscribers, imsi, BSUB_USE_CONN);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        /* Set RTP data that the MSC normally would have sent */</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_STRLCPY_ARRAY(conn->user_plane.msc_assigned_rtp_addr, "1.2.3.4");</span><br><span style="color: hsl(120, 100%, 40%);">+   conn->user_plane.msc_assigned_rtp_port = 1234;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* kick the FSM from INIT through to the ACTIVE state */</span><br><span>     osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_MO_COMPL_L3, NULL);</span><br><span>     osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_A_CONN_CFM, NULL);</span><br><span>@@ -535,6 +540,9 @@</span><br><span> static struct gsm_lchan *new_ho_cmd = NULL;</span><br><span> static struct gsm_lchan *last_ho_cmd = NULL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsm_lchan *new_as_cmd = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsm_lchan *last_as_cmd = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</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> {</span><br><span>@@ -553,6 +561,44 @@</span><br><span>    abis_rsl_rcvmsg(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Send RR Assignment Complete for SAPI[0] */</span><br><span style="color: hsl(120, 100%, 40%);">+static void send_assignment_complete(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct msgb *msg = msgb_alloc_headroom(256, 64, "RSL");</span><br><span style="color: hsl(120, 100%, 40%);">+     struct abis_rsl_rll_hdr *rh;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t *buf;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_hdr *gh;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_ho_cpl *hc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    fprintf(stderr, "- Send RR Assignment Complete for %s\n", gsm_lchan_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rh = (struct abis_rsl_rll_hdr *) msgb_put(msg, sizeof(*rh));</span><br><span style="color: hsl(120, 100%, 40%);">+  rh->c.msg_discr = ABIS_RSL_MDISC_RLL;</span><br><span style="color: hsl(120, 100%, 40%);">+      rh->c.msg_type = RSL_MT_DATA_IND;</span><br><span style="color: hsl(120, 100%, 40%);">+  rh->ie_chan = RSL_IE_CHAN_NR;</span><br><span style="color: hsl(120, 100%, 40%);">+      rh->chan_nr = chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+     rh->ie_link_id = RSL_IE_LINK_IDENT;</span><br><span style="color: hsl(120, 100%, 40%);">+        rh->link_id = 0x00;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      buf = msgb_put(msg, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+       buf[0] = RSL_IE_L3_INFO;</span><br><span style="color: hsl(120, 100%, 40%);">+      buf[1] = (sizeof(*gh) + sizeof(*hc)) >> 8;</span><br><span style="color: hsl(120, 100%, 40%);">+      buf[2] = (sizeof(*gh) + sizeof(*hc)) & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh));</span><br><span style="color: hsl(120, 100%, 40%);">+ hc = (struct gsm48_ho_cpl *) msgb_put(msg, sizeof(*hc));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    gh->proto_discr = GSM48_PDISC_RR;</span><br><span style="color: hsl(120, 100%, 40%);">+  gh->msg_type = GSM48_MT_RR_ASS_COMPL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    msg->dst = lchan->ts->trx->rsl_link;</span><br><span style="color: hsl(120, 100%, 40%);">+      msg->l2h = (unsigned char *)rh;</span><br><span style="color: hsl(120, 100%, 40%);">+    msg->l3h = (unsigned char *)gh;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  abis_rsl_rcvmsg(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Send RLL Est Ind for SAPI[0] */</span><br><span> static void send_est_ind(struct gsm_lchan *lchan)</span><br><span> {</span><br><span>@@ -700,14 +746,21 @@</span><br><span>           gh = (struct gsm48_hdr*)msg->l3h;</span><br><span>                 switch (gh->msg_type) {</span><br><span>           case GSM48_MT_RR_HANDO_CMD:</span><br><span style="color: hsl(0, 100%, 40%);">-             case GSM48_MT_RR_ASS_CMD:</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (new_ho_cmd) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (new_ho_cmd || new_as_cmd) {</span><br><span>                              fprintf(stderr, "Test script is erratic: seen a Handover Command"</span><br><span style="color: hsl(0, 100%, 40%);">-                                     " while a previous Handover Command is still unhandled\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                 " while a previous Assignment or Handover Command is still unhandled\n");</span><br><span>                          exit(1);</span><br><span>                     }</span><br><span>                    new_ho_cmd = lchan;</span><br><span>                  break;</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_cmd || new_as_cmd) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               fprintf(stderr, "Test script is erratic: seen an Assignment Command"</span><br><span style="color: hsl(120, 100%, 40%);">+                                        " while a previous Assignment or Handover Command 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_as_cmd = lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span>               }</span><br><span>            break;</span><br><span>       case RSL_MT_IPAC_CRCX:</span><br><span>@@ -1017,22 +1070,40 @@</span><br><span> </span><br><span> static void _expect_ho_cmd(struct gsm_lchan *lchan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        fprintf(stderr, "- Expecting Handover/Assignment Command at %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+  fprintf(stderr, "- Expecting Handover Command at %s\n",</span><br><span>            gsm_lchan_name(lchan));</span><br><span> </span><br><span>  if (!new_ho_cmd) {</span><br><span>           fprintf(stderr, "Test failed, no Handover Command\n");</span><br><span>             exit(1);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       fprintf(stderr, " * Got Handover/Assignment Command at %s\n", gsm_lchan_name(new_ho_cmd));</span><br><span style="color: hsl(120, 100%, 40%);">+  fprintf(stderr, " * Got Handover Command at %s\n", gsm_lchan_name(new_ho_cmd));</span><br><span>    if (new_ho_cmd != lchan) {</span><br><span style="color: hsl(0, 100%, 40%);">-              fprintf(stderr, "Test failed, Handover/Assignment Command not on the expected lchan\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, "Test failed, Handover Command not on the expected lchan\n");</span><br><span>              exit(1);</span><br><span>     }</span><br><span>    last_ho_cmd = new_ho_cmd;</span><br><span>    new_ho_cmd = NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void _expect_as_cmd(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   fprintf(stderr, "- Expecting Assignment Command at %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           gsm_lchan_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!new_as_cmd) {</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, "Test failed, no Assignment Command\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%);">+     fprintf(stderr, " * Got Assignment Command at %s\n", gsm_lchan_name(new_as_cmd));</span><br><span style="color: hsl(120, 100%, 40%);">+   if (new_as_cmd != lchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, "Test failed, Assignment Command not on the expected lchan\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%);">+     last_as_cmd = new_as_cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+     new_as_cmd = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(expect_chan, expect_chan_cmd,</span><br><span>       "expect-chan " LCHAN_ARGS,</span><br><span>       "Expect RSL Channel Activation of a specific lchan\n"</span><br><span>@@ -1053,6 +1124,16 @@</span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(expect_assignment_command, expect_assignment_command_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "expect-as-cmd " LCHAN_ARGS,</span><br><span style="color: hsl(120, 100%, 40%);">+      "Expect Assignment Command for a given lchan\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      LCHAN_ARGS_DOC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        VTY_ECHO();</span><br><span style="color: hsl(120, 100%, 40%);">+   _expect_as_cmd(parse_lchan_args(argv));</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(ho_detection, ho_detection_cmd,</span><br><span>       "ho-detect",</span><br><span>       "Send Handover Detection to the most recent HO target lchan\n")</span><br><span>@@ -1089,7 +1170,7 @@</span><br><span>       "Expect a handover of a specific lchan to a specific target lchan;"</span><br><span>       " shorthand for expect-chan, ack-chan, expect-ho, ho-complete.\n"</span><br><span>       "lchan to handover from\n" LCHAN_ARGS_DOC</span><br><span style="color: hsl(0, 100%, 40%);">-      "lchan that to handover to\n" LCHAN_ARGS_DOC)</span><br><span style="color: hsl(120, 100%, 40%);">+      "lchan to handover to\n" LCHAN_ARGS_DOC)</span><br><span> {</span><br><span>    struct gsm_lchan *from = parse_lchan_args(argv);</span><br><span>     struct gsm_lchan *to = parse_lchan_args(argv+4);</span><br><span>@@ -1099,6 +1180,31 @@</span><br><span>    _expect_ho_cmd(from);</span><br><span>        send_ho_detect(to);</span><br><span>  send_ho_complete(to, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan_release_ack(from);</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 style="color: hsl(120, 100%, 40%);">+DEFUN(expect_as, expect_as_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "expect-as from " LCHAN_ARGS " to " LCHAN_ARGS,</span><br><span style="color: hsl(120, 100%, 40%);">+      "Expect an intra-cell re-assignment of a specific lchan to a specific target lchan;"</span><br><span style="color: hsl(120, 100%, 40%);">+      " shorthand for expect-chan, ack-chan, expect-as, TODO.\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "lchan to be re-assigned elsewhere\n" LCHAN_ARGS_DOC</span><br><span style="color: hsl(120, 100%, 40%);">+      "new lchan to re-assign to\n" LCHAN_ARGS_DOC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_lchan *from = parse_lchan_args(argv);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_lchan *to = parse_lchan_args(argv+4);</span><br><span style="color: hsl(120, 100%, 40%);">+      VTY_ECHO();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ _expect_chan_activ(to);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (from->ts->trx->bts != to->ts->trx->bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "%% Error: re-assignment only works within the same BTS%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%);">+     _expect_as_cmd(from);</span><br><span style="color: hsl(120, 100%, 40%);">+ send_assignment_complete(to);</span><br><span style="color: hsl(120, 100%, 40%);">+ send_est_ind(to);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  lchan_release_ack(from);</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -1188,9 +1294,11 @@</span><br><span>    install_element(CONFIG_NODE, &expect_no_chan_cmd);</span><br><span>       install_element(CONFIG_NODE, &expect_chan_cmd);</span><br><span>  install_element(CONFIG_NODE, &expect_handover_command_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(CONFIG_NODE, &expect_assignment_command_cmd);</span><br><span>    install_element(CONFIG_NODE, &ho_detection_cmd);</span><br><span>         install_element(CONFIG_NODE, &ho_complete_cmd);</span><br><span>  install_element(CONFIG_NODE, &expect_ho_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(CONFIG_NODE, &expect_as_cmd);</span><br><span>    install_element(CONFIG_NODE, &ho_failed_cmd);</span><br><span>    install_element(CONFIG_NODE, &expect_ts_use_cmd);</span><br><span>        install_element(CONFIG_NODE, &codec_f_cmd);</span><br><span>@@ -1309,7 +1417,8 @@</span><br><span> </span><br><span>  osmo_init_logging2(ctx, &log_info);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);</span><br><span style="color: hsl(120, 100%, 40%);">+       log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_BASENAME);</span><br><span style="color: hsl(120, 100%, 40%);">+   log_set_print_filename_pos(osmo_stderr_target, LOG_FILENAME_POS_LINE_END);</span><br><span>   log_set_print_category(osmo_stderr_target, 1);</span><br><span>       log_set_print_category_hex(osmo_stderr_target, 0);</span><br><span>   log_set_print_level(osmo_stderr_target, 1);</span><br><span>@@ -1328,6 +1437,7 @@</span><br><span>  lchan_fsm_init();</span><br><span>    bsc_subscr_conn_fsm_init();</span><br><span>  handover_fsm_init();</span><br><span style="color: hsl(120, 100%, 40%);">+  assignment_fsm_init();</span><br><span> </span><br><span>   ho_set_algorithm(bsc_gsmnet->ho, 2);</span><br><span>      ho_set_ho_active(bsc_gsmnet->ho, true);</span><br><span>@@ -1416,3 +1526,12 @@</span><br><span> {</span><br><span>     return "fake-ci";</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+const struct mgcp_conn_peer *osmo_mgcpc_ep_ci_get_rtp_info(const struct osmo_mgcpc_ep_ci *ci)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    static struct mgcp_conn_peer ret = {</span><br><span style="color: hsl(120, 100%, 40%);">+          .addr = "1.2.3.4",</span><br><span style="color: hsl(120, 100%, 40%);">+          .port = 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         .endpoint = "fake-endpoint",</span><br><span style="color: hsl(120, 100%, 40%);">+        };</span><br><span style="color: hsl(120, 100%, 40%);">+    return &ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/handover/test_amr_tch_f_to_h_congestion_assignment.ho_vty b/tests/handover/test_amr_tch_f_to_h_congestion_assignment.ho_vty</span><br><span>index d6515fc..84f34ff 100644</span><br><span>--- a/tests/handover/test_amr_tch_f_to_h_congestion_assignment.ho_vty</span><br><span>+++ b/tests/handover/test_amr_tch_f_to_h_congestion_assignment.ho_vty</span><br><span>@@ -14,6 +14,5 @@</span><br><span> meas-rep lchan 0 0 6 0 rxlev 20 rxqual 0 ta 0</span><br><span> expect-no-chan</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 6 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F - - - TCH/HH - -</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/tests/handover/test_amr_tch_f_to_h_congestion_assignment_2.ho_vty b/tests/handover/test_amr_tch_f_to_h_congestion_assignment_2.ho_vty</span><br><span>index e7778d0..2fa08da 100644</span><br><span>--- a/tests/handover/test_amr_tch_f_to_h_congestion_assignment_2.ho_vty</span><br><span>+++ b/tests/handover/test_amr_tch_f_to_h_congestion_assignment_2.ho_vty</span><br><span>@@ -15,10 +15,10 @@</span><br><span> meas-rep lchan 0 0 6 0 rxlev 20 rxqual 0 ta 0</span><br><span> expect-no-chan</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 6 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F - - - TCH/HH - -</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 5 0 to lchan 0 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 5 0 to lchan 0 0 2 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/-H - -</span><br><span> congestion-check</span><br><span> expect-no-chan</span><br><span>diff --git a/tests/handover/test_amr_tch_f_to_h_congestion_assignment_3.ho_vty b/tests/handover/test_amr_tch_f_to_h_congestion_assignment_3.ho_vty</span><br><span>index ffa3614..0dca250 100644</span><br><span>--- a/tests/handover/test_amr_tch_f_to_h_congestion_assignment_3.ho_vty</span><br><span>+++ b/tests/handover/test_amr_tch_f_to_h_congestion_assignment_3.ho_vty</span><br><span>@@ -10,6 +10,6 @@</span><br><span> meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 30</span><br><span> expect-no-chan</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 1 0 to lchan 0 0 5 1</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 1 0 to lchan 0 0 5 1</span><br><span> expect-ts-use trx 0 0 states * - TCH/F - - TCH/HH - -</span><br><span> </span><br><span>diff --git a/tests/handover/test_amr_tch_h_to_f_congestion.ho_vty b/tests/handover/test_amr_tch_h_to_f_congestion.ho_vty</span><br><span>index 4d1194c..0252d9f 100644</span><br><span>--- a/tests/handover/test_amr_tch_h_to_f_congestion.ho_vty</span><br><span>+++ b/tests/handover/test_amr_tch_h_to_f_congestion.ho_vty</span><br><span>@@ -10,5 +10,5 @@</span><br><span> meas-rep lchan 0 0 4 0 rxlev 30 rxqual 0 ta 0</span><br><span> expect-no-chan</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 4 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F - - - - - *</span><br><span>diff --git a/tests/handover/test_amr_tch_h_to_f_congestion_two_cells.ho_vty b/tests/handover/test_amr_tch_h_to_f_congestion_two_cells.ho_vty</span><br><span>index 7cbcd4b..fecd068 100644</span><br><span>--- a/tests/handover/test_amr_tch_h_to_f_congestion_two_cells.ho_vty</span><br><span>+++ b/tests/handover/test_amr_tch_h_to_f_congestion_two_cells.ho_vty</span><br><span>@@ -12,6 +12,6 @@</span><br><span> meas-rep repeat 10 lchan 1 0 4 0 rxlev 30 rxqual 0 ta 0 neighbors 20</span><br><span> expect-no-chan</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 1 0 4 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 1 0 4 0 to lchan 1 0 1 0</span><br><span> expect-ts-use trx 0 0 states * - - - - - - *</span><br><span> expect-ts-use trx 1 0 states * TCH/F - - - - - *</span><br><span>diff --git a/tests/handover/test_balance_congestion_tchf_tchh.ho_vty b/tests/handover/test_balance_congestion_tchf_tchh.ho_vty</span><br><span>index 62f07bf..f151b2a 100644</span><br><span>--- a/tests/handover/test_balance_congestion_tchf_tchh.ho_vty</span><br><span>+++ b/tests/handover/test_balance_congestion_tchf_tchh.ho_vty</span><br><span>@@ -23,7 +23,7 @@</span><br><span> set-ts-use trx 0 0 states           *       TCH/F   TCH/F   -       -       TCH/HH  TCH/HH  TCH/HH</span><br><span> meas-rep lchan * * * * rxlev 10 rxqual 0 ta 0</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 5 0 to lchan 0 0 3 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 5 0 to lchan 0 0 3 0</span><br><span> </span><br><span> # Now similar load percentages, just with different min-free-slots settings for tch/f vs tch/h.</span><br><span> </span><br><span>@@ -50,4 +50,4 @@</span><br><span> set-ts-use trx 0 0 states             *       TCH/F   TCH/F   -       -       TCH/HH  TCH/HH  TCH/H-</span><br><span> meas-rep lchan * * * * rxlev 20 rxqual 0 ta 0</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 5 0 to lchan 0 0 3 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 5 0 to lchan 0 0 3 0</span><br><span>diff --git a/tests/handover/test_congestion_intra_vs_inter_cell.ho_vty b/tests/handover/test_congestion_intra_vs_inter_cell.ho_vty</span><br><span>index d93f56c..ddf6802 100644</span><br><span>--- a/tests/handover/test_congestion_intra_vs_inter_cell.ho_vty</span><br><span>+++ b/tests/handover/test_congestion_intra_vs_inter_cell.ho_vty</span><br><span>@@ -12,7 +12,7 @@</span><br><span> expect-no-chan</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 6 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F - - - TCH/H- - *</span><br><span> expect-ts-use trx 1 0 states * - - - - - - *</span><br><span> </span><br><span>@@ -27,7 +27,7 @@</span><br><span> expect-no-chan</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F - - - - TCH/H- *</span><br><span> expect-ts-use trx 1 0 states * - - - - - - *</span><br><span> </span><br><span>@@ -42,7 +42,7 @@</span><br><span> expect-no-chan</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F - - - - TCH/H- *</span><br><span> expect-ts-use trx 1 0 states * - - - - - - *</span><br><span> </span><br><span>@@ -57,7 +57,7 @@</span><br><span> expect-no-chan</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F - - - - TCH/H- *</span><br><span> expect-ts-use trx 1 0 states * - - - - - - *</span><br><span> </span><br><span>@@ -72,7 +72,7 @@</span><br><span> expect-no-chan</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F - - - - TCH/H- *</span><br><span> expect-ts-use trx 1 0 states * - - - - - - *</span><br><span> </span><br><span>@@ -87,7 +87,7 @@</span><br><span> expect-no-chan</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 6 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F - - - TCH/H- - *</span><br><span> expect-ts-use trx 1 0 states * - - - - - - *</span><br><span> </span><br><span>diff --git a/tests/handover/test_disabled_ho_and_as.ho_vty b/tests/handover/test_disabled_ho_and_as.ho_vty</span><br><span>index ffd0311..586c3a7 100644</span><br><span>--- a/tests/handover/test_disabled_ho_and_as.ho_vty</span><br><span>+++ b/tests/handover/test_disabled_ho_and_as.ho_vty</span><br><span>@@ -19,7 +19,7 @@</span><br><span>  bts 0</span><br><span>   handover2 assignment 1</span><br><span> meas-rep lchan 0 0 5 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span> network</span><br><span>  bts 0</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 85b00e8..6990132 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>@@ -22,11 +22,11 @@</span><br><span> expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F TCH/F pdch *</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 5 0 to lchan 0 0 6 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 5 0 to lchan 0 0 6 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch TCH/H- *</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 4 0 to lchan 0 0 6 1</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 6 1</span><br><span> expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch pdch TCH/HH *</span><br><span> </span><br><span> congestion-check</span><br><span>@@ -37,11 +37,11 @@</span><br><span> expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch TCH/HH *</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 4 0 to lchan 0 0 5 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 5 0</span><br><span> expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch TCH/H- TCH/HH *</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 1 0 to lchan 0 0 5 1</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 1 0 to lchan 0 0 5 1</span><br><span> expect-ts-use trx 0 0 states * - TCH/F TCH/F pdch TCH/HH TCH/HH *</span><br><span> </span><br><span> congestion-check</span><br><span>@@ -52,11 +52,11 @@</span><br><span> expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch TCH/HH TCH/HH *</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 1 0 to lchan 0 0 4 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 1 0 to lchan 0 0 4 0</span><br><span> expect-ts-use trx 0 0 states * - TCH/F TCH/F TCH/H- TCH/HH TCH/HH *</span><br><span> </span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 2 0 to lchan 0 0 4 1</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 2 0 to lchan 0 0 4 1</span><br><span> expect-ts-use trx 0 0 states * - - TCH/F TCH/HH TCH/HH TCH/HH *</span><br><span> </span><br><span> congestion-check</span><br><span>diff --git a/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment_2.ho_vty b/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment_2.ho_vty</span><br><span>index a798457..08bc151 100644</span><br><span>--- a/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment_2.ho_vty</span><br><span>+++ b/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment_2.ho_vty</span><br><span>@@ -14,14 +14,14 @@</span><br><span> # (there must be at least one measurement report on each lchan for congestion check to work)</span><br><span> meas-rep lchan * * * * rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 1 0 to lchan 0 0 4 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 1 0 to lchan 0 0 4 0</span><br><span> expect-ts-use trx 0 0 states * pdch - - TCH/H- * * *</span><br><span> </span><br><span> # Again with one more TCH/H occupied, there will still be two free TCH/H after HO on the dyn TS</span><br><span> set-ts-use trx 0 0 states * TCH/F - - TCH/H- * * *</span><br><span> meas-rep lchan * * * * rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 1 0 to lchan 0 0 4 1</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 1 0 to lchan 0 0 4 1</span><br><span> expect-ts-use trx 0 0 states * pdch - - TCH/HH * * *</span><br><span> </span><br><span> # Again, with the target being a dyn TS</span><br><span>@@ -36,12 +36,12 @@</span><br><span> set-ts-use trx 1 0 states * TCH/F TCH/F - pdch * * *</span><br><span> meas-rep lchan 1 * * * rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 1 0 1 0 to lchan 1 0 4 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 1 0 1 0 to lchan 1 0 4 0</span><br><span> expect-ts-use trx 1 0 states * pdch TCH/F - TCH/H- * * *</span><br><span> </span><br><span> # Again with one more TCH/H occupied, there will still be two free TCH/H after HO on the dyn TS</span><br><span> set-ts-use trx 1 0 states * TCH/F TCH/F - TCH/H- * * *</span><br><span> meas-rep lchan 1 * * * rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 1 0 1 0 to lchan 1 0 4 1</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 1 0 1 0 to lchan 1 0 4 1</span><br><span> expect-ts-use trx 1 0 states * pdch TCH/F - TCH/HH * * *</span><br><span>diff --git a/tests/handover/test_dyn_ts_amr_tch_h_to_f_congestion_assignment_2.ho_vty b/tests/handover/test_dyn_ts_amr_tch_h_to_f_congestion_assignment_2.ho_vty</span><br><span>index de9595b..bf1edf2 100644</span><br><span>--- a/tests/handover/test_dyn_ts_amr_tch_h_to_f_congestion_assignment_2.ho_vty</span><br><span>+++ b/tests/handover/test_dyn_ts_amr_tch_h_to_f_congestion_assignment_2.ho_vty</span><br><span>@@ -14,14 +14,14 @@</span><br><span> # (there must be at least one measurement report on each lchan for congestion check to work)</span><br><span> meas-rep lchan * * * * rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 1 0 to lchan 0 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 1 0 to lchan 0 0 2 0</span><br><span> expect-ts-use trx 0 0 states * pdch TCH/F - - * * *</span><br><span> </span><br><span> # Again with one more TCH/F occupied, there will still be two free TCH/F after HO on the dyn TS</span><br><span> set-ts-use trx 0 0 states * TCH/H- - - TCH/F * * *</span><br><span> meas-rep lchan * * * * rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 1 0 to lchan 0 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 1 0 to lchan 0 0 2 0</span><br><span> expect-ts-use trx 0 0 states * pdch TCH/F - TCH/F * * *</span><br><span> </span><br><span> # (TCH/H -> TCH/F onto a dyn TS will always make TCH/H congestion worse, so there is no useful test case left here)</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 b25cf96..6548360 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>@@ -10,7 +10,7 @@</span><br><span> set-ts-use    trx 0 0     states *    -     TCH/HH TCH/H- TCH/HH pdch - -</span><br><span> meas-rep lchan * * * * rxlev 30 rxqual 0 ta 0</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 3 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as 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> </span><br><span> # clear measurements for the next run</span><br><span>@@ -24,7 +24,7 @@</span><br><span> meas-rep lchan 0 0 4 0 rxlev 32 rxqual 0 ta 0</span><br><span> meas-rep lchan 0 0 4 1 rxlev 33 rxqual 0 ta 0</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 3 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as 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> </span><br><span> # clear measurements for the next run</span><br><span>@@ -38,5 +38,5 @@</span><br><span> meas-rep lchan 0 0 4 0 rxlev 32 rxqual 0 ta 0</span><br><span> meas-rep lchan 0 0 4 1 rxlev 31 rxqual 0 ta 0</span><br><span> congestion-check</span><br><span style="color: hsl(0, 100%, 40%);">-expect-ho from lchan 0 0 3 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as 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></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24364">change 24364</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/+/24364"/><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: Id56a890106b93fcee67ac9401b890e7b63bba421 </div>
<div style="display:none"> Gerrit-Change-Number: 24364 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>