/* exclusive channel requests must be in the list */
if (exclusive)
{
+ /* no exclusive channel */
if (!channel)
{
add_trace("conclusion", NULL, "exclusively requested channel not in list");
end_trace();
return(-6); // channel unacceptable
}
- i = selchannel->channel-1-(selchannel->channel>=17);
+ /* get index for channel */
+ i = channel-1-(channel>=17);
+ if (i < 0 || i >= p_m_mISDNport->b_num || channel == 16)
+ {
+ add_trace("conclusion", NULL, "exclusively requested channel outside interface range");
+ end_trace();
+ return(-6); // channel unacceptable
+ }
+ /* check if busy */
if (p_m_mISDNport->b_port[i] == NULL)
goto use_channel;
add_trace("conclusion", NULL, "exclusively requested channel is busy");
/* requested channels in list will be used */
if (channel)
{
- i = selchannel->channel-1-(selchannel->channel>=17);
+ /* get index for channel */
+ i = channel-1-(channel>=17);
+ if (i < 0 || i >= p_m_mISDNport->b_num || channel == 16)
+ {
+ add_trace("info", NULL, "requested channel %d outside interface range", channel);
+ } else /* if inside range (else) check if available */
if (p_m_mISDNport->b_port[i] == NULL)
goto use_channel;
}
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)
+ if (p_state == PORT_STATE_OUT_SETUP && p_m_mISDNport->l1link == 0)
{
cause = 27;
location = 5;
} else
{
dec_ie_cause(l3m, &location, &cause);
- add_trace("layer 1", NULL, (p_m_mISDNport->l1link)?"up":"down");
+ if (p_m_mISDNport->l1link < 0)
+ add_trace("layer 1", NULL, "unknown");
+ else
+ add_trace("layer 1", NULL, (p_m_mISDNport->l1link)?"up":"down");
}
end_trace();
if (location == LOCATION_PRIVATE_LOCAL)
{
l3_msg *l3m;
+ /* in case of sending complete, we proceed */
+ if (p_dialinginfo.sending_complete)
+ {
+ PDEBUG(DEBUG_ISDN, "sending proceeding instead of setup_acknowledge, because address is complete.\n");
+ message_proceeding(epoint_id, message_id, param);
+ return;
+ }
+
/* sending setup_acknowledge */
l3m = create_l3msg();
l1l2l3_trace_header(p_m_mISDNport, this, L3_SETUP_ACKNOWLEDGE_REQ, DIRECTION_OUT);