From d87e1d6ab747423d3668c74d16201a5d967accf0 Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Mon, 14 Dec 2015 11:43:04 +0100 Subject: rlc: Do not raise_v_q in receive_bsn Currently gprs_rlc_ul_window::receive_bsn calls raise_v_q and returns the number of RLC data blocks that can be taken from the queue. This does not fit the EGPRS feature to put 2 independant data blocks in a single RLC block. This commit removes raise_v_q from receive_bsn, hence it must be called explicitely to get the number of processable data blocks. Sponsored-by: On-Waves ehf --- src/rlc.cpp | 3 +-- src/rlc.h | 2 +- src/tbf_ul.cpp | 3 ++- tests/types/TypesTest.cpp | 25 +++++++++++++++++-------- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/rlc.cpp b/src/rlc.cpp index 9f5c61d9..bafc56e7 100644 --- a/src/rlc.cpp +++ b/src/rlc.cpp @@ -220,10 +220,9 @@ uint16_t gprs_rlc_ul_window::raise_v_q() return count; } -uint16_t gprs_rlc_ul_window::receive_bsn(const uint16_t bsn) +void 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 bafe6a88..081ba40e 100644 --- a/src/rlc.h +++ b/src/rlc.h @@ -202,7 +202,7 @@ struct gprs_rlc_ul_window { void raise_v_q(int); - uint16_t receive_bsn(const uint16_t bsn); + void 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_ul.cpp b/src/tbf_ul.cpp index aa81b538..4a5f21f5 100644 --- a/src/tbf_ul.cpp +++ b/src/tbf_ul.cpp @@ -332,7 +332,8 @@ int gprs_rlcmac_ul_tbf::rcv_data_block_acknowledged_gprs(const uint8_t *data, * the window is empty.*/ const uint16_t v_q_beg = m_window.v_q(); - const uint16_t count = m_window.receive_bsn(rh->bsn); + m_window.receive_bsn(rh->bsn); + const uint16_t count = m_window.raise_v_q(); /* 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 be991474..776e051e 100644 --- a/tests/types/TypesTest.cpp +++ b/tests/types/TypesTest.cpp @@ -218,7 +218,8 @@ static void test_rlc_dl_ul_basic() /* simulate to have received 0, 1 and 5 */ OSMO_ASSERT(ul_win.is_in_window(0)); - count = ul_win.receive_bsn(0); + ul_win.receive_bsn(0); + count = ul_win.raise_v_q(); OSMO_ASSERT(ul_win.m_v_n.is_received(0)); OSMO_ASSERT(ul_win.v_q() == 1); OSMO_ASSERT(ul_win.v_r() == 1); @@ -234,7 +235,8 @@ static void test_rlc_dl_ul_basic() OSMO_ASSERT_STR_EQ(win_rbb, rbb); OSMO_ASSERT(ul_win.is_in_window(1)); - count = ul_win.receive_bsn(1); + ul_win.receive_bsn(1); + count = ul_win.raise_v_q(); OSMO_ASSERT(ul_win.m_v_n.is_received(0)); OSMO_ASSERT(ul_win.v_q() == 2); OSMO_ASSERT(ul_win.v_r() == 2); @@ -250,7 +252,8 @@ static void test_rlc_dl_ul_basic() OSMO_ASSERT_STR_EQ(win_rbb, rbb); OSMO_ASSERT(ul_win.is_in_window(5)); - count = ul_win.receive_bsn(5); + ul_win.receive_bsn(5); + count = ul_win.raise_v_q(); OSMO_ASSERT(ul_win.m_v_n.is_received(0)); OSMO_ASSERT(ul_win.v_q() == 2); OSMO_ASSERT(ul_win.v_r() == 6); @@ -268,7 +271,8 @@ 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)); - count = ul_win.receive_bsn(65); + ul_win.receive_bsn(65); + count = ul_win.raise_v_q(); OSMO_ASSERT(count == 0); OSMO_ASSERT(ul_win.m_v_n.is_received(5)); OSMO_ASSERT(ul_win.v_q() == 2); @@ -285,25 +289,29 @@ static void test_rlc_dl_ul_basic() OSMO_ASSERT(ul_win.is_in_window(2)); OSMO_ASSERT(!ul_win.is_in_window(66)); - count = ul_win.receive_bsn(2); + ul_win.receive_bsn(2); + count = ul_win.raise_v_q(); 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)); - count = ul_win.receive_bsn(66); + ul_win.receive_bsn(66); + count = ul_win.raise_v_q(); 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.receive_bsn(i); + ul_win.raise_v_q(); } OSMO_ASSERT(ul_win.v_q() == 68); OSMO_ASSERT(ul_win.v_r() == 68); - count = ul_win.receive_bsn(68); + ul_win.receive_bsn(68); + count = ul_win.raise_v_q(); OSMO_ASSERT(ul_win.v_q() == 69); OSMO_ASSERT(ul_win.v_r() == 69); OSMO_ASSERT(count == 1); @@ -311,7 +319,8 @@ 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)); - count = ul_win.receive_bsn(4); + ul_win.receive_bsn(4); + count = ul_win.raise_v_q(); OSMO_ASSERT(count == 0); } -- cgit v1.2.3