This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Max gerrit-no-reply at lists.osmocom.orgHello Jenkins Builder,
I'd like you to reexamine a change. Please visit
https://gerrit.osmocom.org/3914
to look at the new patch set (#2).
Simplify TS alloc: cosmetic, use proper formatting
The find_multi_slots() function has 4 nested for(;;) loops but it's
formatted as one. Before trying to split this into smth saner, let's
first fix code formatting to make nested loops obvious. Also, fix typos
in comments.
Change-Id: I50b59b12e8d938bd96f9b29d00a649cd3e77bc5e
Related: OS#2282
---
M src/gprs_rlcmac_ts_alloc.cpp
1 file changed, 142 insertions(+), 141 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/14/3914/2
diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp
index 301b2eb..cfef05a 100644
--- a/src/gprs_rlcmac_ts_alloc.cpp
+++ b/src/gprs_rlcmac_ts_alloc.cpp
@@ -604,8 +604,7 @@
rx_mask[MASK_TT] = (0x100 >> OSMO_MAX(Ttb, Tta)) - 1;
rx_mask[MASK_TT] &= ~((1 << (Trb + num_tx)) - 1);
rx_mask[MASK_TR] = (0x100 >> Ttb) - 1;
- rx_mask[MASK_TR] &=
- ~((1 << (OSMO_MAX(Trb, Tra) + num_tx)) - 1);
+ rx_mask[MASK_TR] &= ~((1 << (OSMO_MAX(Trb, Tra) + num_tx)) - 1);
} else {
/* Class type 2 MS have independant RX and TX */
rx_mask[MASK_TT] = 0xff;
@@ -615,177 +614,179 @@
rx_mask[MASK_TT] = (rx_mask[MASK_TT] << 3) | (rx_mask[MASK_TT] >> 5);
rx_mask[MASK_TR] = (rx_mask[MASK_TR] << 3) | (rx_mask[MASK_TR] >> 5);
- /* Rotate group of TX slots: UUU-----, -UUU----, ..., UU-----U */
- for (ul_ts = 0; ul_ts < 8; ul_ts += 1, tx_valid_win <<= 1) {
- unsigned tx_slot_count;
- int max_rx;
- uint16_t rx_valid_win;
- uint32_t checked_rx[256/32] = {0};
+ /* Rotate group of TX slots: UUU-----, -UUU----, ..., UU-----U */
+ for (ul_ts = 0; ul_ts < 8; ul_ts += 1, tx_valid_win <<= 1) {
+ unsigned tx_slot_count;
+ int max_rx;
+ uint16_t rx_valid_win;
+ uint32_t checked_rx[256/32] = {0};
- /* Wrap valid window */
- tx_valid_win = (tx_valid_win | tx_valid_win >> 8) & 0xff;
+ /* Wrap valid window */
+ tx_valid_win = (tx_valid_win | tx_valid_win >> 8) & 0xff;
- tx_window = tx_valid_win;
+ tx_window = tx_valid_win;
- /* Filter out unavailable slots */
- tx_window &= *ul_slots;
+ /* Filter out unavailable slots */
+ tx_window &= *ul_slots;
- /* Skip if the the first TS (ul_ts) is not in the set */
- if ((tx_window & (1 << ul_ts)) == 0)
- continue;
+ /* Skip if the the first TS (ul_ts) is not in the set */
+ if ((tx_window & (1 << ul_ts)) == 0)
+ continue;
- /* Skip if the the last TS (ul_ts+num_tx-1) is not in the set */
- if ((tx_window & (1 << ((ul_ts+num_tx-1) % 8))) == 0)
- continue;
+ /* Skip if the the last TS (ul_ts+num_tx-1) is not in the set */
+ if ((tx_window & (1 << ((ul_ts+num_tx-1) % 8))) == 0)
+ continue;
- tx_slot_count = pcu_bitcount(tx_window);
+ tx_slot_count = pcu_bitcount(tx_window);
- max_rx = OSMO_MIN(ms_class->rx, ms_class->sum - num_tx);
- rx_valid_win = (1 << max_rx) - 1;
+ max_rx = OSMO_MIN(ms_class->rx, ms_class->sum - num_tx);
+ rx_valid_win = (1 << max_rx) - 1;
- /* Rotate group of RX slots: DDD-----, -DDD----, ..., DD-----D */
- for (dl_ts = 0; dl_ts < 8; dl_ts += 1, rx_valid_win <<= 1) {
- /* Wrap valid window */
- rx_valid_win = (rx_valid_win | rx_valid_win >> 8) & 0xff;
+ /* Rotate group of RX slots: DDD-----, -DDD----, ..., DD-----D */
+ for (dl_ts = 0; dl_ts < 8; dl_ts += 1, rx_valid_win <<= 1) {
+ /* Wrap valid window */
+ rx_valid_win = (rx_valid_win | rx_valid_win >> 8) & 0xff;
- /* Validate with both Tta/Ttb/Trb and Ttb/Tra/Trb */
- for (mask_sel = MASK_TT; mask_sel <= MASK_TR; mask_sel += 1) {
- unsigned common_slot_count;
- unsigned req_common_slots;
- unsigned rx_slot_count;
- uint16_t rx_bad;
- uint8_t rx_good;
- unsigned ts;
- int capacity;
+ /* Validate with both Tta/Ttb/Trb and Ttb/Tra/Trb */
+ for (mask_sel = MASK_TT; mask_sel <= MASK_TR; mask_sel += 1) {
+ unsigned common_slot_count;
+ unsigned req_common_slots;
+ unsigned rx_slot_count;
+ uint16_t rx_bad;
+ uint8_t rx_good;
+ unsigned ts;
+ int capacity;
- /* Filter out bad slots */
- rx_bad = (uint16_t)(0xff & ~rx_mask[mask_sel]) << ul_ts;
- rx_bad = (rx_bad | (rx_bad >> 8)) & 0xff;
- rx_good = *dl_slots & ~rx_bad;
+ /* Filter out bad slots */
+ rx_bad = (uint16_t)(0xff & ~rx_mask[mask_sel]) << ul_ts;
+ rx_bad = (rx_bad | (rx_bad >> 8)) & 0xff;
+ rx_good = *dl_slots & ~rx_bad;
- /* TODO: CHECK this calculation -> separate function for unit
- * testing */
+ /* TODO: CHECK this calculation -> separate function for unit testing */
- rx_window = rx_good & rx_valid_win;
- rx_slot_count = pcu_bitcount(rx_window);
+ rx_window = rx_good & rx_valid_win;
+ rx_slot_count = pcu_bitcount(rx_window);
#if 0
- LOGP(DRLCMAC, LOGL_DEBUG, "n_tx=%d, n_rx=%d, mask_sel=%d, "
- "tx=%02x, rx=%02x, mask=%02x, bad=%02x, good=%02x, "
- "ul=%02x, dl=%02x\n",
- tx_slot_count, rx_slot_count, mask_sel,
- tx_window, rx_window, rx_mask[mask_sel], rx_bad, rx_good,
- *ul_slots, *dl_slots);
+ LOGP(DRLCMAC, LOGL_DEBUG, "n_tx=%d, n_rx=%d, mask_sel=%d, "
+ "tx=%02x, rx=%02x, mask=%02x, bad=%02x, good=%02x, "
+ "ul=%02x, dl=%02x\n",
+ tx_slot_count, rx_slot_count, mask_sel,
+ tx_window, rx_window, rx_mask[mask_sel], rx_bad, rx_good,
+ *ul_slots, *dl_slots);
#endif
- /* Check compliance with TS 45.002, table 6.4.2.2.1 */
- /* Whether to skip this round doesn not only depend on the bit
- * sets but also on mask_sel. Therefore this check must be done
- * before doing the test_and_set_bit shortcut. */
- if (ms_class->type == 1) {
- unsigned slot_sum = rx_slot_count + tx_slot_count;
- /* Assume down+up/dynamic.
- * TODO: For ext-dynamic, down only, up only add more
- * cases.
- */
- if (slot_sum <= 6 && tx_slot_count < 3) {
- if (mask_sel != MASK_TR)
- /* Skip Tta */
- continue;
- } else if (slot_sum > 6 && tx_slot_count < 3) {
- if (mask_sel != MASK_TT)
- /* Skip Tra */
- continue;
- } else {
- /* No supported row in table 6.4.2.2.1. */
+ /* Check compliance with TS 45.002, table 6.4.2.2.1 */
+ /* Whether to skip this round doesn not only depend on the bit
+ * sets but also on mask_sel. Therefore this check must be done
+ * before doing the test_and_set_bit shortcut. */
+ if (ms_class->type == 1) {
+ unsigned slot_sum = rx_slot_count + tx_slot_count;
+ /* Assume down+up/dynamic.
+ * TODO: For ext-dynamic, down only, up only add more cases.
+ */
+ if (slot_sum <= 6 && tx_slot_count < 3) {
+ if (mask_sel != MASK_TR)
+ /* Skip Tta */
+ continue;
+ } else if (slot_sum > 6 && tx_slot_count < 3) {
+ if (mask_sel != MASK_TT)
+ /* Skip Tra */
+ continue;
+ } else {
+ /* No supported row in TS 45.002, table 6.4.2.2.1. */
#ifdef ENABLE_TS_ALLOC_DEBUG
- snprintf(slot_info, 9, OSMO_BIT_SPEC, OSMO_BIT_PRINT_EX(rx_bad, 'x'));
- masked_override_with(slot_info, rx_window, 'D');
- masked_override_with(slot_info, tx_window, 'U');
- LOGP(DRLCMAC, LOGL_DEBUG,
- "- Skipping DL/UL slots: (TS=0)\"%s\"(TS=7), "
- "combination not supported\n", slot_info);
+ snprintf(slot_info, 9, OSMO_BIT_SPEC,
+ OSMO_BIT_PRINT_EX(rx_bad, 'x'));
+ masked_override_with(slot_info, rx_window, 'D');
+ masked_override_with(slot_info, tx_window, 'U');
+ LOGP(DRLCMAC, LOGL_DEBUG,
+ "- Skipping DL/UL slots: (TS=0)\"%s\"(TS=7), "
+ "combination not supported\n", slot_info);
#endif
- continue;
- }
- }
+ continue;
+ }
+ }
- /* Avoid repeated RX combination check */
- if (test_and_set_bit(checked_rx, rx_window))
- continue;
+ /* Avoid repeated RX combination check */
+ if (test_and_set_bit(checked_rx, rx_window))
+ continue;
- if (!rx_good) {
+ if (!rx_good) {
#ifdef ENABLE_TS_ALLOC_DEBUG
- snprintf(slot_info, 9, OSMO_BIT_SPEC, OSMO_BIT_PRINT_EX(rx_bad, 'x'));
- masked_override_with(slot_info, tx_window, 'U');
- LOGP(DRLCMAC, LOGL_DEBUG,
- "- Skipping DL/UL slots: (TS=0)\"%s\"(TS=7), "
- "no DL slots available\n", slot_info);
+ snprintf(slot_info, 9, OSMO_BIT_SPEC, OSMO_BIT_PRINT_EX(rx_bad, 'x'));
+ masked_override_with(slot_info, tx_window, 'U');
+ LOGP(DRLCMAC, LOGL_DEBUG,
+ "- Skipping DL/UL slots: (TS=0)\"%s\"(TS=7), "
+ "no DL slots available\n", slot_info);
#endif
- continue;
- }
+ continue;
+ }
- if (!rx_window)
- continue;
+ if (!rx_window)
+ continue;
- /* Check number of common slots according to TS 54.002, 6.4.2.2 */
- common_slot_count = pcu_bitcount(tx_window & rx_window);
- req_common_slots = OSMO_MIN(tx_slot_count, rx_slot_count);
- if (ms_class->type == 1)
- req_common_slots = OSMO_MIN(req_common_slots, 2);
+ /* Check number of common slots according to TS 45.002, §6.4.2.2 */
+ common_slot_count = pcu_bitcount(tx_window & rx_window);
+ req_common_slots = OSMO_MIN(tx_slot_count, rx_slot_count);
+ if (ms_class->type == 1)
+ req_common_slots = OSMO_MIN(req_common_slots, 2);
- if (req_common_slots != common_slot_count) {
+ if (req_common_slots != common_slot_count) {
#ifdef ENABLE_TS_ALLOC_DEBUG
- snprintf(slot_info, 9, OSMO_BIT_SPEC, OSMO_BIT_PRINT_EX(rx_bad, 'x'));
- masked_override_with(slot_info, rx_window, 'D');
- masked_override_with(slot_info, tx_window, 'U');
- LOGP(DRLCMAC, LOGL_DEBUG,
- "- Skipping DL/UL slots: (TS=0)\"%s\"(TS=7), "
- "invalid number of common TS: %d (expected %d)\n",
- slot_info, common_slot_count, req_common_slots);
+ snprintf(slot_info, 9, OSMO_BIT_SPEC, OSMO_BIT_PRINT_EX(rx_bad, 'x'));
+ masked_override_with(slot_info, rx_window, 'D');
+ masked_override_with(slot_info, tx_window, 'U');
+ LOGP(DRLCMAC, LOGL_DEBUG,
+ "- Skipping DL/UL slots: (TS=0)\"%s\"(TS=7), "
+ "invalid number of common TS: %d (expected %d)\n",
+ slot_info, common_slot_count, req_common_slots);
#endif
- continue;
- }
+ continue;
+ }
- /* Compute capacity */
- capacity = 0;
+ /* Compute capacity */
+ capacity = 0;
- for (ts = 0; ts < ARRAY_SIZE(trx->pdch); ts++) {
- int c;
- const struct gprs_rlcmac_pdch *pdch = &trx->pdch[ts];
- if (rx_window & (1 << ts)) {
- c = 32 - pdch->num_reserved(GPRS_RLCMAC_DL_TBF);
- c = OSMO_MAX(c, 1);
- capacity += c;
- }
- /* Only consider common slots for UL */
- if (tx_window & rx_window & (1 << ts)) {
- if (find_free_usf(pdch) >= 0) {
- c = 32 - pdch->num_reserved(GPRS_RLCMAC_UL_TBF);
- c = OSMO_MAX(c, 1);
- capacity += c;
+ for (ts = 0; ts < ARRAY_SIZE(trx->pdch); ts++) {
+ int c;
+ const struct gprs_rlcmac_pdch *pdch = &trx->pdch[ts];
+ if (rx_window & (1 << ts)) {
+ c = 32 - pdch->num_reserved(GPRS_RLCMAC_DL_TBF);
+ c = OSMO_MAX(c, 1);
+ capacity += c;
+ }
+ /* Only consider common slots for UL */
+ if (tx_window & rx_window & (1 << ts)) {
+ if (find_free_usf(pdch) >= 0) {
+ c = 32 - pdch->num_reserved(GPRS_RLCMAC_UL_TBF);
+ c = OSMO_MAX(c, 1);
+ capacity += c;
+ }
+ }
+ }
+
+#ifdef ENABLE_TS_ALLOC_DEBUG
+ snprintf(slot_info, 9, OSMO_BIT_SPEC, OSMO_BIT_PRINT_EX(rx_bad, 'x'));
+ masked_override_with(slot_info, rx_window, 'D');
+ masked_override_with(slot_info, tx_window, 'U');
+ masked_override_with(slot_info, rx_window& tx_window, 'C');
+ LOGP(DRLCMAC, LOGL_DEBUG,
+ "- Considering DL/UL slots: (TS=0)\"%s\"(TS=7), "
+ "capacity = %d\n",
+ slot_info, capacity);
+#endif
+
+ if (capacity <= max_capacity)
+ continue;
+
+ max_capacity = capacity;
+ max_ul_slots = tx_window;
+ max_dl_slots = rx_window;
}
}
}
-
-#ifdef ENABLE_TS_ALLOC_DEBUG
- snprintf(slot_info, 9, OSMO_BIT_SPEC, OSMO_BIT_PRINT_EX(rx_bad, 'x'));
- masked_override_with(slot_info, rx_window, 'D');
- masked_override_with(slot_info, tx_window, 'U');
- masked_override_with(slot_info, rx_window& tx_window, 'C');
- LOGP(DRLCMAC, LOGL_DEBUG,
- "- Considering DL/UL slots: (TS=0)\"%s\"(TS=7), "
- "capacity = %d\n",
- slot_info, capacity);
-#endif
-
- if (capacity <= max_capacity)
- continue;
-
- max_capacity = capacity;
- max_ul_slots = tx_window;
- max_dl_slots = rx_window;
- }}}}
+ }
if (!max_ul_slots || !max_dl_slots) {
LOGP(DRLCMAC, LOGL_NOTICE,
--
To view, visit https://gerrit.osmocom.org/3914
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I50b59b12e8d938bd96f9b29d00a649cd3e77bc5e
Gerrit-PatchSet: 2
Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder