From 9c5539d46da3e43eeb875e1849553214263ee618 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sun, 24 Nov 2013 17:34:17 +0100 Subject: [PATCH] tbf/rlc: Move the counting of unacked frames into the RLC V_B class Whenwe receive a final ack we assume that all the unacked frames have been acked now. Move the counting to V_B and now the caller can remove the BSN and the "lost" variable which has always been zero. --- src/rlc.cpp | 15 +++++++++++++++ src/rlc.h | 2 ++ src/tbf.cpp | 12 ++++-------- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/rlc.cpp b/src/rlc.cpp index a76703d5..816efff5 100644 --- a/src/rlc.cpp +++ b/src/rlc.cpp @@ -71,6 +71,21 @@ int gprs_rlc_v_b::mark_for_resend(const uint16_t v_a, const uint16_t v_s, return resend; } +int gprs_rlc_v_b::count_unacked(const uint16_t v_a, const uint16_t v_s, + const uint16_t mod_sns, const uint16_t mod_sns_half) +{ + uint16_t unacked = 0; + uint16_t bsn; + + for (bsn = v_a; bsn != v_s; bsn = (bsn + 1) & mod_sns) { + uint16_t index = bsn & mod_sns_half; + if (!is_acked(index)) + unacked += 1; + } + + return unacked; +} + void gprs_rlc_v_b::update(BTS *bts, char *show_rbb, uint8_t ssn, const uint16_t v_a, const uint16_t mod_sns, const uint16_t mod_sns_half, diff --git a/src/rlc.h b/src/rlc.h index 7f6df12c..ba4d013c 100644 --- a/src/rlc.h +++ b/src/rlc.h @@ -60,6 +60,8 @@ struct gprs_rlc_v_b { const uint16_t mod_sns, const uint16_t mod_sns_half); void state(char *show_rbb, const uint16_t v_a, const uint16_t v_s, const uint16_t mod_sns, const uint16_t mod_sns_half); + int count_unacked(const uint16_t v_a, const uint16_t v_s, + const uint16_t mod_sns, const uint16_t mod_sns_half); /* Check for an individual frame */ bool is_unacked(int index) const; diff --git a/src/tbf.cpp b/src/tbf.cpp index 4fefab63..c975cee2 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -1422,20 +1422,16 @@ int gprs_rlcmac_tbf::maybe_start_new_window() { const uint16_t mod_sns = m_sns - 1; const uint16_t mod_sns_half = (m_sns >> 1) - 1; - uint16_t bsn; struct msgb *msg; - uint16_t lost = 0, received = 0; + uint16_t received; LOGP(DRLCMACDL, LOGL_DEBUG, "- Final ACK received.\n"); /* range V(A)..V(S)-1 */ - for (bsn = dir.dl.v_a; bsn != dir.dl.v_s; - bsn = (bsn + 1) & mod_sns) { - if (!dir.dl.v_b.is_acked(bsn & mod_sns_half)) - received++; - } + received = dir.dl.v_b.count_unacked(dir.dl.v_a, dir.dl.v_s, + mod_sns, mod_sns_half); /* report all outstanding packets as received */ - gprs_rlcmac_received_lost(this, received, lost); + gprs_rlcmac_received_lost(this, received, 0); /* check for LLC PDU in the LLC Queue */ msg = llc_dequeue(gprs_bssgp_pcu_current_bctx());