Harald Welte has uploaded this change for review. ( https://gerrit.osmocom.org/10983
Change subject: WIP: CBCH related tests for BTS ...................................................................... WIP: CBCH related tests for BTS This introduces a set of CBCH related tests for osmo-bts. Warning: Those tests currently require a patched trxcon to work. Change-Id: I955b4000c12180a39b0205b69b7b2c8cee8c9da3 --- M bts/BTS_Tests.ttcn 1 file changed, 260 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/83/10983/1 diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn index aa402d1..4fafe0e 100644 --- a/bts/BTS_Tests.ttcn +++ b/bts/BTS_Tests.ttcn @@ -4079,7 +4079,261 @@ /* receptiom of SABM in multi-frame established state */ +/*********************************************************************** + * Cell Broadcast related tests + ***********************************************************************/ +type record CbchTestPars { + boolean use_sdcch4, + CbchTestMsgs msgs +}; + +type record CbchTestMsg { + /* config / input data */ + RSL_CbCommand rsl_cb_cmd, + uint2_t last_block, /* 0..3 */ + octetstring payload, + /* computed / result data */ + CbchBlocks blocks optional +}; +type record of CbchTestMsg CbchTestMsgs; + +/* a single 22byte block within a CbchTestMsg */ +type record CbchBlock { + uint4_t seq_nr, /* as per TS 04.12 */ + boolean is_last, + OCT22 payload, + boolean seen_once +}; +type record of CbchBlock CbchBlocks; + +/* compute the expected blocks for given test parameters */ +private function f_cbch_compute_exp_blocks(inout CbchTestPars pars) { + var integer i; + + for (i := 0; i < lengthof(pars.msgs); i := i+1) { + pars.msgs[i].blocks := f_comp_blocks(pars.msgs[i]); + } +} +private function f_comp_blocks(in CbchTestMsg msg) return CbchBlocks { + var CbchBlocks blocks := {}; + var integer i; + + for (i := 0; i <= msg.last_block; i := i+1) { + var CbchBlock block := { + seq_nr := i, + is_last := false, + payload := substr(msg.payload, 22*i, 22), + seen_once := false + }; + if (msg.rsl_cb_cmd == RSL_CB_CMD_SCHEDULE and i == 0) { + block.seq_nr := 8; + } + if (i == msg.last_block) { + block.is_last := true; + } + blocks := blocks & {block}; + } + + return blocks; +}; + +/* TS 48.058 Section 9.3.41 */ +private function f_cbch_block_nr2rsl(uint2_t nr) return uint2_t { + select (nr) { + case (0) { return 1; } + case (1) { return 2; } + case (2) { return 3; } + case (3) { return 0; } + } + setverdict(fail, "Invalid block number"); + mtc.stop; +} + +/* Verify the CBCH TB scheduling rules of TS 05.02 Section 6.5.4 */ +private function f_cbch_fn_verify(uint32_t fn, CBCH_Block cb) +{ + var integer tb := (fn/51) mod 8; /* TS 05.02 Section 6.5.4 */ + if (cb.block_type.seq_nr == 15 /* null */) { + /* always permitted */ + return; + } else if (cb.block_type.seq_nr == 8 /* schedule */) { + if (tb != 0) { + setverdict(fail, "Schedule block at TB=", tb); + } + } else if (cb.block_type.seq_nr < 4) { + if (cb.block_type.seq_nr != tb and cb.block_type.seq_nr+4 != tb) { + setverdict(fail, "Normal block at wrong TB=", tb, ": ", cb); + } + } +} + +/* shared function doing the heavy lifting for most CBCH tests */ +private function f_TC_smscb(CbchTestPars pars) runs on test_CT { + var L1ctlDlMessage dl; + var boolean cmd_seen_once := false; + var integer i, j; + timer T := 5.0; + + f_cbch_compute_exp_blocks(pars); + + f_init_vty_bsc(); + /* ensure that a CBCH is present in channel combination */ + if (pars.use_sdcch4) { + f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 0"}, + "phys_chan_config CCCH+SDCCH4+CBCH"); + f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 6"}, + "phys_chan_config SDCCH8"); + } else { + f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 0"}, + "phys_chan_config CCCH+SDCCH4"); + f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 6"}, + "phys_chan_config SDCCH8+CBCH"); + } + f_vty_transceive(BSCVTY, "drop bts connection 0 oml"); + f_sleep(2.0); + f_init(testcasename()); + + f_init_l1ctl(); + f_l1_tune(L1CTL); + + /* send SMSCB[s] via RSL */ + for (i := 0; i < lengthof(pars.msgs); i := i+1) { + var CbchTestMsg msg := pars.msgs[i]; + var uint2_t rsl_last_block := f_cbch_block_nr2rsl(msg.last_block); + var RSL_IE_CbCommandType cmd_type := + valueof(ts_RSL_IE_CbCmdType(msg.rsl_cb_cmd, rsl_last_block)); + RSL_CCHAN.send(ts_RSL_UD(ts_RSL_SMSCB_CMD(cmd_type, msg.payload))); + } + T.start; + /* Expect this to show up exactly once on the basic CBCH (four blocks) */ + alt { + [] L1CTL.receive(tr_L1CTL_DATA_IND(t_RslChanNr_CBCH(0))) -> value dl { + log("CBCH: ", dl); + var CBCH_Block cb := dec_CBCH_Block(dl.payload.data_ind.payload); + /* detect the proper CBCH messages; check frame number */ + f_cbch_fn_verify(dl.dl_info.frame_nr, cb); + if (not match(cb, tr_CBCH_Block)) { + setverdict(fail, "Illegal CBCH Block received: ", cb); + } else { + var boolean matched := false; + /* ignore NULL messages */ + if (match(cb, tr_CBCH_Block(15, ?, ?))) { repeat; } + for (i := 0; i < lengthof(pars.msgs); i := i+1) { + for (j := 0; j < lengthof(pars.msgs[i].blocks); j := j+1) { + var CbchBlock b := pars.msgs[i].blocks[j]; + if (match(cb, tr_CBCH_Block(b.seq_nr, b.is_last, b.payload))) { + if (not pars.msgs[i].blocks[j].seen_once) { + pars.msgs[i].blocks[j].seen_once := true; + setverdict(pass); + } else { + setverdict(fail, "Received SMSCB twice! ", cb); + } + matched := true; + continue; + } + } + } + if (not matched) { + setverdict(fail, "Received unexpected CBCH block: ", cb); + } + repeat; + } + } + [] L1CTL.receive { repeat; } + [] T.timeout { + for (i := 0; i < lengthof(pars.msgs); i := i+1) { + for (j := 0; j < lengthof(pars.msgs[i].blocks); j := j+1) { + var CbchBlock b := pars.msgs[i].blocks[j]; + if (not b.seen_once) { + setverdict(fail, "Timeout waiting for CBCH"); + } + } + } + } + } + + /* reset timeslot 0 channel combination to default */ + f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 0"}, + "phys_chan_config CCCH+SDCCH4"); + f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 6"}, + "phys_chan_config SDCCH8"); + f_shutdown(); +} + +/* transmit single-block SMSCB COMMAND */ +testcase TC_sms_cb_cmd_cbch_sdcch4_1block() runs on test_CT { + var CbchTestPars pars := { + use_sdcch4 := true, + msgs := { + { RSL_CB_CMD_NORMAL, 0, '001000320f1141660c344dd3cba09a0c000000000000'O, + omit } + } + }; + f_TC_smscb(pars); +} + +/* transmit dual-block SMSCB COMMAND */ +testcase TC_sms_cb_cmd_cbch_sdcch4_2block() runs on test_CT { + var CbchTestPars pars := { + use_sdcch4 := true, + msgs := { + { RSL_CB_CMD_NORMAL, 1, '001000320f1141660c344dd3cba09a0c000000000000'O & + '000102030405060708090a0b0c0d0e0f101213141516'O, + omit } + } + }; + f_TC_smscb(pars); +} + +/* transmit triple-block SMSCB COMMAND */ +testcase TC_sms_cb_cmd_cbch_sdcch4_3block() runs on test_CT { + var CbchTestPars pars := { + use_sdcch4 := true, + msgs := { + { RSL_CB_CMD_NORMAL, 2, '001000320f1141660c344dd3cba09a0c000000000000'O & + '000102030405060708090a0b0c0d0e0f101213141516'O & + '101112131415161718191a1b1c1d1e1f202223242526'O, + omit } + } + }; + f_TC_smscb(pars); + +} + +/* transmit quad-block SMSCB COMMAND */ +testcase TC_sms_cb_cmd_cbch_sdcch4_4block() runs on test_CT { + var CbchTestPars pars := { + use_sdcch4 := true, + msgs := { + { RSL_CB_CMD_NORMAL, 3, '001000320f1141660c344dd3cba09a0c000000000000'O & + '000102030405060708090a0b0c0d0e0f101213141516'O & + '101112131415161718191a1b1c1d1e1f202223242526'O & + '202122232425262728292a2b2c2d2e2f303233343536'O, + omit } + } + }; + f_TC_smscb(pars); +} + +/* transmit SMSCB COMMAND with SCHEDULE payload */ +testcase TC_sms_cb_cmd_cbch_sdcch4_schedule() runs on test_CT { + var CbchTestPars pars := { + use_sdcch4 := true, + msgs := { + { RSL_CB_CMD_SCHEDULE, 3, '001000320f1141660c344dd3cba09a0c000000000000'O & + '000102030405060708090a0b0c0d0e0f101213141516'O & + '101112131415161718191a1b1c1d1e1f202223242526'O & + '202122232425262728292a2b2c2d2e2f303233343536'O, + omit } + } + }; + f_TC_smscb(pars); +} + +/* transmit SMSCB COMMAND with DEFAULT message */ +testcase TC_sms_cb_cmd_cbch_sdcch4_default() runs on test_CT { +} /* TODO Areas: @@ -4204,6 +4458,12 @@ execute( TC_tch_sign_l2_fill_frame() ); execute( TC_tch_sign_l2_fill_frame_dtxd() ); + + execute( TC_sms_cb_cmd_cbch_sdcch4_1block() ); + execute( TC_sms_cb_cmd_cbch_sdcch4_2block() ); + execute( TC_sms_cb_cmd_cbch_sdcch4_3block() ); + execute( TC_sms_cb_cmd_cbch_sdcch4_4block() ); + execute( TC_sms_cb_cmd_cbch_sdcch4_schedule() ); } -- To view, visit https://gerrit.osmocom.org/10983 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-MessageType: newchange Gerrit-Change-Id: I955b4000c12180a39b0205b69b7b2c8cee8c9da3 Gerrit-Change-Number: 10983 Gerrit-PatchSet: 1 Gerrit-Owner: Harald Welte <lafo...@gnumonks.org>