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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Allow multiple bts objects in PCU<br><br>This patch doesn't really tests whether osmo-pcu can work on a multi-bts<br>environment, but it prepares the data structures to be able to do so at<br>any later point in time.<br><br>Change-Id: I6b10913f46c19d438c4e250a436a7446694b725a<br>---<br>M README.md<br>M src/bts.cpp<br>M src/bts.h<br>M src/gprs_bssgp_pcu.c<br>M src/gprs_pcu.c<br>M src/gprs_pcu.h<br>M src/gprs_rlcmac.cpp<br>M src/gprs_rlcmac.h<br>M src/gprs_rlcmac_sched.cpp<br>M src/osmo-bts-litecell15/lc15_l1_if.c<br>M src/osmo-bts-oc2g/oc2g_l1_if.c<br>M src/osmo-bts-sysmo/sysmo_l1_if.c<br>M src/osmobts_sock.c<br>M src/pcu_l1_if.cpp<br>M src/pcu_l1_if.h<br>M src/pcu_main.cpp<br>M src/pcu_vty.c<br>M src/pcu_vty_functions.cpp<br>M tests/alloc/AllocTest.cpp<br>M tests/alloc/MslotTest.cpp<br>M tests/app_info/AppInfoTest.cpp<br>M tests/edge/EdgeTest.cpp<br>M tests/emu/pcu_emu.cpp<br>M tests/fn/FnTest.cpp<br>M tests/ms/MsTest.cpp<br>M tests/tbf/TbfTest.cpp<br>M tests/types/TypesTest.cpp<br>27 files changed, 355 insertions(+), 263 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/README.md b/README.md</span><br><span>index 65cf475..89c299c 100644</span><br><span>--- a/README.md</span><br><span>+++ b/README.md</span><br><span>@@ -82,3 +82,4 @@</span><br><span>  * No half-duplex class support (only semi-duplex)</span><br><span>  * No TA loop</span><br><span>  * No power loop</span><br><span style="color: hsl(120, 100%, 40%);">+ * Multi-BTS support not tested</span><br><span>diff --git a/src/bts.cpp b/src/bts.cpp</span><br><span>index 499c033..b5bb3a2 100644</span><br><span>--- a/src/bts.cpp</span><br><span>+++ b/src/bts.cpp</span><br><span>@@ -221,10 +221,12 @@</span><br><span>          msgb_free(bts->app_info);</span><br><span>                 bts->app_info = NULL;</span><br><span>     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_del(&bts->list);</span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gprs_rlcmac_bts* bts_alloc(struct gprs_pcu *pcu)</span><br><span style="color: hsl(120, 100%, 40%);">+struct gprs_rlcmac_bts* bts_alloc(struct gprs_pcu *pcu, uint8_t bts_nr)</span><br><span> {</span><br><span>      struct gprs_rlcmac_bts* bts;</span><br><span>         bts = talloc_zero(pcu, struct gprs_rlcmac_bts);</span><br><span>@@ -233,6 +235,7 @@</span><br><span>        talloc_set_destructor(bts, bts_talloc_destructor);</span><br><span> </span><br><span>       bts->pcu = pcu;</span><br><span style="color: hsl(120, 100%, 40%);">+    bts->nr = bts_nr;</span><br><span> </span><br><span>     bts->pollController = new PollController(*bts);</span><br><span>   bts->sba = new SBAController(*bts);</span><br><span>@@ -286,6 +289,8 @@</span><br><span>         bts->statg = osmo_stat_item_group_alloc(tall_pcu_ctx, &bts_statg_desc, 0);</span><br><span>    OSMO_ASSERT(bts->statg);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       llist_add_tail(&bts->list, &pcu->bts_list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return bts;</span><br><span> }</span><br><span> </span><br><span>@@ -916,7 +921,7 @@</span><br><span>   }</span><br><span> </span><br><span>        if (plen >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-               pcu_l1if_tx_agch(bv, plen);</span><br><span style="color: hsl(120, 100%, 40%);">+           pcu_l1if_tx_agch(bts, bv, plen);</span><br><span>     else</span><br><span>                 rc = plen;</span><br><span> </span><br><span>@@ -995,7 +1000,7 @@</span><br><span>                                                    GSM_L1_BURST_TYPE_ACCESS_0);</span><br><span>     if (plen >= 0) {</span><br><span>          bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_DL_TBF);</span><br><span style="color: hsl(0, 100%, 40%);">-          pcu_l1if_tx_pch(immediate_assignment, plen, pgroup);</span><br><span style="color: hsl(120, 100%, 40%);">+          pcu_l1if_tx_pch(bts, immediate_assignment, plen, pgroup);</span><br><span>    }</span><br><span> </span><br><span>        bitvec_free(immediate_assignment);</span><br><span>@@ -1125,10 +1130,11 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void bts_update_tbf_ta(const char *p, uint32_t fn, uint8_t trx_no, uint8_t ts, int8_t ta, bool is_rach)</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_update_tbf_ta(struct gprs_rlcmac_bts *bts, const char *p, uint32_t fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                   uint8_t trx_no, uint8_t ts, int8_t ta, bool is_rach)</span><br><span> {</span><br><span>     struct gprs_rlcmac_ul_tbf *tbf =</span><br><span style="color: hsl(0, 100%, 40%);">-                bts_ul_tbf_by_poll_fn(the_pcu->bts, fn, trx_no, ts);</span><br><span style="color: hsl(120, 100%, 40%);">+               bts_ul_tbf_by_poll_fn(bts, fn, trx_no, ts);</span><br><span>  if (!tbf)</span><br><span>            LOGP(DL1IF, LOGL_DEBUG, "[%s] update TA = %u ignored due to "</span><br><span>                   "unknown UL TBF on TRX = %d, TS = %d, FN = %d\n",</span><br><span>diff --git a/src/bts.h b/src/bts.h</span><br><span>index 37fc5dc..d1881b2 100644</span><br><span>--- a/src/bts.h</span><br><span>+++ b/src/bts.h</span><br><span>@@ -67,7 +67,8 @@</span><br><span> void bts_trx_unreserve_slots(struct gprs_rlcmac_trx *trx, enum gprs_rlcmac_tbf_direction dir, uint8_t slots);</span><br><span> void bts_trx_free_all_tbf(struct gprs_rlcmac_trx *trx);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void bts_update_tbf_ta(const char *p, uint32_t fn, uint8_t trx_no, uint8_t ts, int8_t ta, bool is_rach);</span><br><span style="color: hsl(120, 100%, 40%);">+void bts_update_tbf_ta(struct gprs_rlcmac_bts *bts, const char *p, uint32_t fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint8_t trx_no, uint8_t ts, int8_t ta, bool is_rach);</span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span> #endif</span><br><span>@@ -194,6 +195,8 @@</span><br><span>  * on my TRXs.</span><br><span>  */</span><br><span> struct gprs_rlcmac_bts {</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t nr; /* bts_nr */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct llist_head list; /* queued in pcu->bts_list */</span><br><span>     bool active;</span><br><span>         uint8_t bsic;</span><br><span>        uint8_t cs_mask; /* Allowed CS mask from BTS */</span><br><span>@@ -317,7 +320,7 @@</span><br><span>        osmo_stat_item_set(bts->statg->items[stat_id], val + inc);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gprs_rlcmac_bts *bts_alloc(struct gprs_pcu *pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gprs_rlcmac_bts *bts_alloc(struct gprs_pcu *pcu, uint8_t bts_nr);</span><br><span> </span><br><span> void bts_recalc_initial_cs(struct gprs_rlcmac_bts *bts);</span><br><span> void bts_recalc_initial_mcs(struct gprs_rlcmac_bts *bts);</span><br><span>diff --git a/src/gprs_bssgp_pcu.c b/src/gprs_bssgp_pcu.c</span><br><span>index 288bc45..956fb66 100644</span><br><span>--- a/src/gprs_bssgp_pcu.c</span><br><span>+++ b/src/gprs_bssgp_pcu.c</span><br><span>@@ -204,18 +204,24 @@</span><br><span> static int gprs_bssgp_pcu_rx_paging_cs(struct msgb *msg, const struct tlv_parsed *tp)</span><br><span> {</span><br><span>  struct osmo_mobile_identity mi;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_rlcmac_bts *bts;</span><br><span>         int rc;</span><br><span> </span><br><span>  if ((rc = get_paging_mi(&mi, tp)) > 0)</span><br><span>                return bssgp_tx_status((enum gprs_bssgp_cause) rc, NULL, msg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      return bts_add_paging(the_pcu->bts, tlvp_val8(tp, BSSGP_IE_CHAN_NEEDED, 0), &mi);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: look if MS is attached a specific BTS and then only page on that one? */</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          bts_add_paging(bts, tlvp_val8(tp, BSSGP_IE_CHAN_NEEDED, 0), &mi);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span> }</span><br><span> </span><br><span> static int gprs_bssgp_pcu_rx_paging_ps(struct msgb *msg, const struct tlv_parsed *tp)</span><br><span> {</span><br><span>     struct osmo_mobile_identity mi_imsi;</span><br><span>         struct osmo_mobile_identity paging_mi;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts;</span><br><span>         uint16_t pgroup;</span><br><span>     int rc;</span><br><span> </span><br><span>@@ -238,7 +244,11 @@</span><br><span>   if ((rc = get_paging_mi(&paging_mi, tp)) > 0)</span><br><span>                 return bssgp_tx_status((enum gprs_bssgp_cause) rc, NULL, msg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      return gprs_rlcmac_paging_request(&paging_mi, pgroup);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: look if MS is attached a specific BTS and then only page on that one? */</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          gprs_rlcmac_paging_request(bts, &paging_mi, pgroup);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span> }</span><br><span> </span><br><span> /* Receive a BSSGP PDU from a BSS on a PTP BVCI */</span><br><span>@@ -808,7 +818,13 @@</span><br><span>              LOGP(DBSSGP, LOGL_ERROR, "No bctx\n");</span><br><span>             return -EIO;</span><br><span>         }</span><br><span style="color: hsl(0, 100%, 40%);">-       bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: This calculation needs to be redone to support multiple BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+      bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DBSSGP, LOGL_ERROR, "No bts\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> </span><br><span>        max_cs_dl = max_coding_scheme_dl(bts);</span><br><span> </span><br><span>diff --git a/src/gprs_pcu.c b/src/gprs_pcu.c</span><br><span>index b280652..d291e71 100644</span><br><span>--- a/src/gprs_pcu.c</span><br><span>+++ b/src/gprs_pcu.c</span><br><span>@@ -21,6 +21,7 @@</span><br><span>  */</span><br><span> </span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span> </span><br><span> #include "gprs_pcu.h"</span><br><span> #include "bts.h"</span><br><span>@@ -100,37 +101,63 @@</span><br><span>      pcu->T_defs = T_defs_pcu;</span><br><span>         osmo_tdefs_reset(pcu->T_defs);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ INIT_LLIST_HEAD(&pcu->bts_list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    return pcu;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct gprs_rlcmac_bts *gprs_pcu_get_bts_by_nr(struct gprs_pcu *pcu, uint8_t bts_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_rlcmac_bts *pos;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(pos, &pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (pos->nr == bts_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+                     return pos;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void gprs_pcu_set_initial_cs(struct gprs_pcu *pcu, uint8_t cs_dl, uint8_t cs_ul)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       the_pcu->vty.initial_cs_dl = cs_dl;</span><br><span>       the_pcu->vty.initial_cs_ul = cs_ul;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /*TODO: once we support multiple bts, foreach(bts) apply */</span><br><span style="color: hsl(0, 100%, 40%);">-     bts_recalc_initial_cs(pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_for_each_entry(bts, &pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              bts_recalc_initial_cs(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span> }</span><br><span> void gprs_pcu_set_initial_mcs(struct gprs_pcu *pcu, uint8_t mcs_dl, uint8_t mcs_ul)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       the_pcu->vty.initial_mcs_dl = mcs_dl;</span><br><span>     the_pcu->vty.initial_mcs_ul = mcs_ul;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    /*TODO: once we support multiple bts, foreach(bts) apply */</span><br><span style="color: hsl(0, 100%, 40%);">-     bts_recalc_initial_mcs(pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(bts, &pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              bts_recalc_initial_mcs(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> }</span><br><span> </span><br><span> void gprs_pcu_set_max_cs(struct gprs_pcu *pcu, uint8_t cs_dl, uint8_t cs_ul)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       the_pcu->vty.max_cs_dl = cs_dl;</span><br><span>   the_pcu->vty.max_cs_ul = cs_ul;</span><br><span style="color: hsl(0, 100%, 40%);">-      /*TODO: once we support multiple bts, foreach(bts) apply */</span><br><span style="color: hsl(0, 100%, 40%);">-     bts_recalc_max_cs(pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     llist_for_each_entry(bts, &pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              bts_recalc_max_cs(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> }</span><br><span> void gprs_pcu_set_max_mcs(struct gprs_pcu *pcu, uint8_t mcs_dl, uint8_t mcs_ul)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       the_pcu->vty.max_mcs_dl = mcs_dl;</span><br><span>         the_pcu->vty.max_mcs_ul = mcs_ul;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* TODO: once we support multiple bts, foreach(bts) apply */</span><br><span style="color: hsl(0, 100%, 40%);">-    bts_recalc_max_mcs(pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(bts, &pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              bts_recalc_max_mcs(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span> }</span><br><span>diff --git a/src/gprs_pcu.h b/src/gprs_pcu.h</span><br><span>index 37f6e07..058d102 100644</span><br><span>--- a/src/gprs_pcu.h</span><br><span>+++ b/src/gprs_pcu.h</span><br><span>@@ -107,7 +107,7 @@</span><br><span>    struct gsmtap_inst *gsmtap;</span><br><span>  uint32_t gsmtap_categ_mask;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct llist_head bts_list; /* list of gprs_rlcmac_tbf */</span><br><span> </span><br><span>        struct gprs_ns2_inst *nsi;</span><br><span> </span><br><span>@@ -123,6 +123,8 @@</span><br><span> </span><br><span> struct gprs_pcu *gprs_pcu_alloc(void *ctx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct gprs_rlcmac_bts *gprs_pcu_get_bts_by_nr(struct gprs_pcu *pcu, uint8_t bts_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void gprs_pcu_set_initial_cs(struct gprs_pcu *pcu, uint8_t cs_dl, uint8_t cs_ul);</span><br><span> void gprs_pcu_set_initial_mcs(struct gprs_pcu *pcu, uint8_t mcs_dl, uint8_t mcs_ul);</span><br><span> void gprs_pcu_set_max_cs(struct gprs_pcu *pcu, uint8_t cs_dl, uint8_t cs_ul);</span><br><span>diff --git a/src/gprs_rlcmac.cpp b/src/gprs_rlcmac.cpp</span><br><span>index 4fb75f7..71849b8 100644</span><br><span>--- a/src/gprs_rlcmac.cpp</span><br><span>+++ b/src/gprs_rlcmac.cpp</span><br><span>@@ -32,7 +32,8 @@</span><br><span> </span><br><span> extern void *tall_pcu_ctx;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int gprs_rlcmac_paging_request(const struct osmo_mobile_identity *mi, uint16_t pgroup)</span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_rlcmac_paging_request(struct gprs_rlcmac_bts *bts, const struct osmo_mobile_identity *mi,</span><br><span style="color: hsl(120, 100%, 40%);">+                              uint16_t pgroup)</span><br><span> {</span><br><span>         if (log_check_level(DRLCMAC, LOGL_NOTICE)) {</span><br><span>                 char str[64];</span><br><span>@@ -46,7 +47,7 @@</span><br><span>            LOGP(DRLCMAC, LOGL_ERROR, "TX: [PCU -> BTS] Failed to encode Paging Request\n");</span><br><span>                return -1;</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       pcu_l1if_tx_pch(paging_request, plen, pgroup);</span><br><span style="color: hsl(120, 100%, 40%);">+        pcu_l1if_tx_pch(bts, paging_request, plen, pgroup);</span><br><span>  bitvec_free(paging_request);</span><br><span> </span><br><span>     return 0;</span><br><span>diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h</span><br><span>index a5d1d30..69fd6a4 100644</span><br><span>--- a/src/gprs_rlcmac.h</span><br><span>+++ b/src/gprs_rlcmac.h</span><br><span>@@ -113,7 +113,7 @@</span><br><span> int alloc_algorithm_dynamic(struct gprs_rlcmac_bts *bts, struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf, bool single,</span><br><span>                        int8_t use_trx);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int gprs_rlcmac_paging_request(const struct osmo_mobile_identity *mi, uint16_t pgroup);</span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_rlcmac_paging_request(struct gprs_rlcmac_bts *bts, const struct osmo_mobile_identity *mi, uint16_t pgroup);</span><br><span> int gprs_alloc_max_dl_slots_per_ms(const struct gprs_rlcmac_bts *bts, uint8_t ms_class);</span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span>diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp</span><br><span>index 40c194c..5640158 100644</span><br><span>--- a/src/gprs_rlcmac_sched.cpp</span><br><span>+++ b/src/gprs_rlcmac_sched.cpp</span><br><span>@@ -136,7 +136,7 @@</span><br><span>  if (!tbf || !tbf->ms()->app_info_pending)</span><br><span>              return NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        bts = tbf->bts;</span><br><span> </span><br><span>       if (bts->app_info) {</span><br><span>              LOGP(DRLCMACSCHED, LOGL_DEBUG, "Sending Packet Application Information message\n");</span><br><span>@@ -506,7 +506,7 @@</span><br><span>  tap_n_acc(msg, bts, trx, ts, fn, gsmtap_cat);</span><br><span> </span><br><span>    /* send PDTCH/PACCH to L1 */</span><br><span style="color: hsl(0, 100%, 40%);">-    pcu_l1if_tx_pdtch(msg, trx, ts, bts->trx[trx].arfcn, fn, block_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+        pcu_l1if_tx_pdtch(msg, bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr);</span><br><span> </span><br><span>      return 0;</span><br><span> }</span><br><span>diff --git a/src/osmo-bts-litecell15/lc15_l1_if.c b/src/osmo-bts-litecell15/lc15_l1_if.c</span><br><span>index bf2ecec..8f64863 100644</span><br><span>--- a/src/osmo-bts-litecell15/lc15_l1_if.c</span><br><span>+++ b/src/osmo-bts-litecell15/lc15_l1_if.c</span><br><span>@@ -148,6 +148,7 @@</span><br><span>                                 GsmL1_PhReadyToSendInd_t *rts_ind)</span><br><span> {</span><br><span>         struct gsm_time g_time;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_rlcmac_bts *bts;</span><br><span>         int rc = 0;</span><br><span> </span><br><span>      gsm_fn2gsmtime(&g_time, rts_ind->u32Fn);</span><br><span>@@ -156,14 +157,17 @@</span><br><span>              g_time.t1, g_time.t2, g_time.t3,</span><br><span>             get_value_string(lc15bts_l1sapi_names, rts_ind->sapi));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        switch (rts_ind->sapi) {</span><br><span>  case GsmL1_Sapi_Pdtch:</span><br><span>       case GsmL1_Sapi_Pacch:</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = pcu_rx_rts_req_pdtch(fl1h->trx_no, rts_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = pcu_rx_rts_req_pdtch(bts, fl1h->trx_no, rts_ind->u8Tn,</span><br><span>                    rts_ind->u32Fn, rts_ind->u8BlockNbr);</span><br><span>          break;</span><br><span>       case GsmL1_Sapi_Ptcch:</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = pcu_rx_rts_req_ptcch(fl1h->trx_no, rts_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = pcu_rx_rts_req_ptcch(bts, fl1h->trx_no, rts_ind->u8Tn,</span><br><span>                    rts_ind->u32Fn, rts_ind->u8BlockNbr);</span><br><span>          break;</span><br><span>       default:</span><br><span>@@ -189,6 +193,7 @@</span><br><span>       GsmL1_PhDataInd_t *data_ind, struct msgb *l1p_msg)</span><br><span> {</span><br><span>      int rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gprs_rlcmac_bts *bts;</span><br><span>         struct pcu_l1_meas meas = {0};</span><br><span> </span><br><span>   DEBUGP(DL1IF, "Rx PH-DATA.ind %s (hL2 %08x): %s\n",</span><br><span>@@ -205,8 +210,10 @@</span><br><span>         if (data_ind->msgUnitParam.u8Size == 0)</span><br><span>           return -1;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  get_meas(&meas, &data_ind->measParam);</span><br><span style="color: hsl(0, 100%, 40%);">-       bts_update_tbf_ta("PH-DATA", data_ind->u32Fn, fl1h->trx_no,</span><br><span style="color: hsl(120, 100%, 40%);">+   bts_update_tbf_ta(bts, "PH-DATA", data_ind->u32Fn, fl1h->trx_no,</span><br><span>                       data_ind->u8Tn, sign_qta2ta(meas.bto), false);</span><br><span> </span><br><span>      switch (data_ind->sapi) {</span><br><span>@@ -217,7 +224,7 @@</span><br><span>                   != GsmL1_PdtchPlType_Full)</span><br><span>                   break;</span><br><span>               /* PDTCH / PACCH frame handling */</span><br><span style="color: hsl(0, 100%, 40%);">-              rc = pcu_rx_data_ind_pdtch(fl1h->trx_no, data_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = pcu_rx_data_ind_pdtch(bts, fl1h->trx_no, data_ind->u8Tn,</span><br><span>                  data_ind->msgUnitParam.u8Buffer + 1,</span><br><span>                      data_ind->msgUnitParam.u8Size - 1,</span><br><span>                        data_ind->u32Fn,</span><br><span>@@ -243,19 +250,22 @@</span><br><span> </span><br><span> static int handle_ph_ra_ind(struct lc15l1_hdl *fl1h, GsmL1_PhRaInd_t *ra_ind)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_rlcmac_bts *bts;</span><br><span>         if (ra_ind->measParam.fLinkQuality < MIN_QUAL_RACH)</span><br><span>            return 0;</span><br><span> </span><br><span>        DEBUGP(DL1IF, "Rx PH-RA.ind");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  switch (ra_ind->sapi) {</span><br><span>   case GsmL1_Sapi_Pdtch:</span><br><span>       case GsmL1_Sapi_Prach:</span><br><span style="color: hsl(0, 100%, 40%);">-          bts_update_tbf_ta("PH-RA", ra_ind->u32Fn, fl1h->trx_no, ra_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+              bts_update_tbf_ta(bts, "PH-RA", ra_ind->u32Fn, fl1h->trx_no, ra_ind->u8Tn,</span><br><span>                                  qta2ta(ra_ind->measParam.i16BurstTiming), true);</span><br><span>                break;</span><br><span>       case GsmL1_Sapi_Ptcch:</span><br><span style="color: hsl(0, 100%, 40%);">-          pcu_rx_rach_ind_ptcch(fl1h->trx_no, ra_ind->u8Tn, ra_ind->u32Fn,</span><br><span style="color: hsl(120, 100%, 40%);">+             pcu_rx_rach_ind_ptcch(bts, fl1h->trx_no, ra_ind->u8Tn, ra_ind->u32Fn,</span><br><span>                                     ra_ind->measParam.i16BurstTiming);</span><br><span>          break;</span><br><span>       default:</span><br><span>@@ -387,4 +397,3 @@</span><br><span>       talloc_free(fl1h);</span><br><span>   return 0;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/src/osmo-bts-oc2g/oc2g_l1_if.c b/src/osmo-bts-oc2g/oc2g_l1_if.c</span><br><span>index 0bfe0b9..d81bc4f 100644</span><br><span>--- a/src/osmo-bts-oc2g/oc2g_l1_if.c</span><br><span>+++ b/src/osmo-bts-oc2g/oc2g_l1_if.c</span><br><span>@@ -149,6 +149,7 @@</span><br><span>                                 GsmL1_PhReadyToSendInd_t *rts_ind)</span><br><span> {</span><br><span>         struct gsm_time g_time;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_rlcmac_bts *bts;</span><br><span>         int rc = 0;</span><br><span> </span><br><span>      gsm_fn2gsmtime(&g_time, rts_ind->u32Fn);</span><br><span>@@ -157,14 +158,16 @@</span><br><span>              g_time.t1, g_time.t2, g_time.t3,</span><br><span>             get_value_string(oc2gbts_l1sapi_names, rts_ind->sapi));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  switch (rts_ind->sapi) {</span><br><span>  case GsmL1_Sapi_Pdtch:</span><br><span>       case GsmL1_Sapi_Pacch:</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = pcu_rx_rts_req_pdtch(fl1h->trx_no, rts_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = pcu_rx_rts_req_pdtch(bts, fl1h->trx_no, rts_ind->u8Tn,</span><br><span>                    rts_ind->u32Fn, rts_ind->u8BlockNbr);</span><br><span>          break;</span><br><span>       case GsmL1_Sapi_Ptcch:</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = pcu_rx_rts_req_ptcch(fl1h->trx_no, rts_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = pcu_rx_rts_req_ptcch(bts, fl1h->trx_no, rts_ind->u8Tn,</span><br><span>                    rts_ind->u32Fn, rts_ind->u8BlockNbr);</span><br><span>          break;</span><br><span>       default:</span><br><span>@@ -190,6 +193,7 @@</span><br><span>       GsmL1_PhDataInd_t *data_ind, struct msgb *l1p_msg)</span><br><span> {</span><br><span>      int rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gprs_rlcmac_bts *bts;</span><br><span>         struct pcu_l1_meas meas = {0};</span><br><span> </span><br><span>   DEBUGP(DL1IF, "Rx PH-DATA.ind %s (hL2 %08x): %s\n",</span><br><span>@@ -206,13 +210,15 @@</span><br><span>        if (data_ind->msgUnitParam.u8Size == 0)</span><br><span>           return -1;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  gsmtap_send(fl1h->gsmtap, data_ind->u16Arfcn | GSMTAP_ARFCN_F_UPLINK,</span><br><span>                  data_ind->u8Tn, GSMTAP_CHANNEL_PACCH, 0,</span><br><span>                  data_ind->u32Fn, 0, 0, data_ind->msgUnitParam.u8Buffer+1,</span><br><span>                      data_ind->msgUnitParam.u8Size-1);</span><br><span> </span><br><span>     get_meas(&meas, &data_ind->measParam);</span><br><span style="color: hsl(0, 100%, 40%);">-       bts_update_tbf_ta("PH-DATA", data_ind->u32Fn, fl1h->trx_no,</span><br><span style="color: hsl(120, 100%, 40%);">+   bts_update_tbf_ta(bts, "PH-DATA", data_ind->u32Fn, fl1h->trx_no,</span><br><span>                       data_ind->u8Tn, sign_qta2ta(meas.bto), false);</span><br><span> </span><br><span>      switch (data_ind->sapi) {</span><br><span>@@ -223,7 +229,7 @@</span><br><span>                   != GsmL1_PdtchPlType_Full)</span><br><span>                   break;</span><br><span>               /* PDTCH / PACCH frame handling */</span><br><span style="color: hsl(0, 100%, 40%);">-              pcu_rx_data_ind_pdtch(fl1h->trx_no, data_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+             pcu_rx_data_ind_pdtch(bts, fl1h->trx_no, data_ind->u8Tn,</span><br><span>                       data_ind->msgUnitParam.u8Buffer + 1,</span><br><span>                      data_ind->msgUnitParam.u8Size - 1,</span><br><span>                        data_ind->u32Fn,</span><br><span>@@ -242,19 +248,23 @@</span><br><span> </span><br><span> static int handle_ph_ra_ind(struct oc2gl1_hdl *fl1h, GsmL1_PhRaInd_t *ra_ind)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       if (ra_ind->measParam.fLinkQuality < MIN_QUAL_RACH)</span><br><span>            return 0;</span><br><span> </span><br><span>        LOGP(DL1IF, LOGL_DEBUG, "PH-RA-IND L1 qta=%d\n", ra_ind->measParam.i16BurstTiming);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  switch (ra_ind->sapi) {</span><br><span>   case GsmL1_Sapi_Pdtch:</span><br><span>       case GsmL1_Sapi_Prach:</span><br><span style="color: hsl(0, 100%, 40%);">-          bts_update_tbf_ta("PH-RA", ra_ind->u32Fn, fl1h->trx_no, ra_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+              bts_update_tbf_ta(bts, "PH-RA", ra_ind->u32Fn, fl1h->trx_no, ra_ind->u8Tn,</span><br><span>                                  qta2ta(ra_ind->measParam.i16BurstTiming), true);</span><br><span>                break;</span><br><span>       case GsmL1_Sapi_Ptcch:</span><br><span style="color: hsl(0, 100%, 40%);">-          pcu_rx_rach_ind_ptcch(fl1h->trx_no, ra_ind->u8Tn, ra_ind->u32Fn,</span><br><span style="color: hsl(120, 100%, 40%);">+             pcu_rx_rach_ind_ptcch(bts, fl1h->trx_no, ra_ind->u8Tn, ra_ind->u32Fn,</span><br><span>                                     ra_ind->measParam.i16BurstTiming);</span><br><span>          break;</span><br><span>       default:</span><br><span>@@ -392,4 +402,3 @@</span><br><span>       talloc_free(fl1h);</span><br><span>   return 0;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/src/osmo-bts-sysmo/sysmo_l1_if.c b/src/osmo-bts-sysmo/sysmo_l1_if.c</span><br><span>index 7406bbf..f9db0b8 100644</span><br><span>--- a/src/osmo-bts-sysmo/sysmo_l1_if.c</span><br><span>+++ b/src/osmo-bts-sysmo/sysmo_l1_if.c</span><br><span>@@ -123,7 +123,7 @@</span><br><span>    cr = prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphConnectReq, fl1h);</span><br><span>  cr->u8Tn = ts;</span><br><span>    cr->logChComb = GsmL1_LogChComb_XIII;</span><br><span style="color: hsl(0, 100%, 40%);">-        </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   return l1if_req_pdch(fl1h, msg);</span><br><span> }</span><br><span> </span><br><span>@@ -131,6 +131,7 @@</span><br><span>                                   GsmL1_PhReadyToSendInd_t *rts_ind)</span><br><span> {</span><br><span>         struct gsm_time g_time;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_rlcmac_bts *bts;</span><br><span>         int rc = 0;</span><br><span> </span><br><span>      gsm_fn2gsmtime(&g_time, rts_ind->u32Fn);</span><br><span>@@ -139,14 +140,16 @@</span><br><span>              g_time.t1, g_time.t2, g_time.t3,</span><br><span>             get_value_string(femtobts_l1sapi_names, rts_ind->sapi));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  switch (rts_ind->sapi) {</span><br><span>  case GsmL1_Sapi_Pdtch:</span><br><span>       case GsmL1_Sapi_Pacch:</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = pcu_rx_rts_req_pdtch(fl1h->trx_no, rts_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = pcu_rx_rts_req_pdtch(bts, fl1h->trx_no, rts_ind->u8Tn,</span><br><span>                    rts_ind->u32Fn, rts_ind->u8BlockNbr);</span><br><span>          break;</span><br><span>       case GsmL1_Sapi_Ptcch:</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = pcu_rx_rts_req_ptcch(fl1h->trx_no, rts_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = pcu_rx_rts_req_ptcch(bts, fl1h->trx_no, rts_ind->u8Tn,</span><br><span>                    rts_ind->u32Fn, rts_ind->u8BlockNbr);</span><br><span>          break;</span><br><span>       default:</span><br><span>@@ -172,6 +175,7 @@</span><br><span>       GsmL1_PhDataInd_t *data_ind, struct msgb *l1p_msg)</span><br><span> {</span><br><span>      int rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gprs_rlcmac_bts *bts;</span><br><span>         struct pcu_l1_meas meas = {0};</span><br><span> </span><br><span>   DEBUGP(DL1IF, "Rx PH-DATA.ind %s (hL2 %08x): %s\n",</span><br><span>@@ -180,7 +184,8 @@</span><br><span>          osmo_hexdump(data_ind->msgUnitParam.u8Buffer,</span><br><span>                          data_ind->msgUnitParam.u8Size));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    pcu_rx_block_time(data_ind->u16Arfcn, data_ind->u32Fn, data_ind->u8Tn);</span><br><span style="color: hsl(120, 100%, 40%);">+      bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list);</span><br><span style="color: hsl(120, 100%, 40%);">+     pcu_rx_block_time(bts, data_ind->u16Arfcn, data_ind->u32Fn, data_ind->u8Tn);</span><br><span> </span><br><span>    /*</span><br><span>    * TODO: Add proper bad frame handling here. This could be used</span><br><span>@@ -191,7 +196,7 @@</span><br><span>                return -1;</span><br><span> </span><br><span>       get_meas(&meas, &data_ind->measParam);</span><br><span style="color: hsl(0, 100%, 40%);">-       bts_update_tbf_ta("PH-DATA", data_ind->u32Fn, fl1h->trx_no,</span><br><span style="color: hsl(120, 100%, 40%);">+   bts_update_tbf_ta(bts, "PH-DATA", data_ind->u32Fn, fl1h->trx_no,</span><br><span>                       data_ind->u8Tn, sign_qta2ta(meas.bto), false);</span><br><span> </span><br><span>      switch (data_ind->sapi) {</span><br><span>@@ -202,7 +207,7 @@</span><br><span>                   != GsmL1_PdtchPlType_Full)</span><br><span>                   break;</span><br><span>               /* PDTCH / PACCH frame handling */</span><br><span style="color: hsl(0, 100%, 40%);">-              pcu_rx_data_ind_pdtch(fl1h->trx_no, data_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+             pcu_rx_data_ind_pdtch(bts, fl1h->trx_no, data_ind->u8Tn,</span><br><span>                       data_ind->msgUnitParam.u8Buffer + 1,</span><br><span>                      data_ind->msgUnitParam.u8Size - 1,</span><br><span>                        data_ind->u32Fn,</span><br><span>@@ -230,7 +235,10 @@</span><br><span> </span><br><span> static int handle_ph_ra_ind(struct femtol1_hdl *fl1h, GsmL1_PhRaInd_t *ra_ind)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   pcu_rx_ra_time(ra_ind->u16Arfcn, ra_ind->u32Fn, ra_ind->u8Tn);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   pcu_rx_ra_time(bts, ra_ind->u16Arfcn, ra_ind->u32Fn, ra_ind->u8Tn);</span><br><span> </span><br><span>     if (ra_ind->measParam.fLinkQuality < MIN_QUAL_RACH)</span><br><span>            return 0;</span><br><span>@@ -240,11 +248,11 @@</span><br><span>    switch (ra_ind->sapi) {</span><br><span>   case GsmL1_Sapi_Pdtch:</span><br><span>       case GsmL1_Sapi_Prach:</span><br><span style="color: hsl(0, 100%, 40%);">-          bts_update_tbf_ta("PH-RA", ra_ind->u32Fn, fl1h->trx_no, ra_ind->u8Tn,</span><br><span style="color: hsl(120, 100%, 40%);">+              bts_update_tbf_ta(bts, "PH-RA", ra_ind->u32Fn, fl1h->trx_no, ra_ind->u8Tn,</span><br><span>                                  qta2ta(ra_ind->measParam.i16BurstTiming), true);</span><br><span>                break;</span><br><span>       case GsmL1_Sapi_Ptcch:</span><br><span style="color: hsl(0, 100%, 40%);">-          pcu_rx_rach_ind_ptcch(fl1h->trx_no, ra_ind->u8Tn, ra_ind->u32Fn,</span><br><span style="color: hsl(120, 100%, 40%);">+             pcu_rx_rach_ind_ptcch(bts, fl1h->trx_no, ra_ind->u8Tn, ra_ind->u32Fn,</span><br><span>                                     ra_ind->measParam.i16BurstTiming);</span><br><span>          break;</span><br><span>       default:</span><br><span>@@ -373,4 +381,3 @@</span><br><span>       talloc_free(fl1h);</span><br><span>   return 0;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/src/osmobts_sock.c b/src/osmobts_sock.c</span><br><span>index ec9d7ce..4e1171f 100644</span><br><span>--- a/src/osmobts_sock.c</span><br><span>+++ b/src/osmobts_sock.c</span><br><span>@@ -60,13 +60,20 @@</span><br><span> </span><br><span> static void pcu_tx_txt_retry(void *_priv)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  bool retry = llist_empty(&the_pcu->bts_list);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if (bts->active)</span><br><span style="color: hsl(0, 100%, 40%);">-             return;</span><br><span style="color: hsl(120, 100%, 40%);">+       llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (bts->active)</span><br><span style="color: hsl(120, 100%, 40%);">+                   continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             retry = true;</span><br><span style="color: hsl(120, 100%, 40%);">+         pcu_tx_txt_ind(PCU_VERSION, "%s", PACKAGE_VERSION);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   pcu_tx_txt_ind(PCU_VERSION, "%s", PACKAGE_VERSION);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_timer_schedule(&pcu_sock_state.timer, 5, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* If no BTS (or not all) yet active, retry */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (retry)</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_timer_schedule(&pcu_sock_state.timer, 5, 0);</span><br><span> }</span><br><span> </span><br><span> int pcu_sock_send(struct msgb *msg)</span><br><span>@@ -88,7 +95,7 @@</span><br><span> static void pcu_sock_close(int lost)</span><br><span> {</span><br><span>       struct osmo_fd *bfd = &pcu_sock_state.conn_bfd;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts;</span><br><span>         uint8_t trx, ts;</span><br><span> </span><br><span>         LOGP(DL1IF, LOGL_NOTICE, "PCU socket has %s connection\n",</span><br><span>@@ -104,22 +111,23 @@</span><br><span>                 msgb_free(msg);</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* disable all slots, kick all TBFs */</span><br><span style="color: hsl(0, 100%, 40%);">-  for (trx = 0; trx < 8; trx++) {</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* disable all slots, kick all TBFs */</span><br><span style="color: hsl(120, 100%, 40%);">+                for (trx = 0; trx < 8; trx++) {</span><br><span> #ifdef ENABLE_DIRECT_PHY</span><br><span style="color: hsl(0, 100%, 40%);">-          if (bts->trx[trx].fl1h) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    l1if_close_pdch(bts->trx[trx].fl1h);</span><br><span style="color: hsl(0, 100%, 40%);">-                 bts->trx[trx].fl1h = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (bts->trx[trx].fl1h) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          l1if_close_pdch(bts->trx[trx].fl1h);</span><br><span style="color: hsl(120, 100%, 40%);">+                               bts->trx[trx].fl1h = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-             for (ts = 0; ts < 8; ts++)</span><br><span style="color: hsl(0, 100%, 40%);">-                   pdch_disable(&bts->trx[trx].pdch[ts]);</span><br><span style="color: hsl(0, 100%, 40%);">-/* FIXME: NOT ALL RESOURCES are freed in this case... inconsistent with the other code. Share the code with pcu_l1if.c</span><br><span style="color: hsl(0, 100%, 40%);">-for the reset. */</span><br><span style="color: hsl(0, 100%, 40%);">-            bts_trx_free_all_tbf(&bts->trx[trx]);</span><br><span style="color: hsl(120, 100%, 40%);">+                  for (ts = 0; ts < 8; ts++)</span><br><span style="color: hsl(120, 100%, 40%);">+                         pdch_disable(&bts->trx[trx].pdch[ts]);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: NOT ALL RESOURCES are freed in this case... inconsistent with the other code. Share the code with pcu_l1if.c</span><br><span style="color: hsl(120, 100%, 40%);">+        for the reset. */</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts_trx_free_all_tbf(&bts->trx[trx]);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             gprs_bssgp_destroy(bts);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       gprs_bssgp_destroy(bts);</span><br><span>     exit(0);</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp</span><br><span>index 8847960..24080f3 100644</span><br><span>--- a/src/pcu_l1_if.cpp</span><br><span>+++ b/src/pcu_l1_if.cpp</span><br><span>@@ -145,7 +145,7 @@</span><br><span>     return pcu_sock_send(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_tx_act_req(uint8_t trx, uint8_t ts, uint8_t activate)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_tx_act_req(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts, uint8_t activate)</span><br><span> {</span><br><span>      struct msgb *msg;</span><br><span>    struct gsm_pcu_if *pcu_prim;</span><br><span>@@ -154,7 +154,7 @@</span><br><span>   LOGP(DL1IF, LOGL_INFO, "Sending %s request: trx=%d ts=%d\n",</span><br><span>               (activate) ? "activate" : "deactivate", trx, ts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       msg = pcu_msgb_alloc(PCU_IF_MSG_ACT_REQ, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  msg = pcu_msgb_alloc(PCU_IF_MSG_ACT_REQ, bts->nr);</span><br><span>        if (!msg)</span><br><span>            return -ENOMEM;</span><br><span>      pcu_prim = (struct gsm_pcu_if *) msg->data;</span><br><span>@@ -166,20 +166,20 @@</span><br><span>       return pcu_sock_send(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_tx_data_req(uint8_t trx, uint8_t ts, uint8_t sapi,</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_tx_data_req(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts, uint8_t sapi,</span><br><span>         uint16_t arfcn, uint32_t fn, uint8_t block_nr, uint8_t *data,</span><br><span>        uint8_t len)</span><br><span> {</span><br><span>    struct msgb *msg;</span><br><span>    struct gsm_pcu_if *pcu_prim;</span><br><span>         struct gsm_pcu_if_data *data_req;</span><br><span style="color: hsl(0, 100%, 40%);">-       int current_fn = bts_current_frame_number(the_pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+   int current_fn = bts_current_frame_number(bts);</span><br><span> </span><br><span>  LOGP(DL1IF, LOGL_DEBUG, "Sending data request: trx=%d ts=%d sapi=%d "</span><br><span>              "arfcn=%d fn=%d cur_fn=%d block=%d data=%s\n", trx, ts, sapi, arfcn, fn, current_fn,</span><br><span>               block_nr, osmo_hexdump(data, len));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- msg = pcu_msgb_alloc(PCU_IF_MSG_DATA_REQ, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ msg = pcu_msgb_alloc(PCU_IF_MSG_DATA_REQ, bts->nr);</span><br><span>       if (!msg)</span><br><span>            return -ENOMEM;</span><br><span>      pcu_prim = (struct gsm_pcu_if *) msg->data;</span><br><span>@@ -197,12 +197,10 @@</span><br><span>       return pcu_sock_send(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void pcu_l1if_tx_pdtch(msgb *msg, uint8_t trx, uint8_t ts, uint16_t arfcn,</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_l1if_tx_pdtch(msgb *msg, struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts, uint16_t arfcn,</span><br><span>       uint32_t fn, uint8_t block_nr)</span><br><span> {</span><br><span> #ifdef ENABLE_DIRECT_PHY</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>       if (bts->trx[trx].fl1h) {</span><br><span>                 l1if_pdch_req(bts->trx[trx].fl1h, ts, 0, fn, arfcn, block_nr,</span><br><span>                     msg->data, msg->len);</span><br><span>@@ -210,7 +208,7 @@</span><br><span>            return;</span><br><span>      }</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-     pcu_tx_data_req(trx, ts, PCU_IF_SAPI_PDTCH, arfcn, fn, block_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+      pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PDTCH, arfcn, fn, block_nr,</span><br><span>                        msg->data, msg->len);</span><br><span>  msgb_free(msg);</span><br><span> }</span><br><span>@@ -228,10 +226,10 @@</span><br><span>                 return;</span><br><span>      }</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-     pcu_tx_data_req(trx, ts, PCU_IF_SAPI_PTCCH, arfcn, fn, block_nr, data, data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+     pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PTCCH, arfcn, fn, block_nr, data, data_len);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void pcu_l1if_tx_agch(bitvec * block, int plen)</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_l1if_tx_agch(struct gprs_rlcmac_bts *bts, bitvec * block, int plen)</span><br><span> {</span><br><span>    uint8_t data[GSM_MACBLOCK_LEN]; /* prefix PLEN */</span><br><span> </span><br><span>@@ -242,10 +240,10 @@</span><br><span>        if (the_pcu->gsmtap_categ_mask & (1 << PCU_GSMTAP_C_DL_AGCH))</span><br><span>           gsmtap_send(the_pcu->gsmtap, 0, 0, GSMTAP_CHANNEL_AGCH, 0, 0, 0, 0, data, GSM_MACBLOCK_LEN);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     pcu_tx_data_req(0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, GSM_MACBLOCK_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+     pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, GSM_MACBLOCK_LEN);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void pcu_l1if_tx_pch(bitvec * block, int plen, uint16_t pgroup)</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_l1if_tx_pch(struct gprs_rlcmac_bts *bts, bitvec * block, int plen, uint16_t pgroup)</span><br><span> {</span><br><span>    uint8_t data[PAGING_GROUP_LEN + GSM_MACBLOCK_LEN];</span><br><span>   int i;</span><br><span>@@ -267,33 +265,31 @@</span><br><span>       if (the_pcu->gsmtap_categ_mask & (1 << PCU_GSMTAP_C_DL_PCH))</span><br><span>            gsmtap_send(the_pcu->gsmtap, 0, 0, GSMTAP_CHANNEL_PCH, 0, 0, 0, 0, data + 3, GSM_MACBLOCK_LEN);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  pcu_tx_data_req(0, 0, PCU_IF_SAPI_PCH, 0, 0, 0, data, PAGING_GROUP_LEN + GSM_MACBLOCK_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+   pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_PCH, 0, 0, 0, data, PAGING_GROUP_LEN + GSM_MACBLOCK_LEN);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-extern "C" void pcu_rx_block_time(uint16_t arfcn, uint32_t fn, uint8_t ts_no)</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_rx_block_time(struct gprs_rlcmac_bts *bts, uint16_t arfcn, uint32_t fn, uint8_t ts_no)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  bts_set_current_block_frame_number(the_pcu->bts,fn, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    bts_set_current_block_frame_number(bts, fn, 0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-extern "C" void pcu_rx_ra_time(uint16_t arfcn, uint32_t fn, uint8_t ts_no)</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_rx_ra_time(struct gprs_rlcmac_bts *bts, uint16_t arfcn, uint32_t fn, uint8_t ts_no)</span><br><span> {</span><br><span>      /* access bursts may arrive some bursts earlier */</span><br><span style="color: hsl(0, 100%, 40%);">-      bts_set_current_block_frame_number(the_pcu->bts,fn, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+    bts_set_current_block_frame_number(bts, fn, 5);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-extern "C" int pcu_rx_data_ind_pdtch(uint8_t trx_no, uint8_t ts_no, uint8_t *data,</span><br><span style="color: hsl(120, 100%, 40%);">+int pcu_rx_data_ind_pdtch(struct gprs_rlcmac_bts *bts, uint8_t trx_no, uint8_t ts_no, uint8_t *data,</span><br><span>   uint8_t len, uint32_t fn, struct pcu_l1_meas *meas)</span><br><span> {</span><br><span>     struct gprs_rlcmac_pdch *pdch;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      pdch = &the_pcu->bts->trx[trx_no].pdch[ts_no];</span><br><span style="color: hsl(120, 100%, 40%);">+      pdch = &bts->trx[trx_no].pdch[ts_no];</span><br><span>         return pdch->rcv_block(data, len, fn, meas);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_rx_data_ind_bcch(uint8_t *data, uint8_t len)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_data_ind_bcch(struct gprs_rlcmac_bts *bts, uint8_t *data, uint8_t len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>       if (len == 0) {</span><br><span>              bts->si13_is_set = false;</span><br><span>                 LOGP(DL1IF, LOGL_INFO, "Received PCU data indication with empty SI13: cache cleaned\n");</span><br><span>@@ -311,10 +307,10 @@</span><br><span>   return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_rx_data_ind(struct gsm_pcu_if_data *data_ind)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_data_ind(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_data *data_ind)</span><br><span> {</span><br><span>       int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- int current_fn = bts_current_frame_number(the_pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+   int current_fn = bts_current_frame_number(bts);</span><br><span>      struct pcu_l1_meas meas = {0};</span><br><span>       uint8_t gsmtap_chantype;</span><br><span> </span><br><span>@@ -334,13 +330,13 @@</span><br><span>                 LOGP(DL1IF, LOGL_DEBUG, "Data indication with raw measurements received: BER10k = %d, BTO = %d, Q = %d\n",</span><br><span>                      data_ind->ber10k, data_ind->ta_offs_qbits, data_ind->lqual_cb);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-               rc = pcu_rx_data_ind_pdtch(data_ind->trx_nr, data_ind->ts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = pcu_rx_data_ind_pdtch(bts, data_ind->trx_nr, data_ind->ts_nr,</span><br><span>                     data_ind->data, data_ind->len, data_ind->fn,</span><br><span>                        &meas);</span><br><span>          gsmtap_chantype = GSMTAP_CHANNEL_PDTCH;</span><br><span>              break;</span><br><span>       case PCU_IF_SAPI_BCCH:</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = pcu_rx_data_ind_bcch(data_ind->data, data_ind->len);</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = pcu_rx_data_ind_bcch(bts, data_ind->data, data_ind->len);</span><br><span>                 gsmtap_chantype = GSMTAP_CHANNEL_BCCH;</span><br><span>               break;</span><br><span>       default:</span><br><span>@@ -358,10 +354,10 @@</span><br><span>     return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_rx_data_cnf(struct gsm_pcu_if_data *data_cnf)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_data_cnf(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_data *data_cnf)</span><br><span> {</span><br><span>      int rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     int current_fn = bts_current_frame_number(the_pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+   int current_fn = bts_current_frame_number(bts);</span><br><span> </span><br><span>  LOGP(DL1IF, LOGL_DEBUG, "Data confirm received: sapi=%d fn=%d cur_fn=%d\n",</span><br><span>                data_cnf->sapi, data_cnf->fn, current_fn);</span><br><span>@@ -369,7 +365,7 @@</span><br><span>       switch (data_cnf->sapi) {</span><br><span>         case PCU_IF_SAPI_PCH:</span><br><span>                if (data_cnf->data[2] == 0x3f)</span><br><span style="color: hsl(0, 100%, 40%);">-                       bts_rcv_imm_ass_cnf(the_pcu->bts, data_cnf->data, data_cnf->fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts_rcv_imm_ass_cnf(bts, data_cnf->data, data_cnf->fn);</span><br><span>                break;</span><br><span>       default:</span><br><span>             LOGP(DL1IF, LOGL_ERROR, "Received PCU data confirm with "</span><br><span>@@ -381,16 +377,15 @@</span><br><span> }</span><br><span> </span><br><span> // FIXME: remove this, when changed from c++ to c.</span><br><span style="color: hsl(0, 100%, 40%);">-extern "C" int pcu_rx_rts_req_pdtch(uint8_t trx, uint8_t ts,</span><br><span style="color: hsl(120, 100%, 40%);">+int pcu_rx_rts_req_pdtch(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts,</span><br><span>     uint32_t fn, uint8_t block_nr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     return gprs_rlcmac_rcv_rts_block(the_pcu->bts,</span><br><span style="color: hsl(120, 100%, 40%);">+     return gprs_rlcmac_rcv_rts_block(bts,</span><br><span>                                        trx, ts, fn, block_nr);</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-extern "C" int pcu_rx_rts_req_ptcch(uint8_t trx, uint8_t ts,</span><br><span style="color: hsl(120, 100%, 40%);">+int pcu_rx_rts_req_ptcch(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts,</span><br><span>   uint32_t fn, uint8_t block_nr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span>       struct gprs_rlcmac_pdch *pdch;</span><br><span> </span><br><span>   /* Prevent buffer overflow */</span><br><span>@@ -407,10 +402,10 @@</span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_rx_rts_req(struct gsm_pcu_if_rts_req *rts_req)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_rts_req(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_rts_req *rts_req)</span><br><span> {</span><br><span>     int rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     int current_fn = bts_current_frame_number(the_pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+   int current_fn = bts_current_frame_number(bts);</span><br><span> </span><br><span>  LOGP(DL1IF, LOGL_DEBUG, "RTS request received: trx=%d ts=%d sapi=%d "</span><br><span>              "arfcn=%d fn=%d cur_fn=%d block=%d\n", rts_req->trx_nr, rts_req->ts_nr,</span><br><span>@@ -418,11 +413,11 @@</span><br><span> </span><br><span>  switch (rts_req->sapi) {</span><br><span>  case PCU_IF_SAPI_PDTCH:</span><br><span style="color: hsl(0, 100%, 40%);">-         pcu_rx_rts_req_pdtch(rts_req->trx_nr, rts_req->ts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+           pcu_rx_rts_req_pdtch(bts, rts_req->trx_nr, rts_req->ts_nr,</span><br><span>                     rts_req->fn, rts_req->block_nr);</span><br><span>               break;</span><br><span>       case PCU_IF_SAPI_PTCCH:</span><br><span style="color: hsl(0, 100%, 40%);">-         pcu_rx_rts_req_ptcch(rts_req->trx_nr, rts_req->ts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+           pcu_rx_rts_req_ptcch(bts, rts_req->trx_nr, rts_req->ts_nr,</span><br><span>                     rts_req->fn, rts_req->block_nr);</span><br><span>               break;</span><br><span>       default:</span><br><span>@@ -435,7 +430,7 @@</span><br><span> }</span><br><span> </span><br><span> /* C -> C++ adapter for direct DSP access code (e.g. osmo-bts-sysmo) */</span><br><span style="color: hsl(0, 100%, 40%);">-extern "C" int pcu_rx_rach_ind_ptcch(uint8_t trx_nr, uint8_t ts_nr, uint32_t fn, int16_t qta)</span><br><span style="color: hsl(120, 100%, 40%);">+extern "C" int pcu_rx_rach_ind_ptcch(struct gprs_rlcmac_bts *bts, uint8_t trx_nr, uint8_t ts_nr, uint32_t fn, int16_t qta)</span><br><span> {</span><br><span>      struct rach_ind_params rip = {</span><br><span>               /* The content of RA is not of interest on PTCCH/U */</span><br><span>@@ -448,13 +443,13 @@</span><br><span>                .qta = qta,</span><br><span>  };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  return bts_rcv_ptcch_rach(the_pcu->bts, &rip);</span><br><span style="color: hsl(120, 100%, 40%);">+ return bts_rcv_ptcch_rach(bts, &rip);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_rx_rach_ind(const struct gsm_pcu_if_rach_ind *rach_ind)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_rach_ind(struct gprs_rlcmac_bts *bts, const struct gsm_pcu_if_rach_ind *rach_ind)</span><br><span> {</span><br><span>   int rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     int current_fn = bts_current_frame_number(the_pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+   int current_fn = bts_current_frame_number(bts);</span><br><span> </span><br><span>  LOGP(DL1IF, LOGL_INFO, "RACH request received: sapi=%d "</span><br><span>           "qta=%d, ra=0x%02x, fn=%u, cur_fn=%d, is_11bit=%d\n", rach_ind->sapi, rach_ind->qta,</span><br><span>@@ -472,10 +467,10 @@</span><br><span> </span><br><span>     switch (rach_ind->sapi) {</span><br><span>         case PCU_IF_SAPI_RACH:</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = bts_rcv_rach(the_pcu->bts, &rip);</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = bts_rcv_rach(bts, &rip);</span><br><span>            break;</span><br><span>       case PCU_IF_SAPI_PTCCH:</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = bts_rcv_ptcch_rach(the_pcu->bts, &rip);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = bts_rcv_ptcch_rach(bts, &rip);</span><br><span>              break;</span><br><span>       default:</span><br><span>             LOGP(DL1IF, LOGL_ERROR, "Received PCU rach request with "</span><br><span>@@ -542,9 +537,8 @@</span><br><span>    return gprs_ns_config(bts, info_ind->nsei, local, remote, nsvci, valid);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_rx_info_ind(const struct gsm_pcu_if_info_ind *info_ind)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_info_ind(struct gprs_rlcmac_bts *bts, const struct gsm_pcu_if_info_ind *info_ind)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span>       struct gprs_bssgp_pcu *pcu;</span><br><span>  int rc = 0;</span><br><span>  unsigned int trx_nr, ts_nr;</span><br><span>@@ -704,7 +698,7 @@</span><br><span>                                            l1if_connect_pdch(</span><br><span>                                                   bts->trx[trx_nr].fl1h, ts_nr);</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-                                     pcu_tx_act_req(trx_nr, ts_nr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                                     pcu_tx_act_req(bts, trx_nr, ts_nr, 1);</span><br><span>                                       pdch->enable();</span><br><span>                           }</span><br><span> </span><br><span>@@ -730,7 +724,7 @@</span><br><span>                               trx_nr, ts_nr, pdch->tsc, pdch->fh.enabled ? "yes" : "no");</span><br><span>                   } else {</span><br><span>                             if (pdch->is_enabled()) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                    pcu_tx_act_req(trx_nr, ts_nr, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                                     pcu_tx_act_req(bts, trx_nr, ts_nr, 0);</span><br><span>                                       pdch->free_resources();</span><br><span>                                   pdch->disable();</span><br><span>                          }</span><br><span>@@ -742,7 +736,7 @@</span><br><span>      return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_rx_time_ind(struct gsm_pcu_if_time_ind *time_ind)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_time_ind(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_time_ind *time_ind)</span><br><span> {</span><br><span>      uint8_t fn13 = time_ind->fn % 13;</span><br><span> </span><br><span>@@ -752,11 +746,11 @@</span><br><span> </span><br><span>         LOGP(DL1IF, LOGL_DEBUG, "Time indication received: %d\n", time_ind->fn % 52);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  bts_set_current_frame_number(the_pcu->bts, time_ind->fn);</span><br><span style="color: hsl(120, 100%, 40%);">+       bts_set_current_frame_number(bts, time_ind->fn);</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_rx_pag_req(struct gsm_pcu_if_pag_req *pag_req)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_pag_req(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_pag_req *pag_req)</span><br><span> {</span><br><span>     struct osmo_mobile_identity mi;</span><br><span>      int rc;</span><br><span>@@ -777,12 +771,11 @@</span><br><span>              return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return bts_add_paging(the_pcu->bts, pag_req->chan_needed, &mi);</span><br><span style="color: hsl(120, 100%, 40%);">+     return bts_add_paging(bts, pag_req->chan_needed, &mi);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_rx_susp_req(struct gsm_pcu_if_susp_req *susp_req)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_susp_req(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_susp_req *susp_req)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span>       struct bssgp_bvc_ctx *bctx = gprs_bssgp_pcu_current_bctx();</span><br><span>  GprsMs *ms;</span><br><span>  struct gprs_rlcmac_dl_tbf *dl_tbf;</span><br><span>@@ -811,9 +804,8 @@</span><br><span>     return bssgp_tx_suspend(bctx->nsei, susp_req->tlli, &ra_id);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int pcu_rx_app_info_req(struct gsm_pcu_if_app_info_req *app_info_req)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_app_info_req(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_app_info_req *app_info_req)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span>       struct llist_head *tmp;</span><br><span> </span><br><span>  LOGP(DL1IF, LOGL_DEBUG, "Application Information Request received: type=0x%08x len=%i\n",</span><br><span>@@ -849,34 +841,43 @@</span><br><span> int pcu_rx(uint8_t msg_type, struct gsm_pcu_if *pcu_prim)</span><br><span> {</span><br><span>        int rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gprs_rlcmac_bts *bts = gprs_pcu_get_bts_by_nr(the_pcu, pcu_prim->bts_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DL1IF, LOGL_NOTICE, "Received message for new BTS%d\n", pcu_prim->bts_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+          bts = bts_alloc(the_pcu, pcu_prim->bts_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGP(DL1IF, LOGL_ERROR, "Failed to create object for BTS%d!\n", pcu_prim->bts_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EAGAIN;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        switch (msg_type) {</span><br><span>  case PCU_IF_MSG_DATA_IND:</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = pcu_rx_data_ind(&pcu_prim->u.data_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = pcu_rx_data_ind(bts, &pcu_prim->u.data_ind);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_DATA_CNF:</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = pcu_rx_data_cnf(&pcu_prim->u.data_cnf);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = pcu_rx_data_cnf(bts, &pcu_prim->u.data_cnf);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_RTS_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = pcu_rx_rts_req(&pcu_prim->u.rts_req);</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = pcu_rx_rts_req(bts, &pcu_prim->u.rts_req);</span><br><span>               break;</span><br><span>       case PCU_IF_MSG_RACH_IND:</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = pcu_rx_rach_ind(&pcu_prim->u.rach_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = pcu_rx_rach_ind(bts, &pcu_prim->u.rach_ind);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_INFO_IND:</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = pcu_rx_info_ind(&pcu_prim->u.info_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = pcu_rx_info_ind(bts, &pcu_prim->u.info_ind);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_TIME_IND:</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = pcu_rx_time_ind(&pcu_prim->u.time_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = pcu_rx_time_ind(bts, &pcu_prim->u.time_ind);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_PAG_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = pcu_rx_pag_req(&pcu_prim->u.pag_req);</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = pcu_rx_pag_req(bts, &pcu_prim->u.pag_req);</span><br><span>               break;</span><br><span>       case PCU_IF_MSG_SUSP_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = pcu_rx_susp_req(&pcu_prim->u.susp_req);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = pcu_rx_susp_req(bts, &pcu_prim->u.susp_req);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_APP_INFO_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-           rc = pcu_rx_app_info_req(&pcu_prim->u.app_info_req);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = pcu_rx_app_info_req(bts, &pcu_prim->u.app_info_req);</span><br><span>             break;</span><br><span>       default:</span><br><span>             LOGP(DL1IF, LOGL_ERROR, "Received unknown PCU msg type %d\n",</span><br><span>diff --git a/src/pcu_l1_if.h b/src/pcu_l1_if.h</span><br><span>index 8ef262c..e4a46a9 100644</span><br><span>--- a/src/pcu_l1_if.h</span><br><span>+++ b/src/pcu_l1_if.h</span><br><span>@@ -141,20 +141,23 @@</span><br><span> }</span><br><span> </span><br><span> #ifdef __cplusplus</span><br><span style="color: hsl(0, 100%, 40%);">-void pcu_l1if_tx_pdtch(msgb *msg, uint8_t trx, uint8_t ts, uint16_t arfcn,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t fn, uint8_t block_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gprs_rlcmac_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_l1if_tx_pdtch(msgb *msg, struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts,</span><br><span style="color: hsl(120, 100%, 40%);">+                   uint16_t arfcn, uint32_t fn, uint8_t block_nr);</span><br><span> void pcu_l1if_tx_ptcch(struct gprs_rlcmac_bts *bts,</span><br><span>                       uint8_t trx, uint8_t ts, uint16_t arfcn,</span><br><span>                     uint32_t fn, uint8_t block_nr,</span><br><span>                       uint8_t *data, size_t data_len);</span><br><span style="color: hsl(0, 100%, 40%);">-void pcu_l1if_tx_agch(bitvec * block, int len);</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_l1if_tx_agch(struct gprs_rlcmac_bts *bts, bitvec * block, int len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void pcu_l1if_tx_pch(bitvec * block, int plen, uint16_t pgroup);</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_l1if_tx_pch(struct gprs_rlcmac_bts *bts, bitvec * block, int plen, uint16_t pgroup);</span><br><span> #endif</span><br><span> </span><br><span> #ifdef __cplusplus</span><br><span> extern "C" {</span><br><span> #endif</span><br><span style="color: hsl(120, 100%, 40%);">+struct gprs_rlcmac_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int pcu_rx(uint8_t msg_type, struct gsm_pcu_if *pcu_prim);</span><br><span> int pcu_l1if_open(void);</span><br><span> void pcu_l1if_close(void);</span><br><span>@@ -162,17 +165,17 @@</span><br><span> </span><br><span> int pcu_tx_txt_ind(enum gsm_pcu_if_text_type t, const char *fmt, ...);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int pcu_rx_rts_req_pdtch(uint8_t trx, uint8_t ts,</span><br><span style="color: hsl(120, 100%, 40%);">+int pcu_rx_rts_req_pdtch(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts,</span><br><span>        uint32_t fn, uint8_t block_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-int pcu_rx_rts_req_ptcch(uint8_t trx, uint8_t ts,</span><br><span style="color: hsl(120, 100%, 40%);">+int pcu_rx_rts_req_ptcch(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts,</span><br><span>     uint32_t fn, uint8_t block_nr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int pcu_rx_rach_ind_ptcch(uint8_t trx_nr, uint8_t ts_nr, uint32_t fn, int16_t qta);</span><br><span style="color: hsl(0, 100%, 40%);">-int pcu_rx_data_ind_pdtch(uint8_t trx, uint8_t ts, uint8_t *data,</span><br><span style="color: hsl(120, 100%, 40%);">+int pcu_rx_rach_ind_ptcch(struct gprs_rlcmac_bts *bts, uint8_t trx_nr, uint8_t ts_nr, uint32_t fn, int16_t qta);</span><br><span style="color: hsl(120, 100%, 40%);">+int pcu_rx_data_ind_pdtch(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts, uint8_t *data,</span><br><span>    uint8_t len, uint32_t fn, struct pcu_l1_meas *meas);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void pcu_rx_block_time(uint16_t arfcn, uint32_t fn, uint8_t ts_no);</span><br><span style="color: hsl(0, 100%, 40%);">-void pcu_rx_ra_time(uint16_t arfcn, uint32_t fn, uint8_t ts_no);</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_rx_block_time(struct gprs_rlcmac_bts *bts, uint16_t arfcn, uint32_t fn, uint8_t ts_no);</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_rx_ra_time(struct gprs_rlcmac_bts *bts, uint16_t arfcn, uint32_t fn, uint8_t ts_no);</span><br><span> uint16_t imsi2paging_group(const char* imsi);</span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span>diff --git a/src/pcu_main.cpp b/src/pcu_main.cpp</span><br><span>index 23d16a3..ea7e341 100644</span><br><span>--- a/src/pcu_main.cpp</span><br><span>+++ b/src/pcu_main.cpp</span><br><span>@@ -237,8 +237,6 @@</span><br><span>  pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span>  the_pcu = pcu; /* globally avaialable object */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     pcu->bts = bts_alloc(pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        pcu->pcu_sock_path = talloc_strdup(tall_pcu_ctx, PCU_SOCK_DEFAULT);</span><br><span> </span><br><span>   msgb_talloc_ctx_init(tall_pcu_ctx, 0);</span><br><span>diff --git a/src/pcu_vty.c b/src/pcu_vty.c</span><br><span>index 9beb4c1..288f241 100644</span><br><span>--- a/src/pcu_vty.c</span><br><span>+++ b/src/pcu_vty.c</span><br><span>@@ -4,6 +4,8 @@</span><br><span> #include <stdint.h></span><br><span> #include <stdlib.h></span><br><span> #include <string.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> #include <osmocom/core/tdef.h></span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/vty/tdef_vty.h></span><br><span>@@ -753,7 +755,11 @@</span><br><span>       "show bts statistics",</span><br><span>       SHOW_STR "BTS related functionality\nStatistics\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        vty_out_rate_ctr_group(vty, "", bts_rate_counters(the_pcu->bts));</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out_rate_ctr_group(vty, " ", bts_rate_counters(bts));</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -762,7 +768,11 @@</span><br><span>       "show bts pdch",</span><br><span>       SHOW_STR "BTS related functionality\nPDCH timeslots\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return pcu_vty_show_bts_pdch(vty, the_pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          pcu_vty_show_bts_pdch(vty, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> #define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n"</span><br><span>@@ -1013,9 +1023,13 @@</span><br><span>       SHOW_STR "Show BTS controlled timers\n"</span><br><span>       OSMO_TDEF_VTY_DOC_T)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-  const char *T_arg = argc > 0 ? argv[0] : NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-       return osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          const char *T_arg = argc > 0 ? argv[0] : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "BTS%" PRIu8 ":%s", bts->nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_tdef_vty_show_cmd(vty, bts->T_defs_bts, T_arg, " ");</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> DEFUN(show_timer, show_timer_cmd,</span><br><span>@@ -1047,15 +1061,18 @@</span><br><span>       "TBFs allocated via CCCH\n"</span><br><span>       "TBFs allocated via PACCH\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint32_t flags = UINT32_MAX;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          uint32_t flags = UINT32_MAX;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if (argv[0][0] == 'c')</span><br><span style="color: hsl(0, 100%, 40%);">-          flags = (1 << GPRS_RLCMAC_FLAG_CCCH);</span><br><span style="color: hsl(0, 100%, 40%);">-     else if (argv[0][0] == 'p')</span><br><span style="color: hsl(0, 100%, 40%);">-             flags = (1 << GPRS_RLCMAC_FLAG_PACCH);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (argv[0][0] == 'c')</span><br><span style="color: hsl(120, 100%, 40%);">+                        flags = (1 << GPRS_RLCMAC_FLAG_CCCH);</span><br><span style="color: hsl(120, 100%, 40%);">+           else if (argv[0][0] == 'p')</span><br><span style="color: hsl(120, 100%, 40%);">+                   flags = (1 << GPRS_RLCMAC_FLAG_PACCH);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        return pcu_vty_show_tbf_all(vty, bts, flags);</span><br><span style="color: hsl(120, 100%, 40%);">+         pcu_vty_show_tbf_all(vty, bts, flags);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> DEFUN(show_ms_all,</span><br><span>@@ -1063,8 +1080,11 @@</span><br><span>       "show ms all",</span><br><span>       SHOW_STR "information about MSs\n" "All TBFs\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-  return pcu_vty_show_ms_all(vty, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          pcu_vty_show_ms_all(vty, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> DEFUN(show_ms_tlli,</span><br><span>@@ -1072,14 +1092,17 @@</span><br><span>       "show ms tlli TLLI",</span><br><span>       SHOW_STR "information about MSs\n" "Select MS by TLLI\n" "TLLI as hex\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-  char *endp = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned long long tlli = strtoll(argv[0], &endp, 16);</span><br><span style="color: hsl(0, 100%, 40%);">-      if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-          vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-         return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          char *endp = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+            unsigned long long tlli = strtoll(argv[0], &endp, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+            if ((endp != NULL && *endp != 0) || tlli > 0xffffffffULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        vty_out(vty, "Invalid TLLI.%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                       return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       return pcu_vty_show_ms_by_tlli(vty, bts, (uint32_t)tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> DEFUN(show_ms_imsi,</span><br><span>@@ -1087,8 +1110,11 @@</span><br><span>       "show ms imsi IMSI",</span><br><span>       SHOW_STR "information about MSs\n" "Select MS by IMSI\n" "IMSI\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-  return pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_for_each_entry(bts, &the_pcu->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+          pcu_vty_show_ms_by_imsi(vty, bts, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> static const char pcu_copyright[] =</span><br><span>diff --git a/src/pcu_vty_functions.cpp b/src/pcu_vty_functions.cpp</span><br><span>index 231bce7..48780c0 100644</span><br><span>--- a/src/pcu_vty_functions.cpp</span><br><span>+++ b/src/pcu_vty_functions.cpp</span><br><span>@@ -246,7 +246,7 @@</span><br><span> {</span><br><span>      unsigned int trx_nr, ts_nr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, "BTS (%s)%s", bts->active ? "active" : "disabled", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+        vty_out(vty, "BTS%" PRIu8 " (%s)%s", bts->nr, bts->active ? "active" : "disabled", VTY_NEWLINE);</span><br><span>       for (trx_nr = 0; trx_nr < ARRAY_SIZE(bts->trx); trx_nr++) {</span><br><span>            const struct gprs_rlcmac_trx *trx = &bts->trx[trx_nr];</span><br><span> </span><br><span>diff --git a/tests/alloc/AllocTest.cpp b/tests/alloc/AllocTest.cpp</span><br><span>index 20f5286..ecc3e80 100644</span><br><span>--- a/tests/alloc/AllocTest.cpp</span><br><span>+++ b/tests/alloc/AllocTest.cpp</span><br><span>@@ -114,7 +114,7 @@</span><br><span>     int tfi;</span><br><span>     int i;</span><br><span>       uint8_t used_trx, tmp_trx;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span>  struct gprs_rlcmac_tbf *tbfs[32*8+1] = { 0, };</span><br><span> </span><br><span>@@ -206,7 +206,7 @@</span><br><span> static inline bool test_alloc_b_ul_dl(bool ts0, bool ts1, bool ts2, bool ts3, bool ts4, bool ts5, bool ts6, bool ts7,</span><br><span>                                  uint8_t ms_class, bool verbose)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span>  gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span>  gprs_rlcmac_dl_tbf *dl_tbf;</span><br><span>@@ -250,7 +250,7 @@</span><br><span> static inline bool test_alloc_b_dl_ul(bool ts0, bool ts1, bool ts2, bool ts3, bool ts4, bool ts5, bool ts6, bool ts7,</span><br><span>                                 uint8_t ms_class, bool verbose)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span>  gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span>  gprs_rlcmac_dl_tbf *dl_tbf;</span><br><span>@@ -301,7 +301,7 @@</span><br><span> </span><br><span> static inline bool test_alloc_b_jolly(uint8_t ms_class)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span>  int tfi;</span><br><span>     uint8_t trx_no;</span><br><span>@@ -644,7 +644,7 @@</span><br><span>        unsigned max_class, enum test_mode mode,</span><br><span>     unsigned expect_num, const char *text)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         struct gprs_rlcmac_trx *trx;</span><br><span>         unsigned counter;</span><br><span> </span><br><span>@@ -677,7 +677,7 @@</span><br><span> static void test_many_connections(algo_t algo, unsigned expect_num,</span><br><span>   const char *text)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         struct gprs_rlcmac_trx *trx;</span><br><span>         int counter1, counter2 = -1;</span><br><span>         unsigned i;</span><br><span>@@ -754,7 +754,7 @@</span><br><span> </span><br><span> static void test_2_consecutive_dl_tbfs()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span>  struct gprs_rlcmac_trx *trx;</span><br><span>         uint8_t ms_class = 11;</span><br><span>diff --git a/tests/alloc/MslotTest.cpp b/tests/alloc/MslotTest.cpp</span><br><span>index b32a828..96b82a5 100644</span><br><span>--- a/tests/alloc/MslotTest.cpp</span><br><span>+++ b/tests/alloc/MslotTest.cpp</span><br><span>@@ -62,7 +62,7 @@</span><br><span> </span><br><span> static inline void test_multislot_total_ascending(bool seq)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         struct gprs_rlcmac_trx *trx;</span><br><span>         int i;</span><br><span> </span><br><span>@@ -81,7 +81,7 @@</span><br><span> </span><br><span> static inline void test_multislot_total_descending(bool seq)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         struct gprs_rlcmac_trx *trx;</span><br><span>         int i;</span><br><span> </span><br><span>@@ -100,7 +100,7 @@</span><br><span> </span><br><span> static inline void test_multislot_middle(bool seq)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         struct gprs_rlcmac_trx *trx;</span><br><span> </span><br><span>     printf("%s(): %s\n", __func__, seq ? "sequential" : "accumulative");</span><br><span>@@ -117,7 +117,7 @@</span><br><span> </span><br><span> static inline void test_multislot_ends(bool seq)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         struct gprs_rlcmac_trx *trx;</span><br><span> </span><br><span>     printf("%s(): %s\n", __func__, seq ? "sequential" : "accumulative");</span><br><span>diff --git a/tests/app_info/AppInfoTest.cpp b/tests/app_info/AppInfoTest.cpp</span><br><span>index e0b2853..f145fa5 100644</span><br><span>--- a/tests/app_info/AppInfoTest.cpp</span><br><span>+++ b/tests/app_info/AppInfoTest.cpp</span><br><span>@@ -78,7 +78,7 @@</span><br><span> </span><br><span> void prepare_bts_with_two_dl_tbf_subscr()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = gprs_pcu_get_bts_by_nr(the_pcu, 0);</span><br><span>    struct gprs_rlcmac_trx *trx;</span><br><span> </span><br><span>     fprintf(stderr, "--- %s ---\n",  __func__);</span><br><span>@@ -121,7 +121,7 @@</span><br><span> </span><br><span> void test_sched_app_info_missing_app_info_in_bts(const struct gsm_pcu_if_app_info_req *req)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = gprs_pcu_get_bts_by_nr(the_pcu, 0);</span><br><span>    struct gsm_pcu_if pcu_prim = {PCU_IF_MSG_APP_INFO_REQ, };</span><br><span> </span><br><span>        fprintf(stderr, "--- %s ---\n",  __func__);</span><br><span>@@ -147,13 +147,18 @@</span><br><span>        fprintf(stderr, "\n");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void cleanup()</span><br><span style="color: hsl(120, 100%, 40%);">+extern "C" void cleanup()</span><br><span> {</span><br><span>    fprintf(stderr, "--- %s ---\n",  __func__);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       tbf_free(tbf1);</span><br><span>      tbf_free(tbf2);</span><br><span style="color: hsl(0, 100%, 40%);">- TALLOC_FREE(the_pcu->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       bts = gprs_pcu_get_bts_by_nr(the_pcu, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     talloc_free(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* FIXME: talloc report disabled, because bts_alloc_ms(bts, ) in prepare_bts_with_two_dl_tbf_subscr() causes leak */</span><br><span>         /* talloc_report_full(tall_pcu_ctx, stderr); */</span><br><span>      talloc_free(the_pcu);</span><br><span>@@ -173,7 +178,7 @@</span><br><span>  log_parse_category_mask(osmo_stderr_target, "DL1IF,1:DRLCMAC,3:DRLCMACSCHED,1");</span><br><span> </span><br><span>       the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_alloc(the_pcu, 0);</span><br><span> </span><br><span>   test_enc_zero_len();</span><br><span>         test_enc(&req);</span><br><span>diff --git a/tests/edge/EdgeTest.cpp b/tests/edge/EdgeTest.cpp</span><br><span>index d67646e..6161e0e 100644</span><br><span>--- a/tests/edge/EdgeTest.cpp</span><br><span>+++ b/tests/edge/EdgeTest.cpp</span><br><span>@@ -1252,7 +1252,7 @@</span><br><span> </span><br><span> static void uplink_header_type2_test(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -1370,7 +1370,7 @@</span><br><span> </span><br><span> void uplink_header_type1_test(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gprs_rlcmac_bts  *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_rlcmac_bts  *bts = bts_alloc(the_pcu, 0);</span><br><span>        int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>diff --git a/tests/emu/pcu_emu.cpp b/tests/emu/pcu_emu.cpp</span><br><span>index d7b11ca..ef573a7 100644</span><br><span>--- a/tests/emu/pcu_emu.cpp</span><br><span>+++ b/tests/emu/pcu_emu.cpp</span><br><span>@@ -63,9 +63,8 @@</span><br><span>                      test_pdp_activation_data),</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void init_main_bts()</span><br><span style="color: hsl(120, 100%, 40%);">+static void init_main_bts(struct gprs_rlcmac_bts *bts)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span>       bts->initial_cs_dl = bts->initial_cs_ul = 1;</span><br><span>   bts->cs_mask = 1 << 0; /* CS-1 always enabled by default */</span><br><span>         bts->n3101 = 10;</span><br><span>@@ -119,7 +118,7 @@</span><br><span> {</span><br><span>       struct gprs_pcu *pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span>         the_pcu = pcu; /* globally avaialable object */</span><br><span style="color: hsl(0, 100%, 40%);">- pcu->bts = bts_alloc(pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_rlcmac_bts *bts = bts_alloc(pcu, 0);</span><br><span> </span><br><span>         tall_pcu_ctx = talloc_named_const(NULL, 1, "moiji-mobile Emu-PCU context");</span><br><span>        if (!tall_pcu_ctx)</span><br><span>@@ -140,9 +139,9 @@</span><br><span>     current_test = 0;</span><br><span> </span><br><span>        init_pcu(pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-  init_main_bts();</span><br><span style="color: hsl(120, 100%, 40%);">+      init_main_bts(bts);</span><br><span>  bssgp_set_bssgp_callback(gprs_gp_send_cb, pcu->nsi);</span><br><span style="color: hsl(0, 100%, 40%);">- create_and_connect_bssgp(pcu->bts, INADDR_LOOPBACK, 23000);</span><br><span style="color: hsl(120, 100%, 40%);">+        create_and_connect_bssgp(bts, INADDR_LOOPBACK, 23000);</span><br><span> </span><br><span>   for (;;)</span><br><span>             osmo_select_main(0);</span><br><span>diff --git a/tests/fn/FnTest.cpp b/tests/fn/FnTest.cpp</span><br><span>index dd30b34..4281fc3 100644</span><br><span>--- a/tests/fn/FnTest.cpp</span><br><span>+++ b/tests/fn/FnTest.cpp</span><br><span>@@ -53,7 +53,7 @@</span><br><span> </span><br><span> static void run_test()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint32_t fn;</span><br><span> </span><br><span>     printf("RFN_MODULUS=%i\n",RFN_MODULUS);</span><br><span>diff --git a/tests/ms/MsTest.cpp b/tests/ms/MsTest.cpp</span><br><span>index 58579f8..f459e99 100644</span><br><span>--- a/tests/ms/MsTest.cpp</span><br><span>+++ b/tests/ms/MsTest.cpp</span><br><span>@@ -51,7 +51,7 @@</span><br><span>       uint32_t tlli = 0xffeeddbb;</span><br><span>  gprs_rlcmac_dl_tbf *dl_tbf;</span><br><span>  gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span> </span><br><span>      printf("=== start %s ===\n", __func__);</span><br><span>@@ -114,7 +114,7 @@</span><br><span>      uint32_t tlli = 0xffeeddbb;</span><br><span>  gprs_rlcmac_dl_tbf *dl_tbf;</span><br><span>  gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span>  last_cb = CB_UNKNOWN;</span><br><span> </span><br><span>@@ -188,7 +188,7 @@</span><br><span>      uint32_t tlli = 0xffeeddbb;</span><br><span>  gprs_rlcmac_dl_tbf *dl_tbf[2];</span><br><span>       gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span> </span><br><span>      printf("=== start %s ===\n", __func__);</span><br><span>@@ -262,7 +262,7 @@</span><br><span>      uint32_t start_tlli = 0xaa000000;</span><br><span>    uint32_t new_ms_tlli = 0xff001111;</span><br><span>   uint32_t other_sgsn_tlli = 0xff00eeee;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span> </span><br><span>      printf("=== start %s ===\n", __func__);</span><br><span>@@ -374,7 +374,7 @@</span><br><span>      const char *imsi2 = "001001987654322";</span><br><span> </span><br><span>         gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms, *ms_tmp;</span><br><span>         GprsMsStorage store(bts);</span><br><span> </span><br><span>@@ -446,7 +446,7 @@</span><br><span>  uint32_t tlli = 0xffeeddbb;</span><br><span>  gprs_rlcmac_dl_tbf *dl_tbf;</span><br><span>  gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span>  last_cb = CB_UNKNOWN;</span><br><span> </span><br><span>@@ -499,7 +499,7 @@</span><br><span> </span><br><span> static void test_ms_cs_selection()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint32_t tlli = 0xffeeddbb;</span><br><span> </span><br><span>      gprs_rlcmac_dl_tbf *dl_tbf;</span><br><span>@@ -544,7 +544,7 @@</span><br><span> </span><br><span> static void test_ms_mcs_mode()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint32_t tlli = 0xdeadbeef;</span><br><span> </span><br><span>      gprs_rlcmac_dl_tbf *dl_tbf;</span><br><span>diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp</span><br><span>index 798dc3c..24fd109 100644</span><br><span>--- a/tests/tbf/TbfTest.cpp</span><br><span>+++ b/tests/tbf/TbfTest.cpp</span><br><span>@@ -95,8 +95,7 @@</span><br><span> static void test_tbf_tlli_update()</span><br><span> {</span><br><span>  the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms, *ms_new;</span><br><span> </span><br><span>     fprintf(stderr, "=== start %s ===\n", __func__);</span><br><span>@@ -254,8 +253,7 @@</span><br><span> static void test_tbf_final_ack(enum test_tbf_final_ack_mode test_mode)</span><br><span> {</span><br><span>      the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint8_t ts_no = 4;</span><br><span>   unsigned i;</span><br><span>  uint8_t ms_class = 45;</span><br><span>@@ -340,8 +338,7 @@</span><br><span> static void test_tbf_delayed_release()</span><br><span> {</span><br><span>  the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint8_t ts_no = 4;</span><br><span>   unsigned i;</span><br><span>  uint8_t ms_class = 45;</span><br><span>@@ -411,8 +408,7 @@</span><br><span> static void test_tbf_imsi()</span><br><span> {</span><br><span>     the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint8_t ts_no = 4;</span><br><span>   uint8_t ms_class = 45;</span><br><span>       uint8_t trx_no;</span><br><span>@@ -473,8 +469,7 @@</span><br><span> static void test_tbf_exhaustion()</span><br><span> {</span><br><span>      the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         unsigned i;</span><br><span>  uint8_t ts_no = 4;</span><br><span>   uint8_t ms_class = 45;</span><br><span>@@ -517,8 +512,7 @@</span><br><span> static void test_tbf_dl_llc_loss()</span><br><span> {</span><br><span>      the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint8_t ts_no = 4;</span><br><span>   uint8_t ms_class = 45;</span><br><span>       int rc = 0;</span><br><span>@@ -1699,8 +1693,7 @@</span><br><span> static void test_tbf_single_phase()</span><br><span> {</span><br><span>      the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = DUMMY_FN; /* 17,25,9 */</span><br><span>        uint32_t tlli = 0xf1223344;</span><br><span>@@ -1724,8 +1717,7 @@</span><br><span> static void test_tbf_egprs_two_phase_puan(void)</span><br><span> {</span><br><span>  the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -1780,8 +1772,7 @@</span><br><span> static void test_immediate_assign_rej_single_block()</span><br><span> {</span><br><span>      the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>   int ts_no = 7;</span><br><span>@@ -1814,8 +1805,7 @@</span><br><span> static void test_immediate_assign_rej_multi_block()</span><br><span> {</span><br><span>   the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>   int ts_no = 7;</span><br><span>@@ -1856,8 +1846,7 @@</span><br><span> static void test_tbf_two_phase()</span><br><span> {</span><br><span>      the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -1889,8 +1878,7 @@</span><br><span> static void test_tbf_ra_update_rach()</span><br><span> {</span><br><span>     the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -1956,8 +1944,7 @@</span><br><span> static void test_tbf_dl_flow_and_rach_two_phase()</span><br><span> {</span><br><span>         the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -2018,8 +2005,7 @@</span><br><span> static void test_tbf_dl_flow_and_rach_single_phase()</span><br><span> {</span><br><span>      the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -2079,8 +2065,7 @@</span><br><span> static void test_tbf_dl_reuse()</span><br><span> {</span><br><span>   the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -2180,8 +2165,7 @@</span><br><span> static void test_tbf_gprs_egprs()</span><br><span> {</span><br><span>         the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint8_t ts_no = 4;</span><br><span>   uint8_t ms_class = 45;</span><br><span>       int rc = 0;</span><br><span>@@ -2248,8 +2232,7 @@</span><br><span> static void test_tbf_ws()</span><br><span> {</span><br><span>        the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span>  uint8_t ts_no = 4;</span><br><span>   uint8_t ms_class = 12;</span><br><span>@@ -2294,8 +2277,7 @@</span><br><span> static void test_tbf_update_ws(void)</span><br><span> {</span><br><span>  the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         GprsMs *ms;</span><br><span>  uint8_t ts_no = 4;</span><br><span>   uint8_t ms_class = 11;</span><br><span>@@ -2339,8 +2321,7 @@</span><br><span> static void test_tbf_puan_urbb_len(void)</span><br><span> {</span><br><span>      the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -2479,8 +2460,7 @@</span><br><span> static void test_tbf_li_decoding(void)</span><br><span> {</span><br><span>    the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -2516,8 +2496,7 @@</span><br><span> static void test_tbf_epdan_out_of_rx_window(void)</span><br><span> {</span><br><span>         the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint8_t ms_class = 11;</span><br><span>       uint8_t egprs_ms_class = 11;</span><br><span>         uint8_t trx_no;</span><br><span>@@ -2608,8 +2587,7 @@</span><br><span> static void test_tbf_egprs_two_phase_spb(void)</span><br><span> {</span><br><span>       the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -2640,8 +2618,7 @@</span><br><span> static void test_tbf_egprs_two_phase()</span><br><span> {</span><br><span>    the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         int ts_no = 7;</span><br><span>       uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>@@ -3064,8 +3041,7 @@</span><br><span> static void test_tbf_egprs_retx_dl(void)</span><br><span> {</span><br><span>  the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint8_t ts_no = 4;</span><br><span> </span><br><span>       fprintf(stderr, "=== start %s ===\n", __func__);</span><br><span>@@ -3093,8 +3069,7 @@</span><br><span> static void test_tbf_egprs_spb_dl(void)</span><br><span> {</span><br><span>   the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint8_t ts_no = 4;</span><br><span> </span><br><span>       fprintf(stderr, "=== start %s ===\n", __func__);</span><br><span>@@ -3124,8 +3099,7 @@</span><br><span> static void test_tbf_egprs_dl()</span><br><span> {</span><br><span>   the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint8_t ts_no = 4;</span><br><span>   int i;</span><br><span> </span><br><span>@@ -3148,8 +3122,7 @@</span><br><span> static void test_packet_access_rej_prr_no_other_tbfs()</span><br><span> {</span><br><span>    the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint32_t fn = 2654218;</span><br><span>       int ts_no = 7;</span><br><span>       uint8_t trx_no = 0;</span><br><span>@@ -3184,8 +3157,7 @@</span><br><span> static void test_packet_access_rej_prr()</span><br><span> {</span><br><span>         the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint32_t fn = 2654218;</span><br><span>       uint16_t qta = 31;</span><br><span>   int ts_no = 7;</span><br><span>@@ -3255,8 +3227,7 @@</span><br><span> void test_packet_access_rej_epdan()</span><br><span> {</span><br><span>   the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- the_pcu->bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gprs_rlcmac_bts *bts = the_pcu->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         uint32_t tlli = 0xffeeddcc;</span><br><span>  static uint8_t exp[] = { 0x40, 0x84, 0x7f, 0xf7, 0x6e, 0xe6, 0x41, 0x4b,</span><br><span>                              0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,</span><br><span>diff --git a/tests/types/TypesTest.cpp b/tests/types/TypesTest.cpp</span><br><span>index 2da6a64..038d737 100644</span><br><span>--- a/tests/types/TypesTest.cpp</span><br><span>+++ b/tests/types/TypesTest.cpp</span><br><span>@@ -353,7 +353,7 @@</span><br><span>              uint16_t lost = 0, recv = 0;</span><br><span>                 char show_rbb[65];</span><br><span>           uint8_t bits_data[8];</span><br><span style="color: hsl(0, 100%, 40%);">-           struct gprs_rlcmac_bts *dummy_bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+               struct gprs_rlcmac_bts *dummy_bts = bts_alloc(the_pcu, 0);</span><br><span>           gprs_rlc_dl_window dl_win;</span><br><span>           bitvec bits;</span><br><span>                 int bsn_begin, bsn_end, num_blocks;</span><br><span>@@ -671,7 +671,7 @@</span><br><span> </span><br><span>        fprintf(stderr, "############## test_egprs_ul_ack_nack\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         the_pcu->alloc_algorithm = alloc_algorithm_a;</span><br><span>     bts->trx[0].pdch[4].enable();</span><br><span> </span><br><span>@@ -762,7 +762,7 @@</span><br><span> </span><br><span> void test_immediate_assign_dl()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         the_pcu->alloc_algorithm = alloc_algorithm_a;</span><br><span>     bts->trx[0].pdch[2].enable();</span><br><span>     bts->trx[0].pdch[3].enable();</span><br><span>@@ -787,7 +787,7 @@</span><br><span> </span><br><span> void test_immediate_assign_ul0m()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         the_pcu->alloc_algorithm = alloc_algorithm_a;</span><br><span>     bts->trx[0].pdch[4].enable();</span><br><span>     bts->trx[0].pdch[5].enable();</span><br><span>@@ -829,7 +829,7 @@</span><br><span> </span><br><span> void test_immediate_assign_ul1s()</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span>         the_pcu->alloc_algorithm = alloc_algorithm_a;</span><br><span>     bts->trx[0].pdch[1].enable();</span><br><span>     bts->trx[0].pdch[2].enable();</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/22309">change 22309</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-pcu/+/22309"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6b10913f46c19d438c4e250a436a7446694b725a </div>
<div style="display:none"> Gerrit-Change-Number: 22309 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>