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.
diff --git a/src/rlc.cpp b/src/rlc.cpp
index c725c4b..f31670e 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -84,19 +84,23 @@
 	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 (show_rbb[i] == 'R') {
+		if (bsn == ((w.v_a() - 1) & w.mod_sns()))
+			break;
+
+		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;