<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/22604">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">nacc: Implement Pkt Cell Change Continue retransmission<br><br>Use the fact that the MS must answer the RRBP of the Pkt Cell Change<br>Continue with a CTRL ACK to find out whether the message was received<br>successfuly or a retransmission is potentially required.<br><br>3GPP TS 44.060:<br>"""<br>When the mobile station receives the PACKET CELL CHANGE ORDER or<br>the PACKET CELL CHANGE CONTINUE message the mobile station shall<br>transmit a PACKET CONTROL ACKNOWLEDGMENT message in the specified<br>uplink radio block if a valid RRBP field is received as part of the<br>message; the mobile station may then switch to a new cell.<br>"""<br><br>Related: SYS#4909<br>Change-Id: I7cc28922e71699598da0ef6eb90136a47d3c002f<br>---<br>M src/encoding.cpp<br>M src/encoding.h<br>M src/gprs_ms.c<br>M src/gprs_ms.h<br>M src/gprs_rlcmac_sched.cpp<br>M src/nacc_fsm.c<br>M src/nacc_fsm.h<br>M src/pdch.cpp<br>M src/tbf.cpp<br>M src/tbf.h<br>10 files changed, 105 insertions(+), 17 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/encoding.cpp b/src/encoding.cpp</span><br><span>index 38bc175..8bc8d15 100644</span><br><span>--- a/src/encoding.cpp</span><br><span>+++ b/src/encoding.cpp</span><br><span>@@ -1757,14 +1757,14 @@</span><br><span>       block->u.Packet_Neighbour_Cell_Data.Container = *container;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void write_packet_cell_change_continue(RlcMacDownlink_t *block,</span><br><span style="color: hsl(0, 100%, 40%);">-          bool tfi_is_dl, uint8_t tfi, bool exist_id,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint16_t arfcn, uint8_t bsic, uint8_t container_id)</span><br><span style="color: hsl(120, 100%, 40%);">+void write_packet_cell_change_continue(RlcMacDownlink_t *block, uint8_t poll, uint8_t rrbp,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     bool tfi_is_dl, uint8_t tfi, bool exist_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   uint16_t arfcn, uint8_t bsic, uint8_t container_id)</span><br><span> {</span><br><span> </span><br><span>  block->PAYLOAD_TYPE = 0x1;  // RLC/MAC control block that does not include the optional octets of the RLC/MAC control header</span><br><span style="color: hsl(0, 100%, 40%);">- block->RRBP         = 0;  // 0: N+13</span><br><span style="color: hsl(0, 100%, 40%);">- block->SP           = 0; // RRBP field is not valid</span><br><span style="color: hsl(120, 100%, 40%);">+        block->RRBP         = rrbp;  // RRBP (e.g. N+13)</span><br><span style="color: hsl(120, 100%, 40%);">+   block->SP           = poll;  // RRBP field is valid?</span><br><span>      block->USF          = 0x0;  // Uplink state flag</span><br><span> </span><br><span>      block->u.Packet_Cell_Change_Continue.MESSAGE_TYPE = MT_PACKET_CELL_CHANGE_CONTINUE;</span><br><span>diff --git a/src/encoding.h b/src/encoding.h</span><br><span>index 4ebfa35..89d057c 100644</span><br><span>--- a/src/encoding.h</span><br><span>+++ b/src/encoding.h</span><br><span>@@ -124,9 +124,9 @@</span><br><span>            bool tfi_is_dl, uint8_t tfi, uint8_t container_id,</span><br><span>           uint8_t container_idx, PNCDContainer_t *container);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void write_packet_cell_change_continue(RlcMacDownlink_t *block,</span><br><span style="color: hsl(0, 100%, 40%);">-          bool tfi_is_dl, uint8_t tfi, bool exist_id,</span><br><span style="color: hsl(0, 100%, 40%);">-             uint16_t arfcn, uint8_t bsic, uint8_t container_id);</span><br><span style="color: hsl(120, 100%, 40%);">+void write_packet_cell_change_continue(RlcMacDownlink_t *block, uint8_t poll, uint8_t rrbp,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    bool tfi_is_dl, uint8_t tfi, bool exist_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   uint16_t arfcn, uint8_t bsic, uint8_t container_id);</span><br><span> </span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span>diff --git a/src/gprs_ms.c b/src/gprs_ms.c</span><br><span>index 8078b10..ab1a067 100644</span><br><span>--- a/src/gprs_ms.c</span><br><span>+++ b/src/gprs_ms.c</span><br><span>@@ -958,13 +958,17 @@</span><br><span>  return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *ms_nacc_create_rlcmac_msg(struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *ms_nacc_create_rlcmac_msg(struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf, uint32_t fn, uint8_t ts)</span><br><span> {</span><br><span>   int rc;</span><br><span>      struct nacc_ev_create_rlcmac_msg_ctx data_ctx;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      data_ctx.tbf = tbf;</span><br><span style="color: hsl(0, 100%, 40%);">-     data_ctx.msg = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  data_ctx = (struct nacc_ev_create_rlcmac_msg_ctx) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   .tbf = tbf,</span><br><span style="color: hsl(120, 100%, 40%);">+                   .fn = fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                     .ts = ts,</span><br><span style="color: hsl(120, 100%, 40%);">+                     .msg = NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+  };</span><br><span> </span><br><span>       rc = osmo_fsm_inst_dispatch(ms->nacc->fi, NACC_EV_CREATE_RLCMAC_MSG, &data_ctx);</span><br><span>   if (rc != 0 || !data_ctx.msg)</span><br><span>diff --git a/src/gprs_ms.h b/src/gprs_ms.h</span><br><span>index c57bbf6..6674261 100644</span><br><span>--- a/src/gprs_ms.h</span><br><span>+++ b/src/gprs_ms.h</span><br><span>@@ -144,7 +144,7 @@</span><br><span> </span><br><span> int ms_nacc_start(struct GprsMs *ms, Packet_Cell_Change_Notification_t *notif);</span><br><span> bool ms_nacc_rts(const struct GprsMs *ms);</span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *ms_nacc_create_rlcmac_msg(struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *ms_nacc_create_rlcmac_msg(struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf, uint32_t fn, uint8_t ts);</span><br><span> </span><br><span> static inline bool ms_is_idle(const struct GprsMs *ms)</span><br><span> {</span><br><span>diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp</span><br><span>index a8f65de..5f029a0 100644</span><br><span>--- a/src/gprs_rlcmac_sched.cpp</span><br><span>+++ b/src/gprs_rlcmac_sched.cpp</span><br><span>@@ -203,7 +203,7 @@</span><br><span>                         else if (tbf == tbfs->ul_ack)</span><br><span>                             msg = tbfs->ul_ack->create_ul_ack(fn, ts);</span><br><span>                     else if (tbf == tbfs->nacc) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                msg = ms_nacc_create_rlcmac_msg(tbf->ms(), tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+                           msg = ms_nacc_create_rlcmac_msg(tbf->ms(), tbf, fn, ts);</span><br><span>                  }</span><br><span> </span><br><span>                        if (!msg) {</span><br><span>diff --git a/src/nacc_fsm.c b/src/nacc_fsm.c</span><br><span>index d160404..b479f9c 100644</span><br><span>--- a/src/nacc_fsm.c</span><br><span>+++ b/src/nacc_fsm.c</span><br><span>@@ -46,6 +46,7 @@</span><br><span>         [NACC_ST_WAIT_REQUEST_SI] = { .T = PCU_TDEF_SI_RESOLVE_TO },</span><br><span>         [NACC_ST_TX_NEIGHBOUR_DATA] = {},</span><br><span>    [NACC_ST_TX_CELL_CHG_CONTINUE] = {},</span><br><span style="color: hsl(120, 100%, 40%);">+  [NACC_ST_WAIT_CELL_CHG_CONTINUE_ACK] = {}, /* Timeout through event controlled by tbf::poll_timeout() */</span><br><span>     [NACC_ST_DONE] = {},</span><br><span> };</span><br><span> </span><br><span>@@ -64,6 +65,8 @@</span><br><span>   { NACC_EV_RX_RAC_CI, "RX_RAC_CI" },</span><br><span>        { NACC_EV_RX_SI, "RX_SI" },</span><br><span>        { NACC_EV_CREATE_RLCMAC_MSG, "CREATE_RLCMAC_MSG" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { NACC_EV_RX_CELL_CHG_CONTINUE_ACK, "RX_CELL_CHG_CONTINUE_ACK"},</span><br><span style="color: hsl(120, 100%, 40%);">+    { NACC_EV_TIMEOUT_CELL_CHG_CONTINUE, "TIMEOUT_CELL_CHG_CONTINUE" },</span><br><span>        { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>@@ -156,12 +159,21 @@</span><br><span> </span><br><span> /* TS 44 060 11.2.2a Packet Cell Change Continue */</span><br><span> static struct msgb *create_packet_cell_chg_continue(const struct nacc_fsm_ctx *ctx,</span><br><span style="color: hsl(0, 100%, 40%);">-                                             const struct gprs_rlcmac_tbf *tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    const struct nacc_ev_create_rlcmac_msg_ctx *data,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             uint32_t *new_poll_fn)</span><br><span> {</span><br><span>      struct msgb *msg;</span><br><span>    int rc;</span><br><span>      RlcMacDownlink_t *mac_control_block;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gprs_rlcmac_tbf *tbf = data->tbf;</span><br><span>  struct GprsMs *ms = tbf_ms(tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int rrbp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = tbf_check_polling(tbf, data->fn, data->ts, new_poll_fn, &rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DTBF, LOGL_ERROR, "Failed registering poll for Pkt Cell Chg Continue (%d)\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> </span><br><span>        msg = msgb_alloc(GSM_MACBLOCK_LEN, "pkt_cell_chg_continue");</span><br><span>       if (!msg)</span><br><span>@@ -180,7 +192,7 @@</span><br><span>      uint8_t tfi_is_dl = tbf_direction(tbf) == GPRS_RLCMAC_DL_TBF;</span><br><span>        uint8_t tfi = tbf_tfi(tbf);</span><br><span>  uint8_t container_id = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       write_packet_cell_change_continue(mac_control_block, tfi_is_dl, tfi, true,</span><br><span style="color: hsl(120, 100%, 40%);">+    write_packet_cell_change_continue(mac_control_block, 1, rrbp, tfi_is_dl, tfi, true,</span><br><span>                  ctx->neigh_key.tgt_arfcn, ctx->neigh_key.tgt_bsic, container_id);</span><br><span>      LOGP(DNACC, LOGL_DEBUG, "+++++++++++++++++++++++++ TX : Packet Cell Change Continue +++++++++++++++++++++++++\n");</span><br><span>         rc = encode_gsm_rlcmac_downlink(&bv, mac_control_block);</span><br><span>@@ -191,6 +203,7 @@</span><br><span>   LOGP(DNACC, LOGL_DEBUG, "------------------------- TX : Packet Cell Change Continue -------------------------\n");</span><br><span>         rate_ctr_inc(&bts_rate_counters(ms->bts)->ctr[CTR_PKT_CELL_CHG_CONTINUE]);</span><br><span>         talloc_free(mac_control_block);</span><br><span style="color: hsl(120, 100%, 40%);">+       tbf_set_polling(tbf, *new_poll_fn, data->ts, GPRS_RLCMAC_POLL_CELL_CHG_CONTINUE);</span><br><span>         return msg;</span><br><span> </span><br><span> free_ret:</span><br><span>@@ -458,7 +471,24 @@</span><br><span>  switch (event) {</span><br><span>     case NACC_EV_CREATE_RLCMAC_MSG:</span><br><span>              data_ctx = (struct nacc_ev_create_rlcmac_msg_ctx *)data;</span><br><span style="color: hsl(0, 100%, 40%);">-                data_ctx->msg = create_packet_cell_chg_continue(ctx, data_ctx->tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+            data_ctx->msg = create_packet_cell_chg_continue(ctx, data_ctx, &ctx->continue_poll_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (data_ctx->msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       ctx->continue_poll_ts = data_ctx->ts;</span><br><span style="color: hsl(120, 100%, 40%);">+                   nacc_fsm_state_chg(fi, NACC_ST_WAIT_CELL_CHG_CONTINUE_ACK);</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%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(0);</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%);">+static void st_wait_cell_chg_continue_ack(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case NACC_EV_TIMEOUT_CELL_CHG_CONTINUE:</span><br><span style="color: hsl(120, 100%, 40%);">+               nacc_fsm_state_chg(fi, NACC_ST_TX_CELL_CHG_CONTINUE);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NACC_EV_RX_CELL_CHG_CONTINUE_ACK:</span><br><span>               nacc_fsm_state_chg(fi, NACC_ST_DONE);</span><br><span>                break;</span><br><span>       default:</span><br><span>@@ -543,10 +573,20 @@</span><br><span>                     X(NACC_EV_RX_SI) |</span><br><span>                   X(NACC_EV_CREATE_RLCMAC_MSG),</span><br><span>                .out_state_mask =</span><br><span style="color: hsl(0, 100%, 40%);">-                       X(NACC_ST_DONE),</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(NACC_ST_WAIT_CELL_CHG_CONTINUE_ACK),</span><br><span>               .name = "TX_CELL_CHG_CONTINUE",</span><br><span>            .action = st_cell_chg_continue,</span><br><span>      },</span><br><span style="color: hsl(120, 100%, 40%);">+    [NACC_ST_WAIT_CELL_CHG_CONTINUE_ACK] = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .in_event_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(NACC_EV_RX_CELL_CHG_CONTINUE_ACK) |</span><br><span style="color: hsl(120, 100%, 40%);">+                 X(NACC_EV_TIMEOUT_CELL_CHG_CONTINUE),</span><br><span style="color: hsl(120, 100%, 40%);">+         .out_state_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                     X(NACC_ST_TX_CELL_CHG_CONTINUE) |</span><br><span style="color: hsl(120, 100%, 40%);">+                     X(NACC_ST_DONE),</span><br><span style="color: hsl(120, 100%, 40%);">+              .name = "WAIT_CELL_CHG_CONTINUE_ACK",</span><br><span style="color: hsl(120, 100%, 40%);">+               .action = st_wait_cell_chg_continue_ack,</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span>   [NACC_ST_DONE] = {</span><br><span>           .in_event_mask = 0,</span><br><span>          .out_state_mask = 0,</span><br><span>diff --git a/src/nacc_fsm.h b/src/nacc_fsm.h</span><br><span>index 9107daf..7b0adfd 100644</span><br><span>--- a/src/nacc_fsm.h</span><br><span>+++ b/src/nacc_fsm.h</span><br><span>@@ -32,6 +32,8 @@</span><br><span>        NACC_EV_RX_RAC_CI, /* no data passed, RAC_CI became available in neigh_cache */</span><br><span>      NACC_EV_RX_SI, /* data: struct si_cache_entry* */</span><br><span>    NACC_EV_CREATE_RLCMAC_MSG, /* data: struct nacc_ev_create_rlcmac_msg_ctx* */</span><br><span style="color: hsl(120, 100%, 40%);">+  NACC_EV_RX_CELL_CHG_CONTINUE_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+     NACC_EV_TIMEOUT_CELL_CHG_CONTINUE, /* Poll Timeout */</span><br><span> };</span><br><span> </span><br><span> enum nacc_fsm_states {</span><br><span>@@ -40,6 +42,7 @@</span><br><span>        NACC_ST_WAIT_REQUEST_SI,</span><br><span>     NACC_ST_TX_NEIGHBOUR_DATA,</span><br><span>   NACC_ST_TX_CELL_CHG_CONTINUE,</span><br><span style="color: hsl(120, 100%, 40%);">+ NACC_ST_WAIT_CELL_CHG_CONTINUE_ACK,</span><br><span>  NACC_ST_DONE,</span><br><span> };</span><br><span> </span><br><span>@@ -53,11 +56,15 @@</span><br><span>        struct si_cache_value si_info; /* SI info resolved from SGSN, to be sent to MS */</span><br><span>    size_t si_info_bytes_sent; /* How many bytes out of si_info->si_len were already sent to MS */</span><br><span>    size_t container_idx; /* Next container_idx to assign when sending Packet Neighbor Data message */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t continue_poll_fn; /* Scheduled poll FN to CTRL ACK the Pkt Cell Chg Continue */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t continue_poll_ts; /* Scheduled poll TS to CTRL ACK the Pkt Cell Chg Continue */</span><br><span> };</span><br><span> </span><br><span> /* passed as data in NACC_EV_CREATE_RLCMAC_MSG */</span><br><span> struct nacc_ev_create_rlcmac_msg_ctx {</span><br><span>     struct gprs_rlcmac_tbf *tbf; /* target tbf to create messages for */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t fn; /* FN where the created DL ctrl block is to be sent */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t ts; /* TS where the created DL ctrl block is to be sent */</span><br><span>   struct msgb *msg; /* to be filled by FSM during event processing */</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/pdch.cpp b/src/pdch.cpp</span><br><span>index 2028ba2..787208c 100644</span><br><span>--- a/src/pdch.cpp</span><br><span>+++ b/src/pdch.cpp</span><br><span>@@ -47,6 +47,7 @@</span><br><span> </span><br><span> #include "coding_scheme.h"</span><br><span> #include "gsm_rlcmac.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "nacc_fsm.h"</span><br><span> }</span><br><span> </span><br><span> #include <errno.h></span><br><span>@@ -394,6 +395,19 @@</span><br><span> </span><br><span>             return;</span><br><span>      }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ms->nacc && ms->nacc->fi->state == NACC_ST_WAIT_CELL_CHG_CONTINUE_ACK &&</span><br><span style="color: hsl(120, 100%, 40%);">+          ms->nacc->continue_poll_fn == fn && ms->nacc->continue_poll_ts == ts_no) {</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_fsm_inst_dispatch(ms->nacc->fi, NACC_EV_RX_CELL_CHG_CONTINUE_ACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Don't assume MS is no longer reachable (hence don't free) after this: TS 44.060</span><br><span style="color: hsl(120, 100%, 40%);">+             * "When the mobile station receives the PACKET CELL CHANGE ORDER</span><br><span style="color: hsl(120, 100%, 40%);">+                 * or the PACKET CELL CHANGE CONTINUE message the mobile station</span><br><span style="color: hsl(120, 100%, 40%);">+               * shall transmit a PACKET CONTROL ACKNOWLEDGMENT message in the</span><br><span style="color: hsl(120, 100%, 40%);">+               * specified uplink radio block if a valid RRBP field is</span><br><span style="color: hsl(120, 100%, 40%);">+               * received as part of the message; the mobile station _MAY_ then</span><br><span style="color: hsl(120, 100%, 40%);">+              * switch to a new cell."</span><br><span style="color: hsl(120, 100%, 40%);">+                 */</span><br><span style="color: hsl(120, 100%, 40%);">+           return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    LOGP(DRLCMAC, LOGL_ERROR, "Error: received PACET CONTROL ACK "</span><br><span>             "at no request\n");</span><br><span> }</span><br><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index 35bd81d..7caa2ce 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -49,6 +49,7 @@</span><br><span> </span><br><span> #include "gsm_rlcmac.h"</span><br><span> #include "coding_scheme.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "nacc_fsm.h"</span><br><span> }</span><br><span> </span><br><span> #include <errno.h></span><br><span>@@ -614,6 +615,10 @@</span><br><span>                LOGPTBFDL(this, LOGL_DEBUG, "Scheduled DL Acknowledgement polling on %s (FN=%d, TS=%d)\n",</span><br><span>                           chan, poll_fn, poll_ts);</span><br><span>           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GPRS_RLCMAC_POLL_CELL_CHG_CONTINUE:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPTBFDL(this, LOGL_DEBUG, "Scheduled 'Packet Cell Change Continue' polling on %s (FN=%d, TS=%d)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                         chan, poll_fn, poll_ts);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span>@@ -690,6 +695,11 @@</span><br><span>            }</span><br><span>            /* reschedule DL assignment */</span><br><span>               dl_ass_state = GPRS_RLCMAC_DL_ASS_SEND_ASS;</span><br><span style="color: hsl(120, 100%, 40%);">+   } else if (m_ms->nacc && m_ms->nacc->fi->state == NACC_ST_WAIT_CELL_CHG_CONTINUE_ACK &&</span><br><span style="color: hsl(120, 100%, 40%);">+              m_ms->nacc->continue_poll_fn == poll_fn && m_ms->nacc->continue_poll_ts == poll_ts) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Timeout waiting for CTRL ACK acking Pkt Cell Change Continue */</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_fsm_inst_dispatch(m_ms->nacc->fi, NACC_EV_TIMEOUT_CELL_CHG_CONTINUE, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span>      } else if (direction == GPRS_RLCMAC_DL_TBF) {</span><br><span>                gprs_rlcmac_dl_tbf *dl_tbf = as_dl_tbf(this);</span><br><span> </span><br><span>@@ -1203,3 +1213,13 @@</span><br><span> {</span><br><span>      return tbf->tfi();</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int tbf_check_polling(const struct gprs_rlcmac_tbf *tbf, uint32_t fn, uint8_t ts, uint32_t *poll_fn, unsigned int *rrbp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return tbf->check_polling(fn, ts, poll_fn, rrbp);</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%);">+void tbf_set_polling(struct gprs_rlcmac_tbf *tbf, uint32_t new_poll_fn, uint8_t ts, enum gprs_rlcmac_tbf_poll_type t)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return tbf->set_polling(new_poll_fn, ts, t);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/tbf.h b/src/tbf.h</span><br><span>index 1d28afb..989ec08 100644</span><br><span>--- a/src/tbf.h</span><br><span>+++ b/src/tbf.h</span><br><span>@@ -68,6 +68,7 @@</span><br><span>      GPRS_RLCMAC_POLL_DL_ASS,</span><br><span>     GPRS_RLCMAC_POLL_UL_ACK,</span><br><span>     GPRS_RLCMAC_POLL_DL_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+      GPRS_RLCMAC_POLL_CELL_CHG_CONTINUE,</span><br><span> };</span><br><span> </span><br><span> enum gprs_rlcmac_tbf_poll_state {</span><br><span>@@ -206,6 +207,8 @@</span><br><span> bool tbf_is_tfi_assigned(const struct gprs_rlcmac_tbf *tbf);</span><br><span> uint8_t tbf_tfi(const struct gprs_rlcmac_tbf *tbf);</span><br><span> int tbf_assign_control_ts(struct gprs_rlcmac_tbf *tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+int tbf_check_polling(const struct gprs_rlcmac_tbf *tbf, uint32_t fn, uint8_t ts, uint32_t *poll_fn, unsigned int *rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+void tbf_set_polling(struct gprs_rlcmac_tbf *tbf, uint32_t new_poll_fn, uint8_t ts, enum gprs_rlcmac_tbf_poll_type t);</span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span> #endif</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/22604">change 22604</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-pcu/+/22604"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I7cc28922e71699598da0ef6eb90136a47d3c002f </div>
<div style="display:none"> Gerrit-Change-Number: 22604 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>