aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/rlc.cpp15
-rw-r--r--src/rlc.h2
-rw-r--r--src/tbf.cpp12
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());