aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Freyther <zecke@selfish.org>2009-02-10 00:06:19 +0000
committerHolger Freyther <zecke@selfish.org>2009-02-10 00:06:19 +0000
commit392209cbb55ebaaa5d795e196198f16615c3d7e4 (patch)
tree37a5bb77eceb8ecb430a90bdbcf9b9a3356f1358
parent1fd34141c220fcc0c04029a2966ef486ed8cb6be (diff)
[paging] Introduce a variable containing the free paging slots
Start with a large number of available slots. It is guranteed that we will - at some point - get a paging load and will properly update the counter and keep it updated.
-rw-r--r--include/openbsc/gsm_data.h3
-rw-r--r--include/openbsc/paging.h3
-rw-r--r--src/abis_rsl.c2
-rw-r--r--src/paging.c8
4 files changed, 16 insertions, 0 deletions
diff --git a/include/openbsc/gsm_data.h b/include/openbsc/gsm_data.h
index c87b25da1..006a8c0e4 100644
--- a/include/openbsc/gsm_data.h
+++ b/include/openbsc/gsm_data.h
@@ -204,6 +204,9 @@ struct gsm_bts_paging_state {
struct gsm_paging_request *last_request;
struct gsm_bts *bts;
+ /* load */
+ u_int16_t available_slots;
+
/* tick timer */
struct timer_list paging_timer;
};
diff --git a/include/openbsc/paging.h b/include/openbsc/paging.h
index 1260a9b34..0e5a0d447 100644
--- a/include/openbsc/paging.h
+++ b/include/openbsc/paging.h
@@ -38,4 +38,7 @@ void paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr, int type
/* stop paging requests */
void paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *subscr);
+/* update paging load */
+void paging_update_buffer_space(struct gsm_bts *bts, u_int16_t);
+
#endif
diff --git a/src/abis_rsl.c b/src/abis_rsl.c
index 1c78bf72c..ad869f4db 100644
--- a/src/abis_rsl.c
+++ b/src/abis_rsl.c
@@ -32,6 +32,7 @@
#include <openbsc/chan_alloc.h>
#include <openbsc/debug.h>
#include <openbsc/tlv.h>
+#include <openbsc/paging.h>
#define RSL_ALLOC_SIZE 1024
#define RSL_ALLOC_HEADROOM 128
@@ -673,6 +674,7 @@ static int rsl_rx_ccch_load(struct msgb *msg)
pg_buf_space = rslh->data[1] << 8 | rslh->data[2];
DEBUGP(DRSL, "CCCH LOAD IND, free paging buffer space: %u\n",
pg_buf_space);
+ paging_update_buffer_space(msg->trx->bts, pg_buf_space);
break;
case RSL_IE_RACH_LOAD:
if (msg->data_len >= 7) {
diff --git a/src/paging.c b/src/paging.c
index 482669052..55f6d810f 100644
--- a/src/paging.c
+++ b/src/paging.c
@@ -134,6 +134,9 @@ void paging_init(struct gsm_bts *bts)
INIT_LLIST_HEAD(&bts->paging.pending_requests);
bts->paging.paging_timer.cb = paging_handle_pending_requests;
bts->paging.paging_timer.data = &bts->paging;
+
+ /* Large number, until we get a proper message */
+ bts->paging.available_slots = 0xffff;
}
static int paging_pending_request(struct gsm_bts_paging_state *bts,
@@ -181,3 +184,8 @@ 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;
+}