diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp index d73e55d..ed81981 100644 --- a/src/gprs_rlcmac_sched.cpp +++ b/src/gprs_rlcmac_sched.cpp @@ -239,7 +239,7 @@ static inline enum tbf_dl_prio tbf_compute_priority(const struct gprs_rlcmac_bts int age_thresh1 = msecs_to_frames(200); int age_thresh2 = msecs_to_frames(OSMO_MIN(msecs_t3190/2, dl_tbf_idle_msec)); - if (tbf->is_control_ts(ts) && tbf->need_control_ts()) + if (tbf->is_control_ts(ts) && tbf->need_poll_for_dl_ack_nack()) return DL_PRIO_CONTROL; if (tbf->is_control_ts(ts) && age > age_thresh2 && age_thresh2 > 0) diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp index bed7a08..34c5630 100644 --- a/src/tbf_dl.cpp +++ b/src/tbf_dl.cpp @@ -779,7 +779,6 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block( uint8_t *msg_data; struct msgb *dl_msg; unsigned msg_len; - bool need_poll; /* TODO: support MCS-7 - MCS-9, where data_block_idx can be 1 */ uint8_t data_block_idx = 0; unsigned int rrbp; @@ -940,23 +939,20 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block( if (m_last_dl_poll_fn < 0) m_last_dl_poll_fn = fn; - need_poll = state_fsm.state_flags & (1 << GPRS_RLCMAC_FLAG_TO_DL_ACK); - - /* poll after POLL_ACK_AFTER_FRAMES frames, or when final block is tx. - */ - if (m_tx_counter >= POLL_ACK_AFTER_FRAMES || m_dl_ack_requested || - need_poll) { + /* poll after POLL_ACK_AFTER_FRAMES frames, or when final block is tx or + * when last polled DL ACK/NACK was lost. */ + if (need_poll_for_dl_ack_nack()) { if (m_dl_ack_requested) { LOGPTBFDL(this, LOGL_DEBUG, "Scheduling Ack/Nack polling, because it was requested explicitly " "(e.g. first final block sent).\n"); - } else if (need_poll) { + } else if (state_fsm.state_flags & (1 << GPRS_RLCMAC_FLAG_TO_DL_ACK)) { LOGPTBFDL(this, LOGL_DEBUG, "Scheduling Ack/Nack polling, because polling timed out.\n"); } else { LOGPTBFDL(this, LOGL_DEBUG, "Scheduling Ack/Nack polling, because %d blocks sent.\n", - POLL_ACK_AFTER_FRAMES); + POLL_ACK_AFTER_FRAMES); } rc = check_polling(fn, ts, &new_poll_fn, &rrbp); @@ -1211,8 +1207,11 @@ void gprs_rlcmac_dl_tbf::request_dl_ack() m_dl_ack_requested = true; } -bool gprs_rlcmac_dl_tbf::need_control_ts() const +/* Does this DL TBF require to poll the MS for DL ACK/NACK? */ +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) || m_tx_counter >= POLL_ACK_AFTER_FRAMES || m_dl_ack_requested; diff --git a/src/tbf_dl.h b/src/tbf_dl.h index ad1469a..27b6a2c 100644 --- a/src/tbf_dl.h +++ b/src/tbf_dl.h @@ -53,7 +53,7 @@ struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf { void trigger_ass(struct gprs_rlcmac_tbf *old_tbf); void request_dl_ack(); - bool need_control_ts() const; + bool need_poll_for_dl_ack_nack() const; bool have_data() const; int frames_since_last_poll(unsigned fn) const; int frames_since_last_drain(unsigned fn) const;