<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15672">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">PCU_Tests_RAW.ttcn: add a test case for continuous Timing Advance control<br><br>Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots<br>are not continuous and there can be long time gaps between them. This happens<br>due to a bursty nature of packet data. The actual Timing Advance of a MS may<br>significantly change between such rare Uplink transmissions, so GPRS introduces<br>additional mechanisms to control Timing Advance, and thus reduce interference<br>between neighboring TDMA time-slots.<br><br>At the moment of Uplink TBF establishment, initial Timing Advance is measured<br>from ToA (Timing of Arrival) of an Access Burst. This is covered by another<br>test case - TC_ta_rach_imm_ass. In response to that Access Burst the network<br>sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index<br>among with the initial Timing Advance value. And here PTCCH comes to play.<br><br>PTCCH is a unidirectional channel on which the network can instruct a sub-set<br>of 16 MS (whether TBFs are active or not) to adjust their Timing Advance<br>continuously. To ensure continuous measurements of the signal propagation<br>delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots<br>defined by an assigned Timing Advance Index (see 3GPP TS 45.002).<br><br>The purpose of this test case is to verify the assignment of Timing Advance<br>Index, and the process of Timing Advance notification on PTCCH/D. The MTC<br>first establishes several Uplink TBFs, but does not transmit any Uplink<br>blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH<br>indications to the PCU, checking the correctness of two received PTCCH/D<br>messages (period of PTCCH/D is two multi-frames).<br><br>At the moment of writing, PTCCH handling is not implemented in OsmoPCU<br>(neither PTCCH/D messages are correct, nor PTCCH/U bursts are handled).<br><br>Additionally, this change introduces a new message type, which is used<br>for sending commands to the RAW components - RAW_PCU_Command. Commands<br>can be used to (re)configure components at run-time.<br><br>Change-Id: I868f78e3e95a95f8f2e55e237eea700d7d4726a3<br>Related: SYS#4606<br>---<br>M pcu/PCUIF_RAW_Components.ttcn<br>M pcu/PCU_Tests_RAW.ttcn<br>2 files changed, 194 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pcu/PCUIF_RAW_Components.ttcn b/pcu/PCUIF_RAW_Components.ttcn</span><br><span>index 2297bbd..7feeca2 100644</span><br><span>--- a/pcu/PCUIF_RAW_Components.ttcn</span><br><span>+++ b/pcu/PCUIF_RAW_Components.ttcn</span><br><span>@@ -97,8 +97,30 @@</span><br><span>         data := { tdma_fn := ? }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Commands are mostly used by the MTC to configure the components</span><br><span style="color: hsl(120, 100%, 40%);">+ * at run-time, e.g. to enable or disable some optional features. */</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated RAW_PCU_CommandType {</span><br><span style="color: hsl(120, 100%, 40%);">+    TDMA_CMD_ENABLE_PTCCH_UL_FWD    /*!< Enable forwarding of TDMA_EV_PTCCH_UL_BURST to the MTC */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record RAW_PCU_Command {</span><br><span style="color: hsl(120, 100%, 40%);">+        RAW_PCU_CommandType cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      anytype data optional</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) RAW_PCU_Command ts_RAW_PCU_CMD(RAW_PCU_CommandType cmd) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    cmd := cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+   data := omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template RAW_PCU_Command tr_RAW_PCU_CMD(template RAW_PCU_CommandType cmd := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       template anytype data := *) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      cmd := cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+   data := data</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Generic port for messages and events */</span><br><span> type port RAW_PCU_MSG_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+ inout RAW_PCU_Command;</span><br><span>       inout RAW_PCU_Event;</span><br><span>         inout PCUIF_Message;</span><br><span> } with { extension "internal" };</span><br><span>@@ -191,6 +213,9 @@</span><br><span>     port RAW_PCU_MSG_PT PCUIF;</span><br><span>   /* Connection towards the test case */</span><br><span>       port RAW_PCU_MSG_PT TC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Whether to forward PTCCH/U burst events to the TC */</span><br><span style="color: hsl(120, 100%, 40%);">+       var boolean cfg_ptcch_burst_fwd := false;</span><br><span> }</span><br><span> </span><br><span> private altstep as_BTS_CT_MsgQueue(integer bts_nr)</span><br><span>@@ -260,6 +285,11 @@</span><br><span>              PCUIF.send(pcu_msg);</span><br><span>                 repeat;</span><br><span>              }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Optional forwarding of PTCCH/U burst indications to the test case */</span><br><span style="color: hsl(120, 100%, 40%);">+       [cfg_ptcch_burst_fwd] CLCK.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {</span><br><span style="color: hsl(120, 100%, 40%);">+         TC.send(event);</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>    /* Ignore other clock events (and guard against an empty queue) */</span><br><span>   [] CLCK.receive(tr_RAW_PCU_CLCK_EV) { repeat; }</span><br><span> }</span><br><span>@@ -267,6 +297,7 @@</span><br><span> function f_BTS_CT_handler(integer bts_nr, PCUIF_info_ind info_ind)</span><br><span> runs on RAW_PCU_BTS_CT {</span><br><span>         var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    var RAW_PCU_Command cmd;</span><br><span>     var RAW_PCU_Event event;</span><br><span> </span><br><span>         /* Init TDMA clock generator (so we can stop and start it) */</span><br><span>@@ -308,6 +339,17 @@</span><br><span>         /* TDMA scheduler (clock and queue handling) */</span><br><span>      [] as_BTS_CT_TDMASched(bts_nr);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Command handling */</span><br><span style="color: hsl(120, 100%, 40%);">+        [] TC.receive(tr_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         log("Enabling forwarding of PTCCH/U TDMA events to the TC");</span><br><span style="color: hsl(120, 100%, 40%);">+                cfg_ptcch_burst_fwd := true;</span><br><span style="color: hsl(120, 100%, 40%);">+          repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] TC.receive(tr_RAW_PCU_CMD) -> value cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+               log("Ignore unhandled command: ", cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+             repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* TODO: handle events (e.g. disconnection) from the PCU interface */</span><br><span>        [] PCUIF.receive(tr_RAW_PCU_EV) -> value event {</span><br><span>          log("Ignore unhandled event: ", event);</span><br><span>diff --git a/pcu/PCU_Tests_RAW.ttcn b/pcu/PCU_Tests_RAW.ttcn</span><br><span>index 5bd966d..b5aec76 100644</span><br><span>--- a/pcu/PCU_Tests_RAW.ttcn</span><br><span>+++ b/pcu/PCU_Tests_RAW.ttcn</span><br><span>@@ -644,6 +644,157 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Test of correct Timing Advance during an active Uplink TBF.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Unlike the circuit-switched domain, Uplink transmissions on PDCH time-slots</span><br><span style="color: hsl(120, 100%, 40%);">+ * are not continuous and there can be long time gaps between them. This happens</span><br><span style="color: hsl(120, 100%, 40%);">+ * due to a bursty nature of packet data. The actual Timing Advance of a MS may</span><br><span style="color: hsl(120, 100%, 40%);">+ * significantly change between such rare Uplink transmissions, so GPRS introduces</span><br><span style="color: hsl(120, 100%, 40%);">+ * additional mechanisms to control Timing Advance, and thus reduce interference</span><br><span style="color: hsl(120, 100%, 40%);">+ * between neighboring TDMA time-slots.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * At the moment of Uplink TBF establishment, initial Timing Advance is measured</span><br><span style="color: hsl(120, 100%, 40%);">+ * from ToA (Timing of Arrival) of an Access Burst. This is covered by another</span><br><span style="color: hsl(120, 100%, 40%);">+ * test case - TC_ta_rach_imm_ass. In response to that Access Burst the network</span><br><span style="color: hsl(120, 100%, 40%);">+ * sends Immediate Assignment on AGCH, which _may_ contain Timing Advance Index</span><br><span style="color: hsl(120, 100%, 40%);">+ * among with the initial Timing Advance value. And here PTCCH comes to play.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * PTCCH is a unidirectional channel on which the network can instruct a sub-set</span><br><span style="color: hsl(120, 100%, 40%);">+ * of 16 MS (whether TBFs are active or not) to adjust their Timing Advance</span><br><span style="color: hsl(120, 100%, 40%);">+ * continuously. To ensure continuous measurements of the signal propagation</span><br><span style="color: hsl(120, 100%, 40%);">+ * delay, the MSs shall transmit Access Bursts on Uplink (PTCCH/U) on sub-slots</span><br><span style="color: hsl(120, 100%, 40%);">+ * defined by an assigned Timing Advance Index (see 3GPP TS 45.002).</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The purpose of this test case is to verify the assignment of Timing Advance</span><br><span style="color: hsl(120, 100%, 40%);">+ * Index, and the process of Timing Advance notification on PTCCH/D. The MTC</span><br><span style="color: hsl(120, 100%, 40%);">+ * first establishes several Uplink TBFs, but does not transmit any Uplink</span><br><span style="color: hsl(120, 100%, 40%);">+ * blocks on them. During 4 TDMA multi-frame periods the MTC is sending RACH</span><br><span style="color: hsl(120, 100%, 40%);">+ * indications to the PCU, checking the correctness of two received PTCCH/D</span><br><span style="color: hsl(120, 100%, 40%);">+ * messages (period of PTCCH/D is two multi-frames).</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_ta_ptcch(uint8_t bts_nr := 0, integer toa_factor := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer counter := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     var RAW_PCU_Event event;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Send Access Bursts on PTCCH/U for every TA Index */</span><br><span style="color: hsl(120, 100%, 40%);">+        [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {</span><br><span style="color: hsl(120, 100%, 40%);">+             log("Sending an Access Burst on PTCCH/U",</span><br><span style="color: hsl(120, 100%, 40%);">+               ", fn=", event.data.tdma_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                ", ToA=", counter * toa_factor);</span><br><span style="color: hsl(120, 100%, 40%);">+                /* TODO: do we care about RA and burst format? */</span><br><span style="color: hsl(120, 100%, 40%);">+             BTS.send(ts_PCUIF_RACH_IND(bts_nr := bts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     ra := oct2int('3A'O),</span><br><span style="color: hsl(120, 100%, 40%);">+                                         is_11bit := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        burst_type := BURST_TYPE_0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           fn := event.data.tdma_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     arfcn := 871,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         qta := counter * toa_factor * 4,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      sapi := PCU_IF_SAPI_PTCCH));</span><br><span style="color: hsl(120, 100%, 40%);">+               counter := counter + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_ta_ptcch_ul_multi_tbf(template PTCCHDownlinkMsg t_ta_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var PTCCHDownlinkMsg ta_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+  var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* First, send an RTS.req for the upcoming PTCCH/D block */</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS.send(ts_PCUIF_RTS_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 sapi := PCU_IF_SAPI_PTCCH, fn := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                           arfcn := 871, block_nr := 0));</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Keep sending of Access Bursts during two multi-frames (period of PTCCH/D)</span><br><span style="color: hsl(120, 100%, 40%);">+   * with increasing ToA (Timing of Arrival) values: 0, 7, 14, 28, 35... */</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_ta_ptcch(bts_nr := 0, toa_factor := 7);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* In the end of 2nd multi-frame we should receive a PTCCH/D block */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BTS.receive(tr_PCUIF_DATA_REQ(bts_nr := 0, trx_nr := 0, ts_nr := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         sapi := PCU_IF_SAPI_PTCCH)) -> value pcu_msg {</span><br><span style="color: hsl(120, 100%, 40%);">+            ta_msg := dec_PTCCHDownlinkMsg(pcu_msg.u.data_req.data);</span><br><span style="color: hsl(120, 100%, 40%);">+              log("Rx PTCCH/D message: ", ta_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Make sure Timing Advance values match our expectations */</span><br><span style="color: hsl(120, 100%, 40%);">+          if (match(ta_msg, t_ta_msg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BTS.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+    [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for a PTCCH/D block");</span><br><span style="color: hsl(120, 100%, 40%);">+            mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ta_ptcch_ul_multi_tbf() runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template PacketUlAssign t_ul_tbf_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+     var PacketUlAssign ul_tbf_ass[7];</span><br><span style="color: hsl(120, 100%, 40%);">+     var GsmRrMessage rr_msg[7];</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean ok;</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%);">+ /* Enable forwarding of PTCCH/U TDMA events to us */</span><br><span style="color: hsl(120, 100%, 40%);">+  BTS.send(ts_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Establish 7 Uplink TBFs (USF flag is 3 bits long, '111'B is reserved) */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < 7; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ok := f_establish_tbf(rr_msg[i], ta := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (not ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 setverdict(fail, "Failed to establish an Uplink TBF #", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                 mtc.stop;</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%);">+           /* Make sure we received an UL TBF Assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (match(rr_msg[i], tr_IMM_TBF_ASS(dl := false, rest := tr_IaRestOctets_ULAss(?)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        ul_tbf_ass[i] := rr_msg[i].payload.imm_ass.rest_octets.hh.pa.uldl.ass.ul;</span><br><span style="color: hsl(120, 100%, 40%);">+                     log("Rx Uplink TBF assignment for #", i, ": ", ul_tbf_ass[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "Failed to match UL TBF Assignment for #", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                     mtc.stop;</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%);">+           /* We expect incremental TFI/USF assignment (dynamic allocation) */</span><br><span style="color: hsl(120, 100%, 40%);">+           t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (not match(ul_tbf_ass[i], t_ul_tbf_ass)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                      mtc.stop;</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%);">+           /* We also expect Timing Advance Index to be a part of the assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (ul_tbf_ass[i].dynamic.ta_index != i) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "Failed to match Timing Advance Index for #", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* Keep going, the current OsmoPCU does not assign TA Index */</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%);">+   /* Now we have all 7 TBFs established in one-phase access mode,</span><br><span style="color: hsl(120, 100%, 40%);">+        * however we will not be sending any data on them. Instead, we</span><br><span style="color: hsl(120, 100%, 40%);">+        * will be sending RACH.ind on PTCCH/U during 4 multi-frame</span><br><span style="color: hsl(120, 100%, 40%);">+    * periods (TAI 0..8), and then will check two PTCCH/D blocks.</span><br><span style="color: hsl(120, 100%, 40%);">+         *</span><br><span style="color: hsl(120, 100%, 40%);">+     * Why not 4 TBFs at once? Because Uplink is delayed by 3 TDMA</span><br><span style="color: hsl(120, 100%, 40%);">+         * time-slots, so at the moment of scheduling a PTCCH/D block</span><br><span style="color: hsl(120, 100%, 40%);">+  * the PCU has odd number of PTCCH/U Access Bursts received. */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_TC_ta_ptcch_ul_multi_tbf(tr_PTCCHDownlinkMsg(</span><br><span style="color: hsl(120, 100%, 40%);">+               tai0_ta :=  7, tai1_ta := 14, tai2_ta := 21,</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Other values are not known (yet) */</span><br><span style="color: hsl(120, 100%, 40%);">+                tai3_ta := ?));</span><br><span style="color: hsl(120, 100%, 40%);">+       f_TC_ta_ptcch_ul_multi_tbf(tr_PTCCHDownlinkMsg(</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Other values are out of our interest */</span><br><span style="color: hsl(120, 100%, 40%);">+            tai0_ta :=  7, tai1_ta := 14, tai2_ta := 21,</span><br><span style="color: hsl(120, 100%, 40%);">+          tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Other values are not known (yet) */</span><br><span style="color: hsl(120, 100%, 40%);">+                tai6_ta := ?));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Default link quality adaptation (Coding Scheme) ranges:</span><br><span> /* CS1: ... 6 dB, CS2: 5 .. 8 dB, CS3: 7 .. 13 db, CS4: 12 ... dB */</span><br><span> private template integer CS1_lqual_dB_range := (-infinity .. 6);</span><br><span>@@ -760,6 +911,7 @@</span><br><span>         execute( TC_pcuif_suspend() );</span><br><span>       execute( TC_ta_ptcch_idle() );</span><br><span>       execute( TC_ta_rach_imm_ass() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_ta_ptcch_ul_multi_tbf() );</span><br><span>       execute( TC_cs_lqual_ul_tbf() );</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15672">change 15672</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/+/15672"/><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: I868f78e3e95a95f8f2e55e237eea700d7d4726a3 </div>
<div style="display:none"> Gerrit-Change-Number: 15672 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>