X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=mISDN.cpp;h=6392a4c4b9c9aa87863b3087583921643103fa01;hp=50746ecfb99331124fc4061a7487bd5494dbf6a5;hb=5463e1b62a39ce417b610584e3d34a8bc30ac15e;hpb=34598a346419f0e661526e6208dade4aff570008 diff --git a/mISDN.cpp b/mISDN.cpp index 50746ec..6392a4c 100644 --- a/mISDN.cpp +++ b/mISDN.cpp @@ -11,9 +11,6 @@ #include "main.h" #include "myisdn.h" - -#include -int __af_isdn = MISDN_AF_ISDN; #include #undef offsetof @@ -40,7 +37,9 @@ struct mISDNport *mISDNport_first; unsigned char mISDN_rand[256]; int mISDN_rand_count = 0; +#ifdef OLD_MT_ASSIGN unsigned int mt_assign_pid = ~0; +#endif int mISDNsocket = -1; static int upqueue_pipe[2]; @@ -50,9 +49,21 @@ int upqueue_avail = 0; static int mISDN_upqueue(struct lcr_fd *fd, unsigned int what, void *instance, int i); static int mISDN_timeout(struct lcr_timer *timer, void *instance, int i); +static int my_mISDNlib_debug(const char *file, int line, const char *func, int level, const char *fmt, va_list va) +{ + int ret = 0; + + if (debug_fp > 0) + ret = vfprintf(debug_fp, fmt, va); + return ret; +} + +static struct mi_ext_fn_s myfn; + int mISDN_initialize(void) { char filename[256]; + int ver; /* try to open raw socket to check kernel */ mISDNsocket = socket(PF_ISDN, SOCK_RAW, ISDN_P_BASE); @@ -62,7 +73,10 @@ int mISDN_initialize(void) } /* init mlayer3 */ - init_layer3(4); // buffer of 4 + // set debug printout function + myfn.prt_debug = my_mISDNlib_debug; + + ver = init_layer3(4, &myfn); // buffer of 4 /* open debug, if enabled and not only stack debugging */ if (options.deb) { @@ -70,11 +84,10 @@ int mISDN_initialize(void) debug_fp = fopen(filename, "a"); } - if (options.deb & DEBUG_STACK) { - SPRINT(filename, "%s/debug_mISDN.log", LOG_DIR); - mISDN_debug_init(0xfffffeff, filename, filename, filename); - } else - mISDN_debug_init(0, NULL, NULL, NULL); + if (options.deb & DEBUG_STACK) + mISDN_set_debug_level(0xfffffeff); + else + mISDN_set_debug_level(0); if (pipe(upqueue_pipe) < 0) FATAL("Failed to open pipe\n"); @@ -89,8 +102,6 @@ void mISDN_deinitialize(void) { cleanup_layer3(); - mISDN_debug_close(); - if (debug_fp) fclose(debug_fp); debug_fp = NULL; @@ -130,7 +141,6 @@ PmISDN::PmISDN(int type, mISDNport *mISDNport, char *portname, struct port_setti p_m_echo = 0; p_m_tone = 0; p_m_rxoff = 0; - p_m_joindata = 0; p_m_inband_send_on = 0; p_m_inband_receive_on = 0; p_m_dtmf = !mISDNport->ifport->nodtmf; @@ -1113,7 +1123,7 @@ void message_bchannel_from_remote(class JoinRemote *joinremote, int type, unsign chan_trace_header(mISDNport, isdnport, "MESSAGE_BCHANNEL (from remote application)", DIRECTION_NONE); add_trace("type", NULL, "export request"); end_trace(); - isdnport->p_m_remote_ref = joinremote->j_serial; + isdnport->p_m_remote_ref = joinremote->j_remote_ref; isdnport->p_m_remote_id = joinremote->j_remote_id; if (mISDNport && i>=0) { bchannel_event(mISDNport, i, B_EVENT_EXPORTREQUEST); @@ -1327,7 +1337,7 @@ void PmISDN::load_tx(void) } if (p_tone_name[0] || p_m_crypt_msg_loops || p_m_inband_send_on || p_m_load) { - schedule_timer(&p_m_loadtimer, 0, ISDN_TRANSMIT*125); + schedule_timer(&p_m_loadtimer, 0, PORT_TRANSMIT * 125); } } @@ -1353,8 +1363,6 @@ static int mISDN_timeout(struct lcr_timer *timer, void *instance, int i) void PmISDN::bchannel_receive(struct mISDNhead *hh, unsigned char *data, int len) { unsigned int cont = *((unsigned int *)data); - unsigned char *data_temp; - unsigned int length_temp; struct lcr_msg *message; unsigned char *p; int l; @@ -1477,23 +1485,8 @@ void PmISDN::bchannel_receive(struct mISDNhead *hh, unsigned char *data, int len cryptman_listen_bch(data, len); } - p = data; - - /* send data to epoint */ - if (p_m_joindata && ACTIVE_EPOINT(p_epointlist)) { /* only if we have an epoint object */ - length_temp = len; - data_temp = p; - while(length_temp) { - message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_DATA); - message->param.data.len = (length_temp>sizeof(message->param.data.data))?sizeof(message->param.data.data):length_temp; - memcpy(message->param.data.data, data_temp, message->param.data.len); - message_put(message); - if (length_temp <= sizeof(message->param.data.data)) - break; - data_temp += sizeof(message->param.data.data); - length_temp -= sizeof(message->param.data.data); - } - } + /* send to remote, if bridged */ + bridge_tx(data, len); } @@ -1661,15 +1654,6 @@ void PmISDN::message_mISDNsignal(unsigned int epoint_id, int message_id, union p set_conf(oldconf, newconf); break; - case mISDNSIGNAL_JOINDATA: - if (p_m_joindata != param->mISDNsignal.joindata) { - p_m_joindata = param->mISDNsignal.joindata; - PDEBUG(DEBUG_BCHANNEL, "we change to joindata=%d.\n", p_m_joindata); - update_rxoff(); - } else - PDEBUG(DEBUG_BCHANNEL, "we already have joindata=%d.\n", p_m_joindata); - break; - case mISDNSIGNAL_DELAY: if (p_m_delay != param->mISDNsignal.delay) { p_m_delay = param->mISDNsignal.delay; @@ -1756,32 +1740,31 @@ void PmISDN::message_crypt(unsigned int epoint_id, int message_id, union paramet */ int PmISDN::message_epoint(unsigned int epoint_id, int message_id, union parameter *param) { - if (Port::message_epoint(epoint_id, message_id, param)) - return(1); + if (Port::message_epoint(epoint_id, message_id, param)) { + if (message_id == MESSAGE_BRIDGE) + update_rxoff(); + return 1; + } switch(message_id) { - case MESSAGE_DATA: /* tx-data from upper layer */ - txfromup(param->data.data, param->data.len); - return(1); - case MESSAGE_mISDNSIGNAL: /* user command */ PDEBUG(DEBUG_ISDN, "PmISDN(%s) received special ISDN SIGNAL %d.\n", p_name, param->mISDNsignal.message); message_mISDNsignal(epoint_id, message_id, param); - return(1); + return 1; case MESSAGE_CRYPT: /* crypt control command */ PDEBUG(DEBUG_ISDN, "PmISDN(%s) received encryption command '%d'.\n", p_name, param->crypt.type); message_crypt(epoint_id, message_id, param); - return(1); + return 1; } - return(0); + return 0; } void PmISDN::update_rxoff(void) { /* call bridges in user space OR crypto OR recording */ - if (p_m_joindata || p_m_crypt_msg_loops || p_m_crypt_listen || p_record || p_m_inband_receive_on) { + if (p_bridge || p_m_crypt_msg_loops || p_m_crypt_listen || p_record || p_m_inband_receive_on) { /* rx IS required */ if (p_m_rxoff) { /* turn on RX */ @@ -1949,7 +1932,7 @@ static int l2establish_timeout(struct lcr_timer *timer, void *instance, int i) struct mISDNport *mISDNport = (struct mISDNport *)instance; if (!mISDNport->isloopback && mISDNport->l2hold && (mISDNport->ptp || !mISDNport->ntmode)) { -// PDEBUG(DEBUG_ISDN, "the L2 establish timer expired, we try to establish the link portnum=%d.\n", mISDNport->portnum); + PDEBUG(DEBUG_ISDN, "the L2 establish timer expired, we try to establish the link portnum=%d.\n", mISDNport->portnum); mISDNport->ml3->to_layer3(mISDNport->ml3, MT_L2ESTABLISH, 0, NULL); schedule_timer(&mISDNport->l2establish, 5, 0); /* 5 seconds */ } @@ -2018,7 +2001,6 @@ static int b_sock_callback(struct lcr_fd *fd, unsigned int what, void *instance, static int b_timer_timeout(struct lcr_timer *timer, void *instance, int i) { struct mISDNport *mISDNport = (struct mISDNport *)instance; -puts("fires"); bchannel_event(mISDNport, i, B_EVENT_TIMEOUT); @@ -2036,6 +2018,7 @@ int do_layer3(struct mlayer3 *ml3, unsigned int cmd, unsigned int pid, struct l3 struct mISDNport *mISDNport = (struct mISDNport *)ml3->priv; struct mbuffer *mb; +#ifdef OLD_MT_ASSIGN /* special MT_ASSIGN handling: * * if we request a PID from mlayer, we always do it while lcr is locked. @@ -2053,6 +2036,7 @@ int do_layer3(struct mlayer3 *ml3, unsigned int cmd, unsigned int pid, struct l3 mt_assign_pid = pid; return(0); } +#endif /* queue message, create, if required */ if (!l3m) { l3m = alloc_l3_msg(); @@ -2117,16 +2101,7 @@ struct mISDNport *mISDNport_open(struct interface_port *ifport) struct mISDN_devinfo devinfo; unsigned int protocol, prop; -#if defined WITH_GSM_BS && defined WITH_GSM_MS - loop = ifport->gsm_ms | ifport->gsm_bs; -#else -#ifdef WITH_GSM_BS - loop = ifport->gsm_bs; -#endif -#ifdef WITH_GSM_MS - loop = ifport->gsm_ms; -#endif -#endif + loop = 0; //printf("%s == %s\n", ifport->portname, options.loopback_int); if (!strcmp(ifport->portname, options.loopback_lcr)) loop = 1; @@ -2275,12 +2250,6 @@ struct mISDNport *mISDNport_open(struct interface_port *ifport) mISDNport->l1link = -1; mISDNport->l2link = -1; } -#ifdef WITH_GSM_BS - mISDNport->gsm_bs = ifport->gsm_bs; -#endif -#ifdef WITH_GSM_MS - mISDNport->gsm_ms = ifport->gsm_ms; -#endif mISDNport->isloopback = loop; pmemuse++; *mISDNportp = mISDNport; @@ -2293,7 +2262,7 @@ struct mISDNport *mISDNport_open(struct interface_port *ifport) if (ss5) { /* try to keep interface enabled */ l1hold = 1; - l2hold = 1; + l2hold = 0; } /* set l2hold */ switch (l2hold) { @@ -2543,22 +2512,22 @@ void mISDNport_close(struct mISDNport *mISDNport) /* * enque data from upper buffer */ -void PmISDN::txfromup(unsigned char *data, int length) +int PmISDN::bridge_rx(unsigned char *data, int length) { unsigned char buf[MISDN_HEADER_LEN+((length>ISDN_LOAD)?length:ISDN_LOAD)]; struct mISDNhead *hh = (struct mISDNhead *)buf; int ret; if (p_m_b_index < 0) - return; + return -EIO; if (p_m_mISDNport->b_state[p_m_b_index] != B_STATE_ACTIVE) - return; + return -EINVAL; /* check if high priority tones exist * ignore data in this case */ if (p_tone_name[0] || p_m_crypt_msg_loops || p_m_inband_send_on) - return; + return -EBUSY; /* preload procedure * if transmit buffer in DSP module is empty, @@ -2572,14 +2541,14 @@ void PmISDN::txfromup(unsigned char *data, int length) if (ret <= 0) PERROR("Failed to send to socket %d\n", p_m_mISDNport->b_sock[p_m_b_index].fd); p_m_load += ISDN_LOAD; - schedule_timer(&p_m_loadtimer, 0, ISDN_TRANSMIT*125); + schedule_timer(&p_m_loadtimer, 0, PORT_TRANSMIT * 125); } /* drop if load would exceed ISDN_MAXLOAD * this keeps the delay not too high */ if (p_m_load+length > ISDN_MAXLOAD) - return; + return -EINVAL; /* make and send frame */ hh->prim = PH_DATA_REQ; @@ -2589,6 +2558,8 @@ void PmISDN::txfromup(unsigned char *data, int length) if (ret <= 0) PERROR("Failed to send to socket %d\n", p_m_mISDNport->b_sock[p_m_b_index].fd); p_m_load += length; + + return 0; } int PmISDN::inband_send(unsigned char *buffer, int len)