peerchan->pflags = 0;
ftdm_channel_close(&peerchan);
} else {
- ftdm_log_chan_msg(ftdmchan, FTDM_LOG_ERROR, "Odd, no peer chan\n");
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Odd, no peer chan\n");
}
}
break;
}
tstcrv = tap_pri_get_crv(pritap->pri, pritap->pcalls[i].callref);
if (tstcrv == crv) {
- ftdm_log(FTDM_LOG_DEBUG, "releasing slot %d in span %s used by callref %d/%p\n", i,
- pritap->span->name, crv, pritap->pcalls[i].callref);
- if (!pritap->pcalls[i].inuse) {
- ftdm_log(FTDM_LOG_ERROR, "slot %d in span %s used by callref %d/%p was released already?\n",
- i, pritap->span->name, crv, pritap->pcalls[i].callref);
+ if (pritap->pcalls[i].inuse) {
+ ftdm_log(FTDM_LOG_DEBUG, "releasing slot %d in span %s used by callref %d/%p\n", i,
+ pritap->span->name, crv, pritap->pcalls[i].callref);
+ pritap->pcalls[i].inuse = 0;
}
- pritap->pcalls[i].inuse = 0;
}
}
/* check that we already know about this call in the peer PRI (which was the one receiving the PRI_EVENT_RING event) */
if (!(pcall = tap_pri_get_pcall_bycrv(peertap, crv))) {
ftdm_log(FTDM_LOG_DEBUG,
- "ignoring proceeding in channel %s:%d:%d for callref %d since we don't know about it",
+ "ignoring proceeding in channel %s:%d:%d for callref %d since we don't know about it\n",
pritap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
break;
}
fchan->call_data = peerfchan;
peerfchan->call_data = fchan;
- ftdm_log_chan_msg(pcall->fchan, FTDM_LOG_NOTICE, "Starting new tapped call\n");
+ ftdm_log_chan(pcall->fchan, FTDM_LOG_NOTICE, "Starting new tapped call with callref %d\n", crv);
ftdm_set_state_locked(fchan, FTDM_CHANNEL_STATE_RING);
break;
pritap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
break;
}
+ ftdm_channel_lock(pcall->fchan);
ftdm_log_chan(pcall->fchan, FTDM_LOG_NOTICE, "Tapped call was answered in state %s\n", ftdm_channel_state2str(pcall->fchan->state));
- ftdm_set_pflag_locked(pcall->fchan, PRITAP_NETWORK_ANSWER);
- ftdm_set_state_locked(pcall->fchan, FTDM_CHANNEL_STATE_UP);
+ ftdm_set_pflag(pcall->fchan, PRITAP_NETWORK_ANSWER);
+ ftdm_set_state(pcall->fchan, FTDM_CHANNEL_STATE_UP);
+ ftdm_channel_unlock(pcall->fchan);
break;
case PRI_EVENT_HANGUP_REQ:
break;
}
- if (!pcall->fchan) {
- ftdm_log(FTDM_LOG_DEBUG,
- "ignoring hangup in channel %s:%d:%d for callref %d since we never got a channel",
- pritap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
- break;
+ if (pcall->fchan) {
+ fchan = pcall->fchan;
+ ftdm_channel_lock(fchan);
+ if (fchan->state < FTDM_CHANNEL_STATE_TERMINATING) {
+ ftdm_set_state(fchan, FTDM_CHANNEL_STATE_TERMINATING);
+ }
+ pcall->fchan = NULL; /* after this event we're not supposed to need to do anything with the channel anymore */
+ ftdm_channel_unlock(fchan);
}
- fchan = pcall->fchan;
- ftdm_set_state_locked(fchan, FTDM_CHANNEL_STATE_TERMINATING);
+ tap_pri_put_pcall(pritap, e->hangup.call);
+ tap_pri_put_pcall(peertap, e->hangup.call);
break;
case PRI_EVENT_HANGUP_ACK: