diff options
author | Daniel Willmann <dwillmann@sysmocom.de> | 2013-12-11 20:04:29 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-12-12 11:07:47 +0100 |
commit | cc5a4cbe9ba583189c0d007215f51f7986b4e261 (patch) | |
tree | 812422350651750061888a99472e73c22a822ddc /src | |
parent | 48df40d2a4ca216f08e8161701918fe5b7bf9edd (diff) |
rlc: Make the update loop more understandable
Add bitnum_to_bsn() as a convenience function to get the BSN, use it
in the update handling and ignore rbb for values outside of our tx
window.
Diffstat (limited to 'src')
-rw-r--r-- | src/rlc.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/rlc.cpp b/src/rlc.cpp index c725c4b4..f31670ea 100644 --- a/src/rlc.cpp +++ b/src/rlc.cpp @@ -84,19 +84,23 @@ int gprs_rlc_v_b::count_unacked(const gprs_rlc_dl_window &w) return unacked; } +static uint16_t bitnum_to_bsn(int bitnum, uint16_t ssn, uint16_t mod_sns) +{ + return (ssn - 1 - bitnum) & mod_sns; +} + void gprs_rlc_v_b::update(BTS *bts, char *show_rbb, uint8_t ssn, const gprs_rlc_dl_window &w, uint16_t *lost, uint16_t *received) { - uint16_t bsn; - int i; - /* SSN - 1 is in range V(A)..V(S)-1 */ - for (i = 63, bsn = (ssn - 1) & w.mod_sns(); - i >= 0 && bsn != ((w.v_a() - 1) & w.mod_sns()); - i--, bsn = (bsn - 1) & w.mod_sns()) { + for (int bitpos = 0; bitpos < w.ws(); bitpos++) { + uint16_t bsn = bitnum_to_bsn(bitpos, ssn, w.mod_sns()); + + if (bsn == ((w.v_a() - 1) & w.mod_sns())) + break; - if (show_rbb[i] == 'R') { + if (show_rbb[w.ws() - 1 - bitpos] == 'R') { LOGP(DRLCMACDL, LOGL_DEBUG, "- got ack for BSN=%d\n", bsn); if (!is_acked(bsn)) *received += 1; |