diff options
author | Max <msuraev@sysmocom.de> | 2017-12-20 18:01:55 +0100 |
---|---|---|
committer | Max <msuraev@sysmocom.de> | 2017-12-20 18:01:55 +0100 |
commit | 59e4a4fee11a966d2c72209a0e23087e20d5103d (patch) | |
tree | 780e30b8edd7e5a1c7cbe406a449a55096b2d71a | |
parent | ee5be3a0095b4bae430032d35e3ad0716eff34ab (diff) |
TBF: add N3101 counter
Properly reset the counter when receiving valid RLCMAC block and update
it when no data is received as per 3GPP TS 44.060 ยง8.1.1.1
Change-Id: I2f79c6153dc4073c9d293b2824979e6381576682
Fixes: OS#2407
-rw-r--r-- | src/bts.cpp | 19 | ||||
-rw-r--r-- | src/tbf.cpp | 9 | ||||
-rw-r--r-- | src/tbf.h | 2 |
3 files changed, 30 insertions, 0 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index 9e8a6c83..867658ee 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -996,6 +996,10 @@ void gprs_rlcmac_pdch::rcv_control_ack(Packet_Control_Acknowledgement_t *packet, ms->dl_tbf() ? ms->dl_tbf()->state_name() : "None"); return; } + + /* Reset N3101 counter: */ + tbf->m_n3101 = 0; + tbf->update_ms(tlli, GPRS_RLCMAC_UL_TBF); LOGPTBF(tbf, LOGL_DEBUG, "RX: [PCU <- BTS] Packet Control Ack\n"); @@ -1185,6 +1189,9 @@ void gprs_rlcmac_pdch::rcv_control_dl_ack_nack(Packet_Downlink_Ack_Nack_t *ack_n return; } + /* Reset N3101 counter: */ + tbf->m_n3101 = 0; + if (tbf->handle_ack_nack()) LOGPTBF(tbf, LOGL_NOTICE, "Recovered downlink ack\n"); @@ -1249,6 +1256,9 @@ void gprs_rlcmac_pdch::rcv_control_egprs_dl_ack_nack(EGPRS_PD_AckNack_t *ack_nac return; } + /* Reset N3101 counter: */ + tbf->m_n3101 = 0; + if (tbf->handle_ack_nack()) LOGPTBF(tbf, LOGL_NOTICE, "Recovered EGPRS downlink ack\n"); @@ -1417,6 +1427,9 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request, } LOGPTBFDL(dl_tbf, LOGL_ERROR, "RX: [PCU <- BTS] FIXME: Packet resource request\n"); + + /* Reset N3101 counter: */ + dl_tbf->m_n3101 = 0; } else { struct gprs_rlcmac_ul_tbf *ul_tbf; int8_t tfi = request->ID.u.Global_TFI.u.UPLINK_TFI; @@ -1427,6 +1440,9 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request, } LOGPTBFUL(ul_tbf, LOGL_ERROR, "RX: [PCU <- BTS] %s FIXME: Packet resource request\n"); + + /* Reset N3101 counter: */ + ul_tbf->m_n3101 = 0; } } @@ -1579,6 +1595,9 @@ int gprs_rlcmac_pdch::rcv_data_block(uint8_t *data, uint8_t data_len, uint32_t f return 0; } + /* Reset N3101 counter: */ + tbf->m_n3101 = 0; + return tbf->rcv_data_block_acknowledged(&rlc_dec, data, meas); } diff --git a/src/tbf.cpp b/src/tbf.cpp index a5eedd93..dc0777f6 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -177,6 +177,7 @@ gprs_rlcmac_tbf::gprs_rlcmac_tbf(BTS *bts_, gprs_rlcmac_tbf_direction dir) : was_releasing(0), upgrade_to_multislot(0), bts(bts_), + m_n3101(0), m_tfi(0), m_created_ts(0), m_ctrs(NULL), @@ -740,6 +741,14 @@ void gprs_rlcmac_tbf::poll_timeout() poll_state = GPRS_RLCMAC_POLL_NONE; + m_n3101++; + if (m_n3101 == bts->bts_data()->n3101) { + LOGP(DRLCMAC, LOGL_NOTICE, " N3101 exceeded MAX (%u)\n", bts->bts_data()->n3101); + set_state(GPRS_RLCMAC_RELEASING); + t_start(T3169, bts->bts_data()->t3169, 0, "MAX N3101 reached", false); + return; + } + 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"); @@ -296,6 +296,8 @@ struct gprs_rlcmac_tbf { /* store the BTS this TBF belongs to */ BTS *bts; + uint8_t m_n3101; /* N3101 counter */ + /* * private fields. We can't make it private as it is breaking the * llist macros. |