fixed so, PRI/BRI NT/TE works

modified:   default/interface.conf
	modified:   dss1.cpp
	modified:   mISDN.cpp
	modified:   trace.c
	modified:   trace.h
This commit is contained in:
Super User 2008-05-09 21:31:58 +02:00
parent 9ae0e0e4e2
commit 613b4e59ef
5 changed files with 163 additions and 101 deletions

View File

@ -25,19 +25,19 @@
# Example of an internal ISDN interface on port 2, which accepts all extensions
#[Int]
#nt
#extension
#port 2
#nt
# Example of an ISDN interface on port 2, which accepts only extensions
# 201, 202 and 203
#[Int]
#nt
#extension
#msn 201,202,203
#port 2
#nt
# Example of three ISDN interfaces on port 2, 3 and 4, which accept
@ -47,22 +47,22 @@
# "interface Int1,Int2,In3" in extension's settings file.
#[Int1]
#nt
#extension
#msn 201,202,203
#port 2
#nt
#[Int2]
#nt
#extension
#msn 201
#port 3
#nt
#[Int3]
#nt
#extension
#msn 201
#port 4
#nt
# Example of an ISDN interface on port 1 that requires screening of caller IDs.
@ -97,7 +97,7 @@
#[PBX]
#port 5
#nt
#layer2hold
#layer2hold yes
#earlyb yes
#tones yes
#timeouts 60 60 60 60 60
@ -112,9 +112,9 @@ port 1
[Int]
nt
extension
msn 200,201,202,203
port 2
nt

View File

@ -529,7 +529,7 @@ void Pdss1::setup_ind(unsigned long prim, unsigned long dinfo, void *data)
/* process given callref */
l1l2l3_trace_header(p_m_mISDNport, this, L3_NEW_L3ID_IND, DIRECTION_IN);
add_trace("callref", "new", "0x%x", pid);
if (p_m_d_l3id != pid)
if (p_m_d_l3id)
{
/* release in case the ID is already in use */
add_trace("error", NULL, "callref already in use");
@ -1181,11 +1181,13 @@ void Pdss1::connect_ind(unsigned long prim, unsigned long dinfo, void *data)
int bchannel_before;
if (p_m_d_ntmode)
{
#ifdef SOCKET_MISDN
p_m_d_ces = pid >> 16;
#else
p_m_d_ces = connect->ces;
#endif
}
l1l2l3_trace_header(p_m_mISDNport, this, L3_CONNECT_IND, DIRECTION_IN);
#ifdef SOCKET_MISDN
@ -1285,7 +1287,7 @@ void Pdss1::connect_ind(unsigned long prim, unsigned long dinfo, void *data)
#endif
end_trace();
#ifdef SOCKET_MISDN
p_m_mISDNport->ml3->to_layer3(p_m_mISDNport->ml3, MT_CONNECT, p_m_d_l3id, l3m);
p_m_mISDNport->ml3->to_layer3(p_m_mISDNport->ml3, MT_CONNECT_ACKNOWLEDGE, p_m_d_l3id, l3m);
#else
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
#endif
@ -1510,13 +1512,22 @@ void Pdss1::release_complete_ind(unsigned long prim, unsigned long dinfo, void *
#endif
int location, cause;
struct lcr_msg *message;
l1l2l3_trace_header(p_m_mISDNport, this, L3_RELEASE_COMPLETE_IND, DIRECTION_IN);
/* in case layer 2 is down during setup, we send cause 27 loc 5 */
if (p_state == PORT_STATE_OUT_SETUP && !p_m_mISDNport->l1link)
{
cause = 27;
location = 5;
} else
{
#ifdef SOCKET_MISDN
dec_ie_cause(l3m, &location, &cause);
dec_ie_cause(l3m, &location, &cause);
#else
dec_ie_cause(release_complete->CAUSE, (Q931_info_t *)((unsigned long)data+headerlen), &location, &cause);
dec_ie_cause(release_complete->CAUSE, (Q931_info_t *)((unsigned long)data+headerlen), &location, &cause);
#endif
add_trace("layer 1", NULL, (p_m_mISDNport->l1link)?"up":"down");
}
end_trace();
if (location == LOCATION_PRIVATE_LOCAL)
location = LOCATION_PRIVATE_REMOTE;
@ -1543,12 +1554,12 @@ void Pdss1::release_complete_ind(unsigned long prim, unsigned long dinfo, void *
#ifdef SOCKET_MISDN
void Pdss1::t312_timeout_ind(unsigned int cmd, unsigned int pid, struct l3_msg *l3m)
{
// not required, release is performed with MT_FREE
}
#else
void Pdss1::t312_timeout_ind(unsigned long prim, unsigned long dinfo, void *data)
{
#endif
struct lcr_msg *message;
// trace is done at message_isdn()
/* sending release to endpoint */
@ -1572,6 +1583,7 @@ void Pdss1::t312_timeout_ind(unsigned long prim, unsigned long dinfo, void *data
new_state(PORT_STATE_RELEASE);
p_m_delete = 1;
}
#endif
/* CC_NOTIFY INDICATION */
#ifdef SOCKET_MISDN
@ -1962,7 +1974,7 @@ void Pdss1::resume_ind(unsigned long prim, unsigned long dinfo, void *data)
/* process given callref */
l1l2l3_trace_header(p_m_mISDNport, this, L3_NEW_L3ID_IND, DIRECTION_IN);
add_trace("callref", "new", "0x%x", pid);
if (p_m_d_l3id != pid)
if (p_m_d_l3id)
{
/* release is case the ID is already in use */
add_trace("error", NULL, "callref already in use");
@ -2153,7 +2165,7 @@ void Pdss1::facility_ind(unsigned long prim, unsigned long dinfo, void *data)
#ifdef SOCKET_MISDN
void Pdss1::message_isdn(unsigned int cmd, unsigned int pid, struct l3_msg *l3m)
{
int timer_hex=0;
int timer = 0;
switch (cmd)
{
@ -2163,18 +2175,19 @@ void Pdss1::message_isdn(unsigned int cmd, unsigned int pid, struct l3_msg *l3m)
PERROR("Pdss1(%s) timeout without cause.\n", p_name);
break;
}
if (l3m->cause[1] != 5)
if (l3m->cause[0] != 5)
{
PERROR("Pdss1(%s) expecting timeout with timer diagnostic.\n", p_name);
PERROR("Pdss1(%s) expecting timeout with timer diagnostic. (got len=%d)\n", p_name, l3m->cause[0]);
break;
}
if (l3m->cause[4]=='3' && l3m->cause[5]=='1' && l3m->cause[6]=='2')
{
l1l2l3_trace_header(p_m_mISDNport, this, L3_TIMEOUT_IND, DIRECTION_IN);
add_trace("timer", NULL, "%x", timer_hex);
end_trace();
timer = (l3m->cause[3]-'0')*100;
timer += (l3m->cause[4]-'0')*10;
timer += (l3m->cause[5]-'0');
l1l2l3_trace_header(p_m_mISDNport, this, L3_TIMEOUT_IND, DIRECTION_IN);
add_trace("timer", NULL, "%d", timer);
end_trace();
if (timer == 312)
t312_timeout_ind(cmd, pid, l3m);
}
break;
case MT_SETUP:
@ -2291,17 +2304,22 @@ void Pdss1::message_isdn(unsigned int cmd, unsigned int pid, struct l3_msg *l3m)
p_m_d_l3id = 0;
p_m_d_ces = -1;
p_m_delete = 1;
//#warning remove me
//PDEBUG(DEBUG_LOG, "JOLLY release cr %d\n", p_serial);
/* sending release to endpoint in case we still have an endpoint
* this is because we don't get any response if a release_complete is received (or a release in release state)
*/
while(p_epointlist)
while(p_epointlist) // only if not already released
{
struct lcr_msg *message;
message = message_create(p_serial, p_epointlist->epoint_id, PORT_TO_EPOINT, MESSAGE_RELEASE);
message->param.disconnectinfo.cause = (p_m_d_collect_cause!=CAUSE_NOUSER)?p_m_d_collect_cause:CAUSE_UNSPECIFIED;
message->param.disconnectinfo.location = (p_m_d_collect_cause!=CAUSE_NOUSER)?p_m_d_collect_location:LOCATION_PRIVATE_LOCAL;
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);
@ -2793,11 +2811,9 @@ void Pdss1::message_setup(unsigned long epoint_id, int message_id, union paramet
ncr.len = 0;
/* send message */
mISDN_write(mISDNdevice, &ncr, mISDN_HEADER_LEN+ncr.len, TIMEOUT_1SEC);
// if (!dmsg)
// goto nomem;
}
add_trace("callref", "new", "0x%x", p_m_d_l3id);
#endif
add_trace("callref", "new", "0x%x", p_m_d_l3id);
end_trace();
/* preparing setup message */
@ -4029,8 +4045,8 @@ int stack2manager(struct mISDNport *mISDNport, unsigned int cmd, unsigned int pi
if (pid == 0)
{
PERROR("PID is 0. change it.... quick...\n");
return(-EINVAL);
PDEBUG(DEBUG_ISDN, "ignoring dummy process from phone.\n");
return(0);
}
/* find Port object of type ISDN */
@ -4055,22 +4071,36 @@ int stack2manager(struct mISDNport *mISDNport, unsigned int cmd, unsigned int pi
/* aktueller prozess */
if (port)
{
if (cmd == MT_ASSIGN)
{
/* stack gives us new layer 3 id (during connect) */
l1l2l3_trace_header(mISDNport, pdss1, L3_NEW_L3ID_IND, DIRECTION_IN);
add_trace("callref", "old", "0x%x", pdss1->p_m_d_l3id);
/* nt-library now gives us a new id via CC_SETUP_CONFIRM */
if ((pdss1->p_m_d_l3id&MISDN_PID_CRTYPE_MASK) != MISDN_PID_MASTER)
PERROR(" strange setup-procid 0x%x\n", pdss1->p_m_d_l3id);
pdss1->p_m_d_l3id = pid;
add_trace("callref", "new", "0x%x", pdss1->p_m_d_l3id);
end_trace();
return(0);
}
/* if process id is master process, but a child disconnects */
if (mISDNport->ntmode
&& (pid & MISDN_PID_CRTYPE_MASK) != MISDN_PID_MASTER
&& (pdss1->p_m_d_l3id & MISDN_PID_CRVAL_MASK) == MISDN_PID_MASTER)
&& (pdss1->p_m_d_l3id & MISDN_PID_CRTYPE_MASK) == MISDN_PID_MASTER)
{
if (cmd == MT_DISCONNECT)
if (cmd == MT_DISCONNECT
|| cmd == MT_RELEASE)
{
/* send special indication for child disconnect */
pdss1->disconnect_ind_i(cmd, pid, l3m);
return(0);
}
// ignoring other messages from child processes
return(0);
if (cmd == MT_RELEASE_COMPLETE)
return(0);
}
/* if process id and layer 3 id matches */
if (pid == pdss1->p_m_d_l3id)
// if (pid == pdss1->p_m_d_l3id)
pdss1->message_isdn(cmd, pid, l3m);
return(0);
}
@ -4096,7 +4126,7 @@ int stack2manager(struct mISDNport *mISDNport, unsigned int cmd, unsigned int pi
break;
case MT_FREE:
PERROR("unhandled message from stack: call ref released (l3id=0x%x)\n", pid);
PDEBUG(DEBUG_ISDN, "unused call ref released (l3id=0x%x)\n", pid);
break;
case MT_RELEASE_COMPLETE:

150
mISDN.cpp
View File

@ -104,8 +104,11 @@ int mISDN_initialize(void)
return(-1);
}
/* init mlayer3 */
init_layer3(4); // buffer of 4
/* open debug, if enabled and not only stack debugging */
if (options.deb && (options.deb != DEBUG_STACK))
if (options.deb)
{
SPRINT(filename, "%s/debug.log", INSTALL_DATA);
debug_fp = fopen(filename, "a");
@ -118,9 +121,6 @@ int mISDN_initialize(void)
} else
mISDN_debug_init(0, NULL, NULL, NULL);
/* init mlayer3 */
init_layer3(4); // buffer of 4
return(0);
}
@ -427,7 +427,7 @@ void l1l2l3_trace_header(struct mISDNport *mISDNport, class PmISDN *port, unsign
/* init trace with given values */
start_trace(mISDNport?mISDNport->portnum:0,
mISDNport?mISDNport->ifport->interface:NULL,
mISDNport?(mISDNport->ifport?mISDNport->ifport->interface:NULL):NULL,
port?numberrize_callerinfo(port->p_callerinfo.id, port->p_callerinfo.ntype, options.national, options.international):NULL,
port?port->p_dialinginfo.id:NULL,
direction,
@ -440,28 +440,36 @@ void l1l2l3_trace_header(struct mISDNport *mISDNport, class PmISDN *port, unsign
/*
* send control information to the channel (dsp-module)
*/
void ph_control(struct mISDNport *mISDNport, class PmISDN *isdnport, unsigned long handle, unsigned long c1, unsigned long c2, char *trace_name, int trace_value)
{
#ifdef SOCKET_MISDN
void ph_control(struct mISDNport *mISDNport, class PmISDN *isdnport, unsigned long sock, unsigned long c1, unsigned long c2, char *trace_name, int trace_value)
{
unsigned char buffer[MISDN_HEADER_LEN+sizeof(int)+sizeof(int)];
struct mISDNhead *ctrl = (struct mISDNhead *)buffer;
unsigned long *d = (unsigned long *)(buffer+MISDN_HEADER_LEN);
int ret;
if (sock < 0)
return;
ctrl->prim = PH_CONTROL_REQ;
ctrl->id = 0;
*d++ = c1;
*d++ = c2;
ret = sendto(handle, buffer, MISDN_HEADER_LEN+sizeof(int)*2, 0, NULL, 0);
ret = sendto(sock, buffer, MISDN_HEADER_LEN+sizeof(int)*2, 0, NULL, 0);
if (!ret)
PERROR("Failed to send to socket %d\n", handle);
PERROR("Failed to send to socket %d\n", sock);
#else
void ph_control(struct mISDNport *mISDNport, class PmISDN *isdnport, unsigned long addr, unsigned long c1, unsigned long c2, char *trace_name, int trace_value)
{
unsigned char buffer[mISDN_HEADER_LEN+sizeof(int)+sizeof(int)];
iframe_t *ctrl = (iframe_t *)buffer;
unsigned long *d = (unsigned long *)&ctrl->data.p;
if (!addr)
return;
ctrl->prim = PH_CONTROL | REQUEST;
ctrl->addr = handle | FLG_MSG_DOWN;
ctrl->addr = addr | FLG_MSG_DOWN;
ctrl->dinfo = 0;
ctrl->len = sizeof(int)*2;
*d++ = c1;
@ -480,28 +488,36 @@ void ph_control(struct mISDNport *mISDNport, class PmISDN *isdnport, unsigned lo
end_trace();
}
void ph_control_block(struct mISDNport *mISDNport, class PmISDN *isdnport, unsigned long handle, unsigned long c1, void *c2, int c2_len, char *trace_name, int trace_value)
{
#ifdef SOCKET_MISDN
void ph_control_block(struct mISDNport *mISDNport, class PmISDN *isdnport, int sock, unsigned long c1, void *c2, int c2_len, char *trace_name, int trace_value)
{
unsigned char buffer[MISDN_HEADER_LEN+sizeof(int)+c2_len];
struct mISDNhead *ctrl = (struct mISDNhead *)buffer;
unsigned long *d = (unsigned long *)(buffer+MISDN_HEADER_LEN);
int ret;
if (sock < 0)
return;
ctrl->prim = PH_CONTROL_REQ;
ctrl->id = 0;
*d++ = c1;
memcpy(d, c2, c2_len);
ret = sendto(handle, buffer, MISDN_HEADER_LEN+sizeof(int)+c2_len, 0, NULL, 0);
ret = sendto(sock, buffer, MISDN_HEADER_LEN+sizeof(int)+c2_len, 0, NULL, 0);
if (!ret)
PERROR("Failed to send to socket %d\n", handle);
PERROR("Failed to send to socket %d\n", sock);
#else
void ph_control_block(struct mISDNport *mISDNport, class PmISDN *isdnport, unsigned long addr, unsigned long c1, void *c2, int c2_len, char *trace_name, int trace_value)
{
unsigned char buffer[mISDN_HEADER_LEN+sizeof(int)+c2_len];
iframe_t *ctrl = (iframe_t *)buffer;
unsigned long *d = (unsigned long *)&ctrl->data.p;
if (!addr)
return;
ctrl->prim = PH_CONTROL | REQUEST;
ctrl->addr = handle | FLG_MSG_DOWN;
ctrl->addr = addr | FLG_MSG_DOWN;
ctrl->dinfo = 0;
ctrl->len = sizeof(int)+c2_len;
*d++ = c1;
@ -525,17 +541,16 @@ static int _bchannel_create(struct mISDNport *mISDNport, int i)
unsigned long on = 1;
struct sockaddr_mISDN addr;
if (mISDNport->b_socket[i])
if (mISDNport->b_socket[i] > -1)
{
PERROR("Error: Socket already created for index %d\n", i);
return(0);
}
/* open socket */
#warning testing without bchannel
return(0);
#warning testing without DSP
mISDNport->b_socket[i] = socket(PF_ISDN, SOCK_DGRAM, ISDN_P_B_RAW/*ISDN_P_B_L2DSP*/);
//#warning testing without DSP
// mISDNport->b_socket[i] = socket(PF_ISDN, SOCK_DGRAM, ISDN_P_B_RAW);
mISDNport->b_socket[i] = socket(PF_ISDN, SOCK_DGRAM, ISDN_P_B_L2DSP);
if (mISDNport->b_socket[i] < 0)
{
PERROR("Error: Failed to open bchannel-socket for index %d with mISDN-DSP layer. Did you load mISDNdsp.ko?\n", i);
@ -658,7 +673,9 @@ static void _bchannel_activate(struct mISDNport *mISDNport, int i, int activate)
struct mISDNhead act;
int ret;
act.prim = (activate)?DL_ESTABLISH_REQ:DL_RELEASE_REQ;
if (mISDNport->b_socket[i] < 0)
return;
act.prim = (activate)?PH_ACTIVATE_REQ:PH_DEACTIVATE_REQ;
act.id = 0;
ret = sendto(mISDNport->b_socket[i], &act, MISDN_HEADER_LEN, 0, NULL, 0);
if (!ret)
@ -693,6 +710,8 @@ static void _bchannel_configure(struct mISDNport *mISDNport, int i)
#ifdef SOCKET_MISDN
int handle;
if (mISDNport->b_socket[i] < 0)
return;
handle = mISDNport->b_socket[i];
port = mISDNport->b_port[i];
if (!port)
@ -776,15 +795,14 @@ static void _bchannel_configure(struct mISDNport *mISDNport, int i)
static void _bchannel_destroy(struct mISDNport *mISDNport, int i)
{
#ifdef SOCKET_MISDN
if (mISDNport->b_socket[i] < 0)
return;
chan_trace_header(mISDNport, mISDNport->b_port[i], "BCHANNEL remove socket", DIRECTION_OUT);
add_trace("channel", NULL, "%d", i+1+(i>=15));
add_trace("socket", NULL, "%d", mISDNport->b_socket[i]);
end_trace();
if (mISDNport->b_socket[i] > -1)
{
close(mISDNport->b_socket[i]);
mISDNport->b_socket[i] = -1;
}
close(mISDNport->b_socket[i]);
mISDNport->b_socket[i] = -1;
#else
unsigned char buff[1024];
@ -1595,20 +1613,23 @@ int PmISDN::handler(void)
}
/* send data */
if (p_m_mISDNport->b_state[p_m_b_index] == B_STATE_ACTIVE)
{
#ifdef SOCKET_MISDN
frm->prim = DL_DATA_REQ;
frm->id = 0;
ret = sendto(p_m_mISDNport->b_socket[p_m_b_index], buf, MISDN_HEADER_LEN+ISDN_LOAD-p_m_load-tosend, 0, NULL, 0);
if (!ret)
PERROR("Failed to send to socket %d\n", p_m_mISDNport->b_socket[p_m_b_index]);
frm->prim = PH_DATA_REQ;
frm->id = 0;
ret = sendto(p_m_mISDNport->b_socket[p_m_b_index], buf, MISDN_HEADER_LEN+ISDN_LOAD-p_m_load-tosend, 0, NULL, 0);
if (!ret)
PERROR("Failed to send to socket %d\n", p_m_mISDNport->b_socket[p_m_b_index]);
#else
frm->prim = DL_DATA | REQUEST;
frm->addr = p_m_mISDNport->b_addr[p_m_b_index] | FLG_MSG_DOWN;
frm->dinfo = 0;
frm->len = ISDN_LOAD - p_m_load - tosend;
if (frm->len)
mISDN_write(mISDNdevice, frm, mISDN_HEADER_LEN+frm->len, TIMEOUT_1SEC);
frm->prim = DL_DATA | REQUEST;
frm->addr = p_m_mISDNport->b_addr[p_m_b_index] | FLG_MSG_DOWN;
frm->dinfo = 0;
frm->len = ISDN_LOAD - p_m_load - tosend;
if (frm->len)
mISDN_write(mISDNdevice, frm, mISDN_HEADER_LEN+frm->len, TIMEOUT_1SEC);
#endif
}
p_m_load += ISDN_LOAD - p_m_load - tosend;
}
}
@ -2195,7 +2216,7 @@ int mISDN_handler(void)
{
/* turn on RX */
isdnport->p_m_rxoff = 0;
PDEBUG(DEBUG_BCHANNEL, "%s: receive data is required, so we turn them on\n");
PDEBUG(DEBUG_BCHANNEL, "%s: receive data is required, so we turn them on\n", __FUNCTION__);
if (mISDNport->b_port[i] && mISDNport->b_state[i] == B_STATE_ACTIVE)
ph_control(mISDNport, isdnport, mISDNport->b_socket[isdnport->p_m_b_index], DSP_RECEIVE_ON, 0, "DSP-RXOFF", 0);
return(1);
@ -2207,7 +2228,7 @@ int mISDN_handler(void)
{
/* turn off RX */
isdnport->p_m_rxoff = 1;
PDEBUG(DEBUG_BCHANNEL, "%s: receive data is not required, so we turn them off\n");
PDEBUG(DEBUG_BCHANNEL, "%s: receive data is not required, so we turn them off\n", __FUNCTION__);
if (mISDNport->b_port[i] && mISDNport->b_state[i] == B_STATE_ACTIVE)
ph_control(mISDNport, isdnport, mISDNport->b_socket[isdnport->p_m_b_index], DSP_RECEIVE_OFF, 0, "DSP-RXOFF", 1);
return(1);
@ -2221,7 +2242,7 @@ int mISDN_handler(void)
{
/* turn on RX */
isdnport->p_m_txdata = 1;
PDEBUG(DEBUG_BCHANNEL, "%s: transmit data is required, so we turn them on\n");
PDEBUG(DEBUG_BCHANNEL, "%s: transmit data is required, so we turn them on\n", __FUNCTION__);
if (mISDNport->b_port[i] && mISDNport->b_state[i] == B_STATE_ACTIVE)
ph_control(mISDNport, isdnport, mISDNport->b_socket[isdnport->p_m_b_index], DSP_TXDATA_ON, 0, "DSP-TXDATA", 1);
return(1);
@ -2233,7 +2254,7 @@ int mISDN_handler(void)
{
/* turn off RX */
isdnport->p_m_txdata = 0;
PDEBUG(DEBUG_BCHANNEL, "%s: transmit data is not required, so we turn them off\n");
PDEBUG(DEBUG_BCHANNEL, "%s: transmit data is not required, so we turn them off\n", __FUNCTION__);
if (mISDNport->b_port[i] && mISDNport->b_state[i] == B_STATE_ACTIVE)
ph_control(mISDNport, isdnport, mISDNport->b_socket[isdnport->p_m_b_index], DSP_TXDATA_OFF, 0, "DSP-TXDATA", 0);
return(1);
@ -2374,11 +2395,10 @@ int mISDN_handler(void)
/* l3-data is sent to LCR */
stack2manager(mISDNport, l3m->type, l3m->pid, l3m);
}
/* free message */
free_l3_msg(l3m);
}
/* free message */
free_l3_msg(l3m);
#if 0
if (mISDNport->l1timeout && now>mISDNport->l1timeout)
{ ---}
@ -2451,7 +2471,7 @@ int mISDN_handler(void)
{
/* turn on RX */
isdnport->p_m_rxoff = 0;
PDEBUG(DEBUG_BCHANNEL, "%s: receive data is required, so we turn them on\n");
PDEBUG(DEBUG_BCHANNEL, "%s: receive data is required, so we turn them on\n", __FUNCTION__);
if (mISDNport->b_port[i] && mISDNport->b_state[i] == B_STATE_ACTIVE)
ph_control(mISDNport, isdnport, mISDNport->b_addr[isdnport->p_m_b_index], CMX_RECEIVE_ON, 0, "DSP-RXOFF", 0);
return(1);
@ -2463,7 +2483,7 @@ int mISDN_handler(void)
{
/* turn off RX */
isdnport->p_m_rxoff = 1;
PDEBUG(DEBUG_BCHANNEL, "%s: receive data is not required, so we turn them off\n");
PDEBUG(DEBUG_BCHANNEL, "%s: receive data is not required, so we turn them off\n", __FUNCTION__);
if (mISDNport->b_port[i] && mISDNport->b_state[i] == B_STATE_ACTIVE)
ph_control(mISDNport, isdnport, mISDNport->b_addr[isdnport->p_m_b_index], CMX_RECEIVE_OFF, 0, "DSP-RXOFF", 1);
return(1);
@ -2477,7 +2497,7 @@ int mISDN_handler(void)
{
/* turn on RX */
isdnport->p_m_txdata = 1;
PDEBUG(DEBUG_BCHANNEL, "%s: transmit data is required, so we turn them on\n");
PDEBUG(DEBUG_BCHANNEL, "%s: transmit data is required, so we turn them on\n", __FUNCTION__);
#ifndef OLD_MISDN
if (mISDNport->b_port[i] && mISDNport->b_state[i] == B_STATE_ACTIVE)
ph_control(mISDNport, isdnport, mISDNport->b_addr[isdnport->p_m_b_index], CMX_TXDATA_ON, 0, "DSP-TXDATA", 1);
@ -2491,7 +2511,7 @@ int mISDN_handler(void)
{
/* turn off RX */
isdnport->p_m_txdata = 0;
PDEBUG(DEBUG_BCHANNEL, "%s: transmit data is not required, so we turn them off\n");
PDEBUG(DEBUG_BCHANNEL, "%s: transmit data is not required, so we turn them off\n", __FUNCTION__);
#ifndef OLD_MISDN
if (mISDNport->b_port[i] && mISDNport->b_state[i] == B_STATE_ACTIVE)
ph_control(mISDNport, isdnport, mISDNport->b_addr[isdnport->p_m_b_index], CMX_TXDATA_OFF, 0, "DSP-TXDATA", 0);
@ -2893,13 +2913,11 @@ int do_layer3(struct mlayer3 *ml3, unsigned int cmd, unsigned int pid, struct l3
* we must check if we get a reply and we know that we lcr is currently
* locked.
*/
if (cmd == MT_ASSIGN)
if (cmd==MT_ASSIGN && (pid&MISDN_PID_CR_FLAG) && (pid>>16)==MISDN_CES_MASTER)
{
/* let's do some checking if someone changes stack behaviour */
if (mt_assign_pid != 0)
FATAL("someone played with the mISDNuser stack. MT_ASSIGN not currently expected.\n");
if ((pid >> 16) != MISDN_CES_MASTER)
FATAL("someone played with the mISDNuser stack. MT_ASSIGN is expected with master CES.\n");
mt_assign_pid = pid;
return(0);
}
@ -3130,7 +3148,7 @@ struct mISDNport *mISDNport_open(int port, int ptp, int force_nt, int l2hold, st
pmemuse++;
*mISDNportp = mISDNport;
/* if pri, set PTP */
/* if pri, must set PTP */
if (pri)
ptp = 1;
@ -3141,7 +3159,7 @@ struct mISDNport *mISDNport_open(int port, int ptp, int force_nt, int l2hold, st
l2hold = 0;
break;
case 1: // on
l2hold = 0;
l2hold = 1;
break;
default:
if (ptp)
@ -3154,22 +3172,33 @@ struct mISDNport *mISDNport_open(int port, int ptp, int force_nt, int l2hold, st
/* allocate ressources of port */
#ifdef SOCKET_MISDN
/* open layer 3 and init upqueue */
protocol = (nt)?L3_PROTOCOL_DSS1_USER:L3_PROTOCOL_DSS1_NET;
prop = 0;
protocol = (nt)?L3_PROTOCOL_DSS1_NET:L3_PROTOCOL_DSS1_USER;
prop = (1 << MISDN_FLG_L2_CLEAN);
if (ptp) // ptp forced
prop |= (1 << MISDN_FLG_PTP);
if (nt) // supports hold/retrieve on nt-mode
prop |= (1 << MISDN_FLG_NET_HOLD);
if (l2hold) // supports layer 2 hold
prop |= (1 << MISDN_FLG_L2_HOLD);
/* queue must be initializes, because l3-thread may send messages during open_layer3() */
mqueue_init(&mISDNport->upqueue);
mISDNport->ml3 = open_layer3(port-1, protocol, prop , do_layer3, mISDNport);
if (!mISDNport->ml3)
{
PERROR_RUNTIME("oper_layer3() failed for port %d\n", port);
mqueue_purge(&mISDNport->upqueue);
PERROR_RUNTIME("open_layer3() failed for port %d\n", port);
start_trace(port,
interface,
NULL,
NULL,
DIRECTION_NONE,
CATEGORY_CH,
0,
"PORT (open failed)");
end_trace();
mISDNport_close(mISDNport);
return(NULL);
}
mqueue_init(&mISDNport->upqueue);
#if 0
/* if ntmode, establish L1 to send the tei removal during start */
@ -3367,6 +3396,7 @@ struct mISDNport *mISDNport_open(int port, int ptp, int force_nt, int l2hold, st
CATEGORY_CH,
0,
"PORT (open)");
add_trace("mode", NULL, (mISDNport->ntmode)?"network":"terminal");
add_trace("channels", NULL, "%d", mISDNport->b_num);
end_trace();
return(mISDNport);
@ -3786,7 +3816,7 @@ void PmISDN::txfromup(unsigned char *data, int length)
if (p_m_b_index < 0)
return;
if (!p_m_mISDNport->b_socket[p_m_b_index])
if (p_m_mISDNport->b_state[p_m_b_index] != B_STATE_ACTIVE)
return;
#else
unsigned char buf[mISDN_HEADER_LEN+((length>ISDN_LOAD)?length:ISDN_LOAD)];
@ -3811,7 +3841,7 @@ void PmISDN::txfromup(unsigned char *data, int length)
if (p_m_load==0 && ISDN_LOAD>0)
{
#ifdef SOCKET_MISDN
hh->prim = DL_DATA_REQ;
hh->prim = PH_DATA_REQ;
hh->id = 0;
memset(buf+MISDN_HEADER_LEN, (options.law=='a')?0x2a:0xff, ISDN_LOAD);
ret = sendto(p_m_mISDNport->b_socket[p_m_b_index], buf, MISDN_HEADER_LEN+ISDN_LOAD, 0, NULL, 0);
@ -3836,7 +3866,7 @@ void PmISDN::txfromup(unsigned char *data, int length)
/* make and send frame */
#ifdef SOCKET_MISDN
hh->prim = DL_DATA_REQ;
hh->prim = PH_DATA_REQ;
hh->id = 0;
memcpy(buf+MISDN_HEADER_LEN, data, length);
ret = sendto(p_m_mISDNport->b_socket[p_m_b_index], buf, MISDN_HEADER_LEN+length, 0, NULL, 0);

View File

@ -49,6 +49,8 @@ void _start_trace(const char *__file, int __line, int port, struct interface *in
trace.serial = serial;
if (name) if (name[0])
SCPY(trace.name, name);
if (!trace.name[0])
SCPY(trace.name, "<unknown>");
trace.sec = now_tv.tv_sec;
trace.usec = now_tv.tv_usec;
}

View File

@ -26,7 +26,6 @@
#define L2_RELEASE_CON 0x0002f101
#define L2_RELEASE_IND 0x0002f102
#define L2_RELEASE_RES 0x0002f103
#define L3_UNKNOWN 0x0003f200
#define L3_ALERTING_REQ 0x00030100
#define L3_ALERTING_IND 0x00030102
#define L3_PROCEEDING_REQ 0x00030200
@ -105,6 +104,7 @@
#endif
#define L3_TIMEOUT_REQ 0x0003f200
#define L3_TIMEOUT_IND 0x0003f202
#define L3_UNKNOWN 0x0003ff00
struct trace_element {