aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2019-04-22 06:37:30 +0700
committerVadim Yanitskiy <axilirator@gmail.com>2019-04-23 14:49:36 +0000
commit51cbc104c6c060f1f495f7f0b2d4795dbf4c5ea9 (patch)
treed53c1764b602e753886d2011315ca3b182032efb
parent5c83679e396defb3df752d00a7dc85ce05b85fd2 (diff)
BTS_Tests.ttcn: add TC_pcu_ext_rach_content() for 11-bit RACH
According to 3GPP TS 04.60, section 11.2.5a, the extended (11-bit) Access Burst on RACH/PRACH is used by the MS to indicate its EGPRS capability. One of the alternative synch. sequences (see 3GPP TS 05.02, TS1 and TS2) shall be used. Add a test case to verify extended (11-bit) RACH decoding. Depends: (OsmocomBB) I36fd20cd5502ce33c52f644ee4c22abb83350df8 Change-Id: I8fe156aeac9de3dc1e71a4950821d4942ba9a253 Related: OS#1854
-rw-r--r--bts/BTS_Tests.ttcn65
-rw-r--r--bts/expected-results.xml1
-rw-r--r--library/L1CTL_PortType.ttcn22
3 files changed, 88 insertions, 0 deletions
diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index e6173237..711947ac 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -989,6 +989,12 @@ private function f_rnd_ra_ps() return OCT1 {
return ra;
}
+/* generate a random 11-bit RA (packet-switched only) */
+private function f_rnd_ra11_ps() return BIT11 {
+ var integer ra11 := f_rnd_int(bit2int('11111111111'B));
+ return int2bit(ra11, 11);
+}
+
/* Send 1000 RACH requests and check their RA+FN on the RSL side */
testcase TC_rach_content() runs on test_CT {
f_init(testcasename());
@@ -2969,6 +2975,64 @@ testcase TC_pcu_rach_content() runs on test_CT {
setverdict(pass);
}
+/* Send extended (11-bit, TS1 & TS2) RACH bursts from the Um side,
+ * expect them to show up on PCU socket (with proper BURST_TYPE_*). */
+testcase TC_pcu_ext_rach_content() runs on test_CT {
+ var template PCUIF_Message pcu_rach_ind;
+ var GsmFrameNumber fn_last := 0;
+ var L1ctlRachSynchSeq synch_seq;
+ var PCUIF_BurstType pcu_bt;
+ var GsmFrameNumber fn;
+ var BIT11 ra11;
+
+ f_init_pcu_test();
+ f_init_l1ctl();
+ f_l1_tune(L1CTL);
+
+ for (var integer i := 0; i < 1000; i := i+1) {
+ /* We need to test both TS1 & TS2 */
+ if (i rem 2 == 0) {
+ synch_seq := RACH_SYNCH_SEQ_TS1;
+ pcu_bt := BURST_TYPE_1;
+ } else {
+ synch_seq := RACH_SYNCH_SEQ_TS2;
+ pcu_bt := BURST_TYPE_2;
+ }
+
+ ra11 := f_rnd_ra11_ps();
+ fn := f_L1CTL_EXT_RACH(L1CTL, bit2int(ra11), synch_seq);
+ if (fn == fn_last) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ "Two RACH in same FN?!?");
+ }
+ fn_last := fn;
+
+ /* Compose the expected message */
+ pcu_rach_ind := tr_PCUIF_RACH_IND(
+ bts_nr := 0,
+ ra := bit2int(ra11),
+ is_11bit := 1,
+ burst_type := pcu_bt,
+ fn := fn);
+
+ timer T := 2.0;
+ T.start;
+ alt {
+ [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, pcu_rach_ind)) {
+ T.stop;
+ }
+ [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RACH_IND)) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Unexpected RACH IND");
+ }
+ [] PCU.receive { repeat; }
+ [] T.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for RACH IND");
+ }
+ }
+ }
+ setverdict(pass);
+}
+
private function f_pad_oct(octetstring str, integer len, OCT1 pad) return octetstring {
var integer strlen := lengthof(str);
for (var integer i := 0; i < len-strlen; i := i+1) {
@@ -4311,6 +4375,7 @@ control {
execute( TC_pcu_data_req_agch() );
execute( TC_pcu_data_req_imm_ass_pch() );
execute( TC_pcu_rach_content() );
+ execute( TC_pcu_ext_rach_content() );
execute( TC_pcu_paging_from_rsl() );
} else {
log("PCU socket path not available, skipping PCU tests");
diff --git a/bts/expected-results.xml b/bts/expected-results.xml
index 2eadffd9..7d89da30 100644
--- a/bts/expected-results.xml
+++ b/bts/expected-results.xml
@@ -77,6 +77,7 @@
<testcase classname='BTS_Tests' name='TC_pcu_data_req_agch' time='MASKED'/>
<testcase classname='BTS_Tests' name='TC_pcu_data_req_imm_ass_pch' time='MASKED'/>
<testcase classname='BTS_Tests' name='TC_pcu_rach_content' time='MASKED'/>
+ <testcase classname='BTS_Tests' name='TC_pcu_ext_rach_content' time='MASKED'/>
<testcase classname='BTS_Tests' name='TC_pcu_paging_from_rsl' time='MASKED'/>
<testcase classname='BTS_Tests' name='TC_dyn_osmo_pdch_act_deact' time='MASKED'/>
<testcase classname='BTS_Tests' name='TC_dyn_osmo_pdch_unsol_deact' time='MASKED'/>
diff --git a/library/L1CTL_PortType.ttcn b/library/L1CTL_PortType.ttcn
index 8e03c02e..7dac4c3e 100644
--- a/library/L1CTL_PortType.ttcn
+++ b/library/L1CTL_PortType.ttcn
@@ -87,6 +87,28 @@ module L1CTL_PortType {
return fn;
}
+ function f_L1CTL_EXT_RACH(
+ L1CTL_PT pt, uint16_t ra11, L1ctlRachSynchSeq seq,
+ uint8_t combined := 1, uint16_t offset := 0
+ ) return GsmFrameNumber {
+ var L1ctlDlMessage rc;
+ var GsmFrameNumber fn;
+ timer T := 2.0;
+
+ T.start;
+ pt.send(ts_L1CTL_EXT_RACH_REQ(ra11, seq, combined, offset));
+ alt {
+ [] pt.receive(tr_L1CTL_RACH_CONF) -> value rc { fn := rc.dl_info.frame_nr };
+ [] pt.receive { repeat; };
+ [] T.timeout {
+ setverdict(fail, "Timeout in extended RACH");
+ mtc.stop;
+ }
+ }
+
+ return fn;
+ }
+
function f_L1CTL_PARAM(L1CTL_PT pt, uint8_t ta, uint8_t tx_power) {
pt.send(ts_L1CTL_PAR_REQ(ta, tx_power));
}