aboutsummaryrefslogtreecommitdiffstats
path: root/src/rlc.cpp
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-11-24 17:13:10 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-11-26 20:57:24 +0100
commite358ff8fa4865be81cd0fbf46ddd6baee3856e9b (patch)
tree2bbe02ec2668d41a850131bd9d818c74748fc9ae /src/rlc.cpp
parentdf6b4f52e05e699b9a96a920973bff6241b5a853 (diff)
tbf/rlc: Move the moving of V(A) into the V_B code
Move the code that moves the V_B to the first not acked frame. Return how many indexes the V_B was moved and update the V_A in the caller.
Diffstat (limited to 'src/rlc.cpp')
-rw-r--r--src/rlc.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/rlc.cpp b/src/rlc.cpp
index d33e206..24ffc17 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -97,3 +97,22 @@ void gprs_rlc_v_b::update(BTS *bts, char *show_rbb, uint8_t ssn,
}
}
}
+
+int gprs_rlc_v_b::move_window(const uint16_t v_a, const uint16_t v_s,
+ const uint16_t mod_sns, const uint16_t mod_sns_half)
+{
+ int i;
+ uint16_t bsn;
+ int moved = 0;
+
+ for (i = 0, bsn = v_a; bsn != v_s; i++, bsn = (bsn + 1) & mod_sns) {
+ uint16_t index = (bsn & mod_sns_half);
+ if (is_acked(index)) {
+ mark_invalid(index);
+ moved += 1;
+ } else
+ break;
+ }
+
+ return moved;
+}