diff options
author | Harald Welte <laforge@gnumonks.org> | 2012-06-04 17:27:13 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2012-06-14 11:48:24 +0800 |
commit | 565cf0d8ab15282e5f12d74e5e69baff514a6565 (patch) | |
tree | ef8f4122c41ec708f7c718d2ab0138838a0f2479 /src | |
parent | a540332df3de735f75a2959814190b6cbf3c6e4c (diff) |
attempt to make CCCH Load Indications for PCH work
Diffstat (limited to 'src')
-rw-r--r-- | src/common/Makefile.am | 3 | ||||
-rw-r--r-- | src/common/bts.c | 2 | ||||
-rw-r--r-- | src/common/load_indication.c | 32 | ||||
-rw-r--r-- | src/common/paging.c | 21 |
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; |