From 54d34cda7a6f0d9bd3ff22d529ce69ff2c004bd3 Mon Sep 17 00:00:00 2001 From: Super User Date: Tue, 31 Jul 2007 07:34:18 +0200 Subject: [PATCH] fixed crash when receiving notify messages some other fixes start adding new mISDN api. --- Makefile | 4 + apppbx.cpp | 66 +++++++++------- cause.c | 7 +- dss1.cpp | 19 +++-- joinpbx.cpp | 9 ++- mISDN.cpp | 257 ++++++++++++++++++++++++++++++++++++++++-------------------- mISDN.h | 2 + main.c | 23 ++---- main.h | 4 + 9 files changed, 251 insertions(+), 140 deletions(-) diff --git a/Makefile b/Makefile index 3fbf24b..a0cc34f 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ WITH-CRYPTO = 42 # comment this out, if no libcrypto should be used WITH-ASTERISK = 42 # comment this out, if you don't require built-in Asterisk channel driver. +#WITH-SOCKET = 42 # compile for socket based mISDN ( # note: check your location and the names of libraries. # select location to install @@ -46,6 +47,9 @@ CFLAGS += $(LINUX_INCLUDE) $(MISDNUSER_INCLUDE) ifdef WITH-CRYPTO CFLAGS += -DCRYPTO endif +ifdef WITH-SOCKET +CFLAGS += -DSOCKET_MISDN +endif LIBDIR += $(MISDNUSER_LIB) ifdef WITH-CRYPTO LIBDIR += -L/usr/local/ssl/lib diff --git a/apppbx.cpp b/apppbx.cpp index 05d755e..61458e7 100644 --- a/apppbx.cpp +++ b/apppbx.cpp @@ -83,8 +83,8 @@ EndpointAppPBX::EndpointAppPBX(class Endpoint *epoint) : EndpointApp(epoint) e_cfnr_release = 0; e_cfnr_call = 0; e_password_timeout = 0; - e_multipoint_cause = CAUSE_NOUSER; - e_multipoint_location = LOCATION_PRIVATE_LOCAL; + e_multipoint_cause = 0; + e_multipoint_location = 0; e_dialing_queue[0] = '\0'; e_crypt = CRYPT_OFF; e_crypt_state = CM_ST_NULL; @@ -201,13 +201,13 @@ void EndpointAppPBX::screen(int out, char *id, int idsize, int *type, int *prese } if (ifmsn) { - trace_header("SCREEN (found in list)", DIRECTION_IN); + trace_header("SCREEN (found in MSN list)", DIRECTION_IN); add_trace("msn", NULL, "%s", id); end_trace(); } if (!ifmsn && msn1) // not in list, first msn given { - trace_header("SCREEN (not found in list)", DIRECTION_IN); + trace_header("SCREEN (not found MSN in list)", DIRECTION_IN); add_trace("msn", "given", "%s", id); add_trace("msn", "used", "%s", msn1); end_trace(); @@ -240,7 +240,7 @@ void EndpointAppPBX::screen(int out, char *id, int idsize, int *type, int *prese } if (ifscreen) // match { - trace_header("SCREEN (found in list)", out?DIRECTION_OUT:DIRECTION_IN); + trace_header("SCREEN (found in screen list)", out?DIRECTION_OUT:DIRECTION_IN); switch(*type) { case INFO_NTYPE_UNKNOWN: @@ -399,8 +399,8 @@ void EndpointAppPBX::release(int release, int joinlocation, int joincause, int p e_dtmf_last = 0; e_cfnr_release = 0; e_cfnr_call = 0; - e_multipoint_cause = CAUSE_NOUSER; - e_multipoint_location = LOCATION_PRIVATE_LOCAL; + e_multipoint_cause = 0; + e_multipoint_location = 0; e_dialing_queue[0] = '\0'; e_crypt = 0; e_crypt_state = CM_ST_NULL; @@ -1398,8 +1398,8 @@ int EndpointAppPBX::handler(void) { e_redial = 0; PDEBUG(DEBUG_EPOINT, "EPOINT(%d) current action timed out.\n", ea_endpoint->ep_serial); - e_multipoint_cause = CAUSE_NOUSER; - e_multipoint_location = LOCATION_PRIVATE_LOCAL; + e_multipoint_cause = 0; + e_multipoint_location = 0; new_state(EPOINT_STATE_IN_OVERLAP); e_join_pattern = 0; process_dialing(); @@ -1562,8 +1562,8 @@ void EndpointAppPBX::hookflash(void) } /* dialtone after pressing the hash key */ process_hangup(e_join_cause, e_join_location); - e_multipoint_cause = CAUSE_NOUSER; - e_multipoint_location = LOCATION_PRIVATE_LOCAL; + e_multipoint_cause = 0; + e_multipoint_location = 0; port = find_port_id(ea_endpoint->ep_portlist->port_id); if (port) { @@ -2190,29 +2190,30 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type, e_cfnr_call = e_cfnr_release = 0; if (e_ext.number[0]) e_dtmf = 1; /* allow dtmf */ -// if (call_countrelations(ea_endpoint->ep_join_id) == 2) + + /* modify colp */ + /* other calls with no caller id (or not available for the extension) and force colp */ + if ((e_connectinfo.id[0]=='\0' || (e_connectinfo.present==INFO_PRESENT_RESTRICTED && !e_ext.anon_ignore))&& e_ext.colp==COLP_FORCE) { - /* modify colp */ - /* other calls with no caller id (or not available for the extension) and force colp */ - if ((e_connectinfo.id[0]=='\0' || (e_connectinfo.present==INFO_PRESENT_RESTRICTED && !e_ext.anon_ignore))&& e_ext.colp==COLP_FORCE) + e_connectinfo.present = INFO_PRESENT_NOTAVAIL; + if (portlist->port_type==PORT_TYPE_DSS1_TE_OUT || portlist->port_type==PORT_TYPE_DSS1_NT_OUT) /* external extension answered */ { - e_connectinfo.present = INFO_PRESENT_NOTAVAIL; - if (portlist->port_type==PORT_TYPE_DSS1_TE_OUT || portlist->port_type==PORT_TYPE_DSS1_NT_OUT) /* external extension answered */ + port = find_port_id(portlist->port_id); + if (port) { - port = find_port_id(portlist->port_id); - if (port) - { - SCPY(e_connectinfo.id, nationalize_callerinfo(port->p_dialinginfo.id, &e_connectinfo.ntype)); - e_connectinfo.present = INFO_PRESENT_ALLOWED; - } + SCPY(e_connectinfo.id, nationalize_callerinfo(port->p_dialinginfo.id, &e_connectinfo.ntype)); + e_connectinfo.present = INFO_PRESENT_ALLOWED; } } - message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, message_type); - memcpy(&message->param.connectinfo, &e_connectinfo, sizeof(struct connect_info)); - message_put(message); } + + /* send connect to join */ if (ea_endpoint->ep_join_id) { + message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, message_type); + memcpy(&message->param.connectinfo, &e_connectinfo, sizeof(struct connect_info)); + message_put(message); + message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH); message->param.audiopath = CHANNEL_STATE_CONNECT; message_put(message); @@ -2369,8 +2370,15 @@ void EndpointAppPBX::port_disconnect_release(struct port_list *portlist, int mes } else { /* use multipoint cause if no connect yet */ - cause = e_multipoint_cause; - location = e_multipoint_location; + if (e_multipoint_cause) + { + cause = e_multipoint_cause; + location = e_multipoint_location; + } else + { + cause = CAUSE_NOUSER; + location = LOCATION_PRIVATE_LOCAL; + } } e_cfnr_call = e_cfnr_release = 0; @@ -2378,7 +2386,7 @@ void EndpointAppPBX::port_disconnect_release(struct port_list *portlist, int mes /* process hangup */ process_hangup(e_join_cause, e_join_location); e_multipoint_cause = 0; - e_multipoint_location = LOCATION_PRIVATE_LOCAL; + e_multipoint_location = 0; if (message_type == MESSAGE_DISCONNECT) { diff --git a/cause.c b/cause.c index 42fdb29..825daaa 100644 --- a/cause.c +++ b/cause.c @@ -405,9 +405,14 @@ void collect_cause(int *multicause, int *multilocation, int newcause, int newloc *multicause = newcause; *multilocation = newlocation; } else - if (newcause==CAUSE_NOUSER && *multicause==CAUSE_NOUSER) /* cause 18, but no cause yet, use the location */ + if (newcause==CAUSE_NOUSER && *multicause==CAUSE_NOUSER) /* cause 18, use the location */ { *multilocation = newlocation; + } else + if (*multicause==0) /* no cause yet, use newcause (should be 18) */ + { + *multicause = newcause; + *multilocation = newlocation; } } diff --git a/dss1.cpp b/dss1.cpp index 6aff417..87f49cd 100644 --- a/dss1.cpp +++ b/dss1.cpp @@ -42,8 +42,8 @@ Pdss1::Pdss1(int type, struct mISDNport *mISDNport, char *portname, struct port_ p_m_d_ces = -1; p_m_d_queue = NULL; p_m_d_notify_pending = NULL; - p_m_d_collect_cause = CAUSE_NOUSER; - p_m_d_collect_location = LOCATION_PRIVATE_LOCAL; + p_m_d_collect_cause = 0; + p_m_d_collect_location = 0; PDEBUG(DEBUG_ISDN, "Created new mISDNPort(%s). Currently %d objects use, %s port #%d\n", portname, mISDNport->use, (mISDNport->ntmode)?"NT":"TE", p_m_portnum); } @@ -1285,8 +1285,15 @@ void Pdss1::t312_timeout(unsigned long prim, unsigned long dinfo, void *data) while(p_epointlist) { message = message_create(p_serial, p_epointlist->epoint_id, PORT_TO_EPOINT, MESSAGE_RELEASE); - message->param.disconnectinfo.cause = p_m_d_collect_cause; - message->param.disconnectinfo.location = p_m_d_collect_location; + if (p_m_d_collect_cause) + { + message->param.disconnectinfo.cause = p_m_d_collect_cause; + message->param.disconnectinfo.location = p_m_d_collect_location; + } else + { + message->param.disconnectinfo.cause = CAUSE_NOUSER; + message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL; + } message_put(message); /* remove epoint */ free_epointlist(p_epointlist); @@ -1303,10 +1310,11 @@ void Pdss1::notify_ind(unsigned long prim, unsigned long dinfo, void *data) NOTIFY_t *notifying = (NOTIFY_t *)((unsigned long)data + headerlen); struct message *message; int notify, type, plan, present; + unsigned char notifyid[sizeof(message->param.notifyinfo.id)]; l1l2l3_trace_header(p_m_mISDNport, this, prim, DIRECTION_IN); dec_ie_notify(notifying->NOTIFY, (Q931_info_t *)((unsigned long)data+headerlen), ¬ify); - dec_ie_redir_dn(notifying->REDIR_DN, (Q931_info_t *)((unsigned long)data+headerlen), &type, &plan, &present, (unsigned char *)message->param.notifyinfo.id, sizeof(message->param.notifyinfo.id)); + dec_ie_redir_dn(notifying->REDIR_DN, (Q931_info_t *)((unsigned long)data+headerlen), &type, &plan, &present, notifyid, sizeof(notifyid)); end_trace(); if (!ACTIVE_EPOINT(p_epointlist)) @@ -1317,6 +1325,7 @@ void Pdss1::notify_ind(unsigned long prim, unsigned long dinfo, void *data) notify |= 0x80; message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_NOTIFY); message->param.notifyinfo.notify = notify; + SCPY(message->param.notifyinfo.id, (char *)notifyid); /* redirection number */ switch (present) { diff --git a/joinpbx.cpp b/joinpbx.cpp index 62da7f0..ff8fcd1 100644 --- a/joinpbx.cpp +++ b/joinpbx.cpp @@ -255,8 +255,8 @@ JoinPBX::JoinPBX(class Endpoint *epoint) : Join() j_pid = getpid(); j_updatebridge = 0; j_partyline = 0; - j_multicause = CAUSE_NOUSER; - j_multilocation = LOCATION_PRIVATE_LOCAL; + j_multicause = 0; + j_multilocation = 0; /* initialize a relation only to the calling interface */ relation = j_relation = (struct join_relation *)MALLOC(sizeof(struct join_relation)); @@ -791,7 +791,10 @@ void JoinPBX::message_epoint(unsigned long epoint_id, int message_type, union pa case RELATION_TYPE_SETUP: /* by called */ /* collect cause and send collected cause */ collect_cause(&j_multicause, &j_multilocation, param->disconnectinfo.cause, param->disconnectinfo.location); - release(relation, j_multilocation, j_multicause); + if (j_multicause) + release(relation, j_multilocation, j_multicause); + else + release(relation, LOCATION_PRIVATE_LOCAL, CAUSE_UNSPECIFIED); break; case RELATION_TYPE_CALLING: /* by calling */ diff --git a/mISDN.cpp b/mISDN.cpp index eab914a..f10a1a4 100644 --- a/mISDN.cpp +++ b/mISDN.cpp @@ -10,45 +10,130 @@ \*****************************************************************************/ -#include -#include -#include #include "main.h" -#include #include #include #include #include #include #include +#ifdef SOCKET_MISDN +#include +#include +#include +#include +#include +#include +#include +#include +#else extern "C" { #include } - -#if 0 -#ifndef ISDN_PID_L2_B_USER -#define ISDN_PID_L2_B_USER 0x420000ff -#endif -#ifndef ISDN_PID_L3_B_USER -#define ISDN_PID_L3_B_USER 0x430000ff -#endif #endif + #ifndef ISDN_PID_L4_B_USER #define ISDN_PID_L4_B_USER 0x440000ff #endif -/* used for udevice */ -int entity = 0; +/* list of mISDN ports */ +struct mISDNport *mISDNport_first; /* noise randomizer */ unsigned char mISDN_rand[256]; int mISDN_rand_count = 0; -/* the device handler and port list */ -int mISDNdevice = -1; +#ifdef MISDN_SOCKET +int mISDN_initialize(void) +{ + /* try to open raw socket to check kernel */ + ret = socket(AF_ISDN, SOCK_RAW, ISDN_P_BASE); + if (ret < 0) + { + fprintf(stderr, "Cannot open mISDN due to %s. (Does your Kernel support socket based mISDN?)\n", strerror(errno)); + return(-1); + } + close(ret); + + init_layer3(4); // buffer of 4 -/* list of mISDN ports */ -struct mISDNport *mISDNport_first; + return(0); +} + +void mISDN_deinitialize(void) +{ + cleanup_layer3(); +} +#else +int entity = 0; /* used for udevice */ +int mISDNdevice = -1; /* the device handler and port list */ + +int mISDN_initialize(void) +{ + char debug_log[128]; + unsigned char buff[1025]; + iframe_t *frm = (iframe_t *)buff; + int ret; + + /* initialize stuff of the NT lib */ + if (options.deb & DEBUG_STACK) + { + global_debug = 0xffffffff & ~DBGM_MSG; +// global_debug = DBGM_L3DATA; + } else + global_debug = DBGM_MAN; + SPRINT(debug_log, "%s/debug.log", INSTALL_DATA); + if (options.deb & DEBUG_LOG) + debug_init(global_debug, debug_log, debug_log, debug_log); + else + debug_init(global_debug, NULL, NULL, NULL); + msg_init(); + + /* open mISDNdevice if not already open */ + if (mISDNdevice < 0) + { + ret = mISDN_open(); + if (ret < 0) + { + fprintf(stderr, "cannot open mISDN device ret=%d errno=%d (%s) Check for mISDN modules!\nAlso did you create \"/dev/mISDN\"? Do: \"mknod /dev/mISDN c 46 0\"\n", ret, errno, strerror(errno)); + return(-1); + } + mISDNdevice = ret; + PDEBUG(DEBUG_ISDN, "mISDN device opened.\n"); + + /* create entity for layer 3 TE-mode */ + mISDN_write_frame(mISDNdevice, buff, 0, MGR_NEWENTITY | REQUEST, 0, 0, NULL, TIMEOUT_1SEC); + ret = mISDN_read_frame(mISDNdevice, frm, sizeof(iframe_t), 0, MGR_NEWENTITY | CONFIRM, TIMEOUT_1SEC); + if (ret < (int)mISDN_HEADER_LEN) + { + noentity: + FATAL("Cannot request MGR_NEWENTITY from mISDN. Exitting due to software bug."); + } + entity = frm->dinfo & 0xffff; + if (!entity) + goto noentity; + PDEBUG(DEBUG_ISDN, "our entity for l3-processes is %d.\n", entity); + } + return(0); +} + +void mISDN_deinitialize(void) +{ + unsigned char buff[1025]; + + debug_close(); + + if (mISDNdevice >= 0) + { + /* free entity */ + mISDN_write_frame(mISDNdevice, buff, 0, MGR_DELENTITY | REQUEST, entity, 0, NULL, TIMEOUT_1SEC); + /* close device */ + mISDN_close(mISDNdevice); + mISDNdevice = -1; + PDEBUG(DEBUG_ISDN, "mISDN device closed.\n"); + } +} +#endif /* * constructor @@ -1772,58 +1857,36 @@ struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, struct interface * int ret; unsigned char buff[1025]; iframe_t *frm = (iframe_t *)buff; - stack_info_t *stinf; struct mISDNport *mISDNport, **mISDNportp; int i, cnt; + int pri = 0; + int nt = 0; +#ifdef SOCKET_MISDN +// struct mlayer3 *layer3; +#else // interface_info_t ii; net_stack_t *nst; manager_t *mgr; layer_info_t li; - int pri = 0; - int nt = 0; - - /* open mISDNdevice if not already open */ - if (mISDNdevice < 0) - { - ret = mISDN_open(); - if (ret < 0) - { - PERROR("cannot open mISDN device ret=%d errno=%d (%s) Check for mISDN modules!\nAlso did you create \"/dev/mISDN\"? Do: \"mknod /dev/mISDN c 46 0\"\n", ret, errno, strerror(errno)); - return(NULL); - } - mISDNdevice = ret; - PDEBUG(DEBUG_ISDN, "mISDN device opened.\n"); - - /* create entity for layer 3 TE-mode */ - mISDN_write_frame(mISDNdevice, buff, 0, MGR_NEWENTITY | REQUEST, 0, 0, NULL, TIMEOUT_1SEC); - ret = mISDN_read_frame(mISDNdevice, frm, sizeof(iframe_t), 0, MGR_NEWENTITY | CONFIRM, TIMEOUT_1SEC); - if (ret < (int)mISDN_HEADER_LEN) - { - noentity: - FATAL("Cannot request MGR_NEWENTITY from mISDN. Exitting due to software bug."); - } - entity = frm->dinfo & 0xffff; - if (!entity) - goto noentity; - PDEBUG(DEBUG_ISDN, "our entity for l3-processes is %d.\n", entity); - } + stack_info_t *stinf; +#endif /* query port's requirements */ cnt = mISDN_get_stack_count(mISDNdevice); if (cnt <= 0) { - PERROR("Found no card. Please be sure to load card drivers.\n"); + PERROR_RUNTIME("Found no card. Please be sure to load card drivers.\n"); return(NULL); } if (port>cnt || port<1) { - PERROR("Port (%d) given at 'ports' (options.conf) is out of existing port range (%d-%d)\n", port, 1, cnt); + PERROR_RUNTIME("Port (%d) given at 'ports' (options.conf) is out of existing port range (%d-%d)\n", port, 1, cnt); return(NULL); } ret = mISDN_get_stack_info(mISDNdevice, port, buff, sizeof(buff)); if (ret < 0) { - PERROR("Cannot get stack info for port %d (ret=%d)\n", port, ret); + PERROR_RUNTIME("Cannot get stack info for port %d (ret=%d)\n", port, ret); return(NULL); } stinf = (stack_info_t *)&frm->data.p; @@ -1846,7 +1909,7 @@ struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, struct interface * nt = 1; break; default: - PERROR("unknown port(%d) type 0x%08x\n", port, stinf->pid.protocol[0]); + PERROR_RUNTIME("unknown port(%d) type 0x%08x\n", port, stinf->pid.protocol[0]); return(NULL); } if (nt) @@ -1854,12 +1917,12 @@ struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, struct interface * /* NT */ if (stinf->pid.protocol[1] == 0) { - PERROR("Given port %d: Missing layer 1 NT-mode protocol.\n", port); + PERROR_RUNTIME("Given port %d: Missing layer 1 NT-mode protocol.\n", port); return(NULL); } if (stinf->pid.protocol[2]) { - PERROR("Given port %d: Layer 2 protocol 0x%08x is detected, but not allowed for NT lib.\n", port, stinf->pid.protocol[2]); + PERROR_RUNTIME("Given port %d: Layer 2 protocol 0x%08x is detected, but not allowed for NT lib.\n", port, stinf->pid.protocol[2]); return(NULL); } } else @@ -1867,17 +1930,17 @@ struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, struct interface * /* TE */ if (stinf->pid.protocol[1] == 0) { - PERROR("Given port %d: Missing layer 1 protocol.\n", port); + PERROR_RUNTIME("Given port %d: Missing layer 1 protocol.\n", port); return(NULL); } if (stinf->pid.protocol[2] == 0) { - PERROR("Given port %d: Missing layer 2 protocol.\n", port); + PERROR_RUNTIME("Given port %d: Missing layer 2 protocol.\n", port); return(NULL); } if (stinf->pid.protocol[3] == 0) { - PERROR("Given port %d: Missing layer 3 protocol.\n", port); + PERROR_RUNTIME("Given port %d: Missing layer 3 protocol.\n", port); return(NULL); } else { @@ -1887,13 +1950,13 @@ struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, struct interface * break; default: - PERROR("Given port %d: own protocol 0x%08x", port,stinf->pid.protocol[3]); + PERROR_RUNTIME("Given port %d: own protocol 0x%08x", port,stinf->pid.protocol[3]); return(NULL); } } if (stinf->pid.protocol[4]) { - PERROR("Given port %d: Layer 4 protocol not allowed.\n", port); + PERROR_RUNTIME("Given port %d: Layer 4 protocol not allowed.\n", port); return(NULL); } } @@ -1907,33 +1970,52 @@ struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, struct interface * *mISDNportp = mISDNport; /* allocate ressources of port */ +#ifdef SOCKET_MISDN + /* open layer 3 */ + protocol = (nt)?L3_PROTOCOL_DSS1_USER:L3_PROTOCOL_DSS1_NETWORK; + prop = 0; + if (ptp) + prop |= FLG_PTP; + if (ptp) + prop |= FLG_FORCE_PTMP; + mISDNport->layer3 = open_layer3(port-1, protocol, prop , do_dchannel, mISDNport); + if (!mISDNport->layer3) + { + PERROR_RUNTIME("Cannot get layer(%d) id of port %d\n", nt?2:4, port); + return(NULL); + } + +#warning KKEIL: braucht man das noch? + /* if ntmode, establish L1 to send the tei removal during start */ + if (mISDNport->ntmode) + { + iframe_t act; + /* L1 */ + act.prim = PH_ACTIVATE | REQUEST; + act.addr = mISDNport->upper_id | FLG_MSG_DOWN; + printf("UPPER ID 0x%x, addr 0x%x\n",mISDNport->upper_id, act.addr); + act.dinfo = 0; + act.len = 0; + mISDN_write(mISDNdevice, &act, mISDN_HEADER_LEN+act.len, TIMEOUT_1SEC); + usleep(10000); /* to be sure, that l1 is up */ + } + +#else msg_queue_init(&mISDNport->downqueue); -// SCPY(mISDNport->name, "noname"); - mISDNport->portnum = port; - mISDNport->ntmode = nt; - mISDNport->pri = pri; mISDNport->d_stid = stinf->id; PDEBUG(DEBUG_ISDN, "d_stid = 0x%x.\n", mISDNport->d_stid); - mISDNport->b_num = stinf->childcnt; - PDEBUG(DEBUG_ISDN, "Port has %d b-channels.\n", mISDNport->b_num); if ((stinf->pid.protocol[2]&ISDN_PID_L2_DF_PTP) || (nt&&ptp) || pri) { PDEBUG(DEBUG_ISDN, "Port is point-to-point.\n"); - mISDNport->ptp = ptp = 1; + ptp = 1; if (ptmp && nt) { PDEBUG(DEBUG_ISDN, "Port is forced to point-to-multipoint.\n"); - mISDNport->ptp = ptp = 0; + ptp = 0; } } - i = 0; - while(i < stinf->childcnt) - { - mISDNport->b_stid[i] = stinf->child[i]; - mISDNport->b_state[i] = B_STATE_IDLE; - PDEBUG(DEBUG_ISDN, "b_stid[%d] = 0x%x.\n", i, mISDNport->b_stid[i]); - i++; - } + + /* create layer intance */ memset(&li, 0, sizeof(li)); UCPY(&li.name[0], (nt)?"net l2":"pbx l4"); li.object_id = -1; @@ -2021,6 +2103,23 @@ struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, struct interface * Isdnl3Init(nst); } +#endif +// SCPY(mISDNport->name, "noname"); + mISDNport->portnum = port; + mISDNport->ntmode = nt; + mISDNport->pri = pri; + mISDNport->ptp = ptp; + mISDNport->b_num = stinf->childcnt; + PDEBUG(DEBUG_ISDN, "Port has %d b-channels.\n", mISDNport->b_num); + i = 0; + while(i < stinf->childcnt) + { + mISDNport->b_stid[i] = stinf->child[i]; + mISDNport->b_state[i] = B_STATE_IDLE; + PDEBUG(DEBUG_ISDN, "b_stid[%d] = 0x%x.\n", i, mISDNport->b_stid[i]); + i++; + } + /* if te-mode, query state link */ if (!mISDNport->ntmode) { @@ -2182,16 +2281,6 @@ void mISDNport_close(struct mISDNport *mISDNport) FREE(mISDNport, sizeof(struct mISDNport)); pmemuse--; - /* close mISDNdevice, if no port */ - if (mISDNdevice>=0 && mISDNport_first==NULL) - { - /* free entity */ - mISDN_write_frame(mISDNdevice, buf, 0, MGR_DELENTITY | REQUEST, entity, 0, NULL, TIMEOUT_1SEC); - /* close device */ - mISDN_close(mISDNdevice); - mISDNdevice = -1; - PDEBUG(DEBUG_ISDN, "mISDN device closed.\n"); - } } diff --git a/mISDN.h b/mISDN.h index e0351ee..db1a8cb 100644 --- a/mISDN.h +++ b/mISDN.h @@ -79,6 +79,8 @@ calls with no bchannel (call waiting, call on hold). /* mISDN none-object functions */ +int mISDN_initialize(void); +void mISDN_deinitialize(void); void mISDN_port_info(void); struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, struct interface *interface); void mISDNport_close_all(void); diff --git a/main.c b/main.c index 599a911..2f11938 100644 --- a/main.c +++ b/main.c @@ -199,7 +199,6 @@ int main(int argc, char *argv[]) double start_d; #endif int idletime = 0, idlecheck = 0; - char debug_log[128]; char tracetext[256]; /* current time */ @@ -287,22 +286,11 @@ int main(int argc, char *argv[]) if (read_options() == 0) goto free; - /* initialize stuff of the NT lib */ - if (options.deb & DEBUG_STACK) - { - global_debug = 0xffffffff & ~DBGM_MSG; -// global_debug = DBGM_L3DATA; - } else - global_debug = DBGM_MAN; - SPRINT(debug_log, "%s/debug.log", INSTALL_DATA); - if (options.deb & DEBUG_LOG) - debug_init(global_debug, debug_log, debug_log, debug_log); - else - debug_init(global_debug, NULL, NULL, NULL); + /* init mISDN */ + if (mISDN_initialize() < 0) + goto free; created_debug = 1; - msg_init(); - /* read ruleset(s) */ if (!(ruleset_first = ruleset_parse())) goto free; @@ -782,9 +770,8 @@ free: if (pthread_mutex_destroy(&mutexd)) fprintf(stderr, "cannot destroy 'PDEBUG' mutex\n"); - /* close debug */ - if (created_debug) - debug_close(); + /* deinitialize mISDN */ + mISDN_deinitialize(); global_debug = 0; /* display memory leak */ diff --git a/main.h b/main.h index 9fbf128..6e679c0 100644 --- a/main.h +++ b/main.h @@ -26,6 +26,8 @@ extern int classuse; extern int fduse; extern int fhuse; +extern int global_debug; + #define PDEBUG(mask, fmt, arg...) _printdebug(__FUNCTION__, __LINE__, mask, fmt, ## arg) #define PERROR(fmt, arg...) _printerror(__FUNCTION__, __LINE__, fmt, ## arg) #define PDEBUG_RUNTIME(mask, fmt, arg...) _printdebug(NULL, 0, mask, fmt, ## arg) @@ -112,8 +114,10 @@ void debug(const char *function, int line, char *prefix, char *buffer); #ifdef __cplusplus extern "C" { #endif +#ifndef SOCKET_MISDN #include #include <../i4lnet/net_l3.h> +#endif #ifdef __cplusplus } #endif -- 2.13.6