[2/2] Add the test case for parsing uplink header type 2

Submitted by Bhargava Abhyankar on April 7, 2016, 11:57 a.m.

Details

Message ID 1460030275-543-2-git-send-email-Bhargava.Abhyankar@radisys.com
State Changes Requested
Series "Series without cover letter"
Headers show

Commit Message

Bhargava Abhyankar April 7, 2016, 11:57 a.m.
A test case is added to validate the uplink header type 2 extraction
functionality. Bug identified by unit test in the header type 2
parsing is fixed.
---
 src/decoding.cpp        |   8 ++--
 tests/edge/EdgeTest.cpp | 114 ++++++++++++++++++++++++++++++++++++++++++++++++
 tests/edge/EdgeTest.ok  |   2 +
 3 files changed, 120 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/decoding.cpp b/src/decoding.cpp
index b8e453e..fb0bd76 100644
--- a/src/decoding.cpp
+++ b/src/decoding.cpp
@@ -471,11 +471,11 @@  int Decoding::rlc_parse_ul_data_header_egprs_type_2(
 	cur_bit += rlc->data_offs_bits[0] - 2;
 
 	offs = rlc->data_offs_bits[0] / 8;
-	OSMO_ASSERT(rlc->data_offs_bits[0] % 8 == 1);
+	OSMO_ASSERT(rlc->data_offs_bits[0] % 8 == 7);
 
-	e_ti_header = (data[offs-1] + (data[offs] << 8)) >> 7;
-	rlc->block_info[0].e   = !!(e_ti_header & 0x01);
-	rlc->block_info[0].ti  = !!(e_ti_header & 0x02);
+	e_ti_header = (data[offs] & 0x60) >> 5;
+	rlc->block_info[0].e   = (e_ti_header & 0x01);
+	rlc->block_info[0].ti  = (e_ti_header & 0x02);
 	cur_bit += 2;
 
 	/* skip data area */
diff --git a/tests/edge/EdgeTest.cpp b/tests/edge/EdgeTest.cpp
index 9b4a1a5..c7184e2 100644
--- a/tests/edge/EdgeTest.cpp
+++ b/tests/edge/EdgeTest.cpp
@@ -1409,6 +1409,119 @@  void uplink_header_type1_test(void)
 	printf("=== end %s ===\n", __func__);
 }
 
+static gprs_rlcmac_ul_tbf *uplink_header_type_2_parsing_test(BTS *the_bts,
+	uint8_t ts_no, uint32_t tlli, uint32_t *fn, uint16_t qta,
+	uint8_t ms_class)
+{
+	GprsMs *ms;
+	struct pcu_l1_meas meas;
+	uint32_t rach_fn = *fn - 51;
+	uint32_t sba_fn = *fn + 52;
+	uint8_t trx_no = 0;
+	int tfi = 0;
+	gprs_rlcmac_ul_tbf *ul_tbf;
+	struct gprs_rlcmac_pdch *pdch;
+	gprs_rlcmac_bts *bts;
+	RlcMacUplink_t ulreq = {0};
+	uint8_t data[79] = {0};
+	struct gprs_rlc_ul_header_egprs_2 *egprs2  = NULL;
+
+	meas.set_rssi(31);
+	egprs2 = (struct gprs_rlc_ul_header_egprs_2 *) data;
+	bts = the_bts->bts_data();
+
+	/* needed to set last_rts_fn in the PDCH object */
+	request_dl_rlc_block(bts, trx_no, ts_no, 0, fn);
+
+	/* simulate RACH,this sends a Immediate Assignment Uplink on the AGCH */
+	the_bts->rcv_rach(0x73, rach_fn, qta);
+
+	/* get next free TFI */
+	tfi = the_bts->tfi_find_free(GPRS_RLCMAC_UL_TBF, &trx_no, -1);
+
+	/* fake a resource request */
+	ulreq.u.MESSAGE_TYPE = MT_PACKET_RESOURCE_REQUEST;
+	ulreq.u.Packet_Resource_Request.PayloadType = GPRS_RLCMAC_CONTROL_BLOCK;
+	ulreq.u.Packet_Resource_Request.ID.UnionType = 1; /* != 0 */
+	ulreq.u.Packet_Resource_Request.ID.u.TLLI = tlli;
+	ulreq.u.Packet_Resource_Request.Exist_MS_Radio_Access_capability = 1;
+	ulreq.u.Packet_Resource_Request.MS_Radio_Access_capability.
+			Count_MS_RA_capability_value = 1;
+	ulreq.u.Packet_Resource_Request.MS_Radio_Access_capability.
+		MS_RA_capability_value[0].u.Content.
+		Exist_Multislot_capability = 1;
+	ulreq.u.Packet_Resource_Request.MS_Radio_Access_capability.
+		MS_RA_capability_value[0].u.Content.Multislot_capability.
+		Exist_GPRS_multislot_class = 1;
+	ulreq.u.Packet_Resource_Request.MS_Radio_Access_capability.
+		MS_RA_capability_value[0].u.Content.Multislot_capability.
+		GPRS_multislot_class = ms_class;
+	ulreq.u.Packet_Resource_Request.MS_Radio_Access_capability.
+		MS_RA_capability_value[0].u.Content.Multislot_capability.
+		Exist_EGPRS_multislot_class = 1;
+	ulreq.u.Packet_Resource_Request.MS_Radio_Access_capability.
+		MS_RA_capability_value[0].u.Content.Multislot_capability.
+		EGPRS_multislot_class = ms_class;
+
+	send_ul_mac_block(the_bts, trx_no, ts_no, &ulreq, sba_fn);
+
+	/* check the TBF */
+	ul_tbf = the_bts->ul_tbf_by_tfi(tfi, trx_no, ts_no);
+	OSMO_ASSERT(ul_tbf != NULL);
+	OSMO_ASSERT(ul_tbf->ta() == qta / 4);
+
+	/* header parsing */
+	egprs2->r = 1;
+	egprs2->si = 1;
+	egprs2->cv = 7;
+	egprs2->tfi_a = tfi & (~((~0) << 2));
+	egprs2->tfi_b = (tfi & ((~((~0) << 3)) << 2)) >> 2;
+	egprs2->bsn1_a = 0;
+	egprs2->bsn1_b = 0;
+	egprs2->cps_a = 3;
+	egprs2->cps_b = 0;
+	egprs2->rsb = 0;
+	egprs2->pi = 0;
+	data[10] = 0x20;		/* Setting E field */
+	pdch = &the_bts->bts_data()->trx[trx_no].pdch[ts_no];
+	pdch->rcv_block(&data[0], 79, *fn, &meas);
+
+	egprs2->r = 1;
+	egprs2->si = 1;
+	egprs2->cv = 7;
+	egprs2->tfi_a = tfi & (~((~0) << 2));
+	egprs2->tfi_b = tfi & ((~((~0) << 3)) << 2);
+	egprs2->bsn1_a = 1;
+	egprs2->bsn1_b = 0;
+	egprs2->cps_a = 2;
+	egprs2->cps_b = 0;
+	egprs2->rsb = 0;
+	egprs2->pi = 0;
+	data[10] = 0x20;		/*Setting E field */
+	pdch = &the_bts->bts_data()->trx[trx_no].pdch[ts_no];
+	pdch->rcv_block(&data[0], 79, *fn, &meas);
+}
+
+void uplink_header_type2_test(void)
+{
+	BTS the_bts;
+	int ts_no = 7;
+	uint32_t fn = 2654218;
+	uint16_t qta = 31;
+	uint32_t tlli = 0xf1223344;
+	const char *imsi = "0011223344";
+	uint8_t ms_class = 1;
+	gprs_rlcmac_ul_tbf *ul_tbf;
+	GprsMs *ms;
+
+	printf("=== start %s ===\n", __func__);
+	setup_bts(&the_bts, ts_no, 10);
+
+	ul_tbf = uplink_header_type_2_parsing_test(&the_bts, ts_no,
+			tlli, &fn, qta, ms_class);
+	printf("=== end %s ===\n", __func__);
+}
+
 int main(int argc, char **argv)
 {
 	struct vty_app_info pcu_vty_info = {0};
@@ -1431,6 +1544,7 @@  int main(int argc, char **argv)
 	test_rlc_unaligned_copy();
 	test_rlc_unit_encoder();
 	uplink_header_type1_test();
+	uplink_header_type2_test();
 	if (getenv("TALLOC_REPORT_FULL"))
 		talloc_report_full(tall_pcu_ctx, stderr);
 	return EXIT_SUCCESS;
diff --git a/tests/edge/EdgeTest.ok b/tests/edge/EdgeTest.ok
index 353f55d..1277d70 100644
--- a/tests/edge/EdgeTest.ok
+++ b/tests/edge/EdgeTest.ok
@@ -8,3 +8,5 @@ 
 === end test_rlc_unit_encoder ===
 === start uplink_header_type1_test ===
 === end uplink_header_type1_test ===
+=== start uplink_header_type2_test ===
+=== end uplink_header_type2_test ===

Comments

Holger Freyther April 7, 2016, 10:29 p.m.
> On 07 Apr 2016, at 13:57, Bhargava Abhyankar <Bhargava.Abhyankar@radisys.com> wrote:
> 
> A test case is added to validate the uplink header type 2 extraction
> functionality. Bug identified by unit test in the header type 2
> parsing is fixed.


> 	offs = rlc->data_offs_bits[0] / 8;
> -	OSMO_ASSERT(rlc->data_offs_bits[0] % 8 == 1);
> +	OSMO_ASSERT(rlc->data_offs_bits[0] % 8 == 7);
> -	e_ti_header = (data[offs-1] + (data[offs] << 8)) >> 7;
> -	rlc->block_info[0].e   = !!(e_ti_header & 0x01);
> -	rlc->block_info[0].ti  = !!(e_ti_header & 0x02);
> +	e_ti_header = (data[offs] & 0x60) >> 5;
> +	rlc->block_info[0].e   = (e_ti_header & 0x01);
> +	rlc->block_info[0].ti  = (e_ti_header & 0x02);
> 	cur_bit += 2;

you probably want this to be in another commit.


> +	pdch = &the_bts->bts_data()->trx[trx_no].pdch[ts_no];
> +	pdch->rcv_block(&data[0], 79, *fn, &meas);

like in my other mails, please have more strong post conditions. What do you actually expect in terms of side effects here? Test them specifically.

kind regards
	holger
Bhargava Abhyankar April 13, 2016, 9:15 a.m.
Hello Holger,

> On 07 Apr 2016, at 03:59 AM, Holger Freyther < holger@freyther.de> wrote:

> +	pdch = &the_bts->bts_data()->trx[trx_no].pdch[ts_no];
> +	pdch->rcv_block(&data[0], 79, *fn, &meas);

>> like in my other mails, please have more strong post conditions. What do you actually expect in terms of side effects here? >> Test them specifically.

Will find the relevant conditions to be tested and  update it in the patch.

kind regards
Bhargava Abhyankar