aboutsummaryrefslogtreecommitdiffstats
path: root/src/paging.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-01-06 23:10:57 +0000
committerHarald Welte <laforge@gnumonks.org>2009-01-06 23:10:57 +0000
commit38c2f13098abb18ad58785bf473692ef4e0211fa (patch)
tree36cf196b9d2093c6aee458a619267692c18394e1 /src/paging.c
parentb68899d3e3f581cfa0b8d943cc90fddfe1596412 (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.c42
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;
}
}