aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2012-06-04 17:27:13 +0200
committerHarald Welte <laforge@gnumonks.org>2012-06-14 11:48:24 +0800
commit565cf0d8ab15282e5f12d74e5e69baff514a6565 (patch)
treeef8f4122c41ec708f7c718d2ab0138838a0f2479 /src
parenta540332df3de735f75a2959814190b6cbf3c6e4c (diff)
attempt to make CCCH Load Indications for PCH work
Diffstat (limited to 'src')
-rw-r--r--src/common/Makefile.am3
-rw-r--r--src/common/bts.c2
-rw-r--r--src/common/load_indication.c32
-rw-r--r--src/common/paging.c21
4 files changed, 42 insertions, 16 deletions
diff --git a/src/common/Makefile.am b/src/common/Makefile.am
index b92aecdd..042a3dc6 100644
--- a/src/common/Makefile.am
+++ b/src/common/Makefile.am
@@ -4,4 +4,5 @@ LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOTRAU_LIBS)
noinst_LIBRARIES = libbts.a
libbts_a_SOURCES = gsm_data_shared.c sysinfo.c logging.c abis.c oml.c bts.c \
- rsl.c vty.c paging.c measurement.c amr.c lchan.c
+ rsl.c vty.c paging.c measurement.c amr.c lchan.c \
+ load_indication.c
diff --git a/src/common/bts.c b/src/common/bts.c
index 866c9686..077e6ed2 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -66,6 +66,8 @@ int bts_init(struct gsm_bts *bts)
/* FIXME: make those parameters configurable */
btsb->paging_state = paging_init(btsb, 200, 0);
+ load_timer_start(bts);
+
btsb->rtp_jitter_buf_ms = 100;
/* set BTS to dependency */
diff --git a/src/common/load_indication.c b/src/common/load_indication.c
index 12e41e43..aa2ec9c1 100644
--- a/src/common/load_indication.c
+++ b/src/common/load_indication.c
@@ -19,12 +19,19 @@
*
*/
-#include <rsl.h>
+#include <stdint.h>
#include <osmocom/core/timer.h>
+#include <osmocom/core/msgb.h>
-static void reset_load_counters(void)
+#include <osmo-bts/gsm_data.h>
+#include <osmo-bts/rsl.h>
+#include <osmo-bts/paging.h>
+
+static void reset_load_counters(struct gsm_bts *bts)
{
+ struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
+
/* re-set the counters */
btsb->load.ccch.pch_used = btsb->load.ccch.pch_total = 0;
}
@@ -32,7 +39,7 @@ static void reset_load_counters(void)
static void load_timer_cb(void *data)
{
struct gsm_bts *bts = data;
- struct gsm_bts_role_bts *btsb = FIXME;
+ struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
unsigned int pch_percent;
/* compute percentages */
@@ -40,30 +47,31 @@ static void load_timer_cb(void *data)
if (pch_percent >= btsb->load.ccch.load_ind_thresh) {
/* send RSL load indication message to BSC */
- uint16_t paging_buffer_space = FIXME;
- rsl_tx_ccch_load_ind_pch(bts, paging_buffer_space);
+ uint16_t buffer_space = paging_buffer_space(btsb->paging_state);
+ rsl_tx_ccch_load_ind_pch(bts, buffer_space);
}
- reset_load_counters();
+ reset_load_counters(bts);
/* re-schedule the timer */
osmo_timer_schedule(&btsb->load.ccch.timer,
btsb->load.ccch.load_ind_period, 0);
}
-static void load_timer_start(struct gsm_bts *bts)
+void load_timer_start(struct gsm_bts *bts)
{
- struct gsm_bts_role_bts *btsb = FIXME;
+ struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
btsb->load.ccch.timer.data = bts;
- reset_load_counters();
+ btsb->load.ccch.timer.cb = load_timer_cb;
+ reset_load_counters(bts);
osmo_timer_schedule(&btsb->load.ccch.timer,
btsb->load.ccch.load_ind_period, 0);
-
- return 0
}
-static void load_timer_stop(struct gsm_bts *bts)
+void load_timer_stop(struct gsm_bts *bts)
{
+ struct gsm_bts_role_bts *btsb = bts_role_bts(bts);
+
osmo_timer_del(&btsb->load.ccch.timer);
}
diff --git a/src/common/paging.c b/src/common/paging.c
index c6e68ccb..74e807e8 100644
--- a/src/common/paging.c
+++ b/src/common/paging.c
@@ -1,6 +1,6 @@
/* Paging message encoding + queue management */
-/* (C) 2011 by Harald Welte <laforge@gnumonks.org>
+/* (C) 2011-2012 by Harald Welte <laforge@gnumonks.org>
*
* All Rights Reserved
*
@@ -53,6 +53,8 @@ struct paging_record {
};
struct paging_state {
+ struct gsm_bts_role_bts *btsb;
+
/* parameters taken / interpreted from BCCH/CCCH configuration */
struct gsm48_control_channel_descr chan_desc;
@@ -128,6 +130,13 @@ static int get_pag_subch_nr(struct paging_state *ps, struct gsm_time *gt)
return pag_idx + mfrm_part;
}
+int paging_buffer_space(struct paging_state *ps)
+{
+ if (ps->num_paging >= ps->num_paging_max)
+ return 0;
+ else
+ return ps->num_paging_max - ps->num_paging;
+}
/* Add an identity to the paging queue */
int paging_add_identity(struct paging_state *ps, uint8_t paging_group,
@@ -299,6 +308,8 @@ int paging_gen_msg(struct paging_state *ps, uint8_t *out_buf, struct gsm_time *g
int group;
int len;
+ ps->btsb->load.ccch.pch_total += 1;
+
group = get_pag_subch_nr(ps, gt);
if (group < 0) {
LOGP(DPAG, LOGL_ERROR,
@@ -320,6 +331,8 @@ int paging_gen_msg(struct paging_state *ps, uint8_t *out_buf, struct gsm_time *g
time_t now = time(NULL);
unsigned int i, num_imsi = 0;
+ ps->btsb->load.ccch.pch_used += 1;
+
/* get (if we have) up to four paging records */
for (i = 0; i < ARRAY_SIZE(pr); i++) {
if (llist_empty(group_q))
@@ -428,16 +441,18 @@ static int paging_signal_cbfn(unsigned int subsys, unsigned int signal, void *hd
static int initialized = 0;
-struct paging_state *paging_init(void *ctx, unsigned int num_paging_max,
+struct paging_state *paging_init(struct gsm_bts_role_bts *btsb,
+ unsigned int num_paging_max,
unsigned int paging_lifetime)
{
struct paging_state *ps;
unsigned int i;
- ps = talloc_zero(ctx, struct paging_state);
+ ps = talloc_zero(btsb, struct paging_state);
if (!ps)
return NULL;
+ ps->btsb = btsb;
ps->paging_lifetime = paging_lifetime;
ps->num_paging_max = num_paging_max;