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...

diff --git a/src/paging.c b/src/paging.c
index 5578130..c7782f9 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 @@
 
 	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;
 		}
 	}