aboutsummaryrefslogtreecommitdiffstats
path: root/src/tbf.cpp
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@espeweb.net>2021-02-01 14:52:48 +0100
committerlaforge <laforge@osmocom.org>2021-02-03 08:34:04 +0000
commit952cb3d5d7e07c3e22aac080a3d3ddc7925093c3 (patch)
treee241a4ac3ad54109f8881350fe093217182ed4bb /src/tbf.cpp
parenta58ec615147e34a3860bdf92e067943499d21300 (diff)
nacc: Implement Pkt Cell Change Continue retransmission
Use the fact that the MS must answer the RRBP of the Pkt Cell Change Continue with a CTRL ACK to find out whether the message was received successfuly or a retransmission is potentially required. 3GPP TS 44.060: """ When the mobile station receives the PACKET CELL CHANGE ORDER or the PACKET CELL CHANGE CONTINUE message the mobile station shall transmit a PACKET CONTROL ACKNOWLEDGMENT message in the specified uplink radio block if a valid RRBP field is received as part of the message; the mobile station may then switch to a new cell. """ Related: SYS#4909 Change-Id: I7cc28922e71699598da0ef6eb90136a47d3c002f
Diffstat (limited to 'src/tbf.cpp')
-rw-r--r--src/tbf.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 35bd81d0..7caa2cea 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -49,6 +49,7 @@ extern "C" {
#include "gsm_rlcmac.h"
#include "coding_scheme.h"
+#include "nacc_fsm.h"
}
#include <errno.h>
@@ -614,6 +615,10 @@ void gprs_rlcmac_tbf::set_polling(uint32_t new_poll_fn, uint8_t ts, enum gprs_rl
LOGPTBFDL(this, LOGL_DEBUG, "Scheduled DL Acknowledgement polling on %s (FN=%d, TS=%d)\n",
chan, poll_fn, poll_ts);
break;
+ case GPRS_RLCMAC_POLL_CELL_CHG_CONTINUE:
+ LOGPTBFDL(this, LOGL_DEBUG, "Scheduled 'Packet Cell Change Continue' polling on %s (FN=%d, TS=%d)\n",
+ chan, poll_fn, poll_ts);
+ break;
}
}
@@ -690,6 +695,11 @@ void gprs_rlcmac_tbf::poll_timeout()
}
/* reschedule DL assignment */
dl_ass_state = GPRS_RLCMAC_DL_ASS_SEND_ASS;
+ } else if (m_ms->nacc && m_ms->nacc->fi->state == NACC_ST_WAIT_CELL_CHG_CONTINUE_ACK &&
+ m_ms->nacc->continue_poll_fn == poll_fn && m_ms->nacc->continue_poll_ts == poll_ts) {
+ /* Timeout waiting for CTRL ACK acking Pkt Cell Change Continue */
+ osmo_fsm_inst_dispatch(m_ms->nacc->fi, NACC_EV_TIMEOUT_CELL_CHG_CONTINUE, NULL);
+ return;
} else if (direction == GPRS_RLCMAC_DL_TBF) {
gprs_rlcmac_dl_tbf *dl_tbf = as_dl_tbf(this);
@@ -1203,3 +1213,13 @@ uint8_t tbf_tfi(const struct gprs_rlcmac_tbf *tbf)
{
return tbf->tfi();
}
+
+int tbf_check_polling(const struct gprs_rlcmac_tbf *tbf, uint32_t fn, uint8_t ts, uint32_t *poll_fn, unsigned int *rrbp)
+{
+ return tbf->check_polling(fn, ts, poll_fn, rrbp);
+}
+
+void tbf_set_polling(struct gprs_rlcmac_tbf *tbf, uint32_t new_poll_fn, uint8_t ts, enum gprs_rlcmac_tbf_poll_type t)
+{
+ return tbf->set_polling(new_poll_fn, ts, t);
+}