[PATCH] osmo-pcu[master]: Handle packet assignement reject during EPDAN with channel d...

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/.

arvind.sirsikar gerrit-no-reply at lists.osmocom.org
Tue Nov 8 11:07:54 UTC 2016


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

Handle packet assignement reject during EPDAN with channel description

When EPDAN with channel description is received, PCU will generate the
packet access reject if no resources are present. The encoding is done
based on section 7.1.3.2.1 and 8.1.2.5 of 44.060 version 7.27.0 Release 7.
This patch also includes the test case to validate the generated
packet access reject message.

This patch is integration tested on Osmo-trx setup with Ettus B210 board
and LG F70 MS with some simulation code changes in Osmo-pcu.

Change-Id: I096a3bb44a65533b9e9b091925dd5f70a8696d61
---
M src/bts.cpp
M src/bts.h
M src/encoding.cpp
M src/encoding.h
M src/gprs_rlcmac_sched.cpp
M src/tbf.cpp
M src/tbf.h
M tests/tbf/TbfTest.cpp
M tests/tbf/TbfTest.err
M tests/tbf/TbfTest.ok
10 files changed, 142 insertions(+), 14 deletions(-)


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

diff --git a/src/bts.cpp b/src/bts.cpp
index 4aa5c2c..174c1dd 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -1054,16 +1054,24 @@
 	}
 	/* check for channel request */
 	if (ack_nack->Exist_Channel_Request_Description) {
-		LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF in ack "
-			"message, so we provide one:\n");
 
 		/* This call will register the new TBF with the MS on success */
-		tbf_alloc_ul(bts_data(), tbf->trx->trx_no,
+		gprs_rlcmac_ul_tbf *ul_tbf = tbf_alloc_ul(bts_data(),
+			tbf->trx->trx_no,
 			tbf->ms_class(), tbf->ms()->egprs_ms_class(),
 			tbf->tlli(), tbf->ta(), tbf->ms());
 
-		/* schedule uplink assignment */
-		tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS;
+		/* schedule uplink assignment or reject*/
+		if(ul_tbf == NULL) {
+			LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF in ack "
+				"message, so we pacekt access reject:\n");
+			tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ;
+		}
+		else {
+			LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF in ack "
+				"message, so we provide one:\n");
+			tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS;
+		}
 	}
 	/* get measurements */
 	if (tbf->ms()) {
@@ -1156,16 +1164,23 @@
 
 	/* check for channel request */
 	if (ack_nack->Exist_ChannelRequestDescription) {
-		LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF in ack "
-			"message, so we provide one:\n");
 
 		/* This call will register the new TBF with the MS on success */
-		tbf_alloc_ul(bts_data(), tbf->trx->trx_no,
+		gprs_rlcmac_ul_tbf *ul_tbf = tbf_alloc_ul(bts_data(), tbf->trx->trx_no,
 			tbf->ms_class(), tbf->ms()->egprs_ms_class(),
 			tbf->tlli(), tbf->ta(), tbf->ms());
 
-		/* schedule uplink assignment */
-		tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS;
+		/* schedule uplink assignment or reject*/
+		if(ul_tbf == NULL) {
+			LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF in ack "
+				"message, so we send packet access reject:\n");
+			tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ;
+		}
+		else {
+			LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF in ack "
+				"message, so we provide one:\n");
+			tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS;
+		}
 	}
 
 	/* get measurements */
@@ -1248,14 +1263,20 @@
 				egprs_ms_class);
 		ul_tbf = tbf_alloc_ul(bts_data(), trx_no(), ms_class,
 			egprs_ms_class, tlli, ta, ms);
-		if (!ul_tbf)
+		if (!ul_tbf) {
+#if 0
+			bts()->send_packet_access_reject(tlli, true, 0 ,0,fn,0);
+#endif
+			ul_tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ;
 			return;
+		}
+
+		ul_tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS;
 
 		/* set control ts to current MS's TS, until assignment complete */
 		LOGP(DRLCMAC, LOGL_DEBUG, "Change control TS to %d until assinment is complete.\n", ts_no);
 		ul_tbf->control_ts = ts_no;
 		/* schedule uplink assignment */
-		ul_tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS;
 
 		/* get capabilities */
 		if (ul_tbf->ms())
diff --git a/src/bts.h b/src/bts.h
index 8bea371..1bce185 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -304,6 +304,10 @@
 	int rcv_rach(uint16_t ra, uint32_t Fn, int16_t qta, uint8_t is_11bit,
 		enum ph_burst_type burst_type);
 
+	void send_packet_access_reject(uint32_t tlli, bool tlli_present,
+				bool packet_reference_present,
+				bool packet_reference, uint32_t fn, uint8_t tfi);
+
 	void trigger_dl_ass(gprs_rlcmac_dl_tbf *tbf, gprs_rlcmac_tbf *old_tbf);
 	void snd_dl_ass(gprs_rlcmac_tbf *tbf, uint8_t poll, const char *imsi);
 
diff --git a/src/encoding.cpp b/src/encoding.cpp
index 7d3fa14..d4ce8ba 100644
--- a/src/encoding.cpp
+++ b/src/encoding.cpp
@@ -681,6 +681,29 @@
 	}
 }
 
+/*
+ * Refer 44.060 version 7.27.0 Release 7
+ * section 7.1.3.2.1 On receipt of a PACKET RESOURCE REQUEST message
+ * 8.1.2.5 Establishment of uplink TBF
+ */
+void Encoding::write_packet_access_reject(
+        bitvec * dest, uint32_t tlli)
+{
+	unsigned wp = 0;
+	bitvec_write_field(dest, wp, 0x1, 2);  // Payload Type
+	bitvec_write_field(dest, wp, 0x0, 2);  // Uplink block with TDMA framenumber (N+13)
+	bitvec_write_field(dest, wp, 0, 1);  // No Polling Bit
+	bitvec_write_field(dest, wp, 0x0, 3);  // Uplink state flag
+	bitvec_write_field(dest, wp, 0x21, 6);  // MESSAGE TYPE
+	bitvec_write_field(dest, wp, 0, 2); // fixed 00
+	bitvec_write_field(dest, wp, 0x0, 1);  //  TLLI / G-RNTI : bit (32)
+	bitvec_write_field(dest, wp, tlli, 32); // CONTENTION_RESOLUTION_TLLI
+	bitvec_write_field(dest, wp, 1, 1);  //  WAIT_INDICATION size in seconds 
+	/* TODO: make it configurable */
+	bitvec_write_field(dest, wp, 100, 8);  //  WAIT_INDICATION value 
+	bitvec_write_field(dest, wp, 0, 1);  //  WAIT_INDICATION size in seconds 
+}
+
 static void write_packet_uplink_ack_egprs(
 	struct gprs_rlcmac_bts *bts, bitvec * dest, unsigned& wp,
 	struct gprs_rlcmac_ul_tbf *tbf, bool is_final)
diff --git a/src/encoding.h b/src/encoding.h
index 69f8cdc..54bbc8a 100644
--- a/src/encoding.h
+++ b/src/encoding.h
@@ -68,6 +68,9 @@
 
 	static void encode_rbb(const char *show_rbb, uint8_t *rbb);
 
+	static void write_packet_access_reject(
+		bitvec * dest, uint32_t tlli);
+
 	static void write_packet_uplink_ack(
 			struct gprs_rlcmac_bts *bts, bitvec * dest,
 			struct gprs_rlcmac_ul_tbf *tbf, bool is_final,
diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp
index f486075..9d35ad3 100644
--- a/src/gprs_rlcmac_sched.cpp
+++ b/src/gprs_rlcmac_sched.cpp
@@ -72,7 +72,8 @@
 			*poll_tbf = dl_tbf;
 		if (dl_tbf->dl_ass_state == GPRS_RLCMAC_DL_ASS_SEND_ASS)
 			*dl_ass_tbf = dl_tbf;
-		if (dl_tbf->ul_ass_state == GPRS_RLCMAC_UL_ASS_SEND_ASS)
+		if (dl_tbf->ul_ass_state == GPRS_RLCMAC_UL_ASS_SEND_ASS
+			|| dl_tbf->ul_ass_state == GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ)
 			*ul_ass_tbf = dl_tbf;
 	}
 
@@ -137,7 +138,11 @@
 		 */
 
 		if (tbf == ul_ass_tbf && tbf->direction == GPRS_RLCMAC_DL_TBF)
-			msg = ul_ass_tbf->create_ul_ass(fn, ts);
+				if (tbf->ul_ass_state ==
+						GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ)
+					msg = ul_ass_tbf->create_packet_access_reject();
+				else
+					msg = ul_ass_tbf->create_ul_ass(fn, ts);
 		else if (tbf == dl_ass_tbf && tbf->direction == GPRS_RLCMAC_UL_TBF)
 			msg = dl_ass_tbf->create_dl_ass(fn, ts);
 		else if (tbf == ul_ack_tbf)
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 0ac8ace..d8ada70 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -1013,6 +1013,27 @@
 	return msg;
 }
 
+struct msgb *gprs_rlcmac_tbf::create_packet_access_reject()
+{
+	struct msgb *msg;
+
+	msg = msgb_alloc(23, "rlcmac_ul_ass_rej");
+
+	bitvec *packet_access_rej = bitvec_alloc(23);
+	bitvec_unhex(packet_access_rej,
+		"2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
+
+	Encoding::write_packet_access_reject(
+		packet_access_rej, tlli());
+
+	bitvec_pack(packet_access_rej, msgb_put(msg, 23));
+
+	bitvec_free(packet_access_rej);
+	ul_ass_state = GPRS_RLCMAC_UL_ASS_NONE;
+	return msg;
+
+}
+
 struct msgb *gprs_rlcmac_tbf::create_ul_ass(uint32_t fn, uint8_t ts)
 {
 	struct msgb *msg;
diff --git a/src/tbf.h b/src/tbf.h
index 3205f6e..e044053 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -64,6 +64,7 @@
 enum gprs_rlcmac_tbf_ul_ass_state {
 	GPRS_RLCMAC_UL_ASS_NONE = 0,
 	GPRS_RLCMAC_UL_ASS_SEND_ASS, /* send uplink assignment on next RTS */
+	GPRS_RLCMAC_UL_ASS_SEND_ASS_REJ, /* send assignment reject next RTS */
 	GPRS_RLCMAC_UL_ASS_WAIT_ACK, /* wait for PACKET CONTROL ACK */
 };
 
@@ -103,6 +104,7 @@
 
 	struct msgb *create_dl_ass(uint32_t fn, uint8_t ts);
 	struct msgb *create_ul_ass(uint32_t fn, uint8_t ts);
+	struct msgb *create_packet_access_reject();
 
 	GprsMs *ms() const;
 	void set_ms(GprsMs *ms);
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp
index cc48392..926c535 100644
--- a/tests/tbf/TbfTest.cpp
+++ b/tests/tbf/TbfTest.cpp
@@ -2749,6 +2749,27 @@
 	ARRAY_SIZE(default_categories),
 };
 
+void test_immediate_assign_rej()
+{
+	BTS the_bts;
+	uint32_t tlli = 0xffeeddcc;
+
+	printf("=== start %s ===\n", __func__);
+	setup_bts(&the_bts, 4);
+	static gprs_rlcmac_dl_tbf *dl_tbf = tbf_init(&the_bts, 1);
+	dl_tbf->update_ms(tlli, GPRS_RLCMAC_DL_TBF);
+
+	struct msgb *msg = dl_tbf->create_packet_access_reject();
+
+	printf("packet reject: %s\n",
+			osmo_hexdump(msg->data, 23));
+
+	OSMO_ASSERT(!strcmp(osmo_hexdump(msg->data, 23),
+			    "40 84 7f f7 6e e6 59 0b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b "));
+	printf("=== end %s ===\n", __func__);
+
+}
+
 int main(int argc, char **argv)
 {
 	struct vty_app_info pcu_vty_info = {0};
@@ -2791,6 +2812,7 @@
 	test_tbf_update_ws();
 	test_tbf_li_decoding();
 	test_tbf_epdan_out_of_rx_window();
+	test_immediate_assign_rej();
 
 	if (getenv("TALLOC_REPORT_FULL"))
 		talloc_report_full(tall_pcu_ctx, stderr);
diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err
index fc3a113..d47a7da 100644
--- a/tests/tbf/TbfTest.err
+++ b/tests/tbf/TbfTest.err
@@ -6627,3 +6627,27 @@
 Detaching TBF from MS object, TLLI = 0xffeeddcc, TBF = TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=RELEASING EGPRS)
 Destroying MS object, TLLI = 0xffeeddcc
 ********** TBF ends here **********
+Searching for first unallocated TFI: TRX=0
+ Found TFI=0.
+********** TBF starts here **********
+Allocating DL TBF: MS_CLASS=11/11
+Creating MS object, TLLI = 0x00000000
+Modifying MS object, TLLI = 0x00000000, MS class 0 -> 11
+Modifying MS object, TLLI = 0x00000000, EGPRS MS class 0 -> 11
+Slot Allocation (Algorithm A) for class 11
+- Skipping TS 0, because not enabled
+- Skipping TS 1, because not enabled
+- Skipping TS 2, because not enabled
+- Skipping TS 3, because not enabled
+- Skipping TS 5, because not enabled
+- Skipping TS 6, because not enabled
+- Skipping TS 7, because not enabled
+- Assign downlink TS=4 TFI=0
+PDCH(TS 4, TRX 0): Attaching TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL), 1 TBFs, USFs = 00, TFIs = 00000001.
+- Setting Control TS 4
+Attaching TBF to MS object, TLLI = 0x00000000, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
+Allocated TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL): trx = 0, ul_slots = 10, dl_slots = 10
+Modifying MS object, TLLI = 0x00000000, TA 220 -> 0
+TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL) changes state from NULL to FLOW
+The MS object cannot fully confirm an unexpected TLLI: 0xffeeddcc, partly confirmed
+TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) append
diff --git a/tests/tbf/TbfTest.ok b/tests/tbf/TbfTest.ok
index 2978d6d..1948745 100644
--- a/tests/tbf/TbfTest.ok
+++ b/tests/tbf/TbfTest.ok
@@ -68,3 +68,6 @@
 === end test_tbf_li_decoding ===
 === start test_tbf_epdan_out_of_rx_window ===
 === end test_tbf_epdan_out_of_rx_window ===
+=== start test_immediate_assign_rej ===
+packet reject: 40 84 7f f7 6e e6 59 0b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 
+=== end test_immediate_assign_rej ===

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I096a3bb44a65533b9e9b091925dd5f70a8696d61
Gerrit-PatchSet: 1
Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Owner: arvind.sirsikar <arvind.sirsikar at radisys.com>



More information about the gerrit-log mailing list