<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24773">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcu: Introduce ANR related tests<br><br>Related: SYS#5303<br>Change-Id: Ia5464affebd6d7881fe11223d2a96616e9e104a4<br>---<br>M library/GSM_SystemInformation.ttcn<br>M library/PCUIF_Types.ttcn<br>M pcu/PCU_Tests.ttcn<br>M pcu/gen_links.sh<br>4 files changed, 709 insertions(+), 8 deletions(-)<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/73/24773/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/GSM_SystemInformation.ttcn b/library/GSM_SystemInformation.ttcn</span><br><span>index 86ff817..ab40e00 100644</span><br><span>--- a/library/GSM_SystemInformation.ttcn</span><br><span>+++ b/library/GSM_SystemInformation.ttcn</span><br><span>@@ -108,6 +108,18 @@</span><br><span>               boolean         re_not_allowed,</span><br><span>              AccessControlClass acc</span><br><span>       } with { variant (acc) "FIELDLENGTH(16)" };</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) RachControlParameters</span><br><span style="color: hsl(120, 100%, 40%);">+        ts_RachControlParameters(RachCtrlPar_MR max_retrans := RACH_MAX_RETRANS_1,</span><br><span style="color: hsl(120, 100%, 40%);">+                             BIT4 tx_integer := '1111'B, boolean cell_barr_access := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                boolean re_not_allowed := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                              AccessControlClass acc := '0000000000000000'B)</span><br><span style="color: hsl(120, 100%, 40%);">+       := {</span><br><span style="color: hsl(120, 100%, 40%);">+          max_retrans := max_retrans,</span><br><span style="color: hsl(120, 100%, 40%);">+           tx_integer := tx_integer,</span><br><span style="color: hsl(120, 100%, 40%);">+             cell_barr_access := cell_barr_access,</span><br><span style="color: hsl(120, 100%, 40%);">+         re_not_allowed := re_not_allowed,</span><br><span style="color: hsl(120, 100%, 40%);">+             acc := acc</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span> </span><br><span>        /* 44.018 9.1.31 */</span><br><span>  type record SystemInformationType1 {</span><br><span>@@ -289,4 +301,14 @@</span><br><span>          return 0;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Generate a NeighbourCellDescription as per 44.018 10.5.2.22 */</span><br><span style="color: hsl(120, 100%, 40%);">+     function f_gen_NeighbourCellDescription(bitstring arfcn_mask /*length(1024)*/) return NeighbourCellDescription {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* FIXME: so far only bitmap 0 is supported */</span><br><span style="color: hsl(120, 100%, 40%);">+                var bitstring dst := '0000'B;</span><br><span style="color: hsl(120, 100%, 40%);">+         for (var integer i := 123; i > 0; i := i -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     dst := dst & arfcn_mask[i];</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             return bit2oct(dst);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> } with { encode "RAW"; variant "FIELDORDER(msb)" }</span><br><span>diff --git a/library/PCUIF_Types.ttcn b/library/PCUIF_Types.ttcn</span><br><span>index 1e57fb2..6f64437 100644</span><br><span>--- a/library/PCUIF_Types.ttcn</span><br><span>+++ b/library/PCUIF_Types.ttcn</span><br><span>@@ -38,7 +38,9 @@</span><br><span>       PCU_IF_MSG_INTERF_IND           ('53'O),</span><br><span>     PCU_IF_MSG_PAG_REQ              ('60'O),</span><br><span>     PCU_IF_MSG_TXT_IND              ('70'O),</span><br><span style="color: hsl(0, 100%, 40%);">-        PCU_IF_MSG_CONTAINER            ('80'O)</span><br><span style="color: hsl(120, 100%, 40%);">+       PCU_IF_MSG_CONTAINER            ('80'O),</span><br><span style="color: hsl(120, 100%, 40%);">+      PCU_IF_MSG_ANR_REQ              ('81'O),</span><br><span style="color: hsl(120, 100%, 40%);">+      PCU_IF_MSG_ANR_CNF              ('82'O)</span><br><span> } with { variant "FIELDLENGTH(8)" };</span><br><span> </span><br><span> type enumerated PCUIF_Sapi {</span><br><span>@@ -254,15 +256,36 @@</span><br><span>        variant (tlli) "BYTEORDER(last)"</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Container related records */</span><br><span style="color: hsl(120, 100%, 40%);">+type record PCUIF_CellDescriptionV {</span><br><span style="color: hsl(120, 100%, 40%);">+   BIT3                            bcc, /* PLMN colour code */</span><br><span style="color: hsl(120, 100%, 40%);">+   BIT3                            ncc, /* BS colour code */</span><br><span style="color: hsl(120, 100%, 40%);">+     BIT2                            bcch_arfcn_hi,</span><br><span style="color: hsl(120, 100%, 40%);">+        BIT8                            bcch_arfcn_lo</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDORDER(lsb)" };</span><br><span style="color: hsl(120, 100%, 40%);">+type record of PCUIF_CellDescriptionV PCUIF_CellDescriptionList;</span><br><span style="color: hsl(120, 100%, 40%);">+type record of uint8_t PCUIF_RxLevList;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record PCUIF_anr_req {</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t         num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+    PCUIF_CellDescriptionList cell_list</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (cell_list) "FIELDLENGTH(96)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record PCUIF_anr_cnf {</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t         num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+    PCUIF_CellDescriptionList cell_list,</span><br><span style="color: hsl(120, 100%, 40%);">+  PCUIF_RxLevList rxlev_list</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (cell_list) "FIELDLENGTH(32)"</span><br><span style="color: hsl(120, 100%, 40%);">+   variant (rxlev_list) "FIELDLENGTH(32)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type union PCUIF_ContainerMsgUnion {</span><br><span style="color: hsl(0, 100%, 40%);">-   /* This field can be removed once first container message is added, see</span><br><span style="color: hsl(0, 100%, 40%);">-          * https://bugs.eclipse.org/bugs/show_bug.cgi?id=574469 */</span><br><span style="color: hsl(0, 100%, 40%);">-     octetstring tmp_fixme,</span><br><span style="color: hsl(120, 100%, 40%);">+        PCUIF_anr_req           anr_req,</span><br><span style="color: hsl(120, 100%, 40%);">+      PCUIF_anr_cnf           anr_cnf,</span><br><span>     octetstring     other</span><br><span> } with { variant "" };</span><br><span> </span><br><span> type record PCUIF_container {</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t         msg_type,</span><br><span style="color: hsl(120, 100%, 40%);">+     PCUIF_MsgType   msg_type,</span><br><span>    OCT1            spare,</span><br><span>       uint16_t        len, /* network byte order */</span><br><span>        PCUIF_ContainerMsgUnion u</span><br><span>@@ -270,7 +293,8 @@</span><br><span>      variant (len) "BYTEORDER(last)"</span><br><span>    variant (len) "LENGTHTO(u)"</span><br><span>        variant (u) "CROSSTAG(</span><br><span style="color: hsl(0, 100%, 40%);">-                     tmp_fixme,      msg_type = 255;</span><br><span style="color: hsl(120, 100%, 40%);">+                       anr_req,        msg_type = PCU_IF_MSG_ANR_REQ;</span><br><span style="color: hsl(120, 100%, 40%);">+                        anr_cnf,        msg_type = PCU_IF_MSG_ANR_CNF;</span><br><span>                       other,          OTHERWISE)"</span><br><span> };</span><br><span> </span><br><span>@@ -1026,7 +1050,7 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) PCUIF_container ts_PCUIF_CONT_OTHER(uint8_t msg_type, template (value) octetstring payload) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PCUIF_container ts_PCUIF_CONT_OTHER(PCUIF_MsgType msg_type, template (value) octetstring payload) := {</span><br><span>         msg_type := msg_type,</span><br><span>        spare := '00'O,</span><br><span>      len := lengthof(payload),</span><br><span>@@ -1034,7 +1058,7 @@</span><br><span>            other := payload</span><br><span>     }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-template (present) PCUIF_container tr_PCUIF_CONT_OTHER(template (present) uint8_t msg_type,</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) PCUIF_container tr_PCUIF_CONT_OTHER(template (present) PCUIF_MsgType msg_type,</span><br><span>                                                        template (present) octetstring payload) := {</span><br><span>  msg_type := msg_type,</span><br><span>        spare := '00'O,</span><br><span>@@ -1044,6 +1068,121 @@</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PCUIF_CellDescriptionV ts_PCUIF_CellDescriptionV(uint3_t bcc, uint3_t ncc, uint10_t arfcn) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  bcc := int2bit(bcc, 3),</span><br><span style="color: hsl(120, 100%, 40%);">+       ncc := int2bit(ncc, 3), /* BS colour code */</span><br><span style="color: hsl(120, 100%, 40%);">+  bcch_arfcn_hi := substr(int2bit(arfcn, 10), 0, 2),</span><br><span style="color: hsl(120, 100%, 40%);">+    bcch_arfcn_lo := substr(int2bit(arfcn, 10), 2, 8)</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) PCUIF_container ts_PCUIF_CONT_ANR_REQ(uint8_t num_cells, template (value) PCUIF_CellDescriptionList cell_list) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  msg_type := PCU_IF_MSG_ANR_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+       spare := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       len := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+   u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                anr_req := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  num_cells := num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+                       cell_list := cell_list</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 (present) PCUIF_container tr_PCUIF_CONT_ANR_REQ(template (present) uint8_t num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   template (present) PCUIF_CellDescriptionList cell_list) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ msg_type := PCU_IF_MSG_ANR_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+       spare := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+     u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                anr_req := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  num_cells := num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+                       cell_list := cell_list</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 (value) PCUIF_Message ts_PCUIF_ANR_REQ(uint8_t bts_nr, uint8_t num_cells, template (value) PCUIF_CellDescriptionList cell_list) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   msg_type := PCU_IF_MSG_CONTAINER,</span><br><span style="color: hsl(120, 100%, 40%);">+     bts_nr := bts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+     spare := '0000'O,</span><br><span style="color: hsl(120, 100%, 40%);">+     u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                container := ts_PCUIF_CONT_ANR_REQ(num_cells, cell_list)</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 (present) PCUIF_Message tr_PCUIF_ANR_REQ(template (present) uint8_t bts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   template (present) uint8_t num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 template (present) PCUIF_CellDescriptionList cell_list) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   msg_type := PCU_IF_MSG_CONTAINER,</span><br><span style="color: hsl(120, 100%, 40%);">+     bts_nr := bts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+     spare := '0000'O,</span><br><span style="color: hsl(120, 100%, 40%);">+     u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                container := tr_PCUIF_CONT_ANR_REQ(num_cells, cell_list)</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 (value) PCUIF_container ts_PCUIF_CONT_ANR_CNF(uint8_t num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    PCUIF_CellDescriptionList cell_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  PCUIF_RxLevList rxlev_list) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       msg_type := PCU_IF_MSG_ANR_CNF,</span><br><span style="color: hsl(120, 100%, 40%);">+       spare := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       len := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+   u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                anr_cnf := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  num_cells := num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+                       cell_list := cell_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                       rxlev_list := rxlev_list</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 (present) PCUIF_container tr_PCUIF_CONT_ANR_CNF(template (present) uint8_t num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   template (present) PCUIF_CellDescriptionList cell_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       template (present) PCUIF_RxLevList rxlev_list) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  msg_type := PCU_IF_MSG_ANR_CNF,</span><br><span style="color: hsl(120, 100%, 40%);">+       spare := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+     u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                anr_cnf := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  num_cells := num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+                       cell_list := cell_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                       rxlev_list := rxlev_list</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 (value) PCUIF_Message ts_PCUIF_ANR_CNF(uint8_t bts_nr, uint8_t num_cells, PCUIF_CellDescriptionList cell_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         PCUIF_RxLevList rxlev_list) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      msg_type := PCU_IF_MSG_CONTAINER,</span><br><span style="color: hsl(120, 100%, 40%);">+     bts_nr := bts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+     spare := '0000'O,</span><br><span style="color: hsl(120, 100%, 40%);">+     u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                container := ts_PCUIF_CONT_ANR_CNF(num_cells, cell_list, rxlev_list)</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 (present) PCUIF_Message tr_PCUIF_ANR_CNF(template (present) uint8_t bts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              template (present) uint8_t num_cells,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 template (present) PCUIF_CellDescriptionList cell_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               template (present) PCUIF_RxLevList rxlev_list) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ msg_type := PCU_IF_MSG_CONTAINER,</span><br><span style="color: hsl(120, 100%, 40%);">+     bts_nr := bts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+     spare := '0000'O,</span><br><span style="color: hsl(120, 100%, 40%);">+     u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                container := tr_PCUIF_CONT_ANR_CNF(num_cells, cell_list, rxlev_list)</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_PCUIF_CellDescriptionList_expand(inout PCUIF_CellDescriptionList cell_list, integer final_length)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer initial_length := lengthof(cell_list);</span><br><span style="color: hsl(120, 100%, 40%);">+    var PCUIF_CellDescriptionList zeroed_val := {valueof(ts_PCUIF_CellDescriptionV(0, 0, 0))};</span><br><span style="color: hsl(120, 100%, 40%);">+    for (var integer i := initial_length; i < final_length; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              cell_list := cell_list & zeroed_val;</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_PCUIF_RxLevList_expand(inout PCUIF_RxLevList rxlev_list, integer final_length)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    var integer initial_length := lengthof(rxlev_list);</span><br><span style="color: hsl(120, 100%, 40%);">+   var PCUIF_RxLevList zeroed_val := {0};</span><br><span style="color: hsl(120, 100%, 40%);">+        for (var integer i := initial_length; i < final_length; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              rxlev_list := rxlev_list & zeroed_val;</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> function f_PCUIF_PDCHMask_set(inout PCUIF_info_ind info, BIT8 pdch_mask,</span><br><span>                         template (present) uint8_t trx_nr := ?)</span><br><span> {</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index 8e8fba9..08d1697 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -22,6 +22,7 @@</span><br><span> import from Osmocom_Types all;</span><br><span> import from GSM_Types all;</span><br><span> import from GSM_RR_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_SystemInformation all;</span><br><span> </span><br><span> import from Osmocom_VTY_Functions all;</span><br><span> import from TELNETasp_PortType all;</span><br><span>@@ -5898,6 +5899,538 @@</span><br><span>  f_shutdown(__BFILE__, __LINE__, final := true);</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 ANR procedure: fully successful procedure on a DL TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_anr_dl_tbf_success() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var RlcmacDlBlock dl_block, dl_block2;</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(120, 100%, 40%);">+  var uint32_t sched_fn, dl_fn, poll_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+        var template RlcmacDlCtrlMsg meas_order_reset_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+   var template RlcmacDlCtrlMsg meas_order_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+ var template NCFrequencyList nc_freq_list_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+       var template RepeatedAddFrequencyItemList add_freq_list_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) NCMeasurementReport meas_rep;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+     ms := g_ms[0]; /* We only use first MS in this test */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_bssgp_establish();</span><br><span style="color: hsl(120, 100%, 40%);">+  f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Wait timer X2002 and DL block is available after CCCH IMM ASS */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(X2002);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, ?, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     var PCUIF_CellDescriptionList cell_list := {</span><br><span style="color: hsl(120, 100%, 40%);">+          valueof(ts_PCUIF_CellDescriptionV(3, 1, 880)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(3, 2, 880)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(1, 1, 883)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(3, 1, 887))</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+    var PCUIF_CellDescriptionList cell_list_req := cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_PCUIF_CellDescriptionList_expand(cell_list_req, 96);</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS.send(ts_PCUIF_ANR_REQ(0, lengthof(cell_list), cell_list_req));</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Verify Packet Measurement Order (reset GSM Neighbour Cell List) is received */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rx_rlcmac_dl_block(dl_block2, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* TODO: verify proper DL TFI in PKT MEAS ORDER, see first param below */</span><br><span style="color: hsl(120, 100%, 40%);">+     meas_order_reset_tmpl := tr_RlcMacDlCtrl_PKT_MEAS_ORDER(?, 0, 0, ts_NCMeasurementParametersRESET);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not match(dl_block2, tr_RLCMAC_DL_CTRL(?, meas_order_reset_tmpl))) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Rx unexpected DL block: ", dl_block2);</span><br><span style="color: hsl(120, 100%, 40%);">+            f_shutdown(__BFILE__, __LINE__);</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%);">+   /* ACK the first data block, without FinalAckIndicator because we recieve no FBI on DL data. */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '0'B);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+                     f_dl_block_ack_fn(dl_block, poll_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ACK the meas order (reset) */</span><br><span style="color: hsl(120, 100%, 40%);">+      sched_fn := f_rrbp_ack_fn(dl_fn, dl_block2.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* After ACKing the reset, we get proper Meas Order modifying GSM</span><br><span style="color: hsl(120, 100%, 40%);">+      * Neighbour Cell List through NC Freq List */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        add_freq_list_tmpl := { tr_RepeatedAddFrequencyItem(880, 11),</span><br><span style="color: hsl(120, 100%, 40%);">+                         tr_RepeatedAddFrequencyItem(880, 19),</span><br><span style="color: hsl(120, 100%, 40%);">+                         tr_RepeatedAddFrequencyItem(883, 9),</span><br><span style="color: hsl(120, 100%, 40%);">+                          tr_RepeatedAddFrequencyItem(887, 11)};</span><br><span style="color: hsl(120, 100%, 40%);">+        nc_freq_list_tmpl := tr_NCFrequencyList(omit, add_freq_list_tmpl);</span><br><span style="color: hsl(120, 100%, 40%);">+    meas_order_tmpl := tr_RlcMacDlCtrl_PKT_MEAS_ORDER(?, 0, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      tr_NCMeasurementParameters(NC_1, ?, ?, ?, nc_freq_list_tmpl));</span><br><span style="color: hsl(120, 100%, 40%);">+      if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, meas_order_tmpl))) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Rx unexpected DL block: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</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%);">+   /* These show that the DL TBF is kept open while waiting for ANR to be resolved */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rx_rlcmac_dl_block_exp_dummy(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rx_rlcmac_dl_block_exp_dummy(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rx_rlcmac_dl_block_exp_dummy(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Now we submit the Packet Meas Report */</span><br><span style="color: hsl(120, 100%, 40%);">+    meas_rep := ts_NCMeasurementReport('0'B /* NC1 */,  40,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          { ts_NCMeasurement(0, int2bit(11, 6), 55),</span><br><span style="color: hsl(120, 100%, 40%);">+                                      /* Deliverately don't present report for [1]<880,19>: emulate not found */</span><br><span style="color: hsl(120, 100%, 40%);">+                                          /* Deliverately don't present report for [2]<883,9>: emulate not found */</span><br><span style="color: hsl(120, 100%, 40%);">+                                           ts_NCMeasurement(3, int2bit(11, 6), 60) })</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(ts_RlcMacUlCtrl_PKT_MEAS_REPORT(ms.tlli, meas_rep))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var PCUIF_RxLevList rxlev_list := {55, 255, 255, 60 };</span><br><span style="color: hsl(120, 100%, 40%);">+        f_PCUIF_CellDescriptionList_expand(cell_list, 32);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_PCUIF_RxLevList_expand(rxlev_list, 32);</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS.receive(tr_PCUIF_ANR_CNF(0, 4, cell_list, rxlev_list));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Verify Packet Measurement Order (reset GSM Neighbour Cell List) is received */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, meas_order_reset_tmpl))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Rx unexpected DL block: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ACK the Pkt Meas order (reset) */</span><br><span style="color: hsl(120, 100%, 40%);">+  sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* ANR procedure is done, nothing more to be sent from PCU on UL TBF: */</span><br><span style="color: hsl(120, 100%, 40%);">+      while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+                f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (dl_block.data.mac_hdr.hdr_ext.fbi) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      log("Received FINAL_ACK");</span><br><span style="color: hsl(120, 100%, 40%);">+                  ms.dl_tbf.acknack_desc.final_ack := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (f_dl_block_rrbp_valid(dl_block)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+                    f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+                                     f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (ms.dl_tbf.acknack_desc.final_ack == '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</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%);">+   f_shutdown(__BFILE__, __LINE__, final := 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%);">+/* Test ANR procedure: fully successful procedure on a DL TBF. SI2 sent to PCU</span><br><span style="color: hsl(120, 100%, 40%);">+ * contains some cells in ANR_Req and some are not there */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_anr_dl_tbf_success_si2_partial() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var RlcmacDlBlock dl_block, dl_block2;</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(120, 100%, 40%);">+  var uint32_t sched_fn, dl_fn, poll_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+        var template RlcmacDlCtrlMsg meas_order_reset_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+   var template RlcmacDlCtrlMsg meas_order_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+ var template NCFrequencyList nc_freq_list_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+       var template FreqIndexList rm_freq_index;</span><br><span style="color: hsl(120, 100%, 40%);">+     var template RepeatedAddFrequencyItemList add_freq_list_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) NCMeasurementReport meas_rep;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+     ms := g_ms[0]; /* We only use first MS in this test */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_bssgp_establish();</span><br><span style="color: hsl(120, 100%, 40%);">+  f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Wait timer X2002 and DL block is available after CCCH IMM ASS */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(X2002);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, ?, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* First transmit SI2 on the PCU, which contains BA(list): */</span><br><span style="color: hsl(120, 100%, 40%);">+ var bitstring arfcn_mask := f_pad_bit(''B, 1024, '0'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Add ARFCN 20,100,101 to BA(list) */</span><br><span style="color: hsl(120, 100%, 40%);">+        arfcn_mask[20] := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+       arfcn_mask[100] := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+      arfcn_mask[101] := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+      var SystemInformation si := {</span><br><span style="color: hsl(120, 100%, 40%);">+         header := valueof(ts_RrHeader(SYSTEM_INFORMATION_TYPE_2, 22)),</span><br><span style="color: hsl(120, 100%, 40%);">+                payload := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  si2 := { bcch_freq_list := f_gen_NeighbourCellDescription(arfcn_mask),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ncc_permitted := '11111111'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 rach_control := valueof(ts_RachControlParameters)</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%);">+    var octetstring si2_enc := enc_SystemInformationNoPad(si);</span><br><span style="color: hsl(120, 100%, 40%);">+    var template PCUIF_Message si2_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, si2_enc, 0, 0, 0, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS.send(si2_data_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     var PCUIF_CellDescriptionList cell_list := {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* ARFCN 20 (idx=0) and 101 (idx=2) are left out on purpose, we check they are removed later */</span><br><span style="color: hsl(120, 100%, 40%);">+               valueof(ts_PCUIF_CellDescriptionV(3, 1, 100)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(3, 1, 880)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(3, 2, 880)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(1, 1, 883)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(3, 1, 887))</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+    var PCUIF_CellDescriptionList cell_list_req := cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_PCUIF_CellDescriptionList_expand(cell_list_req, 96);</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS.send(ts_PCUIF_ANR_REQ(0, lengthof(cell_list), cell_list_req));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Verify Packet Measurement Order (reset GSM Neighbour Cell List) is received */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rx_rlcmac_dl_block(dl_block2, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* TODO: verify proper UL TFI in PKT MEAS ORDER, see first param below */</span><br><span style="color: hsl(120, 100%, 40%);">+     meas_order_reset_tmpl := tr_RlcMacDlCtrl_PKT_MEAS_ORDER(?, 0, 0, ts_NCMeasurementParametersRESET);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not match(dl_block2, tr_RLCMAC_DL_CTRL(?, meas_order_reset_tmpl))) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Rx unexpected DL block: ", dl_block2);</span><br><span style="color: hsl(120, 100%, 40%);">+            f_shutdown(__BFILE__, __LINE__);</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%);">+   /* ACK the first data block, without FinalAckIndicator because we recieve no FBI on DL data. */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '0'B);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+                     f_dl_block_ack_fn(dl_block, poll_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ACK the meas order (reset) */</span><br><span style="color: hsl(120, 100%, 40%);">+      sched_fn := f_rrbp_ack_fn(dl_fn, dl_block2.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* After ACKing the reset, we get proper Meas Order modifying GSM</span><br><span style="color: hsl(120, 100%, 40%);">+      * Neighbour Cell List through NC Freq List */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        rm_freq_index := { 0 /*ARFCN=20*/,</span><br><span style="color: hsl(120, 100%, 40%);">+                       2 /*ARFCN=101*/ };</span><br><span style="color: hsl(120, 100%, 40%);">+ add_freq_list_tmpl := { tr_RepeatedAddFrequencyItem(880, 11),</span><br><span style="color: hsl(120, 100%, 40%);">+                         tr_RepeatedAddFrequencyItem(880, 19),</span><br><span style="color: hsl(120, 100%, 40%);">+                         tr_RepeatedAddFrequencyItem(883, 9),</span><br><span style="color: hsl(120, 100%, 40%);">+                          tr_RepeatedAddFrequencyItem(887, 11)};</span><br><span style="color: hsl(120, 100%, 40%);">+        nc_freq_list_tmpl := tr_NCFrequencyList(rm_freq_index, add_freq_list_tmpl);</span><br><span style="color: hsl(120, 100%, 40%);">+   meas_order_tmpl := tr_RlcMacDlCtrl_PKT_MEAS_ORDER(?, 0, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      tr_NCMeasurementParameters(NC_1, ?, ?, ?, nc_freq_list_tmpl));</span><br><span style="color: hsl(120, 100%, 40%);">+      if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, meas_order_tmpl))) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Rx unexpected DL block: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</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%);">+   /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Now we submit the Packet Meas Report */</span><br><span style="color: hsl(120, 100%, 40%);">+    meas_rep := ts_NCMeasurementReport('0'B /* NC1 */,  40,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          { ts_NCMeasurement(1, int2bit(11, 6), 30),</span><br><span style="color: hsl(120, 100%, 40%);">+                                      ts_NCMeasurement(3, int2bit(11, 6), 55),</span><br><span style="color: hsl(120, 100%, 40%);">+                                      /* Deliverately don't present report for [4]<880,19>: emulate not found */</span><br><span style="color: hsl(120, 100%, 40%);">+                                          /* Deliverately don't present report for [5]<883,9>: emulate not found */</span><br><span style="color: hsl(120, 100%, 40%);">+                                           ts_NCMeasurement(6, int2bit(11, 6), 60) })</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(ts_RlcMacUlCtrl_PKT_MEAS_REPORT(ms.tlli, meas_rep))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var PCUIF_RxLevList rxlev_list := {30, 55, 255, 255, 60 };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_PCUIF_CellDescriptionList_expand(cell_list, 32);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_PCUIF_RxLevList_expand(rxlev_list, 32);</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS.receive(tr_PCUIF_ANR_CNF(0, 5, cell_list, rxlev_list));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Verify Packet Measurement Order (reset GSM Neighbour Cell List) is received */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, meas_order_reset_tmpl))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Rx unexpected DL block: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ACK the meas order (reset) */</span><br><span style="color: hsl(120, 100%, 40%);">+      sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* ANR procedure is done, nothing more to be sent from PCU on UL TBF: */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_shutdown(__BFILE__, __LINE__, final := 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%);">+/* Test ANR procedure: Similar to TC_anr_dl_tbf_success_si2_partial, but with</span><br><span style="color: hsl(120, 100%, 40%);">+   longer NC FREQ LIST requiring several PKT meas Order messages. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_anr_dl_tbf_success_si2_partial_multi_measorder() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var RlcmacDlBlock dl_block, dl_block2;</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(120, 100%, 40%);">+  var uint32_t sched_fn, poll_fn, dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+        var template RlcmacDlCtrlMsg meas_order_reset_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+   var template RlcmacDlCtrlMsg meas_order_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+ var template NCFrequencyList nc_freq_list_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+       var template FreqIndexList rm_freq_index;</span><br><span style="color: hsl(120, 100%, 40%);">+     var template RepeatedAddFrequencyItemList add_freq_list_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) NCMeasurementReport meas_rep;</span><br><span style="color: hsl(120, 100%, 40%);">+    var template NCMeasurementParameters nc_meas_param_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+     ms := g_ms[0]; /* We only use first MS in this test */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_bssgp_establish();</span><br><span style="color: hsl(120, 100%, 40%);">+  f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* First transmit SI2 on the PCU, which contains BA(list): */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Add ARFCN 1..21 to BA(list) */</span><br><span style="color: hsl(120, 100%, 40%);">+     var bitstring arfcn_mask := f_pad_bit('01111111111111111111111'B, 1024, '0'B);</span><br><span style="color: hsl(120, 100%, 40%);">+        var SystemInformation si := {</span><br><span style="color: hsl(120, 100%, 40%);">+         header := valueof(ts_RrHeader(SYSTEM_INFORMATION_TYPE_2, 22)),</span><br><span style="color: hsl(120, 100%, 40%);">+                payload := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  si2 := { bcch_freq_list := f_gen_NeighbourCellDescription(arfcn_mask),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ncc_permitted := '11111111'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 rach_control := valueof(ts_RachControlParameters)</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%);">+    var octetstring si2_enc := enc_SystemInformationNoPad(si);</span><br><span style="color: hsl(120, 100%, 40%);">+    var template PCUIF_Message si2_data_ind := ts_PCUIF_DATA_IND(0, 0, 0, 0, PCU_IF_SAPI_BCCH, si2_enc, 0, 0, 0, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS.send(si2_data_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Wait timer X2002 and DL block is available after CCCH IMM ASS */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(X2002);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, ?, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     var PCUIF_CellDescriptionList cell_list := {</span><br><span style="color: hsl(120, 100%, 40%);">+          valueof(ts_PCUIF_CellDescriptionV(3, 1, 100)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(3, 1, 880)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(3, 2, 880)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(1, 1, 883)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(3, 1, 887))</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+    var PCUIF_CellDescriptionList cell_list_req := cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_PCUIF_CellDescriptionList_expand(cell_list_req, 96);</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS.send(ts_PCUIF_ANR_REQ(0, lengthof(cell_list), cell_list_req));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Verify Packet Measurement Order (reset GSM Neighbour Cell List) is received */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rx_rlcmac_dl_block(dl_block2, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* TODO: verify proper UL TFI in PKT MEAS ORDER, see first param below */</span><br><span style="color: hsl(120, 100%, 40%);">+     meas_order_reset_tmpl := tr_RlcMacDlCtrl_PKT_MEAS_ORDER(?, 0, 0, ts_NCMeasurementParametersRESET);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not match(dl_block2, tr_RLCMAC_DL_CTRL(?, meas_order_reset_tmpl))) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Rx unexpected DL block: ", dl_block2);</span><br><span style="color: hsl(120, 100%, 40%);">+            f_shutdown(__BFILE__, __LINE__);</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%);">+   /* ACK the first data block, without FinalAckIndicator because we recieve no FBI on DL data. */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '0'B);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+                     f_dl_block_ack_fn(dl_block, poll_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ACK the meas order (reset) */</span><br><span style="color: hsl(120, 100%, 40%);">+      sched_fn := f_rrbp_ack_fn(dl_fn, dl_block2.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* After ACKing the reset, we get proper Meas Order modifying GSM</span><br><span style="color: hsl(120, 100%, 40%);">+      * Neighbour Cell List through NC Freq List */</span><br><span style="color: hsl(120, 100%, 40%);">+        for (var integer i := 0; i < 3; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                select (i) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case (0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    rm_freq_index := { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };</span><br><span style="color: hsl(120, 100%, 40%);">+                    add_freq_list_tmpl := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    rm_freq_index := { 16, 17, 18, 19, 20, 21 };</span><br><span style="color: hsl(120, 100%, 40%);">+                  add_freq_list_tmpl := { tr_RepeatedAddFrequencyItem(100, 11),</span><br><span style="color: hsl(120, 100%, 40%);">+                                         tr_RepeatedAddFrequencyItem(880, 11),</span><br><span style="color: hsl(120, 100%, 40%);">+                                         tr_RepeatedAddFrequencyItem(880, 19),</span><br><span style="color: hsl(120, 100%, 40%);">+                                         tr_RepeatedAddFrequencyItem(883, 9)};</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (2) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    rm_freq_index := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                        add_freq_list_tmpl := { tr_RepeatedAddFrequencyItem(887, 11)};</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%);">+             nc_freq_list_tmpl := tr_NCFrequencyList(rm_freq_index, add_freq_list_tmpl);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (i == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 nc_meas_param_tmpl := tr_NCMeasurementParameters(NC_1, ?, ?, ?, nc_freq_list_tmpl);</span><br><span style="color: hsl(120, 100%, 40%);">+           } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      nc_meas_param_tmpl := tr_NCMeasurementParameters(NC_1, omit, omit, omit, nc_freq_list_tmpl);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             meas_order_tmpl := tr_RlcMacDlCtrl_PKT_MEAS_ORDER(?, i, 2, nc_meas_param_tmpl);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, meas_order_tmpl))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "Rx unexpected DL block: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+                     f_shutdown(__BFILE__, __LINE__);</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%);">+   /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Now we submit the Packet Meas Report */</span><br><span style="color: hsl(120, 100%, 40%);">+    meas_rep := ts_NCMeasurementReport('0'B /* NC1 */,  40,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          { ts_NCMeasurement(22, int2bit(11, 6), 30) })</span><br><span style="color: hsl(120, 100%, 40%);">+      f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(valueof(ts_RlcMacUlCtrl_PKT_MEAS_REPORT(ms.tlli, meas_rep))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var PCUIF_RxLevList rxlev_list := {30, 255, 255, 255, 255 };</span><br><span style="color: hsl(120, 100%, 40%);">+  f_PCUIF_CellDescriptionList_expand(cell_list, 32);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_PCUIF_RxLevList_expand(rxlev_list, 32);</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS.receive(tr_PCUIF_ANR_CNF(0, 5, cell_list, rxlev_list));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Verify Packet Measurement Order (reset GSM Neighbour Cell List) is received */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, meas_order_reset_tmpl))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Rx unexpected DL block: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ACK the meas order (reset) */</span><br><span style="color: hsl(120, 100%, 40%);">+      sched_fn := f_rrbp_ack_fn(dl_fn, dl_block.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* ANR procedure is done, nothing more to be sent from PCU on UL TBF: */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_shutdown(__BFILE__, __LINE__, final := 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%);">+/* Test ANR procedure: MS is not selected if only UL TBF is available (DL TBF is</span><br><span style="color: hsl(120, 100%, 40%);">+ * required since it's the only we can keep open from PCU) */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_anr_ul_tbf() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(120, 100%, 40%);">+  var uint32_t sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint32_t dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var template RlcmacDlBlock acknack_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+      var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+     ms := g_ms[0]; /* We only use first MS in this test */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_bssgp_establish();</span><br><span style="color: hsl(120, 100%, 40%);">+  f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Establish an Uplink TBF */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ms_establish_ul_tbf(ms);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Send one UL block (with TLLI since we are in One-Phase Access</span><br><span style="color: hsl(120, 100%, 40%);">+         contention resoultion) and make sure it is ACKED fine */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* UL block should be received in SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                tr_UlAckNackGprs(ms.tlli,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              tr_AckNackDescription(final_ack := '1'B)))</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* TBF is to be finished, so no ANR procedure should be starting on this MS */</span><br><span style="color: hsl(120, 100%, 40%);">+        var PCUIF_CellDescriptionList cell_list := {</span><br><span style="color: hsl(120, 100%, 40%);">+          valueof(ts_PCUIF_CellDescriptionV(3, 2, 880)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(3, 1, 880)),</span><br><span style="color: hsl(120, 100%, 40%);">+                valueof(ts_PCUIF_CellDescriptionV(3, 1, 887))</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+    var PCUIF_CellDescriptionList cell_list_req := cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_PCUIF_CellDescriptionList_expand(cell_list_req, 96);</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS.send(ts_PCUIF_ANR_REQ(0, lengthof(cell_list), cell_list_req));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Verify no Packet Measurement Order is received */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_rx_rlcmac_dl_block_exp_dummy(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ACK the ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_shutdown(__BFILE__, __LINE__, final := 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%);">+/* Test ANR procedure: MS is not selected for measurements if its TBF is already finished */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_anr_dl_tbf_finished() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var RlcmacDlBlock dl_block;</span><br><span style="color: hsl(120, 100%, 40%);">+   var octetstring data := f_rnd_octstring(10);</span><br><span style="color: hsl(120, 100%, 40%);">+  var uint32_t sched_fn, poll_fn, dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var template RlcmacDlBlock acknack_tmpl;</span><br><span style="color: hsl(120, 100%, 40%);">+      var GprsMS ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Initialize NS/BSSGP side */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_bssgp();</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Initialize GPRS MS side */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_gprs_ms();</span><br><span style="color: hsl(120, 100%, 40%);">+     ms := g_ms[0]; /* We only use first MS in this test */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Initialize the PCU interface abstraction */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_raw(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Establish BSSGP connection to the PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_bssgp_establish();</span><br><span style="color: hsl(120, 100%, 40%);">+  f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* SGSN sends some DL data, PCU will page on CCCH (PCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ms_exp_dl_tbf_ass_ccch(ms, PCU_IF_SAPI_PCH);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Wait timer X2002 and DL block is available after CCCH IMM ASS */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(X2002);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, ?, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ACK the first data block, without FinalAckIndicator because we recieve no FBI on DL data. */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '0'B);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+                     f_dl_block_ack_fn(dl_block, poll_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Wait until the FBI bit is sent, then attempt ANR REQUEST, it should avoid selecting the current DL TBF: */</span><br><span style="color: hsl(120, 100%, 40%);">+ while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+                f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (dl_block.data.mac_hdr.hdr_ext.fbi) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      log("Received FINAL_ACK");</span><br><span style="color: hsl(120, 100%, 40%);">+                  ms.dl_tbf.acknack_desc.final_ack := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* TBF is to be finished, so no ANR procedure should be starting on this MS */</span><br><span style="color: hsl(120, 100%, 40%);">+                        var PCUIF_CellDescriptionList cell_list := {</span><br><span style="color: hsl(120, 100%, 40%);">+                          valueof(ts_PCUIF_CellDescriptionV(3, 2, 880)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                valueof(ts_PCUIF_CellDescriptionV(3, 1, 880)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                valueof(ts_PCUIF_CellDescriptionV(3, 1, 887))</span><br><span style="color: hsl(120, 100%, 40%);">+                 };</span><br><span style="color: hsl(120, 100%, 40%);">+                    var PCUIF_CellDescriptionList cell_list_req := cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+                     f_PCUIF_CellDescriptionList_expand(cell_list_req, 96);</span><br><span style="color: hsl(120, 100%, 40%);">+                        BTS.send(ts_PCUIF_ANR_REQ(0, lengthof(cell_list), cell_list_req));</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (f_dl_block_rrbp_valid(dl_block)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+                    f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+                                     f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (ms.dl_tbf.acknack_desc.final_ack == '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Verify no Packet Measurement Order is received */</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (match(dl_block, tr_RLCMAC_DL_CTRL(?, tr_RlcMacDlCtrl_PKT_MEAS_ORDER(?, ?, ?, ?)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              setverdict(fail, "Rx unexpected PKT MEAS ORDER: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+                               f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</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%);">+   f_shutdown(__BFILE__, __LINE__, final := true);</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_pcuif_suspend() );</span><br><span>       execute( TC_pcuif_suspend_active_tbf() );</span><br><span>@@ -5999,6 +6532,12 @@</span><br><span>   execute( TC_rim_ran_info_req_single_rep() );</span><br><span>         execute( TC_rim_ran_info_req_single_rep_eutran() );</span><br><span>  execute( TC_rim_ran_info_req_single_rep_no_si() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_anr_dl_tbf_success() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_anr_dl_tbf_success_si2_partial() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_anr_dl_tbf_success_si2_partial_multi_measorder() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_anr_dl_tbf_finished() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_anr_ul_tbf() );</span><br><span> }</span><br><span> </span><br><span> }</span><br><span>diff --git a/pcu/gen_links.sh b/pcu/gen_links.sh</span><br><span>index d0f3ace..da69cb2 100755</span><br><span>--- a/pcu/gen_links.sh</span><br><span>+++ b/pcu/gen_links.sh</span><br><span>@@ -51,6 +51,7 @@</span><br><span> DIR=../library</span><br><span> FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc GSM_Types.ttcn GSM_RR_Types.ttcn Osmocom_Types.ttcn RLCMAC_Templates.ttcn RLCMAC_Types.ttcn RLCMAC_CSN1_Templates.ttcn RLCMAC_CSN1_Types.ttcn RLCMAC_EncDec.cc "</span><br><span> FILES+="StatsD_Types.ttcn StatsD_CodecPort.ttcn StatsD_CodecPort_CtrlFunct.ttcn StatsD_CodecPort_CtrlFunctdef.cc StatsD_Checker.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="GSM_SystemInformation.ttcn GSM_RestOctets.ttcn "</span><br><span> FILES+="RAW_NS.ttcnpp NS_Provider_IPL4.ttcn NS_Emulation.ttcnpp "</span><br><span> FILES+="BSSGP_Emulation.ttcnpp Osmocom_Gb_Types.ttcn "</span><br><span> FILES+="LLC_Templates.ttcn L3_Templates.ttcn L3_Common.ttcn "</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24773">change 24773</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/+/24773"/><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: Ia5464affebd6d7881fe11223d2a96616e9e104a4 </div>
<div style="display:none"> Gerrit-Change-Number: 24773 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>