Change in osmo-bsc[master]: Introduce support for ACC ramping during whole BTS life cycle

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Fri Jul 31 09:56:46 UTC 2020


pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/19376 )

Change subject: Introduce support for ACC ramping during whole BTS life cycle
......................................................................

Introduce support for ACC ramping during whole BTS life cycle

Prior to this patch, ACC ramping was only used to go 0->N in the
number of allowed ACCs during BTS startup. It could optionally
dynamically stretch or extend the ramping time based on channel load.

With this patch, ACC ramping is kept alive during the entire time the
BTS is active, and subset of allowed ACCs can now be incresed or
decreased based on channel load. A new VTY command
"access-control-class-ramping-chan-load" is added to configure a lower
and an upper threshold. Channel load under the low threshold will
potentially trigger an increment of the subset size of allowed ACCs,
while a channel load over the upper threshold will potentially trigger
the opposite (a decrease in size).
The time between checks is kept fixed per VTY command (reusing old
"access-control-class-ramping-step-size"), but the "dynamic" option
is deprecated and ignored from now on since it provides nothing valuable
in the new implementation, because the size always dynamically changes
based on channel load (configured thresholds).

Related: SYS#4912
Change-Id: Id17f947c92cdfc0eb9541a9bf066338169caaeb5
---
M include/osmocom/bsc/acc.h
M src/osmo-bsc/acc.c
M src/osmo-bsc/bsc_vty.c
M tests/acc/acc_test.c
M tests/acc/acc_test.ok
5 files changed, 902 insertions(+), 180 deletions(-)

Approvals:
  laforge: Looks good to me, but someone else must approve
  Hoernchen: Looks good to me, approved
  Jenkins Builder: Verified



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

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/19376
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: Id17f947c92cdfc0eb9541a9bf066338169caaeb5
Gerrit-Change-Number: 19376
Gerrit-PatchSet: 5
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-Reviewer: Hoernchen <ewild at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200731/e1e86009/attachment.htm>


More information about the gerrit-log mailing list