OpenBSC API change.
modified: README modified: bootstrap.c modified: bootstrap.h modified: default/gsm.conf modified: gsm.cpp modified: gsm_conf.c
This commit is contained in:
parent
2490abbec4
commit
610b98487d
1
README
1
README
|
@ -500,5 +500,6 @@ Changes after Version 1.5
|
||||||
-> exnsion's settings has pritority over other tones_dir setting.
|
-> exnsion's settings has pritority over other tones_dir setting.
|
||||||
- Debug option now works for GSM.
|
- Debug option now works for GSM.
|
||||||
- Fixed some GSM information elements.
|
- Fixed some GSM information elements.
|
||||||
|
- OpenBSC api changes.
|
||||||
|
|
||||||
|
|
||||||
|
|
89
bootstrap.c
89
bootstrap.c
|
@ -38,7 +38,6 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include <openbsc/openbsc.h>
|
|
||||||
#include <openbsc/gsm_data.h>
|
#include <openbsc/gsm_data.h>
|
||||||
#include <openbsc/gsm_04_08.h>
|
#include <openbsc/gsm_04_08.h>
|
||||||
#include <openbsc/db.h>
|
#include <openbsc/db.h>
|
||||||
|
@ -785,12 +784,6 @@ static int set_system_infos(struct gsm_bts_trx *trx)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Inform anyone...
|
|
||||||
*/
|
|
||||||
static void bsc_hack_channel_allocated(struct gsm_lchan *lchan) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Patch the various SYSTEM INFORMATION tables to update
|
* Patch the various SYSTEM INFORMATION tables to update
|
||||||
* the LAI
|
* the LAI
|
||||||
|
@ -871,32 +864,8 @@ 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)
|
||||||
{
|
{
|
||||||
struct gsm_bts *bts;
|
|
||||||
struct gsm_network *gsmnet;
|
|
||||||
|
|
||||||
/* open database */
|
|
||||||
if (db_init(hlr)) {
|
|
||||||
fprintf(stderr, "DB: Failed to init HLR database '%s'. Please check the option settings.\n", hlr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (db_prepare()) {
|
|
||||||
fprintf(stderr, "DB: Failed to prepare database.\n");
|
|
||||||
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->location_area_code = lac;
|
||||||
bts->trx[0].arfcn = arfcn;
|
bts->trx[0].arfcn = arfcn;
|
||||||
|
|
||||||
|
@ -910,17 +879,67 @@ void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int
|
||||||
patch_tables(bts);
|
patch_tables(bts);
|
||||||
|
|
||||||
paging_init(bts);
|
paging_init(bts);
|
||||||
bts->paging.channel_allocated = bsc_hack_channel_allocated;
|
|
||||||
|
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, gsmnet)) {
|
||||||
|
fprintf(stderr, "DB: Failed to init HLR database '%s'. Please check the option settings.\n", hlr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (db_prepare()) {
|
||||||
|
fprintf(stderr, "DB: Failed to prepare database.\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
gsmnet->name_long = name_long;
|
||||||
|
gsmnet->name_short = name_short;
|
||||||
|
bts = &gsmnet->bts[0];
|
||||||
|
bootstrap_bts(bts, lac, 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);
|
||||||
|
|
||||||
telnet_init(gsmnet, 4242);
|
telnet_init(gsmnet, 4242);
|
||||||
|
|
||||||
/* E1 mISDN input setup */
|
/* E1 mISDN input setup */
|
||||||
if (bts_type == GSM_BTS_TYPE_BS11) {
|
if (bts_type == GSM_BTS_TYPE_BS11) {
|
||||||
|
gsmnet->num_bts = 1;
|
||||||
if (e1_config(bts, cardnr, release_l2))
|
if (e1_config(bts, cardnr, release_l2))
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} 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;
|
return NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allow_all)
|
if (allow_all)
|
||||||
|
@ -929,7 +948,7 @@ void *bootstrap_network(int (*mncc_recv)(void *, int, void *),int bts_type, int
|
||||||
return gsmnet;
|
return gsmnet;
|
||||||
}
|
}
|
||||||
|
|
||||||
int shutdown_net(void *network)
|
int shutdown_net(struct gsm_network *network)
|
||||||
{
|
{
|
||||||
struct gsm_network *net = (struct gsm_network *)network;
|
struct gsm_network *net = (struct gsm_network *)network;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
|
@ -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);
|
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(void *network);
|
int shutdown_net(struct gsm_network *network);
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
# Enable debugging of OpenBSC library.
|
# Enable debugging of OpenBSC library.
|
||||||
# Refer to OpenBSC project for debugging options.
|
# Refer to OpenBSC project for debugging options.
|
||||||
# By default, debugging is turned off.
|
# 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.
|
# Two Loopback interfaces for audio transfer between OpenBSC and mISDN.
|
||||||
# The first interface must provide B-channelis for each call mobile call.
|
# 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!
|
# emergency facility. If you can't do that, don't touch it!
|
||||||
#no-emergency-shutdown
|
#no-emergency-shutdown
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
68
gsm.cpp
68
gsm.cpp
|
@ -11,9 +11,11 @@
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "openbsc/openbsc.h"
|
#include "openbsc/gsm_data.h"
|
||||||
#include "openbsc/mncc.h"
|
#include "openbsc/mncc.h"
|
||||||
#include "openbsc/trau_frame.h"
|
#include "openbsc/trau_frame.h"
|
||||||
|
#include "openbsc/select.h"
|
||||||
|
#include "openbsc/debug.h"
|
||||||
#include "bootstrap.h"
|
#include "bootstrap.h"
|
||||||
#include "gsm_audio.h"
|
#include "gsm_audio.h"
|
||||||
|
|
||||||
|
@ -40,7 +42,7 @@ static struct gsm_mncc *create_mncc(int msg_type, unsigned int callref)
|
||||||
mncc->callref = callref;
|
mncc->callref = callref;
|
||||||
return (mncc);
|
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;
|
int ret;
|
||||||
|
|
||||||
|
@ -243,7 +245,7 @@ void Pgsm::trau_send(void *_tf)
|
||||||
frame->msg_type = GSM_TRAU_FRAME;
|
frame->msg_type = GSM_TRAU_FRAME;
|
||||||
frame->callref = p_m_g_callref;
|
frame->callref = p_m_g_callref;
|
||||||
memcpy(frame->data, tf, sizeof(struct decoded_trau_frame));
|
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("cause", "value", "%d", mncc->cause_value);
|
||||||
add_trace("reason", NULL, "callref already in use");
|
add_trace("reason", NULL, "callref already in use");
|
||||||
end_trace();
|
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);
|
new_state(PORT_STATE_RELEASE);
|
||||||
p_m_delete = 1;
|
p_m_delete = 1;
|
||||||
return;
|
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("cause", "value", "%d", mncc->cause_value);
|
||||||
add_trace("reason", NULL, "port is blocked");
|
add_trace("reason", NULL, "port is blocked");
|
||||||
end_trace();
|
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);
|
new_state(PORT_STATE_RELEASE);
|
||||||
p_m_delete = 1;
|
p_m_delete = 1;
|
||||||
return;
|
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("cause", "value", "%d", mncc->cause_value);
|
||||||
add_trace("reason", NULL, "no channel");
|
add_trace("reason", NULL, "no channel");
|
||||||
end_trace();
|
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);
|
new_state(PORT_STATE_RELEASE);
|
||||||
p_m_delete = 1;
|
p_m_delete = 1;
|
||||||
return;
|
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 */
|
mode->lchan_mode = 0x01; /* GSM V1 */
|
||||||
add_trace("mode", NULL, "0x%02x", mode->lchan_mode);
|
add_trace("mode", NULL, "0x%02x", mode->lchan_mode);
|
||||||
end_trace();
|
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 */
|
/* send call proceeding */
|
||||||
gsm_trace_header(p_m_mISDNport, this, MNCC_CALL_PROC_REQ, DIRECTION_OUT);
|
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);
|
add_trace("progress", "descr", "%d", proceeding->progress_descr);
|
||||||
}
|
}
|
||||||
end_trace();
|
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);
|
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);
|
gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
|
||||||
end_trace();
|
end_trace();
|
||||||
frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
|
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;
|
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();
|
end_trace();
|
||||||
resp = create_mncc(MNCC_START_DTMF_RSP, p_m_g_callref);
|
resp = create_mncc(MNCC_START_DTMF_RSP, p_m_g_callref);
|
||||||
resp->keypad = mncc->keypad;
|
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 */
|
/* send dialing information */
|
||||||
message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_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();
|
end_trace();
|
||||||
resp = create_mncc(MNCC_STOP_DTMF_RSP, p_m_g_callref);
|
resp = create_mncc(MNCC_STOP_DTMF_RSP, p_m_g_callref);
|
||||||
resp->keypad = mncc->keypad;
|
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 */
|
/* 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 */
|
mode->lchan_mode = 0x01; /* GSM V1 */
|
||||||
add_trace("mode", NULL, "0x%02x", mode->lchan_mode);
|
add_trace("mode", NULL, "0x%02x", mode->lchan_mode);
|
||||||
end_trace();
|
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);
|
gsm_trace_header(p_m_mISDNport, this, MNCC_SETUP_COMPL_REQ, DIRECTION_OUT);
|
||||||
resp = create_mncc(MNCC_SETUP_COMPL_REQ, p_m_g_callref);
|
resp = create_mncc(MNCC_SETUP_COMPL_REQ, p_m_g_callref);
|
||||||
end_trace();
|
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 = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_CONNECT);
|
||||||
message_put(message);
|
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);
|
gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
|
||||||
end_trace();
|
end_trace();
|
||||||
frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
|
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;
|
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);
|
gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
|
||||||
end_trace();
|
end_trace();
|
||||||
frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
|
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;
|
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);
|
add_trace("cause", "value", "%d", resp->cause_value);
|
||||||
#endif
|
#endif
|
||||||
end_trace();
|
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 */
|
/* sending release to endpoint */
|
||||||
while(p_epointlist) {
|
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);
|
gsm_trace_header(p_m_mISDNport, this, MNCC_HOLD_CNF, DIRECTION_OUT);
|
||||||
end_trace();
|
end_trace();
|
||||||
resp = create_mncc(MNCC_HOLD_CNF, p_m_g_callref);
|
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 */
|
/* disable audio */
|
||||||
if (p_m_g_tch_connected) { /* it should be true */
|
if (p_m_g_tch_connected) { /* it should be true */
|
||||||
gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_DROP, DIRECTION_OUT);
|
gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_DROP, DIRECTION_OUT);
|
||||||
end_trace();
|
end_trace();
|
||||||
frame = create_mncc(MNCC_FRAME_DROP, p_m_g_callref);
|
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;
|
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);
|
gsm_trace_header(p_m_mISDNport, this, MNCC_RETRIEVE_CNF, DIRECTION_OUT);
|
||||||
end_trace();
|
end_trace();
|
||||||
resp = create_mncc(MNCC_RETRIEVE_CNF, p_m_g_callref);
|
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 */
|
/* enable audio */
|
||||||
if (!p_m_g_tch_connected) { /* it should be true */
|
if (!p_m_g_tch_connected) { /* it should be true */
|
||||||
gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
|
gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
|
||||||
end_trace();
|
end_trace();
|
||||||
frame = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
|
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;
|
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
|
* 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;
|
struct gsm_mncc *mncc = (struct gsm_mncc *)arg;
|
||||||
unsigned int callref = mncc->callref;
|
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", "location", "%d", rej->cause_location);
|
||||||
add_trace("cause", "value", "%d", rej->cause_value);
|
add_trace("cause", "value", "%d", rej->cause_value);
|
||||||
end_trace();
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
/* creating port object, transparent until setup with hdlc */
|
/* 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
|
//todo
|
||||||
|
|
||||||
end_trace();
|
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);
|
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();
|
end_trace();
|
||||||
mncc = create_mncc(MNCC_NOTIFY_REQ, p_m_g_callref);
|
mncc = create_mncc(MNCC_NOTIFY_REQ, p_m_g_callref);
|
||||||
mncc->notify = notify;
|
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);
|
add_trace("progress", "descr", "%d", mncc->progress_descr);
|
||||||
}
|
}
|
||||||
end_trace();
|
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);
|
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);
|
gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
|
||||||
end_trace();
|
end_trace();
|
||||||
mncc = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
|
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;
|
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);
|
add_trace("connected", "number", "%s", mncc->connected_number);
|
||||||
}
|
}
|
||||||
end_trace();
|
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);
|
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", "location", "%d", mncc->cause_location);
|
||||||
add_trace("cause", "value", "%d", mncc->cause_value);
|
add_trace("cause", "value", "%d", mncc->cause_value);
|
||||||
end_trace();
|
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);
|
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);
|
gsm_trace_header(p_m_mISDNport, this, MNCC_FRAME_RECV, DIRECTION_OUT);
|
||||||
end_trace();
|
end_trace();
|
||||||
mncc = create_mncc(MNCC_FRAME_RECV, p_m_g_callref);
|
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;
|
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", "location", "%d", mncc->cause_location);
|
||||||
add_trace("cause", "value", "%d", mncc->cause_value);
|
add_trace("cause", "value", "%d", mncc->cause_value);
|
||||||
end_trace();
|
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);
|
new_state(PORT_STATE_RELEASE);
|
||||||
p_m_delete = 1;
|
p_m_delete = 1;
|
||||||
|
@ -1488,7 +1490,7 @@ int handle_gsm(void)
|
||||||
{
|
{
|
||||||
int ret1, ret2;
|
int ret1, ret2;
|
||||||
|
|
||||||
ret1 = bsc_upqueue(gsm->network);
|
ret1 = bsc_upqueue((struct gsm_network *)gsm->network);
|
||||||
ret2 = bsc_select_main(1); /* polling */
|
ret2 = bsc_select_main(1); /* polling */
|
||||||
if (ret1 || ret2)
|
if (ret1 || ret2)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1579,10 +1581,10 @@ int gsm_exit(int rc)
|
||||||
gsm_sock_close();
|
gsm_sock_close();
|
||||||
/* shutdown network */
|
/* shutdown network */
|
||||||
if (gsm->network)
|
if (gsm->network)
|
||||||
shutdown_net(gsm->network);
|
shutdown_net((struct gsm_network *)gsm->network);
|
||||||
/* free network */
|
/* free network */
|
||||||
if (gsm->network) {
|
if (gsm->network) {
|
||||||
free(gsm->network); /* TBD */
|
free((struct gsm_network *)gsm->network); /* TBD */
|
||||||
}
|
}
|
||||||
free(gsm);
|
free(gsm);
|
||||||
gsm = NULL;
|
gsm = NULL;
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
\*****************************************************************************/
|
\*****************************************************************************/
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "openbsc/openbsc.h"
|
#include "openbsc/gsm_data.h"
|
||||||
|
|
||||||
|
|
||||||
char *gsm_conf_error = "";
|
char *gsm_conf_error = "";
|
||||||
|
|
Loading…
Reference in New Issue