diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-06-14 18:20:15 +0800 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-06-14 18:26:09 +0800 |
commit | abcddf1152dc9adca62bfb93df6439e1bc07f8a7 (patch) | |
tree | 32dd28d562511c8fdf88d5cc27f53a61bc9020d4 /openbsc | |
parent | 2a9285c028ce061128620382eb5e502669bb56ed (diff) |
bsc_api: Add init, dispatch the clear request when a channel is going missing
Diffstat (limited to 'openbsc')
-rw-r--r-- | openbsc/include/openbsc/bsc_api.h | 1 | ||||
-rw-r--r-- | openbsc/include/openbsc/gsm_data.h | 2 | ||||
-rw-r--r-- | openbsc/src/bsc_api.c | 37 |
3 files changed, 40 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/bsc_api.h b/openbsc/include/openbsc/bsc_api.h index 2cfdbb467..05a5e4601 100644 --- a/openbsc/include/openbsc/bsc_api.h +++ b/openbsc/include/openbsc/bsc_api.h @@ -20,6 +20,7 @@ struct bsc_api { void (*clear_compl)(struct gsm_subscriber_connection *conn); }; +int bsc_api_init(struct gsm_network *network, struct bsc_api *api); int gsm0808_submit_dtap(struct gsm_subscriber_connection *conn, struct msgb *msg, int link_id); #endif diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 90e8fc029..9258d1c11 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -156,6 +156,7 @@ struct gsm_lchan; struct gsm_subscriber; struct gsm_mncc; struct rtp_socket; +struct bsc_api; /* Network Management State */ struct gsm_nm_state { @@ -630,6 +631,7 @@ struct gsm_network { int (*mncc_recv) (struct gsm_network *net, int msg_type, void *arg); struct llist_head upqueue; struct llist_head trans_list; + struct bsc_api *bsc_api; unsigned int num_bts; struct llist_head bts_list; diff --git a/openbsc/src/bsc_api.c b/openbsc/src/bsc_api.c index 070606da5..93b6210f0 100644 --- a/openbsc/src/bsc_api.c +++ b/openbsc/src/bsc_api.c @@ -1,6 +1,7 @@ /* GSM 08.08 like API for OpenBSC. The bridge from MSC to BSC */ /* (C) 2010 by Holger Hans Peter Freyther + * (C) 2010 by On Waves * (C) 2009 by Harald Welte <laforge@gnumonks.org> * * All Rights Reserved @@ -22,8 +23,17 @@ */ #include <openbsc/bsc_api.h> +#include <openbsc/gsm_data.h> +#include <openbsc/signal.h> #include <openbsc/abis_rsl.h> +#include <osmocore/talloc.h> + +int bsc_api_init(struct gsm_network *network, struct bsc_api *api) +{ + network->bsc_api = api; + return 0; +} int gsm0808_submit_dtap(struct gsm_subscriber_connection *conn, struct msgb *msg, int link_id) @@ -51,3 +61,30 @@ int bsc_upqueue(struct gsm_network *net) return work; } + +static int bsc_handle_lchan_signal(unsigned int subsys, unsigned int signal, + void *handler_data, void *signal_data) +{ + struct bsc_api *bsc; + struct gsm_lchan *lchan; + + if (subsys != SS_LCHAN || signal != S_LCHAN_UNEXPECTED_RELEASE) + return 0; + + lchan = (struct gsm_lchan *)signal_data; + if (!lchan) + return 0; + + + bsc = lchan->ts->trx->bts->network->bsc_api; + if (!bsc || !bsc->clear_request) + return 0; + + bsc->clear_request(&lchan->conn, 0); + return 0; +} + +static __attribute__((constructor)) void on_dso_load_bsc(void) +{ + register_signal_handler(SS_LCHAN, bsc_handle_lchan_signal, NULL); +}
\ No newline at end of file |