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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Introduce support for ACC ramping during whole BTS life cycle<br><br>Prior to this patch, ACC ramping was only used to go 0->N in the<br>number of allowed ACCs during BTS startup. It could optionally<br>dynamically stretch or extend the ramping time based on channel load.<br><br>With this patch, ACC ramping is kept alive during the entire time the<br>BTS is active, and subset of allowed ACCs can now be incresed or<br>decreased based on channel load. A new VTY command<br>"access-control-class-ramping-chan-load" is added to configure a lower<br>and an upper threshold. Channel load under the low threshold will<br>potentially trigger an increment of the subset size of allowed ACCs,<br>while a channel load over the upper threshold will potentially trigger<br>the opposite (a decrease in size).<br>The time between checks is kept fixed per VTY command (reusing old<br>"access-control-class-ramping-step-size"), but the "dynamic" option<br>is deprecated and ignored from now on since it provides nothing valuable<br>in the new implementation, because the size always dynamically changes<br>based on channel load (configured thresholds).<br><br>Related: SYS#4912<br>Change-Id: Id17f947c92cdfc0eb9541a9bf066338169caaeb5<br>---<br>M include/osmocom/bsc/acc.h<br>M src/osmo-bsc/acc.c<br>M src/osmo-bsc/bsc_vty.c<br>M tests/acc/acc_test.c<br>M tests/acc/acc_test.ok<br>5 files changed, 902 insertions(+), 180 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/acc.h b/include/osmocom/bsc/acc.h</span><br><span>index bd75f95..c7be38c 100644</span><br><span>--- a/include/osmocom/bsc/acc.h</span><br><span>+++ b/include/osmocom/bsc/acc.h</span><br><span>@@ -71,9 +71,12 @@</span><br><span> #define ACC_RAMP_STEP_SIZE_DEFAULT ACC_RAMP_STEP_SIZE_MIN</span><br><span> #define ACC_RAMP_STEP_SIZE_MAX 10 /* allow all ACC in one step (effectively disables ramping) */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define ACC_RAMP_STEP_INTERVAL_MIN 30   /* 30 seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+#define ACC_RAMP_STEP_INTERVAL_MIN 5  /* 5 seconds */</span><br><span> #define ACC_RAMP_STEP_INTERVAL_MAX 600       /* 10 minutes */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define ACC_RAMP_CHAN_LOAD_THRESHOLD_LOW 71</span><br><span style="color: hsl(120, 100%, 40%);">+#define ACC_RAMP_CHAN_LOAD_THRESHOLD_UP 89</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*!</span><br><span>  * Data structure used to manage ACC ramping. Please avoid setting or reading fields</span><br><span>  * in this structure directly. Use the accessor functions below instead.</span><br><span>@@ -97,8 +100,17 @@</span><br><span>      * it has been overridden by VTY configuration.</span><br><span>       */</span><br><span>  unsigned int step_interval_sec;</span><br><span style="color: hsl(0, 100%, 40%);">- bool step_interval_is_fixed;</span><br><span>         struct osmo_timer_list step_timer;</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%);">+   * Channel Load Upper/Lower Thresholds:</span><br><span style="color: hsl(120, 100%, 40%);">+        * They control how ramping subset size of allowed ACCs changes in</span><br><span style="color: hsl(120, 100%, 40%);">+     * relation to current channel load (%, 0-100): Under the lower</span><br><span style="color: hsl(120, 100%, 40%);">+        * threshold, subset size may be increased; above the upper threshold,</span><br><span style="color: hsl(120, 100%, 40%);">+ * subset size may be decreased.</span><br><span style="color: hsl(120, 100%, 40%);">+       */</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int chan_load_lower_threshold;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int chan_load_upper_threshold;</span><br><span> };</span><br><span> </span><br><span> /*!</span><br><span>@@ -141,17 +153,17 @@</span><br><span> }</span><br><span> </span><br><span> /*!</span><br><span style="color: hsl(0, 100%, 40%);">- * If the step interval is dynamic, return true, else return false.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Return the current ACC ramp step interval (in seconds)</span><br><span>  * \param[in] acc_ramp Pointer to acc_ramp structure.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static inline bool acc_ramp_step_interval_is_dynamic(struct acc_ramp *acc_ramp)</span><br><span style="color: hsl(120, 100%, 40%);">+static inline unsigned int acc_ramp_is_running(struct acc_ramp *acc_ramp)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   return !(acc_ramp->step_interval_is_fixed);</span><br><span style="color: hsl(120, 100%, 40%);">+        return acc_ramp->step_interval_sec;</span><br><span> }</span><br><span> </span><br><span> void acc_ramp_init(struct acc_ramp *acc_ramp, struct gsm_bts *bts);</span><br><span> int acc_ramp_set_step_size(struct acc_ramp *acc_ramp, unsigned int step_size);</span><br><span> int acc_ramp_set_step_interval(struct acc_ramp *acc_ramp, unsigned int step_interval);</span><br><span style="color: hsl(0, 100%, 40%);">-void acc_ramp_set_step_interval_dynamic(struct acc_ramp *acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+int acc_ramp_set_chan_load_thresholds(struct acc_ramp *acc_ramp, unsigned int low_threshold, unsigned int up_threshold);</span><br><span> void acc_ramp_trigger(struct acc_ramp *acc_ramp);</span><br><span> void acc_ramp_abort(struct acc_ramp *acc_ramp);</span><br><span>diff --git a/src/osmo-bsc/acc.c b/src/osmo-bsc/acc.c</span><br><span>index 72b4591..74ebe99 100644</span><br><span>--- a/src/osmo-bsc/acc.c</span><br><span>+++ b/src/osmo-bsc/acc.c</span><br><span>@@ -362,40 +362,42 @@</span><br><span> //////////////////////////</span><br><span> // acc_ramp</span><br><span> //////////////////////////</span><br><span style="color: hsl(0, 100%, 40%);">-static unsigned int get_next_step_interval(struct acc_ramp *acc_ramp)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts *bts = acc_ramp->bts;</span><br><span style="color: hsl(0, 100%, 40%);">- uint64_t load;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (acc_ramp->step_interval_is_fixed)</span><br><span style="color: hsl(0, 100%, 40%);">-                return acc_ramp->step_interval_sec;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Scale the step interval to current channel load average. */</span><br><span style="color: hsl(0, 100%, 40%);">-  load = (bts->chan_load_avg << 8); /* convert to fixed-point */</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp->step_interval_sec = ((load * ACC_RAMP_STEP_INTERVAL_MAX) / 100) >> 8;</span><br><span style="color: hsl(0, 100%, 40%);">-        if (acc_ramp->step_interval_sec < ACC_RAMP_STEP_SIZE_MIN)</span><br><span style="color: hsl(0, 100%, 40%);">-         acc_ramp->step_interval_sec = ACC_RAMP_STEP_INTERVAL_MIN;</span><br><span style="color: hsl(0, 100%, 40%);">-    else if (acc_ramp->step_interval_sec > ACC_RAMP_STEP_INTERVAL_MAX)</span><br><span style="color: hsl(0, 100%, 40%);">-                acc_ramp->step_interval_sec = ACC_RAMP_STEP_INTERVAL_MAX;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    LOG_BTS(bts, DRSL, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-          "ACC RAMP: step interval set to %u seconds based on %u%% channel load average\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             acc_ramp->step_interval_sec, bts->chan_load_avg);</span><br><span style="color: hsl(0, 100%, 40%);">- return acc_ramp->step_interval_sec;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void do_acc_ramping_step(void *data)</span><br><span> {</span><br><span>  struct acc_ramp *acc_ramp = data;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct acc_mgr *acc_mgr = &acc_ramp->bts->acc_mgr;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts *bts = acc_ramp->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct acc_mgr *acc_mgr = &bts->acc_mgr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    uint8_t old_len = acc_mgr_get_len_allowed_ramp(acc_mgr);</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t new_len = OSMO_MIN(10, old_len + acc_ramp->step_size);</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t new_len = old_len;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  acc_mgr_set_len_allowed_ramp(acc_mgr, new_len);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Remark dec: Never decrease back to 0, it is desirable to always allow at</span><br><span style="color: hsl(120, 100%, 40%);">+    * least 1 ACC at ramping lvl to allow subscribers to eventually use the</span><br><span style="color: hsl(120, 100%, 40%);">+       * network. If total barring is desired, it can be controlled by the</span><br><span style="color: hsl(120, 100%, 40%);">+   * adminsitrative subset length through VTY.</span><br><span style="color: hsl(120, 100%, 40%);">+   * Remark inc: Never try going over the admin subset size, since it</span><br><span style="color: hsl(120, 100%, 40%);">+    * wouldn't change final subset size anyway and it would create a fake</span><br><span style="color: hsl(120, 100%, 40%);">+     * sense of safe load handling capacity. If then load became high, being</span><br><span style="color: hsl(120, 100%, 40%);">+       * on upper size would mean the BTS requires more time to effectively</span><br><span style="color: hsl(120, 100%, 40%);">+  * drop down the final subset size, hence delaying recovery.</span><br><span style="color: hsl(120, 100%, 40%);">+   */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (bts->chan_load_avg > acc_ramp->chan_load_upper_threshold)</span><br><span style="color: hsl(120, 100%, 40%);">+                new_len = (uint8_t)OSMO_MAX(1, (int)(old_len - acc_ramp->step_size));</span><br><span style="color: hsl(120, 100%, 40%);">+      else if (bts->chan_load_avg < acc_ramp->chan_load_lower_threshold)</span><br><span style="color: hsl(120, 100%, 40%);">+           new_len = OSMO_MIN(acc_mgr_get_len_allowed_adm(acc_mgr),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 old_len + acc_ramp->step_size);</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+          new_len = old_len;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* If we have not allowed all ACCs yet, schedule another ramping step. */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (new_len != 10)</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_timer_schedule(&acc_ramp->step_timer, get_next_step_interval(acc_ramp), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (new_len != old_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOG_BTS(bts, DRSL, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                        "ACC RAMP: changing ramping subset size %" PRIu8</span><br><span style="color: hsl(120, 100%, 40%);">+                    " -> %" PRIu8 ", chan_load_avg=%" PRIu8 "%%\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      old_len, new_len, bts->chan_load_avg);</span><br><span style="color: hsl(120, 100%, 40%);">+             acc_mgr_set_len_allowed_ramp(acc_mgr, new_len);</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%);">+   osmo_timer_schedule(&acc_ramp->step_timer, acc_ramp->step_interval_sec, 0);</span><br><span> }</span><br><span> </span><br><span> /* Implements osmo_signal_cbfn() -- trigger or abort ACC ramping upon changes RF lock state. */</span><br><span>@@ -533,7 +535,8 @@</span><br><span>      acc_ramp_set_enabled(acc_ramp, false);</span><br><span>       acc_ramp->step_size = ACC_RAMP_STEP_SIZE_DEFAULT;</span><br><span>         acc_ramp->step_interval_sec = ACC_RAMP_STEP_INTERVAL_MIN;</span><br><span style="color: hsl(0, 100%, 40%);">-    acc_ramp->step_interval_is_fixed = false;</span><br><span style="color: hsl(120, 100%, 40%);">+  acc_ramp->chan_load_lower_threshold = ACC_RAMP_CHAN_LOAD_THRESHOLD_LOW;</span><br><span style="color: hsl(120, 100%, 40%);">+    acc_ramp->chan_load_upper_threshold = ACC_RAMP_CHAN_LOAD_THRESHOLD_UP;</span><br><span>    osmo_timer_setup(&acc_ramp->step_timer, do_acc_ramping_step, acc_ramp);</span><br><span>       osmo_signal_register_handler(SS_NM, acc_ramp_nm_sig_cb, acc_ramp);</span><br><span> }</span><br><span>@@ -566,21 +569,30 @@</span><br><span>              return -ERANGE;</span><br><span> </span><br><span>  acc_ramp->step_interval_sec = step_interval;</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp->step_interval_is_fixed = true;</span><br><span>  LOG_BTS(acc_ramp->bts, DRSL, LOGL_DEBUG, "ACC RAMP: ramping step interval set to %u seconds\n",</span><br><span>                 step_interval);</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span> /*!</span><br><span style="color: hsl(0, 100%, 40%);">- * Clear a previously set fixed ramping step interval, so that the interval</span><br><span style="color: hsl(0, 100%, 40%);">- * is again automatically scaled to the BTS channel load average.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Change the ramping channel load thresholds. They control how ramping subset</span><br><span style="color: hsl(120, 100%, 40%);">+ * size of allowed ACCs changes in relation to current channel load (%, 0-100):</span><br><span style="color: hsl(120, 100%, 40%);">+ * Under the lower threshold, subset size may be increased; above the upper</span><br><span style="color: hsl(120, 100%, 40%);">+ * threshold, subset size may be decreased.</span><br><span>  * \param[in] acc_ramp Pointer to acc_ramp structure.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] low_threshold The new minimum threshold: values under it allow for increasing the ramping subset size.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] up_threshold The new maximum threshold: values under it allow for increasing the ramping subset size.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-void acc_ramp_set_step_interval_dynamic(struct acc_ramp *acc_ramp)</span><br><span style="color: hsl(120, 100%, 40%);">+int acc_ramp_set_chan_load_thresholds(struct acc_ramp *acc_ramp, unsigned int low_threshold, unsigned int up_threshold)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     acc_ramp->step_interval_is_fixed = false;</span><br><span style="color: hsl(0, 100%, 40%);">-    LOG_BTS(acc_ramp->bts, DRSL, LOGL_DEBUG, "ACC RAMP: ramping step interval set to 'dynamic'\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  /* for instance, high=49 and lower=50 makes sense:</span><br><span style="color: hsl(120, 100%, 40%);">+       [50-100] -> decrease, [0-49] -> increase */</span><br><span style="color: hsl(120, 100%, 40%);">+  if ((int)up_threshold - (int)low_threshold < -1)</span><br><span style="color: hsl(120, 100%, 40%);">+           return -ERANGE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     acc_ramp->chan_load_lower_threshold = low_threshold;</span><br><span style="color: hsl(120, 100%, 40%);">+       acc_ramp->chan_load_upper_threshold = up_threshold;</span><br><span style="color: hsl(120, 100%, 40%);">+        return 0;</span><br><span> }</span><br><span> </span><br><span> /*!</span><br><span>@@ -593,13 +605,23 @@</span><br><span>  */</span><br><span> void acc_ramp_trigger(struct acc_ramp *acc_ramp)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Abort any previously running ramping process and allow all available ACCs. */</span><br><span style="color: hsl(0, 100%, 40%);">-        acc_ramp_abort(acc_ramp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    if (acc_ramp_is_enabled(acc_ramp)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (osmo_timer_pending(&acc_ramp->step_timer))</span><br><span style="color: hsl(120, 100%, 40%);">+                 return; /* Already started, nothing to do */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>               /* Set all available ACCs to barred and start ramping up. */</span><br><span>                 acc_mgr_set_len_allowed_ramp(&acc_ramp->bts->acc_mgr, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (acc_ramp->chan_load_lower_threshold == 0 &&</span><br><span style="color: hsl(120, 100%, 40%);">+                acc_ramp->chan_load_upper_threshold == 100) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOG_BTS(acc_ramp->bts, DRSL, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                           "ACC RAMP: starting ramp up with 0 ACCs and "</span><br><span style="color: hsl(120, 100%, 40%);">+                               "no possibility to grow the allowed subset size! "</span><br><span style="color: hsl(120, 100%, 40%);">+                          "Check VTY cmd access-control-class-ramping-chan-load\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span>            do_acc_ramping_step(acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Abort any previously running ramping process and allow all available ACCs. */</span><br><span style="color: hsl(120, 100%, 40%);">+              acc_ramp_abort(acc_ramp);</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 0be4e6d..e4842f7 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -409,11 +409,11 @@</span><br><span>      vty_out(vty, "  Access Control Class ramping: %senabled%s",</span><br><span>                acc_ramp_is_enabled(&bts->acc_ramp) ? "" : "not ", VTY_NEWLINE);</span><br><span>  if (acc_ramp_is_enabled(&bts->acc_ramp)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!acc_ramp_step_interval_is_dynamic(&bts->acc_ramp))</span><br><span style="color: hsl(0, 100%, 40%);">-                  vty_out(vty, "  Access Control Class ramping step interval: %u seconds%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                            acc_ramp_get_step_interval(&bts->acc_ramp), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-                else</span><br><span style="color: hsl(0, 100%, 40%);">-                    vty_out(vty, "  Access Control Class ramping step interval: dynamic%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "  Access Control Class ramping step interval: %u seconds%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                  acc_ramp_get_step_interval(&bts->acc_ramp), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "  Access Control Class channel load thresholds: (%" PRIu8 ", %" PRIu8 ")%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                      bts->acc_ramp.chan_load_lower_threshold,</span><br><span style="color: hsl(120, 100%, 40%);">+                   bts->acc_ramp.chan_load_upper_threshold, VTY_NEWLINE);</span><br><span>            vty_out(vty, "  enabling %u Access Control Class%s per ramping step%s",</span><br><span>                    acc_ramp_get_step_size(&bts->acc_ramp),</span><br><span>                       acc_ramp_get_step_size(&bts->acc_ramp) > 1 ? "es" : "", VTY_NEWLINE);</span><br><span>@@ -955,14 +955,12 @@</span><br><span>  if (bts->acc_mgr.rotation_time_sec != ACC_MGR_QUANTUM_DEFAULT)</span><br><span>            vty_out(vty, "  access-control-class-rotate-quantum %" PRIu32 "%s", bts->acc_mgr.rotation_time_sec, VTY_NEWLINE);</span><br><span>     vty_out(vty, "  %saccess-control-class-ramping%s", acc_ramp_is_enabled(&bts->acc_ramp) ? "" : "no ", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!acc_ramp_step_interval_is_dynamic(&bts->acc_ramp)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "  access-control-class-ramping-step-interval %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                     acc_ramp_get_step_interval(&bts->acc_ramp), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "  access-control-class-ramping-step-interval dynamic%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, "  access-control-class-ramping-step-interval %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           acc_ramp_get_step_interval(&bts->acc_ramp), VTY_NEWLINE);</span><br><span>     vty_out(vty, "  access-control-class-ramping-step-size %u%s", acc_ramp_get_step_size(&bts->acc_ramp),</span><br><span>               VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "  access-control-class-ramping-chan-load %u %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+            bts->acc_ramp.chan_load_lower_threshold, bts->acc_ramp.chan_load_upper_threshold, VTY_NEWLINE);</span><br><span>        if (!bts->si_unused_send_empty)</span><br><span>           vty_out(vty, "  no system-information unused-send-empty%s", VTY_NEWLINE);</span><br><span>  for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) {</span><br><span>@@ -3679,9 +3677,18 @@</span><br><span>       "Enable Access Control Class ramping\n")</span><br><span> {</span><br><span>  struct gsm_bts *bts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_trx *trx;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if (!acc_ramp_is_enabled(&bts->acc_ramp))</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!acc_ramp_is_enabled(&bts->acc_ramp)) {</span><br><span>           acc_ramp_set_enabled(&bts->acc_ramp, true);</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Start ramping if at least one TRX is usable */</span><br><span style="color: hsl(120, 100%, 40%);">+             llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (trx_is_usable(trx)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             acc_ramp_trigger(&bts->acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+                              break;</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> </span><br><span>        /*</span><br><span>    * ACC ramping takes effect either when the BTS reconnects RSL,</span><br><span>@@ -3713,14 +3720,14 @@</span><br><span>       OSMO_STRINGIFY_VAL(ACC_RAMP_STEP_INTERVAL_MAX) ">|dynamic)",</span><br><span>       "Configure Access Control Class ramping step interval\n"</span><br><span>       "Set a fixed step interval (in seconds)\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "Use dynamic step interval based on BTS channel load\n")</span><br><span style="color: hsl(120, 100%, 40%);">+      "Use dynamic step interval based on BTS channel load (deprecated, don't use, ignored)\n")</span><br><span> {</span><br><span>   struct gsm_bts *bts = vty->index;</span><br><span>         bool dynamic = (strcmp(argv[0], "dynamic") == 0);</span><br><span>  int error;</span><br><span> </span><br><span>       if (dynamic) {</span><br><span style="color: hsl(0, 100%, 40%);">-          acc_ramp_set_step_interval_dynamic(&bts->acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "%% access-control-class-ramping-step-interval 'dynamic' value is deprecated, ignoring it%s", VTY_NEWLINE);</span><br><span>           return CMD_SUCCESS;</span><br><span>  }</span><br><span> </span><br><span>@@ -3759,6 +3766,25 @@</span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_bts_acc_ramping_chan_load,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_bts_acc_ramping_chan_load_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "access-control-class-ramping-chan-load <0-100> <0-100>",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Configure Access Control Class ramping channel load thresholds\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Lower Channel load threshold (%) below which subset size of allowed broadcast ACCs can be increased\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Upper channel load threshold (%) above which subset size of allowed broadcast ACCs can be decreased\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+  int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = acc_ramp_set_chan_load_thresholds(&bts->acc_ramp, atoi(argv[0]), atoi(argv[1]));</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "Unable to set ACC channel load thresholds%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%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define EXCL_RFLOCK_STR "Exclude this BTS from the global RF Lock\n"</span><br><span> </span><br><span> DEFUN(cfg_bts_excl_rf_lock,</span><br><span>@@ -6532,6 +6558,7 @@</span><br><span>        install_element(BTS_NODE, &cfg_bts_no_acc_ramping_cmd);</span><br><span>  install_element(BTS_NODE, &cfg_bts_acc_ramping_step_interval_cmd);</span><br><span>       install_element(BTS_NODE, &cfg_bts_acc_ramping_step_size_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(BTS_NODE, &cfg_bts_acc_ramping_chan_load_cmd);</span><br><span>   install_element(BTS_NODE, &cfg_bts_t3113_dynamic_cmd);</span><br><span>   install_element(BTS_NODE, &cfg_bts_no_t3113_dynamic_cmd);</span><br><span>        neighbor_ident_vty_init(network, network->neighbor_bss_cells);</span><br><span>diff --git a/tests/acc/acc_test.c b/tests/acc/acc_test.c</span><br><span>index 54f3de1..72d3212 100644</span><br><span>--- a/tests/acc/acc_test.c</span><br><span>+++ b/tests/acc/acc_test.c</span><br><span>@@ -63,6 +63,8 @@</span><br><span>   rate_ctr_group_free(bts->bts_ctrs);</span><br><span>       if (osmo_timer_pending(&bts->acc_mgr.rotate_timer))</span><br><span>           osmo_timer_del(&bts->acc_mgr.rotate_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (osmo_timer_pending(&bts->acc_ramp.step_timer))</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_timer_del(&bts->acc_ramp.step_timer);</span><br><span>    /* no need to llist_del(&bts->list), we never registered the bts there. */</span><br><span>    talloc_free(bts);</span><br><span>    fprintf(stderr, "BTS deallocated OK in %s()\n", msg);</span><br><span>@@ -230,7 +232,7 @@</span><br><span>        bts_del(bts);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void test_acc_ramp_fixed(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_acc_ramp(struct gsm_network *net)</span><br><span> {</span><br><span>      fprintf(stderr, "===%s===\n", __func__);</span><br><span>   int i;</span><br><span>@@ -242,14 +244,13 @@</span><br><span>       OSMO_ASSERT(acc_ramp_is_enabled(acc_ramp) == false);</span><br><span>         OSMO_ASSERT(acc_ramp_get_step_size(acc_ramp) == ACC_RAMP_STEP_SIZE_DEFAULT);</span><br><span>         OSMO_ASSERT(acc_ramp_get_step_interval(acc_ramp) == ACC_RAMP_STEP_INTERVAL_MIN);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(acc_ramp_step_interval_is_dynamic(acc_ramp) == true);</span><br><span> </span><br><span>        /* Set super high rotation time so it doesn't interfer here: */</span><br><span>  acc_mgr_set_rotation_time(acc_mgr, 5000);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   //acc_ramp_set_step_interval_dynamic(acc_ramp);</span><br><span>      OSMO_ASSERT(acc_ramp_set_step_interval(acc_ramp, 1) == -ERANGE);</span><br><span>     OSMO_ASSERT(acc_ramp_set_step_interval(acc_ramp, 50) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(acc_ramp_set_chan_load_thresholds(acc_ramp, 100, 100) == 0);</span><br><span>     acc_ramp_set_step_size(acc_ramp, 1);</span><br><span>         acc_ramp_set_enabled(acc_ramp, true);</span><br><span> </span><br><span>@@ -265,7 +266,7 @@</span><br><span>      bts_del(bts);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void test_acc_ramp_fixed2(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_acc_ramp2(struct gsm_network *net)</span><br><span> {</span><br><span>    fprintf(stderr, "===%s===\n", __func__);</span><br><span>   int i;</span><br><span>@@ -277,7 +278,6 @@</span><br><span>         OSMO_ASSERT(acc_ramp_is_enabled(acc_ramp) == false);</span><br><span>         OSMO_ASSERT(acc_ramp_get_step_size(acc_ramp) == ACC_RAMP_STEP_SIZE_DEFAULT);</span><br><span>         OSMO_ASSERT(acc_ramp_get_step_interval(acc_ramp) == ACC_RAMP_STEP_INTERVAL_MIN);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(acc_ramp_step_interval_is_dynamic(acc_ramp) == true);</span><br><span> </span><br><span>        /* Set super high rotation time so it doesn't interfer here: */</span><br><span>  acc_mgr_set_rotation_time(acc_mgr, 5000);</span><br><span>@@ -299,7 +299,7 @@</span><br><span>      bts_del(bts);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void test_acc_ramp_fixed3(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_acc_ramp3(struct gsm_network *net)</span><br><span> {</span><br><span>    fprintf(stderr, "===%s===\n", __func__);</span><br><span>   int i;</span><br><span>@@ -311,7 +311,6 @@</span><br><span>         OSMO_ASSERT(acc_ramp_is_enabled(acc_ramp) == false);</span><br><span>         OSMO_ASSERT(acc_ramp_get_step_size(acc_ramp) == ACC_RAMP_STEP_SIZE_DEFAULT);</span><br><span>         OSMO_ASSERT(acc_ramp_get_step_interval(acc_ramp) == ACC_RAMP_STEP_INTERVAL_MIN);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(acc_ramp_step_interval_is_dynamic(acc_ramp) == true);</span><br><span> </span><br><span>        /* Set super high rotation time so it doesn't interfer here: */</span><br><span>  acc_mgr_set_rotation_time(acc_mgr, 5000);</span><br><span>@@ -336,58 +335,19 @@</span><br><span>    bts_del(bts);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void test_acc_ramp_dynamic(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_acc_ramp_up_rotate(struct gsm_network *net, unsigned int chan_load, unsigned int low_threshold, unsigned int up_threshold)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      fprintf(stderr, "===%s===\n", __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-      char buf[128];</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned int step_sec;</span><br><span style="color: hsl(120, 100%, 40%);">+        fprintf(stderr, "===%s(%u, %u, %u)===\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           __func__, chan_load, low_threshold, up_threshold);</span><br><span>   struct gsm_bts *bts = bts_init(net);</span><br><span>         struct acc_mgr *acc_mgr = &bts->acc_mgr;</span><br><span>      struct acc_ramp *acc_ramp = &bts->acc_ramp;</span><br><span style="color: hsl(120, 100%, 40%);">+    int n;</span><br><span> </span><br><span>   /* Validate are all allowed by default after allocation: */</span><br><span>  OSMO_ASSERT(acc_ramp_is_enabled(acc_ramp) == false);</span><br><span>         OSMO_ASSERT(acc_ramp_get_step_size(acc_ramp) == ACC_RAMP_STEP_SIZE_DEFAULT);</span><br><span>         OSMO_ASSERT(acc_ramp_get_step_interval(acc_ramp) == ACC_RAMP_STEP_INTERVAL_MIN);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(acc_ramp_step_interval_is_dynamic(acc_ramp) == true);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Set super high rotation time so it doesn't interfer here: */</span><br><span style="color: hsl(0, 100%, 40%);">-     acc_mgr_set_rotation_time(acc_mgr, 5000);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       acc_ramp_set_step_interval_dynamic(acc_ramp);</span><br><span style="color: hsl(0, 100%, 40%);">-   acc_ramp_set_step_size(acc_ramp, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-    acc_ramp_set_enabled(acc_ramp, true);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   bts->chan_load_avg = 0; /*set 70% channel load */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_gettimeofday_override_time = (struct timeval) {0, 0};</span><br><span style="color: hsl(0, 100%, 40%);">-      acc_ramp_trigger(acc_ramp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     while (osmo_timer_pending(&acc_ramp->step_timer)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              bts->chan_load_avg += 10;</span><br><span style="color: hsl(0, 100%, 40%);">-            step_sec = ((bts->chan_load_avg * ACC_RAMP_STEP_INTERVAL_MAX) / 100);</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_gettimeofday_override_time.tv_sec += step_sec;</span><br><span style="color: hsl(0, 100%, 40%);">-             snprintf(buf, sizeof(buf), "select(): load=%" PRIu8 " -> step_sec=%u",</span><br><span style="color: hsl(0, 100%, 40%);">-                    bts->chan_load_avg, step_sec);</span><br><span style="color: hsl(0, 100%, 40%);">-              clock_debug(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_select_main(0);</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%);">-       bts_del(bts);</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%);">-static void test_acc_ramp_fixed_rotate(struct gsm_network *net)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  fprintf(stderr, "===%s===\n", __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts *bts = bts_init(net);</span><br><span style="color: hsl(0, 100%, 40%);">-    struct acc_mgr *acc_mgr = &bts->acc_mgr;</span><br><span style="color: hsl(0, 100%, 40%);">- struct acc_ramp *acc_ramp = &bts->acc_ramp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Validate are all allowed by default after allocation: */</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(acc_ramp_is_enabled(acc_ramp) == false);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(acc_ramp_get_step_size(acc_ramp) == ACC_RAMP_STEP_SIZE_DEFAULT);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(acc_ramp_get_step_interval(acc_ramp) == ACC_RAMP_STEP_INTERVAL_MIN);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(acc_ramp_step_interval_is_dynamic(acc_ramp) == true);</span><br><span> </span><br><span>        OSMO_ASSERT(acc_ramp_set_step_interval(acc_ramp, 250) == 0);</span><br><span>         acc_mgr_set_rotation_time(acc_mgr, 100);</span><br><span>@@ -396,26 +356,31 @@</span><br><span>     bts->si_common.rach_control.t2 |= 0x02;</span><br><span>   acc_mgr_perm_subset_changed(acc_mgr, &bts->si_common.rach_control);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  acc_ramp_set_step_size(acc_ramp, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(acc_ramp_set_step_size(acc_ramp, 1) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(acc_ramp_set_chan_load_thresholds(acc_ramp, low_threshold, up_threshold) == 0);</span><br><span>  acc_ramp_set_enabled(acc_ramp, true);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     bts->chan_load_avg = chan_load; /*set % channel load */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         osmo_gettimeofday_override_time = (struct timeval) {0, 0};</span><br><span>   acc_ramp_trigger(acc_ramp);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       n = 5;</span><br><span>       while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+                OSMO_ASSERT(osmo_timer_pending(&acc_ramp->step_timer));</span><br><span>               if (osmo_timer_pending(&acc_mgr->rotate_timer)) {</span><br><span>                     if ((osmo_gettimeofday_override_time.tv_sec + 50) % 250 == 0)</span><br><span>                                osmo_gettimeofday_override_time.tv_sec += 50;</span><br><span>                        else</span><br><span>                                 osmo_gettimeofday_override_time.tv_sec += 100;</span><br><span style="color: hsl(0, 100%, 40%);">-          } else if (osmo_timer_pending(&acc_ramp->step_timer)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  osmo_gettimeofday_override_time.tv_sec -= osmo_gettimeofday_override_time.tv_sec % 250;</span><br><span style="color: hsl(0, 100%, 40%);">-                 osmo_gettimeofday_override_time.tv_sec += 250;</span><br><span>               } else {</span><br><span>                     /* Once ramping is done, adm level is big enough and hence</span><br><span style="color: hsl(0, 100%, 40%);">-                       * rotation is not needed and will be disabled. We are then done</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(120, 100%, 40%);">+                         * rotation is not needed and will be disabled. Run</span><br><span style="color: hsl(120, 100%, 40%);">+                    * ramping a bit more and we are then done */</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_gettimeofday_override_time.tv_sec -= osmo_gettimeofday_override_time.tv_sec % 250;</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_gettimeofday_override_time.tv_sec += 250;</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (n-- == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                         break;</span><br><span>               }</span><br><span>            clock_debug("select()");</span><br><span>           osmo_select_main(0);</span><br><span>@@ -424,6 +389,76 @@</span><br><span>  bts_del(bts);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void test_acc_ramp_updown_rotate(struct gsm_network *net, unsigned int low_threshold, unsigned int up_threshold,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       unsigned int min_load, unsigned int max_load, unsigned load_step)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  fprintf(stderr, "===%s(%u, %u, %u, %u, %u)===\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           __func__, low_threshold, up_threshold,</span><br><span style="color: hsl(120, 100%, 40%);">+                min_load, max_load, load_step);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts *bts = bts_init(net);</span><br><span style="color: hsl(120, 100%, 40%);">+  struct acc_mgr *acc_mgr = &bts->acc_mgr;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct acc_ramp *acc_ramp = &bts->acc_ramp;</span><br><span style="color: hsl(120, 100%, 40%);">+    int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        char buf[256];</span><br><span style="color: hsl(120, 100%, 40%);">+        bool up = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Validate are all allowed by default after allocation: */</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(acc_ramp_is_enabled(acc_ramp) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(acc_ramp_get_step_size(acc_ramp) == ACC_RAMP_STEP_SIZE_DEFAULT);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(acc_ramp_get_step_interval(acc_ramp) == ACC_RAMP_STEP_INTERVAL_MIN);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(acc_ramp_set_step_interval(acc_ramp, 250) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  acc_mgr_set_rotation_time(acc_mgr, 100);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Test that ramping + rotation won't go over permanently barred ACC*/</span><br><span style="color: hsl(120, 100%, 40%);">+    fprintf(stderr, "*** Barring one ACC ***\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       bts->si_common.rach_control.t2 |= 0x02;</span><br><span style="color: hsl(120, 100%, 40%);">+    acc_mgr_perm_subset_changed(acc_mgr, &bts->si_common.rach_control);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(acc_ramp_set_step_size(acc_ramp, 1) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(acc_ramp_set_chan_load_thresholds(acc_ramp, low_threshold, up_threshold) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   acc_ramp_set_enabled(acc_ramp, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       bts->chan_load_avg = min_load; /* set % channel load */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_gettimeofday_override_time = (struct timeval) {0, 0};</span><br><span style="color: hsl(120, 100%, 40%);">+    acc_ramp_trigger(acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 50 ev loop iterations */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < 50; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         OSMO_ASSERT(osmo_timer_pending(&acc_ramp->step_timer));</span><br><span style="color: hsl(120, 100%, 40%);">+                if (osmo_timer_pending(&acc_mgr->rotate_timer)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if ((osmo_gettimeofday_override_time.tv_sec + 50) % 250 == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                         osmo_gettimeofday_override_time.tv_sec += 50;</span><br><span style="color: hsl(120, 100%, 40%);">+                 else</span><br><span style="color: hsl(120, 100%, 40%);">+                          osmo_gettimeofday_override_time.tv_sec += 100;</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* Once ramping is done, adm level is big enough and hence</span><br><span style="color: hsl(120, 100%, 40%);">+                     * rotation is not needed and will be disabled. */</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_gettimeofday_override_time.tv_sec -= osmo_gettimeofday_override_time.tv_sec % 250;</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_gettimeofday_override_time.tv_sec += 250;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             snprintf(buf, sizeof(buf), "select(%d): chan_load_avg=%" PRIu8, i, bts->chan_load_avg);</span><br><span style="color: hsl(120, 100%, 40%);">+          clock_debug(buf);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_select_main(0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                if (up) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts->chan_load_avg += load_step;</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (bts->chan_load_avg >= max_load)</span><br><span style="color: hsl(120, 100%, 40%);">+                             up = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (bts->chan_load_avg > max_load)</span><br><span style="color: hsl(120, 100%, 40%);">+                              bts->chan_load_avg = max_load;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      bts->chan_load_avg = (uint8_t)OSMO_MAX((int)(bts->chan_load_avg - load_step), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (bts->chan_load_avg <= min_load)</span><br><span style="color: hsl(120, 100%, 40%);">+                             up = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (bts->chan_load_avg < min_load)</span><br><span style="color: hsl(120, 100%, 40%);">+                              bts->chan_load_avg = max_load;</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%);">+   bts_del(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static const struct log_info_cat log_categories[] = {</span><br><span>  [DRSL] = {</span><br><span>           .name = "DRSL",</span><br><span>@@ -460,11 +495,16 @@</span><br><span>    test_acc_mgr_no_ramp(net);</span><br><span>   test_acc_mgr_manual_ramp(net);</span><br><span>       test_acc_mgr_rotate(net);</span><br><span style="color: hsl(0, 100%, 40%);">-       test_acc_ramp_fixed(net);</span><br><span style="color: hsl(0, 100%, 40%);">-       test_acc_ramp_fixed2(net);</span><br><span style="color: hsl(0, 100%, 40%);">-      test_acc_ramp_fixed3(net);</span><br><span style="color: hsl(0, 100%, 40%);">-      test_acc_ramp_dynamic(net);</span><br><span style="color: hsl(0, 100%, 40%);">-     test_acc_ramp_fixed_rotate(net);</span><br><span style="color: hsl(120, 100%, 40%);">+      test_acc_ramp(net);</span><br><span style="color: hsl(120, 100%, 40%);">+   test_acc_ramp2(net);</span><br><span style="color: hsl(120, 100%, 40%);">+  test_acc_ramp3(net);</span><br><span style="color: hsl(120, 100%, 40%);">+  test_acc_ramp_up_rotate(net, 0, 100, 100);</span><br><span style="color: hsl(120, 100%, 40%);">+    test_acc_ramp_up_rotate(net, 0, 20, 50);</span><br><span style="color: hsl(120, 100%, 40%);">+      test_acc_ramp_up_rotate(net, 70, 80, 90);</span><br><span style="color: hsl(120, 100%, 40%);">+     test_acc_ramp_updown_rotate(net, 80, 90, 0, 100, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_acc_ramp_updown_rotate(net, 30, 50, 10, 100, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+        test_acc_ramp_updown_rotate(net, 50, 49, 0, 100, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_acc_ramp_updown_rotate(net, 30, 80, 30, 80, 5);</span><br><span> </span><br><span>     return EXIT_SUCCESS;</span><br><span> }</span><br><span>diff --git a/tests/acc/acc_test.ok b/tests/acc/acc_test.ok</span><br><span>index f377651..bb6fe10 100644</span><br><span>--- a/tests/acc/acc_test.ok</span><br><span>+++ b/tests/acc/acc_test.ok</span><br><span>@@ -413,9 +413,9 @@</span><br><span> (bts=0) ACC: rotate ACC allowed active subset 0x1c1 -> 0x0c3 (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span> pcu_info_update(): t2=0x03 t3=0x3c</span><br><span> BTS deallocated OK in test_acc_mgr_rotate()</span><br><span style="color: hsl(0, 100%, 40%);">-===test_acc_ramp_fixed===</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp===</span><br><span> (bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-BTS allocation OK in test_acc_ramp_fixed()</span><br><span style="color: hsl(120, 100%, 40%);">+BTS allocation OK in test_acc_ramp()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x3ff -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=10, rotation=off)</span><br><span> pcu_info_update(): t2=0x03 t3=0xff</span><br><span> (bts=0) ACC: New ACC allowed subset 0x001 (active_len=1, ramp_len=1, adm_len=10, perm_len=10, rotation=on)</span><br><span>@@ -447,27 +447,27 @@</span><br><span> sys={450.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span> pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(0, 100%, 40%);">-BTS deallocated OK in test_acc_ramp_fixed()</span><br><span style="color: hsl(0, 100%, 40%);">-===test_acc_ramp_fixed2===</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp2===</span><br><span> (bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-BTS allocation OK in test_acc_ramp_fixed2()</span><br><span style="color: hsl(120, 100%, 40%);">+BTS allocation OK in test_acc_ramp2()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x3ff -> 0x3f8 (active_len=7, ramp_len=10, adm_len=7, perm_len=10, rotation=on)</span><br><span> pcu_info_update(): t2=0x00 t3=0x07</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x3f8 -> 0x000 (active_len=0, ramp_len=0, adm_len=7, perm_len=10, rotation=off)</span><br><span> pcu_info_update(): t2=0x03 t3=0xff</span><br><span> (bts=0) ACC: New ACC allowed subset 0x007 (active_len=3, ramp_len=3, adm_len=7, perm_len=10, rotation=on)</span><br><span> pcu_info_update(): t2=0x03 t3=0xf8</span><br><span style="color: hsl(0, 100%, 40%);">-sys={30.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={5.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x007 -> 0x03f (active_len=6, ramp_len=6, adm_len=7, perm_len=10, rotation=on)</span><br><span> pcu_info_update(): t2=0x03 t3=0xc0</span><br><span style="color: hsl(0, 100%, 40%);">-sys={60.000000}: select()</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x03f -> 0x07f (active_len=7, ramp_len=9, adm_len=7, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+sys={10.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x03f -> 0x07f (active_len=7, ramp_len=7, adm_len=7, perm_len=10, rotation=on)</span><br><span> pcu_info_update(): t2=0x03 t3=0x80</span><br><span style="color: hsl(0, 100%, 40%);">-sys={90.000000}: select()</span><br><span style="color: hsl(0, 100%, 40%);">-BTS deallocated OK in test_acc_ramp_fixed2()</span><br><span style="color: hsl(0, 100%, 40%);">-===test_acc_ramp_fixed3===</span><br><span style="color: hsl(120, 100%, 40%);">+sys={15.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp2()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp3===</span><br><span> (bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-BTS allocation OK in test_acc_ramp_fixed3()</span><br><span style="color: hsl(120, 100%, 40%);">+BTS allocation OK in test_acc_ramp3()</span><br><span> *** Barring some ACCs ***</span><br><span> (bts=0) ACC: New ACC allowed subset 0x15a (active_len=5, ramp_len=10, adm_len=10, perm_len=5, rotation=off)</span><br><span> pcu_info_update(): t2=0x02 t3=0xa5</span><br><span>@@ -475,67 +475,32 @@</span><br><span> pcu_info_update(): t2=0x03 t3=0xff</span><br><span> (bts=0) ACC: New ACC allowed subset 0x002 (active_len=1, ramp_len=1, adm_len=10, perm_len=5, rotation=on)</span><br><span> pcu_info_update(): t2=0x03 t3=0xfd</span><br><span style="color: hsl(0, 100%, 40%);">-sys={30.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={5.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x002 -> 0x00a (active_len=2, ramp_len=2, adm_len=10, perm_len=5, rotation=on)</span><br><span> pcu_info_update(): t2=0x03 t3=0xf5</span><br><span style="color: hsl(0, 100%, 40%);">-sys={60.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={10.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x00a -> 0x01a (active_len=3, ramp_len=3, adm_len=10, perm_len=5, rotation=on)</span><br><span> pcu_info_update(): t2=0x03 t3=0xe5</span><br><span style="color: hsl(0, 100%, 40%);">-sys={90.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={15.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x01a -> 0x05a (active_len=4, ramp_len=4, adm_len=10, perm_len=5, rotation=on)</span><br><span> pcu_info_update(): t2=0x03 t3=0xa5</span><br><span style="color: hsl(0, 100%, 40%);">-sys={120.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={20.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x05a -> 0x15a (active_len=5, ramp_len=5, adm_len=10, perm_len=5, rotation=off)</span><br><span> pcu_info_update(): t2=0x02 t3=0xa5</span><br><span style="color: hsl(0, 100%, 40%);">-sys={150.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={25.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=6, adm_len=10, perm_len=5, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-sys={180.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={30.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=7, adm_len=10, perm_len=5, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-sys={210.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={35.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=8, adm_len=10, perm_len=5, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-sys={240.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={40.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=9, adm_len=10, perm_len=5, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-sys={270.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={45.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=10, adm_len=10, perm_len=5, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-BTS deallocated OK in test_acc_ramp_fixed3()</span><br><span style="color: hsl(0, 100%, 40%);">-===test_acc_ramp_dynamic===</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp3()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_up_rotate(0, 100, 100)===</span><br><span> (bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-BTS allocation OK in test_acc_ramp_dynamic()</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x3ff -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x03 t3=0xff</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: New ACC allowed subset 0x001 (active_len=1, ramp_len=1, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x03 t3=0xfe</span><br><span style="color: hsl(0, 100%, 40%);">-sys={60.000000}: select(): load=10 -> step_sec=60</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x001 -> 0x003 (active_len=2, ramp_len=2, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x03 t3=0xfc</span><br><span style="color: hsl(0, 100%, 40%);">-sys={180.000000}: select(): load=20 -> step_sec=120</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x003 -> 0x007 (active_len=3, ramp_len=3, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x03 t3=0xf8</span><br><span style="color: hsl(0, 100%, 40%);">-sys={360.000000}: select(): load=30 -> step_sec=180</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x007 -> 0x00f (active_len=4, ramp_len=4, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x03 t3=0xf0</span><br><span style="color: hsl(0, 100%, 40%);">-sys={600.000000}: select(): load=40 -> step_sec=240</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x00f -> 0x01f (active_len=5, ramp_len=5, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x03 t3=0xe0</span><br><span style="color: hsl(0, 100%, 40%);">-sys={900.000000}: select(): load=50 -> step_sec=300</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x01f -> 0x03f (active_len=6, ramp_len=6, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x03 t3=0xc0</span><br><span style="color: hsl(0, 100%, 40%);">-sys={1260.000000}: select(): load=60 -> step_sec=360</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x03f -> 0x07f (active_len=7, ramp_len=7, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x03 t3=0x80</span><br><span style="color: hsl(0, 100%, 40%);">-sys={1680.000000}: select(): load=70 -> step_sec=420</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x07f -> 0x0ff (active_len=8, ramp_len=8, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x03 t3=0x00</span><br><span style="color: hsl(0, 100%, 40%);">-sys={2160.000000}: select(): load=80 -> step_sec=480</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x0ff -> 0x1ff (active_len=9, ramp_len=9, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x02 t3=0x00</span><br><span style="color: hsl(0, 100%, 40%);">-sys={2700.000000}: select(): load=90 -> step_sec=540</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(0, 100%, 40%);">-BTS deallocated OK in test_acc_ramp_dynamic()</span><br><span style="color: hsl(0, 100%, 40%);">-===test_acc_ramp_fixed_rotate===</span><br><span style="color: hsl(0, 100%, 40%);">-(bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-BTS allocation OK in test_acc_ramp_fixed_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+BTS allocation OK in test_acc_ramp_up_rotate()</span><br><span> *** Barring one ACC ***</span><br><span> (bts=0) ACC: New ACC allowed subset 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span> pcu_info_update(): t2=0x02 t3=0x00</span><br><span>@@ -617,4 +582,660 @@</span><br><span> pcu_info_update(): t2=0x02 t3=0x00</span><br><span> sys={2250.000000}: select()</span><br><span> (bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(0, 100%, 40%);">-BTS deallocated OK in test_acc_ramp_fixed_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2500.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2750.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3000.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3250.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_up_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_up_rotate(0, 20, 50)===</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+BTS allocation OK in test_acc_ramp_up_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring one ACC ***</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x001 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={100.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x001 -> 0x002 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfd</span><br><span style="color: hsl(120, 100%, 40%);">+sys={200.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x002 -> 0x004 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfb</span><br><span style="color: hsl(120, 100%, 40%);">+sys={250.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x004 -> 0x00c (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={350.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00c -> 0x018 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={450.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x018 -> 0x030 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xcf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={500.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x030 -> 0x070 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x8f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={600.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x070 -> 0x0e0 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x1f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={700.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0e0 -> 0x1c0 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={750.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1c0 -> 0x1c1 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x3e</span><br><span style="color: hsl(120, 100%, 40%);">+sys={850.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1c1 -> 0x0c3 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x3c</span><br><span style="color: hsl(120, 100%, 40%);">+sys={950.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0c3 -> 0x047 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xb8</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1000.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x047 -> 0x0c7 (active_len=5, ramp_len=5, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x38</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1100.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0c7 -> 0x04f (active_len=5, ramp_len=5, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xb0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1200.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x04f -> 0x01f (active_len=5, ramp_len=5, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1250.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x01f -> 0x03f (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xc0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1350.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x03f -> 0x07e (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x81</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1450.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x07e -> 0x0fc (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x03</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1500.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x0fc -> 0x1fc (active_len=7, ramp_len=7, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x03</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1600.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1fc -> 0x1f9 (active_len=7, ramp_len=7, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x06</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1700.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1f9 -> 0x0fb (active_len=7, ramp_len=7, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x04</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1750.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x0fb -> 0x1fb (active_len=8, ramp_len=8, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x04</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1850.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1fb -> 0x0ff (active_len=8, ramp_len=8, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1950.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0ff -> 0x1fe (active_len=8, ramp_len=8, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x01</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2000.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1fe -> 0x1ff (active_len=9, ramp_len=9, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2250.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2500.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2750.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3000.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3250.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_up_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_up_rotate(70, 80, 90)===</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+BTS allocation OK in test_acc_ramp_up_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring one ACC ***</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x001 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={100.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x001 -> 0x002 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfd</span><br><span style="color: hsl(120, 100%, 40%);">+sys={200.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x002 -> 0x004 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfb</span><br><span style="color: hsl(120, 100%, 40%);">+sys={250.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x004 -> 0x00c (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={350.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00c -> 0x018 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={450.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x018 -> 0x030 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xcf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={500.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x030 -> 0x070 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x8f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={600.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x070 -> 0x0e0 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x1f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={700.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0e0 -> 0x1c0 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={750.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1c0 -> 0x1c1 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x3e</span><br><span style="color: hsl(120, 100%, 40%);">+sys={850.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1c1 -> 0x0c3 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x3c</span><br><span style="color: hsl(120, 100%, 40%);">+sys={950.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0c3 -> 0x047 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xb8</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1000.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x047 -> 0x0c7 (active_len=5, ramp_len=5, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x38</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1100.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0c7 -> 0x04f (active_len=5, ramp_len=5, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xb0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1200.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x04f -> 0x01f (active_len=5, ramp_len=5, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1250.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x01f -> 0x03f (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xc0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1350.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x03f -> 0x07e (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x81</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1450.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x07e -> 0x0fc (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x03</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1500.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x0fc -> 0x1fc (active_len=7, ramp_len=7, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x03</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1600.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1fc -> 0x1f9 (active_len=7, ramp_len=7, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x06</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1700.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1f9 -> 0x0fb (active_len=7, ramp_len=7, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x04</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1750.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x0fb -> 0x1fb (active_len=8, ramp_len=8, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x04</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1850.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1fb -> 0x0ff (active_len=8, ramp_len=8, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1950.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0ff -> 0x1fe (active_len=8, ramp_len=8, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x01</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2000.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1fe -> 0x1ff (active_len=9, ramp_len=9, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2250.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2500.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2750.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3000.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3250.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_up_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_updown_rotate(80, 90, 0, 100, 15)===</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+BTS allocation OK in test_acc_ramp_updown_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring one ACC ***</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x001 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={100.000000}: select(0): chan_load_avg=0</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x001 -> 0x002 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfd</span><br><span style="color: hsl(120, 100%, 40%);">+sys={200.000000}: select(1): chan_load_avg=15</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x002 -> 0x004 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfb</span><br><span style="color: hsl(120, 100%, 40%);">+sys={250.000000}: select(2): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x004 -> 0x00c (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={350.000000}: select(3): chan_load_avg=45</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00c -> 0x018 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={450.000000}: select(4): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x018 -> 0x030 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xcf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={500.000000}: select(5): chan_load_avg=75</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x030 -> 0x070 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x8f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={600.000000}: select(6): chan_load_avg=90</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x070 -> 0x0e0 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x1f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={700.000000}: select(7): chan_load_avg=100</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0e0 -> 0x1c0 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={750.000000}: select(8): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+sys={850.000000}: select(9): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1c0 -> 0x181 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x7e</span><br><span style="color: hsl(120, 100%, 40%);">+sys={950.000000}: select(10): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x181 -> 0x083 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x7c</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1000.000000}: select(11): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x083 -> 0x183 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x7c</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1100.000000}: select(12): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x183 -> 0x087 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x78</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1200.000000}: select(13): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x087 -> 0x00f (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1250.000000}: select(14): chan_load_avg=0</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x00f -> 0x01f (active_len=5, ramp_len=5, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1350.000000}: select(15): chan_load_avg=15</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x01f -> 0x03e (active_len=5, ramp_len=5, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xc1</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1450.000000}: select(16): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x03e -> 0x07c (active_len=5, ramp_len=5, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x83</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1500.000000}: select(17): chan_load_avg=45</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x07c -> 0x0fc (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x03</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1600.000000}: select(18): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0fc -> 0x1f8 (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x07</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1700.000000}: select(19): chan_load_avg=75</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1f8 -> 0x1f1 (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x0e</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1750.000000}: select(20): chan_load_avg=90</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1850.000000}: select(21): chan_load_avg=100</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1f1 -> 0x0f3 (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x0c</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1950.000000}: select(22): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0f3 -> 0x077 (active_len=6, ramp_len=6, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x88</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2000.000000}: select(23): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x077 -> 0x0f7 (active_len=7, ramp_len=7, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x08</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2100.000000}: select(24): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0f7 -> 0x07f (active_len=7, ramp_len=7, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x80</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2200.000000}: select(25): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x07f -> 0x0fe (active_len=7, ramp_len=7, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x01</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2250.000000}: select(26): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x0fe -> 0x1fe (active_len=8, ramp_len=8, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x01</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2350.000000}: select(27): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1fe -> 0x1fd (active_len=8, ramp_len=8, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x02</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2450.000000}: select(28): chan_load_avg=0</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1fd -> 0x0ff (active_len=8, ramp_len=8, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2500.000000}: select(29): chan_load_avg=15</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x0ff -> 0x1ff (active_len=9, ramp_len=9, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2750.000000}: select(30): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3000.000000}: select(31): chan_load_avg=45</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3250.000000}: select(32): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3500.000000}: select(33): chan_load_avg=75</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3750.000000}: select(34): chan_load_avg=90</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4000.000000}: select(35): chan_load_avg=100</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4250.000000}: select(36): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4500.000000}: select(37): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4750.000000}: select(38): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+sys={5000.000000}: select(39): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+sys={5250.000000}: select(40): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+sys={5500.000000}: select(41): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+sys={5750.000000}: select(42): chan_load_avg=0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={6000.000000}: select(43): chan_load_avg=15</span><br><span style="color: hsl(120, 100%, 40%);">+sys={6250.000000}: select(44): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+sys={6500.000000}: select(45): chan_load_avg=45</span><br><span style="color: hsl(120, 100%, 40%);">+sys={6750.000000}: select(46): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+sys={7000.000000}: select(47): chan_load_avg=75</span><br><span style="color: hsl(120, 100%, 40%);">+sys={7250.000000}: select(48): chan_load_avg=90</span><br><span style="color: hsl(120, 100%, 40%);">+sys={7500.000000}: select(49): chan_load_avg=100</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_updown_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_updown_rotate(30, 50, 10, 100, 15)===</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+BTS allocation OK in test_acc_ramp_updown_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring one ACC ***</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x001 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={100.000000}: select(0): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x001 -> 0x002 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfd</span><br><span style="color: hsl(120, 100%, 40%);">+sys={200.000000}: select(1): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x002 -> 0x004 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfb</span><br><span style="color: hsl(120, 100%, 40%);">+sys={250.000000}: select(2): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+sys={350.000000}: select(3): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x004 -> 0x008 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={450.000000}: select(4): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x008 -> 0x010 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xef</span><br><span style="color: hsl(120, 100%, 40%);">+sys={500.000000}: select(5): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+sys={600.000000}: select(6): chan_load_avg=100</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x010 -> 0x020 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xdf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={700.000000}: select(7): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x020 -> 0x040 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={750.000000}: select(8): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+sys={850.000000}: select(9): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x040 -> 0x080 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x7f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={950.000000}: select(10): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x080 -> 0x100 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1000.000000}: select(11): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x100 -> 0x101 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1100.000000}: select(12): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x101 -> 0x003 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfc</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1200.000000}: select(13): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x003 -> 0x006 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf9</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1250.000000}: select(14): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1350.000000}: select(15): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x006 -> 0x00c (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1450.000000}: select(16): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00c -> 0x018 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1500.000000}: select(17): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x018 -> 0x010 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xef</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1600.000000}: select(18): chan_load_avg=100</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x010 -> 0x020 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xdf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1700.000000}: select(19): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x020 -> 0x040 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1750.000000}: select(20): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1850.000000}: select(21): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x040 -> 0x080 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x7f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1950.000000}: select(22): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x080 -> 0x100 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2000.000000}: select(23): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x100 -> 0x101 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2100.000000}: select(24): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x101 -> 0x003 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfc</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2200.000000}: select(25): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x003 -> 0x006 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf9</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2250.000000}: select(26): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2350.000000}: select(27): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x006 -> 0x00c (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2450.000000}: select(28): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00c -> 0x018 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2500.000000}: select(29): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x018 -> 0x010 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xef</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2600.000000}: select(30): chan_load_avg=100</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x010 -> 0x020 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xdf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2700.000000}: select(31): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x020 -> 0x040 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2750.000000}: select(32): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2850.000000}: select(33): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x040 -> 0x080 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x7f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2950.000000}: select(34): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x080 -> 0x100 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3000.000000}: select(35): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x100 -> 0x101 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3100.000000}: select(36): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x101 -> 0x003 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfc</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3200.000000}: select(37): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x003 -> 0x006 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf9</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3250.000000}: select(38): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3350.000000}: select(39): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x006 -> 0x00c (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3450.000000}: select(40): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00c -> 0x018 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3500.000000}: select(41): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x018 -> 0x010 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xef</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3600.000000}: select(42): chan_load_avg=100</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x010 -> 0x020 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xdf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3700.000000}: select(43): chan_load_avg=85</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x020 -> 0x040 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3750.000000}: select(44): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3850.000000}: select(45): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x040 -> 0x080 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x7f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3950.000000}: select(46): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x080 -> 0x100 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4000.000000}: select(47): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x100 -> 0x101 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4100.000000}: select(48): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x101 -> 0x003 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfc</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4200.000000}: select(49): chan_load_avg=25</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x003 -> 0x006 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf9</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_updown_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_updown_rotate(50, 49, 0, 100, 10)===</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+BTS allocation OK in test_acc_ramp_updown_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring one ACC ***</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x001 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={100.000000}: select(0): chan_load_avg=0</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x001 -> 0x002 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfd</span><br><span style="color: hsl(120, 100%, 40%);">+sys={200.000000}: select(1): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x002 -> 0x004 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfb</span><br><span style="color: hsl(120, 100%, 40%);">+sys={250.000000}: select(2): chan_load_avg=20</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x004 -> 0x00c (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={350.000000}: select(3): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00c -> 0x018 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={450.000000}: select(4): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x018 -> 0x030 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xcf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={500.000000}: select(5): chan_load_avg=50</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x030 -> 0x020 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xdf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={600.000000}: select(6): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x020 -> 0x040 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={700.000000}: select(7): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x040 -> 0x080 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x7f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={750.000000}: select(8): chan_load_avg=80</span><br><span style="color: hsl(120, 100%, 40%);">+sys={850.000000}: select(9): chan_load_avg=90</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x080 -> 0x100 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+sys={950.000000}: select(10): chan_load_avg=100</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x100 -> 0x001 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1000.000000}: select(11): chan_load_avg=90</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1100.000000}: select(12): chan_load_avg=80</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x001 -> 0x002 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfd</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1200.000000}: select(13): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x002 -> 0x004 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfb</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1250.000000}: select(14): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1350.000000}: select(15): chan_load_avg=50</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x004 -> 0x008 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1450.000000}: select(16): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x008 -> 0x010 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xef</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1500.000000}: select(17): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x010 -> 0x030 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xcf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1600.000000}: select(18): chan_load_avg=20</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x030 -> 0x060 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x9f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1700.000000}: select(19): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x060 -> 0x0c0 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1750.000000}: select(20): chan_load_avg=0</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x0c0 -> 0x1c0 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1850.000000}: select(21): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1c0 -> 0x181 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x7e</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1950.000000}: select(22): chan_load_avg=20</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x181 -> 0x083 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x7c</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2000.000000}: select(23): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x083 -> 0x183 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x7c</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2100.000000}: select(24): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x183 -> 0x087 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x78</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2200.000000}: select(25): chan_load_avg=50</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x087 -> 0x00f (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2250.000000}: select(26): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x00f -> 0x00e (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf1</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2350.000000}: select(27): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00e -> 0x01c (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2450.000000}: select(28): chan_load_avg=80</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x01c -> 0x038 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xc7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2500.000000}: select(29): chan_load_avg=90</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x038 -> 0x030 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xcf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2600.000000}: select(30): chan_load_avg=100</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x030 -> 0x060 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x9f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2700.000000}: select(31): chan_load_avg=90</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x060 -> 0x0c0 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2750.000000}: select(32): chan_load_avg=80</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x0c0 -> 0x080 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x7f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2850.000000}: select(33): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x080 -> 0x100 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2950.000000}: select(34): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x100 -> 0x001 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfe</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3000.000000}: select(35): chan_load_avg=50</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3100.000000}: select(36): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x001 -> 0x002 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfd</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3200.000000}: select(37): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x002 -> 0x004 (active_len=1, ramp_len=1, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfb</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3250.000000}: select(38): chan_load_avg=20</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x004 -> 0x00c (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3350.000000}: select(39): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00c -> 0x018 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe7</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3450.000000}: select(40): chan_load_avg=0</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x018 -> 0x030 (active_len=2, ramp_len=2, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xcf</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3500.000000}: select(41): chan_load_avg=10</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x030 -> 0x070 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x8f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3600.000000}: select(42): chan_load_avg=20</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x070 -> 0x0e0 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x1f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3700.000000}: select(43): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0e0 -> 0x1c0 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3750.000000}: select(44): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1c0 -> 0x1c1 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x3e</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3850.000000}: select(45): chan_load_avg=50</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1c1 -> 0x0c3 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x3c</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3950.000000}: select(46): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0c3 -> 0x047 (active_len=4, ramp_len=4, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xb8</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4000.000000}: select(47): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x047 -> 0x046 (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xb9</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4100.000000}: select(48): chan_load_avg=80</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x046 -> 0x00e (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf1</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4200.000000}: select(49): chan_load_avg=90</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00e -> 0x01c (active_len=3, ramp_len=3, adm_len=10, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe3</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_updown_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_updown_rotate(30, 80, 30, 80, 5)===</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+BTS allocation OK in test_acc_ramp_updown_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring one ACC ***</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x1ff (active_len=9, ramp_len=10, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x1ff -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=9, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+sys={250.000000}: select(0): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+sys={500.000000}: select(1): chan_load_avg=35</span><br><span style="color: hsl(120, 100%, 40%);">+sys={750.000000}: select(2): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1000.000000}: select(3): chan_load_avg=45</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1250.000000}: select(4): chan_load_avg=50</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1500.000000}: select(5): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+sys={1750.000000}: select(6): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2000.000000}: select(7): chan_load_avg=65</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2250.000000}: select(8): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2500.000000}: select(9): chan_load_avg=75</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2750.000000}: select(10): chan_load_avg=80</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3000.000000}: select(11): chan_load_avg=75</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3250.000000}: select(12): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3500.000000}: select(13): chan_load_avg=65</span><br><span style="color: hsl(120, 100%, 40%);">+sys={3750.000000}: select(14): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4000.000000}: select(15): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4250.000000}: select(16): chan_load_avg=50</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4500.000000}: select(17): chan_load_avg=45</span><br><span style="color: hsl(120, 100%, 40%);">+sys={4750.000000}: select(18): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+sys={5000.000000}: select(19): chan_load_avg=35</span><br><span style="color: hsl(120, 100%, 40%);">+sys={5250.000000}: select(20): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+sys={5500.000000}: select(21): chan_load_avg=35</span><br><span style="color: hsl(120, 100%, 40%);">+sys={5750.000000}: select(22): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+sys={6000.000000}: select(23): chan_load_avg=45</span><br><span style="color: hsl(120, 100%, 40%);">+sys={6250.000000}: select(24): chan_load_avg=50</span><br><span style="color: hsl(120, 100%, 40%);">+sys={6500.000000}: select(25): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+sys={6750.000000}: select(26): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+sys={7000.000000}: select(27): chan_load_avg=65</span><br><span style="color: hsl(120, 100%, 40%);">+sys={7250.000000}: select(28): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+sys={7500.000000}: select(29): chan_load_avg=75</span><br><span style="color: hsl(120, 100%, 40%);">+sys={7750.000000}: select(30): chan_load_avg=80</span><br><span style="color: hsl(120, 100%, 40%);">+sys={8000.000000}: select(31): chan_load_avg=75</span><br><span style="color: hsl(120, 100%, 40%);">+sys={8250.000000}: select(32): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+sys={8500.000000}: select(33): chan_load_avg=65</span><br><span style="color: hsl(120, 100%, 40%);">+sys={8750.000000}: select(34): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+sys={9000.000000}: select(35): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+sys={9250.000000}: select(36): chan_load_avg=50</span><br><span style="color: hsl(120, 100%, 40%);">+sys={9500.000000}: select(37): chan_load_avg=45</span><br><span style="color: hsl(120, 100%, 40%);">+sys={9750.000000}: select(38): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+sys={10000.000000}: select(39): chan_load_avg=35</span><br><span style="color: hsl(120, 100%, 40%);">+sys={10250.000000}: select(40): chan_load_avg=30</span><br><span style="color: hsl(120, 100%, 40%);">+sys={10500.000000}: select(41): chan_load_avg=35</span><br><span style="color: hsl(120, 100%, 40%);">+sys={10750.000000}: select(42): chan_load_avg=40</span><br><span style="color: hsl(120, 100%, 40%);">+sys={11000.000000}: select(43): chan_load_avg=45</span><br><span style="color: hsl(120, 100%, 40%);">+sys={11250.000000}: select(44): chan_load_avg=50</span><br><span style="color: hsl(120, 100%, 40%);">+sys={11500.000000}: select(45): chan_load_avg=55</span><br><span style="color: hsl(120, 100%, 40%);">+sys={11750.000000}: select(46): chan_load_avg=60</span><br><span style="color: hsl(120, 100%, 40%);">+sys={12000.000000}: select(47): chan_load_avg=65</span><br><span style="color: hsl(120, 100%, 40%);">+sys={12250.000000}: select(48): chan_load_avg=70</span><br><span style="color: hsl(120, 100%, 40%);">+sys={12500.000000}: select(49): chan_load_avg=75</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_updown_rotate()</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19376">change 19376</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/+/19376"/><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: Id17f947c92cdfc0eb9541a9bf066338169caaeb5 </div>
<div style="display:none"> Gerrit-Change-Number: 19376 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@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>