From 55844795be21e2e59ab6bcede2037f8c74d76505 Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Sat, 28 Dec 2013 14:41:00 +0100 Subject: rlc/tbf: Add function receive_bsn that updates v_r, v_q, v_n We don't need to expose the mecanics of updating the variables to the outside. --- src/rlc.cpp | 8 ++++++++ src/rlc.h | 2 ++ src/tbf.cpp | 6 ++---- tests/types/TypesTest.cpp | 36 +++++++++--------------------------- 4 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/rlc.cpp b/src/rlc.cpp index 90944659..f3a25b23 100644 --- a/src/rlc.cpp +++ b/src/rlc.cpp @@ -197,3 +197,11 @@ uint16_t gprs_rlc_ul_window::raise_v_q() return count; } + +uint16_t gprs_rlc_ul_window::receive_bsn(const uint16_t bsn) +{ + m_v_n.mark_received(bsn); + raise_v_r(bsn); + + return raise_v_q(); +} diff --git a/src/rlc.h b/src/rlc.h index 42ec6edd..158ec3de 100644 --- a/src/rlc.h +++ b/src/rlc.h @@ -115,6 +115,8 @@ struct gprs_rlc_ul_window { void raise_v_q(int); + uint16_t receive_bsn(const uint16_t bsn); + uint16_t m_v_r; /* receive state */ uint16_t m_v_q; /* receive window state */ diff --git a/src/tbf.cpp b/src/tbf.cpp index 9276c416..6b0e779a 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -1606,14 +1606,12 @@ int gprs_rlcmac_tbf::rcv_data_block_acknowledged(const uint8_t *data, size_t len rh->bsn, dir.ul.window.v_q(), (dir.ul.window.v_q() + ws - 1) & mod_sns); - dir.ul.window.m_v_n.mark_received(rh->bsn); - dir.ul.window.raise_v_r(rh->bsn); - /* Raise V(Q) if possible, and retrieve LLC frames from blocks. * This is looped until there is a gap (non received block) or * the window is empty.*/ const uint16_t v_q_beg = dir.ul.window.v_q(); - const uint16_t count = dir.ul.window.raise_v_q(); + + const uint16_t count = dir.ul.window.receive_bsn(rh->bsn); /* Retrieve LLC frames from blocks that are ready */ for (uint16_t i = 0; i < count; ++i) { diff --git a/tests/types/TypesTest.cpp b/tests/types/TypesTest.cpp index 1ea32294..62c6ed22 100644 --- a/tests/types/TypesTest.cpp +++ b/tests/types/TypesTest.cpp @@ -218,9 +218,7 @@ static void test_rlc_dl_ul_basic() /* simulate to have received 0, 1 and 5 */ OSMO_ASSERT(ul_win.is_in_window(0)); - ul_win.m_v_n.mark_received(0); - ul_win.raise_v_r(0); - count = ul_win.raise_v_q(); + count = ul_win.receive_bsn(0); OSMO_ASSERT(ul_win.m_v_n.is_received(0)); OSMO_ASSERT(ul_win.v_q() == 1); OSMO_ASSERT(ul_win.v_r() == 1); @@ -236,9 +234,7 @@ static void test_rlc_dl_ul_basic() OSMO_ASSERT_STR_EQ(win_rbb, rbb); OSMO_ASSERT(ul_win.is_in_window(1)); - ul_win.m_v_n.mark_received(1); - ul_win.raise_v_r(1); - count = ul_win.raise_v_q(); + count = ul_win.receive_bsn(1); OSMO_ASSERT(ul_win.m_v_n.is_received(0)); OSMO_ASSERT(ul_win.v_q() == 2); OSMO_ASSERT(ul_win.v_r() == 2); @@ -254,9 +250,7 @@ static void test_rlc_dl_ul_basic() OSMO_ASSERT_STR_EQ(win_rbb, rbb); OSMO_ASSERT(ul_win.is_in_window(5)); - ul_win.m_v_n.mark_received(5); - ul_win.raise_v_r(5); - count = ul_win.raise_v_q(); + count = ul_win.receive_bsn(5); OSMO_ASSERT(ul_win.m_v_n.is_received(0)); OSMO_ASSERT(ul_win.v_q() == 2); OSMO_ASSERT(ul_win.v_r() == 6); @@ -274,9 +268,7 @@ static void test_rlc_dl_ul_basic() OSMO_ASSERT(ul_win.is_in_window(65)); OSMO_ASSERT(ul_win.is_in_window(2)); OSMO_ASSERT(ul_win.m_v_n.is_received(5)); - ul_win.m_v_n.mark_received(65); - ul_win.raise_v_r(65); - count = ul_win.raise_v_q(); + count = ul_win.receive_bsn(65); OSMO_ASSERT(count == 0); OSMO_ASSERT(ul_win.m_v_n.is_received(5)); OSMO_ASSERT(ul_win.v_q() == 2); @@ -293,33 +285,25 @@ static void test_rlc_dl_ul_basic() OSMO_ASSERT(ul_win.is_in_window(2)); OSMO_ASSERT(!ul_win.is_in_window(66)); - ul_win.m_v_n.mark_received(2); - ul_win.raise_v_r(2); - count = ul_win.raise_v_q(); + count = ul_win.receive_bsn(2); OSMO_ASSERT(count == 1); OSMO_ASSERT(ul_win.v_q() == 3); OSMO_ASSERT(ul_win.v_r() == 66); OSMO_ASSERT(ul_win.is_in_window(66)); - ul_win.m_v_n.mark_received(66); - ul_win.raise_v_r(66); - count = ul_win.raise_v_q(); + count = ul_win.receive_bsn(66); OSMO_ASSERT(count == 0); OSMO_ASSERT(ul_win.v_q() == 3); OSMO_ASSERT(ul_win.v_r() == 67); for (int i = 3; i <= 67; ++i) { - ul_win.m_v_n.mark_received(i); - ul_win.raise_v_r(i); - ul_win.raise_v_q(); + ul_win.receive_bsn(i); } OSMO_ASSERT(ul_win.v_q() == 68); OSMO_ASSERT(ul_win.v_r() == 68); - ul_win.m_v_n.mark_received(68); - ul_win.raise_v_r(68); - count = ul_win.raise_v_q(); + count = ul_win.receive_bsn(68); OSMO_ASSERT(ul_win.v_q() == 69); OSMO_ASSERT(ul_win.v_r() == 69); OSMO_ASSERT(count == 1); @@ -327,9 +311,7 @@ static void test_rlc_dl_ul_basic() /* now test the wrapping */ OSMO_ASSERT(ul_win.is_in_window(4)); OSMO_ASSERT(!ul_win.is_in_window(5)); - ul_win.m_v_n.mark_received(4); - ul_win.raise_v_r(4); - count = ul_win.raise_v_q(); + count = ul_win.receive_bsn(4); OSMO_ASSERT(count == 0); } -- cgit v1.2.3