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.
This commit is contained in:
parent
7c3751b10b
commit
55844795be
|
@ -197,3 +197,11 @@ uint16_t gprs_rlc_ul_window::raise_v_q()
|
||||||
|
|
||||||
return count;
|
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();
|
||||||
|
}
|
||||||
|
|
|
@ -115,6 +115,8 @@ struct gprs_rlc_ul_window {
|
||||||
|
|
||||||
void raise_v_q(int);
|
void raise_v_q(int);
|
||||||
|
|
||||||
|
uint16_t receive_bsn(const uint16_t bsn);
|
||||||
|
|
||||||
uint16_t m_v_r; /* receive state */
|
uint16_t m_v_r; /* receive state */
|
||||||
uint16_t m_v_q; /* receive window state */
|
uint16_t m_v_q; /* receive window state */
|
||||||
|
|
||||||
|
|
|
@ -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(),
|
rh->bsn, dir.ul.window.v_q(),
|
||||||
(dir.ul.window.v_q() + ws - 1) & mod_sns);
|
(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.
|
/* Raise V(Q) if possible, and retrieve LLC frames from blocks.
|
||||||
* This is looped until there is a gap (non received block) or
|
* This is looped until there is a gap (non received block) or
|
||||||
* the window is empty.*/
|
* the window is empty.*/
|
||||||
const uint16_t v_q_beg = dir.ul.window.v_q();
|
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 */
|
/* Retrieve LLC frames from blocks that are ready */
|
||||||
for (uint16_t i = 0; i < count; ++i) {
|
for (uint16_t i = 0; i < count; ++i) {
|
||||||
|
|
|
@ -218,9 +218,7 @@ static void test_rlc_dl_ul_basic()
|
||||||
|
|
||||||
/* simulate to have received 0, 1 and 5 */
|
/* simulate to have received 0, 1 and 5 */
|
||||||
OSMO_ASSERT(ul_win.is_in_window(0));
|
OSMO_ASSERT(ul_win.is_in_window(0));
|
||||||
ul_win.m_v_n.mark_received(0);
|
count = ul_win.receive_bsn(0);
|
||||||
ul_win.raise_v_r(0);
|
|
||||||
count = ul_win.raise_v_q();
|
|
||||||
OSMO_ASSERT(ul_win.m_v_n.is_received(0));
|
OSMO_ASSERT(ul_win.m_v_n.is_received(0));
|
||||||
OSMO_ASSERT(ul_win.v_q() == 1);
|
OSMO_ASSERT(ul_win.v_q() == 1);
|
||||||
OSMO_ASSERT(ul_win.v_r() == 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_STR_EQ(win_rbb, rbb);
|
||||||
|
|
||||||
OSMO_ASSERT(ul_win.is_in_window(1));
|
OSMO_ASSERT(ul_win.is_in_window(1));
|
||||||
ul_win.m_v_n.mark_received(1);
|
count = ul_win.receive_bsn(1);
|
||||||
ul_win.raise_v_r(1);
|
|
||||||
count = ul_win.raise_v_q();
|
|
||||||
OSMO_ASSERT(ul_win.m_v_n.is_received(0));
|
OSMO_ASSERT(ul_win.m_v_n.is_received(0));
|
||||||
OSMO_ASSERT(ul_win.v_q() == 2);
|
OSMO_ASSERT(ul_win.v_q() == 2);
|
||||||
OSMO_ASSERT(ul_win.v_r() == 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_STR_EQ(win_rbb, rbb);
|
||||||
|
|
||||||
OSMO_ASSERT(ul_win.is_in_window(5));
|
OSMO_ASSERT(ul_win.is_in_window(5));
|
||||||
ul_win.m_v_n.mark_received(5);
|
count = ul_win.receive_bsn(5);
|
||||||
ul_win.raise_v_r(5);
|
|
||||||
count = ul_win.raise_v_q();
|
|
||||||
OSMO_ASSERT(ul_win.m_v_n.is_received(0));
|
OSMO_ASSERT(ul_win.m_v_n.is_received(0));
|
||||||
OSMO_ASSERT(ul_win.v_q() == 2);
|
OSMO_ASSERT(ul_win.v_q() == 2);
|
||||||
OSMO_ASSERT(ul_win.v_r() == 6);
|
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(65));
|
||||||
OSMO_ASSERT(ul_win.is_in_window(2));
|
OSMO_ASSERT(ul_win.is_in_window(2));
|
||||||
OSMO_ASSERT(ul_win.m_v_n.is_received(5));
|
OSMO_ASSERT(ul_win.m_v_n.is_received(5));
|
||||||
ul_win.m_v_n.mark_received(65);
|
count = ul_win.receive_bsn(65);
|
||||||
ul_win.raise_v_r(65);
|
|
||||||
count = ul_win.raise_v_q();
|
|
||||||
OSMO_ASSERT(count == 0);
|
OSMO_ASSERT(count == 0);
|
||||||
OSMO_ASSERT(ul_win.m_v_n.is_received(5));
|
OSMO_ASSERT(ul_win.m_v_n.is_received(5));
|
||||||
OSMO_ASSERT(ul_win.v_q() == 2);
|
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(2));
|
||||||
OSMO_ASSERT(!ul_win.is_in_window(66));
|
OSMO_ASSERT(!ul_win.is_in_window(66));
|
||||||
ul_win.m_v_n.mark_received(2);
|
count = ul_win.receive_bsn(2);
|
||||||
ul_win.raise_v_r(2);
|
|
||||||
count = ul_win.raise_v_q();
|
|
||||||
OSMO_ASSERT(count == 1);
|
OSMO_ASSERT(count == 1);
|
||||||
OSMO_ASSERT(ul_win.v_q() == 3);
|
OSMO_ASSERT(ul_win.v_q() == 3);
|
||||||
OSMO_ASSERT(ul_win.v_r() == 66);
|
OSMO_ASSERT(ul_win.v_r() == 66);
|
||||||
|
|
||||||
OSMO_ASSERT(ul_win.is_in_window(66));
|
OSMO_ASSERT(ul_win.is_in_window(66));
|
||||||
ul_win.m_v_n.mark_received(66);
|
count = ul_win.receive_bsn(66);
|
||||||
ul_win.raise_v_r(66);
|
|
||||||
count = ul_win.raise_v_q();
|
|
||||||
OSMO_ASSERT(count == 0);
|
OSMO_ASSERT(count == 0);
|
||||||
OSMO_ASSERT(ul_win.v_q() == 3);
|
OSMO_ASSERT(ul_win.v_q() == 3);
|
||||||
OSMO_ASSERT(ul_win.v_r() == 67);
|
OSMO_ASSERT(ul_win.v_r() == 67);
|
||||||
|
|
||||||
for (int i = 3; i <= 67; ++i) {
|
for (int i = 3; i <= 67; ++i) {
|
||||||
ul_win.m_v_n.mark_received(i);
|
ul_win.receive_bsn(i);
|
||||||
ul_win.raise_v_r(i);
|
|
||||||
ul_win.raise_v_q();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OSMO_ASSERT(ul_win.v_q() == 68);
|
OSMO_ASSERT(ul_win.v_q() == 68);
|
||||||
OSMO_ASSERT(ul_win.v_r() == 68);
|
OSMO_ASSERT(ul_win.v_r() == 68);
|
||||||
|
|
||||||
ul_win.m_v_n.mark_received(68);
|
count = ul_win.receive_bsn(68);
|
||||||
ul_win.raise_v_r(68);
|
|
||||||
count = ul_win.raise_v_q();
|
|
||||||
OSMO_ASSERT(ul_win.v_q() == 69);
|
OSMO_ASSERT(ul_win.v_q() == 69);
|
||||||
OSMO_ASSERT(ul_win.v_r() == 69);
|
OSMO_ASSERT(ul_win.v_r() == 69);
|
||||||
OSMO_ASSERT(count == 1);
|
OSMO_ASSERT(count == 1);
|
||||||
|
@ -327,9 +311,7 @@ static void test_rlc_dl_ul_basic()
|
||||||
/* now test the wrapping */
|
/* now test the wrapping */
|
||||||
OSMO_ASSERT(ul_win.is_in_window(4));
|
OSMO_ASSERT(ul_win.is_in_window(4));
|
||||||
OSMO_ASSERT(!ul_win.is_in_window(5));
|
OSMO_ASSERT(!ul_win.is_in_window(5));
|
||||||
ul_win.m_v_n.mark_received(4);
|
count = ul_win.receive_bsn(4);
|
||||||
ul_win.raise_v_r(4);
|
|
||||||
count = ul_win.raise_v_q();
|
|
||||||
OSMO_ASSERT(count == 0);
|
OSMO_ASSERT(count == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue