<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14341">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts: Extend LAPDm test suite with a number of new tests<br><br>This adds the following test cases to BTS_Tests_LAPDm.ttcn:<br>* TC_sabm_retransmit_bts()<br>* TC_sabm_invalid_resp()<br>* TC_sabm_dm()<br>* TC_establish_ign_first_sabm()<br>* TC_iframe_seq_and_ack()<br>* TC_iframe_timer_recovery()<br><br>Change-Id: I4e1136c0c0f10d5bc8d01e826ae5d92f17a0b2aa<br>---<br>M bts/BTS_Tests.ttcn<br>M bts/BTS_Tests_LAPDm.ttcn<br>M library/LAPDm_Types.ttcn<br>3 files changed, 511 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn</span><br><span>index c43774d..e48c05a 100644</span><br><span>--- a/bts/BTS_Tests.ttcn</span><br><span>+++ b/bts/BTS_Tests.ttcn</span><br><span>@@ -61,9 +61,11 @@</span><br><span> </span><br><span> import from Osmocom_VTY_Functions all;</span><br><span> import from TELNETasp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BTS_Tests_LAPDm all;</span><br><span> </span><br><span> friend module BTS_Tests_SMSCB;</span><br><span> friend module BTS_Tests_virtphy;</span><br><span style="color: hsl(120, 100%, 40%);">+friend module BTS_Tests_LAPDm;</span><br><span> </span><br><span> /* The tests assume a BTS with the following timeslot configuration:</span><br><span>  * TS0 : Combined CCCH + SDCCH/4</span><br><span>@@ -155,7 +157,7 @@</span><br><span> }</span><br><span> </span><br><span> /* an individual call / channel */</span><br><span style="color: hsl(0, 100%, 40%);">-type component ConnHdlr extends RSL_DchanHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+type component ConnHdlr extends RSL_DchanHdlr, lapdm_test_CT {</span><br><span>        port L1CTL_PT L1CTL;</span><br><span> </span><br><span>     port TRXC_CODEC_PT BTS_TRXC;</span><br><span>@@ -551,7 +553,7 @@</span><br><span>                   "RF CHAN REL", true);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private template ConnHdlrPars t_Pars(template RslChannelNr chan_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+friend template ConnHdlrPars t_Pars(template RslChannelNr chan_nr,</span><br><span>                                      template RSL_IE_ChannelMode chan_mode,</span><br><span>                                       float t_guard := 20.0) := {</span><br><span>  chan_nr := valueof(chan_nr),</span><br><span>@@ -699,7 +701,7 @@</span><br><span> }</span><br><span> </span><br><span> /* execute the same callback function on a variety of logical channels */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_testmatrix_each_chan(ConnHdlrPars pars, void_fn fn) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_testmatrix_each_chan(ConnHdlrPars pars, void_fn fn) runs on test_CT {</span><br><span>    var ConnHdlr vc_conn;</span><br><span>        f_init();</span><br><span> </span><br><span>diff --git a/bts/BTS_Tests_LAPDm.ttcn b/bts/BTS_Tests_LAPDm.ttcn</span><br><span>index 33aa174..2eade0a 100644</span><br><span>--- a/bts/BTS_Tests_LAPDm.ttcn</span><br><span>+++ b/bts/BTS_Tests_LAPDm.ttcn</span><br><span>@@ -4,7 +4,9 @@</span><br><span> import from Osmocom_Types all;</span><br><span> import from LAPDm_RAW_PT all;</span><br><span> import from LAPDm_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSL_Types all;</span><br><span> import from BTS_Tests all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Misc_Helpers all;</span><br><span> </span><br><span> /* test that use exclusively only LAPDm over L1CTL */</span><br><span> type component lapdm_test_CT {</span><br><span>@@ -14,8 +16,6 @@</span><br><span> </span><br><span> /* contrary to BTS_Tests.ttcn, we use LAPDm_PT here, a convenience wrapper</span><br><span>  * around L1CTL to perform encode/decode of abstract LAPDm frames */</span><br><span style="color: hsl(0, 100%, 40%);">-type component lapdm_bts_CT extends lapdm_test_CT, test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span> </span><br><span> /*********************************************************************************</span><br><span>  * Test using only L1CTL/LAPDm</span><br><span>@@ -34,9 +34,15 @@</span><br><span>  lapdm_component.start(LAPDmStart());</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_lapdm_exit() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        lapdm_component.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ lapdm_component.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ unmap(lapdm_component:L1CTL, system:L1CTL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* master function establishing a dedicated radio channel (takes care of RACH/IMM.ASS handling) */</span><br><span> function f_establish_dcch() runs on lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-   var BCCH_tune_req tune_req := { arfcn := { false, 871 }, combined_ccch := true };</span><br><span style="color: hsl(120, 100%, 40%);">+     var BCCH_tune_req tune_req := { arfcn := { false, mp_trx0_arfcn }, combined_ccch := true };</span><br><span>  var DCCH_establish_req est_req := { ra := 23 };</span><br><span> </span><br><span>  LAPDM.send(tune_req);</span><br><span>@@ -44,6 +50,16 @@</span><br><span>   LAPDM.receive(DCCH_establish_res:?);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* master function switching to a dedicated radio channel */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_switch_dcch(Arfcn arfcn, RslChannelNr chan_nr, GsmTsc tsc) runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var BCCH_tune_req tune_req := { arfcn := arfcn, combined_ccch := true };</span><br><span style="color: hsl(120, 100%, 40%);">+      var DCCH_switch_req sw_req := { arfcn, chan_nr, tsc };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      LAPDM.send(tune_req);</span><br><span style="color: hsl(120, 100%, 40%);">+ LAPDM.send(sw_req);</span><br><span style="color: hsl(120, 100%, 40%);">+   LAPDM.receive(DCCH_switch_res:?);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* helper function releasing dedicated radio channel physically (no Um signaling!) */</span><br><span> function f_release_dcch() runs on lapdm_test_CT {</span><br><span>         var DCCH_release_req rel_req := {};</span><br><span>@@ -252,6 +268,434 @@</span><br><span>  log("DEC: ", dec_LapdmFrameAB('0303012B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*********************************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * Test using both L1CTL/LAPDm and RSL</span><br><span style="color: hsl(120, 100%, 40%);">+ *********************************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function fp_common_init() runs on ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       /* undo what f_start_handler is doing and pull LAPDm_CT into the loop */</span><br><span style="color: hsl(120, 100%, 40%);">+      unmap(self:L1CTL, system:L1CTL);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_lapdm_init();</span><br><span style="color: hsl(120, 100%, 40%);">+       /* activate the channel on the BTS side */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rsl_chan_act(g_pars.chan_mode, false, {});</span><br><span style="color: hsl(120, 100%, 40%);">+  /* activate the channel on the MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_switch_dcch({false, mp_trx0_arfcn}, g_chan_nr, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function fp_common_fini() runs on ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      f_release_dcch();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rsl_chan_deact();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_lapdm_exit();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Verify that the BTS is re-transmitting SABM messages after T200 timeout, inspired</span><br><span style="color: hsl(120, 100%, 40%);">+   by 3GPP TS 51.010-1 25.2.1.1.2.1 + 25.2.1.2.4 */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_sabm_retransmit_bts(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  const integer sapi := 3; /* BTS may not establish SAPI=0 outbound */</span><br><span style="color: hsl(120, 100%, 40%);">+  fp_common_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LAPDM.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+  RSL.send(ts_RSL_EST_REQ(g_chan_nr, ts_RslLinkID_DCCH(sapi)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       timer T := 8.0;</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer sabm_received := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_SABM(sapi, ?, ?, ''O))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               sabm_received := sabm_received + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T.timeout { }</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (sabm_received == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "No SABM observed at all!");</span><br><span style="color: hsl(120, 100%, 40%);">+       } else if (sabm_received != 6) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Incorrect number of SABM re-transmissions of observed: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                    sabm_received);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass, "Received ", sabm_received, " SABM");</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fp_common_fini();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sabm_retransmit_bts() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_testmatrix_each_chan(pars, refers(f_TC_sabm_retransmit_bts));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record LapdmNamedFrame {</span><br><span style="color: hsl(120, 100%, 40%);">+ charstring name,</span><br><span style="color: hsl(120, 100%, 40%);">+      LapdmFrame lapdm</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test that the BTS will ignore receipt of frames other than a UA when</span><br><span style="color: hsl(120, 100%, 40%);">+ * received in response to the SABM frame, inspired from 3GPP TS 51.010-1</span><br><span style="color: hsl(120, 100%, 40%);">+ * Section 25.2.1.1.2.3 */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_sabm_invalid_resp2(charstring id, LapdmNamedFrame err_frame) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer sapi := err_frame.lapdm.ab.addr.sapi;</span><br><span style="color: hsl(120, 100%, 40%);">+     fp_common_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Establish Request via RSL; Expect SABM on LAPDm side */</span><br><span style="color: hsl(120, 100%, 40%);">+    LAPDM.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+  RSL.send(ts_RSL_EST_REQ(g_chan_nr, ts_RslLinkID_DCCH(sapi)));</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_SABM(sapi, ?, ?, ''O)));</span><br><span style="color: hsl(120, 100%, 40%);">+        [] LAPDM.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* send erroneous response to SABM */</span><br><span style="color: hsl(120, 100%, 40%);">+ LAPDM.send(t_PH_DATA(0, false, err_frame.lapdm));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* expect a SABM retransmission of the BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+ timer T := 3.0;</span><br><span style="color: hsl(120, 100%, 40%);">+       T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_SABM(sapi, ?, ?, ''O))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_UI(0, ?, ''O))) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive(t_PH_DATA(0, false, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected LAPDm frame instead of SABM after sending ",</span><br><span style="color: hsl(120, 100%, 40%);">+                     err_frame.name);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for SABM retransmission after sending ",</span><br><span style="color: hsl(120, 100%, 40%);">+                     err_frame.name);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fp_common_fini();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_sabm_invalid_resp(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       const integer sapi := 3; /* BTS may not establish SAPI=0 outbound */</span><br><span style="color: hsl(120, 100%, 40%);">+  var LapdmNamedFrame err_frame[3] := {</span><br><span style="color: hsl(120, 100%, 40%);">+         { "I", valueof(ts_LAPDm_I(sapi, c_r := cr_MO_CMD, p := true, nr := 0, ns := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        l3 := '01020304'O)) },</span><br><span style="color: hsl(120, 100%, 40%);">+              { "RR", valueof(ts_LAPDm_RR(sapi, c_r := cr_MO_CMD, p := true, nr := 0)) },</span><br><span style="color: hsl(120, 100%, 40%);">+         { "REJ" , valueof(ts_LAPDm_REJ(sapi, c_r := cr_MO_CMD, p := true, nr := 0)) }</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i := 0; i < lengthof(err_frame); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          f_TC_sabm_invalid_resp2(id, err_frame[i])</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sabm_invalid_resp() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_testmatrix_each_chan(pars, refers(f_TC_sabm_invalid_resp));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test that the BTS will not re-transmit SABM frames after receiving a DM response,</span><br><span style="color: hsl(120, 100%, 40%);">+ * inspired from 3GPP TS 51.010-1 Section 25.2.1.1.3 */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_sabm_dm(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    const integer sapi := 3; /* BTS may not establish SAPI=0 outbound */</span><br><span style="color: hsl(120, 100%, 40%);">+  fp_common_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Establish Request via RSL; Expect SABM on LAPDm side */</span><br><span style="color: hsl(120, 100%, 40%);">+    LAPDM.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+  RSL.send(ts_RSL_EST_REQ(g_chan_nr, ts_RslLinkID_DCCH(sapi)));</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_SABM(sapi, ?, ?, ''O)));</span><br><span style="color: hsl(120, 100%, 40%);">+        [] LAPDM.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* send DM response to SABM */</span><br><span style="color: hsl(120, 100%, 40%);">+        RSL.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+    LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_DM(sapi, c_r:=cr_MO_RSP, f:=true)));</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSL.receive(tr_RSL_REL_IND(g_chan_nr, tr_RslLinkID_DCCH(sapi)));</span><br><span style="color: hsl(120, 100%, 40%);">+   [] RSL.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* expect no SABM retransmission of the BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+        timer T := 3.0;</span><br><span style="color: hsl(120, 100%, 40%);">+       T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_SABM(sapi, ?, ?, ''O))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Received unexpected SABM retransmission");</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_UI(0, ?, ''O))) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive(t_PH_DATA(0, false, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected LAPDm frame");</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fp_common_fini();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sabm_dm() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_testmatrix_each_chan(pars, refers(f_TC_sabm_dm));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test the full LAPDm establishment while simulating the loss of the initial SABM or UA</span><br><span style="color: hsl(120, 100%, 40%);">+ * frame, requiring the BTS to re-transmit one SABM and then following up all the way to</span><br><span style="color: hsl(120, 100%, 40%);">+ * dedicated mode; inspired by 3GPP TS 51.010-1 25.2.1.2.2  */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_establish_ign_first_sabm(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        const integer sapi := 3; /* BTS may not establish SAPI=0 outbound */</span><br><span style="color: hsl(120, 100%, 40%);">+  var integer num_sabm := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    var RslLinkId link_id := valueof(ts_RslLinkID_DCCH(sapi));</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T := 3.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     fp_common_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Establish Request via RSL */</span><br><span style="color: hsl(120, 100%, 40%);">+       LAPDM.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+  RSL.send(ts_RSL_EST_REQ(g_chan_nr, link_id));</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Expect two SABM (retransmit) */</span><br><span style="color: hsl(120, 100%, 40%);">+    T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_SABM(sapi, ?, ?, ''O))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               num_sabm := num_sabm + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (num_sabm < 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* send UA response to SABM */</span><br><span style="color: hsl(120, 100%, 40%);">+        RSL.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+    LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_UA(sapi, c_r:=cr_MO_RSP, f:=true, l3:=''O)));</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSL.receive(tr_RSL_EST_CONF(g_chan_nr, link_id));</span><br><span style="color: hsl(120, 100%, 40%);">+  [] RSL.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Send I frame from BTS to MS */</span><br><span style="color: hsl(120, 100%, 40%);">+     var octetstring l3 := f_rnd_octstring(10);</span><br><span style="color: hsl(120, 100%, 40%);">+    RSL.send(ts_RSL_DATA_REQ(g_chan_nr, link_id, l3));</span><br><span style="color: hsl(120, 100%, 40%);">+    alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_I(sapi, c_r:=cr_MT_CMD, p:=false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       nr:=0, ns:=0, l3:=l3)));</span><br><span style="color: hsl(120, 100%, 40%);">+      [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_UI(0, ?, ''O))) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive(t_PH_DATA(0, true, ?)) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+   [] LAPDM.receive { setverdict(fail, "Unexpected LAPDm received"); }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Send RR frame in response */</span><br><span style="color: hsl(120, 100%, 40%);">+       LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_RR(sapi, c_r:=cr_MO_RSP, p:=false, nr:=1)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* expect idle UI Frame from BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+   alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_UI(0, ?, ''O))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive(t_PH_DATA(0, true, ?)) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+   [] LAPDM.receive { setverdict(fail, "Unexpected LAPDm received"); }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fp_common_fini();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_establish_ign_first_sabm() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_testmatrix_each_chan(pars, refers(f_TC_establish_ign_first_sabm));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* ignore all SACCH frames */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_lapdm_acch() runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] LAPDM.receive(t_PH_DATA(0, true, ?)) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+/* ignore all LAPDm idle frames (UI) */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_lapdm_idle() runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_UI(0, ?, ''O))) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+/* ignore all measurement reports */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_rsl_meas_rep() runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      [] RSL.receive(tr_RSL_MEAS_RES(g_chan_nr)) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+/* fail if we receive an RSL ERROR IND */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_rsl_fail_err() runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    var RSL_Message rx_rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+       [] RSL.receive(tr_RSL_ERROR_IND(g_chan_nr, ?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Received RSL ERROR IND ", rx_rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+/* all of the above */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_ignore_background() runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       [] as_lapdm_acch();</span><br><span style="color: hsl(120, 100%, 40%);">+   [] as_lapdm_idle();</span><br><span style="color: hsl(120, 100%, 40%);">+   [] as_rsl_meas_rep();</span><br><span style="color: hsl(120, 100%, 40%);">+ [] as_rsl_fail_err();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test the operation of Layer 2 sequence numbering.</span><br><span style="color: hsl(120, 100%, 40%);">+ * dedicated mode; inspired by 3GPP TS 51.010-1 25.2.2.1  */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_iframe_seq_and_ack(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    const integer sapi := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      var RslLinkId link_id := valueof(ts_RslLinkID_DCCH(sapi));</span><br><span style="color: hsl(120, 100%, 40%);">+    var octetstring l3 := f_rnd_octstring(18);</span><br><span style="color: hsl(120, 100%, 40%);">+    var default d;</span><br><span style="color: hsl(120, 100%, 40%);">+        timer T := 3.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     fp_common_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* some common altstep for meas res and other background noise */</span><br><span style="color: hsl(120, 100%, 40%);">+     d := activate(as_ignore_background());</span><br><span style="color: hsl(120, 100%, 40%);">+        RSL.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+    LAPDM.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* MO Establish Request via LADPm: SAPI = 0, C = 0, P = 1, M = 0, 0 ≤ L ≤ N201.. */</span><br><span style="color: hsl(120, 100%, 40%);">+       LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_SABM(sapi, c_r:=cr_MO_CMD, p:=true, l3:=l3)));</span><br><span style="color: hsl(120, 100%, 40%);">+        RSL.receive(tr_RSL_EST_IND(g_chan_nr, link_id, l3));</span><br><span style="color: hsl(120, 100%, 40%);">+  /* UA: SAPI = 0, R = 0, F = 1, M = 0, L = L of SABM. */</span><br><span style="color: hsl(120, 100%, 40%);">+       LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_UA(sapi, cr_MT_RSP, f:=true, l3:=l3)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var integer last_ns_rx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (var integer i := 0; i < 10; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var octetstring l3_mo := f_rnd_octstring(12);</span><br><span style="color: hsl(120, 100%, 40%);">+         var octetstring l3_mt := f_rnd_octstring(12);</span><br><span style="color: hsl(120, 100%, 40%);">+         var LAPDm_ph_data pd;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               log("Starting iteration ", i);</span><br><span style="color: hsl(120, 100%, 40%);">+              /* MT I frame */</span><br><span style="color: hsl(120, 100%, 40%);">+              RSL.send(ts_RSL_DATA_REQ(g_chan_nr, link_id, l3_mt));</span><br><span style="color: hsl(120, 100%, 40%);">+         alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         /* SAPI = 0, R = 1, F = 0, M = 0, L = 0. */</span><br><span style="color: hsl(120, 100%, 40%);">+           [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_RR(sapi, c_r:=cr_MT_RSP, p:=false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               nr:=i mod 8))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     log("Ignoring RR in iteration ", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                        repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* SAPI = 0, C = 1, P = 0, M = 0, 0 ≤ L ≤ N201. */</span><br><span style="color: hsl(120, 100%, 40%);">+                [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_I(sapi, c_r:=cr_MT_CMD, p:=false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               nr:=i mod 8, ns:=i mod 8,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             l3:=l3_mt))) -> value pd {</span><br><span style="color: hsl(120, 100%, 40%);">+                 last_ns_rx := pd.lapdm.ab.ctrl.i.n_s;</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* respond with MO I-frame: SAPI = 0, C = 0, P = 0, M = 0, 0 <= L <= N201. */</span><br><span style="color: hsl(120, 100%, 40%);">+           LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_I(sapi, c_r:=cr_MO_CMD, p:=false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       nr:=(last_ns_rx+1)mod 8,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      ns:=i mod 8, l3 := l3_mo)));</span><br><span style="color: hsl(120, 100%, 40%);">+                RSL.receive(tr_RSL_DATA_IND(g_chan_nr, link_id, l3_mo));</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("Completed iteration");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       deactivate(d);</span><br><span style="color: hsl(120, 100%, 40%);">+        fp_common_fini();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_iframe_seq_and_ack() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_testmatrix_each_chan(pars, refers(f_TC_iframe_seq_and_ack));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* To test that the BTS is able to respond to I frames whilst in the timer recovery state.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Inspired by 3GPP TS 51.010-1 25.2.2.2  */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+  1) The BTS is brought into the multiple frame established state</span><br><span style="color: hsl(120, 100%, 40%);">+  2) The MS sends an L3 Request asking for IMEI to the MS.</span><br><span style="color: hsl(120, 100%, 40%);">+  3) The BTS shall respond with a RR frame though this may be incorporated with</span><br><span style="color: hsl(120, 100%, 40%);">+     the L3 Response I frame.  The MS does not respond to the I frame.</span><br><span style="color: hsl(120, 100%, 40%);">+  4) The BTS shall wait for expiry of timer T200 and then repeat the I frame but</span><br><span style="color: hsl(120, 100%, 40%);">+     with the P bit set to 1.</span><br><span style="color: hsl(120, 100%, 40%);">+  5) The MS then sends a valid L3 Request I frame asking for IMEI which</span><br><span style="color: hsl(120, 100%, 40%);">+     does not acknowledge receipt of the I frame from the BTS.</span><br><span style="color: hsl(120, 100%, 40%);">+On the FACCH the BTS may send an RR frame acknowledging the I frame.</span><br><span style="color: hsl(120, 100%, 40%);">+  6) The BTS shall repeat the I frame, this frame will acknowledge receipt of</span><br><span style="color: hsl(120, 100%, 40%);">+     the second I frame from the MS.</span><br><span style="color: hsl(120, 100%, 40%);">+  7) The MS then acknowledges receipt of the MS I frame by sending a RR frame.</span><br><span style="color: hsl(120, 100%, 40%);">+  8) The BTS shall send the next I frame. The MS acknowledges this I frame.</span><br><span style="color: hsl(120, 100%, 40%);">+*/</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_iframe_timer_recovery(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      const integer sapi := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      var RslLinkId link_id := valueof(ts_RslLinkID_DCCH(sapi));</span><br><span style="color: hsl(120, 100%, 40%);">+    var default d;</span><br><span style="color: hsl(120, 100%, 40%);">+        timer T := 3.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     fp_common_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* some common altstep for meas res and other background noise */</span><br><span style="color: hsl(120, 100%, 40%);">+     d := activate(as_ignore_background());</span><br><span style="color: hsl(120, 100%, 40%);">+        RSL.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+    LAPDM.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring l3_mo := f_rnd_octstring(12);</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring l3_mt := f_rnd_octstring(12);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /*  1) The BTS is brought into the multiple frame established state */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* MO Establish Request via LADPm: SAPI = 0, C = 0, P = 1, M = 0, 0 ≤ L ≤ N201.. */</span><br><span style="color: hsl(120, 100%, 40%);">+       LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_SABM(sapi, c_r:=cr_MO_CMD, p:=true, l3:=l3_mo)));</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL.receive(tr_RSL_EST_IND(g_chan_nr, link_id, l3_mo));</span><br><span style="color: hsl(120, 100%, 40%);">+       /* UA: SAPI = 0, R = 0, F = 1, M = 0, L = L of SABM. */</span><br><span style="color: hsl(120, 100%, 40%);">+       LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_UA(sapi, cr_MT_RSP, f:=true, l3:=l3_mo)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* 2) The MS sends an L3 Request to the BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+        l3_mo := f_rnd_octstring(18);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SAPI = 0, C = 1, P = 0, M = 0, 0 ≤ L ≤ N201, N(S) = 0, N(R) = 0.  * */</span><br><span style="color: hsl(120, 100%, 40%);">+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_I(sapi, c_r:=cr_MO_CMD, p:=false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               nr:=0, ns:=0, l3:=l3_mo)));</span><br><span style="color: hsl(120, 100%, 40%);">+ RSL.receive(tr_RSL_DATA_IND(g_chan_nr, link_id, l3_mo));</span><br><span style="color: hsl(120, 100%, 40%);">+      /* 3) The BTS shall respond with a RR frame though this may be incorporated with</span><br><span style="color: hsl(120, 100%, 40%);">+         the L3 Response I frame.  The MS does not respond to the I frame. */</span><br><span style="color: hsl(120, 100%, 40%);">+       RSL.send(ts_RSL_DATA_REQ(g_chan_nr, link_id, l3_mt));</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SAPI = 0, R = 1, F = 0, M = 0, L = 0, N(R) = 1. */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_RR(sapi, c_r:=cr_MT_RSP, p:=false, nr:=1))) {</span><br><span style="color: hsl(120, 100%, 40%);">+           repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* SAPI = 0, C = 0, P = 0, M = 0, 0 ≤ L ≤ N201, N(R) = 1, N(S) = 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+     [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_I(sapi, c_r:=cr_MT_CMD, p:=false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       nr:=1, ns:=0, l3:=l3_mt)));</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 4) The BTS shall wait for expiry of timer T200 and then repeat the I frame but</span><br><span style="color: hsl(120, 100%, 40%);">+           with the P bit set to 1. */</span><br><span style="color: hsl(120, 100%, 40%);">+     /* SAPI = 0, C = 0, P = 1, M = 0, 0 ≤ L ≤ N201, N(R) = 1, N(S) = 0. * */</span><br><span style="color: hsl(120, 100%, 40%);">+  LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_I(sapi, c_r:=cr_MT_CMD, p:=true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                nr:=1, ns:=0, l3:=l3_mt)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* 5) The MS then sends a valid L3 Request I frame asking for IMEI which</span><br><span style="color: hsl(120, 100%, 40%);">+            does not acknowledge receipt of the I frame from the BTS. */</span><br><span style="color: hsl(120, 100%, 40%);">+    /* SAPI = 0, C = 1, P = 0, M = 0, 0 ≤ L ≤ N201, N(S) = 1, N(R) = 0.  * */</span><br><span style="color: hsl(120, 100%, 40%);">+ LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_I(sapi, c_r:=cr_MO_CMD, p:=false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               nr:=0, ns:=1, l3 := l3_mo)));</span><br><span style="color: hsl(120, 100%, 40%);">+       RSL.receive(tr_RSL_DATA_IND(g_chan_nr, link_id, l3_mo));</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* On the FACCH the BTS may send an RR frame acknowledging the I frame. */</span><br><span style="color: hsl(120, 100%, 40%);">+    /* SAPI = 0, R = 1, F = 0, M = 0, L = 0, N(R) = 2. */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_RR(sapi, c_r:=cr_MT_RSP, p:=false, nr:=2))) {</span><br><span style="color: hsl(120, 100%, 40%);">+           repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* 6) The BTS shall repeat the I frame, this frame will acknowledge</span><br><span style="color: hsl(120, 100%, 40%);">+         receipt of the second I frame from the MS. */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* SAPI = 0, C = 0, P = 1, M = 0, 0 ≤ L ≤ N201, N(R) = 2, N(S) = 0. * */</span><br><span style="color: hsl(120, 100%, 40%);">+  [] LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_I(sapi, c_r:=cr_MT_CMD, p:=true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     nr:=2, ns:=0, l3:=l3_mt)));</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 7) The MS then acknowledges receipt of the BTS I frame by sending a RR * frame. */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SAPI = 0, R = 0, F = 1, 0, M = 0, L = 0, N(R) = 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+       LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_RR(sapi, c_r:=cr_MO_RSP, p:=true, nr:=1)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 8) The BTS shall send the next I frame. The MS acknowledges this I frame. */</span><br><span style="color: hsl(120, 100%, 40%);">+       l3_mt := f_rnd_octstring(16);</span><br><span style="color: hsl(120, 100%, 40%);">+ RSL.send(ts_RSL_DATA_REQ(g_chan_nr, link_id, l3_mt));</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SAPI = 0, C = 0, P = 0, M = 0, 0 ≤ L ≤ N201, N(R) = 2, N(S) = 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+     LAPDM.receive(t_PH_DATA(0, false, tr_LAPDm_I(sapi, c_r:=cr_MT_CMD, p:=false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               nr:=2, ns:=1, l3:=l3_mt)));</span><br><span style="color: hsl(120, 100%, 40%);">+      LAPDM.send(t_PH_DATA(0, false, ts_LAPDm_RR(sapi, c_r:=cr_MO_RSP, p:=true, nr:=2)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ deactivate(d);</span><br><span style="color: hsl(120, 100%, 40%);">+        fp_common_fini();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_iframe_timer_recovery() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var ConnHdlrPars pars := valueof(t_Pars(t_RslChanNr_Bm(1), ts_RSL_ChanMode_SIGN));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_testmatrix_each_chan(pars, refers(f_TC_iframe_timer_recovery));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> control {</span><br><span>      execute(TC_foo());</span><br><span>   execute(TC_sabm_ua_dcch_sapi0());</span><br><span>@@ -260,6 +704,12 @@</span><br><span>     execute(TC_sabm_ua_dcch_sapi4());</span><br><span>    execute(TC_sabm_contention());</span><br><span>       execute(TC_sabm_retransmit());</span><br><span style="color: hsl(120, 100%, 40%);">+        execute(TC_sabm_retransmit_bts());</span><br><span style="color: hsl(120, 100%, 40%);">+    execute(TC_sabm_invalid_resp());</span><br><span style="color: hsl(120, 100%, 40%);">+      execute(TC_sabm_dm());</span><br><span style="color: hsl(120, 100%, 40%);">+        execute(TC_establish_ign_first_sabm());</span><br><span style="color: hsl(120, 100%, 40%);">+       execute(TC_iframe_seq_and_ack());</span><br><span style="color: hsl(120, 100%, 40%);">+     execute(TC_iframe_timer_recovery());</span><br><span> }</span><br><span> </span><br><span> }</span><br><span>diff --git a/library/LAPDm_Types.ttcn b/library/LAPDm_Types.ttcn</span><br><span>index a1ca5fe..577c9bd 100644</span><br><span>--- a/library/LAPDm_Types.ttcn</span><br><span>+++ b/library/LAPDm_Types.ttcn</span><br><span>@@ -105,7 +105,7 @@</span><br><span>                s := { n_r := nr, p_f := pf, s := '00'B }</span><br><span>    };</span><br><span>   template (value) LapdmCtrl ts_LapdmCtrlRR(uint3_t nr, boolean pf) := {</span><br><span style="color: hsl(0, 100%, 40%);">-          s := { n_r := nr, p_f := pf, s := '00'B }</span><br><span style="color: hsl(120, 100%, 40%);">+             s := { n_r := nr, p_f := pf, s := '00'B, spare := '01'B }</span><br><span>    };</span><br><span> </span><br><span>       template LapdmCtrl tr_LapdmCtrlRNR(template uint3_t nr, template boolean pf) modifies tr_LapdmCtrlS := {</span><br><span>@@ -115,6 +115,10 @@</span><br><span>      template LapdmCtrl tr_LapdmCtrlREJ(template uint3_t nr, template boolean pf) modifies tr_LapdmCtrlS := {</span><br><span>             s := { n_r := nr, p_f := pf, s := '10'B }</span><br><span>    };</span><br><span style="color: hsl(120, 100%, 40%);">+    template (value) LapdmCtrl ts_LapdmCtrlREJ(uint3_t nr, boolean pf)  := {</span><br><span style="color: hsl(120, 100%, 40%);">+              s := { n_r := nr, p_f := pf, s := '10'B, spare := '01'B }</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span>     template LapdmCtrl tr_LapdmCtrlSABM(template boolean p) := {</span><br><span>                 u := { u := '001'B, p_f := p, u2 := '11'B, spare := '11'B }</span><br><span>@@ -126,6 +130,9 @@</span><br><span>    template LapdmCtrl tr_LapdmCtrlDM(template boolean f) := {</span><br><span>           u := { u := '000'B, p_f := f, u2 := '11'B, spare := '11'B }</span><br><span>  };</span><br><span style="color: hsl(120, 100%, 40%);">+    template (value) LapdmCtrl ts_LapdmCtrlDM(boolean f) := {</span><br><span style="color: hsl(120, 100%, 40%);">+             u := { u := '000'B, p_f := f, u2 := '11'B, spare := '11'B }</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span> </span><br><span>       template LapdmCtrl tr_LapdmCtrlUI(template boolean p := false) := {</span><br><span>          u := { u := '000'B, p_f := p, u2 := '00'B, spare := '11'B }</span><br><span>@@ -261,6 +268,28 @@</span><br><span>           }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) LapdmFrame ts_LAPDm_DM(LapdmSapi sapi, boolean c_r, boolean f) := {</span><br><span style="color: hsl(120, 100%, 40%);">+          ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+                       addr := ts_LapdmAddr(sapi, c_r),</span><br><span style="color: hsl(120, 100%, 40%);">+                      ctrl := ts_LapdmCtrlDM(f),</span><br><span style="color: hsl(120, 100%, 40%);">+                    len := 0, /* overwritten in encoder */</span><br><span style="color: hsl(120, 100%, 40%);">+                        m := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                   el := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                      payload := ''O</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     template LapdmFrame tr_LAPDm_DM(template LapdmSapi sapi, template boolean c_r,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        template boolean f) := {</span><br><span style="color: hsl(120, 100%, 40%);">+              ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+                       addr := tr_LapdmAddr(sapi, c_r),</span><br><span style="color: hsl(120, 100%, 40%);">+                      ctrl := tr_LapdmCtrlDM(f),</span><br><span style="color: hsl(120, 100%, 40%);">+                    len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                     m := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                   el := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                      payload := ''O</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  template LapdmFrame ts_LAPDm_DISC(LapdmSapi sapi, boolean c_r, boolean p) := {</span><br><span>               ab := {</span><br><span>                      addr := ts_LapdmAddr(sapi, c_r),</span><br><span>@@ -368,6 +397,29 @@</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ template LapdmFrame tr_LAPDm_REJ(template LapdmSapi sapi, template boolean c_r,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        template boolean p, template uint3_t nr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+                ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+                       addr := tr_LapdmAddr(sapi, c_r),</span><br><span style="color: hsl(120, 100%, 40%);">+                      ctrl := tr_LapdmCtrlREJ(nr, p),</span><br><span style="color: hsl(120, 100%, 40%);">+                       len := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                     m := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                   el := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                      payload := ''O</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     template (value) LapdmFrame ts_LAPDm_REJ(LapdmSapi sapi, boolean c_r,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          boolean p, uint3_t nr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+          ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+                       addr := ts_LapdmAddr(sapi, c_r),</span><br><span style="color: hsl(120, 100%, 40%);">+                      ctrl := ts_LapdmCtrlREJ(nr, p),</span><br><span style="color: hsl(120, 100%, 40%);">+                       len := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                     m := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                   el := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                      payload := ''O</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> </span><br><span> } with { encode "RAW"; /*variant "FIELDORDER(msb)" */}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14341">change 14341</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14341"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I4e1136c0c0f10d5bc8d01e826ae5d92f17a0b2aa </div>
<div style="display:none"> Gerrit-Change-Number: 14341 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-MessageType: merged </div>