diff options
author | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-11-23 16:06:54 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-11-23 16:19:17 +0100 |
commit | 321f3c3104d7710d97fe373d6cf17da1e5931bef (patch) | |
tree | 430d7165b4d839451a484e7a09be71765a2f4c96 /src/tbf.cpp | |
parent | 092478f294fedd4dc285ff817143679d3068242d (diff) |
rlc: Move the ack state array into a separate class that can be tested
Diffstat (limited to 'src/tbf.cpp')
-rw-r--r-- | src/tbf.cpp | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/src/tbf.cpp b/src/tbf.cpp index 19a0d819..ab77d930 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -895,12 +895,11 @@ do_resend: for (bsn = dir.dl.v_a; bsn != dir.dl.v_s; bsn = (bsn + 1) & mod_sns) { index = (bsn & mod_sns_half); - if (dir.dl.v_b[index] == 'N' - || dir.dl.v_b[index] == 'X') { + if (dir.dl.v_b.is_nacked(index) || dir.dl.v_b.is_resend(index)) { LOGP(DRLCMACDL, LOGL_DEBUG, "- Resending BSN %d\n", bsn); /* re-send block with negative aknowlegement */ - dir.dl.v_b[index] = 'U'; /* unacked */ + dir.dl.v_b.mark_unacked(index); bts->rlc_resent(); return create_dl_acked_block(fn, ts, index, first_fin_ack); } @@ -941,9 +940,9 @@ do_resend: for (bsn = dir.dl.v_a; bsn != dir.dl.v_s; bsn = (bsn + 1) & mod_sns) { index = (bsn & mod_sns_half); - if (dir.dl.v_b[index] == 'U') { + if (dir.dl.v_b.is_unacked(index)) { /* mark to be re-send */ - dir.dl.v_b[index] = 'X'; + dir.dl.v_b.mark_resend(index); resend++; } } @@ -1111,7 +1110,7 @@ do_resend: #warning "move this up?" m_rlc.blocks[index].len = block_length; /* raise send state and set ack state array */ - dir.dl.v_b[index] = 'U'; /* unacked */ + dir.dl.v_b.mark_unacked(index); dir.dl.v_s = (dir.dl.v_s + 1) & mod_sns; /* inc send state */ return create_dl_acked_block(fn, ts, index, first_fin_ack); @@ -1463,14 +1462,13 @@ int gprs_rlcmac_tbf::snd_dl_ack(uint8_t final, uint8_t ssn, uint8_t *rbb) if (bit) { LOGP(DRLCMACDL, LOGL_DEBUG, "- got " "ack for BSN=%d\n", bsn); - if (dir.dl.v_b[bsn & mod_sns_half] - != 'A') + if (!dir.dl.v_b.is_acked(bsn & mod_sns_half)) received++; - dir.dl.v_b[bsn & mod_sns_half] = 'A'; + dir.dl.v_b.mark_acked(bsn & mod_sns_half); } else { LOGP(DRLCMACDL, LOGL_DEBUG, "- got " "NACK for BSN=%d\n", bsn); - dir.dl.v_b[bsn & mod_sns_half] = 'N'; + dir.dl.v_b.mark_nacked(bsn & mod_sns_half); bts->rlc_nacked(); lost++; } @@ -1481,11 +1479,9 @@ int gprs_rlcmac_tbf::snd_dl_ack(uint8_t final, uint8_t ssn, uint8_t *rbb) /* 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[bsn & mod_sns_half] == 'A') { - dir.dl.v_b[bsn & mod_sns_half] = 'I'; - /* mark invalid */ - dir.dl.v_a = (dir.dl.v_a + 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; } @@ -1493,7 +1489,7 @@ int gprs_rlcmac_tbf::snd_dl_ack(uint8_t final, uint8_t ssn, uint8_t *rbb) /* show receive state array in debug (V(A)..V(S)-1) */ for (i = 0, bsn = dir.dl.v_a; bsn != dir.dl.v_s; i++, bsn = (bsn + 1) & mod_sns) { - show_v_b[i] = dir.dl.v_b[bsn & mod_sns_half]; + show_v_b[i] = dir.dl.v_b.state(bsn & mod_sns_half); if (show_v_b[i] == 0) show_v_b[i] = ' '; } @@ -1517,7 +1513,7 @@ int gprs_rlcmac_tbf::snd_dl_ack(uint8_t final, uint8_t ssn, uint8_t *rbb) /* range V(A)..V(S)-1 */ for (bsn = dir.dl.v_a; bsn != dir.dl.v_s; bsn = (bsn + 1) & mod_sns) { - if (dir.dl.v_b[bsn & mod_sns_half] != 'A') + if (!dir.dl.v_b.is_acked(bsn & mod_sns_half)) received++; } @@ -1852,6 +1848,7 @@ void gprs_rlcmac_tbf::reuse_tbf(const uint8_t *data, const uint16_t len) /* reset rlc states */ memset(&dir.dl, 0, sizeof(dir.dl)); + dir.dl.v_b.reset(); /* keep to flags */ state_flags &= GPRS_RLCMAC_FLAG_TO_MASK; |