From 5a081bbb1d4b8974c160a2ddaf544a691c78e187 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 26 Apr 2011 15:44:57 +0200 Subject: 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. --- openbsc/src/libbsc/bsc_init.c | 2 -- openbsc/src/libbsc/paging.c | 12 +++++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) (limited to 'openbsc/src') diff --git a/openbsc/src/libbsc/bsc_init.c b/openbsc/src/libbsc/bsc_init.c index 8ea2cfa31..1d14df1a7 100644 --- a/openbsc/src/libbsc/bsc_init.c +++ b/openbsc/src/libbsc/bsc_init.c @@ -404,8 +404,6 @@ static int bootstrap_bts(struct gsm_bts *bts) bts->si_common.ncc_permitted = 0xff; - paging_init(bts); - return 0; } diff --git a/openbsc/src/libbsc/paging.c b/openbsc/src/libbsc/paging.c index 2de098bdb..c61807462 100644 --- a/openbsc/src/libbsc/paging.c +++ b/openbsc/src/libbsc/paging.c @@ -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); -- cgit v1.2.3