aboutsummaryrefslogtreecommitdiffstats
path: root/src/paging.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-02-17 01:39:41 +0000
committerHarald Welte <laforge@gnumonks.org>2009-02-17 01:39:41 +0000
commit75a1fa834ce34da2165de2de0b89cdebc8c87e77 (patch)
treed2fd15423141009c2f3f1ad3a3e86b0715d0e6e5 /src/paging.c
parent0932d1e2b41ac733f7f12ca8b887e3ba96525225 (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.c27
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);
}