<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19303">View Change</a></p><div style="white-space:pre-wrap">Approvals:
laforge: Looks good to me, approved
Hoernchen: Looks good to me, but someone else must approve
Jenkins Builder: Verified
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Introduce support for ACC subset rotation<br><br>See updated documentation section in manuals/chapters/bts.adoc regarding<br>an explanation on how the system works.<br><br>Related: SYS#4911<br>Change-Id: I952c9eeae02809c7184078c655574ec817902e06<br>---<br>M configure.ac<br>M doc/manuals/chapters/bts.adoc<br>M include/osmocom/bsc/acc.h<br>M include/osmocom/bsc/bts.h<br>M src/osmo-bsc/acc.c<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/bts.c<br>M src/osmo-bsc/system_information.c<br>M tests/Makefile.am<br>A tests/acc/Makefile.am<br>A tests/acc/acc_test.c<br>A tests/acc/acc_test.ok<br>M tests/gsm0408/gsm0408_test.c<br>M tests/testsuite.at<br>14 files changed, 1,610 insertions(+), 117 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index d25925b..4a58079 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -241,6 +241,7 @@</span><br><span> src/utils/Makefile</span><br><span> tests/Makefile</span><br><span> tests/atlocal</span><br><span style="color: hsl(120, 100%, 40%);">+ tests/acc/Makefile</span><br><span> tests/gsm0408/Makefile</span><br><span> tests/bsc/Makefile</span><br><span> tests/codec_pref/Makefile</span><br><span>diff --git a/doc/manuals/chapters/bts.adoc b/doc/manuals/chapters/bts.adoc</span><br><span>index 94e89a4..6e7a308 100644</span><br><span>--- a/doc/manuals/chapters/bts.adoc</span><br><span>+++ b/doc/manuals/chapters/bts.adoc</span><br><span>@@ -416,17 +416,28 @@</span><br><span> in order to minimize the delay when a RACH request or response gets lost the</span><br><span> MS should not wait too long before retransmitting.</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-==== Load Management</span><br><span style="color: hsl(120, 100%, 40%);">+==== Access Control Class Load Management</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-Every SIM card is member of one of the ten regular ACCs (0-9). Access to the</span><br><span style="color: hsl(0, 100%, 40%);">-BTS can be restricted to SIMs that are members of certain ACCs.</span><br><span style="color: hsl(120, 100%, 40%);">+Every SIM card is member of one of the ten regular ACCs (0-9). Access to the BTS</span><br><span style="color: hsl(120, 100%, 40%);">+can be restricted to SIMs that are members of certain ACCs.</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-Since the ACCs are distributed uniformly across all SIMs allowing only ACCs</span><br><span style="color: hsl(0, 100%, 40%);">-0-4 to connect to the BTS should reduce its load by 50%.</span><br><span style="color: hsl(120, 100%, 40%);">+Furthermore, high priority users (such as PLMN staff, public or emergency</span><br><span style="color: hsl(120, 100%, 40%);">+services, etc.) may be members of one or more ACCs from 11-15.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Since the ACCs 0-9 are distributed uniformly across all SIMs, for instance</span><br><span style="color: hsl(120, 100%, 40%);">+allowing only ACCs 0-4 to connect to the BTS should reduce its load by 50% at</span><br><span style="color: hsl(120, 100%, 40%);">+the expense of not serving 50% of the subscribers.</span><br><span> </span><br><span> The default is to allow all ACCs to connect.</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-.Example: Restrict access to the BTS by ACC</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC supports several levels of ACC management to allow or restrict access</span><br><span style="color: hsl(120, 100%, 40%);">+either permanently or temporarily on each BTS.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The first level of management consists of an access list to flag specific ACCs</span><br><span style="color: hsl(120, 100%, 40%);">+as permanently barred (the list can be updated at any time through VTY as seen</span><br><span style="color: hsl(120, 100%, 40%);">+below). As indicated above, the default is to allow all ACCs (0-15).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: Restrict permanent access to the BTS by ACC</span><br><span> ----</span><br><span> network</span><br><span> bts 0</span><br><span>@@ -436,12 +447,33 @@</span><br><span> <1> Disallow SIMs with access-class 1 from connecting to the BTS</span><br><span> <2> Permit SIMs with access-class 9 to connect to the BTS.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+On really crowded areas, a BTS may struggle to service all mobile stations</span><br><span style="color: hsl(120, 100%, 40%);">+willing to use it, and which may end up in collapse. In this kind of scenarios</span><br><span style="color: hsl(120, 100%, 40%);">+it is a good idea to temporarily further restrict the amount of allowed ACCs</span><br><span style="color: hsl(120, 100%, 40%);">+(hence restrict the amount of subscribers allowed to reach the BTS).</span><br><span style="color: hsl(120, 100%, 40%);">+However, doing so on a permanent basis would be unfair to subscribers from</span><br><span style="color: hsl(120, 100%, 40%);">+barred ACCs. Hence, OsmoBSC can be configured to temporarily generate ACC</span><br><span style="color: hsl(120, 100%, 40%);">+subsets of the permanent set presented above, and rotate them over time to allow</span><br><span style="color: hsl(120, 100%, 40%);">+fair access to all subscribers. This feature is only aimed at ACCs 0-9,</span><br><span style="color: hsl(120, 100%, 40%);">+since ACCs 11-15 are considered high priority and hence are always configured</span><br><span style="color: hsl(120, 100%, 40%);">+based on permanent list policy.</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-Smaller cells with lots of subscribers can be overwhelmed with traffic after</span><br><span style="color: hsl(0, 100%, 40%);">-the network is turned on. This is especially true in areas with little to no</span><br><span style="color: hsl(0, 100%, 40%);">-reception from other networks. To manage the load OsmoBSC has an option to</span><br><span style="color: hsl(0, 100%, 40%);">-enable one Access Class at a time so initial access to the network is</span><br><span style="color: hsl(0, 100%, 40%);">-distributed across a longer time.</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: Configure rotative access to the BTS</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+ access-control-rotate 3 <1></span><br><span style="color: hsl(120, 100%, 40%);">+ access-control-rotate-quantum 20 <2></span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+<1> Only allow up to 3 concurrent allowed ACCs from the permanent list</span><br><span style="color: hsl(120, 100%, 40%);">+<2> Rotate the generated permanent list subsets every 20 seconds in a fair fashion</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Furthermore, cells with large number of subscribers and limited overlapping</span><br><span style="color: hsl(120, 100%, 40%);">+coverage may become overwhelmed with traffic after the cell starts brodacasting.</span><br><span style="color: hsl(120, 100%, 40%);">+This is especially true in areas with little to no reception from other</span><br><span style="color: hsl(120, 100%, 40%);">+networks. To manage the load, OsmoBSC has an option to further restrict the</span><br><span style="color: hsl(120, 100%, 40%);">+rotating ACC subset during startup and slowly increment it over time and taking</span><br><span style="color: hsl(120, 100%, 40%);">+current load into account.</span><br><span> </span><br><span> .Example: Ramp up access to the BTS after startup</span><br><span> ----</span><br><span>@@ -456,6 +488,29 @@</span><br><span> <3> At each step enable one more ACC</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+Here a full example of all the mechanisms combined can be found:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: Full ACC Load Management config setup</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+ rach access-control-class 5 barred <1></span><br><span style="color: hsl(120, 100%, 40%);">+ rach access-control-class 6 barred</span><br><span style="color: hsl(120, 100%, 40%);">+ rach access-control-class 7 barred</span><br><span style="color: hsl(120, 100%, 40%);">+ rach access-control-class 8 barred</span><br><span style="color: hsl(120, 100%, 40%);">+ rach access-control-class 9 barred</span><br><span style="color: hsl(120, 100%, 40%);">+ access-control-class-rotate 3 <2></span><br><span style="color: hsl(120, 100%, 40%);">+ access-control-class-rotate-quantum 20 <3></span><br><span style="color: hsl(120, 100%, 40%);">+ access-control-class-ramping <4></span><br><span style="color: hsl(120, 100%, 40%);">+ access-control-class-ramping-step-size 1 <5></span><br><span style="color: hsl(120, 100%, 40%);">+ access-control-class-ramping-step-interval dynamic <6></span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+<1> ACCs 5-9 are administratively barred, ie they will never be used until somebody manually enables them in VTY config</span><br><span style="color: hsl(120, 100%, 40%);">+<2> Allow access through temporary subsets of len=3 from ACC set 0-4: (0,1,2) -> (1,2,3) -> (2,3,4) -> (3,4,0), etc.</span><br><span style="color: hsl(120, 100%, 40%);">+<3> Each subset iteration will happen every 20 seconds</span><br><span style="color: hsl(120, 100%, 40%);">+<4> During startup since ramping is enabled, it will further restrict the rotate subset size parameter (len=3)</span><br><span style="color: hsl(120, 100%, 40%);">+<5> The rotate subset size parameter will be increased one ACC slot at a time: len=0 -> len=1 -> len=2 -> len=3</span><br><span style="color: hsl(120, 100%, 40%);">+<6> The time until the subset size is further increased will be calculated based on current channel load</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> ==== RACH Parameter Configuration</span><br><span> </span><br><span> The following parameters allow control over how the MS can access the random</span><br><span>diff --git a/include/osmocom/bsc/acc.h b/include/osmocom/bsc/acc.h</span><br><span>index 31fc74f..bd75f95 100644</span><br><span>--- a/include/osmocom/bsc/acc.h</span><br><span>+++ b/include/osmocom/bsc/acc.h</span><br><span>@@ -27,6 +27,40 @@</span><br><span> #include <osmocom/core/timer.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define ACC_MGR_QUANTUM_DEFAULT 20 /* 20 seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Manage rotating subset of allowed Access Class as per configuration */</span><br><span style="color: hsl(120, 100%, 40%);">+struct acc_mgr {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts; /*!< backpointer to BTS using this ACC manager */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Administrative Maximum Number of ACC 0-9 to be allowed at the same time.</span><br><span style="color: hsl(120, 100%, 40%);">+ Configurable through VTY cmd "access-control-class-roundrobin",</span><br><span style="color: hsl(120, 100%, 40%);">+ defaults to all allowed (10) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t len_allowed_adm;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Further limiting the number of ACC to use. It may be lower due</span><br><span style="color: hsl(120, 100%, 40%);">+ to ramping, based for instance on channel or system load. */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t len_allowed_ramp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Time until next subset is generated */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t rotation_time_sec;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_timer_list rotate_timer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Bitmask containing subset of allowed ACC 0-9 on current rotation iteration */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t allowed_subset_mask;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Number of bits (ACC) set in allowed_subset_mask: 0->min(len_allowed_ramp, len_allowed_adm) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t allowed_subset_mask_count;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Number of ACC 0-9 allowed as per adminsitrative (permanent) config. */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t allowed_permanent_count;</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%);">+void acc_mgr_init(struct acc_mgr *acc_mgr, struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t acc_mgr_get_len_allowed_adm(struct acc_mgr *acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t acc_mgr_get_len_allowed_ramp(struct acc_mgr *acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+void acc_mgr_set_len_allowed_adm(struct acc_mgr *acc_mgr, uint8_t len_allowed_adm);</span><br><span style="color: hsl(120, 100%, 40%);">+void acc_mgr_set_len_allowed_ramp(struct acc_mgr *acc_mgr, uint8_t len_allowed_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+void acc_mgr_set_rotation_time(struct acc_mgr *acc_mgr, uint32_t rotation_time_sec);</span><br><span style="color: hsl(120, 100%, 40%);">+void acc_mgr_perm_subset_changed(struct acc_mgr *acc_mgr, struct gsm48_rach_control *rach_control);</span><br><span style="color: hsl(120, 100%, 40%);">+void acc_mgr_apply_acc(struct acc_mgr *acc_mgr, struct gsm48_rach_control *rach_control);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*!</span><br><span> * Access control class (ACC) ramping is used to slowly make the cell available to</span><br><span> * an increasing number of MS. This avoids overload at startup time in cases where</span><br><span>@@ -50,17 +84,6 @@</span><br><span> bool acc_ramping_enabled; /*!< whether ACC ramping is enabled */</span><br><span> </span><br><span> /*!</span><br><span style="color: hsl(0, 100%, 40%);">- * Bitmask which keeps track of access control classes that are currently denied</span><br><span style="color: hsl(0, 100%, 40%);">- * access. The function acc_ramp_apply() uses this mask to modulate bits from</span><br><span style="color: hsl(0, 100%, 40%);">- * octets 2 and 3 in RACH Control Parameters (see 3GPP 44.018 10.5.2.29).</span><br><span style="color: hsl(0, 100%, 40%);">- * Ramping is only concerned with ACCs 0-9. While any of the bits 0-9 is set,</span><br><span style="color: hsl(0, 100%, 40%);">- * the corresponding ACC is barred.</span><br><span style="color: hsl(0, 100%, 40%);">- * ACCs 11-15 should always be allowed, and ACC 10 denies emergency calls for</span><br><span style="color: hsl(0, 100%, 40%);">- * all ACCs from 0-9 inclusive; these ACCs are ignored in this implementation.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t barred_accs;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /*!</span><br><span> * This controls the maximum number of ACCs to allow per ramping step (1 - 10).</span><br><span> * The compile-time default value is ACC_RAMP_STEP_SIZE_DEFAULT.</span><br><span> * This value can be changed by VTY configuration.</span><br><span>@@ -126,33 +149,6 @@</span><br><span> return !(acc_ramp->step_interval_is_fixed);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * Return bitmasks which correspond to access control classes that are currently</span><br><span style="color: hsl(0, 100%, 40%);">- * denied access. Ramping is only concerned with those bits which control access</span><br><span style="color: hsl(0, 100%, 40%);">- * for ACCs 0-9, and any of the other bits will always be set to zero in these masks, i.e.</span><br><span style="color: hsl(0, 100%, 40%);">- * it is safe to OR these bitmasks with the corresponding fields in struct gsm48_rach_control.</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] acc_ramp Pointer to acc_ramp structure.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static inline uint8_t acc_ramp_get_barred_t2(struct acc_ramp *acc_ramp)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return ((acc_ramp->barred_accs >> 8) & 0x03);</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-static inline uint8_t acc_ramp_get_barred_t3(struct acc_ramp *acc_ramp)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return (acc_ramp->barred_accs & 0xff);</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%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * Potentially mark certain Access Control Classes (ACCs) as barred in accordance to ACC ramping.</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] rach_control RACH control parameters in which barred ACCs will be configured.</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] acc_ramp Pointer to acc_ramp structure.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static inline void acc_ramp_apply(struct gsm48_rach_control *rach_control, struct acc_ramp *acc_ramp)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- rach_control->t2 |= acc_ramp_get_barred_t2(acc_ramp);</span><br><span style="color: hsl(0, 100%, 40%);">- rach_control->t3 |= acc_ramp_get_barred_t3(acc_ramp);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</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>diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h</span><br><span>index 730dee9..16053a3 100644</span><br><span>--- a/include/osmocom/bsc/bts.h</span><br><span>+++ b/include/osmocom/bsc/bts.h</span><br><span>@@ -449,6 +449,7 @@</span><br><span> uint32_t si_mode_static;</span><br><span> </span><br><span> /* access control class ramping */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct acc_mgr acc_mgr;</span><br><span> struct acc_ramp acc_ramp;</span><br><span> </span><br><span> /* exclude the BTS from the global RF Lock handling */</span><br><span>diff --git a/src/osmo-bsc/acc.c b/src/osmo-bsc/acc.c</span><br><span>index a1941e4..b25f2fd 100644</span><br><span>--- a/src/osmo-bsc/acc.c</span><br><span>+++ b/src/osmo-bsc/acc.c</span><br><span>@@ -1,4 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2018 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2018-2020 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span> *</span><br><span> * Author: Stefan Sperling <ssperling@sysmocom.de></span><br><span> *</span><br><span>@@ -20,6 +20,8 @@</span><br><span> */</span><br><span> </span><br><span> #include <strings.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span> #include <errno.h></span><br><span> #include <stdbool.h></span><br><span> </span><br><span>@@ -43,42 +45,319 @@</span><br><span> return (bts->si_common.rach_control.t3 & (1 << (acc)));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void allow_one_acc(struct acc_ramp *acc_ramp, unsigned int acc)</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * Return bitmasks which correspond to access control classes that are currently</span><br><span style="color: hsl(120, 100%, 40%);">+ * denied access. Ramping is only concerned with those bits which control access</span><br><span style="color: hsl(120, 100%, 40%);">+ * for ACCs 0-9, and any of the other bits will always be set to zero in these masks, i.e.</span><br><span style="color: hsl(120, 100%, 40%);">+ * it is safe to OR these bitmasks with the corresponding fields in struct gsm48_rach_control.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] acc_mgr Pointer to acc_mgr structure.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static inline uint8_t acc_mgr_get_barred_t2(struct acc_mgr *acc_mgr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(acc <= 9);</span><br><span style="color: hsl(0, 100%, 40%);">- if (acc_ramp->barred_accs & (1 << acc))</span><br><span style="color: hsl(0, 100%, 40%);">- LOG_BTS(acc_ramp->bts, DRSL, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">- "ACC RAMP: allowing Access Control Class %u\n", acc);</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp->barred_accs &= ~(1 << acc);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ((~acc_mgr->allowed_subset_mask) >> 8) & 0x03;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static inline uint8_t acc_mgr_get_barred_t3(struct acc_mgr *acc_mgr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return (~acc_mgr->allowed_subset_mask) & 0xff;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void barr_one_acc(struct acc_ramp *acc_ramp, unsigned int acc)</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t acc_mgr_subset_len(struct acc_mgr *acc_mgr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(acc <= 9);</span><br><span style="color: hsl(0, 100%, 40%);">- if ((acc_ramp->barred_accs & (1 << acc)) == 0)</span><br><span style="color: hsl(0, 100%, 40%);">- LOG_BTS(acc_ramp->bts, DRSL, LOGL_NOTICE,</span><br><span style="color: hsl(0, 100%, 40%);">- "ACC RAMP: barring Access Control Class %u\n", acc);</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp->barred_accs |= (1 << acc);</span><br><span style="color: hsl(120, 100%, 40%);">+ return OSMO_MIN(acc_mgr->len_allowed_ramp, acc_mgr->len_allowed_adm);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void barr_all_accs(struct acc_ramp *acc_ramp)</span><br><span style="color: hsl(120, 100%, 40%);">+static void acc_mgr_enable_rotation_cond(struct acc_mgr *acc_mgr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int acc;</span><br><span style="color: hsl(0, 100%, 40%);">- for (acc = 0; acc < 10; acc++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!acc_is_permanently_barred(acc_ramp->bts, acc))</span><br><span style="color: hsl(0, 100%, 40%);">- barr_one_acc(acc_ramp, acc);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (acc_mgr->allowed_permanent_count && acc_mgr->allowed_subset_mask_count &&</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_permanent_count != acc_mgr->allowed_subset_mask_count) {</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%);">+ osmo_timer_schedule(&acc_mgr->rotate_timer, acc_mgr->rotation_time_sec, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* No rotation needed, disable rotation 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%);">+ osmo_timer_del(&acc_mgr->rotate_timer);</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void allow_all_accs(struct acc_ramp *acc_ramp)</span><br><span style="color: hsl(120, 100%, 40%);">+static void acc_mgr_gen_subset(struct acc_mgr *acc_mgr, bool update_si)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int acc;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t acc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask = 0; /* clean mask */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask_count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_permanent_count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> for (acc = 0; acc < 10; acc++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!acc_is_permanently_barred(acc_ramp->bts, acc))</span><br><span style="color: hsl(0, 100%, 40%);">- allow_one_acc(acc_ramp, acc);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (acc_is_permanently_barred(acc_mgr->bts, acc))</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_permanent_count++;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (acc_mgr->allowed_subset_mask_count < acc_mgr_subset_len(acc_mgr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask |= (1 << acc);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask_count++;</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%);">+ acc_mgr_enable_rotation_cond(acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_BTS(acc_mgr->bts, DRSL, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+ "ACC: New ACC allowed subset 0x%03" PRIx16 " (active_len=%" PRIu8</span><br><span style="color: hsl(120, 100%, 40%);">+ ", ramp_len=%" PRIu8 ", adm_len=%" PRIu8 ", perm_len=%" PRIu8 ", rotation=%s)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask, acc_mgr->allowed_subset_mask_count,</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->len_allowed_ramp, acc_mgr->len_allowed_adm,</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_permanent_count,</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_pending(&(acc_mgr)->rotate_timer) ? "on" : "off");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Trigger SI data update, acc_mgr_apply_acc will bew called */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (update_si)</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_bts_set_system_infos(acc_mgr->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t get_highest_allowed_acc(uint16_t mask)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ for (int i = 9; i >= 0; i--) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (mask & (1 << i))</span><br><span style="color: hsl(120, 100%, 40%);">+ return i;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t get_lowest_allowed_acc(uint16_t mask)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ for (int i = 0; i < 10; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (mask & (1 << i))</span><br><span style="color: hsl(120, 100%, 40%);">+ return i;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</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%);">+#define LOG_ACC_CHG(acc_mgr, level, old_mask, verb_str) \</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_BTS((acc_mgr)->bts, DRSL, level, \</span><br><span style="color: hsl(120, 100%, 40%);">+ "ACC: %s ACC allowed active subset 0x%03" PRIx16 " -> 0x%03" PRIx16 \</span><br><span style="color: hsl(120, 100%, 40%);">+ " (active_len=%" PRIu8 ", ramp_len=%" PRIu8 ", adm_len=%" PRIu8 \</span><br><span style="color: hsl(120, 100%, 40%);">+ ", perm_len=%" PRIu8 ", rotation=%s)\n", \</span><br><span style="color: hsl(120, 100%, 40%);">+ verb_str, old_mask, (acc_mgr)->allowed_subset_mask, \</span><br><span style="color: hsl(120, 100%, 40%);">+ (acc_mgr)->allowed_subset_mask_count, \</span><br><span style="color: hsl(120, 100%, 40%);">+ (acc_mgr)->len_allowed_ramp, (acc_mgr)->len_allowed_adm, \</span><br><span style="color: hsl(120, 100%, 40%);">+ (acc_mgr)->allowed_permanent_count, \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_pending(&(acc_mgr)->rotate_timer) ? "on" : "off")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Call when either adm_len or ramp_len changed (and values have been updated) */</span><br><span style="color: hsl(120, 100%, 40%);">+static void acc_mgr_subset_length_changed(struct acc_mgr *acc_mgr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t old_mask = acc_mgr->allowed_subset_mask;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t curr_len = acc_mgr->allowed_subset_mask_count;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t new_len = acc_mgr_subset_len(acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+ int8_t diff = new_len - curr_len;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (curr_len == new_len)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (new_len == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask_count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_enable_rotation_cond(acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_ACC_CHG(acc_mgr, LOGL_INFO, old_mask, "update");</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_bts_set_system_infos(acc_mgr->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</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%);">+ if (curr_len == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_gen_subset(acc_mgr, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</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%);">+ /* Try to add new ACCs to the set starting from highest one (since we rotate rolling up) */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (diff > 0) { /* curr_len < new_len */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t highest = get_highest_allowed_acc(acc_mgr->allowed_subset_mask);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* It's fine skipping highest in the loop since it's known to be already set: */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = (highest + 1) % 10; i != highest; i = (i + 1) % 10) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (acc_is_permanently_barred(acc_mgr->bts, i))</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (acc_mgr->allowed_subset_mask & (1 << i))</span><br><span style="color: hsl(120, 100%, 40%);">+ continue; /* already in set */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask |= (1 << i);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask_count++;</span><br><span style="color: hsl(120, 100%, 40%);">+ diff--;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (diff == 0)</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%);">+ } else { /* curr_len > new_len, try removing from lowest one. */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t lowest = get_lowest_allowed_acc(acc_mgr->allowed_subset_mask);</span><br><span style="color: hsl(120, 100%, 40%);">+ i = lowest;</span><br><span style="color: hsl(120, 100%, 40%);">+ do {</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((acc_mgr->allowed_subset_mask & (1 << i))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask &= ~(1 << i);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask_count--;</span><br><span style="color: hsl(120, 100%, 40%);">+ diff++;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (diff == 0)</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%);">+ i = (i + 1) % 10;</span><br><span style="color: hsl(120, 100%, 40%);">+ } while(i != lowest);</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%);">+ acc_mgr_enable_rotation_cond(acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_ACC_CHG(acc_mgr, LOGL_INFO, old_mask, "update");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* if we updated the set, notify about it */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (curr_len != acc_mgr->allowed_subset_mask_count)</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_bts_set_system_infos(acc_mgr->bts);</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%);">+/* Eg: (2,3,4) -> first=2; last=4. (3,7,8) -> first=3, last=8; (8,9,2) -> first=8, last=2 */</span><br><span style="color: hsl(120, 100%, 40%);">+void get_subset_limits(struct acc_mgr *acc_mgr, uint8_t *first, uint8_t *last)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t lowest = get_lowest_allowed_acc(acc_mgr->allowed_subset_mask);</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t highest = get_highest_allowed_acc(acc_mgr->allowed_subset_mask);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* check if there's unselected ACCs between lowest and highest, that</span><br><span style="color: hsl(120, 100%, 40%);">+ * means subset is wrapping around, eg: (8,9,1)</span><br><span style="color: hsl(120, 100%, 40%);">+ * Assumption: The permanent set is bigger than the current selected subset */</span><br><span style="color: hsl(120, 100%, 40%);">+ bool is_wrapped = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t i = (lowest + 1) % 10;</span><br><span style="color: hsl(120, 100%, 40%);">+ do {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!acc_is_permanently_barred(acc_mgr->bts, i) &&</span><br><span style="color: hsl(120, 100%, 40%);">+ !(acc_mgr->allowed_subset_mask & (1 << i))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ is_wrapped = true;</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%);">+ i = (i + 1 ) % 10;</span><br><span style="color: hsl(120, 100%, 40%);">+ } while (i != (highest + 1) % 10);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (is_wrapped) {</span><br><span style="color: hsl(120, 100%, 40%);">+ *first = highest;</span><br><span style="color: hsl(120, 100%, 40%);">+ *last = lowest;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ *first = lowest;</span><br><span style="color: hsl(120, 100%, 40%);">+ *last = highest;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+static void do_acc_rotate_step(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct acc_mgr *acc_mgr = data;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t i;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t first, last;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t old_mask = acc_mgr->allowed_subset_mask;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Assumption: The size of the subset didn't change, that's handled by</span><br><span style="color: hsl(120, 100%, 40%);">+ * acc_mgr_subset_length_changed()</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%);">+ /* Assumption: Rotation timer has been disabled if no ACC is allowed */</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->allowed_subset_mask_count != 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* One ACC is rotated at a time: Drop first ACC and add next from last ACC */</span><br><span style="color: hsl(120, 100%, 40%);">+ get_subset_limits(acc_mgr, &first, &last);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask &= ~(1 << first);</span><br><span style="color: hsl(120, 100%, 40%);">+ i = (last + 1) % 10;</span><br><span style="color: hsl(120, 100%, 40%);">+ do {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!acc_is_permanently_barred(acc_mgr->bts, i) &&</span><br><span style="color: hsl(120, 100%, 40%);">+ !(acc_mgr->allowed_subset_mask & (1 << i))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* found first one which can be allowed, do it and be done */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->allowed_subset_mask |= (1 << i);</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%);">+ i = (i + 1 ) % 10;</span><br><span style="color: hsl(120, 100%, 40%);">+ } while (i != (last + 1) % 10);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_schedule(&acc_mgr->rotate_timer, acc_mgr->rotation_time_sec, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (old_mask != acc_mgr->allowed_subset_mask) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_ACC_CHG(acc_mgr, LOGL_INFO, old_mask, "rotate");</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_bts_set_system_infos(acc_mgr->bts);</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void acc_mgr_init(struct acc_mgr *acc_mgr, struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->bts = bts;</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->len_allowed_adm = 10; /* Allow all by default */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->len_allowed_ramp = 10;</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->rotation_time_sec = ACC_MGR_QUANTUM_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_setup(&acc_mgr->rotate_timer, do_acc_rotate_step, acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: Don't update SI yet, avoid crash due to bts->model being NULL */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_gen_subset(acc_mgr, false);</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%);">+uint8_t acc_mgr_get_len_allowed_adm(struct acc_mgr *acc_mgr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return acc_mgr->len_allowed_adm;</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%);">+uint8_t acc_mgr_get_len_allowed_ramp(struct acc_mgr *acc_mgr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return acc_mgr->len_allowed_ramp;</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%);">+void acc_mgr_set_len_allowed_adm(struct acc_mgr *acc_mgr, uint8_t len_allowed_adm)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t old_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(len_allowed_adm <= 10);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (acc_mgr->len_allowed_adm == len_allowed_adm)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_BTS(acc_mgr->bts, DRSL, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+ "ACC: administrative rotate subset size set to %" PRIu8 "\n", len_allowed_adm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ old_len = acc_mgr_subset_len(acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->len_allowed_adm = len_allowed_adm;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (old_len != acc_mgr_subset_len(acc_mgr))</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_subset_length_changed(acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+void acc_mgr_set_len_allowed_ramp(struct acc_mgr *acc_mgr, uint8_t len_allowed_ramp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t old_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(len_allowed_ramp <= 10);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (acc_mgr->len_allowed_ramp == len_allowed_ramp)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_BTS(acc_mgr->bts, DRSL, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+ "ACC: ramping rotate subset size set to %" PRIu8 "\n", len_allowed_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ old_len = acc_mgr_subset_len(acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->len_allowed_ramp = len_allowed_ramp;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (old_len != acc_mgr_subset_len(acc_mgr))</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_subset_length_changed(acc_mgr);</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%);">+void acc_mgr_set_rotation_time(struct acc_mgr *acc_mgr, uint32_t rotation_time_sec)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_BTS(acc_mgr->bts, DRSL, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+ "ACC: rotate subset time set to %" PRIu32 " seconds\n", rotation_time_sec);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr->rotation_time_sec = rotation_time_sec;</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%);">+void acc_mgr_perm_subset_changed(struct acc_mgr *acc_mgr, struct gsm48_rach_control *rach_control)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Even if amount is the same, the allowed/barred ones may have changed,</span><br><span style="color: hsl(120, 100%, 40%);">+ * so let's retrigger generation of an entire subset rather than</span><br><span style="color: hsl(120, 100%, 40%);">+ * rotating it */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_gen_subset(acc_mgr, true);</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%);">+ * Potentially mark certain Access Control Classes (ACCs) as barred in accordance to ACC policy.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] acc_mgr Pointer to acc_mgr structure.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] rach_control RACH control parameters in which barred ACCs will be configured.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void acc_mgr_apply_acc(struct acc_mgr *acc_mgr, struct gsm48_rach_control *rach_control)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ rach_control->t2 |= acc_mgr_get_barred_t2(acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+ rach_control->t3 |= acc_mgr_get_barred_t3(acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+//////////////////////////</span><br><span style="color: hsl(120, 100%, 40%);">+// acc_ramp</span><br><span style="color: hsl(120, 100%, 40%);">+//////////////////////////</span><br><span> static unsigned int get_next_step_interval(struct acc_ramp *acc_ramp)</span><br><span> {</span><br><span> struct gsm_bts *bts = acc_ramp->bts;</span><br><span>@@ -104,42 +383,14 @@</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%);">- int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct acc_mgr *acc_mgr = &acc_ramp->bts->acc_mgr;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t old_len = acc_mgr_get_len_allowed_ramp(acc_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t new_len = OSMO_MIN(10, old_len + acc_ramp->step_size);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Shortcut in case we only do one ramping step. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (acc_ramp->step_size == ACC_RAMP_STEP_SIZE_MAX) {</span><br><span style="color: hsl(0, 100%, 40%);">- allow_all_accs(acc_ramp);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_system_infos(acc_ramp->bts);</span><br><span style="color: hsl(0, 100%, 40%);">- return;</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%);">- /* Allow 'step_size' ACCs, starting from ACC0. ACC9 will be allowed last. */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < acc_ramp->step_size; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- int idx = ffs(acc_ramp_get_barred_t3(acc_ramp));</span><br><span style="color: hsl(0, 100%, 40%);">- if (idx > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* One of ACC0-ACC7 is still bared. */</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int acc = idx - 1;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!acc_is_permanently_barred(acc_ramp->bts, acc))</span><br><span style="color: hsl(0, 100%, 40%);">- allow_one_acc(acc_ramp, acc);</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- idx = ffs(acc_ramp_get_barred_t2(acc_ramp));</span><br><span style="color: hsl(0, 100%, 40%);">- if (idx == 1 || idx == 2) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* ACC8 or ACC9 is still barred. */</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int acc = idx - 1 + 8;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!acc_is_permanently_barred(acc_ramp->bts, acc))</span><br><span style="color: hsl(0, 100%, 40%);">- allow_one_acc(acc_ramp, acc);</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- /* All ACCs are now allowed. */</span><br><span style="color: hsl(0, 100%, 40%);">- break;</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%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_set_system_infos(acc_ramp->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_ramp(acc_mgr, new_len);</span><br><span> </span><br><span> /* If we have not allowed all ACCs yet, schedule another ramping step. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (acc_ramp_get_barred_t2(acc_ramp) != 0x00 ||</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp_get_barred_t3(acc_ramp) != 0x00)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (new_len != 10)</span><br><span> osmo_timer_schedule(&acc_ramp->step_timer, get_next_step_interval(acc_ramp), 0);</span><br><span> }</span><br><span> </span><br><span>@@ -279,7 +530,6 @@</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> acc_ramp->step_interval_is_fixed = false;</span><br><span style="color: hsl(0, 100%, 40%);">- allow_all_accs(acc_ramp);</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>@@ -344,7 +594,7 @@</span><br><span> </span><br><span> if (acc_ramp_is_enabled(acc_ramp)) {</span><br><span> /* Set all available ACCs to barred and start ramping up. */</span><br><span style="color: hsl(0, 100%, 40%);">- barr_all_accs(acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_ramp(&acc_ramp->bts->acc_mgr, 0);</span><br><span> do_acc_ramping_step(acc_ramp);</span><br><span> }</span><br><span> }</span><br><span>@@ -358,5 +608,5 @@</span><br><span> if (osmo_timer_pending(&acc_ramp->step_timer))</span><br><span> osmo_timer_del(&acc_ramp->step_timer);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- allow_all_accs(acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_ramp(&acc_ramp->bts->acc_mgr, 10);</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 9cc7673..0be4e6d 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -404,6 +404,8 @@</span><br><span> VTY_NEWLINE);</span><br><span> vty_out(vty, " Cell Reselection Hysteresis: %u dBm%s",</span><br><span> bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " Access Control Class rotation allow mask: 0x%" PRIx16 "%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->acc_mgr.allowed_subset_mask, VTY_NEWLINE);</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>@@ -948,6 +950,10 @@</span><br><span> for (i = 0; i < 8; i++)</span><br><span> if ((i != 2) && (bts->si_common.rach_control.t2 & (0x1 << i)))</span><br><span> vty_out(vty, " rach access-control-class %d barred%s", i+8, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->acc_mgr.len_allowed_adm < 10)</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " access-control-class-rotate %" PRIu8 "%s", bts->acc_mgr.len_allowed_adm, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->acc_mgr.rotation_time_sec != ACC_MGR_QUANTUM_DEFAULT)</span><br><span style="color: hsl(120, 100%, 40%);">+ 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> if (!acc_ramp_step_interval_is_dynamic(&bts->acc_ramp)) {</span><br><span> vty_out(vty, " access-control-class-ramping-step-interval %u%s",</span><br><span>@@ -2745,6 +2751,9 @@</span><br><span> else</span><br><span> bts->si_common.rach_control.t2 |= (0x1 << (control_class - 8));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (control_class < 10)</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_perm_subset_changed(&bts->acc_mgr, &bts->si_common.rach_control);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -3640,6 +3649,30 @@</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_rotate,</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_bts_acc_rotate_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "access-control-class-rotate <0-10>",</span><br><span style="color: hsl(120, 100%, 40%);">+ "Enable Access Control Class allowed subset rotation\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Size of the rotating allowed ACC 0-9 subset (default=10, no subset)\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 len_allowed_adm = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_adm(&bts->acc_mgr, len_allowed_adm);</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_bts_acc_rotate_quantum,</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_bts_acc_rotate_quantum_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "access-control-class-rotate-quantum <1-65535>",</span><br><span style="color: hsl(120, 100%, 40%);">+ "Time between rotation of ACC 0-9 generated subsets\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Time in seconds (default=" OSMO_STRINGIFY_VAL(ACC_MGR_QUANTUM_DEFAULT) ")\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%);">+ uint32_t rotation_time_sec = (uint32_t)atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_rotation_time(&bts->acc_mgr, rotation_time_sec);</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_bts_acc_ramping,</span><br><span> cfg_bts_acc_ramping_cmd,</span><br><span> "access-control-class-ramping",</span><br><span>@@ -6493,6 +6526,8 @@</span><br><span> install_element(BTS_NODE, &cfg_bts_amr_hr_hyst3_cmd);</span><br><span> install_element(BTS_NODE, &cfg_bts_amr_hr_start_mode_cmd);</span><br><span> install_element(BTS_NODE, &cfg_bts_pcu_sock_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(BTS_NODE, &cfg_bts_acc_rotate_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(BTS_NODE, &cfg_bts_acc_rotate_quantum_cmd);</span><br><span> install_element(BTS_NODE, &cfg_bts_acc_ramping_cmd);</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>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index 7794024..4318b7e 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -387,6 +387,7 @@</span><br><span> bts_init_cbch_state(&bts->cbch_basic, bts);</span><br><span> bts_init_cbch_state(&bts->cbch_extended, bts);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_init(&bts->acc_mgr, bts);</span><br><span> acc_ramp_init(&bts->acc_ramp, bts);</span><br><span> </span><br><span> return bts;</span><br><span>diff --git a/src/osmo-bsc/system_information.c b/src/osmo-bsc/system_information.c</span><br><span>index fe78e8e..7011127 100644</span><br><span>--- a/src/osmo-bsc/system_information.c</span><br><span>+++ b/src/osmo-bsc/system_information.c</span><br><span>@@ -723,8 +723,7 @@</span><br><span> list_arfcn(si1->cell_channel_description, 0xce, "Serving cell:");</span><br><span> </span><br><span> si1->rach_control = bts->si_common.rach_control;</span><br><span style="color: hsl(0, 100%, 40%);">- if (acc_ramp_is_enabled(&bts->acc_ramp))</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp_apply(&si1->rach_control, &bts->acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_apply_acc(&bts->acc_mgr, &si1->rach_control);</span><br><span> </span><br><span> /*</span><br><span> * SI1 Rest Octets (10.5.2.32), contains NCH position and band</span><br><span>@@ -755,8 +754,7 @@</span><br><span> </span><br><span> si2->ncc_permitted = bts->si_common.ncc_permitted;</span><br><span> si2->rach_control = bts->si_common.rach_control;</span><br><span style="color: hsl(0, 100%, 40%);">- if (acc_ramp_is_enabled(&bts->acc_ramp))</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp_apply(&si2->rach_control, &bts->acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_apply_acc(&bts->acc_mgr, &si2->rach_control);</span><br><span> </span><br><span> return sizeof(*si2);</span><br><span> }</span><br><span>@@ -790,8 +788,7 @@</span><br><span> bts->si_valid &= ~(1 << SYSINFO_TYPE_2bis);</span><br><span> </span><br><span> si2b->rach_control = bts->si_common.rach_control;</span><br><span style="color: hsl(0, 100%, 40%);">- if (acc_ramp_is_enabled(&bts->acc_ramp))</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp_apply(&si2b->rach_control, &bts->acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_apply_acc(&bts->acc_mgr, &si2b->rach_control);</span><br><span> </span><br><span> /* SI2bis Rest Octets as per 3GPP TS 44.018 §10.5.2.33 */</span><br><span> rc = rest_octets_si2bis(si2b->rest_octets);</span><br><span>@@ -912,8 +909,7 @@</span><br><span> si3->cell_options = bts->si_common.cell_options;</span><br><span> si3->cell_sel_par = bts->si_common.cell_sel_par;</span><br><span> si3->rach_control = bts->si_common.rach_control;</span><br><span style="color: hsl(0, 100%, 40%);">- if (acc_ramp_is_enabled(&bts->acc_ramp))</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp_apply(&si3->rach_control, &bts->acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_apply_acc(&bts->acc_mgr, &si3->rach_control);</span><br><span> </span><br><span> /* allow/disallow DTXu */</span><br><span> gsm48_set_dtx(&si3->cell_options, bts->dtxu, bts->dtxu, true);</span><br><span>@@ -962,8 +958,7 @@</span><br><span> gsm48_generate_lai2(&si4->lai, bts_lai(bts));</span><br><span> si4->cell_sel_par = bts->si_common.cell_sel_par;</span><br><span> si4->rach_control = bts->si_common.rach_control;</span><br><span style="color: hsl(0, 100%, 40%);">- if (acc_ramp_is_enabled(&bts->acc_ramp))</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp_apply(&si4->rach_control, &bts->acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_apply_acc(&bts->acc_mgr, &si4->rach_control);</span><br><span> </span><br><span> /* Optional: CBCH Channel Description + CBCH Mobile Allocation */</span><br><span> cbch_lchan = gsm_bts_get_cbch(bts);</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 9f2e0e0..07de847 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -1,4 +1,5 @@</span><br><span> SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ acc \</span><br><span> bsc \</span><br><span> codec_pref \</span><br><span> gsm0408 \</span><br><span>diff --git a/tests/acc/Makefile.am b/tests/acc/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..4726ddc</span><br><span>--- /dev/null</span><br><span>+++ b/tests/acc/Makefile.am</span><br><span>@@ -0,0 +1,37 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(all_includes) \</span><br><span style="color: hsl(120, 100%, 40%);">+ -I$(top_srcdir)/include \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ -Wall \</span><br><span style="color: hsl(120, 100%, 40%);">+ -ggdb3 \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(COVERAGE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_test.ok \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_PROGRAMS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_test \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+acc_test_SOURCES = \</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_test.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+acc_test_LDADD = \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOABIS_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span>diff --git a/tests/acc/acc_test.c b/tests/acc/acc_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..54f3de1</span><br><span>--- /dev/null</span><br><span>+++ b/tests/acc/acc_test.c</span><br><span>@@ -0,0 +1,493 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program. If not, see <http://www.gnu.org/licenses/>.</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%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_12_21.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm23003.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/abis_nm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void clock_debug(char* str)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct timespec ts;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct timeval tv;</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_clock_gettime(CLOCK_MONOTONIC, &ts);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_gettimeofday(&tv, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "sys={%lu.%06lu}: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ tv.tv_sec, tv.tv_usec, str);</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%);">+#define bts_init(net) _bts_init(net, __func__)</span><br><span style="color: hsl(120, 100%, 40%);">+static inline struct gsm_bts *_bts_init(struct gsm_network *net, const char *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = gsm_bts_alloc(net, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "BTS allocation failure in %s()\n", msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "BTS allocation OK in %s()\n", msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->network = net;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return bts;</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%);">+#define bts_del(bts) _bts_del(bts, __func__)</span><br><span style="color: hsl(120, 100%, 40%);">+static inline void _bts_del(struct gsm_bts *bts, const char *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_group_free(bts->bts_statg);</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_group_free(bts->bts_ctrs);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (osmo_timer_pending(&bts->acc_mgr.rotate_timer))</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_del(&bts->acc_mgr.rotate_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* no need to llist_del(&bts->list), we never registered the bts there. */</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "BTS deallocated OK in %s()\n", msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void do_allowed_len_adm_loop(struct acc_mgr *acc_mgr, uint8_t jump)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "%s(%" PRIu8 ")\n", __func__, jump);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Test decreasing the administrative (VTY) max subset size */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 10; i >= 0; i -= jump) {</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_adm(acc_mgr, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (i != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_adm(acc_mgr, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Test increasing the administrative (VTY) max subset size */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i <= 10; i += jump) {</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_adm(acc_mgr, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (i != 10)</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_adm(acc_mgr, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void do_allowed_len_ramp_loop(struct acc_mgr *acc_mgr, uint8_t jump)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "%s(%" PRIu8 ")\n", __func__, jump);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Test decreasing the administrative (VTY) max subset size */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 10; i >= 0; i -= jump) {</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_ramp(acc_mgr, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (i != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_ramp(acc_mgr, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Test increasing the administrative (VTY) max subset size */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i <= 10; i += jump) {</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_ramp(acc_mgr, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (i != 10)</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_ramp(acc_mgr, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_acc_mgr_no_ramp(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "===%s===\n", __func__);</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%);">+</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_mgr_get_len_allowed_adm(acc_mgr) == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr_get_len_allowed_ramp(acc_mgr) == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->rotation_time_sec == ACC_MGR_QUANTUM_DEFAULT);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->allowed_subset_mask == 0x3ff);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->allowed_subset_mask_count == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->allowed_permanent_count == 10);</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%);">+ do_allowed_len_adm_loop(acc_mgr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ do_allowed_len_adm_loop(acc_mgr, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Now permantenly barr some ACC */</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "*** Barring some ACCs ***\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%);">+ bts->si_common.rach_control.t3 |= 0xa5;</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%);">+ do_allowed_len_adm_loop(acc_mgr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ do_allowed_len_adm_loop(acc_mgr, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "*** Barring ALL ACCs ***\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t2 |= 0x03;</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t3 |= 0xff;</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%);">+ fprintf(stderr, "*** Barring zero ACCs ***\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t2 = 0xfc;</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t3 = 0x00;</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%);">+ bts_del(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_acc_mgr_manual_ramp(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "===%s===\n", __func__);</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%);">+</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_mgr_get_len_allowed_adm(acc_mgr) == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr_get_len_allowed_ramp(acc_mgr) == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->rotation_time_sec == ACC_MGR_QUANTUM_DEFAULT);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->allowed_subset_mask == 0x3ff);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->allowed_subset_mask_count == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->allowed_permanent_count == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ do_allowed_len_ramp_loop(acc_mgr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ do_allowed_len_ramp_loop(acc_mgr, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Now permantenly barr some ACC */</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "*** Barring some ACCs ***\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t2 |= 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t3 |= 0xb3;</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%);">+ do_allowed_len_ramp_loop(acc_mgr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ do_allowed_len_ramp_loop(acc_mgr, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "*** Barring ALL ACCs ***\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t2 |= 0x03;</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t3 |= 0xff;</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%);">+ do_allowed_len_ramp_loop(acc_mgr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ do_allowed_len_ramp_loop(acc_mgr, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "*** Barring zero ACCs ***\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t2 = 0xfc;</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t3 = 0x00;</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%);">+ do_allowed_len_ramp_loop(acc_mgr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ do_allowed_len_ramp_loop(acc_mgr, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "*** Barring some ACCs + adm len 4 ***\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_adm(acc_mgr, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t2 = 0xfd;</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.rach_control.t3 = 0xb3;</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%);">+ do_allowed_len_ramp_loop(acc_mgr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ do_allowed_len_ramp_loop(acc_mgr, 4);</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 style="color: hsl(120, 100%, 40%);">+static void test_acc_mgr_rotate(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "===%s===\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</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%);">+</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%);">+</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_mgr_get_len_allowed_adm(acc_mgr) == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr_get_len_allowed_ramp(acc_mgr) == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->rotation_time_sec == ACC_MGR_QUANTUM_DEFAULT);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->allowed_subset_mask == 0x3ff);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->allowed_subset_mask_count == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_mgr->allowed_permanent_count == 10);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Test that 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_rotation_time(acc_mgr, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_adm(acc_mgr, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < 20; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_gettimeofday_override_time.tv_sec += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ clock_debug("select()");</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%);">+</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 style="color: hsl(120, 100%, 40%);">+static void test_acc_ramp_fixed(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "===%s===\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</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%);">+</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%);">+ OSMO_ASSERT(acc_ramp_step_interval_is_dynamic(acc_ramp) == true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set super high rotation time so it doesn't interfer here: */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_rotation_time(acc_mgr, 5000);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ //acc_ramp_set_step_interval_dynamic(acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_ramp_set_step_interval(acc_ramp, 1) == -ERANGE);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(acc_ramp_set_step_interval(acc_ramp, 50) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_ramp_set_step_size(acc_ramp, 1);</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%);">+ 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%);">+ for (i = 0; i < 9; i++) {</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%);">+ clock_debug("select()");</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%);">+</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 style="color: hsl(120, 100%, 40%);">+static void test_acc_ramp_fixed2(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "===%s===\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</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%);">+</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%);">+ OSMO_ASSERT(acc_ramp_step_interval_is_dynamic(acc_ramp) == true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set super high rotation time so it doesn't interfer here: */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_rotation_time(acc_mgr, 5000);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set adm len to test that ramping won't go over it */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_len_allowed_adm(acc_mgr, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_ramp_set_step_size(acc_ramp, 3);</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%);">+ 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%);">+ for (i = 0; i < 3; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_gettimeofday_override_time.tv_sec += ACC_RAMP_STEP_INTERVAL_MIN;</span><br><span style="color: hsl(120, 100%, 40%);">+ clock_debug("select()");</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%);">+</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 style="color: hsl(120, 100%, 40%);">+static void test_acc_ramp_fixed3(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "===%s===\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</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%);">+</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%);">+ OSMO_ASSERT(acc_ramp_step_interval_is_dynamic(acc_ramp) == true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set super high rotation time so it doesn't interfer here: */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_rotation_time(acc_mgr, 5000);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Test that ramping won't go over permanently barred ACC*/</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "*** Barring some ACCs ***\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%);">+ bts->si_common.rach_control.t3 |= 0xa5;</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%);">+ acc_ramp_set_step_size(acc_ramp, 1);</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%);">+ 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%);">+ for (i = 0; i < 9; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_gettimeofday_override_time.tv_sec += ACC_RAMP_STEP_INTERVAL_MIN;</span><br><span style="color: hsl(120, 100%, 40%);">+ clock_debug("select()");</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%);">+</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 style="color: hsl(120, 100%, 40%);">+static void test_acc_ramp_dynamic(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "===%s===\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+ char buf[128];</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int step_sec;</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%);">+</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%);">+ OSMO_ASSERT(acc_ramp_step_interval_is_dynamic(acc_ramp) == true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set super high rotation time so it doesn't interfer here: */</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_set_rotation_time(acc_mgr, 5000);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_ramp_set_step_interval_dynamic(acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_ramp_set_step_size(acc_ramp, 1);</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 = 0; /*set 70% 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%);">+ while (osmo_timer_pending(&acc_ramp->step_timer)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->chan_load_avg += 10;</span><br><span style="color: hsl(120, 100%, 40%);">+ step_sec = ((bts->chan_load_avg * ACC_RAMP_STEP_INTERVAL_MAX) / 100);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_gettimeofday_override_time.tv_sec += step_sec;</span><br><span style="color: hsl(120, 100%, 40%);">+ snprintf(buf, sizeof(buf), "select(): load=%" PRIu8 " -> step_sec=%u",</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->chan_load_avg, step_sec);</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%);">+</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 style="color: hsl(120, 100%, 40%);">+static void test_acc_ramp_fixed_rotate(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "===%s===\n", __func__);</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%);">+</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%);">+ OSMO_ASSERT(acc_ramp_step_interval_is_dynamic(acc_ramp) == true);</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%);">+ acc_ramp_set_step_size(acc_ramp, 1);</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%);">+ 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%);">+ while (true) {</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 if (osmo_timer_pending(&acc_ramp->step_timer)) {</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%);">+ } 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. We are then done</span><br><span style="color: hsl(120, 100%, 40%);">+ */</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%);">+ clock_debug("select()");</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%);">+</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 style="color: hsl(120, 100%, 40%);">+static const struct log_info_cat log_categories[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [DRSL] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "DRSL",</span><br><span style="color: hsl(120, 100%, 40%);">+ .description = "A-bis Radio Signalling Link (RSL)",</span><br><span style="color: hsl(120, 100%, 40%);">+ .enabled = 1, .loglevel = LOGL_NOTICE,</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%);">+static const struct log_info log_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .cat = log_categories,</span><br><span style="color: hsl(120, 100%, 40%);">+ .num_cat = ARRAY_SIZE(log_categories),</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%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_network *net;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_gettimeofday_override = true;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ tall_bsc_ctx = talloc_named_const(NULL, 0, "gsm0408_test");</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_init_logging2(tall_bsc_ctx, &log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+ log_set_log_level(osmo_stderr_target, LOGL_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+ log_set_print_category_hex(osmo_stderr_target, false);</span><br><span style="color: hsl(120, 100%, 40%);">+ log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);</span><br><span style="color: hsl(120, 100%, 40%);">+ log_set_use_color(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ net = gsm_network_init(tall_bsc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!net) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "Network init failure.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return EXIT_FAILURE;</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%);">+ test_acc_mgr_no_ramp(net);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_acc_mgr_manual_ramp(net);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_acc_mgr_rotate(net);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_acc_ramp_fixed(net);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_acc_ramp_fixed2(net);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_acc_ramp_fixed3(net);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_acc_ramp_dynamic(net);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_acc_ramp_fixed_rotate(net);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return EXIT_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Whenever ACC code changes the set of barred ACCs, gsm_bts_set_system_infos()</span><br><span style="color: hsl(120, 100%, 40%);">+ * is called which ends up calling pcu_info_update */</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_info_update(struct gsm_bts *bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_rach_control rach_control = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_mgr_apply_acc(&bts->acc_mgr, &rach_control);</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "%s(): t2=0x%02" PRIx8 " t3=0x%02" PRIx8 "\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ __func__, rach_control.t2, rach_control.t3);</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%);">+struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *net) {</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(0);</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%);">+bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts) { return true; }</span><br><span style="color: hsl(120, 100%, 40%);">+void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {}</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type, const uint8_t *data, int len) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type si_type) { return 0; }</span><br><span>diff --git a/tests/acc/acc_test.ok b/tests/acc/acc_test.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..f377651</span><br><span>--- /dev/null</span><br><span>+++ b/tests/acc/acc_test.ok</span><br><span>@@ -0,0 +1,620 @@</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_mgr_no_ramp===</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_mgr_no_ramp()</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_adm_loop(1)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3ff -> 0x3fe (active_len=9, ramp_len=10, adm_len=9, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x01</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3fe -> 0x3fc (active_len=8, ramp_len=10, adm_len=8, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x03</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3fc -> 0x3f8 (active_len=7, ramp_len=10, adm_len=7, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x07</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3f8 -> 0x3f0 (active_len=6, ramp_len=10, adm_len=6, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3f0 -> 0x3e0 (active_len=5, ramp_len=10, adm_len=5, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x1f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3e0 -> 0x3c0 (active_len=4, ramp_len=10, adm_len=4, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3c0 -> 0x380 (active_len=3, ramp_len=10, adm_len=3, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x7f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x380 -> 0x300 (active_len=2, ramp_len=10, adm_len=2, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x300 -> 0x200 (active_len=1, ramp_len=10, adm_len=1, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x200 -> 0x000 (active_len=0, ramp_len=10, adm_len=0, perm_len=10, 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=10, adm_len=1, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x001 -> 0x003 (active_len=2, ramp_len=10, adm_len=2, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x003 -> 0x007 (active_len=3, ramp_len=10, adm_len=3, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf8</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x007 -> 0x00f (active_len=4, ramp_len=10, adm_len=4, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x00f -> 0x01f (active_len=5, ramp_len=10, adm_len=5, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x01f -> 0x03f (active_len=6, ramp_len=10, adm_len=6, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x03f -> 0x07f (active_len=7, ramp_len=10, adm_len=7, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x07f -> 0x0ff (active_len=8, ramp_len=10, adm_len=8, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x0ff -> 0x1ff (active_len=9, ramp_len=10, adm_len=9, perm_len=10, rotation=on)</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 -> 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_adm_loop(4)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3ff -> 0x3f0 (active_len=6, ramp_len=10, adm_len=6, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3f0 -> 0x300 (active_len=2, ramp_len=10, adm_len=2, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x300 -> 0x000 (active_len=0, ramp_len=10, adm_len=0, perm_len=10, 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 0x00f (active_len=4, ramp_len=10, adm_len=4, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x00f -> 0x0ff (active_len=8, ramp_len=10, adm_len=8, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x0ff -> 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring some ACCs ***</span><br><span style="color: hsl(120, 100%, 40%);">+(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 style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xa5</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_adm_loop(1)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=10, adm_len=9, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=10, adm_len=8, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=10, adm_len=7, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=10, adm_len=6, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x158 (active_len=4, ramp_len=10, adm_len=4, perm_len=5, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xa7</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x158 -> 0x150 (active_len=3, ramp_len=10, adm_len=3, perm_len=5, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xaf</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x150 -> 0x140 (active_len=2, ramp_len=10, adm_len=2, perm_len=5, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x140 -> 0x100 (active_len=1, ramp_len=10, adm_len=1, perm_len=5, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x100 -> 0x000 (active_len=0, ramp_len=10, adm_len=0, perm_len=5, 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 0x002 (active_len=1, ramp_len=10, adm_len=1, perm_len=5, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x002 -> 0x00a (active_len=2, ramp_len=10, adm_len=2, perm_len=5, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf5</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x00a -> 0x01a (active_len=3, ramp_len=10, adm_len=3, perm_len=5, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe5</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x01a -> 0x05a (active_len=4, ramp_len=10, adm_len=4, perm_len=5, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xa5</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x05a -> 0x15a (active_len=5, ramp_len=10, adm_len=5, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xa5</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=10, adm_len=6, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=10, adm_len=7, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=10, adm_len=8, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=10, adm_len=9, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(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(120, 100%, 40%);">+do_allowed_len_adm_loop(4)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x15a (active_len=5, ramp_len=10, adm_len=6, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x140 (active_len=2, ramp_len=10, adm_len=2, perm_len=5, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x140 -> 0x000 (active_len=0, ramp_len=10, adm_len=0, perm_len=5, 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 0x05a (active_len=4, ramp_len=10, adm_len=4, perm_len=5, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xa5</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x05a -> 0x15a (active_len=5, ramp_len=10, adm_len=8, perm_len=5, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xa5</span><br><span style="color: hsl(120, 100%, 40%);">+(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(120, 100%, 40%);">+*** Barring ALL ACCs ***</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x000 (active_len=0, ramp_len=10, adm_len=10, perm_len=0, 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%);">+*** Barring zero ACCs ***</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%);">+pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_mgr_no_ramp()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_mgr_manual_ramp===</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_mgr_manual_ramp()</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_ramp_loop(1)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3ff -> 0x3fe (active_len=9, ramp_len=9, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x01</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3fe -> 0x3fc (active_len=8, ramp_len=8, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x03</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3fc -> 0x3f8 (active_len=7, ramp_len=7, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x07</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3f8 -> 0x3f0 (active_len=6, ramp_len=6, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3f0 -> 0x3e0 (active_len=5, ramp_len=5, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x1f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3e0 -> 0x3c0 (active_len=4, ramp_len=4, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3c0 -> 0x380 (active_len=3, ramp_len=3, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x7f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x380 -> 0x300 (active_len=2, ramp_len=2, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x300 -> 0x200 (active_len=1, ramp_len=1, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x200 -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=10, 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=10, 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%);">+(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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfc</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf8</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf0</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=10, 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%);">+(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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xc0</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=10, perm_len=10, 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%);">+(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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x00</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=10, rotation=on)</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 -> 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_ramp_loop(4)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3ff -> 0x3f0 (active_len=6, ramp_len=6, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3f0 -> 0x300 (active_len=2, ramp_len=2, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x300 -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=10, 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 0x00f (active_len=4, ramp_len=4, adm_len=10, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x00f -> 0x0ff (active_len=8, ramp_len=8, adm_len=10, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x0ff -> 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring some ACCs ***</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x24c (active_len=4, ramp_len=10, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xb3</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_ramp_loop(1)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=9, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=8, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=7, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=6, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=5, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x248 (active_len=3, ramp_len=3, adm_len=10, perm_len=4, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xb7</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x248 -> 0x240 (active_len=2, ramp_len=2, adm_len=10, perm_len=4, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x240 -> 0x200 (active_len=1, ramp_len=1, adm_len=10, perm_len=4, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x200 -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=4, 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 0x004 (active_len=1, ramp_len=1, adm_len=10, perm_len=4, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x004 -> 0x00c (active_len=2, ramp_len=2, adm_len=10, perm_len=4, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x00c -> 0x04c (active_len=3, ramp_len=3, adm_len=10, perm_len=4, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xb3</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x04c -> 0x24c (active_len=4, ramp_len=4, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xb3</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=5, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=6, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=7, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=8, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=9, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=10, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_ramp_loop(4)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=6, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x240 (active_len=2, ramp_len=2, adm_len=10, perm_len=4, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x240 -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=4, 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 0x24c (active_len=4, ramp_len=4, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xb3</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=8, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x24c (active_len=4, ramp_len=10, adm_len=10, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring ALL ACCs ***</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x000 (active_len=0, ramp_len=10, adm_len=10, perm_len=0, 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%);">+do_allowed_len_ramp_loop(1)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x000 (active_len=0, ramp_len=9, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=8, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=7, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=6, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=5, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=4, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=3, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=2, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=1, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=1, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=2, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=3, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=4, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=5, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=6, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=7, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=8, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=9, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=10, adm_len=10, perm_len=0, 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%);">+do_allowed_len_ramp_loop(4)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x000 (active_len=0, ramp_len=6, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=2, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=4, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=8, adm_len=10, perm_len=0, 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 0x000 (active_len=0, ramp_len=10, adm_len=10, perm_len=0, 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%);">+*** Barring zero ACCs ***</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%);">+pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_ramp_loop(1)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3ff -> 0x3fe (active_len=9, ramp_len=9, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x01</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3fe -> 0x3fc (active_len=8, ramp_len=8, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x03</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3fc -> 0x3f8 (active_len=7, ramp_len=7, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x07</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3f8 -> 0x3f0 (active_len=6, ramp_len=6, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3f0 -> 0x3e0 (active_len=5, ramp_len=5, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x1f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3e0 -> 0x3c0 (active_len=4, ramp_len=4, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3c0 -> 0x380 (active_len=3, ramp_len=3, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x7f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x380 -> 0x300 (active_len=2, ramp_len=2, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x300 -> 0x200 (active_len=1, ramp_len=1, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x200 -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=10, 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=10, 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%);">+(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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfc</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf8</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf0</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=10, 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%);">+(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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xc0</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=10, perm_len=10, 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%);">+(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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x00</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=10, rotation=on)</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 -> 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_ramp_loop(4)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3ff -> 0x3f0 (active_len=6, ramp_len=6, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3f0 -> 0x300 (active_len=2, ramp_len=2, adm_len=10, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x300 -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=10, 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 0x00f (active_len=4, ramp_len=4, adm_len=10, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x00f -> 0x0ff (active_len=8, ramp_len=8, adm_len=10, perm_len=10, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x0ff -> 0x3ff (active_len=10, ramp_len=10, adm_len=10, perm_len=10, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring some ACCs + adm len 4 ***</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x3ff -> 0x3c0 (active_len=4, ramp_len=10, adm_len=4, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x3f</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: New ACC allowed subset 0x24c (active_len=4, ramp_len=10, adm_len=4, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xb3</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_ramp_loop(1)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x248 (active_len=3, ramp_len=3, adm_len=4, perm_len=4, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xb7</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x248 -> 0x240 (active_len=2, ramp_len=2, adm_len=4, perm_len=4, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x240 -> 0x200 (active_len=1, ramp_len=1, adm_len=4, perm_len=4, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xff</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x200 -> 0x000 (active_len=0, ramp_len=0, adm_len=4, perm_len=4, 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 0x004 (active_len=1, ramp_len=1, adm_len=4, perm_len=4, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x004 -> 0x00c (active_len=2, ramp_len=2, adm_len=4, perm_len=4, 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%);">+(bts=0) ACC: update ACC allowed active subset 0x00c -> 0x04c (active_len=3, ramp_len=3, adm_len=4, perm_len=4, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xb3</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x04c -> 0x24c (active_len=4, ramp_len=4, adm_len=4, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xb3</span><br><span style="color: hsl(120, 100%, 40%);">+do_allowed_len_ramp_loop(4)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x24c -> 0x240 (active_len=2, ramp_len=2, adm_len=4, perm_len=4, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xbf</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x240 -> 0x000 (active_len=0, ramp_len=0, adm_len=4, perm_len=4, 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 0x24c (active_len=4, ramp_len=4, adm_len=4, perm_len=4, rotation=off)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x01 t3=0xb3</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_mgr_manual_ramp()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_mgr_rotate===</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_mgr_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 -> 0x1e0 (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x1f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1e0 -> 0x1c1 (active_len=4, ramp_len=10, adm_len=4, 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={4.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=10, adm_len=4, 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={6.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=10, adm_len=4, 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={8.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x047 -> 0x00f (active_len=4, ramp_len=10, adm_len=4, 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={10.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00f -> 0x01e (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe1</span><br><span style="color: hsl(120, 100%, 40%);">+sys={12.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x01e -> 0x03c (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xc3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={14.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x03c -> 0x078 (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x87</span><br><span style="color: hsl(120, 100%, 40%);">+sys={16.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x078 -> 0x0f0 (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={18.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0f0 -> 0x1e0 (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x1f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={20.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1e0 -> 0x1c1 (active_len=4, ramp_len=10, adm_len=4, 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={22.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=10, adm_len=4, 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={24.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=10, adm_len=4, 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={26.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x047 -> 0x00f (active_len=4, ramp_len=10, adm_len=4, 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={28.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x00f -> 0x01e (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe1</span><br><span style="color: hsl(120, 100%, 40%);">+sys={30.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x01e -> 0x03c (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xc3</span><br><span style="color: hsl(120, 100%, 40%);">+sys={32.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x03c -> 0x078 (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x87</span><br><span style="color: hsl(120, 100%, 40%);">+sys={34.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x078 -> 0x0f0 (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x0f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={36.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x0f0 -> 0x1e0 (active_len=4, ramp_len=10, adm_len=4, perm_len=9, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0x1f</span><br><span style="color: hsl(120, 100%, 40%);">+sys={38.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: rotate ACC allowed active subset 0x1e0 -> 0x1c1 (active_len=4, ramp_len=10, adm_len=4, 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={40.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=10, adm_len=4, 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%);">+BTS deallocated OK in test_acc_mgr_rotate()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_fixed===</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_fixed()</span><br><span style="color: hsl(120, 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(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=10, 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={50.000000}: select()</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfc</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: 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf8</span><br><span style="color: hsl(120, 100%, 40%);">+sys={150.000000}: select()</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf0</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: 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe0</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 0x01f -> 0x03f (active_len=6, ramp_len=6, adm_len=10, perm_len=10, 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={300.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=10, perm_len=10, 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={350.000000}: select()</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+sys={400.000000}: select()</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=10, rotation=on)</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={450.000000}: select()</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_fixed()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_fixed2===</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_fixed2()</span><br><span style="color: hsl(120, 100%, 40%);">+(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 style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x07</span><br><span style="color: hsl(120, 100%, 40%);">+(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 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 0x007 (active_len=3, ramp_len=3, adm_len=7, perm_len=10, rotation=on)</span><br><span style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf8</span><br><span style="color: hsl(120, 100%, 40%);">+sys={30.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(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 style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xc0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={60.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=9, adm_len=7, perm_len=10, 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={90.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_fixed2()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_fixed3===</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_fixed3()</span><br><span style="color: hsl(120, 100%, 40%);">+*** Barring some ACCs ***</span><br><span style="color: hsl(120, 100%, 40%);">+(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 style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xa5</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0) ACC: update ACC allowed active subset 0x15a -> 0x000 (active_len=0, ramp_len=0, adm_len=10, perm_len=5, 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 0x002 (active_len=1, ramp_len=1, adm_len=10, perm_len=5, 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={30.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(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 style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf5</span><br><span style="color: hsl(120, 100%, 40%);">+sys={60.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(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 style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xe5</span><br><span style="color: hsl(120, 100%, 40%);">+sys={90.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(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 style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xa5</span><br><span style="color: hsl(120, 100%, 40%);">+sys={120.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(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 style="color: hsl(120, 100%, 40%);">+pcu_info_update(): t2=0x02 t3=0xa5</span><br><span style="color: hsl(120, 100%, 40%);">+sys={150.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(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(120, 100%, 40%);">+sys={180.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(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(120, 100%, 40%);">+sys={210.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(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(120, 100%, 40%);">+sys={240.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(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(120, 100%, 40%);">+sys={270.000000}: select()</span><br><span style="color: hsl(120, 100%, 40%);">+(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(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_fixed3()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_dynamic===</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_dynamic()</span><br><span style="color: hsl(120, 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(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=10, 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={60.000000}: select(): load=10 -> step_sec=60</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xfc</span><br><span style="color: hsl(120, 100%, 40%);">+sys={180.000000}: select(): load=20 -> step_sec=120</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf8</span><br><span style="color: hsl(120, 100%, 40%);">+sys={360.000000}: select(): load=30 -> step_sec=180</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0xf0</span><br><span style="color: hsl(120, 100%, 40%);">+sys={600.000000}: select(): load=40 -> step_sec=240</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=10, 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={900.000000}: select(): load=50 -> step_sec=300</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=10, 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={1260.000000}: select(): load=60 -> step_sec=360</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=10, perm_len=10, 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={1680.000000}: select(): load=70 -> step_sec=420</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x03 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+sys={2160.000000}: select(): load=80 -> step_sec=480</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=10, rotation=on)</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={2700.000000}: select(): load=90 -> step_sec=540</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+pcu_info_update(): t2=0x00 t3=0x00</span><br><span style="color: hsl(120, 100%, 40%);">+BTS deallocated OK in test_acc_ramp_dynamic()</span><br><span style="color: hsl(120, 100%, 40%);">+===test_acc_ramp_fixed_rotate===</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_fixed_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%);">+BTS deallocated OK in test_acc_ramp_fixed_rotate()</span><br><span>diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c</span><br><span>index e53b83a..35531f8 100644</span><br><span>--- a/tests/gsm0408/gsm0408_test.c</span><br><span>+++ b/tests/gsm0408/gsm0408_test.c</span><br><span>@@ -140,6 +140,8 @@</span><br><span> {</span><br><span> osmo_stat_item_group_free(bts->bts_statg);</span><br><span> rate_ctr_group_free(bts->bts_ctrs);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (osmo_timer_pending(&bts->acc_mgr.rotate_timer))</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_del(&bts->acc_mgr.rotate_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> printf("BTS deallocated OK in %s()\n", msg);</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index 1a190dd..1c43249 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -20,6 +20,12 @@</span><br><span> AT_CHECK([$abs_top_builddir/tests/abis/abis_test], [], [expout], [ignore])</span><br><span> AT_CLEANUP</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([acc])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([acc])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/acc/acc_test.ok > experr</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_top_builddir/tests/acc/acc_test], [], [ignore], [experr])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CLEANUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AT_SETUP([bsc])</span><br><span> AT_KEYWORDS([bsc])</span><br><span> cat $abs_srcdir/bsc/bsc_test.ok > expout</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19303">change 19303</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/+/19303"/><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: I952c9eeae02809c7184078c655574ec817902e06 </div>
<div style="display:none"> Gerrit-Change-Number: 19303 </div>
<div style="display:none"> Gerrit-PatchSet: 10 </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>