rlc: Manage the received block bitmap in the ul_window
Added two methods to gprs_rlc_ul_window * ssn() returns the starting sequence number * update_rbb() returns an array of chars representing the state of the received block bitmap. Each element is either 'I'nvalid or 'R'eceived. The rbb is generated from v_n rbb[63] relates to BSN ssn-1 ... rbb[0] relates to BSN ssn-64
This commit is contained in:
parent
11f2d58dbd
commit
8a31f9e016
12
src/rlc.cpp
12
src/rlc.cpp
|
@ -146,6 +146,18 @@ void gprs_rlc_v_n::reset()
|
|||
memset(m_v_n, 0x0, sizeof(m_v_n));
|
||||
}
|
||||
|
||||
/* Update the receive block bitmap */
|
||||
void gprs_rlc_ul_window::update_rbb(const gprs_rlc_v_n *v_n, char *rbb)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i < ws(); i++) {
|
||||
if (v_n->is_received(ssn()-1-i))
|
||||
rbb[ws()-1-i] = 'R';
|
||||
else
|
||||
rbb[ws()-1-i] = 'I';
|
||||
}
|
||||
}
|
||||
|
||||
/* Raise V(R) to highest received sequence number not received. */
|
||||
void gprs_rlc_ul_window::raise_v_r(const uint16_t bsn, gprs_rlc_v_n *v_n)
|
||||
{
|
||||
|
|
|
@ -89,8 +89,11 @@ struct gprs_rlc_ul_window {
|
|||
const uint16_t v_r() const;
|
||||
const uint16_t v_q() const;
|
||||
|
||||
const uint16_t ssn() const;
|
||||
|
||||
bool is_in_window(uint8_t bsn) const;
|
||||
|
||||
void update_rbb(const gprs_rlc_v_n *v_n, char *rbb);
|
||||
void raise_v_r(int moves);
|
||||
void raise_v_r(const uint16_t bsn, gprs_rlc_v_n *v_n);
|
||||
uint16_t raise_v_q(gprs_rlc_v_n *v_n);
|
||||
|
@ -339,6 +342,11 @@ inline const uint16_t gprs_rlc_ul_window::v_q() const
|
|||
return m_v_q;
|
||||
}
|
||||
|
||||
inline const uint16_t gprs_rlc_ul_window::ssn() const
|
||||
{
|
||||
return m_v_r;
|
||||
}
|
||||
|
||||
inline void gprs_rlc_ul_window::raise_v_r(int moves)
|
||||
{
|
||||
m_v_r = (m_v_r + moves) & mod_sns();
|
||||
|
|
Loading…
Reference in New Issue