<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15411">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts: Add test for ETWS Primary Notification via P1 Rest Octets<br><br>Change-Id: I247ea0f336e4ae9eecb1e8166f2326bdd2c299f4<br>Related: OS#4047<br>---<br>M bts/BTS_Tests_SMSCB.ttcn<br>M library/RSL_Types.ttcn<br>2 files changed, 155 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/11/15411/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bts/BTS_Tests_SMSCB.ttcn b/bts/BTS_Tests_SMSCB.ttcn</span><br><span>index 962b516..7f31eb2 100644</span><br><span>--- a/bts/BTS_Tests_SMSCB.ttcn</span><br><span>+++ b/bts/BTS_Tests_SMSCB.ttcn</span><br><span>@@ -22,6 +22,7 @@</span><br><span> import from L1CTL_Types all;</span><br><span> import from LAPDm_Types all;</span><br><span> import from IPA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_RR_Types all;</span><br><span> </span><br><span> import from RSL_Types all;</span><br><span> </span><br><span>@@ -875,6 +876,135 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private template GsmRrMessage tr_PagingType1 := {</span><br><span style="color: hsl(120, 100%, 40%);">+     header := t_RrHeader(PAGING_REQUEST_TYPE_1, ?),</span><br><span style="color: hsl(120, 100%, 40%);">+       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%);">+private template GsmRrMessage tr_PagingType1_empty := {</span><br><span style="color: hsl(120, 100%, 40%);">+    header := t_RrHeader(PAGING_REQUEST_TYPE_1, 5),</span><br><span style="color: hsl(120, 100%, 40%);">+       payload := {</span><br><span style="color: hsl(120, 100%, 40%);">+          pag_req_1 := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        chan_needed := {</span><br><span style="color: hsl(120, 100%, 40%);">+                              second := CHAN_NEED_ANY,</span><br><span style="color: hsl(120, 100%, 40%);">+                              first := CHAN_NEED_ANY</span><br><span style="color: hsl(120, 100%, 40%);">+                        },</span><br><span style="color: hsl(120, 100%, 40%);">+                    page_mode := PAGE_MODE_NORMAL,</span><br><span style="color: hsl(120, 100%, 40%);">+                        mi1 := {</span><br><span style="color: hsl(120, 100%, 40%);">+                              len := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                             mi := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       unused := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                           pad := '1111'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               odd := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         mi_type := MI_TYPE_NONE</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%);">+                    mi2 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                  rest_octets := ?</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%);">+testcase TC_etws_p1ro() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var template RslChannelNr t_chan_nr := ts_RslChanNr_PCH_AGCH(0);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* we expect four blocks of 14 bytes, let's fill them with content easily</span><br><span style="color: hsl(120, 100%, 40%);">+  * distinguishable */</span><br><span style="color: hsl(120, 100%, 40%);">+ const octetstring etws_seg0 := '000102030405060708090a0b0c0d'O;</span><br><span style="color: hsl(120, 100%, 40%);">+       const octetstring etws_seg1 := '101112131415161718191a1b1c1d'O;</span><br><span style="color: hsl(120, 100%, 40%);">+       const octetstring etws_seg2 := '202122232425262728292a2b2c2d'O;</span><br><span style="color: hsl(120, 100%, 40%);">+       const octetstring etws_seg3 := '303132333435363738393a3b3c3d'O;</span><br><span style="color: hsl(120, 100%, 40%);">+       const octetstring etws := etws_seg0 & etws_seg1 & etws_seg2 & etws_seg3;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* decoding the actual entire P1 rest octets by manually generated code is</span><br><span style="color: hsl(120, 100%, 40%);">+     * too much effort; instead simply do a binary compare to this constant */</span><br><span style="color: hsl(120, 100%, 40%);">+    const bitstring c_P1RO_hdr := '00101011101'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer seg_received[4] := { 0, 0, 0, 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+        var L1ctlDlMessage dl;</span><br><span style="color: hsl(120, 100%, 40%);">+        timer T := 10.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%);">+     f_init_l1ctl();</span><br><span style="color: hsl(120, 100%, 40%);">+       f_l1_tune(L1CTL, ccch_mode := CCCH_MODE_COMBINED_CBCH);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL_CCHAN.send(ts_RSL_UD(ts_RSL_OSMO_ETWS_CMD(etws)));</span><br><span style="color: hsl(120, 100%, 40%);">+        /* wait for a bit until old non-ETWS Paging messages are gone */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ L1CTL.clear;</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%);">+ [] L1CTL.receive(tr_L1CTL_DATA_IND(t_chan_nr)) -> value dl {</span><br><span style="color: hsl(120, 100%, 40%);">+               var GsmRrMessage l3 := dec_GsmRrMessage(dl.payload.data_ind.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+         select (l3) {</span><br><span style="color: hsl(120, 100%, 40%);">+         case (tr_PagingType1_empty) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 var octetstring p1ro := l3.payload.pag_req_1.rest_octets;</span><br><span style="color: hsl(120, 100%, 40%);">+                     var bitstring midamble := oct2bit(substr(p1ro, 0, 3));</span><br><span style="color: hsl(120, 100%, 40%);">+                        var octetstring segment := substr(p1ro, 3, lengthof(p1ro)-3);</span><br><span style="color: hsl(120, 100%, 40%);">+                 var BIT1 not_first := substr(midamble, 11, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                        var integer seg_nr := bit2int(substr(midamble, 12, 4));</span><br><span style="color: hsl(120, 100%, 40%);">+                       var boolean err := false;</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (substr(midamble, 0, 11) != c_P1RO_hdr) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          setverdict(fail, "Received unexpected P1 RO header ", midamble);</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (not_first == '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              select (seg_nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             case (2) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    if (segment != etws_seg1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                           err := true</span><br><span style="color: hsl(120, 100%, 40%);">+                                   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                              seg_received[1] := seg_received[1] + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                                       }}</span><br><span style="color: hsl(120, 100%, 40%);">+                            case (3) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    if (segment != etws_seg2) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                           err := true</span><br><span style="color: hsl(120, 100%, 40%);">+                                   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                              seg_received[2] := seg_received[2] + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                                       }}</span><br><span style="color: hsl(120, 100%, 40%);">+                            case (4) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    if (segment != etws_seg3) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                           err := true</span><br><span style="color: hsl(120, 100%, 40%);">+                                   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                              seg_received[3] := seg_received[3] + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                                       }}</span><br><span style="color: hsl(120, 100%, 40%);">+                            case else { setverdict(fail, "Unknown segment Nr ", seg_nr); }</span><br><span style="color: hsl(120, 100%, 40%);">+                              }</span><br><span style="color: hsl(120, 100%, 40%);">+                             if (err) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    setverdict(fail, "Unexpected segment ", seg_nr, ": ", segment);</span><br><span style="color: hsl(120, 100%, 40%);">+                           }</span><br><span style="color: hsl(120, 100%, 40%);">+                     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              if (seg_nr != 4) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    setverdict(fail, "Invalid number of segments ", seg_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                                    err := true;</span><br><span style="color: hsl(120, 100%, 40%);">+                          }</span><br><span style="color: hsl(120, 100%, 40%);">+                             if (segment != etws_seg0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   setverdict(fail, "Invalid first segment ", segment);</span><br><span style="color: hsl(120, 100%, 40%);">+                                        err := true;</span><br><span style="color: hsl(120, 100%, 40%);">+                          }</span><br><span style="color: hsl(120, 100%, 40%);">+                             if (not err) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        seg_received[0] := seg_received[0] + 1;</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%);">+             case (tr_PagingType1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "Received unexpected PAGING TYPE 1: ", l3);</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%);">+             repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] L1CTL.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%);">+     log("Quantity of received ETWS PN segments: ", seg_received);</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i := 0; i < 4; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (seg_received[i] < 15) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(fail, "Segment ", i, " not received often enough");</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%);">+</span><br><span> /* SMSCB TODO:</span><br><span>    * multiple SMS BC CMD at the same time: Ensure all of them are sent exactly once</span><br><span>    * extended CBCH vs. normal CBCH</span><br><span>@@ -908,6 +1038,8 @@</span><br><span>       execute( TC_cbc_sdcch8_load_idle() );</span><br><span>        execute( TC_cbc_sdcch8_load_overload() );</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_etws_p1ro() );</span><br><span> }</span><br><span> </span><br><span> </span><br><span>diff --git a/library/RSL_Types.ttcn b/library/RSL_Types.ttcn</span><br><span>index 87de9a4..da8c7f8 100644</span><br><span>--- a/library/RSL_Types.ttcn</span><br><span>+++ b/library/RSL_Types.ttcn</span><br><span>@@ -149,7 +149,9 @@</span><br><span>           RSL_MT_IPAC_DLCX_IND            ('01110110'B),</span><br><span>               RSL_MT_IPAC_DLCX                ('01110111'B),</span><br><span>               RSL_MT_IPAC_DLCX_ACK            ('01111000'B),</span><br><span style="color: hsl(0, 100%, 40%);">-          RSL_MT_IPAC_DLCX_NACK           ('01111001'B)</span><br><span style="color: hsl(120, 100%, 40%);">+         RSL_MT_IPAC_DLCX_NACK           ('01111001'B),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              RSL_MT_OSMO_ETWS_CMD            ('01111111'B)</span><br><span>        } with { variant "FIELDLENGTH(8)" };</span><br><span> </span><br><span>   /*! RSL Information Element Identifiers (Chapter 9.3) */</span><br><span>@@ -2115,6 +2117,26 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) RSL_Message ts_RSL_OSMO_ETWS_CMD(template (value) octetstring msg,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     template (value) RslChannelNr chan_nr := ts_RslChanNr_PCH_AGCH(0)) := {</span><br><span style="color: hsl(120, 100%, 40%);">+             msg_disc := ts_RSL_MsgDisc(RSL_MDISC_CCHAN, false),</span><br><span style="color: hsl(120, 100%, 40%);">+           msg_type := RSL_MT_OSMO_ETWS_CMD,</span><br><span style="color: hsl(120, 100%, 40%);">+             ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}),</span><br><span style="color: hsl(120, 100%, 40%);">+                   t_RSL_IE(RSL_IE_SMSCB_MSG, RSL_IE_Body:{smscb_message := ts_RSL_LV(msg)})</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 RSL_Message tr_RSL_OSMO_ETWS_CMD(template RslChannelNr chan_nr := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           template octetstring msg := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+         msg_disc := tr_RSL_MsgDisc(RSL_MDISC_CCHAN, false),</span><br><span style="color: hsl(120, 100%, 40%);">+           msg_type := RSL_MT_OSMO_ETWS_CMD,</span><br><span style="color: hsl(120, 100%, 40%);">+             ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}),</span><br><span style="color: hsl(120, 100%, 40%);">+                  tr_RSL_IE(RSL_IE_Body:{smscb_message := tr_RSL_LV(msg)})</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> </span><br><span>    function f_rsl_find_ie(RSL_Message msg, RSL_IE_Type iei, out RSL_IE_Body ret) return boolean {</span><br><span>               for (var integer i := 0; i < sizeof(msg.ies); i := i+1) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15411">change 15411</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/+/15411"/><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: I247ea0f336e4ae9eecb1e8166f2326bdd2c299f4 </div>
<div style="display:none"> Gerrit-Change-Number: 15411 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>