diff options
author | Harald Welte <laforge@gnumonks.org> | 2009-01-06 23:10:57 +0000 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2009-01-06 23:10:57 +0000 |
commit | 38c2f13098abb18ad58785bf473692ef4e0211fa (patch) | |
tree | 36cf196b9d2093c6aee458a619267692c18394e1 /src/paging.c | |
parent | b68899d3e3f581cfa0b8d943cc90fddfe1596412 (diff) |
Hook the paging code into bsc_hack.c and telnet_interface.c
Wrote and test code to add and remove paging requests... This
will be using the fact that the linux list is building a circle
on each tick we can send one/x paging requests and continue round
robin...
Diffstat (limited to 'src/paging.c')
-rw-r--r-- | src/paging.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/paging.c b/src/paging.c index 5578130de..c7782f9bd 100644 --- a/src/paging.c +++ b/src/paging.c @@ -38,8 +38,40 @@ #include <openbsc/paging.h> #include <openbsc/debug.h> +#define PAGING_TIMEOUT 0, 5000 + static LLIST_HEAD(managed_bts); +/* + * Kill one paging request update the internal list... + */ +static void page_remove_request(struct paging_bts *paging_bts) { + struct paging_request *to_be_deleted = paging_bts->last_request; + paging_bts->last_request = + (struct paging_request *)paging_bts->last_request->entry.next; + if (&to_be_deleted->entry == &paging_bts->pending_requests) + paging_bts->last_request = NULL; + llist_del(&to_be_deleted->entry); + free(to_be_deleted); +} + + +static void page_handle_pending_requests(void *data) { + struct paging_bts *paging_bts = (struct paging_bts *)data; + + if (!paging_bts->last_request) + paging_bts->last_request = + (struct paging_request *)paging_bts->pending_requests.next; + if (&paging_bts->last_request->entry == &paging_bts->pending_requests) { + paging_bts->last_request = NULL; + return; + } + + DEBUGP(DPAG, "Going to send paging commands: '%s'\n", + paging_bts->last_request->subscr->imsi); + schedule_timer(&paging_bts->page_timer, PAGING_TIMEOUT); +} + static int page_pending_request(struct paging_bts *bts, struct gsm_subscriber *subscr) { struct paging_request *req; @@ -57,22 +89,30 @@ struct paging_bts* page_allocate(struct gsm_bts *bts) { page = (struct paging_bts *)malloc(sizeof(*page)); memset(page, 0, sizeof(*page)); + page->bts = bts; + INIT_LLIST_HEAD(&page->pending_requests); + page->page_timer.cb = page_handle_pending_requests; + page->page_timer.data = page; + llist_add_tail(&page->bts_list, &managed_bts); return page; } -void page_request(struct gsm_bts *bts, struct gsm_subscriber *subscr) { +void page_request(struct gsm_bts *bts, struct gsm_subscriber *subscr, int type) { struct paging_bts *bts_entry; struct paging_request *req; req = (struct paging_request *)malloc(sizeof(*req)); req->subscr = subscr_get(subscr); req->bts = bts; + req->chan_type = type; llist_for_each_entry(bts_entry, &managed_bts, bts_list) { if (bts == bts_entry->bts && !page_pending_request(bts_entry, subscr)) { llist_add_tail(&req->entry, &bts_entry->pending_requests); + if (!timer_pending(&bts_entry->page_timer)) + schedule_timer(&bts_entry->page_timer, PAGING_TIMEOUT); return; } } |