From d5e639588de9c88d5398cd047c5c73f6d439a5a7 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Sun, 20 Feb 2011 17:34:24 +0100 Subject: [PATCH] [gsm] Removed obsolete gsm.conf handling. Fixed minor compiling issues. --- Makefile.am | 2 +- default/gsm.conf | 31 --------- default/options.conf | 5 +- gsm.cpp | 187 ++++++++++++++++++++++++++++++++++++++++++++------- gsm.h | 15 ----- gsm_bs.cpp | 2 +- gsm_conf.c | 152 ----------------------------------------- interface.c | 6 +- socket_server.c | 1 - 9 files changed, 170 insertions(+), 231 deletions(-) delete mode 100644 default/gsm.conf delete mode 100644 gsm_conf.c diff --git a/Makefile.am b/Makefile.am index 898c5e0..f047c56 100644 --- a/Makefile.am +++ b/Makefile.am @@ -51,7 +51,7 @@ if ENABLE_GSM GSM_INCLUDE += -GSM_SOURCE += gsm_audio.c gsm.cpp gsm_conf.c +GSM_SOURCE += gsm_audio.c gsm.cpp GSM_LIB += /usr/lib/libgsm.a diff --git a/default/gsm.conf b/default/gsm.conf deleted file mode 100644 index 713a620..0000000 --- a/default/gsm.conf +++ /dev/null @@ -1,31 +0,0 @@ -# LCR GSM options -################# - -# interfaces-bsc and interface-lcr has been moved to options.conf! - -# 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:DSMS:DMNCC:DMNSMS:DPAG:DMUX:DMEAS - -# Give openbsc.cnf config file -# It will be located at /usr/local/lcr by default. -#config openbsc.cfg - -# Give database of Home Location Register (HLR) -# HLR stores all subscribers. It will be used to grant access to the network. -# It is an Sqlite3 database. Refer to OpenBSC project for handling. -# The database is located at /usr/local/lcr by default. -#hlr hlr.sqlite3 - -# To keep layer 2 connection to BS11 when quitting, use this option. -# It is only usefull for developing. TRX will stay on. -# Also changes in frequency, mcc, mnc, lac while keeping layer 2 will cause -# malefunction of BSC. -# Warning: Keeping layer 2 link may prevent emergency calls. (See below) -#keep-l2 - -# Write BTS-Link traffic to PCAP file. -#pcapfile pcap - - diff --git a/default/options.conf b/default/options.conf index cb48ea7..d1f4d6b 100644 --- a/default/options.conf +++ b/default/options.conf @@ -105,9 +105,8 @@ #socketgroup asterisk # Enable GSM network capability. -# This option turns LCR into a GSM network. Additional options are specified -# in 'gsm.conf'. You also need openbsc at compile time and of yourse - -# a base station transceiver. For more refer to LCR home page. +# This option turns LCR into a GSM network. +# For more refer to LCR home page and the OpenBSC page. # # !!! DANGER !!! # Running a GSM network may disturb other networks and may be prossecuted by diff --git a/gsm.cpp b/gsm.cpp index 757a71d..07746f7 100644 --- a/gsm.cpp +++ b/gsm.cpp @@ -24,6 +24,167 @@ struct lcr_gsm *gsm = NULL; int new_callref = 1; +/* names of MNCC-SAP */ +static const struct _value_string { + int msg_type; + const char *name; +} mncc_names[] = { +#if defined(MNCC_SETUP_REQ) + { MNCC_SETUP_REQ, "MNCC_SETUP_REQ" }, +#endif +#if defined(MNCC_SETUP_IND) + { MNCC_SETUP_IND, "MNCC_SETUP_IND" }, +#endif +#if defined(MNCC_SETUP_RSP) + { MNCC_SETUP_RSP, "MNCC_SETUP_RSP" }, +#endif +#if defined(MNCC_SETUP_CNF) + { MNCC_SETUP_CNF, "MNCC_SETUP_CNF" }, +#endif +#if defined(MNCC_SETUP_COMPL_REQ) + { MNCC_SETUP_COMPL_REQ, "MNCC_SETUP_COMPL_REQ" }, +#endif +#if defined(MNCC_SETUP_COMPL_IND) + { MNCC_SETUP_COMPL_IND, "MNCC_SETUP_COMPL_IND" }, +#endif +#if defined(MNCC_CALL_CONF_IND) + { MNCC_CALL_CONF_IND, "MNCC_CALL_CONF_IND" }, +#endif +#if defined(MNCC_CALL_PROC_REQ) + { MNCC_CALL_PROC_REQ, "MNCC_CALL_PROC_REQ" }, +#endif +#if defined(MNCC_PROGRESS_REQ) + { MNCC_PROGRESS_REQ, "MNCC_PROGRESS_REQ" }, +#endif +#if defined(MNCC_ALERT_REQ) + { MNCC_ALERT_REQ, "MNCC_ALERT_REQ" }, +#endif +#if defined(MNCC_ALERT_IND) + { MNCC_ALERT_IND, "MNCC_ALERT_IND" }, +#endif +#if defined(MNCC_NOTIFY_REQ) + { MNCC_NOTIFY_REQ, "MNCC_NOTIFY_REQ" }, +#endif +#if defined(MNCC_NOTIFY_IND) + { MNCC_NOTIFY_IND, "MNCC_NOTIFY_IND" }, +#endif +#if defined(MNCC_DISC_REQ) + { MNCC_DISC_REQ, "MNCC_DISC_REQ" }, +#endif +#if defined(MNCC_DISC_IND) + { MNCC_DISC_IND, "MNCC_DISC_IND" }, +#endif +#if defined(MNCC_REL_REQ) + { MNCC_REL_REQ, "MNCC_REL_REQ" }, +#endif +#if defined(MNCC_REL_IND) + { MNCC_REL_IND, "MNCC_REL_IND" }, +#endif +#if defined(MNCC_REL_CNF) + { MNCC_REL_CNF, "MNCC_REL_CNF" }, +#endif +#if defined(MNCC_FACILITY_REQ) + { MNCC_FACILITY_REQ, "MNCC_FACILITY_REQ" }, +#endif +#if defined(MNCC_FACILITY_IND) + { MNCC_FACILITY_IND, "MNCC_FACILITY_IND" }, +#endif +#if defined(MNCC_START_DTMF_IND) + { MNCC_START_DTMF_IND, "MNCC_START_DTMF_IND" }, +#endif +#if defined(MNCC_START_DTMF_RSP) + { MNCC_START_DTMF_RSP, "MNCC_START_DTMF_RSP" }, +#endif +#if defined(MNCC_START_DTMF_REJ) + { MNCC_START_DTMF_REJ, "MNCC_START_DTMF_REJ" }, +#endif +#if defined(MNCC_STOP_DTMF_IND) + { MNCC_STOP_DTMF_IND, "MNCC_STOP_DTMF_IND" }, +#endif +#if defined(MNCC_STOP_DTMF_RSP) + { MNCC_STOP_DTMF_RSP, "MNCC_STOP_DTMF_RSP" }, +#endif +#if defined(MNCC_MODIFY_REQ) + { MNCC_MODIFY_REQ, "MNCC_MODIFY_REQ" }, +#endif +#if defined(MNCC_MODIFY_IND) + { MNCC_MODIFY_IND, "MNCC_MODIFY_IND" }, +#endif +#if defined(MNCC_MODIFY_RSP) + { MNCC_MODIFY_RSP, "MNCC_MODIFY_RSP" }, +#endif +#if defined(MNCC_MODIFY_CNF) + { MNCC_MODIFY_CNF, "MNCC_MODIFY_CNF" }, +#endif +#if defined(MNCC_MODIFY_REJ) + { MNCC_MODIFY_REJ, "MNCC_MODIFY_REJ" }, +#endif +#if defined(MNCC_HOLD_IND) + { MNCC_HOLD_IND, "MNCC_HOLD_IND" }, +#endif +#if defined(MNCC_HOLD_CNF) + { MNCC_HOLD_CNF, "MNCC_HOLD_CNF" }, +#endif +#if defined(MNCC_HOLD_REJ) + { MNCC_HOLD_REJ, "MNCC_HOLD_REJ" }, +#endif +#if defined(MNCC_RETRIEVE_IND) + { MNCC_RETRIEVE_IND, "MNCC_RETRIEVE_IND" }, +#endif +#if defined(MNCC_RETRIEVE_CNF) + { MNCC_RETRIEVE_CNF, "MNCC_RETRIEVE_CNF" }, +#endif +#if defined(MNCC_RETRIEVE_REJ) + { MNCC_RETRIEVE_REJ, "MNCC_RETRIEVE_REJ" }, +#endif +#if defined(MNCC_USERINFO_REQ) + { MNCC_USERINFO_REQ, "MNCC_USERINFO_REQ" }, +#endif +#if defined(MNCC_USERINFO_IND) + { MNCC_USERINFO_IND, "MNCC_USERINFO_IND" }, +#endif +#if defined(MNCC_REJ_REQ) + { MNCC_REJ_REQ, "MNCC_REJ_REQ" }, +#endif +#if defined(MNCC_REJ_IND) + { MNCC_REJ_IND, "MNCC_REJ_IND" }, +#endif +#if defined(MNCC_PROGRESS_IND) + { MNCC_PROGRESS_IND, "MNCC_PROGRESS_IND" }, +#endif +#if defined(MNCC_CALL_PROC_IND) + { MNCC_CALL_PROC_IND, "MNCC_CALL_PROC_IND" }, +#endif +#if defined(MNCC_CALL_CONF_REQ) + { MNCC_CALL_CONF_REQ, "MNCC_CALL_CONF_REQ" }, +#endif +#if defined(MNCC_START_DTMF_REQ) + { MNCC_START_DTMF_REQ, "MNCC_START_DTMF_REQ" }, +#endif +#if defined(MNCC_STOP_DTMF_REQ) + { MNCC_STOP_DTMF_REQ, "MNCC_STOP_DTMF_REQ" }, +#endif +#if defined(MNCC_HOLD_REQ) + { MNCC_HOLD_REQ, "MNCC_HOLD_REQ " }, +#endif +#if defined(MNCC_RETRIEVE_REQ) + { MNCC_RETRIEVE_REQ, "MNCC_RETRIEVE_REQ" }, +#endif + { 0, NULL } +}; + +const char *mncc_name(int value) +{ + int i = 0; + + while (mncc_names[i].name) { + if (mncc_names[i].msg_type == value) + return mncc_names[i].name; + i++; + } + return "unknown"; +} + /* * create and send mncc message */ @@ -145,7 +306,7 @@ int Pgsm::bchannel_open(int index) /* bind socket to bchannel */ addr.family = AF_ISDN; - addr.dev = gsm->gsm_port; + addr.dev = mISDNloop.port; addr.channel = index+1+(index>15); ret = bind(p_m_g_gsm_b_sock, (struct sockaddr *)&addr, sizeof(addr)); if (ret < 0) { @@ -257,13 +418,13 @@ void Pgsm::frame_receive(void *arg) /* * create trace - **/ + */ void gsm_trace_header(struct mISDNport *mISDNport, class PmISDN *port, unsigned int msg_type, int direction) { char msgtext[64]; /* select message and primitive text */ - SCPY(msgtext, "gsmnet"); + SCPY(msgtext, mncc_name(msg_type)); /* add direction */ if (port) { @@ -837,31 +998,11 @@ int gsm_exit(int rc) int gsm_init(void) { - char conf_error[256] = ""; - /* seed the PRNG */ srand(time(NULL)); /* create gsm instance */ gsm = (struct lcr_gsm *)MALLOC(sizeof(struct lcr_gsm)); - gsm->gsm_sock = -1; - - /* parse options */ - if (!gsm_conf(&gsm->conf, conf_error)) { - PERROR("%s", conf_error); -#ifdef WITH_GSM_BS - gsm_bs_exit(-EINVAL); -#endif -#ifdef WITH_GSM_MS - gsm_ms_exit(-EINVAL); -#endif - return gsm_exit(-EINVAL); - } - - /* open gsm loop interface */ - if (loopback_open()) { - return gsm_exit(-1); - } return 0; } diff --git a/gsm.h b/gsm.h index 5d12646..4bfad78 100644 --- a/gsm.h +++ b/gsm.h @@ -3,18 +3,6 @@ extern int new_callref; -struct gsm_conf { - char debug[128]; /* debug info */ - char openbsc_cfg[128]; /* openbsc config file */ - char short_name[64]; /* short network name */ - char long_name[64]; /* long network name */ - char hlr[64]; /* database name */ - int allow_all; /* accept unknown subscribers */ - int keep_l2; /* keep layer 2 after exit */ - char pcapfile[128]; /* open capture file for BS11 links */ - int reject_cause; /* reject cause for unsubcribed IMSIs */ -}; - struct mncc_q_entry { struct mncc_q_entry *next; unsigned int len; @@ -23,9 +11,6 @@ struct mncc_q_entry { struct lcr_gsm { void *network; /* OpenBSC network handle */ - struct gsm_conf conf; /* gsm.conf options */ - int gsm_sock; /* loopback interface GSM side */ - int gsm_port; /* loopback interface port number */ struct lcr_fd mncc_lfd; /* Unix domain socket to OpenBSC MNCC */ struct mncc_q_entry *mncc_q_hd; diff --git a/gsm_bs.cpp b/gsm_bs.cpp index 3ac5bda..a8f7730 100644 --- a/gsm_bs.cpp +++ b/gsm_bs.cpp @@ -932,7 +932,7 @@ static int mncc_fd_write(struct lcr_fd *lfd, void *inst, int idx) return mncc_fd_close(lfd); if (rc < 0) return rc; - if (rc < qe->len) + if (rc < (int)qe->len) return -1; /* dequeue the successfully sent message */ qe2 = mncc_q_dequeue(); diff --git a/gsm_conf.c b/gsm_conf.c deleted file mode 100644 index f25cf85..0000000 --- a/gsm_conf.c +++ /dev/null @@ -1,152 +0,0 @@ -/*****************************************************************************\ -** ** -** PBX4Linux ** -** ** -**---------------------------------------------------------------------------** -** Copyright: Andreas Eversberg ** -** ** -** reading options.conf and filling structure ** -** ** -\*****************************************************************************/ - -#include "main.h" - - -/* read options - * - * read options from options.conf - */ -int gsm_conf(struct gsm_conf *gsm_conf, char *conf_error) -{ - FILE *fp=NULL; - char filename[128]; - char *p; - char option[32]; - char params[11][256]; - int pnum; - unsigned int line,i; - char buffer[256]; - - /* set defaults */ - SCPY(gsm_conf->debug, ""); - SCPY(gsm_conf->hlr, "hlr.sqlite3"); - SCPY(gsm_conf->openbsc_cfg, "openbsc.cfg"); - gsm_conf->reject_cause = 0; - gsm_conf->keep_l2 = 0; - - SPRINT(filename, "%s/gsm.conf", CONFIG_DATA); - - if (!(fp=fopen(filename,"r"))) { - UPRINT(conf_error, "Cannot open %s\n",filename); - return(0); - } - - line=0; - while((GETLINE(buffer, fp))) { - line++; - p=buffer; - - while(*p <= 32) { /* skip spaces */ - if (*p == 0) - break; - p++; - } - if (*p==0 || *p=='#') /* ignore comments and empty line */ - continue; - - option[0]=0; - i=0; /* read option */ - while(*p > 32) { - if (i+1 >= sizeof(option)) { - UPRINT(conf_error, "Error in %s (line %d): option too long.\n",filename,line); - goto error; - } - option[i+1] = '\0'; - option[i++] = *p++; - } - - while(*p <= 32) { /* skip spaces */ - if (*p == 0) - break; - p++; - } - - params[0][0] = 0; - pnum = 0; - while(*p!=0 && *p!='#' && pnum < 10) { /* param */ - i=0; /* read param */ - while(*p > 32) { - if (i+1 >= sizeof(params[pnum])) { - UPRINT(conf_error, "Error in %s (line %d): param too long.\n",filename,line); - goto error; - } - params[pnum][i+1] = '\0'; - params[pnum][i++] = *p++; - } - while(*p <= 32) { /* skip spaces */ - if (*p == 0) - break; - p++; - } - pnum++; - params[pnum][0] = 0; - } - - /* at this point we have option and param */ - - /* check option */ - if (!strcmp(option,"debug")) { - if (params[0][0]==0) { - UPRINT(conf_error, "Error in %s (line %d): parameter for option %s missing.\n",filename,line,option); - goto error; - } - SCPY(gsm_conf->debug, params[0]); - - } else - if (!strcmp(option,"config")) { - if (params[0][0]==0) { - UPRINT(conf_error, "Error in %s (line %d): parameter for option %s missing.\n",filename,line, option); - goto error; - } - SCPY(gsm_conf->openbsc_cfg, params[0]); - - } else - if (!strcmp(option,"hlr")) { - if (params[0][0]==0) { - UPRINT(conf_error, "Error in %s (line %d): parameter for option %s missing.\n",filename,line, option); - goto error; - } - SCPY(gsm_conf->hlr, params[0]); - - } else - if (!strcmp(option,"reject-cause")) { - UPRINT(conf_error, "Option '%s' in gsm.conf has moved to openbsc.cfg", option); - goto error; - } else - if (!strcmp(option,"allow-all")) { - gsm_conf->allow_all = 1; - } else - if (!strcmp(option,"keep-l2")) { - gsm_conf->keep_l2 = 1; - - } else - if (!strcmp(option,"pcapfile")) { - if (params[0][0]==0) { - UPRINT(conf_error, "Error in %s (line %d): parameter for option %s missing.\n",filename,line, option); - goto error; - } - SCPY(gsm_conf->pcapfile, params[0]); - } else { - UPRINT(conf_error, "Error in %s (line %d): wrong option keyword %s.\n", filename,line,option); - goto error; - } - } - - if (fp) fclose(fp); - return(1); -error: - if (fp) fclose(fp); - return(0); -} - - diff --git a/interface.c b/interface.c index e7ab171..4b894cf 100644 --- a/interface.c +++ b/interface.c @@ -325,11 +325,9 @@ static int inter_portname(struct interface *interface, char *filename, int line, ifport = ifport->next; } - /* check for port already assigned, but not for shared gsm interface */ + /* check for port already assigned, but not for shared loop interface */ searchif = interface_newlist; -#if defined WITH_GSM_BS || defined WITH_GSM_MS - if (options.gsm && !strcmp(value, gsm->conf.interface_lcr)) -#endif + if (!!strcmp(value, options.loopback_lcr)) { while(searchif) { ifport = searchif->ifport; diff --git a/socket_server.c b/socket_server.c index 1420268..32c6e71 100644 --- a/socket_server.c +++ b/socket_server.c @@ -699,7 +699,6 @@ int admin_message_to_lcr(struct admin_msg *msg, struct admin_list *admin) if (msg->param.bchannel.type == BCHANNEL_ASSIGN_ACK || msg->param.bchannel.type == BCHANNEL_REMOVE_ACK || msg->param.bchannel.type == BCHANNEL_RELEASE) { -#warning TODO: depending on the mode (join / remoteport) forward message /* no ref, but address */ message_bchannel_from_remote(NULL, msg->param.bchannel.type, msg->param.bchannel.handle); return(0); -- 2.13.6