[PATCH] osmo-pcu[master]: Move DL scheduling and RTS handler to trx level

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
Fri Jul 7 09:41:17 UTC 2017


Hello Jenkins Builder,

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

    https://gerrit.osmocom.org/3150

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

Move DL scheduling and RTS handler to trx level

Use TRX object directly instead of BTS singleton and trx_no. This is
necessary to facilitate the move of UL/DL TBF lists to TRX level.

Change-Id: Ia176245647c19fa1551fb6f5c8225b2529f73cbf
Related: OS#1541
---
M src/bts.cpp
M src/bts.h
M src/gprs_rlcmac.h
M src/gprs_rlcmac_sched.cpp
M src/pcu_l1_if.cpp
M src/tbf.cpp
M src/tbf.h
M tests/tbf/TbfTest.cpp
8 files changed, 55 insertions(+), 65 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/50/3150/2

diff --git a/src/bts.cpp b/src/bts.cpp
index 1d27284..e66699f 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -1425,8 +1425,7 @@
 			egprs_ms_class, tlli, ta, ms);
 
 		if (!ul_tbf) {
-			handle_tbf_reject(bts_data(), ms, tlli,
-				trx_no(), ts_no);
+			handle_tbf_reject(get_trx(), ms, tlli, ts_no);
 			return;
 		}
 
diff --git a/src/bts.h b/src/bts.h
index 78ed002..7983fa2 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -76,7 +76,7 @@
 	gprs_rlcmac_bts *bts_data() const;
 	BTS *bts() const;
 	uint8_t trx_no() const;
-
+	gprs_rlcmac_trx *get_trx();
 	struct gprs_rlcmac_ul_tbf *ul_tbf_by_tfi(uint8_t tfi);
 	struct gprs_rlcmac_dl_tbf *dl_tbf_by_tfi(uint8_t tfi);
 
@@ -671,6 +671,11 @@
 	return trx->bts->bts_data();
 }
 
+inline gprs_rlcmac_trx *gprs_rlcmac_pdch::get_trx()
+{
+	return trx;
+}
+
 inline uint8_t gprs_rlcmac_pdch::trx_no() const
 {
 	return trx->trx_no;
diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h
index be1e686..3d825a8 100644
--- a/src/gprs_rlcmac.h
+++ b/src/gprs_rlcmac.h
@@ -89,9 +89,7 @@
 int gprs_rlcmac_paging_request(uint8_t *ptmsi, uint16_t ptmsi_len,
 	const char *imsi);
 
-int gprs_rlcmac_rcv_rts_block(struct gprs_rlcmac_bts *bts,
-	uint8_t trx, uint8_t ts,
-        uint32_t fn, uint8_t block_nr);
+int gprs_rlcmac_rcv_rts_block(struct gprs_rlcmac_trx *trx, uint8_t ts, uint32_t fn, uint8_t block_nr);
 
 int gprs_alloc_max_dl_slots_per_ms(struct gprs_rlcmac_bts *bts,
 	uint8_t ms_class = 0);
diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp
index a21c023..a8392cb 100644
--- a/src/gprs_rlcmac_sched.cpp
+++ b/src/gprs_rlcmac_sched.cpp
@@ -25,12 +25,10 @@
 
 #include "pcu_utils.h"
 
-static uint32_t sched_poll(BTS *bts,
-		    uint8_t trx, uint8_t ts, uint32_t fn, uint8_t block_nr,
-		    struct gprs_rlcmac_tbf **poll_tbf,
-		    struct gprs_rlcmac_tbf **ul_ass_tbf,
-		    struct gprs_rlcmac_tbf **dl_ass_tbf,
-		    struct gprs_rlcmac_ul_tbf **ul_ack_tbf)
+static uint32_t sched_poll(struct gprs_rlcmac_trx *trx, uint8_t ts, uint32_t fn, uint8_t block_nr,
+			   struct gprs_rlcmac_tbf **poll_tbf,
+			   struct gprs_rlcmac_tbf **ul_ass_tbf, struct gprs_rlcmac_tbf **dl_ass_tbf,
+			   struct gprs_rlcmac_ul_tbf **ul_ack_tbf)
 {
 	struct gprs_rlcmac_ul_tbf *ul_tbf;
 	struct gprs_rlcmac_dl_tbf *dl_tbf;
@@ -42,11 +40,11 @@
 	if ((block_nr % 3) == 2)
 		poll_fn ++;
 	poll_fn = poll_fn % GSM_MAX_FN;
-	llist_for_each(pos, &bts->ul_tbfs()) {
+	llist_for_each(pos, &trx->bts->ul_tbfs()) {
 		ul_tbf = as_ul_tbf(pos->entry());
 		OSMO_ASSERT(ul_tbf);
 		/* this trx, this ts */
-		if (ul_tbf->trx->trx_no != trx || !ul_tbf->is_control_ts(ts))
+		if (ul_tbf->trx->trx_no != trx->trx_no || !ul_tbf->is_control_ts(ts))
 			continue;
 		/* polling for next uplink block */
 		if (ul_tbf->poll_state == GPRS_RLCMAC_POLL_SCHED
@@ -62,11 +60,11 @@
 			*ul_ass_tbf = ul_tbf;
 #warning "Is this supposed to be fair? The last TBF for each wins? Maybe use llist_add_tail and skip once we have all states?"
 	}
-	llist_for_each(pos, &bts->dl_tbfs()) {
+	llist_for_each(pos, &trx->bts->dl_tbfs()) {
 		dl_tbf = as_dl_tbf(pos->entry());
 		OSMO_ASSERT(dl_tbf);
 		/* this trx, this ts */
-		if (dl_tbf->trx->trx_no != trx || !dl_tbf->is_control_ts(ts))
+		if (dl_tbf->trx->trx_no != trx->trx_no || !dl_tbf->is_control_ts(ts))
 			continue;
 		/* polling for next uplink block */
 		if (dl_tbf->poll_state == GPRS_RLCMAC_POLL_SCHED
@@ -206,9 +204,8 @@
 	return NULL;
 }
 
-static struct msgb *sched_select_downlink(struct gprs_rlcmac_bts *bts,
-		    uint8_t trx, uint8_t ts, uint32_t fn,
-		    uint8_t block_nr, struct gprs_rlcmac_pdch *pdch)
+static struct msgb *sched_select_downlink(struct gprs_rlcmac_trx *trx, uint8_t ts, uint32_t fn, uint8_t block_nr,
+					  struct gprs_rlcmac_pdch *pdch)
 {
 	struct msgb *msg = NULL;
 	struct gprs_rlcmac_dl_tbf *tbf, *prio_tbf = NULL;
@@ -225,7 +222,7 @@
 	int age;
 	const int age_thresh1 = msecs_to_frames(200);
 	const int high_prio_msecs =
-		OSMO_MIN(BTS::TIMER_T3190_MSEC/2, bts->dl_tbf_idle_msec);
+		OSMO_MIN(BTS::TIMER_T3190_MSEC/2, trx->bts->bts_data()->dl_tbf_idle_msec);
 	const int age_thresh2 = msecs_to_frames(high_prio_msecs);
 
 	/* select downlink resource */
@@ -277,7 +274,7 @@
 	if (prio_tbf) {
 		LOGP(DRLCMACSCHED, LOGL_DEBUG, "Scheduling data message at "
 			"RTS for DL TFI=%d (TRX=%d, TS=%d) prio=%d\n",
-			prio_tfi, trx, ts, max_prio);
+			prio_tfi, trx->trx_no, ts, max_prio);
 		/* next TBF to handle resource is the next one */
 		pdch->next_dl_tfi = (prio_tfi + 1) & 31;
 		/* generate DL data block */
@@ -307,9 +304,7 @@
 	return msg;
 }
 
-int gprs_rlcmac_rcv_rts_block(struct gprs_rlcmac_bts *bts,
-	uint8_t trx, uint8_t ts,
-        uint32_t fn, uint8_t block_nr)
+int gprs_rlcmac_rcv_rts_block(struct gprs_rlcmac_trx *trx, uint8_t ts, uint32_t fn, uint8_t block_nr)
 {
 	struct gprs_rlcmac_pdch *pdch;
 	struct gprs_rlcmac_tbf *poll_tbf = NULL, *dl_ass_tbf = NULL,
@@ -319,51 +314,49 @@
 	struct msgb *msg = NULL;
 	uint32_t poll_fn, sba_fn;
 
-	if (trx >= 8 || ts >= 8)
+	if (trx->trx_no >= 8 || ts >= 8)
 		return -EINVAL;
-	pdch = &bts->trx[trx].pdch[ts];
+	pdch = &trx->pdch[ts];
 
 	if (!pdch->is_enabled()) {
 		LOGP(DRLCMACSCHED, LOGL_ERROR, "Received RTS on disabled PDCH: "
-			"TRX=%d TS=%d\n", trx, ts);
+			"TRX=%d TS=%d\n", trx->trx_no, ts);
 		return -EIO;
 	}
 
 	/* store last frame number of RTS */
 	pdch->last_rts_fn = fn;
 
-	poll_fn = sched_poll(bts->bts, trx, ts, fn, block_nr, &poll_tbf, &ul_ass_tbf,
-		&dl_ass_tbf, &ul_ack_tbf);
+	poll_fn = sched_poll(trx, ts, fn, block_nr, &poll_tbf, &ul_ass_tbf, &dl_ass_tbf, &ul_ack_tbf);
 	/* check uplink resource for polling */
 	if (poll_tbf)
 		LOGP(DRLCMACSCHED, LOGL_DEBUG, "Received RTS for PDCH: TRX=%d "
 			"TS=%d FN=%d block_nr=%d scheduling free USF for "
-			"polling at FN=%d of %s\n", trx, ts, fn,
+			"polling at FN=%d of %s\n", trx->trx_no, ts, fn,
 			block_nr, poll_fn,
 			tbf_name(poll_tbf));
 		/* use free USF */
 	/* else. check for sba */
-	else if ((sba_fn = bts->bts->sba()->sched(trx, ts, fn, block_nr) != 0xffffffff))
+	else if ((sba_fn = trx->bts->sba()->sched(trx->trx_no, ts, fn, block_nr) != 0xffffffff))
 		LOGP(DRLCMACSCHED, LOGL_DEBUG, "Received RTS for PDCH: TRX=%d "
 			"TS=%d FN=%d block_nr=%d scheduling free USF for "
-			"single block allocation at FN=%d\n", trx, ts, fn,
+			"single block allocation at FN=%d\n", trx->trx_no, ts, fn,
 			block_nr, sba_fn);
 		/* use free USF */
 	/* else, we search for uplink resource */
 	else
-		usf = sched_select_uplink(trx, ts, fn, block_nr, pdch);
+		usf = sched_select_uplink(trx->trx_no, ts, fn, block_nr, pdch);
 
 	/* Prio 1: select control message */
-	msg = sched_select_ctrl_msg(trx, ts, fn, block_nr, pdch, ul_ass_tbf,
-		dl_ass_tbf, ul_ack_tbf);
+	msg = sched_select_ctrl_msg(trx->trx_no, ts, fn, block_nr, pdch, ul_ass_tbf, dl_ass_tbf, ul_ack_tbf);
 	if (msg)
-		bts->bts->rlc_sent_control();
+		trx->bts->rlc_sent_control();
 
 	/* Prio 2: select data message for downlink */
 	if (!msg) {
-		msg = sched_select_downlink(bts, trx, ts, fn, block_nr, pdch);
+		msg = sched_select_downlink(trx, ts, fn, block_nr, pdch);
 		if (msg)
-			bts->bts->rlc_sent();
+			trx->bts->rlc_sent();
 	}
 
 	/* Prio 3: send dummy contol message */
@@ -371,13 +364,13 @@
 		/* increase counter */
 		msg = sched_dummy();
 		if (msg)
-			bts->bts->rlc_sent_dummy();
+			trx->bts->rlc_sent_dummy();
 	}
 
 	if (!msg)
 		return -ENOMEM;
 	/* msg is now available */
-	bts->bts->rlc_dl_bytes(msg->data_len);
+	trx->bts->rlc_dl_bytes(msg->data_len);
 
 	/* set USF */
 	OSMO_ASSERT(msgb_length(msg) > 0);
@@ -387,7 +380,7 @@
 	gprs_bssgp_update_frames_sent();
 
 	/* send PDTCH/PACCH to L1 */
-	pcu_l1if_tx_pdtch(msg, trx, ts, bts->trx[trx].arfcn, fn, block_nr);
+	pcu_l1if_tx_pdtch(msg, trx->trx_no, ts, trx->arfcn, fn, block_nr);
 
 	return 0;
 }
diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index c2c6cc6..c3b4a49 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -308,11 +308,13 @@
 }
 
 // FIXME: remove this, when changed from c++ to c.
-extern "C" int pcu_rx_rts_req_pdtch(uint8_t trx, uint8_t ts,
+extern "C" int pcu_rx_rts_req_pdtch(uint8_t trx_no, uint8_t ts,
 	uint32_t fn, uint8_t block_nr)
 {
-	return gprs_rlcmac_rcv_rts_block(bts_main_data(),
-					trx, ts, fn, block_nr);
+	struct gprs_rlcmac_bts *bts = bts_main_data();
+	struct gprs_rlcmac_trx *trx = &bts->trx[trx_no];
+
+	return gprs_rlcmac_rcv_rts_block(trx, ts, fn, block_nr);
 }
 
 static int pcu_rx_rts_req(struct gsm_pcu_if_rts_req *rts_req)
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 48e8289..2e7c65b 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -1407,24 +1407,22 @@
 	return ts == control_ts;
 }
 
-struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts,
-			GprsMs *ms, uint32_t tlli, uint8_t trx_no, uint8_t ts)
+struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_trx *trx, GprsMs *ms, uint32_t tlli, uint8_t ts)
 {
 	struct gprs_rlcmac_ul_tbf *ul_tbf = NULL;
-	struct gprs_rlcmac_trx *trx = &bts->trx[trx_no];
 
 	ul_tbf = talloc(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
 	if (!ul_tbf)
 		return ul_tbf;
 
 	talloc_set_destructor(ul_tbf, ul_tbf_dtor);
-	new (ul_tbf) gprs_rlcmac_ul_tbf(bts->bts);
+	new (ul_tbf) gprs_rlcmac_ul_tbf(trx->bts);
 	if (!ms)
-		ms = bts->bts->ms_alloc(0, 0);
+		ms = trx->bts->ms_alloc(0, 0);
 
 	ms->set_tlli(tlli);
 
-	llist_add(&ul_tbf->list(), &bts->bts->ul_tbfs());
+	llist_add(&ul_tbf->list(), &trx->bts->ul_tbfs());
 	ul_tbf->bts->tbf_ul_created();
 	ul_tbf->set_state(GPRS_RLCMAC_ASSIGN);
 	ul_tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH);
diff --git a/src/tbf.h b/src/tbf.h
index 09e3122..ee9648a 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -317,8 +317,7 @@
 
 void tbf_free(struct gprs_rlcmac_tbf *tbf);
 
-struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts,
-	GprsMs *ms, uint32_t tlli, uint8_t trx_no, uint8_t ts_no);
+struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_trx *trx, GprsMs *ms, uint32_t tlli, uint8_t ts_no);
 
 int tbf_assign_control_ts(struct gprs_rlcmac_tbf *tbf);
 
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp
index 0db7fde..886856a 100644
--- a/tests/tbf/TbfTest.cpp
+++ b/tests/tbf/TbfTest.cpp
@@ -203,7 +203,8 @@
 	uint32_t *fn, uint8_t *block_nr = NULL)
 {
 	uint8_t bn = fn2bn(*fn);
-	gprs_rlcmac_rcv_rts_block(bts, trx_no, ts_no, *fn, bn);
+	struct gprs_rlcmac_trx *trx = &bts->trx[trx_no];
+	gprs_rlcmac_rcv_rts_block(trx, ts_no, *fn, bn);
 	*fn = fn_add_blocks(*fn, 1);
 	bn += 1;
 	if (block_nr)
@@ -1651,9 +1652,8 @@
 		for (ts_no = 0 ; ts_no < 8; ts_no += 1) {
 			if (!(slots & (1 << ts_no)))
 				continue;
-			gprs_rlcmac_rcv_rts_block(the_bts->bts_data(),
-				dl_tbf->trx->trx_no, ts_no,
-				*fn, bn);
+			struct gprs_rlcmac_trx *trx = &the_bts->bts_data()->trx[dl_tbf->trx->trx_no];
+			gprs_rlcmac_rcv_rts_block(trx, ts_no, *fn, bn);
 		}
 		*fn = fn_add_blocks(*fn, 1);
 	}
@@ -3222,17 +3222,14 @@
 	setup_bts(&the_bts, ts_no, 4);
 
 	int rc = 0;
-
-	ul_tbf = handle_tbf_reject(the_bts.bts_data(), NULL, tlli,
-				trx_no, ts_no);
+	struct gprs_rlcmac_trx *trx = &the_bts.bts_data()->trx[trx_no];
+	ul_tbf = handle_tbf_reject(trx, NULL, tlli, ts_no);
 
 	OSMO_ASSERT(ul_tbf != 0);
 
 	/* trigger packet access reject */
 	uint8_t bn = fn2bn(fn);
-
-	rc = gprs_rlcmac_rcv_rts_block(the_bts.bts_data(),
-		trx_no, ts_no, fn, bn);
+	rc = gprs_rlcmac_rcv_rts_block(trx, ts_no, fn, bn);
 
 	OSMO_ASSERT(rc == 0);
 
@@ -3307,9 +3304,8 @@
 
 	/* trigger packet access reject */
 	uint8_t bn = fn2bn(fn);
-
-	rc = gprs_rlcmac_rcv_rts_block(the_bts.bts_data(),
-		trx_no, ts_no, fn, bn);
+	struct gprs_rlcmac_trx *trx = &the_bts.bts_data()->trx[trx_no];
+	rc = gprs_rlcmac_rcv_rts_block(trx, ts_no, fn, bn);
 
 	OSMO_ASSERT(rc == 0);
 

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

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: Ia176245647c19fa1551fb6f5c8225b2529f73cbf
Gerrit-PatchSet: 2
Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list