laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17970 )
Change subject: pcu: Support retrieving BSN and TFI in tests from data_egprs blocks ...................................................................... pcu: Support retrieving BSN and TFI in tests from data_egprs blocks function helpers are slightly modified or added to accomodate for fields in egprs data blocks being in different places. Change-Id: I570fb7346519b2a161515e0ec40bd1870a89d673 --- M pcu/PCU_Tests_RAW.ttcn 1 file changed, 97 insertions(+), 24 deletions(-) Approvals: laforge: Looks good to me, approved Jenkins Builder: Verified diff --git a/pcu/PCU_Tests_RAW.ttcn b/pcu/PCU_Tests_RAW.ttcn index b79b365..524dfb7 100644 --- a/pcu/PCU_Tests_RAW.ttcn +++ b/pcu/PCU_Tests_RAW.ttcn @@ -219,11 +219,28 @@ receive_block_bitmap := '0000000000000000000000000000000000000000000000000000000000000000'B } +private function f_rlcmac_dl_block_get_tfi(RlcmacDlBlock dl_block) return uint5_t { + if (ischosen(dl_block.data)) { + return dl_block.data.mac_hdr.hdr_ext.tfi; + } else { + return dl_block.data_egprs.mac_hdr.tfi; + } +} + /* TS 44.060 sec 12.3 Ack/Nack Description */ -private function f_acknackdesc_ack_block(inout AckNackDescription desc, uint7_t bsn, BIT1 final_ack := '0'B) +private function f_acknackdesc_ack_block(inout AckNackDescription desc, RlcmacDlBlock dl_block, BIT1 final_ack := '0'B) { + var uint7_t bsn; var integer i; - var integer inc := bsn - desc.starting_seq_nr + 1; + var integer inc; + + if (ischosen(dl_block.data)) { + bsn := dl_block.data.mac_hdr.hdr_ext.bsn; + } else { + bsn := dl_block.data_egprs.mac_hdr.bsn1; + } + + inc := bsn - desc.starting_seq_nr + 1; /* Filling hole? */ if (bsn < desc.starting_seq_nr) { desc.receive_block_bitmap[lengthof(desc.receive_block_bitmap) - (desc.starting_seq_nr - bsn)] := int2bit(1, 1); @@ -558,18 +575,9 @@ } } -private function f_rx_rlcmac_dl_block_exp_data(out RlcmacDlBlock dl_block, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?) -runs on RAW_PCU_Test_CT { - var PCUIF_Message pcu_msg; - var uint32_t dl_fn; - var template RlcmacDlBlock dl_template := tr_RLCMAC_DATA_RRBP; - dl_template.data.blocks := ?; - - f_rx_rlcmac_dl_block(dl_block, dl_fn); - if (not match(dl_block, dl_template)) { - setverdict(fail, "Failed to match Packet data: ", dl_block, " vs ", dl_template); - mtc.stop; - } +private function f_rlcmac_dl_block_verify_data_gprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?) +{ + log("verifying dl data block (gprs): ", dl_block); ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data.mac_hdr.mac_hdr.rrbp); @@ -599,6 +607,71 @@ setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload); mtc.stop; } + + /* TODO: check exp_cs */ +} + +private function f_rlcmac_dl_block_verify_data_egprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint14_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?) +{ + log("verifying dl data block (egprs): ", dl_block); + + ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data_egprs.mac_hdr.rrbp); + + if (not match(dl_block.data_egprs.mac_hdr.bsn1, exp_bsn)) { + setverdict(fail, "DL block BSN doesn't match: ", + dl_block.data_egprs.blocks[0].hdr.length_ind, " vs exp ", exp_bsn); + } + + if (lengthof(dl_block.data_egprs.blocks) < 1) { + setverdict(fail, "DL block has no LLC payload: ", dl_block); + mtc.stop; + } + + if (ispresent(dl_block.data_egprs.blocks[0].hdr) and dl_block.data_egprs.blocks[0].hdr.length_ind != lengthof(data)) { + setverdict(fail, "DL block has LLC header with wrong expected size: ", + dl_block.data_egprs.blocks[0].hdr.length_ind, " vs ", lengthof(data)); + mtc.stop; + } + + if (dl_block.data_egprs.blocks[0].payload != data) { + setverdict(fail, "Failed to match content of LLC payload in DL Block: ", dl_block, " vs ", data); + mtc.stop; + } + + /* Check next data blocks contain dummy frames */ + if (lengthof(dl_block.data_egprs.blocks) > 1 and substr(dl_block.data_egprs.blocks[1].payload, 0, 3) != '43C001'O) { + setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload); + mtc.stop; + } + + /* TODO: Check exp_cs. In the case of EGPRS, first check mac_hdr.header_type and then decode CPS = exp_cs based on mac_hdr.header_type. + See wireshark's egprs_Header_type1_coding_puncturing_scheme_to_mcs. */ +} + +private function f_rx_rlcmac_dl_block_exp_data(out RlcmacDlBlock dl_block, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?) +runs on RAW_PCU_Test_CT { + var PCUIF_Message pcu_msg; + var uint32_t dl_fn; + var boolean is_egprs := false; + var template RlcmacDlBlock dl_template := tr_RLCMAC_DATA_RRBP; + dl_template.data.blocks := ?; + + f_rx_rlcmac_dl_block(dl_block, dl_fn); + if (not match(dl_block, dl_template)) { + dl_template := tr_RLCMAC_DATA_EGPRS; + dl_template.data_egprs.blocks := ?; + if (not match(dl_block, dl_template)) { + setverdict(fail, "Failed to match Packet data: ", dl_block, " vs ", dl_template); + mtc.stop; + } + is_egprs := true; + } + + if (is_egprs) { + f_rlcmac_dl_block_verify_data_egprs(dl_block, dl_fn, ack_fn, data, exp_bsn, exp_cs); + } else { + f_rlcmac_dl_block_verify_data_gprs(dl_block, dl_fn, ack_fn, data, exp_bsn, exp_cs); + } } testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT { @@ -1231,8 +1304,8 @@ f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0); /* ACK the DL block */ - f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B); - f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn); + f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B); + f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn); /* we are done with the DL-TBF here so far, let's clean up our local state: */ ack_nack_desc := valueof(t_AckNackDescription_init) @@ -1245,8 +1318,8 @@ /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */ f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0); - f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B); - f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn); + f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B); + f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn); } /* Test scenario where MS wants to send some data on PDCH against SGSN and it is @@ -1322,8 +1395,8 @@ f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs); /* ACK the DL block */ - f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B); - f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn); + f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B); + f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn); } /* Test scenario where MS wants to send some data on PDCH against SGSN and it is @@ -1386,8 +1459,8 @@ f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs); /* ACK the DL block */ - f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B); - f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn); + f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B); + f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn); /* Now MS wants to answer the DL data, Establish an Uplink TBF */ ok := f_establish_tbf(rr_imm_ass); @@ -1478,8 +1551,8 @@ f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0); /* ACK the DL block */ - f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B); - f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn); + f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B); + f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn); } private function f_pkt_paging_match_imsi(in PacketPagingReq req, hexstring imsi) { -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17970 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I570fb7346519b2a161515e0ec40bd1870a89d673 Gerrit-Change-Number: 17970 Gerrit-PatchSet: 2 Gerrit-Owner: pespin <pes...@sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <lafo...@osmocom.org> Gerrit-MessageType: merged