ulc: Fix FN store order upon wrap around
Related: OS#5020 Change-Id: I0a742f7fa1541b1837739207b9383772f981fb25
This commit is contained in:
parent
95f8fa1f7c
commit
c7cc4162e1
|
@ -37,6 +37,20 @@ const struct value_string pdch_ul_node_names[] = {
|
|||
{ 0, NULL }
|
||||
};
|
||||
|
||||
#define GSM_MAX_FN_THRESH (GSM_MAX_FN >> 1)
|
||||
/* 0: equal, -1: fn1 BEFORE fn2, 1: fn1 AFTER fn2 */
|
||||
static inline int fn_cmp(uint32_t fn1, uint32_t fn2)
|
||||
{
|
||||
if (fn1 == fn2)
|
||||
return 0;
|
||||
/* FN1 goes before FN2: */
|
||||
if ((fn1 < fn2 && (fn2 - fn1) < GSM_MAX_FN_THRESH) ||
|
||||
(fn1 > fn2 && (fn1 - fn2) > GSM_MAX_FN_THRESH))
|
||||
return -1;
|
||||
/* FN1 goes after FN2: */
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct pdch_ulc *pdch_ulc_alloc(struct gprs_rlcmac_pdch *pdch, void *ctx)
|
||||
{
|
||||
struct pdch_ulc* ulc;
|
||||
|
@ -53,11 +67,13 @@ struct pdch_ulc_node *pdch_ulc_get_node(struct pdch_ulc *ulc, uint32_t fn)
|
|||
{
|
||||
struct rb_node *node;
|
||||
struct pdch_ulc_node *it;
|
||||
int res;
|
||||
for (node = rb_first(&ulc->tree_root); node; node = rb_next(node)) {
|
||||
it = container_of(node, struct pdch_ulc_node, node);
|
||||
if (it->fn == fn)
|
||||
res = fn_cmp(it->fn, fn);
|
||||
if (res == 0) /* it->fn == fn */
|
||||
return it;
|
||||
if (it->fn > fn)
|
||||
if (res > 0) /* it->fn AFTER fn */
|
||||
break;
|
||||
}
|
||||
return NULL;
|
||||
|
@ -123,13 +139,15 @@ static int pdch_ulc_add_node(struct pdch_ulc *ulc, struct pdch_ulc_node *item)
|
|||
|
||||
while (*n) {
|
||||
struct pdch_ulc_node *it;
|
||||
int res;
|
||||
|
||||
it = container_of(*n, struct pdch_ulc_node, node);
|
||||
|
||||
parent = *n;
|
||||
if (item->fn < it->fn) {
|
||||
res = fn_cmp(item->fn, it->fn);
|
||||
if (res < 0) { /* item->fn "BEFORE" it->fn */
|
||||
n = &((*n)->rb_left);
|
||||
} else if (item->fn > it->fn) {
|
||||
} else if (res > 0) { /* item->fn "AFTER" it->fn */
|
||||
n = &((*n)->rb_right);
|
||||
} else {
|
||||
LOGPDCH(ulc->pdch, DRLCMAC, LOGL_ERROR,
|
||||
|
@ -213,13 +231,15 @@ void pdch_ulc_expire_fn(struct pdch_ulc *ulc, uint32_t fn)
|
|||
{
|
||||
struct gprs_rlcmac_sba *sba;
|
||||
struct pdch_ulc_node *item;
|
||||
int res;
|
||||
|
||||
struct rb_node *first;
|
||||
while((first = rb_first(&ulc->tree_root))) {
|
||||
item = container_of(first, struct pdch_ulc_node, node);
|
||||
if (item->fn > fn)
|
||||
res = fn_cmp(item->fn, fn);
|
||||
if (res > 0) /* item->fn AFTER fn */
|
||||
break;
|
||||
if (item->fn < fn) {
|
||||
if (res < 0) { /* item->fn BEFORE fn */
|
||||
/* Sanity check: */
|
||||
LOGPDCH(ulc->pdch, DRLCMAC, LOGL_ERROR,
|
||||
"Expiring FN=%" PRIu32 " but previous FN=%" PRIu32 " is still reserved!\n",
|
||||
|
|
|
@ -199,14 +199,14 @@ static void test_fn_wrap_around()
|
|||
printf("*** RELEASE fn=%" PRIu32 ":\n", 0);
|
||||
rc = pdch_ulc_release_fn(pdch->ulc, 0);
|
||||
print_ulc_nodes(pdch->ulc);
|
||||
//OSMO_ASSERT(rc == 0); FIXME: DISABLED DUE TO BUG!
|
||||
OSMO_ASSERT(rc == 0);
|
||||
|
||||
/* Expiring last FN should expire all entries */
|
||||
printf("*** EXPIRE FN=%" PRIu32 ":\n", last_fn);
|
||||
pdch_ulc_expire_fn(pdch->ulc, last_fn);
|
||||
print_ulc_nodes(pdch->ulc);
|
||||
/* Make sure the store is empty now: */
|
||||
//OSMO_ASSERT(!rb_first(&pdch->ulc->tree_root)); FIXME: DISABLED DUE TO BUG!
|
||||
OSMO_ASSERT(!rb_first(&pdch->ulc->tree_root));
|
||||
|
||||
talloc_free(bts);
|
||||
printf("=== end: %s ===\n", __FUNCTION__);
|
||||
|
|
|
@ -6,26 +6,38 @@ PDCH(bts=0,trx=0,ts=0) Trying to release unregistered SBA (FN=78, TA=0)
|
|||
PDCH(bts=0,trx=0,ts=0) Timeout for registered SBA (FN=72, TA=0)
|
||||
Creating MS object, TLLI = 0x12345678
|
||||
MS(TLLI=0x12345678, IMSI=, TA=220, 0/0,) Attaching DL TBF: TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=0 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=0): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=4 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=4): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=8 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=8): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=13 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=17 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=17): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=21 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=21): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=26 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=26): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=30 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=30): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=34 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=34): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=39 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=39): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=2715613 but previous FN=2715608 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715608): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715613): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715608): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715613): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715617 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715617): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715622 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715622): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715626 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715626): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715630 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715630): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715635 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715635): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715639 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715639): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715643 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715643): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=4 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=4): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=8 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=8): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=13 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=17 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=17): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=21 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=21): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=26 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=26): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=30 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=30): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=34 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=34): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=39 is still reserved!
|
||||
PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=39): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)
|
||||
|
|
|
@ -56,7 +56,6 @@ FN=2715635 type=POLL
|
|||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
*** RESERVE FN=0:
|
||||
FN=0 type=POLL
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
|
@ -66,9 +65,20 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
FN=0 type=POLL
|
||||
*** RESERVE FN=4:
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
FN=2715622 type=POLL
|
||||
FN=2715626 type=POLL
|
||||
FN=2715630 type=POLL
|
||||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
FN=0 type=POLL
|
||||
FN=4 type=POLL
|
||||
*** RESERVE FN=8:
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
|
@ -78,10 +88,10 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
*** RESERVE FN=8:
|
||||
FN=0 type=POLL
|
||||
FN=4 type=POLL
|
||||
FN=8 type=POLL
|
||||
*** RESERVE FN=13:
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
|
@ -91,11 +101,11 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
*** RESERVE FN=13:
|
||||
FN=0 type=POLL
|
||||
FN=4 type=POLL
|
||||
FN=8 type=POLL
|
||||
FN=13 type=POLL
|
||||
*** RESERVE FN=17:
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
|
@ -105,12 +115,12 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
*** RESERVE FN=17:
|
||||
FN=0 type=POLL
|
||||
FN=4 type=POLL
|
||||
FN=8 type=POLL
|
||||
FN=13 type=POLL
|
||||
FN=17 type=POLL
|
||||
*** RESERVE FN=21:
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
|
@ -120,13 +130,13 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
*** RESERVE FN=21:
|
||||
FN=0 type=POLL
|
||||
FN=4 type=POLL
|
||||
FN=8 type=POLL
|
||||
FN=13 type=POLL
|
||||
FN=17 type=POLL
|
||||
FN=21 type=POLL
|
||||
*** RESERVE FN=26:
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
|
@ -136,7 +146,6 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
*** RESERVE FN=26:
|
||||
FN=0 type=POLL
|
||||
FN=4 type=POLL
|
||||
FN=8 type=POLL
|
||||
|
@ -144,6 +153,7 @@ FN=13 type=POLL
|
|||
FN=17 type=POLL
|
||||
FN=21 type=POLL
|
||||
FN=26 type=POLL
|
||||
*** RESERVE FN=30:
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
|
@ -153,7 +163,6 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
*** RESERVE FN=30:
|
||||
FN=0 type=POLL
|
||||
FN=4 type=POLL
|
||||
FN=8 type=POLL
|
||||
|
@ -162,6 +171,7 @@ FN=17 type=POLL
|
|||
FN=21 type=POLL
|
||||
FN=26 type=POLL
|
||||
FN=30 type=POLL
|
||||
*** RESERVE FN=34:
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
|
@ -171,7 +181,6 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
*** RESERVE FN=34:
|
||||
FN=0 type=POLL
|
||||
FN=4 type=POLL
|
||||
FN=8 type=POLL
|
||||
|
@ -181,6 +190,7 @@ FN=21 type=POLL
|
|||
FN=26 type=POLL
|
||||
FN=30 type=POLL
|
||||
FN=34 type=POLL
|
||||
*** RESERVE FN=39:
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
|
@ -190,7 +200,6 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
*** RESERVE FN=39:
|
||||
FN=0 type=POLL
|
||||
FN=4 type=POLL
|
||||
FN=8 type=POLL
|
||||
|
@ -201,15 +210,6 @@ FN=26 type=POLL
|
|||
FN=30 type=POLL
|
||||
FN=34 type=POLL
|
||||
FN=39 type=POLL
|
||||
FN=2715608 type=POLL
|
||||
FN=2715613 type=POLL
|
||||
FN=2715617 type=POLL
|
||||
FN=2715622 type=POLL
|
||||
FN=2715626 type=POLL
|
||||
FN=2715630 type=POLL
|
||||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
*** EXPIRE FN=2715613:
|
||||
FN=2715617 type=POLL
|
||||
FN=2715622 type=POLL
|
||||
|
@ -218,6 +218,16 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
FN=0 type=POLL
|
||||
FN=4 type=POLL
|
||||
FN=8 type=POLL
|
||||
FN=13 type=POLL
|
||||
FN=17 type=POLL
|
||||
FN=21 type=POLL
|
||||
FN=26 type=POLL
|
||||
FN=30 type=POLL
|
||||
FN=34 type=POLL
|
||||
FN=39 type=POLL
|
||||
*** RELEASE fn=0:
|
||||
FN=2715617 type=POLL
|
||||
FN=2715622 type=POLL
|
||||
|
@ -226,12 +236,14 @@ FN=2715630 type=POLL
|
|||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
FN=4 type=POLL
|
||||
FN=8 type=POLL
|
||||
FN=13 type=POLL
|
||||
FN=17 type=POLL
|
||||
FN=21 type=POLL
|
||||
FN=26 type=POLL
|
||||
FN=30 type=POLL
|
||||
FN=34 type=POLL
|
||||
FN=39 type=POLL
|
||||
*** EXPIRE FN=43:
|
||||
FN=2715617 type=POLL
|
||||
FN=2715622 type=POLL
|
||||
FN=2715626 type=POLL
|
||||
FN=2715630 type=POLL
|
||||
FN=2715635 type=POLL
|
||||
FN=2715639 type=POLL
|
||||
FN=2715643 type=POLL
|
||||
=== end: test_fn_wrap_around ===
|
||||
|
|
Loading…
Reference in New Issue