[PATCH] osmo-pcu[master]: Simplify TS alloc: move slot check into function

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.org
Wed Sep 13 17:49:53 UTC 2017


Review at  https://gerrit.osmocom.org/3935

Simplify TS alloc: move slot check into function

Move timeslot applicability check outside of nested for loop into
separate function and document it.

Change-Id: Ic39e848da47dc11357782362fdf6206d2c1457c2
Related: OS#2282
---
M src/gprs_rlcmac_ts_alloc.cpp
1 file changed, 116 insertions(+), 107 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/35/3935/1

diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp
index f654ffa..cb790f7 100644
--- a/src/gprs_rlcmac_ts_alloc.cpp
+++ b/src/gprs_rlcmac_ts_alloc.cpp
@@ -527,6 +527,119 @@
 	return capacity;
 }
 
+enum { MASK_TT, MASK_TR };
+
+static bool skip_slot(const struct gprs_rlcmac_trx *trx, const struct gprs_ms_multislot_class *ms_class,
+		      uint8_t *rx_mask, unsigned mask_sel, unsigned ul_ts, int *capacity, uint32_t *checked_rx,
+		      uint8_t dl_slots, uint8_t ul_slots, int *rx_window, int tx_window, uint16_t rx_valid_win,
+		      unsigned tx_slot_count, bool enable_debug)
+{
+	char slot_info[9] = { 0 };
+	unsigned common_slot_count;
+	unsigned req_common_slots;
+	unsigned rx_slot_count;
+	uint8_t rx_good;
+
+	/* Filter out bad slots */
+	uint16_t 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 */
+
+	*rx_window = rx_good & rx_valid_win;
+	rx_slot_count = pcu_bitcount(*rx_window);
+
+	if (enable_debug)
+		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);
+
+	/* 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)
+				return true; /* Skip Tta */
+		} else if (slot_sum > 6 && tx_slot_count < 3) {
+			if (mask_sel != MASK_TT)
+				return true; /* Skip Tra */
+		} else {
+			/* No supported row in TS 45.002, table 6.4.2.2.1. */
+			if (enable_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);
+			}
+
+			return true;
+		}
+	}
+
+	/* Avoid repeated RX combination check */
+	if (test_and_set_bit(checked_rx, *rx_window))
+		return true;
+
+	if (!rx_good) {
+		if (enable_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);
+		}
+
+		return true;
+	}
+
+	if (!(*rx_window))
+		return true;
+
+	/* 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 (enable_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);
+		}
+
+		return true;
+	}
+
+	/* Compute capacity */
+	*capacity = compute_capacity(trx, *rx_window, tx_window);
+
+	if (enable_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);
+	}
+
+	return false;
+}
+
 /*! Find set of slots available for allocation while taking MS class into account
  *
  *  \param[in] trx Pointer to TRX object
@@ -553,7 +666,6 @@
 
 	unsigned ul_ts, dl_ts;
 	unsigned num_tx;
-	enum {MASK_TT, MASK_TR};
 	unsigned mask_sel;
 
 	if (ms->ms_class() >= 32) {
@@ -678,115 +790,12 @@
 
 				/* 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;
 					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;
-
-					/* TODO: CHECK this calculation -> separate function for unit testing */
-
-					rx_window = rx_good & rx_valid_win;
-					rx_slot_count = pcu_bitcount(rx_window);
-
-					if (enable_debug)
-						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);
-
-					/* 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. */
-							if (enable_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);
-							}
-							continue;
-						}
-					}
-
-					/* Avoid repeated RX combination check */
-					if (test_and_set_bit(checked_rx, rx_window))
+					if (skip_slot(trx, ms_class, rx_mask, mask_sel, ul_ts, &capacity, checked_rx,
+						      *dl_slots, *ul_slots, &rx_window, tx_window, rx_valid_win,
+						      tx_slot_count, enable_debug))
 						continue;
-
-					if (!rx_good) {
-						if (enable_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);
-						}
-						continue;
-					}
-
-					if (!rx_window)
-						continue;
-
-					/* 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 (enable_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);
-						}
-						continue;
-					}
-
-					/* Compute capacity */
-					capacity = compute_capacity(trx, rx_window, tx_window);
-
-					if (enable_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);
-					}
 
 					if (capacity <= max_capacity)
 						continue;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic39e848da47dc11357782362fdf6206d2c1457c2
Gerrit-PatchSet: 1
Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>



More information about the gerrit-log mailing list