<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>