Hello Harald Welte, Jenkins Builder, Holger Freyther,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/3905

to look at the new patch set (#16).

Simplify TS alloc: move slot assignment

Move into separate functions:
* move timeslot reservation
* move UL timeslot assignment
* move DL timeslot assignment

Change-Id: I64cf78c5cfc78664766f9769dd5cde632dab92b0
Related: OS#2282
---
M src/gprs_rlcmac_ts_alloc.cpp
M src/mslot_class.c
M src/mslot_class.h
M tests/tbf/TbfTest.err
4 files changed, 84 insertions(+), 42 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/05/3905/16

diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp
index 0955411..f23b89f 100644
--- a/src/gprs_rlcmac_ts_alloc.cpp
+++ b/src/gprs_rlcmac_ts_alloc.cpp
@@ -828,6 +828,75 @@
        return ul_slots;
 }
 
+/*! Update MS' reserved timeslots
+ *
+ *  \param[in,out] trx Pointer to TRX struct
+ *  \param[in,out] ms_ Pointer to MS object
+ *  \param[in] tbf_ Pointer to TBF struct
+ *  \param[in] res_ul_slots Newly reserved UL slots
+ *  \param[in] res_dl_slots Newly reserved DL slots
+ *  \param[in] ul_slots available UL slots (for logging only)
+ *  \param[in] dl_slots available DL slots (for logging only)
+ */
+static void update_ms_reserved_slots(gprs_rlcmac_trx *trx, GprsMs *ms, uint8_t 
res_ul_slots, uint8_t res_dl_slots,
+                                    uint8_t ul_slots, uint8_t dl_slots)
+{
+       char slot_info[9] = { 0 };
+
+       if (res_ul_slots == ms->reserved_ul_slots() && res_dl_slots == 
ms->reserved_dl_slots())
+               return;
+
+       /* The reserved slots have changed, update the MS */
+       ms->set_reserved_slots(trx, res_ul_slots, res_dl_slots);
+
+       ts_format(slot_info, dl_slots, ul_slots);
+       LOGP(DRLCMAC, LOGL_DEBUG, "- Reserved DL/UL slots: 
(TS=0)\"%s\"(TS=7)\n", slot_info);
+}
+
+/*! Assign given UL timeslots to UL TBF
+ *
+ *  \param[in,out] ul_tbf Pointer to UL TBF struct
+ *  \param[in,out] trx Pointer to TRX object
+ *  \param[in] ul_slots Set of slots to be assigned
+ *  \param[in] tfi selected TFI
+ *  \param[in] usf selected USF
+ */
+static void assign_ul_tbf_slots(struct gprs_rlcmac_ul_tbf *ul_tbf, 
gprs_rlcmac_trx *trx, uint8_t ul_slots, int tfi,
+                               int *usf)
+{
+       uint8_t ts;
+
+       for (ts = 0; ts < 8; ts++) {
+               if (!(ul_slots & (1 << ts)))
+                       continue;
+
+               OSMO_ASSERT(usf[ts] >= 0);
+
+               LOGP(DRLCMAC, LOGL_DEBUG, "- Assigning UL TS %u\n", ts);
+               assign_uplink_tbf_usf(&trx->pdch[ts], ul_tbf, tfi, usf[ts]);
+       }
+}
+
+/*! Assign given DL timeslots to DL TBF
+ *
+ *  \param[in,out] dl_tbf Pointer to DL TBF struct
+ *  \param[in,out] trx Pointer to TRX object
+ *  \param[in] ul_slots Set of slots to be assigned
+ *  \param[in] tfi selected TFI
+ */
+static void assign_dl_tbf_slots(struct gprs_rlcmac_dl_tbf *dl_tbf, 
gprs_rlcmac_trx *trx, uint8_t dl_slots, int tfi)
+{
+       uint8_t ts;
+
+       for (ts = 0; ts < 8; ts++) {
+               if (!(dl_slots & (1 << ts)))
+                       continue;
+
+               LOGP(DRLCMAC, LOGL_DEBUG, "- Assigning DL TS %u\n", ts);
+               assign_dlink_tbf(&trx->pdch[ts], dl_tbf, tfi);
+       }
+}
+
 /*! Slot Allocation: Algorithm B
  *
  * Assign as many downlink slots as possible.
@@ -850,8 +919,6 @@
        int8_t first_common_ts;
        uint8_t slotcount = 0;
        uint8_t avail_count = 0, trx_no;
-       char slot_info[9] = {0};
-       int ts;
        int first_ts = -1;
        int usf[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
        int rc;
@@ -943,50 +1010,16 @@
 
        /* Step 4: Update MS and TBF and really allocate the resources */
 
-       /* The reserved slots have changed, update the MS */
-       if (reserved_ul_slots != ms->reserved_ul_slots() ||
-               reserved_dl_slots != ms->reserved_dl_slots())
-       {
-               ms_->set_reserved_slots(trx,
-                       reserved_ul_slots, reserved_dl_slots);
-
-               LOGP(DRLCMAC, LOGL_DEBUG,
-                       "- Reserved DL/UL slots: (TS=0)\"%s\"(TS=7)\n",
-                       set_flag_chars(set_flag_chars(set_flag_chars(slot_info,
-                               dl_slots, 'D', '.'),
-                               ul_slots, 'U'),
-                               ul_slots & dl_slots, 'C'));
-       }
+       update_ms_reserved_slots(trx, ms_, reserved_ul_slots, 
reserved_dl_slots, ul_slots, dl_slots);
 
        tbf_->trx = trx;
        tbf_->first_common_ts = first_common_ts;
        tbf_->first_ts = first_ts;
 
-       if (tbf->direction == GPRS_RLCMAC_DL_TBF) {
-               struct gprs_rlcmac_dl_tbf *dl_tbf = as_dl_tbf(tbf_);
-               for (ts = 0; ts < 8; ts++) {
-                       if (!(dl_slots & (1 << ts)))
-                               continue;
-
-                       LOGP(DRLCMAC, LOGL_DEBUG, "- Assigning DL TS "
-                               "%d\n", ts);
-                       assign_dlink_tbf(&trx->pdch[ts], dl_tbf, tfi);
-               }
-       } else {
-               struct gprs_rlcmac_ul_tbf *ul_tbf = as_ul_tbf(tbf_);
-
-               for (ts = 0; ts < 8; ts++) {
-                       if (!(ul_slots & (1 << ts)))
-                               continue;
-
-                       OSMO_ASSERT(usf[ts] >= 0);
-
-                       LOGP(DRLCMAC, LOGL_DEBUG, "- Assigning UL TS "
-                               "%d\n", ts);
-                       assign_uplink_tbf_usf(&trx->pdch[ts], ul_tbf,
-                               tfi, usf[ts]);
-               }
-       }
+       if (tbf->direction == GPRS_RLCMAC_DL_TBF)
+               assign_dl_tbf_slots(as_dl_tbf(tbf_), trx, dl_slots, tfi);
+       else
+               assign_ul_tbf_slots(as_ul_tbf(tbf_), trx, ul_slots, tfi, usf);
 
        bts->bts->tbf_alloc_algo_b();
 
diff --git a/src/mslot_class.c b/src/mslot_class.c
index 6a7e25b..dad94ae 100644
--- a/src/mslot_class.c
+++ b/src/mslot_class.c
@@ -23,6 +23,7 @@
 #include <mslot_class.h>
 #include <gprs_debug.h>
 
+#include <osmocom/core/bits.h>
 #include <osmocom/core/utils.h>
 #include <osmocom/core/logging.h>
 
@@ -236,3 +237,10 @@
                if (mask & 1)
                        buf[i] = set_char;
 }
+
+void ts_format(char *buf, uint8_t dl_mask, uint8_t ul_mask)
+{
+       snprintf(buf, 9, OSMO_BIT_SPEC, OSMO_BIT_PRINT_EX(dl_mask, 'D'));
+       masked_override_with(buf, ul_mask, 'U');
+       masked_override_with(buf, ul_mask & dl_mask, 'C');
+}
diff --git a/src/mslot_class.h b/src/mslot_class.h
index c274337..d8b024b 100644
--- a/src/mslot_class.h
+++ b/src/mslot_class.h
@@ -53,3 +53,4 @@
 void mslot_fill_rx_mask(uint8_t mslot_class, uint8_t num_tx, uint8_t *rx_mask);
 int8_t find_free_usf(uint8_t usf_map);
 void masked_override_with(char *buf, uint8_t mask, char set_char);
+void ts_format(char *buf, uint8_t dl_mask, uint8_t ul_mask);
diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err
index d046382..c899199 100644
--- a/tests/tbf/TbfTest.err
+++ b/tests/tbf/TbfTest.err
@@ -5921,7 +5921,7 @@
 Rx=4 Tx=3 Sum Rx+Tx=5, Tta=3 Ttb=1, Tra=2 Trb=1, Type=1
 - Selected DL slots: (TS=0)"..ddDd.."(TS=7), single
 Using single slot at TS 4 for DL
-- Reserved DL/UL slots: (TS=0)"....C..."(TS=7)
+- Reserved DL/UL slots: (TS=0)"...DC..."(TS=7)
 - Assigning DL TS 4
 PDCH(TS 4, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL 
EGPRS), 1 TBFs, USFs = 00, TFIs = 00000001.
 TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL EGPRS) Setting Control TS 4

-- 
To view, visit https://gerrit.osmocom.org/3905
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I64cf78c5cfc78664766f9769dd5cde632dab92b0
Gerrit-PatchSet: 16
Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Owner: Max <msur...@sysmocom.de>
Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Holger Freyther <hol...@freyther.de>
Gerrit-Reviewer: Jenkins Builder

Reply via email to