<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>