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);
}
*/
static msg_t *create_l3msg(int prim, int mt, int dinfo, int size, int ntmode)
{
- int i = 0;
msg_t *dmsg;
Q931_info_t *qi;
iframe_t *frm;
if (!ntmode)
size = sizeof(Q931_info_t)+2;
- while(i < 10)
+ if (ntmode)
{
- if (ntmode)
+ dmsg = prep_l3data_msg(prim, dinfo, size, 256, NULL);
+ if (dmsg)
{
- dmsg = prep_l3data_msg(prim, dinfo, size, 256, NULL);
- if (dmsg)
- {
- return(dmsg);
- }
- } else
+ return(dmsg);
+ }
+ } else
+ {
+ dmsg = alloc_msg(size+256+mISDN_HEADER_LEN+DEFAULT_HEADROOM);
+ if (dmsg)
{
- dmsg = alloc_msg(size+256+mISDN_HEADER_LEN+DEFAULT_HEADROOM);
- if (dmsg)
- {
- memset(msg_put(dmsg,size+mISDN_HEADER_LEN), 0, size+mISDN_HEADER_LEN);
- frm = (iframe_t *)dmsg->data;
- frm->prim = prim;
- frm->dinfo = dinfo;
- qi = (Q931_info_t *)(dmsg->data + mISDN_HEADER_LEN);
- qi->type = mt;
- return(dmsg);
- }
+ memset(msg_put(dmsg,size+mISDN_HEADER_LEN), 0, size+mISDN_HEADER_LEN);
+ frm = (iframe_t *)dmsg->data;
+ frm->prim = prim;
+ frm->dinfo = dinfo;
+ qi = (Q931_info_t *)(dmsg->data + mISDN_HEADER_LEN);
+ qi->type = mt;
+ return(dmsg);
}
-
- if (!i)
- PERROR("cannot allocate memory, trying again...\n");
- i++;
- usleep(50000);
}
- PERROR("cannot allocate memory, system overloaded.\n");
- exit(-1);
+
+ FATAL("Cannot allocate memory, system overloaded.\n");
+ exit(0); // make gcc happy
}
msg_t *create_l2msg(int prim, int dinfo, int size) /* NT only */
{
- int i = 0;
msg_t *dmsg;
- while(i < 10)
- {
- dmsg = prep_l3data_msg(prim, dinfo, size, 256, NULL);
- if (dmsg)
- return(dmsg);
+ dmsg = prep_l3data_msg(prim, dinfo, size, 256, NULL);
+ if (dmsg)
+ return(dmsg);
- if (!i)
- PERROR("cannot allocate memory, trying again...\n");
- i++;
- usleep(50000);
- }
- PERROR("cannot allocate memory, system overloaded.\n");
- exit(-1);
+ FATAL("Cannot allocate memory, system overloaded.\n");
+ exit(0); // make gcc happy
}
/*
end_trace();
/* activate our exclusive channel */
- bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_ACTIVATE);
+ bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_USE, p_m_exportremote);
} else
if (p_m_b_channel)
{
add_trace("connect", "channel", "%d", p_m_b_channel);
end_trace();
p_m_b_exclusive = 1; // we are done
- bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_ACTIVATE);
+ bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_USE, p_m_exportremote);
return(0);
}
end_trace();
/* activate channel given by remote */
- bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_ACTIVATE);
+ bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_USE, p_m_exportremote);
} else
if (p_m_b_reserve)
{
end_trace();
/* activate channel given by remote */
- bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_ACTIVATE);
+ bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_USE, p_m_exportremote);
} else
{
/*** we sent 'no channel available' ***/
p_m_b_exclusive = 1; // we are done
/* activate channel given by remote */
- bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_ACTIVATE);
+ bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_USE, p_m_exportremote);
return(0);
}
p_m_b_exclusive = 1; // we are done
/* activate channel given by remote */
- bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_ACTIVATE);
+ bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_USE, p_m_exportremote);
}
return(0);
dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST, MT_RELEASE_COMPLETE, p_m_d_l3id, sizeof(RELEASE_COMPLETE_t), p_m_d_ntmode);
release_complete = (RELEASE_COMPLETE_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE_COMPLETE | REQUEST, DIRECTION_OUT);
- enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_d_ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, -ret);
+ enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_mISDNport->locally)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, -ret);
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
new_state(PORT_STATE_RELEASE);
{
/* nt-library now gives us the id via CC_SETUP */
if (dinfo&(~0xff) == 0xff00)
- {
- PERROR("fatal software error: l3-stack gives us a process id 0xff00-0xffff\n");
- exit(-1);
- }
+ FATAL("l3-stack gives us a process id 0xff00-0xffff\n");
l1l2l3_trace_header(p_m_mISDNport, this, CC_NEW_CR | INDICATION, DIRECTION_IN);
if (p_m_d_l3id)
add_trace("callref", "old", "0x%x", p_m_d_l3id);
dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST, MT_RELEASE_COMPLETE, dinfo, sizeof(RELEASE_COMPLETE_t), p_m_d_ntmode);
release_complete = (RELEASE_COMPLETE_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE_COMPLETE | REQUEST, DIRECTION_OUT);
- enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_d_ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, 27); /* temporary unavailable */
+ enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_mISDNport->locally)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, 27); /* temporary unavailable */
add_trace("reason", NULL, "port blocked");
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST, MT_RELEASE_COMPLETE, dinfo, sizeof(RELEASE_COMPLETE_t), p_m_d_ntmode);
release_complete = (RELEASE_COMPLETE_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE_COMPLETE | REQUEST, DIRECTION_OUT);
- enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_d_ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, -ret);
+ enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_mISDNport->locally)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, -ret);
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
new_state(PORT_STATE_RELEASE);
p_m_delete = 1;
return;
}
- bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_ACTIVATE);
+ bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_USE, p_m_exportremote);
/* create endpoint */
if (p_epointlist)
- {
- PERROR("SOFTWARE ERROR: incoming call but already got an endpoint, exitting...\n");
- exit(-1);
- }
+ FATAL("Incoming call but already got an endpoint.\n");
if (!(epoint = new Endpoint(p_serial, 0)))
- {
- RELEASE_COMPLETE_t *release_complete;
-
- dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST, MT_RELEASE_COMPLETE, dinfo, sizeof(RELEASE_COMPLETE_t), p_m_d_ntmode);
- release_complete = (RELEASE_COMPLETE_t *)(dmsg->data + headerlen);
- l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE_COMPLETE | REQUEST, DIRECTION_OUT);
- enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_d_ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, 41); /* temporary failure */
- end_trace();
- msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
- new_state(PORT_STATE_RELEASE);
- p_m_delete = 1;
- return;
- }
+ FATAL("No memory for Endpoint instance\n");
if (!(epoint->ep_app = new DEFAULT_ENDPOINT_APP(epoint)))
- {
- PERROR("no memory for application\n");
- exit(-1);
- }
- if (!(epointlist_new(epoint->ep_serial)))
- {
- PERROR("no memory for epointlist\n");
- exit(-1);
- }
+ FATAL("No memory for Endpoint Application instance\n");
+ epointlist_new(epoint->ep_serial);
+
/* send setup message to endpoit */
message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_SETUP);
message->param.setup.isdn_port = p_m_portnum;
message->param.setup.port_type = p_type;
+ message->param.setup.dtmf = !p_m_mISDNport->ifport->nodtmf;
memcpy(&message->param.setup.dialinginfo, &p_dialinginfo, sizeof(struct dialing_info));
memcpy(&message->param.setup.callerinfo, &p_callerinfo, sizeof(struct caller_info));
memcpy(&message->param.setup.redirinfo, &p_redirinfo, sizeof(struct redir_info));
end_trace();
/* process channel */
- ret = received_first_reply_to_setup(prim, exclusive, channel);
+ ret = received_first_reply_to_setup(prim, channel, exclusive);
if (ret < 0)
{
message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_RELEASE);
dec_ie_redir_dn(proceeding->REDIR_DN, (Q931_info_t *)((unsigned long)data+headerlen), &type, &plan, &present, (unsigned char *)redir, sizeof(redir));
end_trace();
- ret = received_first_reply_to_setup(prim, exclusive, channel);
+ ret = received_first_reply_to_setup(prim, channel, exclusive);
if (ret < 0)
{
message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_RELEASE);
end_trace();
/* process channel */
- ret = received_first_reply_to_setup(prim, exclusive, channel);
+ ret = received_first_reply_to_setup(prim, channel, exclusive);
if (ret < 0)
{
message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_RELEASE);
/* select channel */
bchannel_before = p_m_b_channel;
- ret = received_first_reply_to_setup(prim, exclusive, channel);
+ ret = received_first_reply_to_setup(prim, channel, exclusive);
if (ret < 0)
{
message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_RELEASE);
break;
}
p_connectinfo.isdn_port = p_m_portnum;
- SCPY(p_connectinfo.interfaces, p_m_mISDNport->ifport->interface->name);
+ SCPY(p_connectinfo.interface, p_m_mISDNport->ifport->interface->name);
/* only in nt-mode we send connect ack. in te-mode it is done by stack itself or optional */
if (p_m_d_ntmode)
dec_ie_progress(disconnect->PROGRESS, (Q931_info_t *)((unsigned long)data+headerlen), &coding, &proglocation, &progress);
dec_ie_cause(disconnect->CAUSE, (Q931_info_t *)((unsigned long)data+headerlen), &location, &cause);
end_trace();
+ if (location == LOCATION_PRIVATE_LOCAL)
+ location = LOCATION_PRIVATE_REMOTE;
if (cause < 0)
cause = 16;
- /* release if we are remote sends us no tones */
- if (p_m_mISDNport->earlyb)
+ /* release if remote sends us no tones */
+ if (!p_m_mISDNport->earlyb)
{
RELEASE_t *release;
msg_t *dmsg;
dmsg = create_l3msg(CC_RELEASE | REQUEST, MT_RELEASE, dinfo, sizeof(RELEASE_t), p_m_d_ntmode);
release = (RELEASE_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE | REQUEST, DIRECTION_OUT);
- enc_ie_cause(&release->CAUSE, dmsg, (p_m_d_ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, 16); /* normal */
+ enc_ie_cause(&release->CAUSE, dmsg, (p_m_mISDNport->locally)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, 16); /* normal */
add_trace("reason", NULL, "no remote patterns");
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
}
dec_ie_cause(disconnect->CAUSE, (Q931_info_t *)((unsigned long)data+headerlen), &location, &cause);
end_trace();
+ if (location == LOCATION_PRIVATE_LOCAL)
+ location = LOCATION_PRIVATE_REMOTE;
/* collect cause */
- if (cause == CAUSE_REJECTED) /* call rejected */
- {
- p_m_d_collect_cause = CAUSE_REJECTED;
- p_m_d_collect_location = location;
- } else
- if (cause==CAUSE_NORMAL && p_m_d_collect_cause!=CAUSE_REJECTED) /* reject via hangup */
- {
- p_m_d_collect_cause = CAUSE_NORMAL;
- p_m_d_collect_location = location;
- } else
- if (cause==CAUSE_BUSY && p_m_d_collect_cause!=CAUSE_REJECTED && p_m_d_collect_cause!=CAUSE_NORMAL) /* busy */
- {
- p_m_d_collect_cause = CAUSE_BUSY;
- p_m_d_collect_location = location;
- } else
- if (cause==CAUSE_OUTOFORDER && p_m_d_collect_cause!=CAUSE_BUSY && p_m_d_collect_cause!=CAUSE_REJECTED && p_m_d_collect_cause!=CAUSE_NORMAL) /* no L1 */
- {
- p_m_d_collect_cause = CAUSE_OUTOFORDER;
- p_m_d_collect_location = location;
- } else
- if (cause!=0 && cause!=CAUSE_NOUSER && p_m_d_collect_cause!=CAUSE_OUTOFORDER && p_m_d_collect_cause!=CAUSE_BUSY && p_m_d_collect_cause!=CAUSE_REJECTED && p_m_d_collect_cause!=CAUSE_NORMAL) /* anything if cause exists and not 18 */
- {
- p_m_d_collect_cause = cause;
- p_m_d_collect_location = location;
- }
+ collect_cause(&p_m_d_collect_cause, &p_m_d_collect_location, cause, location);
add_trace("new-cause", "location", "%d", p_m_d_collect_location);
add_trace("new-cause", "value", "%d", p_m_d_collect_cause);
l1l2l3_trace_header(p_m_mISDNport, this, prim, DIRECTION_IN);
dec_ie_cause(release->CAUSE, (Q931_info_t *)((unsigned long)data+headerlen), &location, &cause);
end_trace();
+ if (location == LOCATION_PRIVATE_LOCAL)
+ location = LOCATION_PRIVATE_REMOTE;
if (cause < 0)
cause = 16;
dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST, MT_RELEASE_COMPLETE, dinfo, sizeof(RELEASE_COMPLETE_t), p_m_d_ntmode);
release_complete = (RELEASE_COMPLETE_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE_COMPLETE | REQUEST, DIRECTION_OUT);
- enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_d_ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, 16);
+ enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_mISDNport->locally)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, 16);
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
}
p_m_delete = 1;
}
-/* CC_RELEASE_COMPLETE INDICATION */
+/* CC_RELEASE_COMPLETE INDICATION (a reject) */
void Pdss1::release_complete_ind(unsigned long prim, unsigned long dinfo, void *data)
{
int headerlen = (p_m_d_ntmode)?mISDNUSER_HEAD_SIZE:mISDN_HEADER_LEN;
l1l2l3_trace_header(p_m_mISDNport, this, prim, DIRECTION_IN);
dec_ie_cause(release_complete->CAUSE, (Q931_info_t *)((unsigned long)data+headerlen), &location, &cause);
end_trace();
+ if (location == LOCATION_PRIVATE_LOCAL)
+ location = LOCATION_PRIVATE_REMOTE;
if (cause < 0)
cause = 16;
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);
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))
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)
{
dmsg = create_l3msg(CC_HOLD_REJECT | REQUEST, MT_HOLD_REJECT, dinfo, sizeof(HOLD_REJECT_t), p_m_d_ntmode);
hold_reject = (HOLD_REJECT_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_HOLD_REJECT | REQUEST, DIRECTION_OUT);
- enc_ie_cause(&hold_reject->CAUSE, dmsg, (p_m_d_ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, p_m_hold?101:31); /* normal unspecified / incompatible state */
+ enc_ie_cause(&hold_reject->CAUSE, dmsg, (p_m_mISDNport->locally)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, p_m_hold?101:31); /* normal unspecified / incompatible state */
add_trace("reason", NULL, "no endpoint");
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
dmsg = create_l3msg(CC_RETRIEVE_REJECT | REQUEST, MT_RETRIEVE_REJECT, dinfo, sizeof(RETRIEVE_REJECT_t), p_m_d_ntmode);
retrieve_reject = (RETRIEVE_REJECT_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_RETRIEVE_REJECT | REQUEST, DIRECTION_OUT);
- enc_ie_cause(&retrieve_reject->CAUSE, dmsg, (p_m_d_ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, cause);
+ enc_ie_cause(&retrieve_reject->CAUSE, dmsg, (p_m_mISDNport->locally)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, cause);
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
cause = -ret;
goto reject;
}
- bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_ACTIVATE);
+ bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_USE, p_m_exportremote);
/* set hold state */
p_m_hold = 0;
dmsg = create_l3msg(CC_SUSPEND_REJECT | REQUEST, MT_SUSPEND_REJECT, dinfo, sizeof(SUSPEND_REJECT_t), p_m_d_ntmode);
suspend_reject = (SUSPEND_REJECT_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_SUSPEND_REJECT | REQUEST, DIRECTION_OUT);
- enc_ie_cause(&suspend_reject->CAUSE, dmsg, (p_m_d_ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, -ret);
+ enc_ie_cause(&suspend_reject->CAUSE, dmsg, (p_m_mISDNport->locally)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, -ret);
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
{
/* nt-library now gives us the id via CC_RESUME */
if (dinfo&(~0xff) == 0xff00)
- {
- PERROR("fatal software error: l3-stack gives us a process id 0xff00-0xffff\n");
- exit(-1);
- }
+ FATAL("l3-stack gives us a process id 0xff00-0xffff\n");
l1l2l3_trace_header(p_m_mISDNport, this, CC_NEW_CR | INDICATION, DIRECTION_IN);
if (p_m_d_l3id)
add_trace("callref", "old", "0x%x", p_m_d_l3id);
dmsg = create_l3msg(CC_RESUME_REJECT | REQUEST, MT_RESUME_REJECT, dinfo, sizeof(RESUME_REJECT_t), p_m_d_ntmode);
resume_reject = (RESUME_REJECT_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_RESUME_REJECT | REQUEST, DIRECTION_OUT);
- enc_ie_cause(&resume_reject->CAUSE, dmsg, (p_m_d_ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, -ret);
+ enc_ie_cause(&resume_reject->CAUSE, dmsg, (p_m_mISDNport->locally)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, -ret);
if (ret == -27)
add_trace("reason", NULL, "port blocked");
end_trace();
p_m_delete = 1;
return;
}
- bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_ACTIVATE);
+ bchannel_event(p_m_mISDNport, p_m_b_index, B_EVENT_USE, p_m_exportremote);
/* create endpoint */
if (p_epointlist)
- {
- PERROR("SOFTWARE ERROR: incoming resume but already got an endpoint, exitting...\n");
- exit(-1);
- }
+ FATAL("Incoming resume but already got an endpoint.\n");
ret = -85; /* no call suspended */
epoint = epoint_first;
while(epoint)
if (!epoint)
goto reject;
- if (!(epointlist_new(epoint->ep_serial)))
- {
- PERROR("no memory for epointlist\n");
- exit(-1);
- }
+ epointlist_new(epoint->ep_serial);
if (!(epoint->portlist_new(p_serial, p_type, p_m_mISDNport->earlyb)))
- {
- PERROR("no memory for portlist\n");
- exit(-1);
- }
+ FATAL("No memory for portlist\n");
message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_RESUME);
message_put(message);
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:
}
p_m_d_l3id = 0;
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
- * NOTE: this only happens if the stack releases due to layer1
- * or layer2 breakdown. otherwhise a release is received first.
+ * this is because we don't get any response if a release_complete is received (or a release in release state)
*/
while(p_epointlist)
{
{
int ret;
+if (p_m_delete && p_m_d_l3id==0)
+ printf("ping! %d", p_serial);
if ((ret = PmISDN::handler()))
return(ret);
/* handle destruction */
if (p_m_delete && p_m_d_l3id==0)
{
+#warning remove
+PDEBUG(DEBUG_LOG, "JOLLY destroy object %d\n", p_serial);
+
delete this;
return(-1);
}
epointlist = epointlist->next;
}
if (!epointlist)
- {
- if (!(epointlist_new(epoint_id)))
- {
- PERROR("no memory for epointlist\n");
- exit(-1);
- }
- }
+ epointlist_new(epoint_id);
/* get channel */
exclusive = 0;
char *p = NULL;
/* we reject during incoming setup when we have no tones. also if we are in outgoing setup state */
- if ((p_state==PORT_STATE_IN_SETUP && !p_m_mISDNport->tones)
- || p_state==PORT_STATE_OUT_SETUP)
+// if ((p_state==PORT_STATE_IN_SETUP && !p_m_mISDNport->tones)
+if (/* ||*/ p_state==PORT_STATE_OUT_SETUP)
{
/* sending release to endpoint */
while(p_epointlist)
release_complete = (RELEASE_COMPLETE_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE_COMPLETE | REQUEST, DIRECTION_OUT);
/* send cause */
- enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_d_ntmode && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause);
+ enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_mISDNport->locally && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause);
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
new_state(PORT_STATE_RELEASE);
return;
}
- /* NT-MODE in setup state we must send PROCEEDING first */
+ /* workarround: NT-MODE in setup state we must send PROCEEDING first to make it work */
if (p_state==PORT_STATE_IN_SETUP)
{
CALL_PROCEEDING_t *proceeding;
if (p_m_mISDNport->tones)
enc_ie_progress(&disconnect->PROGRESS, dmsg, 0, p_m_d_ntmode?1:5, 8);
/* send cause */
- enc_ie_cause(&disconnect->CAUSE, dmsg, (p_m_d_ntmode && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause);
+ enc_ie_cause(&disconnect->CAUSE, dmsg, (p_m_mISDNport->locally && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause);
/* send display */
if (param->disconnectinfo.display[0])
p = param->disconnectinfo.display;
class Endpoint *epoint;
char *p = NULL;
- /* if we have incoming disconnected, we may release */
- if (p_state==PORT_STATE_IN_DISCONNECT
- || p_state==PORT_STATE_OUT_DISCONNECT)
+ /*
+ * we may only release during incomming disconnect state.
+ * this means that the endpoint doesnt require audio anymore
+ */
+ if (p_state == PORT_STATE_IN_DISCONNECT)
{
/* sending release */
dmsg = create_l3msg(CC_RELEASE | REQUEST, MT_RELEASE, p_m_d_l3id, sizeof(RELEASE_t), p_m_d_ntmode);
release = (RELEASE_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE | REQUEST, DIRECTION_OUT);
/* send cause */
- enc_ie_cause(&release->CAUSE, dmsg, (p_m_d_ntmode && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause);
+ enc_ie_cause(&release->CAUSE, dmsg, (p_m_mISDNport->locally && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause);
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;
+ // wait for callref to be released
return;
+
}
- /* if we are on outgoing/incoming call setup, we may release complete */
- if (p_state==PORT_STATE_OUT_SETUP
- || p_state==PORT_STATE_IN_SETUP
-// NOTE: a bug in mISDNuser (see disconnect_req_out !!!)
- || p_state==PORT_STATE_OUT_PROCEEDING)
+ /*
+ * if we are on incoming call setup, we may reject by sending a release_complete
+ * also on outgoing call setup, we send a release complete, BUT this is not conform. (i don't know any other way)
+ */
+ if (p_state==PORT_STATE_IN_SETUP
+ || p_state==PORT_STATE_OUT_SETUP)
+// // NOTE: a bug in mISDNuser (see disconnect_req_out !!!)
+// || p_state==PORT_STATE_OUT_DISCO)
{
- /* sending release */
+#warning remove me
+PDEBUG(DEBUG_LOG, "JOLLY sending release complete %d\n", p_serial);
+ /* sending release complete */
dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST, MT_RELEASE_COMPLETE, p_m_d_l3id, sizeof(RELEASE_COMPLETE_t), p_m_d_ntmode);
release_complete = (RELEASE_COMPLETE_t *)(dmsg->data + headerlen);
l1l2l3_trace_header(p_m_mISDNport, this, CC_RELEASE | REQUEST, DIRECTION_OUT);
/* send cause */
- enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_d_ntmode && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause);
+ enc_ie_cause(&release_complete->CAUSE, dmsg, (p_m_mISDNport->locally && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause);
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
new_state(PORT_STATE_RELEASE);
- goto remove_endpoint;
+ /* remove epoint */
+ free_epointid(epoint_id);
+#if 0
+ /* remove process */
+ 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;
+#endif
+ // wait for callref to be released
+ return;
}
+#if 0
+wirklich erst proceeding?:
/* NT-MODE in setup state we must send PROCEEDING first */
if (p_m_d_ntmode && p_state==PORT_STATE_IN_SETUP)
{
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
}
+#endif
/* sending disconnect */
dmsg = create_l3msg(CC_DISCONNECT | REQUEST, MT_DISCONNECT, p_m_d_l3id, sizeof(DISCONNECT_t), p_m_d_ntmode);
if (p_m_mISDNport->tones)
enc_ie_progress(&disconnect->PROGRESS, dmsg, 0, p_m_d_ntmode?1:5, 8);
/* send cause */
- enc_ie_cause(&disconnect->CAUSE, dmsg, (p_m_d_ntmode && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause);
+ enc_ie_cause(&disconnect->CAUSE, dmsg, (p_m_mISDNport->locally && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause);
/* send display */
epoint = find_epoint_id(epoint_id);
if (param->disconnectinfo.display[0])
enc_ie_display(&disconnect->DISPLAY, dmsg, (unsigned char *)p);
end_trace();
msg_queue_tail(&p_m_mISDNport->downqueue, dmsg);
- new_state(PORT_STATE_RELEASE);
+ new_state(PORT_STATE_OUT_DISCONNECT);
+ /* remove epoint */
free_epointid(epoint_id);
-// p_m_delete = 1;
+ // wait for release and callref to be released
+#warning remove me
+PDEBUG(DEBUG_LOG, "JOLLY sending disconnect %d\n", p_serial);
}
break;
}
if (p_epointlist && p_state==PORT_STATE_IDLE)
- {
- PERROR("Pdss1(%s): software error: epoint pointer is set in idle state, how bad!! exitting.\n", p_name);
- exit(-1);
- }
+ FATAL("Pdss1(%s): epoint pointer is set in idle state, how bad!!\n", p_name);
/* note: pri is a special case, because links must be up for pri */
if (p_m_mISDNport->l1link || p_m_mISDNport->pri || !p_m_mISDNport->ntmode || p_state!=PORT_STATE_IDLE)
{
memcpy(&p_m_d_queue->param, param, sizeof(union parameter));
/* attach us */
if (!(epointlist_new(epoint_id)))
- {
- PERROR("no memory for epointlist\n");
- exit(-1);
- }
+ FATAL("No memory for epointlist\n");
/* activate link */
PDEBUG(DEBUG_ISDN, "the L1 is down, we try to establish the link NT portnum=%d (%s).\n", p_m_mISDNport->portnum, p_name);
act.prim = PH_ACTIVATE | REQUEST;
time(&mISDNport->l2establish);
PDEBUG(DEBUG_ISDN, "because we are ptp, we set a l2establish timer.\n");
}
+#warning debugging usleep crash
+ printf("JOLLY release port %d\n", mISDNport->portnum);
+ usleep(1);
break;
case CC_SETUP | INDICATION:
/* 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)))
- {
- RELEASE_COMPLETE_t *release_complete;
- msg_t *dmsg;
- PERROR("FATAL ERROR: cannot create port object.\n");
- dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST, MT_RELEASE_COMPLETE, hh->dinfo, sizeof(RELEASE_COMPLETE_t), mISDNport->ntmode);
- release_complete = (RELEASE_COMPLETE_t *)(dmsg->data + mISDN_HEADER_LEN);
- l1l2l3_trace_header(mISDNport, NULL, CC_RELEASE_COMPLETE | REQUEST, DIRECTION_OUT);
- enc_ie_cause_standalone(mISDNport->ntmode?&release_complete->CAUSE:NULL, dmsg, (mISDNport->ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, 47);
- end_trace();
- msg_queue_tail(&mISDNport->downqueue, dmsg);
- break;
- }
+ FATAL("Cannot create Port instance.\n");
pdss1->message_isdn(hh->prim, hh->dinfo, msg->data);
break;
/* 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)))
- {
- SUSPEND_REJECT_t *suspend_reject;
- msg_t *dmsg;
-
- PERROR("FATAL ERROR: cannot create port object.\n");
- dmsg = create_l3msg(CC_SUSPEND_REJECT | REQUEST, MT_SUSPEND_REJECT, hh->dinfo, sizeof(SUSPEND_REJECT_t), mISDNport->ntmode);
- suspend_reject = (SUSPEND_REJECT_t *)(dmsg->data + mISDN_HEADER_LEN);
- l1l2l3_trace_header(mISDNport, NULL, CC_SUSPEND_REJECT | REQUEST, DIRECTION_OUT);
- enc_ie_cause_standalone(mISDNport->ntmode?&suspend_reject->CAUSE:NULL, dmsg, (mISDNport->ntmode)?1:0, 47);
- end_trace();
- msg_queue_tail(&mISDNport->downqueue, dmsg);
- break;
- }
+ FATAL("Cannot create Port instance.\n");
pdss1->message_isdn(hh->prim, hh->dinfo, msg->data);
break;
/* 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)))
- {
- RELEASE_COMPLETE_t *release_complete;
- msg_t *dmsg;
-
- PERROR("FATAL ERROR: cannot create port object.\n");
- dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST, MT_RELEASE_COMPLETE, frm->dinfo, sizeof(RELEASE_COMPLETE_t), mISDNport->ntmode);
- release_complete = (RELEASE_COMPLETE_t *)(dmsg->data + mISDN_HEADER_LEN);
- l1l2l3_trace_header(mISDNport, NULL, CC_RELEASE_COMPLETE | REQUEST, DIRECTION_OUT);
- enc_ie_cause_standalone(mISDNport->ntmode?&release_complete->CAUSE:NULL, dmsg, (mISDNport->ntmode)?LOCATION_PRIVATE_LOCAL:LOCATION_PRIVATE_REMOTE, 47);
- end_trace();
- msg_queue_tail(&mISDNport->downqueue, dmsg);
- free_msg(msg);
- return(0);
- }
+ if (!(pdss1 = new Pdss1(PORT_TYPE_DSS1_TE_IN, mISDNport, name, NULL, 0, 0)))
+ FATAL("Cannot create Port instance.\n");
/* l3id will be set from dinfo at message_isdn */
pdss1->message_isdn(frm->prim, frm->dinfo, msg->data);
free_msg(msg);