parent
3754d8f73f
commit
7b78740c6e
|
@ -147,7 +147,7 @@ void EndpointAppPBX::trace_header(char *name, int direction)
|
|||
SCPY(msgtext, name);
|
||||
|
||||
/* init trace with given values */
|
||||
start_trace(ea_endpoint->ep_serial,
|
||||
start_trace(0,
|
||||
NULL,
|
||||
numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype),
|
||||
e_dialinginfo.id,
|
||||
|
|
40
dss1.cpp
40
dss1.cpp
|
@ -1785,17 +1785,18 @@ void Pdss1::message_isdn(unsigned long prim, unsigned long dinfo, void *data)
|
|||
switch (prim)
|
||||
{
|
||||
case CC_TIMEOUT | INDICATION:
|
||||
l1l2l3_trace_header(p_m_mISDNport, this, prim, DIRECTION_IN);
|
||||
if (p_m_d_ntmode)
|
||||
{
|
||||
int headerlen = (p_m_d_ntmode)?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;
|
||||
timer_hex = *((int *)(((char *)data)+headerlen));
|
||||
}
|
||||
if (timer_hex)
|
||||
add_trace("timer", NULL, "%x", timer_hex);
|
||||
end_trace();
|
||||
if (timer_hex==0x312 && p_m_d_ntmode)
|
||||
{
|
||||
l1l2l3_trace_header(p_m_mISDNport, this, prim, DIRECTION_IN);
|
||||
add_trace("timer", NULL, "%x", timer_hex);
|
||||
end_trace();
|
||||
t312_timeout(prim, dinfo, data);
|
||||
}
|
||||
break;
|
||||
|
||||
case CC_SETUP | INDICATION:
|
||||
|
@ -2832,20 +2833,8 @@ void Pdss1::message_release(unsigned long epoint_id, int message_id, union param
|
|||
end_trace();
|
||||
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
|
||||
new_state(PORT_STATE_RELEASE);
|
||||
/* remove epoint */
|
||||
remove_endpoint:
|
||||
free_epointid(epoint_id);
|
||||
l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE_CR | REQUEST, DIRECTION_OUT);
|
||||
add_trace("callref", "new", "0x%x", p_m_d_l3id);
|
||||
end_trace();
|
||||
if (p_m_d_ntmode)
|
||||
{
|
||||
if ((p_m_d_l3id&0xff00) == 0xff00)
|
||||
p_m_mISDNport->procids[p_m_d_l3id&0xff] = 0;
|
||||
}
|
||||
p_m_d_l3id = 0;
|
||||
p_m_delete = 1;
|
||||
return;
|
||||
|
||||
}
|
||||
/* if we are on outgoing/incoming call setup, we may release complete */
|
||||
if (p_state==PORT_STATE_OUT_SETUP
|
||||
|
@ -2862,7 +2851,20 @@ void Pdss1::message_release(unsigned long epoint_id, int message_id, union param
|
|||
end_trace();
|
||||
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
|
||||
new_state(PORT_STATE_RELEASE);
|
||||
goto remove_endpoint;
|
||||
|
||||
/* remove epoint */
|
||||
free_epointid(epoint_id);
|
||||
l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE_CR | REQUEST, DIRECTION_OUT);
|
||||
add_trace("callref", NULL, "0x%x", p_m_d_l3id);
|
||||
end_trace();
|
||||
if (p_m_d_ntmode)
|
||||
{
|
||||
if ((p_m_d_l3id&0xff00) == 0xff00)
|
||||
p_m_mISDNport->procids[p_m_d_l3id&0xff] = 0;
|
||||
}
|
||||
p_m_d_l3id = 0;
|
||||
p_m_delete = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
/* NT-MODE in setup state we must send PROCEEDING first */
|
||||
|
@ -3286,7 +3288,7 @@ int stack2manager_te(struct mISDNport *mISDNport, msg_t *msg)
|
|||
|
||||
/* creating port object */
|
||||
SPRINT(name, "%s-%d-in", mISDNport->ifport->interface->name, mISDNport->portnum);
|
||||
if (!(pdss1 = new Pdss1(PORT_TYPE_DSS1_NT_IN, mISDNport, name, NULL, 0, 0)))
|
||||
if (!(pdss1 = new Pdss1(PORT_TYPE_DSS1_TE_IN, mISDNport, name, NULL, 0, 0)))
|
||||
{
|
||||
RELEASE_COMPLETE_t *release_complete;
|
||||
msg_t *dmsg;
|
||||
|
|
479
mISDN.cpp
479
mISDN.cpp
|
@ -444,13 +444,12 @@ static void _bchannel_configure(struct mISDNport *mISDNport, int i)
|
|||
static void _bchannel_deactivate(struct mISDNport *mISDNport, int i)
|
||||
{
|
||||
iframe_t dact;
|
||||
int addr;
|
||||
|
||||
chan_trace_header(mISDNport, mISDNport->b_port[i], "BCHANNEL deactivate", DIRECTION_OUT);
|
||||
add_trace("channel", NULL, "%d", i+1+(i>=15));
|
||||
end_trace();
|
||||
dact.prim = DL_RELEASE | REQUEST;
|
||||
dact.addr = addr | FLG_MSG_DOWN;
|
||||
dact.addr = mISDNport->b_addr[i] | FLG_MSG_DOWN;
|
||||
dact.dinfo = 0;
|
||||
dact.len = 0;
|
||||
mISDN_write(mISDNdevice, &dact, mISDN_HEADER_LEN+dact.len, TIMEOUT_1SEC);
|
||||
|
@ -534,7 +533,6 @@ void bchannel_event(struct mISDNport *mISDNport, int i, int event)
|
|||
{
|
||||
int state = mISDNport->b_state[i];
|
||||
|
||||
printf("event=%d state=%d\n", event, state);
|
||||
switch(event)
|
||||
{
|
||||
case B_EVENT_ACTIVATE:
|
||||
|
@ -622,11 +620,15 @@ printf("event=%d state=%d\n", event, state);
|
|||
break;
|
||||
|
||||
case B_EVENT_DEACTIVATED:
|
||||
_bchannel_destroy(mISDNport, i);
|
||||
state = B_STATE_IDLE;
|
||||
switch(state)
|
||||
{
|
||||
case B_STATE_IDLE:
|
||||
/* ignore due to deactivation confirm after unloading */
|
||||
break;
|
||||
|
||||
case B_STATE_DEACTIVATING:
|
||||
_bchannel_destroy(mISDNport, i);
|
||||
state = B_STATE_IDLE;
|
||||
if (mISDNport->b_port[i])
|
||||
{
|
||||
/* bchannel is now deactivate, but is requied by Port class, so we reactivate */
|
||||
|
@ -1002,7 +1004,7 @@ void PmISDN::bchannel_receive(iframe_t *frm)
|
|||
}
|
||||
return;
|
||||
}
|
||||
if (frm->prim != (PH_DATA | INDICATION))
|
||||
if (frm->prim != (PH_DATA | INDICATION) && frm->prim != (DL_DATA | INDICATION))
|
||||
{
|
||||
PERROR("Bchannel received unknown primitve: 0x%x\n", frm->prim);
|
||||
return;
|
||||
|
@ -1537,245 +1539,260 @@ int mISDN_handler(void)
|
|||
case MGR_ADDTIMER | CONFIRM:
|
||||
case MGR_DELTIMER | CONFIRM:
|
||||
case MGR_REMOVETIMER | CONFIRM:
|
||||
// if (options.deb & DEBUG_ISDN)
|
||||
// PDEBUG(DEBUG_ISDN, "timer-confirm\n");
|
||||
free_msg(msg);
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* find the port */
|
||||
/* handle timer events from mISDN for NT-stack
|
||||
* note: they do not associate with a stack */
|
||||
if (frm->prim == (MGR_TIMER | INDICATION))
|
||||
{
|
||||
itimer_t *it;
|
||||
|
||||
/* find mISDNport */
|
||||
mISDNport = mISDNport_first;
|
||||
while(mISDNport)
|
||||
{
|
||||
/* nt mode only */
|
||||
if (mISDNport->ntmode)
|
||||
{
|
||||
it = mISDNport->nst.tlist;
|
||||
/* find timer */
|
||||
while(it)
|
||||
{
|
||||
if (it->id == (int)frm->addr)
|
||||
break;
|
||||
it = it->next;
|
||||
}
|
||||
if (it)
|
||||
break;
|
||||
}
|
||||
mISDNport = mISDNport->next;
|
||||
}
|
||||
if (mISDNport)
|
||||
{
|
||||
mISDN_write_frame(mISDNdevice, msg->data, mISDNport->upper_id | FLG_MSG_DOWN,
|
||||
MGR_TIMER | RESPONSE, 0, 0, NULL, TIMEOUT_1SEC);
|
||||
|
||||
PDEBUG(DEBUG_ISDN, "timer-indication port %d it=%p\n", mISDNport->portnum, it);
|
||||
test_and_clear_bit(FLG_TIMER_RUNING, (long unsigned int *)&it->Flags);
|
||||
ret = it->function(it->data);
|
||||
} else
|
||||
{
|
||||
PDEBUG(DEBUG_ISDN, "timer-indication not handled\n");
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* find the mISDNport that belongs to the stack */
|
||||
mISDNport = mISDNport_first;
|
||||
while(mISDNport)
|
||||
{
|
||||
if ((frm->prim==(MGR_TIMER | INDICATION)) && mISDNport->ntmode)
|
||||
{
|
||||
itimer_t *it = mISDNport->nst.tlist;
|
||||
|
||||
/* find timer */
|
||||
while(it)
|
||||
{
|
||||
if (it->id == (int)frm->addr)
|
||||
break;
|
||||
it = it->next;
|
||||
}
|
||||
if (it)
|
||||
{
|
||||
mISDN_write_frame(mISDNdevice, msg->data, mISDNport->upper_id | FLG_MSG_DOWN,
|
||||
MGR_TIMER | RESPONSE, 0, 0, NULL, TIMEOUT_1SEC);
|
||||
|
||||
PDEBUG(DEBUG_ISDN, "timer-indication %s port %d it=%p\n", (mISDNport->ntmode)?"NT":"TE", mISDNport->portnum, it);
|
||||
test_and_clear_bit(FLG_TIMER_RUNING, (long unsigned int *)&it->Flags);
|
||||
ret = it->function(it->data);
|
||||
break;
|
||||
}
|
||||
/* we will continue here because we have a timer for a different mISDNport */
|
||||
}
|
||||
//printf("comparing frm->addr %x with upper_id %x\n", frm->addr, mISDNport->upper_id);
|
||||
if ((frm->addr&STACK_ID_MASK) == (unsigned int)(mISDNport->upper_id&STACK_ID_MASK))
|
||||
{
|
||||
/* d-message */
|
||||
switch(frm->prim)
|
||||
{
|
||||
case MGR_SHORTSTATUS | INDICATION:
|
||||
case MGR_SHORTSTATUS | CONFIRM:
|
||||
switch(frm->dinfo) {
|
||||
case SSTATUS_L1_ACTIVATED:
|
||||
l1l2l3_trace_header(mISDNport, NULL, PH_ACTIVATE | (frm->prim & 0x3), DIRECTION_IN);
|
||||
end_trace();
|
||||
goto ss_act;
|
||||
case SSTATUS_L1_DEACTIVATED:
|
||||
l1l2l3_trace_header(mISDNport, NULL, PH_DEACTIVATE | (frm->prim & 0x3), DIRECTION_IN);
|
||||
end_trace();
|
||||
goto ss_deact;
|
||||
case SSTATUS_L2_ESTABLISHED:
|
||||
l1l2l3_trace_header(mISDNport, NULL, DL_ESTABLISH | (frm->prim & 0x3), DIRECTION_IN);
|
||||
end_trace();
|
||||
goto ss_estab;
|
||||
case SSTATUS_L2_RELEASED:
|
||||
l1l2l3_trace_header(mISDNport, NULL, DL_RELEASE | (frm->prim & 0x3), DIRECTION_IN);
|
||||
end_trace();
|
||||
goto ss_rel;
|
||||
}
|
||||
break;
|
||||
|
||||
case PH_ACTIVATE | CONFIRM:
|
||||
case PH_ACTIVATE | INDICATION:
|
||||
l1l2l3_trace_header(mISDNport, NULL, frm->prim, DIRECTION_IN);
|
||||
end_trace();
|
||||
if (mISDNport->ntmode)
|
||||
{
|
||||
mISDNport->l1link = 1;
|
||||
setup_queue(mISDNport, 1);
|
||||
goto l1_msg;
|
||||
}
|
||||
ss_act:
|
||||
mISDNport->l1link = 1;
|
||||
setup_queue(mISDNport, 1);
|
||||
break;
|
||||
|
||||
case PH_DEACTIVATE | CONFIRM:
|
||||
case PH_DEACTIVATE | INDICATION:
|
||||
l1l2l3_trace_header(mISDNport, NULL, frm->prim, DIRECTION_IN);
|
||||
end_trace();
|
||||
if (mISDNport->ntmode)
|
||||
{
|
||||
mISDNport->l1link = 0;
|
||||
setup_queue(mISDNport, 0);
|
||||
goto l1_msg;
|
||||
}
|
||||
ss_deact:
|
||||
mISDNport->l1link = 0;
|
||||
setup_queue(mISDNport, 0);
|
||||
break;
|
||||
|
||||
case PH_CONTROL | CONFIRM:
|
||||
case PH_CONTROL | INDICATION:
|
||||
PDEBUG(DEBUG_ISDN, "Received PH_CONTROL for port %d (%s).\n", mISDNport->portnum, mISDNport->ifport->interface->name);
|
||||
break;
|
||||
|
||||
case DL_ESTABLISH | INDICATION:
|
||||
case DL_ESTABLISH | CONFIRM:
|
||||
l1l2l3_trace_header(mISDNport, NULL, frm->prim, DIRECTION_IN);
|
||||
end_trace();
|
||||
if (!mISDNport->ntmode) break; /* !!!!!!!!!!!!!!!! */
|
||||
ss_estab:
|
||||
if (mISDNport->l2establish)
|
||||
{
|
||||
mISDNport->l2establish = 0;
|
||||
PDEBUG(DEBUG_ISDN, "the link became active before l2establish timer expiry.\n");
|
||||
}
|
||||
mISDNport->l2link = 1;
|
||||
break;
|
||||
|
||||
case DL_RELEASE | INDICATION:
|
||||
case DL_RELEASE | CONFIRM:
|
||||
l1l2l3_trace_header(mISDNport, NULL, frm->prim, DIRECTION_IN);
|
||||
end_trace();
|
||||
if (!mISDNport->ntmode) break; /* !!!!!!!!!!!!!!!! */
|
||||
ss_rel:
|
||||
mISDNport->l2link = 0;
|
||||
if (mISDNport->ptp)
|
||||
{
|
||||
time(&mISDNport->l2establish);
|
||||
PDEBUG(DEBUG_ISDN, "because we are ptp, we set a l2establish timer.\n");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
l1_msg:
|
||||
PDEBUG(DEBUG_STACK, "GOT d-msg from %s port %d prim 0x%x dinfo 0x%x addr 0x%x\n", (mISDNport->ntmode)?"NT":"TE", mISDNport->portnum, frm->prim, frm->dinfo, frm->addr);
|
||||
if (frm->dinfo==(signed long)0xffffffff && frm->prim==(PH_DATA|CONFIRM))
|
||||
{
|
||||
PERROR("SERIOUS BUG, dinfo == 0xffffffff, prim == PH_DATA | CONFIRM !!!!\n");
|
||||
}
|
||||
/* d-message */
|
||||
if (mISDNport->ntmode)
|
||||
{
|
||||
/* l1-data enters the nt-mode library */
|
||||
nst = &mISDNport->nst;
|
||||
if (nst->l1_l2(nst, msg))
|
||||
free_msg(msg);
|
||||
return(1);
|
||||
} else
|
||||
{
|
||||
/* l3-data is sent to pbx */
|
||||
if (stack2manager_te(mISDNport, msg))
|
||||
free_msg(msg);
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
if ((frm->addr&MASTER_ID_MASK) == (unsigned int)(mISDNport->upper_id&MASTER_ID_MASK))
|
||||
break;
|
||||
}
|
||||
//PDEBUG(DEBUG_ISDN, "flg:%d upper_id=%x addr=%x\n", (frm->addr&FLG_CHILD_STACK), (mISDNport->b_addr[0])&(~IF_CHILDMASK), (frm->addr)&(~IF_CHILDMASK));
|
||||
/* check if child, and if parent stack match */
|
||||
if ((frm->addr&FLG_CHILD_STACK) && (((unsigned int)(mISDNport->b_addr[0])&(~CHILD_ID_MASK)&STACK_ID_MASK) == ((frm->addr)&(~CHILD_ID_MASK)&STACK_ID_MASK)))
|
||||
{
|
||||
/* b-message */
|
||||
switch(frm->prim)
|
||||
{
|
||||
/* we don't care about confirms, we use rx data to sync tx */
|
||||
case PH_DATA | CONFIRM:
|
||||
case DL_DATA | CONFIRM:
|
||||
break;
|
||||
|
||||
/* we receive audio data, we respond to it AND we send tones */
|
||||
case PH_DATA | INDICATION:
|
||||
case DL_DATA | INDICATION:
|
||||
case PH_CONTROL | INDICATION:
|
||||
i = 0;
|
||||
while(i < mISDNport->b_num)
|
||||
{
|
||||
if ((unsigned int)(mISDNport->b_addr[i]&STACK_ID_MASK) == (frm->addr&STACK_ID_MASK))
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
if (i == mISDNport->b_num)
|
||||
{
|
||||
PERROR("unhandled b-message (address 0x%x).\n", frm->addr);
|
||||
break;
|
||||
}
|
||||
if (mISDNport->b_port[i])
|
||||
{
|
||||
//PERROR("port sech: %s data\n", mISDNport->b_port[i]->p_name);
|
||||
mISDNport->b_port[i]->bchannel_receive(frm);
|
||||
} else
|
||||
PDEBUG(DEBUG_BCHANNEL, "b-channel is not associated to an ISDNPort (address 0x%x), ignoring.\n", frm->addr);
|
||||
break;
|
||||
|
||||
case PH_ACTIVATE | INDICATION:
|
||||
case DL_ESTABLISH | INDICATION:
|
||||
case PH_ACTIVATE | CONFIRM:
|
||||
case DL_ESTABLISH | CONFIRM:
|
||||
PDEBUG(DEBUG_BCHANNEL, "DL_ESTABLISH confirm: bchannel is now activated (address 0x%x).\n", frm->addr);
|
||||
i = 0;
|
||||
while(i < mISDNport->b_num)
|
||||
{
|
||||
if ((unsigned int)(mISDNport->b_addr[i]&STACK_ID_MASK) == (frm->addr&STACK_ID_MASK))
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
if (i == mISDNport->b_num)
|
||||
{
|
||||
PERROR("unhandled b-establish (address 0x%x).\n", frm->addr);
|
||||
break;
|
||||
}
|
||||
bchannel_event(mISDNport, i, B_EVENT_ACTIVATED);
|
||||
break;
|
||||
|
||||
case PH_DEACTIVATE | INDICATION:
|
||||
case DL_RELEASE | INDICATION:
|
||||
case PH_DEACTIVATE | CONFIRM:
|
||||
case DL_RELEASE | CONFIRM:
|
||||
PDEBUG(DEBUG_BCHANNEL, "DL_RELEASE confirm: bchannel is now de-activated (address 0x%x).\n", frm->addr);
|
||||
i = 0;
|
||||
while(i < mISDNport->b_num)
|
||||
{
|
||||
if ((unsigned int)(mISDNport->b_addr[i]&STACK_ID_MASK) == (frm->addr&STACK_ID_MASK))
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
if (i == mISDNport->b_num)
|
||||
{
|
||||
PERROR("unhandled b-release (address 0x%x).\n", frm->addr);
|
||||
break;
|
||||
}
|
||||
bchannel_event(mISDNport, i, B_EVENT_DEACTIVATED);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
mISDNport = mISDNport->next;
|
||||
}
|
||||
if (!mISDNport)
|
||||
{
|
||||
if (frm->prim == (MGR_TIMER | INDICATION))
|
||||
PERROR("unhandled timer indication message: prim(0x%x) addr(0x%x) msg->len(%d)\n", frm->prim, frm->addr, msg->len);
|
||||
else
|
||||
PERROR("unhandled message: prim(0x%x) addr(0x%x) msg->len(%d)\n", frm->prim, frm->addr, msg->len);
|
||||
// PERROR("test: is_child: %x of stack %x == %x (baddr %x frm %x)\n", (frm->addr&FLG_CHILD_STACK), ((unsigned int)(mISDNport_first->b_addr[0])&(~CHILD_ID_MASK)&STACK_ID_MASK), ((frm->addr)&(~CHILD_ID_MASK)&STACK_ID_MASK), mISDNport_first->b_addr[0], frm->addr);
|
||||
PERROR("message belongs to no mISDNport: prim(0x%x) addr(0x%x) msg->len(%d)\n", frm->prim, frm->addr, msg->len);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* master stack */
|
||||
if (!(frm->addr&FLG_CHILD_STACK))
|
||||
{
|
||||
/* d-message */
|
||||
switch(frm->prim)
|
||||
{
|
||||
case MGR_SHORTSTATUS | INDICATION:
|
||||
case MGR_SHORTSTATUS | CONFIRM:
|
||||
switch(frm->dinfo) {
|
||||
case SSTATUS_L1_ACTIVATED:
|
||||
l1l2l3_trace_header(mISDNport, NULL, PH_ACTIVATE | (frm->prim & 0x3), DIRECTION_IN);
|
||||
end_trace();
|
||||
goto ss_act;
|
||||
case SSTATUS_L1_DEACTIVATED:
|
||||
l1l2l3_trace_header(mISDNport, NULL, PH_DEACTIVATE | (frm->prim & 0x3), DIRECTION_IN);
|
||||
end_trace();
|
||||
goto ss_deact;
|
||||
case SSTATUS_L2_ESTABLISHED:
|
||||
l1l2l3_trace_header(mISDNport, NULL, DL_ESTABLISH | (frm->prim & 0x3), DIRECTION_IN);
|
||||
end_trace();
|
||||
goto ss_estab;
|
||||
case SSTATUS_L2_RELEASED:
|
||||
l1l2l3_trace_header(mISDNport, NULL, DL_RELEASE | (frm->prim & 0x3), DIRECTION_IN);
|
||||
end_trace();
|
||||
goto ss_rel;
|
||||
}
|
||||
break;
|
||||
|
||||
case PH_ACTIVATE | CONFIRM:
|
||||
case PH_ACTIVATE | INDICATION:
|
||||
l1l2l3_trace_header(mISDNport, NULL, frm->prim, DIRECTION_IN);
|
||||
end_trace();
|
||||
if (mISDNport->ntmode)
|
||||
{
|
||||
mISDNport->l1link = 1;
|
||||
setup_queue(mISDNport, 1);
|
||||
goto l1_msg;
|
||||
}
|
||||
ss_act:
|
||||
mISDNport->l1link = 1;
|
||||
setup_queue(mISDNport, 1);
|
||||
break;
|
||||
|
||||
case PH_DEACTIVATE | CONFIRM:
|
||||
case PH_DEACTIVATE | INDICATION:
|
||||
l1l2l3_trace_header(mISDNport, NULL, frm->prim, DIRECTION_IN);
|
||||
end_trace();
|
||||
if (mISDNport->ntmode)
|
||||
{
|
||||
mISDNport->l1link = 0;
|
||||
setup_queue(mISDNport, 0);
|
||||
goto l1_msg;
|
||||
}
|
||||
ss_deact:
|
||||
mISDNport->l1link = 0;
|
||||
setup_queue(mISDNport, 0);
|
||||
break;
|
||||
|
||||
case PH_CONTROL | CONFIRM:
|
||||
case PH_CONTROL | INDICATION:
|
||||
PDEBUG(DEBUG_ISDN, "Received PH_CONTROL for port %d (%s).\n", mISDNport->portnum, mISDNport->ifport->interface->name);
|
||||
break;
|
||||
|
||||
case DL_ESTABLISH | INDICATION:
|
||||
case DL_ESTABLISH | CONFIRM:
|
||||
l1l2l3_trace_header(mISDNport, NULL, frm->prim, DIRECTION_IN);
|
||||
end_trace();
|
||||
if (!mISDNport->ntmode) break; /* !!!!!!!!!!!!!!!! */
|
||||
ss_estab:
|
||||
if (mISDNport->l2establish)
|
||||
{
|
||||
mISDNport->l2establish = 0;
|
||||
PDEBUG(DEBUG_ISDN, "the link became active before l2establish timer expiry.\n");
|
||||
}
|
||||
mISDNport->l2link = 1;
|
||||
break;
|
||||
|
||||
case DL_RELEASE | INDICATION:
|
||||
case DL_RELEASE | CONFIRM:
|
||||
l1l2l3_trace_header(mISDNport, NULL, frm->prim, DIRECTION_IN);
|
||||
end_trace();
|
||||
if (!mISDNport->ntmode) break; /* !!!!!!!!!!!!!!!! */
|
||||
ss_rel:
|
||||
mISDNport->l2link = 0;
|
||||
if (mISDNport->ptp)
|
||||
{
|
||||
time(&mISDNport->l2establish);
|
||||
PDEBUG(DEBUG_ISDN, "because we are ptp, we set a l2establish timer.\n");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
l1_msg:
|
||||
PDEBUG(DEBUG_STACK, "GOT d-msg from %s port %d prim 0x%x dinfo 0x%x addr 0x%x\n", (mISDNport->ntmode)?"NT":"TE", mISDNport->portnum, frm->prim, frm->dinfo, frm->addr);
|
||||
if (frm->dinfo==(signed long)0xffffffff && frm->prim==(PH_DATA|CONFIRM))
|
||||
{
|
||||
PERROR("SERIOUS BUG, dinfo == 0xffffffff, prim == PH_DATA | CONFIRM !!!!\n");
|
||||
}
|
||||
/* d-message */
|
||||
if (mISDNport->ntmode)
|
||||
{
|
||||
/* l1-data enters the nt-mode library */
|
||||
nst = &mISDNport->nst;
|
||||
if (nst->l1_l2(nst, msg))
|
||||
free_msg(msg);
|
||||
return(1);
|
||||
} else
|
||||
{
|
||||
/* l3-data is sent to pbx */
|
||||
if (stack2manager_te(mISDNport, msg))
|
||||
free_msg(msg);
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
} else
|
||||
/* child stack */
|
||||
{
|
||||
/* b-message */
|
||||
switch(frm->prim)
|
||||
{
|
||||
/* we don't care about confirms, we use rx data to sync tx */
|
||||
case PH_DATA | CONFIRM:
|
||||
case DL_DATA | CONFIRM:
|
||||
break;
|
||||
|
||||
/* we receive audio data, we respond to it AND we send tones */
|
||||
case PH_DATA | INDICATION:
|
||||
case DL_DATA | INDICATION:
|
||||
case PH_CONTROL | INDICATION:
|
||||
i = 0;
|
||||
while(i < mISDNport->b_num)
|
||||
{
|
||||
if ((unsigned int)(mISDNport->b_addr[i]&STACK_ID_MASK) == (frm->addr&STACK_ID_MASK))
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
if (i == mISDNport->b_num)
|
||||
{
|
||||
PERROR("unhandled b-message (address 0x%x).\n", frm->addr);
|
||||
break;
|
||||
}
|
||||
if (mISDNport->b_port[i])
|
||||
{
|
||||
//PERROR("port sech: %s data\n", mISDNport->b_port[i]->p_name);
|
||||
mISDNport->b_port[i]->bchannel_receive(frm);
|
||||
} else
|
||||
PDEBUG(DEBUG_BCHANNEL, "b-channel is not associated to an ISDNPort (address 0x%x), ignoring.\n", frm->addr);
|
||||
break;
|
||||
|
||||
case PH_ACTIVATE | INDICATION:
|
||||
case DL_ESTABLISH | INDICATION:
|
||||
case PH_ACTIVATE | CONFIRM:
|
||||
case DL_ESTABLISH | CONFIRM:
|
||||
PDEBUG(DEBUG_BCHANNEL, "DL_ESTABLISH confirm: bchannel is now activated (address 0x%x).\n", frm->addr);
|
||||
i = 0;
|
||||
while(i < mISDNport->b_num)
|
||||
{
|
||||
if ((unsigned int)(mISDNport->b_addr[i]&STACK_ID_MASK) == (frm->addr&STACK_ID_MASK))
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
if (i == mISDNport->b_num)
|
||||
{
|
||||
PERROR("unhandled b-establish (address 0x%x).\n", frm->addr);
|
||||
break;
|
||||
}
|
||||
bchannel_event(mISDNport, i, B_EVENT_ACTIVATED);
|
||||
break;
|
||||
|
||||
case PH_DEACTIVATE | INDICATION:
|
||||
case DL_RELEASE | INDICATION:
|
||||
case PH_DEACTIVATE | CONFIRM:
|
||||
case DL_RELEASE | CONFIRM:
|
||||
PDEBUG(DEBUG_BCHANNEL, "DL_RELEASE confirm: bchannel is now de-activated (address 0x%x).\n", frm->addr);
|
||||
i = 0;
|
||||
while(i < mISDNport->b_num)
|
||||
{
|
||||
if ((unsigned int)(mISDNport->b_addr[i]&STACK_ID_MASK) == (frm->addr&STACK_ID_MASK))
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
if (i == mISDNport->b_num)
|
||||
{
|
||||
PERROR("unhandled b-release (address 0x%x).\n", frm->addr);
|
||||
break;
|
||||
}
|
||||
bchannel_event(mISDNport, i, B_EVENT_DEACTIVATED);
|
||||
break;
|
||||
|
||||
default:
|
||||
PERROR("child message not handled: prim(0x%x) addr(0x%x) msg->len(%d)\n", frm->prim, frm->addr, msg->len);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
free_msg(msg);
|
||||
return(1);
|
||||
}
|
||||
|
|
21
todo.txt
21
todo.txt
|
@ -1,17 +1,10 @@
|
|||
BUG: no channels after reload interfaces
|
||||
BUG: audio is corrupted, shall we use fh or name for state of tones?
|
||||
BUG: release to NT not always work
|
||||
|
||||
make asterisk call implementation
|
||||
|
||||
new interface.conf (add remove ports by admin)
|
||||
|
||||
call to multiple endpoints (extensions)
|
||||
|
||||
trace with layers and filters
|
||||
- layer 1 and 2 state changes and messages
|
||||
- layer 3 isdn trace, process ids
|
||||
- messages between port, endpoint and call
|
||||
- port hunt and channel selection
|
||||
- dialing / routing
|
||||
- application process (action)
|
||||
- bchannel control (tones, dsp, filter, activation/deactivation)
|
||||
trace to debug, log and socket
|
||||
|
||||
avoid disconnect-collision (release if disconnect from both sides)
|
||||
|
||||
|
@ -20,11 +13,7 @@ display message during nothing/play
|
|||
Port -> Channel
|
||||
Call -> Link
|
||||
|
||||
connect_acknowledge
|
||||
|
||||
|
||||
maybe:
|
||||
|
||||
delay - per param setzen, lokal als mISDNsignal und remote mittels setup
|
||||
|
||||
|
||||
|
|
13
trace.c
13
trace.c
|
@ -124,8 +124,9 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch
|
|||
/* head */
|
||||
if (detail >= 3)
|
||||
{
|
||||
SCAT(trace_string, "------------------------------------------------------------------------------\n");
|
||||
/* "Port: 1 (BRI PTMP TE)" */
|
||||
if (port)
|
||||
if (trace.port)
|
||||
{
|
||||
mISDNport = mISDNport_first;
|
||||
while(mISDNport)
|
||||
|
@ -135,9 +136,13 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch
|
|||
mISDNport = mISDNport->next;
|
||||
}
|
||||
if (mISDNport)
|
||||
SPRINT(buffer, "Port: %d (%s %s %s)", port, (mISDNport->pri)?"PRI":"BRI", (mISDNport->ptp)?"PTP":"PTMP", (mISDNport->ntmode)?"NT":"TE");
|
||||
else
|
||||
SPRINT(buffer, "Port: %d (does not exist}\n", port);
|
||||
{
|
||||
SPRINT(buffer, "Port: %d (%s %s %s)", trace.port, (mISDNport->pri)?"PRI":"BRI", (mISDNport->ptp)?"PTP":"PTMP", (mISDNport->ntmode)?"NT":"TE");
|
||||
/* copy interface, if we have a port */
|
||||
if (mISDNport->ifport) if (mISDNport->ifport->interface)
|
||||
SCPY(trace.interface, mISDNport->ifport->interface->name);
|
||||
} else
|
||||
SPRINT(buffer, "Port: %d (does not exist)\n", trace.port);
|
||||
SCAT(trace_string, buffer);
|
||||
} else
|
||||
SCAT(trace_string, "Port: ---");
|
||||
|
|
Loading…
Reference in New Issue