X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=gsm.cpp;h=14f534ccd93da976375b3df6e689220d4bee6584;hp=05ccca7d3532fd5cccfb1e8a5fb082ba8384c98b;hb=b6eb8547861d8bafe3f59d0c4a732e0f4ce862fc;hpb=d40eedaf166b92a428c01088ce05079f93d590bf diff --git a/gsm.cpp b/gsm.cpp index 05ccca7..14f534c 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 */ @@ -38,14 +199,16 @@ struct gsm_mncc *create_mncc(int msg_type, unsigned int callref) } int send_and_free_mncc(void *instance, unsigned int msg_type, void *data) { - int ret; + int ret = 0; + if (instance) { #ifdef WITH_GSM_BS - ret = mncc_send((struct gsm_network *)instance, msg_type, data); + ret = mncc_send((struct gsm_network *)instance, msg_type, data); #endif #ifdef WITH_GSM_MS - ret = mncc_send((struct osmocom_ms *)instance, msg_type, data); + ret = mncc_send((struct osmocom_ms *)instance, msg_type, data); #endif + } free(data); return ret; @@ -145,7 +308,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,28 +420,24 @@ 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, get_mncc_name(msg_type)); + SCPY(msgtext, mncc_name(msg_type)); /* add direction */ if (port) { switch(port->p_type) { case PORT_TYPE_GSM_BS_OUT: - SCAT(msgtext, " LCR->BSC"); - break; case PORT_TYPE_GSM_BS_IN: - SCAT(msgtext, " LCR<-BSC"); + SCAT(msgtext, " LCR<->BSC"); break; case PORT_TYPE_GSM_MS_OUT: - SCAT(msgtext, " LCR->MS"); - break; case PORT_TYPE_GSM_MS_IN: - SCAT(msgtext, " LCR<-MS"); + SCAT(msgtext, " LCR<->MS"); break; } } else @@ -837,31 +996,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; }