aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-06-12 18:46:08 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2023-06-13 13:30:45 +0200
commitbb34ffaaf705e40f1792004eb0aa563273155ad3 (patch)
treec19e69a68fcb45548e8115712ba0b6f7106b7163
parent40b8dd55f16ff11ab3f983fe622aa87108210e4b (diff)
Move GPRS_RLCMAC_FLAG_TO_DL_ACK from state_fsm to dl_tbf
That flag was still in state_fsm for historical reasons (refactoring steps), but it's not really the best place for it, since it's really specific to dl_tbf and to transmit of data and DL ACK/NACK not the overall state of the TBF. Change-Id: I6b44121bbe185b58f3a77be8c12b4ef1f3180a30
-rw-r--r--src/tbf.cpp4
-rw-r--r--src/tbf.h2
-rw-r--r--src/tbf_dl.cpp11
-rw-r--r--src/tbf_dl.h3
4 files changed, 11 insertions, 9 deletions
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 885c6029..8981615f 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -560,11 +560,11 @@ void gprs_rlcmac_tbf::poll_timeout(struct gprs_rlcmac_pdch *pdch, uint32_t poll_
dl_tbf = tbf_as_dl_tbf(this);
/* POLL Timeout expecting DL ACK/NACK: implies direction == GPRS_RLCMAC_DL_TBF */
OSMO_ASSERT(dl_tbf);
- if (!(dl_tbf->state_fsm.state_flags & (1 << GPRS_RLCMAC_FLAG_TO_DL_ACK))) {
+ if (!dl_tbf->m_last_dl_poll_ack_lost) {
LOGPTBF(this, LOGL_NOTICE,
"Timeout for polling PACKET DOWNLINK ACK: %s\n",
tbf_rlcmac_diag(dl_tbf));
- dl_tbf->state_fsm.state_flags |= (1 << GPRS_RLCMAC_FLAG_TO_DL_ACK);
+ dl_tbf->m_last_dl_poll_ack_lost = true;
}
if (dl_tbf->state_is(TBF_ST_RELEASING))
bts_do_rate_ctr_inc(bts, CTR_RLC_REL_TIMEDOUT);
diff --git a/src/tbf.h b/src/tbf.h
index 37756b01..941e350a 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -110,8 +110,6 @@ enum tbf_counters { /* TBF counters from 3GPP TS 44.060 ยง13.4 */
#define GPRS_RLCMAC_FLAG_CCCH 0 /* assignment on CCCH */
#define GPRS_RLCMAC_FLAG_PACCH 1 /* assignment on PACCH */
#define GPRS_RLCMAC_FLAG_DL_ACK 2 /* DL TBF: At least one DL ACK/NACK was recieved since it was assigned */
-#define GPRS_RLCMAC_FLAG_TO_DL_ACK 3 /* DL TBF: Failed to receive last polled DL ACK/NACK */
-
#define TBF_TFI_UNSET 0xff
#define T_START(tbf, t, T, r, f) tbf->t_start(t, T, r, f, __FILE__, __LINE__)
diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp
index 3ffafbfe..170ed251 100644
--- a/src/tbf_dl.cpp
+++ b/src/tbf_dl.cpp
@@ -162,6 +162,7 @@ gprs_rlcmac_dl_tbf::gprs_rlcmac_dl_tbf(struct gprs_rlcmac_bts *bts_, GprsMs *ms)
m_tx_counter(0),
m_dl_ack_requested(false),
m_last_dl_poll_fn(-1),
+ m_last_dl_poll_ack_lost(false),
m_last_dl_drained_fn(-1),
m_dl_gprs_ctrs(NULL),
m_dl_egprs_ctrs(NULL)
@@ -858,7 +859,7 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
LOGPTBFDL(this, LOGL_DEBUG,
"Scheduling Ack/Nack polling, because it was requested explicitly "
"(e.g. first final block sent).\n");
- } else if (state_fsm.state_flags & (1 << GPRS_RLCMAC_FLAG_TO_DL_ACK)) {
+ } else if (m_last_dl_poll_ack_lost) {
LOGPTBFDL(this, LOGL_DEBUG,
"Scheduling Ack/Nack polling, because polling timed out.\n");
} else {
@@ -879,10 +880,10 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
if (is_final)
T_START(this, T3191, 3191, "final block (DL-TBF)", true);
- state_fsm.state_flags &= ~(1 << GPRS_RLCMAC_FLAG_TO_DL_ACK); /* clear poll timeout flag */
-
/* Clear request flag */
m_dl_ack_requested = false;
+ /* clear poll timeout flag */
+ m_last_dl_poll_ack_lost = false;
/* set polling in header */
rlc.rrbp = rrbp;
@@ -1080,7 +1081,7 @@ int gprs_rlcmac_dl_tbf::rcvd_dl_ack(bool final_ack, unsigned first_bsn,
LOGPTBFDL(this, LOGL_DEBUG, "downlink acknowledge\n");
state_fsm.state_flags |= (1 << GPRS_RLCMAC_FLAG_DL_ACK);
- state_fsm.state_flags &= ~(1 << GPRS_RLCMAC_FLAG_TO_DL_ACK);
+ m_last_dl_poll_ack_lost = false;
/* reset N3105 */
n_reset(N3105);
@@ -1118,7 +1119,7 @@ bool gprs_rlcmac_dl_tbf::need_poll_for_dl_ack_nack() const
{
/* poll after POLL_ACK_AFTER_FRAMES frames, or when final block is tx or
* when last polled DL ACK/NACK was lost. */
- return state_fsm.state_flags & (1 << GPRS_RLCMAC_FLAG_TO_DL_ACK) ||
+ return m_last_dl_poll_ack_lost ||
m_tx_counter >= POLL_ACK_AFTER_FRAMES ||
m_dl_ack_requested;
}
diff --git a/src/tbf_dl.h b/src/tbf_dl.h
index 6718c13b..ec75e327 100644
--- a/src/tbf_dl.h
+++ b/src/tbf_dl.h
@@ -71,6 +71,9 @@ struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf {
int32_t m_tx_counter; /* count all transmitted blocks */
bool m_dl_ack_requested;
int32_t m_last_dl_poll_fn;
+ /* Whether we failed to receive ("poll timeout") last PKT CTRL ACK from
+ * MS polled during DL ACK/NACK with RRBP set in "m_last_dl_poll_fn": */
+ bool m_last_dl_poll_ack_lost;
int32_t m_last_dl_drained_fn;
struct BandWidth {