bsc_api: Add init, dispatch the clear request when a channel is going missing

This commit is contained in:
Holger Hans Peter Freyther 2010-06-14 18:20:15 +08:00
parent 2a9285c028
commit abcddf1152
3 changed files with 40 additions and 0 deletions

View File

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

View File

@ -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;

View File

@ -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);
}