paging: Initialize structs internally to avoid a crash

The code to create the struct gsm_bts is in libcommon right now
and we can not call paging_init from there. Right now it appears
to be the easiest of doing the init internally.
This commit is contained in:
Holger Hans Peter Freyther 2011-04-26 15:44:57 +02:00
parent e188010512
commit 5a081bbb1d
3 changed files with 11 additions and 6 deletions

View File

@ -53,9 +53,6 @@ struct gsm_paging_request {
void *cbfn_param;
};
/* call once for every gsm_bts... */
void paging_init(struct gsm_bts *bts);
/* schedule paging request */
int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
int type, gsm_cbfn *cbfn, void *data);

View File

@ -404,8 +404,6 @@ static int bootstrap_bts(struct gsm_bts *bts)
bts->si_common.ncc_permitted = 0xff;
paging_init(bts);
return 0;
}

View File

@ -225,8 +225,11 @@ static void paging_worker(void *data)
paging_handle_pending_requests(paging_bts);
}
void paging_init(struct gsm_bts *bts)
static void paging_init_if_needed(struct gsm_bts *bts)
{
if (bts->paging.bts)
return;
bts->paging.bts = bts;
INIT_LLIST_HEAD(&bts->paging.pending_requests);
bts->paging.work_timer.cb = paging_worker;
@ -322,6 +325,9 @@ int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
if (!trx_is_usable(bts->c0))
continue;
/* maybe it is the first time we use it */
paging_init_if_needed(bts);
num_pages++;
/* Trigger paging, pass any error to caller */
@ -345,6 +351,8 @@ static void _paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *sub
struct gsm_bts_paging_state *bts_entry = &bts->paging;
struct gsm_paging_request *req, *req2;
paging_init_if_needed(bts);
llist_for_each_entry_safe(req, req2, &bts_entry->pending_requests,
entry) {
if (req->subscr == subscr) {
@ -389,6 +397,8 @@ void paging_request_stop(struct gsm_bts *_bts, struct gsm_subscriber *subscr,
void paging_update_buffer_space(struct gsm_bts *bts, uint16_t free_slots)
{
paging_init_if_needed(bts);
bsc_del_timer(&bts->paging.credit_timer);
bts->paging.available_slots = free_slots;
paging_schedule_if_needed(&bts->paging);