diff options
author | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-11-24 17:13:10 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-11-26 20:57:24 +0100 |
commit | e358ff8fa4865be81cd0fbf46ddd6baee3856e9b (patch) | |
tree | 2bbe02ec2668d41a850131bd9d818c74748fc9ae | |
parent | df6b4f52e05e699b9a96a920973bff6241b5a853 (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.
-rw-r--r-- | src/rlc.cpp | 19 | ||||
-rw-r--r-- | src/rlc.h | 2 | ||||
-rw-r--r-- | src/tbf.cpp | 10 |
3 files changed, 23 insertions, 8 deletions
diff --git a/src/rlc.cpp b/src/rlc.cpp index d33e2067..24ffc176 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; +} @@ -56,6 +56,8 @@ struct gprs_rlc_v_b { void 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, uint16_t *lost, uint16_t *received); + int move_window(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 c83ca966..0d6d19b1 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -1405,14 +1405,8 @@ int gprs_rlcmac_tbf::snd_dl_ack(uint8_t final, uint8_t ssn, uint8_t *rbb) gprs_rlcmac_received_lost(this, received, lost); /* raise V(A), if possible */ - for (i = 0, bsn = dir.dl.v_a; bsn != dir.dl.v_s; - i++, bsn = (bsn + 1) & mod_sns) { - if (dir.dl.v_b.is_acked(bsn & mod_sns_half)) { - dir.dl.v_b.mark_invalid(bsn & mod_sns_half); - dir.dl.v_a = (dir.dl.v_a + 1) & mod_sns; - } else - break; - } + dir.dl.v_a += dir.dl.v_b.move_window(dir.dl.v_a, dir.dl.v_s, + mod_sns, mod_sns_half) & mod_sns; /* show receive state array in debug (V(A)..V(S)-1) */ for (i = 0, bsn = dir.dl.v_a; bsn != dir.dl.v_s; |