Change in osmo-pcu[master]: Indicate to the BTS whether DATA.req contains a dummy block

fixeria gerrit-no-reply at lists.osmocom.org
Tue Jul 6 01:29:47 UTC 2021


fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-pcu/+/24854 )


Change subject: Indicate to the BTS whether DATA.req contains a dummy block
......................................................................

Indicate to the BTS whether DATA.req contains a dummy block

This will allow the BTS to decide whether transmission of a given
DATA.req can be avoided on non-BCCH carriers for the purpose of energy
saving.  The idea is simple: if a PDCH timeslot has no Uplink nor
Downlink TBFs allocated, then (most likely) nobody is listening to it.

Add a new field 'flags' to DATA.req message, and use the first LSB bit
to indicate that it contains a potentially ignorable RLC/MAC block.

Given that INFO.ind is currently the longest possible message, we
can easily add new fields to shorter messages like DATA.{ind,req}.

Change-Id: I72c7f0f0853f2bda77c20e3ec1bcd0c7c815c750
Related: SYS#4919, OS#4772
---
M include/osmocom/pcu/pcuif_proto.h
M src/gprs_rlcmac_sched.cpp
M src/pcu_l1_if.cpp
M src/pcu_l1_if.h
4 files changed, 32 insertions(+), 12 deletions(-)



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

diff --git a/include/osmocom/pcu/pcuif_proto.h b/include/osmocom/pcu/pcuif_proto.h
index 23b7a2c..caa52bb 100644
--- a/include/osmocom/pcu/pcuif_proto.h
+++ b/include/osmocom/pcu/pcuif_proto.h
@@ -70,6 +70,9 @@
 	char		text[TXT_MAX_LEN]; /* Text to be transmitted to BTS */
 } __attribute__ ((packed));
 
+/* Indicates that the PDU contains a dummy RLC/MAC block */
+#define PCU_IF_DATA_F_DUMMY		(1 << 0)
+
 struct gsm_pcu_if_data {
 	uint8_t		sapi;
 	uint8_t		len;
@@ -83,6 +86,7 @@
 	uint16_t	ber10k;		/* !< \brief BER in units of 0.01% */
 	int16_t		ta_offs_qbits;	/* !< \brief Burst TA Offset in quarter bits */
 	int16_t		lqual_cb;	/* !< \brief Link quality in centiBel */
+	uint8_t		flags;		/* !< \brief See PCU_IF_DATA_F_* above */
 } __attribute__ ((packed));
 
 /* data confirmation with direct tlli (instead of raw mac block with tlli) */
diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp
index 2adf1f3..c99c45b 100644
--- a/src/gprs_rlcmac_sched.cpp
+++ b/src/gprs_rlcmac_sched.cpp
@@ -421,6 +421,7 @@
 	bool tx_is_egprs = false;
 	bool require_gprs_only;
 	enum mcs_kind req_mcs_kind; /* Restrict CS/MCS if DL Data block is to be sent */
+	uint8_t flags = 0x00;
 
 	if (trx >= 8 || ts >= 8)
 		return -EINVAL;
@@ -495,6 +496,12 @@
 	else if ((msg = sched_dummy())) {
 		/* increase counter */
 		gsmtap_cat = PCU_GSMTAP_C_DL_DUMMY;
+
+		/* the BTS can potentially suspend transmission of this block */
+		const unsigned num_tbfs = pdch->num_tbfs(GPRS_RLCMAC_DL_TBF)
+					+ pdch->num_tbfs(GPRS_RLCMAC_UL_TBF);
+		if (num_tbfs == 0 && usf_tbf == NULL)
+			flags |= PCU_IF_DATA_F_DUMMY;
 	} else {
 		return -ENOMEM;
 	}
@@ -520,7 +527,7 @@
 	tap_n_acc(msg, bts, trx, ts, fn, gsmtap_cat);
 
 	/* send PDTCH/PACCH to L1 */
-	pcu_l1if_tx_pdtch(msg, bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr);
+	pcu_l1if_tx_pdtch(msg, bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr, flags);
 
 	return 0;
 }
diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index 5aa8849..0432923 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -170,8 +170,7 @@
 }
 
 static int pcu_tx_data_req(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts, uint8_t sapi,
-	uint16_t arfcn, uint32_t fn, uint8_t block_nr, uint8_t *data,
-	uint8_t len)
+	uint16_t arfcn, uint32_t fn, uint8_t block_nr, uint8_t *data, uint8_t len, uint8_t flags)
 {
 	struct msgb *msg;
 	struct gsm_pcu_if *pcu_prim;
@@ -196,12 +195,13 @@
 	data_req->block_nr = block_nr;
 	memcpy(data_req->data, data, len);
 	data_req->len = len;
+	data_req->flags = flags;
 
 	return pcu_sock_send(msg);
 }
 
 void pcu_l1if_tx_pdtch(msgb *msg, struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts, uint16_t arfcn,
-	uint32_t fn, uint8_t block_nr)
+		       uint32_t fn, uint8_t block_nr, uint8_t flags)
 {
 #ifdef ENABLE_DIRECT_PHY
 	if (bts->trx[trx].fl1h) {
@@ -212,14 +212,15 @@
 	}
 #endif
 	pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PDTCH, arfcn, fn, block_nr,
-			msg->data, msg->len);
+			msg->data, msg->len, flags);
 	msgb_free(msg);
 }
 
 void pcu_l1if_tx_ptcch(struct gprs_rlcmac_bts *bts,
 		       uint8_t trx, uint8_t ts, uint16_t arfcn,
 		       uint32_t fn, uint8_t block_nr,
-		       uint8_t *data, size_t data_len)
+		       uint8_t *data, size_t data_len,
+		       uint8_t flags)
 {
 	if (the_pcu->gsmtap_categ_mask & (1 << PCU_GSMTAP_C_DL_PTCCH))
 		gsmtap_send(the_pcu->gsmtap, arfcn, ts, GSMTAP_CHANNEL_PTCCH, 0, fn, 0, 0, data, data_len);
@@ -229,7 +230,7 @@
 		return;
 	}
 #endif
-	pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PTCCH, arfcn, fn, block_nr, data, data_len);
+	pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PTCCH, arfcn, fn, block_nr, data, data_len, flags);
 }
 
 void pcu_l1if_tx_agch(struct gprs_rlcmac_bts *bts, bitvec * block, int plen)
@@ -243,7 +244,7 @@
 	if (the_pcu->gsmtap_categ_mask & (1 << PCU_GSMTAP_C_DL_AGCH))
 		gsmtap_send(the_pcu->gsmtap, 0, 0, GSMTAP_CHANNEL_AGCH, 0, 0, 0, 0, data, GSM_MACBLOCK_LEN);
 
-	pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, GSM_MACBLOCK_LEN);
+	pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, GSM_MACBLOCK_LEN, 0x00);
 }
 
 void pcu_l1if_tx_pch(struct gprs_rlcmac_bts *bts, bitvec * block, int plen, uint16_t pgroup)
@@ -268,7 +269,7 @@
 	if (the_pcu->gsmtap_categ_mask & (1 << PCU_GSMTAP_C_DL_PCH))
 		gsmtap_send(the_pcu->gsmtap, 0, 0, GSMTAP_CHANNEL_PCH, 0, 0, 0, 0, data + 3, GSM_MACBLOCK_LEN);
 
-	pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_PCH, 0, 0, 0, data, PAGING_GROUP_LEN + GSM_MACBLOCK_LEN);
+	pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_PCH, 0, 0, 0, data, PAGING_GROUP_LEN + GSM_MACBLOCK_LEN, 0x00);
 }
 
 void pcu_rx_block_time(struct gprs_rlcmac_bts *bts, uint16_t arfcn, uint32_t fn, uint8_t ts_no)
@@ -471,6 +472,7 @@
 	uint32_t fn, uint8_t block_nr)
 {
 	struct gprs_rlcmac_pdch *pdch;
+	uint8_t flags = 0x00;
 
 	/* Prevent buffer overflow */
 	if (trx >= ARRAY_SIZE(bts->trx) || ts >= 8)
@@ -481,8 +483,14 @@
 	if (!pdch->m_is_enabled)
 		return -EAGAIN;
 
+	/* determine if the BTS can suspend transmission of this block */
+	const unsigned num_tbfs = pdch->num_tbfs(GPRS_RLCMAC_DL_TBF)
+				+ pdch->num_tbfs(GPRS_RLCMAC_UL_TBF);
+	if (num_tbfs == 0)
+		flags |= PCU_IF_DATA_F_DUMMY;
+
 	pcu_l1if_tx_ptcch(bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr,
-			  pdch->ptcch_msg, GSM_MACBLOCK_LEN);
+			  pdch->ptcch_msg, GSM_MACBLOCK_LEN, flags);
 	return 0;
 }
 
diff --git a/src/pcu_l1_if.h b/src/pcu_l1_if.h
index 2a4f0ea..26e092e 100644
--- a/src/pcu_l1_if.h
+++ b/src/pcu_l1_if.h
@@ -145,11 +145,12 @@
 #ifdef __cplusplus
 struct gprs_rlcmac_bts;
 void pcu_l1if_tx_pdtch(msgb *msg, struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts,
-		       uint16_t arfcn, uint32_t fn, uint8_t block_nr);
+		       uint16_t arfcn, uint32_t fn, uint8_t block_nr, uint8_t flags);
 void pcu_l1if_tx_ptcch(struct gprs_rlcmac_bts *bts,
 		       uint8_t trx, uint8_t ts, uint16_t arfcn,
 		       uint32_t fn, uint8_t block_nr,
-		       uint8_t *data, size_t data_len);
+		       uint8_t *data, size_t data_len,
+		       uint8_t flags);
 void pcu_l1if_tx_agch(struct gprs_rlcmac_bts *bts, bitvec * block, int len);
 
 void pcu_l1if_tx_pch(struct gprs_rlcmac_bts *bts, bitvec * block, int plen, uint16_t pgroup);

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-pcu/+/24854
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Change-Id: I72c7f0f0853f2bda77c20e3ec1bcd0c7c815c750
Gerrit-Change-Number: 24854
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210706/0db242ec/attachment.htm>


More information about the gerrit-log mailing list