aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libbsc
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2011-04-26 15:44:57 +0200
committerHolger Hans Peter Freyther <zecke@selfish.org>2011-05-02 19:19:15 +0200
commit5a081bbb1d4b8974c160a2ddaf544a691c78e187 (patch)
tree2f3046b10162c43e6cb052f461b34aee089718ad /openbsc/src/libbsc
parente188010512388acdb1408f3d1a0749c25c2c99e3 (diff)
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.
Diffstat (limited to 'openbsc/src/libbsc')
-rw-r--r--openbsc/src/libbsc/bsc_init.c2
-rw-r--r--openbsc/src/libbsc/paging.c12
2 files changed, 11 insertions, 3 deletions
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);