aboutsummaryrefslogtreecommitdiffstats
path: root/src/rlc.cpp
diff options
context:
space:
mode:
authorDaniel Willmann <daniel@totalueberwachung.de>2013-12-28 18:24:42 +0100
committerDaniel Willmann <daniel@totalueberwachung.de>2014-01-15 15:23:21 +0100
commit146514e180ec06f75c636daec95a2a8a455e7d25 (patch)
tree10823bde2dcccfb830cb2a92e692ff7f9f5a4525 /src/rlc.cpp
parent55844795be21e2e59ab6bcede2037f8c74d76505 (diff)
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.
Diffstat (limited to 'src/rlc.cpp')
-rw-r--r--src/rlc.cpp51
1 files changed, 25 insertions, 26 deletions
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] = ' ';
}