[paging] When we ran down to 0 available paging slots start a credit timer

It might be that we run down to zero available slots but the BTS
might not send us a load indication. This can happen if we think
we send paging requests and the BTS disagrees and considers them
as errors and does not count the paging message.
When we drop to zero we will start a credit timer to give us extra
credit after six seconds, if we get a CCCH load indication before
we will stop the timer.
This commit is contained in:
Holger Hans Peter Freyther 2010-04-19 19:41:26 +08:00
parent b0e88b8644
commit 6410d93cf8
2 changed files with 18 additions and 9 deletions

View File

@ -453,6 +453,7 @@ struct gsm_bts_paging_state {
struct gsm_bts *bts;
struct timer_list work_timer;
struct timer_list credit_timer;
/* load */
u_int16_t available_slots;

View File

@ -96,6 +96,14 @@ static void page_ms(struct gsm_paging_request *request)
gsm0808_page(request->bts, page_group, mi_len, mi, request->chan_type);
}
static void paging_give_credit(void *data)
{
struct gsm_bts_paging_state *paging_bts = data;
LOGP(DPAG, LOGL_NOTICE, "No slots available on bts nr %d\n", paging_bts->bts->nr);
paging_bts->available_slots = 20;
}
/*
* This is kicked by the periodic PAGING LOAD Indicator
* coming from abis_rsl.c
@ -118,17 +126,16 @@ static void paging_handle_pending_requests(struct gsm_bts_paging_state *paging_b
}
/*
* In case the BTS does not provide us with load indication just fill
* up our slots for this round. We should be able to page 20 subscribers
* every two seconds. So we will just give the BTS some extra credit.
* We will have to see how often we run out of this credit, so we might
* need a low watermark and then add credit or give 20 every run when
* the bts sets an option for that.
* In case the BTS does not provide us with load indication and we
* ran out of slots, call an autofill routine. It might be that the
* BTS did not like our paging messages and then we have counted down
* to zero and we do not get any messages.
*/
if (paging_bts->available_slots == 0) {
LOGP(DPAG, LOGL_NOTICE, "No slots available on bts nr %d\n",
paging_bts->bts->nr);
paging_bts->available_slots = 20;
paging_bts->credit_timer.cb = paging_give_credit;
paging_bts->credit_timer.data = paging_bts;
bsc_schedule_timer(&paging_bts->credit_timer, 5, 0);
return;
}
initial_request = llist_entry(paging_bts->pending_requests.next,
@ -325,5 +332,6 @@ void paging_request_stop(struct gsm_bts *_bts, struct gsm_subscriber *subscr,
void paging_update_buffer_space(struct gsm_bts *bts, u_int16_t free_slots)
{
bsc_del_timer(&bts->paging.credit_timer);
bts->paging.available_slots = free_slots;
}