From 610b98487df43799a30b76c1da267458f318efa1 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Thu, 21 May 2009 13:24:38 +0200 Subject: [PATCH] OpenBSC API change. modified: README modified: bootstrap.c modified: bootstrap.h modified: default/gsm.conf modified: gsm.cpp modified: gsm_conf.c --- README | 1 + bootstrap.c | 63 +++++++++++++++++++++++++++++++++------------------ bootstrap.h | 4 ++-- default/gsm.conf | 5 ++++- gsm.cpp | 68 +++++++++++++++++++++++++++++--------------------------- gsm_conf.c | 2 +- 6 files changed, 84 insertions(+), 59 deletions(-) diff --git a/README b/README index 88950e4..0857d0b 100644 --- a/README +++ b/README @@ -500,5 +500,6 @@ Changes after Version 1.5 -> exnsion's settings has pritority over other tones_dir setting. - Debug option now works for GSM. - Fixed some GSM information elements. +- OpenBSC api changes. diff --git a/bootstrap.c b/bootstrap.c index 0c309a3..12a63fc 100644 --- a/bootstrap.c +++ b/bootstrap.c @@ -38,7 +38,6 @@ #ifdef __cplusplus extern "C" { #endif -#include #include #include #include @@ -786,12 +785,6 @@ static int set_system_infos(struct gsm_bts_trx *trx) } /* - * Inform anyone... - */ -static void bsc_hack_channel_allocated(struct gsm_lchan *lchan) { -} - -/* * Patch the various SYSTEM INFORMATION tables to update * the LAI */ @@ -871,13 +864,41 @@ void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx) } } -void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int mcc, int mnc, int lac, int arfcn, int cardnr, int release_l2, char *name_short, char *name_long, char *hlr, int allow_all) +static int bootstrap_bts(struct gsm_bts *bts, int lac, int arfcn) +{ + bts->location_area_code = lac; + bts->trx[0].arfcn = arfcn; + + /* Control Channel Description */ + memset(&bts->chan_desc, 0, sizeof(struct gsm48_control_channel_descr)); + bts->chan_desc.att = 1; + bts->chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C; + bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5; + bts->chan_desc.t3212 = 0; + + patch_tables(bts); + + paging_init(bts); + + return 0; +} + + +struct gsm_network *bootstrap_network(int (*mncc_recv)(struct gsm_network *, int, void *), int bts_type, int mcc, int mnc, int lac, int arfcn, int cardnr, int release_l2, char *name_short, char *name_long, char *hlr, int allow_all) { struct gsm_bts *bts; struct gsm_network *gsmnet; + /* seed the PRNG for TMSI */ + srand(time(NULL)); + + /* initialize our data structures */ + gsmnet = gsm_network_init(2, (gsm_bts_type)bts_type, mcc, mnc, mncc_recv); + if (!gsmnet) + return 0; + /* open database */ - if (db_init(hlr)) { + if (db_init(hlr, gsmnet)) { fprintf(stderr, "DB: Failed to init HLR database '%s'. Please check the option settings.\n", hlr); return NULL; } @@ -886,19 +907,10 @@ void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int return NULL; } - /* seed the PRNG for TMSI */ - srand(time(NULL)); - - /* initialize our data structures */ - gsmnet = gsm_network_init(1, (gsm_bts_type)bts_type, mcc, mnc, mncc_recv); - if (!gsmnet) - return 0; - gsmnet->name_long = name_long; gsmnet->name_short = name_short; bts = &gsmnet->bts[0]; - bts->location_area_code = lac; - bts->trx[0].arfcn = arfcn; + bootstrap_bts(bts, lac, arfcn); /* Control Channel Description */ memset(&bts->chan_desc, 0, sizeof(struct gsm48_control_channel_descr)); @@ -910,17 +922,24 @@ void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int patch_tables(bts); paging_init(bts); - bts->paging.channel_allocated = bsc_hack_channel_allocated; telnet_init(gsmnet, 4242); /* E1 mISDN input setup */ if (bts_type == GSM_BTS_TYPE_BS11) { + gsmnet->num_bts = 1; if (e1_config(bts, cardnr, release_l2)) return NULL; } else { - if (ia_config(bts)) + bts->ip_access.site_id = 1801; + bts->ip_access.bts_id = 0; + bts = &gsmnet->bts[1]; + bootstrap_bts(bts, lac, arfcn); + bts->ip_access.site_id = 1800; + bts->ip_access.bts_id = 0; + if (ipaccess_setup(gsmnet)) return NULL; + } if (allow_all) @@ -929,7 +948,7 @@ void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int return gsmnet; } -int shutdown_net(void *network) +int shutdown_net(struct gsm_network *network) { struct gsm_network *net = (struct gsm_network *)network; unsigned int i; diff --git a/bootstrap.h b/bootstrap.h index 515774b..cc3277a 100644 --- a/bootstrap.h +++ b/bootstrap.h @@ -1,4 +1,4 @@ -void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int mcc, int mnc, int lac, int arfcn, int cardnr, int release_l2, char *name_short, char *name_long, char *hlr, int allow_all); -int shutdown_net(void *network); +struct gsm_network *bootstrap_network(int (*mncc_recv)(struct gsm_network *, int, void *), int bts_type, int mcc, int mnc, int lac, int arfcn, int cardnr, int release_l2, char *name_short, char *name_long, char *hlr, int allow_all); +int shutdown_net(struct gsm_network *network); diff --git a/default/gsm.conf b/default/gsm.conf index b7d7bac..6ee6db5 100644 --- a/default/gsm.conf +++ b/default/gsm.conf @@ -4,7 +4,7 @@ # Enable debugging of OpenBSC library. # Refer to OpenBSC project for debugging options. # By default, debugging is turned off. -#debug DRLL:DCC:DMM:DRR:DRSL:DNM +#debug DRLL:DCC:DNM:DRR:DRSL:DNM:DSMS:DMNCC:DPAG:DMUX # Two Loopback interfaces for audio transfer between OpenBSC and mISDN. # The first interface must provide B-channelis for each call mobile call. @@ -72,3 +72,6 @@ bts bs11 9 123 # emergency facility. If you can't do that, don't touch it! #no-emergency-shutdown + + + diff --git a/gsm.cpp b/gsm.cpp index 3150694..663fab5 100644 --- a/gsm.cpp +++ b/gsm.cpp @@ -11,9 +11,11 @@ #include "main.h" extern "C" { -#include "openbsc/openbsc.h" +#include "openbsc/gsm_data.h" #include "openbsc/mncc.h" #include "openbsc/trau_frame.h" +#include "openbsc/select.h" +#include "openbsc/debug.h" #include "bootstrap.h" #include "gsm_audio.h" @@ -40,7 +42,7 @@ static struct gsm_mncc *create_mncc(int msg_type, unsigned int callref) mncc->callref = callref; return (mncc); } -static int send_and_free_mncc(void *net, unsigned int msg_type, void *data) +static int send_and_free_mncc(struct gsm_network *net, unsigned int msg_type, void *data) { int ret; @@ -243,7 +245,7 @@ void Pgsm::trau_send(void *_tf) frame->msg_type = GSM_TRAU_FRAME; frame->callref = p_m_g_callref; memcpy(frame->data, tf, sizeof(struct decoded_trau_frame)); - mncc_send(gsm->network, frame->msg_type, frame); + mncc_send((struct gsm_network *)gsm->network, frame->msg_type, frame); } @@ -402,7 +404,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc add_trace("cause", "value", "%d", mncc->cause_value); add_trace("reason", NULL, "callref already in use"); end_trace(); - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); new_state(PORT_STATE_RELEASE); p_m_delete = 1; return; @@ -423,7 +425,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc add_trace("cause", "value", "%d", mncc->cause_value); add_trace("reason", NULL, "port is blocked"); end_trace(); - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); new_state(PORT_STATE_RELEASE); p_m_delete = 1; return; @@ -494,7 +496,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc add_trace("cause", "value", "%d", mncc->cause_value); add_trace("reason", NULL, "no channel"); end_trace(); - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); new_state(PORT_STATE_RELEASE); p_m_delete = 1; return; @@ -524,7 +526,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc mode->lchan_mode = 0x01; /* GSM V1 */ add_trace("mode", NULL, "0x%02x", mode->lchan_mode); end_trace(); - send_and_free_mncc(gsm->network, mode->msg_type, mode); + send_and_free_mncc((struct gsm_network *)gsm->network, mode->msg_type, mode); /* send call proceeding */ gsm_trace_header(p_m_mISDNport, this, MNCC_CALL_PROC_REQ, DIRECTION_OUT); @@ -539,7 +541,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc add_trace("progress", "descr", "%d", proceeding->progress_descr); } end_trace(); - send_and_free_mncc(gsm->network, proceeding->msg_type, proceeding); + send_and_free_mncc((struct gsm_network *)gsm->network, proceeding->msg_type, proceeding); new_state(PORT_STATE_IN_PROCEEDING); @@ -547,7 +549,7 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT); end_trace(); frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref); - send_and_free_mncc(gsm->network, frame->msg_type, frame); + send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame); p_m_g_tch_connected = 1; } @@ -583,7 +585,7 @@ void Pgsm::start_dtmf_ind(unsigned int msg_type, unsigned int callref, struct gs end_trace(); resp = create_mncc(MNCC_START_DTMF_RSP, p_m_g_callref); resp->keypad = mncc->keypad; - send_and_free_mncc(gsm->network, resp->msg_type, resp); + send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp); /* send dialing information */ message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_INFORMATION); @@ -604,7 +606,7 @@ void Pgsm::stop_dtmf_ind(unsigned int msg_type, unsigned int callref, struct gsm end_trace(); resp = create_mncc(MNCC_STOP_DTMF_RSP, p_m_g_callref); resp->keypad = mncc->keypad; - send_and_free_mncc(gsm->network, resp->msg_type, resp); + send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp); } /* PROCEEDING INDICATION */ @@ -626,7 +628,7 @@ void Pgsm::call_conf_ind(unsigned int msg_type, unsigned int callref, struct gsm mode->lchan_mode = 0x01; /* GSM V1 */ add_trace("mode", NULL, "0x%02x", mode->lchan_mode); end_trace(); - send_and_free_mncc(gsm->network, mode->msg_type, mode); + send_and_free_mncc((struct gsm_network *)gsm->network, mode->msg_type, mode); } @@ -658,7 +660,7 @@ void Pgsm::setup_cnf(unsigned int msg_type, unsigned int callref, struct gsm_mnc gsm_trace_header(p_m_mISDNport, this, MNCC_SETUP_COMPL_REQ, DIRECTION_OUT); resp = create_mncc(MNCC_SETUP_COMPL_REQ, p_m_g_callref); end_trace(); - send_and_free_mncc(gsm->network, resp->msg_type, resp); + send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp); message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_CONNECT); message_put(message); @@ -669,7 +671,7 @@ void Pgsm::setup_cnf(unsigned int msg_type, unsigned int callref, struct gsm_mnc gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT); end_trace(); frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref); - send_and_free_mncc(gsm->network, frame->msg_type, frame); + send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame); p_m_g_tch_connected = 1; } } @@ -688,7 +690,7 @@ void Pgsm::setup_compl_ind(unsigned int msg_type, unsigned int callref, struct g gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT); end_trace(); frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref); - send_and_free_mncc(gsm->network, frame->msg_type, frame); + send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame); p_m_g_tch_connected = 1; } } @@ -723,7 +725,7 @@ void Pgsm::disc_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc add_trace("cause", "value", "%d", resp->cause_value); #endif end_trace(); - send_and_free_mncc(gsm->network, resp->msg_type, resp); + send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp); /* sending release to endpoint */ while(p_epointlist) { @@ -794,14 +796,14 @@ void Pgsm::hold_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc gsm_trace_header(p_m_mISDNport, this, MNCC_HOLD_CNF, DIRECTION_OUT); end_trace(); resp = create_mncc(MNCC_HOLD_CNF, p_m_g_callref); - send_and_free_mncc(gsm->network, resp->msg_type, resp); + send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp); /* disable audio */ if (p_m_g_tch_connected) { /* it should be true */ gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_DROP, DIRECTION_OUT); end_trace(); frame = create_mncc(MNCC_FRAME_DROP, p_m_g_callref); - send_and_free_mncc(gsm->network, frame->msg_type, frame); + send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame); p_m_g_tch_connected = 0; } } @@ -826,14 +828,14 @@ void Pgsm::retr_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc gsm_trace_header(p_m_mISDNport, this, MNCC_RETRIEVE_CNF, DIRECTION_OUT); end_trace(); resp = create_mncc(MNCC_RETRIEVE_CNF, p_m_g_callref); - send_and_free_mncc(gsm->network, resp->msg_type, resp); + send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp); /* enable audio */ if (!p_m_g_tch_connected) { /* it should be true */ gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT); end_trace(); frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref); - send_and_free_mncc(gsm->network, frame->msg_type, frame); + send_and_free_mncc((struct gsm_network *)gsm->network, frame->msg_type, frame); p_m_g_tch_connected = 1; } } @@ -841,7 +843,7 @@ void Pgsm::retr_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc /* * BSC sends message to port */ -static int message_bcs(void *net, int msg_type, void *arg) +static int message_bcs(struct gsm_network *net, int msg_type, void *arg) { struct gsm_mncc *mncc = (struct gsm_mncc *)arg; unsigned int callref = mncc->callref; @@ -896,7 +898,7 @@ static int message_bcs(void *net, int msg_type, void *arg) add_trace("cause", "location", "%d", rej->cause_location); add_trace("cause", "value", "%d", rej->cause_value); end_trace(); - send_and_free_mncc(gsm->network, rej->msg_type, rej); + send_and_free_mncc((struct gsm_network *)gsm->network, rej->msg_type, rej); return 0; } /* creating port object, transparent until setup with hdlc */ @@ -1157,7 +1159,7 @@ void Pgsm::message_setup(unsigned int epoint_id, int message_id, union parameter //todo end_trace(); - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); new_state(PORT_STATE_OUT_SETUP); @@ -1189,7 +1191,7 @@ void Pgsm::message_notify(unsigned int epoint_id, int message_id, union paramete end_trace(); mncc = create_mncc(MNCC_NOTIFY_REQ, p_m_g_callref); mncc->notify = notify; - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); } } } @@ -1212,7 +1214,7 @@ void Pgsm::message_alerting(unsigned int epoint_id, int message_id, union parame add_trace("progress", "descr", "%d", mncc->progress_descr); } end_trace(); - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); new_state(PORT_STATE_IN_ALERTING); @@ -1220,7 +1222,7 @@ void Pgsm::message_alerting(unsigned int epoint_id, int message_id, union parame gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT); end_trace(); mncc = create_mncc(MNCC_FRAME_RECV, p_m_g_callref); - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); p_m_g_tch_connected = 1; } } @@ -1286,7 +1288,7 @@ void Pgsm::message_connect(unsigned int epoint_id, int message_id, union paramet add_trace("connected", "number", "%s", mncc->connected_number); } end_trace(); - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); new_state(PORT_STATE_CONNECT_WAITING); } @@ -1316,7 +1318,7 @@ void Pgsm::message_disconnect(unsigned int epoint_id, int message_id, union para add_trace("cause", "location", "%d", mncc->cause_location); add_trace("cause", "value", "%d", mncc->cause_value); end_trace(); - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); new_state(PORT_STATE_OUT_DISCONNECT); @@ -1324,7 +1326,7 @@ void Pgsm::message_disconnect(unsigned int epoint_id, int message_id, union para gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT); end_trace(); mncc = create_mncc(MNCC_FRAME_RECV, p_m_g_callref); - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); p_m_g_tch_connected = 1; } } @@ -1346,7 +1348,7 @@ void Pgsm::message_release(unsigned int epoint_id, int message_id, union paramet add_trace("cause", "location", "%d", mncc->cause_location); add_trace("cause", "value", "%d", mncc->cause_value); end_trace(); - send_and_free_mncc(gsm->network, mncc->msg_type, mncc); + send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); new_state(PORT_STATE_RELEASE); p_m_delete = 1; @@ -1488,7 +1490,7 @@ int handle_gsm(void) { int ret1, ret2; - ret1 = bsc_upqueue(gsm->network); + ret1 = bsc_upqueue((struct gsm_network *)gsm->network); ret2 = bsc_select_main(1); /* polling */ if (ret1 || ret2) return 1; @@ -1579,10 +1581,10 @@ int gsm_exit(int rc) gsm_sock_close(); /* shutdown network */ if (gsm->network) - shutdown_net(gsm->network); + shutdown_net((struct gsm_network *)gsm->network); /* free network */ if (gsm->network) { - free(gsm->network); /* TBD */ + free((struct gsm_network *)gsm->network); /* TBD */ } free(gsm); gsm = NULL; diff --git a/gsm_conf.c b/gsm_conf.c index 8898cf2..aadb7d1 100644 --- a/gsm_conf.c +++ b/gsm_conf.c @@ -10,7 +10,7 @@ \*****************************************************************************/ #include "main.h" -#include "openbsc/openbsc.h" +#include "openbsc/gsm_data.h" char *gsm_conf_error = ""; -- 2.13.6