aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Willmann <dwillmann@sysmocom.de>2013-12-11 20:04:29 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-12-12 11:07:47 +0100
commitcc5a4cbe9ba583189c0d007215f51f7986b4e261 (patch)
tree812422350651750061888a99472e73c22a822ddc
parent48df40d2a4ca216f08e8161701918fe5b7bf9edd (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.
-rw-r--r--src/rlc.cpp18
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;