forked from cellular-infrastructure/osmo-pcu
Encapsulate handling of UL ACK timeout
Use helper methods instead checking and manipulating flag directly. Change-Id: Ia3f009c52118db95b38a077e08eecda844e7f8d1 Related: OS#1539
This commit is contained in:
parent
c4178e55ea
commit
fd13f6c199
15
src/bts.cpp
15
src/bts.cpp
|
@ -998,6 +998,7 @@ void gprs_rlcmac_pdch::rcv_control_ack(Packet_Control_Acknowledgement_t *packet,
|
|||
struct gprs_rlcmac_tbf *tbf, *new_tbf;
|
||||
uint32_t tlli = packet->TLLI;
|
||||
GprsMs *ms = bts()->ms_by_tlli(tlli);
|
||||
gprs_rlcmac_ul_tbf *ul_tbf;
|
||||
|
||||
tbf = bts()->ul_tbf_by_poll_fn(fn, trx_no(), ts_no);
|
||||
if (!tbf)
|
||||
|
@ -1024,16 +1025,12 @@ void gprs_rlcmac_pdch::rcv_control_ack(Packet_Control_Acknowledgement_t *packet,
|
|||
tbf->poll_state = GPRS_RLCMAC_POLL_NONE;
|
||||
|
||||
/* check if this control ack belongs to packet uplink ack */
|
||||
if (tbf->ul_ack_state == GPRS_RLCMAC_UL_ACK_WAIT_ACK) {
|
||||
ul_tbf = as_ul_tbf(tbf);
|
||||
if (ul_tbf && ul_tbf->handle_ctrl_ack()) {
|
||||
LOGP(DRLCMAC, LOGL_DEBUG, "TBF: [UPLINK] END %s\n", tbf_name(tbf));
|
||||
tbf->ul_ack_state = GPRS_RLCMAC_UL_ACK_NONE;
|
||||
if ((tbf->state_flags &
|
||||
(1 << GPRS_RLCMAC_FLAG_TO_UL_ACK))) {
|
||||
tbf->state_flags &=
|
||||
~(1 << GPRS_RLCMAC_FLAG_TO_UL_ACK);
|
||||
LOGP(DRLCMAC, LOGL_NOTICE, "Recovered uplink "
|
||||
"ack for UL %s\n", tbf_name(tbf));
|
||||
}
|
||||
if (ul_tbf->ctrl_ack_to_toggle())
|
||||
LOGP(DRLCMAC, LOGL_NOTICE, "Recovered uplink ack for UL %s\n", tbf_name(tbf));
|
||||
|
||||
tbf_free(tbf);
|
||||
return;
|
||||
}
|
||||
|
|
22
src/tbf.cpp
22
src/tbf.cpp
|
@ -607,27 +607,25 @@ void gprs_rlcmac_tbf::set_polling(uint32_t new_poll_fn, uint8_t ts)
|
|||
|
||||
void gprs_rlcmac_tbf::poll_timeout()
|
||||
{
|
||||
gprs_rlcmac_ul_tbf *ul_tbf = as_ul_tbf(this);
|
||||
|
||||
LOGP(DRLCMAC, LOGL_NOTICE, "%s poll timeout for FN=%d, TS=%d (curr FN %d)\n",
|
||||
tbf_name(this), poll_fn, poll_ts, bts->current_frame_number());
|
||||
|
||||
poll_state = GPRS_RLCMAC_POLL_NONE;
|
||||
|
||||
if (ul_ack_state == GPRS_RLCMAC_UL_ACK_WAIT_ACK) {
|
||||
if (!(state_flags & (1 << GPRS_RLCMAC_FLAG_TO_UL_ACK))) {
|
||||
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling "
|
||||
"PACKET CONTROL ACK for PACKET UPLINK ACK\n");
|
||||
if (ul_tbf && ul_tbf->handle_ctrl_ack()) {
|
||||
if (!ul_tbf->ctrl_ack_to_toggle()) {
|
||||
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling PACKET CONTROL ACK for PACKET UPLINK ACK\n");
|
||||
rlcmac_diag();
|
||||
state_flags |= (1 << GPRS_RLCMAC_FLAG_TO_UL_ACK);
|
||||
}
|
||||
ul_ack_state = GPRS_RLCMAC_UL_ACK_NONE;
|
||||
bts->rlc_ack_timedout();
|
||||
bts->pkt_ul_ack_nack_poll_timedout();
|
||||
if (state_is(GPRS_RLCMAC_FINISHED)) {
|
||||
gprs_rlcmac_ul_tbf *ul_tbf = as_ul_tbf(this);
|
||||
ul_tbf->m_n3103++;
|
||||
if (ul_tbf->m_n3103 == ul_tbf->bts->bts_data()->n3103) {
|
||||
LOGP(DRLCMAC, LOGL_NOTICE,
|
||||
"- N3103 exceeded\n");
|
||||
"- N3103 exceeded\n");
|
||||
bts->pkt_ul_ack_nack_poll_failed();
|
||||
ul_tbf->set_state(GPRS_RLCMAC_RELEASING);
|
||||
tbf_timer_start(ul_tbf, 3169, ul_tbf->bts->bts_data()->t3169, 0);
|
||||
|
@ -640,10 +638,10 @@ void gprs_rlcmac_tbf::poll_timeout()
|
|||
} else if (ul_ass_state == GPRS_RLCMAC_UL_ASS_WAIT_ACK) {
|
||||
if (!(state_flags & (1 << GPRS_RLCMAC_FLAG_TO_UL_ASS))) {
|
||||
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling "
|
||||
"PACKET CONTROL ACK for PACKET UPLINK "
|
||||
"ASSIGNMENT.\n");
|
||||
rlcmac_diag();
|
||||
state_flags |= (1 << GPRS_RLCMAC_FLAG_TO_UL_ASS);
|
||||
"PACKET CONTROL ACK for PACKET UPLINK "
|
||||
"ASSIGNMENT.\n");
|
||||
rlcmac_diag();
|
||||
state_flags |= (1 << GPRS_RLCMAC_FLAG_TO_UL_ASS);
|
||||
}
|
||||
ul_ass_state = GPRS_RLCMAC_UL_ASS_NONE;
|
||||
n3105++;
|
||||
|
|
|
@ -503,6 +503,8 @@ struct gprs_rlcmac_ul_tbf : public gprs_rlcmac_tbf {
|
|||
gprs_rlcmac_ul_tbf(BTS *bts);
|
||||
|
||||
struct msgb *create_ul_ack(uint32_t fn, uint8_t ts);
|
||||
bool ctrl_ack_to_toggle();
|
||||
bool handle_ctrl_ack();
|
||||
|
||||
/* blocks were acked */
|
||||
int rcv_data_block_acknowledged(
|
||||
|
|
|
@ -95,6 +95,27 @@ int gprs_rlcmac_ul_tbf::assemble_forward_llc(const gprs_rlc_data *_data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool gprs_rlcmac_ul_tbf::ctrl_ack_to_toggle()
|
||||
{
|
||||
if ((state_flags & (1 << GPRS_RLCMAC_FLAG_TO_UL_ACK))) {
|
||||
state_flags &= ~(1 << GPRS_RLCMAC_FLAG_TO_UL_ACK);
|
||||
return true; /* GPRS_RLCMAC_FLAG_TO_UL_ACK was set, now cleared */
|
||||
}
|
||||
|
||||
state_flags |= (1 << GPRS_RLCMAC_FLAG_TO_UL_ACK);
|
||||
return false; /* GPRS_RLCMAC_FLAG_TO_UL_ACK was unset, now set */
|
||||
}
|
||||
|
||||
bool gprs_rlcmac_ul_tbf::handle_ctrl_ack()
|
||||
{
|
||||
/* check if this control ack belongs to packet uplink ack */
|
||||
if (ul_ack_state == GPRS_RLCMAC_UL_ACK_WAIT_ACK) {
|
||||
ul_ack_state = GPRS_RLCMAC_UL_ACK_NONE;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
struct msgb *gprs_rlcmac_ul_tbf::create_ul_ack(uint32_t fn, uint8_t ts)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue