aboutsummaryrefslogtreecommitdiffstats
path: root/src/rlc.cpp
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-11-24 20:36:36 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-11-26 21:00:51 +0100
commitf1593b7c49bd54caae9326c79156741e6078c412 (patch)
tree25104f4c817acd77276df41ece87ee59ff203d54 /src/rlc.cpp
parentab6cd921e3e47481ecdab93d1df1ce7f14b72e0a (diff)
tbf/rlc: Big change and move the window handling out to the rlc
The send and receive window is now managed by an external object. There are some issues that can only be solved with C++11 but it is progres and removes some of the spaghetti code. For GPRS the sns and ws is hardcoded. Move that into the window code.
Diffstat (limited to 'src/rlc.cpp')
-rw-r--r--src/rlc.cpp52
1 files changed, 22 insertions, 30 deletions
diff --git a/src/rlc.cpp b/src/rlc.cpp
index c4d43d3c..fda743f0 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -40,12 +40,10 @@ void gprs_rlc_v_b::reset()
mark_invalid(i);
}
-int gprs_rlc_v_b::resend_needed(const uint16_t v_a, const uint16_t v_s,
- const uint16_t mod_sns,
- const uint16_t mod_sns_half)
+int gprs_rlc_v_b::resend_needed(const gprs_rlc_dl_window &w)
{
- for (uint16_t bsn = v_a; bsn != v_s; bsn = (bsn + 1) & mod_sns) {
- uint16_t index = bsn & mod_sns_half;
+ for (uint16_t bsn = w.v_a(); bsn != w.v_s(); bsn = (bsn + 1) & w.mod_sns()) {
+ uint16_t index = bsn & w.mod_sns_half();
if (is_nacked(index) || is_resend(index))
return bsn;
}
@@ -53,14 +51,12 @@ int gprs_rlc_v_b::resend_needed(const uint16_t v_a, const uint16_t v_s,
return -1;
}
-int gprs_rlc_v_b::mark_for_resend(const uint16_t v_a, const uint16_t v_s,
- const uint16_t mod_sns,
- const uint16_t mod_sns_half)
+int gprs_rlc_v_b::mark_for_resend(const gprs_rlc_dl_window &w)
{
int resend = 0;
- for (uint16_t bsn = v_a; bsn != v_s; bsn = (bsn + 1) & mod_sns) {
- uint16_t index = (bsn & mod_sns_half);
+ for (uint16_t bsn = w.v_a(); bsn != w.v_s(); bsn = (bsn + 1) & w.mod_sns()) {
+ uint16_t index = bsn & w.mod_sns_half();
if (is_unacked(index)) {
/* mark to be re-send */
mark_resend(index);
@@ -71,14 +67,13 @@ int gprs_rlc_v_b::mark_for_resend(const uint16_t v_a, const uint16_t v_s,
return resend;
}
-int gprs_rlc_v_b::count_unacked(const uint16_t v_a, const uint16_t v_s,
- const uint16_t mod_sns, const uint16_t mod_sns_half)
+int gprs_rlc_v_b::count_unacked(const gprs_rlc_dl_window &w)
{
uint16_t unacked = 0;
uint16_t bsn;
- for (bsn = v_a; bsn != v_s; bsn = (bsn + 1) & mod_sns) {
- uint16_t index = bsn & mod_sns_half;
+ for (bsn = w.v_a(); bsn != w.v_s(); bsn = (bsn + 1) & w.mod_sns()) {
+ uint16_t index = bsn & w.mod_sns_half();
if (!is_acked(index))
unacked += 1;
}
@@ -87,41 +82,39 @@ int gprs_rlc_v_b::count_unacked(const uint16_t v_a, const uint16_t v_s,
}
void gprs_rlc_v_b::update(BTS *bts, char *show_rbb, uint8_t ssn,
- const uint16_t v_a,
- const uint16_t mod_sns, const uint16_t mod_sns_half,
+ 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) & mod_sns;
- i >= 0 && bsn != ((v_a - 1) & mod_sns);
- i--, bsn = (bsn - 1) & mod_sns) {
+ 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()) {
if (show_rbb[i] == '1') {
LOGP(DRLCMACDL, LOGL_DEBUG, "- got ack for BSN=%d\n", bsn);
- if (!is_acked(bsn & mod_sns_half))
+ if (!is_acked(bsn & w.mod_sns_half()))
*received += 1;
- mark_acked(bsn & mod_sns_half);
+ mark_acked(bsn & w.mod_sns_half());
} else {
LOGP(DRLCMACDL, LOGL_DEBUG, "- got NACK for BSN=%d\n", bsn);
- mark_nacked(bsn & mod_sns_half);
+ mark_nacked(bsn & w.mod_sns_half());
bts->rlc_nacked();
*lost += 1;
}
}
}
-int gprs_rlc_v_b::move_window(const uint16_t v_a, const uint16_t v_s,
- const uint16_t mod_sns, const uint16_t mod_sns_half)
+int gprs_rlc_v_b::move_window(const gprs_rlc_dl_window &w)
{
int i;
uint16_t bsn;
int moved = 0;
- for (i = 0, bsn = v_a; bsn != v_s; i++, bsn = (bsn + 1) & mod_sns) {
- uint16_t index = (bsn & mod_sns_half);
+ for (i = 0, bsn = w.v_a(); bsn != w.v_s(); i++, bsn = (bsn + 1) & w.mod_sns()) {
+ uint16_t index = bsn & w.mod_sns_half();
if (is_acked(index)) {
mark_invalid(index);
moved += 1;
@@ -132,14 +125,13 @@ int gprs_rlc_v_b::move_window(const uint16_t v_a, const uint16_t v_s,
return moved;
}
-void gprs_rlc_v_b::state(char *show_v_b, const uint16_t v_a, const uint16_t v_s,
- const uint16_t mod_sns, const uint16_t mod_sns_half)
+void gprs_rlc_v_b::state(char *show_v_b, const gprs_rlc_dl_window &w)
{
int i;
uint16_t bsn;
- for (i = 0, bsn = v_a; bsn != v_s; i++, bsn = (bsn + 1) & mod_sns) {
- uint16_t index = (bsn & mod_sns_half);
+ for (i = 0, bsn = w.v_a(); bsn != w.v_s(); i++, bsn = (bsn + 1) & w.mod_sns()) {
+ uint16_t index = bsn & w.mod_sns_half();
show_v_b[i] = m_v_b[index];
if (show_v_b[i] == 0)
show_v_b[i] = ' ';