diff options
author | Harald Welte <laforge@gnumonks.org> | 2009-02-17 01:39:41 +0000 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2009-02-17 01:39:41 +0000 |
commit | 75a1fa834ce34da2165de2de0b89cdebc8c87e77 (patch) | |
tree | d2fd15423141009c2f3f1ad3a3e86b0715d0e6e5 /src/paging.c | |
parent | 0932d1e2b41ac733f7f12ca8b887e3ba96525225 (diff) |
switch paging code to use a timer again, since not all BTS send reliable CCCH load indications
Diffstat (limited to 'src/paging.c')
-rw-r--r-- | src/paging.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/paging.c b/src/paging.c index e220fb877..4de93c6c8 100644 --- a/src/paging.c +++ b/src/paging.c @@ -125,8 +125,9 @@ static void paging_handle_pending_requests(struct gsm_bts_paging_state *paging_b * Determine if the pending_requests list is empty and * return then. */ - if (&paging_bts->pending_requests == paging_bts->pending_requests.next) { + if (llist_empty(&paging_bts->pending_requests)) { paging_bts->last_request = NULL; + /* since the list is empty, no need to reschedule the timer */ return; } @@ -156,15 +157,26 @@ static void paging_handle_pending_requests(struct gsm_bts_paging_state *paging_b current_request = paging_bts->last_request; } while (paging_bts->available_slots > 0 && initial_request != current_request); + + schedule_timer(&paging_bts->work_timer, 1, 0); +} + +static void paging_worker(void *data) +{ + struct gsm_bts_paging_state *paging_bts = data; + + paging_handle_pending_requests(paging_bts); } void paging_init(struct gsm_bts *bts) { bts->paging.bts = bts; INIT_LLIST_HEAD(&bts->paging.pending_requests); + bts->paging.work_timer.cb = paging_worker; + bts->paging.work_timer.data = &bts->paging; /* Large number, until we get a proper message */ - bts->paging.available_slots = 10; + bts->paging.available_slots = 100; } static int paging_pending_request(struct gsm_bts_paging_state *bts, @@ -193,7 +205,7 @@ static void paging_T3113_expired(void *data) dispatch_signal(SS_PAGING, S_PAGING_COMPLETED, &sig_data); if (req->cbfn) - req->cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_EXPIRED, NULL, req, + req->cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_EXPIRED, NULL, NULL, req->cbfn_param); paging_remove_request(&req->bts->paging, req); } @@ -220,10 +232,14 @@ void paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr, req->T3113.data = req; schedule_timer(&req->T3113, T3113_VALUE); llist_add_tail(&req->entry, &bts_entry->pending_requests); + + if (!timer_pending(&bts_entry->work_timer)) + schedule_timer(&bts_entry->work_timer, 1, 0); } /* we consciously ignore the type of the request here */ -void paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *subscr) +void paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *subscr, + struct gsm_lchan *lchan) { struct gsm_bts_paging_state *bts_entry = &bts->paging; struct gsm_paging_request *req, *req2; @@ -233,7 +249,7 @@ void paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *subscr) if (req->subscr == subscr) { if (req->cbfn) req->cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_SUCCEEDED, - NULL, req, req->cbfn_param); + NULL, lchan, req->cbfn_param); paging_remove_request(&bts->paging, req); break; } @@ -243,5 +259,4 @@ 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) { bts->paging.available_slots = free_slots; - paging_handle_pending_requests(&bts->paging); } |