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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts: Remove one indent lvel from BTS_Tests_LAPDm.ttcn<br><br>Change-Id: I4637393df9989a97a4d70f08bd334d0f8cfd2284<br>---<br>M bts/BTS_Tests_LAPDm.ttcn<br>1 file changed, 233 insertions(+), 231 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bts/BTS_Tests_LAPDm.ttcn b/bts/BTS_Tests_LAPDm.ttcn</span><br><span>index a5bcc56..0792863 100644</span><br><span>--- a/bts/BTS_Tests_LAPDm.ttcn</span><br><span>+++ b/bts/BTS_Tests_LAPDm.ttcn</span><br><span>@@ -1,259 +1,261 @@</span><br><span> module BTS_Tests_LAPDm {</span><br><span style="color: hsl(0, 100%, 40%);">-     import from GSM_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-      import from Osmocom_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-  import from LAPDm_RAW_PT all;</span><br><span style="color: hsl(0, 100%, 40%);">-   import from LAPDm_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-    import from BTS_Tests all;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* test that use exclusively only LAPDm over L1CTL */</span><br><span style="color: hsl(0, 100%, 40%);">-   type component lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-          port LAPDm_PT LAPDM;</span><br><span style="color: hsl(0, 100%, 40%);">-            var lapdm_CT lapdm_component;</span><br><span style="color: hsl(0, 100%, 40%);">-   };</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from LAPDm_RAW_PT all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from LAPDm_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BTS_Tests all;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* contrary to BTS_Tests.ttcn, we use LAPDm_PT here, a convenience wrapper</span><br><span style="color: hsl(0, 100%, 40%);">-       * 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(120, 100%, 40%);">+/* test that use exclusively only LAPDm over L1CTL */</span><br><span style="color: hsl(120, 100%, 40%);">+type component lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   port LAPDm_PT LAPDM;</span><br><span style="color: hsl(120, 100%, 40%);">+  var lapdm_CT lapdm_component;</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%);">+/* contrary to BTS_Tests.ttcn, we use LAPDm_PT here, a convenience wrapper</span><br><span style="color: hsl(120, 100%, 40%);">+ * around L1CTL to perform encode/decode of abstract LAPDm frames */</span><br><span style="color: hsl(120, 100%, 40%);">+type component lapdm_bts_CT extends lapdm_test_CT, test_CT {</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%);">+function f_init() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* create the LAPDm component */</span><br><span style="color: hsl(120, 100%, 40%);">+      lapdm_component := lapdm_CT.create;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* connect our own LAPDM port to the LAPDM Service Provider of the LAPDm component */</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(self:LAPDM, lapdm_component:LAPDM_SP);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* connect the LAPDm compoent's lower-side port to the system L1CTL port (which is internally</span><br><span style="color: hsl(120, 100%, 40%);">+      * connected to the Unix Domain Socket test port */</span><br><span style="color: hsl(120, 100%, 40%);">+   map(lapdm_component:L1CTL, system:L1CTL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* start the LAPDm parallel component calling it's local function LAPDmStart */</span><br><span style="color: hsl(120, 100%, 40%);">+   lapdm_component.start(LAPDmStart());</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%);">+/* master function establishing a dedicated radio channel (takes care of RACH/IMM.ASS handling) */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_establish_dcch() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var BCCH_tune_req tune_req := { arfcn := { false, 871 }, combined_ccch := true };</span><br><span style="color: hsl(120, 100%, 40%);">+     var DCCH_establish_req est_req := { ra := 23 };</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(est_req);</span><br><span style="color: hsl(120, 100%, 40%);">+  LAPDM.receive(DCCH_establish_res:?);</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%);">+/* helper function releasing dedicated radio channel physically (no Um signaling!) */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_release_dcch() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var DCCH_release_req rel_req := {};</span><br><span style="color: hsl(120, 100%, 40%);">+   LAPDM.send(rel_req);</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 LAPDm_ph_data t_PH_DATA(template GsmSapi sapi, template boolean sacch, template LapdmFrame frame) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    sacch := sacch,</span><br><span style="color: hsl(120, 100%, 40%);">+       sapi := sapi,</span><br><span style="color: hsl(120, 100%, 40%);">+ lapdm := frame</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+/* template for a valid SABM frame */</span><br><span style="color: hsl(120, 100%, 40%);">+template LapdmFrame LAPDm_B_SABM(template GsmSapi sapi, octetstring payload)  := {</span><br><span style="color: hsl(120, 100%, 40%);">+  ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+               addr := tr_LapdmAddr(sapi, false),</span><br><span style="color: hsl(120, 100%, 40%);">+            ctrl := tr_LapdmCtrlSABM(true),</span><br><span style="color: hsl(120, 100%, 40%);">+               len := lengthof(payload),</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 := payload</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        function f_init() runs on lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* create the LAPDm component */</span><br><span style="color: hsl(0, 100%, 40%);">-                lapdm_component := lapdm_CT.create;</span><br><span style="color: hsl(0, 100%, 40%);">-             /* connect our own LAPDM port to the LAPDM Service Provider of the LAPDm component */</span><br><span style="color: hsl(0, 100%, 40%);">-           connect(self:LAPDM, lapdm_component:LAPDM_SP);</span><br><span style="color: hsl(0, 100%, 40%);">-          /* connect the LAPDm compoent's lower-side port to the system L1CTL port (which is internally</span><br><span style="color: hsl(0, 100%, 40%);">-                * connected to the Unix Domain Socket test port */</span><br><span style="color: hsl(0, 100%, 40%);">-             map(lapdm_component:L1CTL, system:L1CTL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* start the LAPDm parallel component calling it's local function LAPDmStart */</span><br><span style="color: hsl(0, 100%, 40%);">-             lapdm_component.start(LAPDmStart());</span><br><span style="color: hsl(120, 100%, 40%);">+/* template for a valid UA frame */</span><br><span style="color: hsl(120, 100%, 40%);">+template LapdmFrame tr_LAPDm_B_UA(template GsmSapi sapi, template octetstring payload)  := {</span><br><span style="color: hsl(120, 100%, 40%);">+       ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+               addr := tr_LapdmAddr(sapi, false),</span><br><span style="color: hsl(120, 100%, 40%);">+            ctrl := tr_LapdmCtrlUA(true),</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 := payload</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        /* master function establishing a dedicated radio channel (takes care of RACH/IMM.ASS handling) */</span><br><span style="color: hsl(0, 100%, 40%);">-      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(0, 100%, 40%);">-               var DCCH_establish_req est_req := { ra := 23 };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         LAPDM.send(tune_req);</span><br><span style="color: hsl(0, 100%, 40%);">-           LAPDM.send(est_req);</span><br><span style="color: hsl(0, 100%, 40%);">-            LAPDM.receive(DCCH_establish_res:?);</span><br><span style="color: hsl(120, 100%, 40%);">+/* template for a valid UA frame */</span><br><span style="color: hsl(120, 100%, 40%);">+template LapdmFrame LAPDm_B_UA(template GsmSapi sapi, octetstring payload)  := {</span><br><span style="color: hsl(120, 100%, 40%);">+   ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+               addr := tr_LapdmAddr(sapi, false),</span><br><span style="color: hsl(120, 100%, 40%);">+            ctrl := tr_LapdmCtrlUA(true),</span><br><span style="color: hsl(120, 100%, 40%);">+         len := lengthof(payload),</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 := payload</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        /* helper function releasing dedicated radio channel physically (no Um signaling!) */</span><br><span style="color: hsl(0, 100%, 40%);">-   function f_release_dcch() runs on lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-               var DCCH_release_req rel_req := {};</span><br><span style="color: hsl(0, 100%, 40%);">-             LAPDM.send(rel_req);</span><br><span style="color: hsl(120, 100%, 40%);">+/* template for a valid UI frame */</span><br><span style="color: hsl(120, 100%, 40%);">+template LapdmFrame LAPDm_B_UI(template GsmSapi sapi, octetstring payload)  := {</span><br><span style="color: hsl(120, 100%, 40%);">+   ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+               addr := tr_LapdmAddr(sapi, true),</span><br><span style="color: hsl(120, 100%, 40%);">+             ctrl := tr_LapdmCtrlUI(false),</span><br><span style="color: hsl(120, 100%, 40%);">+                len := lengthof(payload),</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 := payload</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        template LAPDm_ph_data t_PH_DATA(template GsmSapi sapi, template boolean sacch, template LapdmFrame frame) := {</span><br><span style="color: hsl(0, 100%, 40%);">-         sacch := sacch,</span><br><span style="color: hsl(0, 100%, 40%);">-         sapi := sapi,</span><br><span style="color: hsl(0, 100%, 40%);">-           lapdm := frame</span><br><span style="color: hsl(120, 100%, 40%);">+template LapdmFrame t_nopayload(template GsmSapi sapi) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+               addr := tr_LapdmAddr(sapi, true),</span><br><span style="color: hsl(120, 100%, 40%);">+             ctrl := ?,</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>       }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* template for a valid SABM frame */</span><br><span style="color: hsl(0, 100%, 40%);">-   template LapdmFrame LAPDm_B_SABM(template GsmSapi sapi, octetstring payload)  := {</span><br><span style="color: hsl(0, 100%, 40%);">-              ab := {</span><br><span style="color: hsl(0, 100%, 40%);">-                 addr := tr_LapdmAddr(sapi, false),</span><br><span style="color: hsl(0, 100%, 40%);">-                      ctrl := tr_LapdmCtrlSABM(true),</span><br><span style="color: hsl(0, 100%, 40%);">-                 len := lengthof(payload),</span><br><span style="color: hsl(0, 100%, 40%);">-                       m := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     el := 1,</span><br><span style="color: hsl(0, 100%, 40%);">-                        payload := payload</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 LAPDm_B_DISC(template GsmSapi sapi) modifies t_nopayload := {</span><br><span style="color: hsl(120, 100%, 40%);">+    ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+               ctrl := tr_LapdmCtrlDISC(true)</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%);">+template LapdmFrame LAPDm_B_RR(template GsmSapi sapi, template uint3_t nr) modifies t_nopayload := {</span><br><span style="color: hsl(120, 100%, 40%);">+  ab := {</span><br><span style="color: hsl(120, 100%, 40%);">+               ctrl := tr_LapdmCtrlRR(nr, false)</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 style="color: hsl(120, 100%, 40%);">+function f_test_sabm_results_in_ua(uint8_t sapi, boolean use_sacch, octetstring payload) runs on lapdm_test_CT return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+     var LAPDm_ph_data phd;</span><br><span style="color: hsl(120, 100%, 40%);">+        var boolean result := false;</span><br><span style="color: hsl(120, 100%, 40%);">+  timer T := 5.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_establish_dcch();</span><br><span style="color: hsl(120, 100%, 40%);">+   LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_SABM(sapi, payload)));</span><br><span style="color: hsl(120, 100%, 40%);">+  log("====> expecting ", t_PH_DATA(sapi, use_sacch, LAPDm_B_UA(sapi, payload)));</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(?, use_sacch, LAPDm_B_UA(sapi, payload))) { result := true; }</span><br><span style="color: hsl(120, 100%, 40%);">+              [] LAPDM.receive(t_PH_DATA(?, use_sacch, ?)) -> value phd { log("Other msg on DCH: ", phd); repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+            [] LAPDM.receive(t_PH_DATA(?, ?, ?)) -> value phd { log("Other PH-DATA: ", phd); 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%);">+     LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_RR(sapi, 0)));</span><br><span style="color: hsl(120, 100%, 40%);">+  f_release_dcch();</span><br><span style="color: hsl(120, 100%, 40%);">+     return result;</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_ua_dcch_sapi0() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not f_test_sabm_results_in_ua(0, false, 'FEFE'O)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</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%);">+testcase TC_sabm_ua_dcch_sapi0_nopayload() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     if (f_test_sabm_results_in_ua(0, false, ''O)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Initial SABM/UA must contain L3 payload but BTS accepts without");</span><br><span style="color: hsl(120, 100%, 40%);">+        }</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%);">+testcase TC_sabm_ua_dcch_sapi3() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     if (f_test_sabm_results_in_ua(3, false, 'FEFE'O)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Initial SABM/UA must be on SAPI0, but BTS accepts SAPI=3");</span><br><span style="color: hsl(120, 100%, 40%);">+       }</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%);">+testcase TC_sabm_ua_dcch_sapi4() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     if (f_test_sabm_results_in_ua(4, false, 'FEFE'O)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Initial SABM/UA must be on SAPI0, but BTS accepts SAPI=4");</span><br><span style="color: hsl(120, 100%, 40%);">+       }</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%);">+testcase TC_sabm_contention() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var LAPDm_ph_data phd;</span><br><span style="color: hsl(120, 100%, 40%);">+        const octetstring payload := '0102030405'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   const GsmSapi sapi := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      const boolean use_sacch := false;</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T := 5.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_establish_dcch();</span><br><span style="color: hsl(120, 100%, 40%);">+   /* first frame is our real SABM */</span><br><span style="color: hsl(120, 100%, 40%);">+    LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_SABM(sapi, payload)));</span><br><span style="color: hsl(120, 100%, 40%);">+  /* second frame is a SABM with different payload, which BTS has to ignore according to 8.4.1.4 */</span><br><span style="color: hsl(120, 100%, 40%);">+     LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_SABM(sapi, 'ABCDEF'O)));</span><br><span style="color: hsl(120, 100%, 40%);">+        log("====> expecting ", t_PH_DATA(sapi, use_sacch, LAPDm_B_UA(sapi, payload)));</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(?, use_sacch, LAPDm_B_UA(sapi, payload))) { setverdict(pass); repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+            [] LAPDM.receive(t_PH_DATA(?, use_sacch, tr_LAPDm_B_UA(sapi, ?))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Second SABM was responded to during contention resolution");</span><br><span>             }</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>     }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_release_dcch();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        /* template for a valid UA frame */</span><br><span style="color: hsl(0, 100%, 40%);">-     template LapdmFrame tr_LAPDm_B_UA(template GsmSapi sapi, template octetstring payload)  := {</span><br><span style="color: hsl(0, 100%, 40%);">-            ab := {</span><br><span style="color: hsl(0, 100%, 40%);">-                 addr := tr_LapdmAddr(sapi, false),</span><br><span style="color: hsl(0, 100%, 40%);">-                      ctrl := tr_LapdmCtrlUA(true),</span><br><span style="color: hsl(0, 100%, 40%);">-                   len := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                       m := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     el := 1,</span><br><span style="color: hsl(0, 100%, 40%);">-                        payload := payload</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(120, 100%, 40%);">+/* we test that a re-transmitted SABM with identical payload will result in the retransmission of a</span><br><span style="color: hsl(120, 100%, 40%);">+  * UA. This is required during the contention resolution procedure as specified in 8.4.1.4 */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sabm_retransmit() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ const octetstring payload := '00FEFEDEADBEEF'O;</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not f_test_sabm_results_in_ua(0, false, payload)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "UA not received for first SABM");</span><br><span>        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* template for a valid UA frame */</span><br><span style="color: hsl(0, 100%, 40%);">-     template LapdmFrame LAPDm_B_UA(template GsmSapi sapi, octetstring payload)  := {</span><br><span style="color: hsl(0, 100%, 40%);">-                ab := {</span><br><span style="color: hsl(0, 100%, 40%);">-                 addr := tr_LapdmAddr(sapi, false),</span><br><span style="color: hsl(0, 100%, 40%);">-                      ctrl := tr_LapdmCtrlUA(true),</span><br><span style="color: hsl(0, 100%, 40%);">-                   len := lengthof(payload),</span><br><span style="color: hsl(0, 100%, 40%);">-                       m := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     el := 1,</span><br><span style="color: hsl(0, 100%, 40%);">-                        payload := payload</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not f_test_sabm_results_in_ua(0, false, payload)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "UA not received for second SABM");</span><br><span>       }</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        /* template for a valid UI frame */</span><br><span style="color: hsl(0, 100%, 40%);">-     template LapdmFrame LAPDm_B_UI(template GsmSapi sapi, octetstring payload)  := {</span><br><span style="color: hsl(0, 100%, 40%);">-                ab := {</span><br><span style="color: hsl(0, 100%, 40%);">-                 addr := tr_LapdmAddr(sapi, true),</span><br><span style="color: hsl(0, 100%, 40%);">-                       ctrl := tr_LapdmCtrlUI(false),</span><br><span style="color: hsl(0, 100%, 40%);">-                  len := lengthof(payload),</span><br><span style="color: hsl(0, 100%, 40%);">-                       m := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     el := 1,</span><br><span style="color: hsl(0, 100%, 40%);">-                        payload := payload</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       template LapdmFrame t_nopayload(template GsmSapi sapi) := {</span><br><span style="color: hsl(0, 100%, 40%);">-             ab := {</span><br><span style="color: hsl(0, 100%, 40%);">-                 addr := tr_LapdmAddr(sapi, true),</span><br><span style="color: hsl(0, 100%, 40%);">-                       ctrl := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                      len := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                       m := false,</span><br><span style="color: hsl(0, 100%, 40%);">-                     el := 1,</span><br><span style="color: hsl(0, 100%, 40%);">-                        payload := ''O</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       template LapdmFrame LAPDm_B_DISC(template GsmSapi sapi) modifies t_nopayload := {</span><br><span style="color: hsl(0, 100%, 40%);">-               ab := {</span><br><span style="color: hsl(0, 100%, 40%);">-                 ctrl := tr_LapdmCtrlDISC(true)</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       template LapdmFrame LAPDm_B_RR(template GsmSapi sapi, template uint3_t nr) modifies t_nopayload := {</span><br><span style="color: hsl(0, 100%, 40%);">-            ab := {</span><br><span style="color: hsl(0, 100%, 40%);">-                 ctrl := tr_LapdmCtrlRR(nr, false)</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       function f_test_sabm_results_in_ua(uint8_t sapi, boolean use_sacch, octetstring payload) runs on lapdm_test_CT return boolean {</span><br><span style="color: hsl(0, 100%, 40%);">-         var LAPDm_ph_data phd;</span><br><span style="color: hsl(0, 100%, 40%);">-          var boolean result := false;</span><br><span style="color: hsl(0, 100%, 40%);">-            timer T := 5.0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         f_establish_dcch();</span><br><span style="color: hsl(0, 100%, 40%);">-             LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_SABM(sapi, payload)));</span><br><span style="color: hsl(0, 100%, 40%);">-            log("====> expecting ", t_PH_DATA(sapi, use_sacch, LAPDm_B_UA(sapi, payload)));</span><br><span style="color: hsl(0, 100%, 40%);">-            T.start</span><br><span style="color: hsl(0, 100%, 40%);">-         alt {</span><br><span style="color: hsl(0, 100%, 40%);">-                   [] LAPDM.receive(t_PH_DATA(?, use_sacch, LAPDm_B_UA(sapi, payload))) { result := true; }</span><br><span style="color: hsl(0, 100%, 40%);">-                        [] LAPDM.receive(t_PH_DATA(?, use_sacch, ?)) -> value phd { log("Other msg on DCH: ", phd); repeat; }</span><br><span style="color: hsl(0, 100%, 40%);">-                      [] LAPDM.receive(t_PH_DATA(?, ?, ?)) -> value phd { log("Other PH-DATA: ", phd); repeat; }</span><br><span style="color: hsl(0, 100%, 40%);">-                 [] T.timeout { }</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-               LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_RR(sapi, 0)));</span><br><span style="color: hsl(0, 100%, 40%);">-            f_release_dcch();</span><br><span style="color: hsl(0, 100%, 40%);">-               return result;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       testcase TC_sabm_ua_dcch_sapi0() runs on lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-                f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-               if (not f_test_sabm_results_in_ua(0, false, 'FEFE'O)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 setverdict(fail);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       testcase TC_sabm_ua_dcch_sapi0_nopayload() runs on lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-              f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-               if (f_test_sabm_results_in_ua(0, false, ''O)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 setverdict(fail, "Initial SABM/UA must contain L3 payload but BTS accepts without");</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       testcase TC_sabm_ua_dcch_sapi3() runs on lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-                f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-               if (f_test_sabm_results_in_ua(3, false, 'FEFE'O)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     setverdict(fail, "Initial SABM/UA must be on SAPI0, but BTS accepts SAPI=3");</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       testcase TC_sabm_ua_dcch_sapi4() runs on lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-                f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-               if (f_test_sabm_results_in_ua(4, false, 'FEFE'O)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     setverdict(fail, "Initial SABM/UA must be on SAPI0, but BTS accepts SAPI=4");</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       testcase TC_sabm_contention() runs on lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-           var LAPDm_ph_data phd;</span><br><span style="color: hsl(0, 100%, 40%);">-          const octetstring payload := '0102030405'O;</span><br><span style="color: hsl(0, 100%, 40%);">-             const GsmSapi sapi := 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                const boolean use_sacch := false;</span><br><span style="color: hsl(0, 100%, 40%);">-               timer T := 5.0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               f_establish_dcch();</span><br><span style="color: hsl(0, 100%, 40%);">-             /* first frame is our real SABM */</span><br><span style="color: hsl(0, 100%, 40%);">-              LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_SABM(sapi, payload)));</span><br><span style="color: hsl(0, 100%, 40%);">-            /* second frame is a SABM with different payload, which BTS has to ignore according to 8.4.1.4 */</span><br><span style="color: hsl(0, 100%, 40%);">-               LAPDM.send(t_PH_DATA(sapi, use_sacch, LAPDm_B_SABM(sapi, 'ABCDEF'O)));</span><br><span style="color: hsl(0, 100%, 40%);">-          log("====> expecting ", t_PH_DATA(sapi, use_sacch, LAPDm_B_UA(sapi, payload)));</span><br><span style="color: hsl(0, 100%, 40%);">-            T.start</span><br><span style="color: hsl(0, 100%, 40%);">-         alt {</span><br><span style="color: hsl(0, 100%, 40%);">-                   [] LAPDM.receive(t_PH_DATA(?, use_sacch, LAPDm_B_UA(sapi, payload))) { setverdict(pass); repeat; }</span><br><span style="color: hsl(0, 100%, 40%);">-                      [] LAPDM.receive(t_PH_DATA(?, use_sacch, tr_LAPDm_B_UA(sapi, ?))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             setverdict(fail, "Second SABM was responded to during contention resolution");</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-                       [] LAPDM.receive { repeat };</span><br><span style="color: hsl(0, 100%, 40%);">-                    [] T.timeout { }</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-               f_release_dcch();</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* we test that a re-transmitted SABM with identical payload will result in the retransmission of a</span><br><span style="color: hsl(0, 100%, 40%);">-       * UA. This is required during the contention resolution procedure as specified in 8.4.1.4 */</span><br><span style="color: hsl(0, 100%, 40%);">-  testcase TC_sabm_retransmit() runs on lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-           const octetstring payload := '00FEFEDEADBEEF'O;</span><br><span style="color: hsl(0, 100%, 40%);">-         f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-               if (not f_test_sabm_results_in_ua(0, false, payload)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 setverdict(fail, "UA not received for first SABM");</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (not f_test_sabm_results_in_ua(0, false, payload)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 setverdict(fail, "UA not received for second SABM");</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       testcase TC_foo() runs on lapdm_test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-               var LapdmFrame lf;</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_foo() runs on lapdm_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var LapdmFrame lf;</span><br><span> /*</span><br><span style="color: hsl(0, 100%, 40%);">-                var LapdmFrame lf := valueof(LAPDm_B_UA(0, ''O));</span><br><span style="color: hsl(0, 100%, 40%);">-               log("ENC UA: ", enc_LapdmFrame(lf));</span><br><span style="color: hsl(0, 100%, 40%);">-          lf := valueof(LAPDm_B_UI(0, ''O));</span><br><span style="color: hsl(0, 100%, 40%);">-              log("ENC UI B: ", enc_LapdmFrame(lf));</span><br><span style="color: hsl(0, 100%, 40%);">-                log("ENC UI B: ", enc_LapdmFrameB(lf.b));</span><br><span style="color: hsl(120, 100%, 40%);">+   var LapdmFrame lf := valueof(LAPDm_B_UA(0, ''O));</span><br><span style="color: hsl(120, 100%, 40%);">+     log("ENC UA: ", enc_LapdmFrame(lf));</span><br><span style="color: hsl(120, 100%, 40%);">+        lf := valueof(LAPDm_B_UI(0, ''O));</span><br><span style="color: hsl(120, 100%, 40%);">+    log("ENC UI B: ", enc_LapdmFrame(lf));</span><br><span style="color: hsl(120, 100%, 40%);">+      log("ENC UI B: ", enc_LapdmFrameB(lf.b));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-         log("DEC UI AF: ", dec_LapdmAddressField('03'O));</span><br><span style="color: hsl(120, 100%, 40%);">+   log("DEC UI AF: ", dec_LapdmAddressField('03'O));</span><br><span> */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           lf := valueof(LAPDm_B_RR(0, 0));</span><br><span style="color: hsl(0, 100%, 40%);">-                log("ENC RR: ", enc_LapdmFrame(lf));</span><br><span style="color: hsl(120, 100%, 40%);">+        lf := valueof(LAPDm_B_RR(0, 0));</span><br><span style="color: hsl(120, 100%, 40%);">+      log("ENC RR: ", enc_LapdmFrame(lf));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              lf := valueof(LAPDm_B_UA(0, ''O));</span><br><span style="color: hsl(0, 100%, 40%);">-              log("ENC UA: ", enc_LapdmFrame(lf));</span><br><span style="color: hsl(120, 100%, 40%);">+        lf := valueof(LAPDm_B_UA(0, ''O));</span><br><span style="color: hsl(120, 100%, 40%);">+    log("ENC UA: ", enc_LapdmFrame(lf));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              lf := valueof(LAPDm_B_UI(0, ''O));</span><br><span style="color: hsl(0, 100%, 40%);">-              log("ENC UI: ", enc_LapdmFrame(lf));</span><br><span style="color: hsl(120, 100%, 40%);">+        lf := valueof(LAPDm_B_UI(0, ''O));</span><br><span style="color: hsl(120, 100%, 40%);">+    log("ENC UI: ", enc_LapdmFrame(lf));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              log("DEC UI CU: ", dec_LapdmCtrlU('03'O));</span><br><span style="color: hsl(0, 100%, 40%);">-            log("DEC UI CT: ", dec_LapdmCtrl('03'O));</span><br><span style="color: hsl(120, 100%, 40%);">+   log("DEC UI CU: ", dec_LapdmCtrlU('03'O));</span><br><span style="color: hsl(120, 100%, 40%);">+  log("DEC UI CT: ", dec_LapdmCtrl('03'O));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-         log("DEC UA: ", dec_LapdmFrameAB('017301'O));</span><br><span style="color: hsl(0, 100%, 40%);">-         log("DEC UI: ", dec_LapdmFrameAB('030301'O));</span><br><span style="color: hsl(0, 100%, 40%);">-         log("DEC I: ", dec_LapdmFrameAB('030001'O));</span><br><span style="color: hsl(0, 100%, 40%);">-          log("DEC S: ", dec_LapdmFrameAB('030101'O));</span><br><span style="color: hsl(0, 100%, 40%);">-          log("DEC: ", dec_LapdmFrameAB('030301'O));</span><br><span style="color: hsl(0, 100%, 40%);">-            log("DEC: ", dec_LapdmFrameAB('0303012B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O));</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("DEC UA: ", dec_LapdmFrameAB('017301'O));</span><br><span style="color: hsl(120, 100%, 40%);">+       log("DEC UI: ", dec_LapdmFrameAB('030301'O));</span><br><span style="color: hsl(120, 100%, 40%);">+       log("DEC I: ", dec_LapdmFrameAB('030001'O));</span><br><span style="color: hsl(120, 100%, 40%);">+        log("DEC S: ", dec_LapdmFrameAB('030101'O));</span><br><span style="color: hsl(120, 100%, 40%);">+        log("DEC: ", dec_LapdmFrameAB('030301'O));</span><br><span style="color: hsl(120, 100%, 40%);">+  log("DEC: ", dec_LapdmFrameAB('0303012B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     control {</span><br><span style="color: hsl(0, 100%, 40%);">-               execute(TC_foo());</span><br><span style="color: hsl(0, 100%, 40%);">-              execute(TC_sabm_ua_dcch_sapi0());</span><br><span style="color: hsl(0, 100%, 40%);">-               execute(TC_sabm_ua_dcch_sapi0_nopayload());</span><br><span style="color: hsl(0, 100%, 40%);">-             execute(TC_sabm_ua_dcch_sapi3());</span><br><span style="color: hsl(0, 100%, 40%);">-               execute(TC_sabm_ua_dcch_sapi4());</span><br><span style="color: hsl(0, 100%, 40%);">-               execute(TC_sabm_contention());</span><br><span style="color: hsl(0, 100%, 40%);">-          execute(TC_sabm_retransmit());</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(120, 100%, 40%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+  execute(TC_foo());</span><br><span style="color: hsl(120, 100%, 40%);">+    execute(TC_sabm_ua_dcch_sapi0());</span><br><span style="color: hsl(120, 100%, 40%);">+     execute(TC_sabm_ua_dcch_sapi0_nopayload());</span><br><span style="color: hsl(120, 100%, 40%);">+   execute(TC_sabm_ua_dcch_sapi3());</span><br><span style="color: hsl(120, 100%, 40%);">+     execute(TC_sabm_ua_dcch_sapi4());</span><br><span style="color: hsl(120, 100%, 40%);">+     execute(TC_sabm_contention());</span><br><span style="color: hsl(120, 100%, 40%);">+        execute(TC_sabm_retransmit());</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></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14329">change 14329</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/+/14329"/><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: I4637393df9989a97a4d70f08bd334d0f8cfd2284 </div>
<div style="display:none"> Gerrit-Change-Number: 14329 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </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>