From: root Date: Thu, 18 Jun 2009 08:06:31 +0000 (+0200) Subject: Added GSM IMSI dialing by using dialing "imsi-". X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=commitdiff_plain;h=4ec1520c572c4099b478897e4a6ee3a28622ca44 Added GSM IMSI dialing by using dialing "imsi-". Applied API change of OpenBSC. modified: Makefile.am modified: Makefile.in modified: README modified: bootstrap.c modified: default/gsm.conf modified: dss1.cpp modified: gsm.cpp modified: gsm_audio.c modified: gsm_conf.c modified: interface.c --- diff --git a/Makefile.am b/Makefile.am index 61d8a86..c072870 100644 --- a/Makefile.am +++ b/Makefile.am @@ -49,7 +49,7 @@ GSM_INCLUDE = -DWITH_GSM GSM_SOURCE = gsm_audio.c gsm.cpp gsm_conf.c bootstrap.c -GSM_LIB = /usr/local/lib/libgsm.a /usr/local/lib/libbsc.a /usr/local/lib/libvty.a -ldbi -lcrypt +GSM_LIB = /usr/lib/libgsm.a /usr/local/lib/libbsc.a /usr/local/lib/libvty.a -ldbi -lcrypt #gsm_audio.po: gsm_audio.c gsm_audio.h # $(CC) -D_GNU_SOURCE -fPIC -c gsm_audio.c -o gsm_audio.po @@ -124,9 +124,11 @@ install-data-hook: @if test -a $(CONFIGdir)/routing.conf ; then \ echo "NOTE: routing.conf already exists, not changed." ; else \ cp -v default/routing.conf $(CONFIGdir) ; fi +if ENABLE_GSM @if test -a $(CONFIGdir)/gsm.conf ; then \ echo "NOTE: gsm.conf already exists, not changed." ; else \ cp -v default/gsm.conf $(CONFIGdir) ; fi +endif @if test -a $(CONFIGdir)/numbering_int.conf ; then \ echo "NOTE: numbering_int.conf is obsolete, please use routing." ; fi @if test -a $(CONFIGdir)/numbering_ext.conf ; then \ diff --git a/Makefile.in b/Makefile.in index 36fafce..47398ba 100644 --- a/Makefile.in +++ b/Makefile.in @@ -95,7 +95,7 @@ am_lcr_OBJECTS = $(am__objects_1) action.$(OBJEXT) mISDN.$(OBJEXT) \ socket_server.$(OBJEXT) lcr_OBJECTS = $(am_lcr_OBJECTS) am__DEPENDENCIES_1 = -@ENABLE_GSM_TRUE@am__DEPENDENCIES_2 = /usr/local/lib/libgsm.a \ +@ENABLE_GSM_TRUE@am__DEPENDENCIES_2 = /usr/lib/libgsm.a \ @ENABLE_GSM_TRUE@ /usr/local/lib/libbsc.a \ @ENABLE_GSM_TRUE@ /usr/local/lib/libvty.a lcr_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) @@ -241,7 +241,7 @@ INSTALLATION_DEFINES = \ @ENABLE_GSM_TRUE@GSM_INCLUDE = -DWITH_GSM @ENABLE_GSM_TRUE@GSM_SOURCE = gsm_audio.c gsm.cpp gsm_conf.c bootstrap.c -@ENABLE_GSM_TRUE@GSM_LIB = /usr/local/lib/libgsm.a /usr/local/lib/libbsc.a /usr/local/lib/libvty.a -ldbi -lcrypt +@ENABLE_GSM_TRUE@GSM_LIB = /usr/lib/libgsm.a /usr/local/lib/libbsc.a /usr/local/lib/libvty.a -ldbi -lcrypt @ENABLE_ASTERISK_CHANNEL_DRIVER_TRUE@chan_lcr_so_SOURCES = @ENABLE_ASTERISK_CHANNEL_DRIVER_TRUE@chan_lcr_so_LDFLAGS = -shared @ENABLE_ASTERISK_CHANNEL_DRIVER_TRUE@chan_lcr_so_LDADD = chan_lcr.po bchannel.po options.po callerid.po @@ -786,9 +786,9 @@ install-data-hook: @if test -a $(CONFIGdir)/routing.conf ; then \ echo "NOTE: routing.conf already exists, not changed." ; else \ cp -v default/routing.conf $(CONFIGdir) ; fi - @if test -a $(CONFIGdir)/gsm.conf ; then \ - echo "NOTE: gsm.conf already exists, not changed." ; else \ - cp -v default/gsm.conf $(CONFIGdir) ; fi +@ENABLE_GSM_TRUE@ @if test -a $(CONFIGdir)/gsm.conf ; then \ +@ENABLE_GSM_TRUE@ echo "NOTE: gsm.conf already exists, not changed." ; else \ +@ENABLE_GSM_TRUE@ cp -v default/gsm.conf $(CONFIGdir) ; fi @if test -a $(CONFIGdir)/numbering_int.conf ; then \ echo "NOTE: numbering_int.conf is obsolete, please use routing." ; fi @if test -a $(CONFIGdir)/numbering_ext.conf ; then \ diff --git a/README b/README index 78e75ea..309516f 100644 --- a/README +++ b/README @@ -503,5 +503,6 @@ Changes after Version 1.5 - OpenBSC api changes. - Fixed disabling of DTMF using 'n' option of chan_lcr. - Added GSM IMSI dialing by using dialing "imsi-". +- Applied API change of OpenBSC. diff --git a/bootstrap.c b/bootstrap.c index 21baa97..57ada67 100644 --- a/bootstrap.c +++ b/bootstrap.c @@ -1051,7 +1051,7 @@ struct gsm_network *bootstrap_network(int (*mncc_recv)(struct gsm_network *, int return 0; /* open database */ - if (db_init(hlr, gsmnet)) { + if (db_init(hlr)) { fprintf(stderr, "DB: Failed to init HLR database '%s'. Please check the option settings.\n", hlr); return NULL; } diff --git a/default/gsm.conf b/default/gsm.conf index 742bf8e..a0f4b49 100644 --- a/default/gsm.conf +++ b/default/gsm.conf @@ -61,7 +61,7 @@ allow-all # The 'bs11' keyword specifies a BS11 BTS connected to an E1 card. # The frequency is given for the first TRX (tranceiver). # In case of a second tranceiver, give frequency 2. -bts bs11 9 123 +bts bs11 0 123 # Shutdown on emergency calls: # This option will prevent a shutdown if an emergency call is received. In diff --git a/dss1.cpp b/dss1.cpp index 1e1c188..1191b9e 100644 --- a/dss1.cpp +++ b/dss1.cpp @@ -1866,7 +1866,7 @@ void Pdss1::message_information(unsigned int epoint_id, int message_id, union pa enc_ie_called_pn(l3m, 0, 1, (unsigned char *)number, max); if ((p_m_d_ntmode || p_m_d_tespecial) && display[0]) { enc_ie_display(l3m, (unsigned char *)display); - display = ""; + display = (char *)""; } end_trace(); p_m_mISDNport->ml3->to_layer3(p_m_mISDNport->ml3, MT_INFORMATION, p_m_d_l3id, l3m); diff --git a/gsm.cpp b/gsm.cpp index 86e7f44..a26426c 100644 --- a/gsm.cpp +++ b/gsm.cpp @@ -396,13 +396,13 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc end_trace(); mncc = create_mncc(MNCC_REJ_REQ, callref); gsm_trace_header(p_m_mISDNport, this, MNCC_REJ_REQ, DIRECTION_OUT); - mncc->cause = 1; - mncc->cause_coding = 3; - mncc->cause_location = 1; - mncc->cause_value = 47; - add_trace("cause", "coding", "%d", mncc->cause_coding); - add_trace("cause", "location", "%d", mncc->cause_location); - add_trace("cause", "value", "%d", mncc->cause_value); + mncc->fields |= MNCC_F_CAUSE; + mncc->cause.coding = 3; + mncc->cause.location = 1; + mncc->cause.value = 47; + add_trace("cause", "coding", "%d", mncc->cause.coding); + add_trace("cause", "location", "%d", mncc->cause.location); + add_trace("cause", "value", "%d", mncc->cause.value); add_trace("reason", NULL, "callref already in use"); end_trace(); send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); @@ -417,13 +417,13 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc if (p_m_mISDNport->ifport->block) { mncc = create_mncc(MNCC_REJ_REQ, p_m_g_callref); gsm_trace_header(p_m_mISDNport, this, MNCC_REJ_REQ, DIRECTION_OUT); - mncc->cause = 1; - mncc->cause_coding = 3; - mncc->cause_location = 1; - mncc->cause_value = 27; - add_trace("cause", "coding", "%d", mncc->cause_coding); - add_trace("cause", "location", "%d", mncc->cause_location); - add_trace("cause", "value", "%d", mncc->cause_value); + mncc->fields |= MNCC_F_CAUSE; + mncc->cause.coding = 3; + mncc->cause.location = 1; + mncc->cause.value = 27; + add_trace("cause", "coding", "%d", mncc->cause.coding); + add_trace("cause", "location", "%d", mncc->cause.location); + add_trace("cause", "value", "%d", mncc->cause.value); add_trace("reason", NULL, "port is blocked"); end_trace(); send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); @@ -433,12 +433,12 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc } /* caller info */ - if (mncc->clir_inv) + if (mncc->clir.inv) p_callerinfo.present = INFO_PRESENT_RESTRICTED; else p_callerinfo.present = INFO_PRESENT_ALLOWED; - if (mncc->calling_number[0]) - SCPY(p_callerinfo.id, mncc->calling_number); + if (mncc->calling.number[0]) + SCPY(p_callerinfo.id, mncc->calling.number); else p_callerinfo.present = INFO_PRESENT_NOTAVAIL; SCPY(p_callerinfo.imsi, mncc->imsi); @@ -448,8 +448,8 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc SCPY(p_callerinfo.interface, p_m_mISDNport->ifport->interface->name); /* dialing information */ - SCAT(p_dialinginfo.id, mncc->called_number); - switch (mncc->called_type) { + SCAT(p_dialinginfo.id, mncc->called.number); + switch (mncc->called.type) { case 0x1: p_dialinginfo.ntype = INFO_NTYPE_INTERNATIONAL; break; @@ -489,13 +489,13 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc no_channel: mncc = create_mncc(MNCC_REJ_REQ, p_m_g_callref); gsm_trace_header(p_m_mISDNport, this, MNCC_REJ_REQ, DIRECTION_OUT); - mncc->cause = 1; - mncc->cause_coding = 3; - mncc->cause_location = 1; - mncc->cause_value = 34; - add_trace("cause", "coding", "%d", mncc->cause_coding); - add_trace("cause", "location", "%d", mncc->cause_location); - add_trace("cause", "value", "%d", mncc->cause_value); + mncc->fields |= MNCC_F_CAUSE; + mncc->cause.coding = 3; + mncc->cause.location = 1; + mncc->cause.value = 34; + add_trace("cause", "coding", "%d", mncc->cause.coding); + add_trace("cause", "location", "%d", mncc->cause.location); + add_trace("cause", "value", "%d", mncc->cause.value); add_trace("reason", NULL, "no channel"); end_trace(); send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); @@ -538,13 +538,13 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc gsm_trace_header(p_m_mISDNport, this, MNCC_CALL_PROC_REQ, DIRECTION_OUT); proceeding = create_mncc(MNCC_CALL_PROC_REQ, p_m_g_callref); if (p_m_mISDNport->tones) { - proceeding->progress = 1; - proceeding->progress_coding = 3; /* GSM */ - proceeding->progress_location = 1; - proceeding->progress_descr = 8; - add_trace("progress", "coding", "%d", proceeding->progress_coding); - add_trace("progress", "location", "%d", proceeding->progress_location); - add_trace("progress", "descr", "%d", proceeding->progress_descr); + proceeding->fields |= MNCC_F_PROGRESS; + proceeding->progress.coding = 3; /* GSM */ + proceeding->progress.location = 1; + proceeding->progress.descr = 8; + add_trace("progress", "coding", "%d", proceeding->progress.coding); + add_trace("progress", "location", "%d", proceeding->progress.location); + add_trace("progress", "descr", "%d", proceeding->progress.descr); } end_trace(); send_and_free_mncc((struct gsm_network *)gsm->network, proceeding->msg_type, proceeding); @@ -567,9 +567,9 @@ void Pgsm::setup_ind(unsigned int msg_type, unsigned int callref, struct gsm_mnc memcpy(&message->param.setup.dialinginfo, &p_dialinginfo, sizeof(struct dialing_info)); memcpy(&message->param.setup.callerinfo, &p_callerinfo, sizeof(struct caller_info)); memcpy(&message->param.setup.capainfo, &p_capainfo, sizeof(struct capa_info)); - SCPY((char *)message->param.setup.useruser.data, (char *)mncc->useruser_info); - message->param.setup.useruser.len = strlen(mncc->useruser_info); - message->param.setup.useruser.protocol = mncc->useruser_proto; + SCPY((char *)message->param.setup.useruser.data, (char *)mncc->useruser.info); + message->param.setup.useruser.len = strlen(mncc->useruser.info); + message->param.setup.useruser.protocol = mncc->useruser.proto; message_put(message); } @@ -621,10 +621,10 @@ void Pgsm::call_conf_ind(unsigned int msg_type, unsigned int callref, struct gsm struct gsm_mncc *mode; gsm_trace_header(p_m_mISDNport, this, msg_type, DIRECTION_IN); - if (mncc->cause) { - add_trace("cause", "coding", "%d", mncc->cause_coding); - add_trace("cause", "location", "%", mncc->cause_location); - add_trace("cause", "value", "%", mncc->cause_value); + if (mncc->fields & MNCC_F_CAUSE) { + add_trace("cause", "coding", "%d", mncc->cause.coding); + add_trace("cause", "location", "%", mncc->cause.location); + add_trace("cause", "value", "%", mncc->cause.value); } end_trace(); @@ -659,23 +659,25 @@ void Pgsm::setup_cnf(unsigned int msg_type, unsigned int callref, struct gsm_mnc struct gsm_mncc *resp, *frame; struct lcr_msg *message; - gsm_trace_header(p_m_mISDNport, this, msg_type, DIRECTION_IN); - end_trace(); - - SCPY(p_connectinfo.id, mncc->calling_number); + SCPY(p_connectinfo.id, mncc->connected.number); SCPY(p_connectinfo.imsi, mncc->imsi); p_connectinfo.present = INFO_PRESENT_ALLOWED; p_connectinfo.screen = INFO_SCREEN_NETWORK; p_connectinfo.ntype = INFO_NTYPE_UNKNOWN; p_connectinfo.isdn_port = p_m_portnum; SCPY(p_connectinfo.interface, p_m_mISDNport->ifport->interface->name); - /* send resp */ - gsm_trace_header(p_m_mISDNport, this, MNCC_SETUP_COMPL_REQ, DIRECTION_OUT); + + gsm_trace_header(p_m_mISDNport, this, msg_type, DIRECTION_IN); if (p_connectinfo.id[0]) add_trace("connect", "number", "%s", p_connectinfo.id); - else + else if (mncc->imsi[0]) SPRINT(p_connectinfo.id, "imsi-%s", p_connectinfo.imsi); - add_trace("connect", "imsi", "%s", p_connectinfo.imsi); + if (mncc->imsi[0]) + add_trace("connect", "imsi", "%s", p_connectinfo.imsi); + end_trace(); + + /* send resp */ + 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((struct gsm_network *)gsm->network, resp->msg_type, resp); @@ -722,10 +724,10 @@ void Pgsm::disc_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc struct gsm_mncc *resp; gsm_trace_header(p_m_mISDNport, this, msg_type, DIRECTION_IN); - if (mncc->cause) { - location = mncc->cause_location; - cause = mncc->cause_value; - add_trace("cause", "coding", "%d", mncc->cause_coding); + if (mncc->fields & MNCC_F_CAUSE) { + location = mncc->cause.location; + cause = mncc->cause.value; + add_trace("cause", "coding", "%d", mncc->cause.coding); add_trace("cause", "location", "%d", location); add_trace("cause", "value", "%d", cause); } @@ -735,13 +737,13 @@ void Pgsm::disc_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc resp = create_mncc(MNCC_REL_REQ, p_m_g_callref); gsm_trace_header(p_m_mISDNport, this, MNCC_REL_REQ, DIRECTION_OUT); #if 0 - resp->cause = 1; - resp->cause_coding = 3; - resp->cause_location = 1; - resp->cause_value = cause; - add_trace("cause", "coding", "%d", resp->cause_coding); - add_trace("cause", "location", "%d", resp->cause_location); - add_trace("cause", "value", "%d", resp->cause_value); + resp->fields |= MNCC_F_CAUSE; + resp->cause.coding = 3; + resp->cause.location = 1; + resp->cause.value = cause; + add_trace("cause", "coding", "%d", resp->cause.coding); + add_trace("cause", "location", "%d", resp->cause.location); + add_trace("cause", "value", "%d", resp->cause.value); #endif end_trace(); send_and_free_mncc((struct gsm_network *)gsm->network, resp->msg_type, resp); @@ -766,12 +768,12 @@ void Pgsm::rel_ind(unsigned int msg_type, unsigned int callref, struct gsm_mncc struct lcr_msg *message; gsm_trace_header(p_m_mISDNport, this, msg_type, DIRECTION_IN); - if (mncc->cause) { - location = mncc->cause_location; - cause = mncc->cause_value; - add_trace("cause", "coding", "%d", mncc->cause_coding); - add_trace("cause", "location", "%d", mncc->cause_location); - add_trace("cause", "value", "%d", mncc->cause_value); + if (mncc->fields & MNCC_F_CAUSE) { + location = mncc->cause.location; + cause = mncc->cause.value; + add_trace("cause", "coding", "%d", mncc->cause.coding); + add_trace("cause", "location", "%d", mncc->cause.location); + add_trace("cause", "value", "%d", mncc->cause.value); } end_trace(); @@ -908,14 +910,14 @@ static int message_bcs(struct gsm_network *net, int msg_type, void *arg) struct gsm_mncc *rej; rej = create_mncc(MNCC_REJ_REQ, callref); - rej->cause = 1; - rej->cause_coding = 3; - rej->cause_location = 1; - rej->cause_value = 27; + rej->fields |= MNCC_F_CAUSE; + rej->cause.coding = 3; + rej->cause.location = 1; + rej->cause.value = 27; gsm_trace_header(NULL, NULL, MNCC_REJ_REQ, DIRECTION_OUT); - add_trace("cause", "coding", "%d", rej->cause_coding); - add_trace("cause", "location", "%d", rej->cause_location); - add_trace("cause", "value", "%d", rej->cause_value); + add_trace("cause", "coding", "%d", rej->cause.coding); + add_trace("cause", "location", "%d", rej->cause.location); + add_trace("cause", "value", "%d", rej->cause.value); end_trace(); send_and_free_mncc((struct gsm_network *)gsm->network, rej->msg_type, rej); return 0; @@ -1073,111 +1075,111 @@ void Pgsm::message_setup(unsigned int epoint_id, int message_id, union parameter gsm_trace_header(p_m_mISDNport, this, MNCC_SETUP_REQ, DIRECTION_OUT); mncc = create_mncc(MNCC_SETUP_REQ, p_m_g_callref); /* caller information */ - mncc->calling = 1; - mncc->calling_plan = 1; + mncc->fields |= MNCC_F_CALLING; + mncc->calling.plan = 1; switch (p_callerinfo.ntype) { case INFO_NTYPE_UNKNOWN: - mncc->calling_type = 0x0; + mncc->calling.type = 0x0; break; case INFO_NTYPE_INTERNATIONAL: - mncc->calling_type = 0x1; + mncc->calling.type = 0x1; break; case INFO_NTYPE_NATIONAL: - mncc->calling_type = 0x2; + mncc->calling.type = 0x2; break; case INFO_NTYPE_SUBSCRIBER: - mncc->calling_type = 0x4; + mncc->calling.type = 0x4; break; default: /* INFO_NTYPE_NOTPRESENT */ - mncc->calling = 0; + mncc->fields &= ~MNCC_F_CALLING; break; } switch (p_callerinfo.screen) { case INFO_SCREEN_USER: - mncc->calling_screen = 0; + mncc->calling.screen = 0; break; default: /* INFO_SCREEN_NETWORK */ - mncc->calling_screen = 3; + mncc->calling.screen = 3; break; } switch (p_callerinfo.present) { case INFO_PRESENT_ALLOWED: - mncc->calling_present = 0; + mncc->calling.present = 0; break; case INFO_PRESENT_RESTRICTED: - mncc->calling_present = 1; + mncc->calling.present = 1; break; default: /* INFO_PRESENT_NOTAVAIL */ - mncc->calling_present = 2; + mncc->calling.present = 2; break; } - if (mncc->calling) { - SCPY(mncc->calling_number, p_callerinfo.id); - add_trace("calling", "type", "%d", mncc->calling_type); - add_trace("calling", "plan", "%d", mncc->calling_plan); - add_trace("calling", "present", "%d", mncc->calling_present); - add_trace("calling", "screen", "%d", mncc->calling_screen); - add_trace("calling", "number", "%s", mncc->calling_number); + if (mncc->fields & MNCC_F_CALLING) { + SCPY(mncc->calling.number, p_callerinfo.id); + add_trace("calling", "type", "%d", mncc->calling.type); + add_trace("calling", "plan", "%d", mncc->calling.plan); + add_trace("calling", "present", "%d", mncc->calling.present); + add_trace("calling", "screen", "%d", mncc->calling.screen); + add_trace("calling", "number", "%s", mncc->calling.number); } /* dialing information */ - mncc->called = 1; + mncc->fields |= MNCC_F_CALLED; if (!strncmp(p_dialinginfo.id, "imsi-", 5)) { SCPY(mncc->imsi, p_dialinginfo.id+5); add_trace("dialing", "imsi", "%s", mncc->imsi); } else { - SCPY(mncc->called_number, p_dialinginfo.id); - add_trace("dialing", "number", "%s", mncc->called_number); + SCPY(mncc->called.number, p_dialinginfo.id); + add_trace("dialing", "number", "%s", mncc->called.number); } /* sending user-user */ /* redirecting number */ - mncc->redirecting = 1; - mncc->redirecting_plan = 1; + mncc->fields |= MNCC_F_REDIRECTING; + mncc->redirecting.plan = 1; switch (p_redirinfo.ntype) { case INFO_NTYPE_UNKNOWN: - mncc->redirecting_type = 0x0; + mncc->redirecting.type = 0x0; break; case INFO_NTYPE_INTERNATIONAL: - mncc->redirecting_type = 0x1; + mncc->redirecting.type = 0x1; break; case INFO_NTYPE_NATIONAL: - mncc->redirecting_type = 0x2; + mncc->redirecting.type = 0x2; break; case INFO_NTYPE_SUBSCRIBER: - mncc->redirecting_type = 0x4; + mncc->redirecting.type = 0x4; break; default: /* INFO_NTYPE_NOTPRESENT */ - mncc->redirecting = 0; + mncc->fields &= ~MNCC_F_REDIRECTING; break; } switch (p_redirinfo.screen) { case INFO_SCREEN_USER: - mncc->redirecting_screen = 0; + mncc->redirecting.screen = 0; break; default: /* INFO_SCREE_NETWORK */ - mncc->redirecting_screen = 3; + mncc->redirecting.screen = 3; break; } switch (p_redirinfo.present) { case INFO_PRESENT_ALLOWED: - mncc->redirecting_present = 0; + mncc->redirecting.present = 0; break; case INFO_PRESENT_RESTRICTED: - mncc->redirecting_present = 1; + mncc->redirecting.present = 1; break; default: /* INFO_PRESENT_NOTAVAIL */ - mncc->redirecting_present = 2; + mncc->redirecting.present = 2; break; } /* sending redirecting number only in ntmode */ - if (mncc->redirecting) { - SCPY(mncc->redirecting_number, p_redirinfo.id); - add_trace("redir", "type", "%d", mncc->redirecting_type); - add_trace("redir", "plan", "%d", mncc->redirecting_plan); - add_trace("redir", "present", "%d", mncc->redirecting_present); - add_trace("redir", "screen", "%d", mncc->redirecting_screen); - add_trace("redir", "number", "%s", mncc->redirecting_number); + if (mncc->fields & MNCC_F_REDIRECTING) { + SCPY(mncc->redirecting.number, p_redirinfo.id); + add_trace("redir", "type", "%d", mncc->redirecting.type); + add_trace("redir", "plan", "%d", mncc->redirecting.plan); + add_trace("redir", "present", "%d", mncc->redirecting.present); + add_trace("redir", "screen", "%d", mncc->redirecting.screen); + add_trace("redir", "number", "%s", mncc->redirecting.number); } /* bearer capability */ //todo @@ -1229,13 +1231,13 @@ void Pgsm::message_alerting(unsigned int epoint_id, int message_id, union parame gsm_trace_header(p_m_mISDNport, this, MNCC_ALERT_REQ, DIRECTION_OUT); mncc = create_mncc(MNCC_ALERT_REQ, p_m_g_callref); if (p_m_mISDNport->tones) { - mncc->progress = 1; - mncc->progress_coding = 3; /* GSM */ - mncc->progress_location = 1; - mncc->progress_descr = 8; - add_trace("progress", "coding", "%d", mncc->progress_coding); - add_trace("progress", "location", "%d", mncc->progress_location); - add_trace("progress", "descr", "%d", mncc->progress_descr); + mncc->fields |= MNCC_F_PROGRESS; + mncc->progress.coding = 3; /* GSM */ + mncc->progress.location = 1; + mncc->progress.descr = 8; + add_trace("progress", "coding", "%d", mncc->progress.coding); + add_trace("progress", "location", "%d", mncc->progress.location); + add_trace("progress", "descr", "%d", mncc->progress.descr); } end_trace(); send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); @@ -1265,51 +1267,51 @@ void Pgsm::message_connect(unsigned int epoint_id, int message_id, union paramet mncc = create_mncc(MNCC_SETUP_RSP, p_m_g_callref); gsm_trace_header(p_m_mISDNport, this, MNCC_SETUP_RSP, DIRECTION_OUT); /* caller information */ - mncc->connected = 1; - mncc->connected_plan = 1; + mncc->fields |= MNCC_F_CONNECTED; + mncc->connected.plan = 1; switch (p_callerinfo.ntype) { case INFO_NTYPE_UNKNOWN: - mncc->connected_type = 0x0; + mncc->connected.type = 0x0; break; case INFO_NTYPE_INTERNATIONAL: - mncc->connected_type = 0x1; + mncc->connected.type = 0x1; break; case INFO_NTYPE_NATIONAL: - mncc->connected_type = 0x2; + mncc->connected.type = 0x2; break; case INFO_NTYPE_SUBSCRIBER: - mncc->connected_type = 0x4; + mncc->connected.type = 0x4; break; default: /* INFO_NTYPE_NOTPRESENT */ - mncc->connected = 0; + mncc->fields &= ~MNCC_F_CONNECTED; break; } switch (p_callerinfo.screen) { case INFO_SCREEN_USER: - mncc->connected_screen = 0; + mncc->connected.screen = 0; break; default: /* INFO_SCREEN_NETWORK */ - mncc->connected_screen = 3; + mncc->connected.screen = 3; break; } switch (p_callerinfo.present) { case INFO_PRESENT_ALLOWED: - mncc->connected_present = 0; + mncc->connected.present = 0; break; case INFO_PRESENT_RESTRICTED: - mncc->connected_present = 1; + mncc->connected.present = 1; break; default: /* INFO_PRESENT_NOTAVAIL */ - mncc->connected_present = 2; + mncc->connected.present = 2; break; } - if (mncc->connected) { - SCPY(mncc->connected_number, p_connectinfo.id); - add_trace("connected", "type", "%d", mncc->connected_type); - add_trace("connected", "plan", "%d", mncc->connected_plan); - add_trace("connected", "present", "%d", mncc->connected_present); - add_trace("connected", "screen", "%d", mncc->connected_screen); - add_trace("connected", "number", "%s", mncc->connected_number); + if (mncc->fields & MNCC_F_CONNECTED) { + SCPY(mncc->connected.number, p_connectinfo.id); + add_trace("connected", "type", "%d", mncc->connected.type); + add_trace("connected", "plan", "%d", mncc->connected.plan); + add_trace("connected", "present", "%d", mncc->connected.present); + add_trace("connected", "screen", "%d", mncc->connected.screen); + add_trace("connected", "number", "%s", mncc->connected.number); } end_trace(); send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); @@ -1326,21 +1328,21 @@ void Pgsm::message_disconnect(unsigned int epoint_id, int message_id, union para mncc = create_mncc(MNCC_DISC_REQ, p_m_g_callref); gsm_trace_header(p_m_mISDNport, this, MNCC_DISC_REQ, DIRECTION_OUT); if (p_m_mISDNport->tones) { - mncc->progress = 1; - mncc->progress_coding = 3; /* GSM */ - mncc->progress_location = 1; - mncc->progress_descr = 8; - add_trace("progress", "coding", "%d", mncc->progress_coding); - add_trace("progress", "location", "%d", mncc->progress_location); - add_trace("progress", "descr", "%d", mncc->progress_descr); - } - mncc->cause = 1; - mncc->cause_coding = 3; - mncc->cause_location = param->disconnectinfo.location; - mncc->cause_value = param->disconnectinfo.cause; - add_trace("cause", "coding", "%d", mncc->cause_coding); - add_trace("cause", "location", "%d", mncc->cause_location); - add_trace("cause", "value", "%d", mncc->cause_value); + mncc->fields |= MNCC_F_PROGRESS; + mncc->progress.coding = 3; /* GSM */ + mncc->progress.location = 1; + mncc->progress.descr = 8; + add_trace("progress", "coding", "%d", mncc->progress.coding); + add_trace("progress", "location", "%d", mncc->progress.location); + add_trace("progress", "descr", "%d", mncc->progress.descr); + } + mncc->fields |= MNCC_F_CAUSE; + mncc->cause.coding = 3; + mncc->cause.location = param->disconnectinfo.location; + mncc->cause.value = param->disconnectinfo.cause; + add_trace("cause", "coding", "%d", mncc->cause.coding); + add_trace("cause", "location", "%d", mncc->cause.location); + add_trace("cause", "value", "%d", mncc->cause.value); end_trace(); send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); @@ -1364,13 +1366,13 @@ void Pgsm::message_release(unsigned int epoint_id, int message_id, union paramet /* send release */ mncc = create_mncc(MNCC_REL_REQ, p_m_g_callref); gsm_trace_header(p_m_mISDNport, this, MNCC_REL_REQ, DIRECTION_OUT); - mncc->cause = 1; - mncc->cause_coding = 3; - mncc->cause_location = param->disconnectinfo.location; - mncc->cause_value = param->disconnectinfo.cause; - add_trace("cause", "coding", "%d", mncc->cause_coding); - add_trace("cause", "location", "%d", mncc->cause_location); - add_trace("cause", "value", "%d", mncc->cause_value); + mncc->fields |= MNCC_F_CAUSE; + mncc->cause.coding = 3; + mncc->cause.location = param->disconnectinfo.location; + mncc->cause.value = param->disconnectinfo.cause; + add_trace("cause", "coding", "%d", mncc->cause.coding); + add_trace("cause", "location", "%d", mncc->cause.location); + add_trace("cause", "value", "%d", mncc->cause.value); end_trace(); send_and_free_mncc((struct gsm_network *)gsm->network, mncc->msg_type, mncc); diff --git a/gsm_audio.c b/gsm_audio.c index 751f354..52b9c05 100644 --- a/gsm_audio.c +++ b/gsm_audio.c @@ -10,7 +10,7 @@ \*****************************************************************************/ extern "C" { -#include "/usr/local/include/gsm.h" +#include "/usr/include/gsm/gsm.h" /* create gsm instance */ diff --git a/gsm_conf.c b/gsm_conf.c index 50e8548..198ce6f 100644 --- a/gsm_conf.c +++ b/gsm_conf.c @@ -13,7 +13,7 @@ #include "openbsc/gsm_data.h" -char *gsm_conf_error = ""; +char *gsm_conf_error = (char *)""; /* read options * diff --git a/interface.c b/interface.c index 9ab3c2c..24bc731 100644 --- a/interface.c +++ b/interface.c @@ -310,11 +310,11 @@ static int inter_portname(struct interface *interface, char *filename, int line, SPRINT(interface_error, "Error in %s (line %d): port '%s' already used above.\n", filename, line, value); return(-1); } - /* check for use as GSM */ - if (ifport->gsm) { - SPRINT(interface_error, "Error in %s (line %d): Interface already used for GSM.\n", filename, line); - return(-1); - } +// /* check for use as GSM */ +// if (ifport->gsm) { +// SPRINT(interface_error, "Error in %s (line %d): Interface already used for GSM.\n", filename, line); +// return(-1); +// } ifport = ifport->next; } searchif = searchif->next; @@ -889,7 +889,7 @@ static int inter_gsm(struct interface *interface, char *filename, int line, char } /* set portname */ - if (inter_portname(interface, filename, line, "portname", gsm->conf.interface_lcr)) + if (inter_portname(interface, filename, line, (char *)"portname", gsm->conf.interface_lcr)) return(-1); /* goto end of chain again to set gsmflag*/ ifport = interface->ifport;