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:
parent
9ae0e0e4e2
commit
613b4e59ef
|
@ -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
|
||||
|
||||
|
||||
|
|
94
dss1.cpp
94
dss1.cpp
|
@ -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
|
||||
|
@ -1512,11 +1514,20 @@ void Pdss1::release_complete_ind(unsigned long prim, unsigned long dinfo, void *
|
|||
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
150
mISDN.cpp
|
@ -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);
|
||||
|
|
2
trace.c
2
trace.c
|
@ -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;
|
||||
}
|
||||
|
|
2
trace.h
2
trace.h
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue