diff options
author | Pau Espin Pedrol <pespin@espeweb.net> | 2021-02-01 14:52:48 +0100 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2021-02-03 08:34:04 +0000 |
commit | 952cb3d5d7e07c3e22aac080a3d3ddc7925093c3 (patch) | |
tree | e241a4ac3ad54109f8881350fe093217182ed4bb /src/tbf.cpp | |
parent | a58ec615147e34a3860bdf92e067943499d21300 (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.cpp | 20 |
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); +} |