From 146514e180ec06f75c636daec95a2a8a455e7d25 Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Sat, 28 Dec 2013 18:24:42 +0100 Subject: rlc/tbf: Move v_b into DL window Move functions resend_needed(), mark_for_resend(), update(), move_window(), state(), count_unacked() out of v_b directly into the UL window and provide a function get_state in v_b to access the v_b elements. --- src/rlc.cpp | 51 +++++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 26 deletions(-) (limited to 'src/rlc.cpp') diff --git a/src/rlc.cpp b/src/rlc.cpp index f3a25b23..0df1655a 100644 --- a/src/rlc.cpp +++ b/src/rlc.cpp @@ -46,24 +46,24 @@ void gprs_rlc_v_b::reset() mark_invalid(i); } -int gprs_rlc_v_b::resend_needed(const gprs_rlc_dl_window &w) +int gprs_rlc_dl_window::resend_needed() { - for (uint16_t bsn = w.v_a(); bsn != w.v_s(); bsn = (bsn + 1) & w.mod_sns()) { - if (is_nacked(bsn) || is_resend(bsn)) + for (uint16_t bsn = v_a(); bsn != v_s(); bsn = (bsn + 1) & mod_sns()) { + if (m_v_b.is_nacked(bsn) || m_v_b.is_resend(bsn)) return bsn; } return -1; } -int gprs_rlc_v_b::mark_for_resend(const gprs_rlc_dl_window &w) +int gprs_rlc_dl_window::mark_for_resend() { int resend = 0; - for (uint16_t bsn = w.v_a(); bsn != w.v_s(); bsn = (bsn + 1) & w.mod_sns()) { - if (is_unacked(bsn)) { + for (uint16_t bsn = v_a(); bsn != v_s(); bsn = (bsn + 1) & mod_sns()) { + if (m_v_b.is_unacked(bsn)) { /* mark to be re-send */ - mark_resend(bsn); + m_v_b.mark_resend(bsn); resend += 1; } } @@ -71,13 +71,13 @@ int gprs_rlc_v_b::mark_for_resend(const gprs_rlc_dl_window &w) return resend; } -int gprs_rlc_v_b::count_unacked(const gprs_rlc_dl_window &w) +int gprs_rlc_dl_window::count_unacked() { uint16_t unacked = 0; uint16_t bsn; - for (bsn = w.v_a(); bsn != w.v_s(); bsn = (bsn + 1) & w.mod_sns()) { - if (!is_acked(bsn)) + for (bsn = v_a(); bsn != v_s(); bsn = (bsn + 1) & mod_sns()) { + if (!m_v_b.is_acked(bsn)) unacked += 1; } @@ -89,40 +89,39 @@ 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, +void gprs_rlc_dl_window::update(BTS *bts, char *show_rbb, uint8_t ssn, uint16_t *lost, uint16_t *received) { /* SSN - 1 is in range V(A)..V(S)-1 */ - for (int bitpos = 0; bitpos < w.ws(); bitpos++) { - uint16_t bsn = bitnum_to_bsn(bitpos, ssn, w.mod_sns()); + for (int bitpos = 0; bitpos < ws(); bitpos++) { + uint16_t bsn = bitnum_to_bsn(bitpos, ssn, mod_sns()); - if (bsn == ((w.v_a() - 1) & w.mod_sns())) + if (bsn == ((v_a() - 1) & mod_sns())) break; - if (show_rbb[w.ws() - 1 - bitpos] == 'R') { + if (show_rbb[ws() - 1 - bitpos] == 'R') { LOGP(DRLCMACDL, LOGL_DEBUG, "- got ack for BSN=%d\n", bsn); - if (!is_acked(bsn)) + if (!m_v_b.is_acked(bsn)) *received += 1; - mark_acked(bsn); + m_v_b.mark_acked(bsn); } else { LOGP(DRLCMACDL, LOGL_DEBUG, "- got NACK for BSN=%d\n", bsn); - mark_nacked(bsn); + m_v_b.mark_nacked(bsn); bts->rlc_nacked(); *lost += 1; } } } -int gprs_rlc_v_b::move_window(const gprs_rlc_dl_window &w) +int gprs_rlc_dl_window::move_window() { int i; uint16_t bsn; int moved = 0; - for (i = 0, bsn = w.v_a(); bsn != w.v_s(); i++, bsn = (bsn + 1) & w.mod_sns()) { - if (is_acked(bsn)) { - mark_invalid(bsn); + for (i = 0, bsn = v_a(); bsn != v_s(); i++, bsn = (bsn + 1) & mod_sns()) { + if (m_v_b.is_acked(bsn)) { + m_v_b.mark_invalid(bsn); moved += 1; } else break; @@ -131,14 +130,14 @@ int gprs_rlc_v_b::move_window(const gprs_rlc_dl_window &w) return moved; } -void gprs_rlc_v_b::state(char *show_v_b, const gprs_rlc_dl_window &w) +void gprs_rlc_dl_window::state(char *show_v_b) { int i; uint16_t bsn; - for (i = 0, bsn = w.v_a(); bsn != w.v_s(); i++, bsn = (bsn + 1) & w.mod_sns()) { + for (i = 0, bsn = v_a(); bsn != v_s(); i++, bsn = (bsn + 1) & mod_sns()) { uint16_t index = bsn & mod_sns_half(); - show_v_b[i] = m_v_b[index]; + show_v_b[i] = m_v_b.get_state(index); if (show_v_b[i] == 0) show_v_b[i] = ' '; } -- cgit v1.2.3