mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-07-15 19:40:06 +00:00
ftmod_isdn: Major cleanup: use accessor functions, coding-style, etc.
Signed-off-by: Stefan Knoblich <s.knoblich@axsentis.de>
This commit is contained in:
parent
47af9933c4
commit
b0cca151e6
@ -56,9 +56,22 @@
|
|||||||
|
|
||||||
static const char *ftdm_span_get_trunk_type_str(const ftdm_span_t *span)
|
static const char *ftdm_span_get_trunk_type_str(const ftdm_span_t *span)
|
||||||
{
|
{
|
||||||
|
assert(span);
|
||||||
return ftdm_trunk_type2str(span->trunk_type);
|
return ftdm_trunk_type2str(span->trunk_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ftdm_channel_get_state(const ftdm_channel_t *chan)
|
||||||
|
{
|
||||||
|
assert(chan);
|
||||||
|
return chan->state;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ftdm_channel_get_last_state(const ftdm_channel_t *chan)
|
||||||
|
{
|
||||||
|
assert(chan);
|
||||||
|
return chan->last_state;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************************
|
/*****************************************************************************************
|
||||||
* PCAP
|
* PCAP
|
||||||
* Based on Helmut Kuper's (<helmut.kuper@ewetel.de>) implementation,
|
* Based on Helmut Kuper's (<helmut.kuper@ewetel.de>) implementation,
|
||||||
@ -95,13 +108,8 @@ static ftdm_status_t isdn_pcap_open(struct ftdm_isdn_data *isdn, char *filename)
|
|||||||
{
|
{
|
||||||
struct pcap_context *pcap = NULL;
|
struct pcap_context *pcap = NULL;
|
||||||
|
|
||||||
if (!isdn) {
|
if (!isdn || ftdm_strlen_zero(filename))
|
||||||
return FTDM_FAIL;
|
return FTDM_FAIL;
|
||||||
}
|
|
||||||
|
|
||||||
if (ftdm_strlen_zero(filename)) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
pcap = malloc(sizeof(struct pcap_context));
|
pcap = malloc(sizeof(struct pcap_context));
|
||||||
if (!pcap) {
|
if (!pcap) {
|
||||||
@ -121,23 +129,20 @@ static ftdm_status_t isdn_pcap_open(struct ftdm_isdn_data *isdn, char *filename)
|
|||||||
|
|
||||||
pcap->dump = pcap_dump_open(pcap->handle, pcap->filename);
|
pcap->dump = pcap_dump_open(pcap->handle, pcap->filename);
|
||||||
if (!pcap->dump) {
|
if (!pcap->dump) {
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to open capture file: %s\n", pcap_geterr(pcap->handle));
|
ftdm_log(FTDM_LOG_ERROR, "Failed to open capture file: '%s'\n", pcap_geterr(pcap->handle));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_INFO, "Capture file \"%s\" opened\n", pcap->filename);
|
ftdm_log(FTDM_LOG_INFO, "Capture file '%s' opened\n", pcap->filename);
|
||||||
|
|
||||||
isdn->pcap = pcap;
|
isdn->pcap = pcap;
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (pcap->handle) {
|
if (pcap->handle)
|
||||||
pcap_close(pcap->handle);
|
pcap_close(pcap->handle);
|
||||||
}
|
if (pcap->filename)
|
||||||
if (pcap->filename) {
|
|
||||||
free(pcap->filename);
|
free(pcap->filename);
|
||||||
}
|
|
||||||
|
|
||||||
free(pcap);
|
free(pcap);
|
||||||
|
|
||||||
@ -149,9 +154,9 @@ static ftdm_status_t isdn_pcap_close(struct ftdm_isdn_data *isdn)
|
|||||||
struct pcap_context *pcap = NULL;
|
struct pcap_context *pcap = NULL;
|
||||||
long size;
|
long size;
|
||||||
|
|
||||||
if (!isdn || !isdn->pcap) {
|
if (!isdn || !isdn->pcap)
|
||||||
return FTDM_FAIL;
|
return FTDM_FAIL;
|
||||||
}
|
|
||||||
pcap = isdn->pcap;
|
pcap = isdn->pcap;
|
||||||
|
|
||||||
isdn->flags &= ~(FTDM_ISDN_CAPTURE | FTDM_ISDN_CAPTURE_L3ONLY);
|
isdn->flags &= ~(FTDM_ISDN_CAPTURE | FTDM_ISDN_CAPTURE_L3ONLY);
|
||||||
@ -160,7 +165,7 @@ static ftdm_status_t isdn_pcap_close(struct ftdm_isdn_data *isdn)
|
|||||||
pcap_dump_flush(pcap->dump);
|
pcap_dump_flush(pcap->dump);
|
||||||
|
|
||||||
size = pcap_dump_ftell(pcap->dump);
|
size = pcap_dump_ftell(pcap->dump);
|
||||||
ftdm_log(FTDM_LOG_INFO, "File \"%s\" captured %ld bytes of data\n", pcap->filename, size);
|
ftdm_log(FTDM_LOG_INFO, "File '%s' captured %ld bytes of data\n", pcap->filename, size);
|
||||||
|
|
||||||
pcap_dump_close(pcap->dump);
|
pcap_dump_close(pcap->dump);
|
||||||
pcap_close(pcap->handle);
|
pcap_close(pcap->handle);
|
||||||
@ -214,9 +219,8 @@ static ftdm_status_t isdn_pcap_write(struct ftdm_isdn_data *isdn, unsigned char
|
|||||||
int offset = sizeof(struct isdn_sll_hdr);
|
int offset = sizeof(struct isdn_sll_hdr);
|
||||||
int nbytes;
|
int nbytes;
|
||||||
|
|
||||||
if (!isdn || !isdn->pcap || !buf || !len) {
|
if (!isdn || !isdn->pcap || !buf || !len)
|
||||||
return FTDM_FAIL;
|
return FTDM_FAIL;
|
||||||
}
|
|
||||||
|
|
||||||
pcap = isdn->pcap;
|
pcap = isdn->pcap;
|
||||||
|
|
||||||
@ -451,8 +455,8 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
|
|||||||
int fail = 1;
|
int fail = 1;
|
||||||
|
|
||||||
new_chan = NULL;
|
new_chan = NULL;
|
||||||
if (caller_data->chan_id < FTDM_MAX_CHANNELS_SPAN && caller_data->chan_id <= span->chan_count) {
|
if (caller_data->chan_id > 0 && caller_data->chan_id <= ftdm_span_get_chan_count(span)) {
|
||||||
new_chan = span->channels[caller_data->chan_id];
|
new_chan = ftdm_span_get_channel(span, caller_data->chan_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_chan && (status = ftdm_channel_open_chan(new_chan) == FTDM_SUCCESS)) {
|
if (new_chan && (status = ftdm_channel_open_chan(new_chan) == FTDM_SUCCESS)) {
|
||||||
@ -570,10 +574,8 @@ static void ftdm_isdn_call_event(struct Q931_Call *call, struct Q931_CallEvent *
|
|||||||
/*
|
/*
|
||||||
* Global event
|
* Global event
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Received global event from Q.931\n");
|
ftdm_log(FTDM_LOG_DEBUG, "Received global event from Q.931\n");
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
ftdm_channel_t *ftdmchan = NULL;
|
ftdm_channel_t *ftdmchan = NULL;
|
||||||
ftdm_sigmsg_t sig;
|
ftdm_sigmsg_t sig;
|
||||||
int call_crv = Q931CallGetCRV(call);
|
int call_crv = Q931CallGetCRV(call);
|
||||||
@ -716,9 +718,8 @@ static void __isdn_get_number(const char *digits, const int ton, char *buf, int
|
|||||||
{
|
{
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
|
||||||
if (!digits || !buf || size <= 0) {
|
if (!digits || !buf || size <= 0)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
switch (ton) {
|
switch (ton) {
|
||||||
case Q931_TON_NATIONAL:
|
case Q931_TON_NATIONAL:
|
||||||
@ -747,13 +748,12 @@ static void __isdn_get_number(const char *digits, const int ton, char *buf, int
|
|||||||
*/
|
*/
|
||||||
static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic *msg, int mlen)
|
static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic *msg, int mlen)
|
||||||
{
|
{
|
||||||
|
Q931mes_Generic *gen = (Q931mes_Generic *) msg;
|
||||||
ftdm_span_t *span = (ftdm_span_t *) pvt;
|
ftdm_span_t *span = (ftdm_span_t *) pvt;
|
||||||
ftdm_isdn_data_t *isdn_data = span->signal_data;
|
ftdm_isdn_data_t *isdn_data = span->signal_data;
|
||||||
Q931mes_Generic *gen = (Q931mes_Generic *) msg;
|
ftdm_channel_t *ftdmchan = NULL;
|
||||||
int chan_id = 0;
|
int chan_id = 0;
|
||||||
int chan_hunt = 0;
|
int chan_hunt = 0;
|
||||||
ftdm_channel_t *ftdmchan = NULL;
|
|
||||||
// ftdm_caller_data_t *caller_data = NULL;
|
|
||||||
|
|
||||||
if (Q931IsIEPresent(gen->ChanID)) {
|
if (Q931IsIEPresent(gen->ChanID)) {
|
||||||
Q931ie_ChanID *chanid = Q931GetIEPtr(gen->ChanID, gen->buf);
|
Q931ie_ChanID *chanid = Q931GetIEPtr(gen->ChanID, gen->buf);
|
||||||
@ -810,9 +810,7 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
case Q931mes_ALERTING:
|
case Q931mes_ALERTING:
|
||||||
case Q931mes_PROGRESS:
|
case Q931mes_PROGRESS:
|
||||||
case Q931mes_CONNECT:
|
case Q931mes_CONNECT:
|
||||||
{
|
|
||||||
caller_data->call_state = FTDM_CALLER_STATE_SUCCESS;
|
caller_data->call_state = FTDM_CALLER_STATE_SUCCESS;
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
caller_data->call_state = FTDM_CALLER_STATE_FAIL;
|
caller_data->call_state = FTDM_CALLER_STATE_FAIL;
|
||||||
@ -829,8 +827,12 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
ftdmchan = isdn_data->channels_remote_crv[gen->CRV];
|
ftdmchan = isdn_data->channels_remote_crv[gen->CRV];
|
||||||
}
|
}
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "ftdmchan %x (%d:%d) source isdn_data->channels_%s_crv[%#hx]\n", ftdmchan, ftdmchan ? ftdmchan->span_id : -1, ftdmchan ? ftdmchan->chan_id : -1, gen->CRVFlag ? "local" : "remote", gen->CRV);
|
ftdm_log(FTDM_LOG_DEBUG, "ftdmchan %x (%d:%d) source isdn_data->channels_%s_crv[%#hx]\n",
|
||||||
|
ftdmchan,
|
||||||
|
((ftdmchan) ? ftdm_channel_get_span_id(ftdmchan) : -1),
|
||||||
|
((ftdmchan) ? ftdm_channel_get_id(ftdmchan) : -1),
|
||||||
|
((gen->CRVFlag) ? "local" : "remote"),
|
||||||
|
gen->CRV);
|
||||||
|
|
||||||
if (gen->ProtDisc == 3) {
|
if (gen->ProtDisc == 3) {
|
||||||
switch(gen->MesType) {
|
switch(gen->MesType) {
|
||||||
@ -842,7 +844,9 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
case 0: /* change status to "in service" */
|
case 0: /* change status to "in service" */
|
||||||
{
|
{
|
||||||
ftdm_clear_flag_locked(ftdmchan, FTDM_CHANNEL_SUSPENDED);
|
ftdm_clear_flag_locked(ftdmchan, FTDM_CHANNEL_SUSPENDED);
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Channel %d:%d in service\n", ftdmchan->span_id, ftdmchan->chan_id);
|
ftdm_log(FTDM_LOG_DEBUG, "Channel %d:%d in service\n",
|
||||||
|
ftdm_channel_get_span_id(ftdmchan),
|
||||||
|
ftdm_channel_get_id(ftdmchan));
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -874,19 +878,20 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
case Q931mes_RESTART:
|
case Q931mes_RESTART:
|
||||||
{
|
{
|
||||||
if (chan_id) {
|
if (chan_id) {
|
||||||
ftdmchan = span->channels[chan_id];
|
ftdmchan = ftdm_span_get_channel(span, chan_id);
|
||||||
}
|
}
|
||||||
if (ftdmchan) {
|
if (ftdmchan) {
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||||
} else {
|
} else {
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
for (i = 1; i < span->chan_count; i++) {
|
for (i = 1; i < ftdm_span_get_chan_count(span); i++) {
|
||||||
/* Skip channels that are down and D-Channels (#OpenZAP-39) */
|
/* Skip channels that are down and D-Channels (#OpenZAP-39) */
|
||||||
if (span->channels[i]->state == FTDM_CHANNEL_STATE_DOWN || span->channels[i]->type == FTDM_CHAN_TYPE_DQ921)
|
if (ftdm_channel_get_state(span->channels[i]) == FTDM_CHANNEL_STATE_DOWN ||
|
||||||
|
ftdm_channel_get_type(span->channels[i]) == FTDM_CHAN_TYPE_DQ921)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ftdm_set_state_locked((span->channels[i]), FTDM_CHANNEL_STATE_RESTART);
|
ftdm_set_state_locked(span->channels[i], FTDM_CHANNEL_STATE_RESTART);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -896,15 +901,17 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
{
|
{
|
||||||
const char *what = gen->MesType == Q931mes_RELEASE ? "Release" : "Release Complete";
|
const char *what = gen->MesType == Q931mes_RELEASE ? "Release" : "Release Complete";
|
||||||
if (ftdmchan) {
|
if (ftdmchan) {
|
||||||
if (ftdmchan->state == FTDM_CHANNEL_STATE_TERMINATING || ftdmchan->state == FTDM_CHANNEL_STATE_HANGUP) {
|
if (ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_TERMINATING ||
|
||||||
|
ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_HANGUP)
|
||||||
|
{
|
||||||
if (gen->MesType == Q931mes_RELEASE) {
|
if (gen->MesType == Q931mes_RELEASE) {
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
|
||||||
} else {
|
} else {
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if((gen->MesType == Q931mes_RELEASE && ftdmchan->state <= FTDM_CHANNEL_STATE_UP) ||
|
else if ((gen->MesType == Q931mes_RELEASE && ftdm_channel_get_state(ftdmchan) <= FTDM_CHANNEL_STATE_UP) ||
|
||||||
(gen->MesType == Q931mes_RELEASE_COMPLETE && ftdmchan->state == FTDM_CHANNEL_STATE_DIALING)) {
|
(gen->MesType == Q931mes_RELEASE_COMPLETE && ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_DIALING)) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't keep inbound channels open if the remote side hangs up before we answered
|
* Don't keep inbound channels open if the remote side hangs up before we answered
|
||||||
@ -914,18 +921,20 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
ftdm_status_t status;
|
ftdm_status_t status;
|
||||||
|
|
||||||
memset(&sig, 0, sizeof(sig));
|
memset(&sig, 0, sizeof(sig));
|
||||||
sig.chan_id = ftdmchan->chan_id;
|
sig.span_id = ftdm_channel_get_span_id(ftdmchan);
|
||||||
sig.span_id = ftdmchan->span_id;
|
sig.chan_id = ftdm_channel_get_id(ftdmchan);
|
||||||
sig.channel = ftdmchan;
|
sig.channel = ftdmchan;
|
||||||
sig.channel->caller_data.hangup_cause = (cause) ? cause->Value : FTDM_CAUSE_NORMAL_UNSPECIFIED;
|
sig.channel->caller_data.hangup_cause = (cause) ? cause->Value : FTDM_CAUSE_NORMAL_UNSPECIFIED;
|
||||||
|
|
||||||
sig.event_id = FTDM_SIGEVENT_STOP;
|
sig.event_id = FTDM_SIGEVENT_STOP;
|
||||||
status = isdn_data->sig_cb(&sig);
|
status = isdn_data->sig_cb(&sig);
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Received %s in state %s, requested hangup for channel %d:%d\n", what, ftdm_channel_state2str(ftdmchan->state), ftdmchan->span_id, chan_id);
|
ftdm_log(FTDM_LOG_DEBUG, "Received %s in state %s, requested hangup for channel %d:%d\n", what,
|
||||||
}
|
ftdm_channel_get_state_str(ftdmchan),
|
||||||
else {
|
ftdm_channel_get_span_id(ftdmchan),
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Ignoring %s on channel %d\n", what, chan_id);
|
ftdm_channel_get_id(ftdmchan));
|
||||||
|
} else {
|
||||||
|
ftdm_log(FTDM_LOG_DEBUG, "Ignoring %s on channel %d\n", what, ftdm_channel_get_id(ftdmchan));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Received %s with no matching channel %d\n", what, chan_id);
|
ftdm_log(FTDM_LOG_CRIT, "Received %s with no matching channel %d\n", what, chan_id);
|
||||||
@ -982,18 +991,18 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
{
|
{
|
||||||
Q931ie_CallingNum *callingnum = Q931GetIEPtr(gen->CallingNum, gen->buf);
|
Q931ie_CallingNum *callingnum = Q931GetIEPtr(gen->CallingNum, gen->buf);
|
||||||
Q931ie_CalledNum *callednum = Q931GetIEPtr(gen->CalledNum, gen->buf);
|
Q931ie_CalledNum *callednum = Q931GetIEPtr(gen->CalledNum, gen->buf);
|
||||||
int fail = 1;
|
|
||||||
int fail_cause = 0;
|
|
||||||
int overlap_dial = 0;
|
|
||||||
uint32_t cplen = mlen;
|
uint32_t cplen = mlen;
|
||||||
|
int overlap_dial = 0;
|
||||||
|
int fail_cause = 0;
|
||||||
|
int fail = 1;
|
||||||
|
|
||||||
if (ftdmchan && ftdmchan == isdn_data->channels_remote_crv[gen->CRV]) {
|
if (ftdmchan && ftdmchan == isdn_data->channels_remote_crv[gen->CRV]) {
|
||||||
ftdm_log(FTDM_LOG_INFO, "Duplicate SETUP message(?) for Channel %d:%d ~ %d:%d in state %s [ignoring]\n",
|
ftdm_log(FTDM_LOG_INFO, "Duplicate SETUP message(?) for Channel %d:%d ~ %d:%d in state %s [ignoring]\n",
|
||||||
ftdmchan->span_id,
|
ftdm_channel_get_span_id(ftdmchan),
|
||||||
ftdmchan->chan_id,
|
ftdm_channel_get_id(ftdmchan),
|
||||||
ftdmchan->physical_span_id,
|
ftdm_channel_get_ph_span_id(ftdmchan),
|
||||||
ftdmchan->physical_chan_id,
|
ftdm_channel_get_ph_id(ftdmchan),
|
||||||
ftdm_channel_state2str(ftdmchan->state));
|
ftdm_channel_get_state_str(ftdmchan));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1008,10 +1017,10 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
* In NT-mode with channel selection "any",
|
* In NT-mode with channel selection "any",
|
||||||
* try to find a free channel
|
* try to find a free channel
|
||||||
*/
|
*/
|
||||||
for (x = 1; x <= span->chan_count; x++) {
|
for (x = 1; x <= ftdm_span_get_chan_count(span); x++) {
|
||||||
ftdm_channel_t *zc = span->channels[x];
|
ftdm_channel_t *zc = ftdm_span_get_channel(span, x);
|
||||||
|
|
||||||
if (!ftdm_test_flag(zc, FTDM_CHANNEL_INUSE) && zc->state == FTDM_CHANNEL_STATE_DOWN) {
|
if (!ftdm_test_flag(zc, FTDM_CHANNEL_INUSE) && ftdm_channel_get_state(zc) == FTDM_CHANNEL_STATE_DOWN) {
|
||||||
ftdmchan = zc;
|
ftdmchan = zc;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1032,8 +1041,8 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
* TODO: NT mode is abled to select a different channel if the one chosen
|
* TODO: NT mode is abled to select a different channel if the one chosen
|
||||||
* by the TE side is already in use
|
* by the TE side is already in use
|
||||||
*/
|
*/
|
||||||
if (chan_id > 0 && chan_id < FTDM_MAX_CHANNELS_SPAN && chan_id <= span->chan_count) {
|
if (chan_id > 0 && chan_id < FTDM_MAX_CHANNELS_SPAN && chan_id <= ftdm_span_get_chan_count(span)) {
|
||||||
ftdmchan = span->channels[chan_id];
|
ftdmchan = ftdm_span_get_channel(span, chan_id);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* invalid channel id */
|
/* invalid channel id */
|
||||||
@ -1047,22 +1056,22 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
if (FTDM_SPAN_IS_NT(span)) {
|
if (FTDM_SPAN_IS_NT(span)) {
|
||||||
ftdm_log(FTDM_LOG_NOTICE, "No destination number found, assuming overlap dial\n");
|
ftdm_log(FTDM_LOG_NOTICE, "No destination number found, assuming overlap dial\n");
|
||||||
overlap_dial++;
|
overlap_dial++;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "No destination number found\n");
|
ftdm_log(FTDM_LOG_ERROR, "No destination number found\n");
|
||||||
ftdmchan = NULL;
|
ftdmchan = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ftdmchan) {
|
if (ftdmchan) {
|
||||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE) || ftdmchan->state != FTDM_CHANNEL_STATE_DOWN) {
|
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE) || ftdm_channel_get_state(ftdmchan) != FTDM_CHANNEL_STATE_DOWN) {
|
||||||
if (ftdmchan->state == FTDM_CHANNEL_STATE_DOWN || ftdmchan->state >= FTDM_CHANNEL_STATE_TERMINATING) {
|
if (ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_DOWN || ftdm_channel_get_state(ftdmchan) >= FTDM_CHANNEL_STATE_TERMINATING)
|
||||||
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
ftdm_log(FTDM_LOG_WARNING, "Channel %d:%d ~ %d:%d is already in use waiting for it to become available.\n",
|
ftdm_log(FTDM_LOG_WARNING, "Channel %d:%d ~ %d:%d is already in use waiting for it to become available.\n",
|
||||||
ftdmchan->span_id,
|
ftdm_channel_get_span_id(ftdmchan),
|
||||||
ftdmchan->chan_id,
|
ftdm_channel_get_id(ftdmchan),
|
||||||
ftdmchan->physical_span_id,
|
ftdm_channel_get_ph_span_id(ftdmchan),
|
||||||
ftdmchan->physical_chan_id);
|
ftdm_channel_get_ph_id(ftdmchan));
|
||||||
|
|
||||||
for (x = 0; x < 200; x++) {
|
for (x = 0; x < 200; x++) {
|
||||||
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) {
|
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) {
|
||||||
@ -1073,16 +1082,17 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
}
|
}
|
||||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) {
|
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) {
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Channel %d:%d ~ %d:%d is already in use.\n",
|
ftdm_log(FTDM_LOG_ERROR, "Channel %d:%d ~ %d:%d is already in use.\n",
|
||||||
ftdmchan->span_id,
|
ftdm_channel_get_span_id(ftdmchan),
|
||||||
ftdmchan->chan_id,
|
ftdm_channel_get_id(ftdmchan),
|
||||||
ftdmchan->physical_span_id,
|
ftdm_channel_get_ph_span_id(ftdmchan),
|
||||||
ftdmchan->physical_chan_id
|
ftdm_channel_get_ph_id(ftdmchan));
|
||||||
);
|
|
||||||
ftdmchan = NULL;
|
ftdmchan = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ftdmchan && ftdmchan->state == FTDM_CHANNEL_STATE_DOWN) {
|
if (ftdmchan && ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_DOWN) {
|
||||||
|
ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(ftdmchan);
|
||||||
|
|
||||||
isdn_data->channels_remote_crv[gen->CRV] = ftdmchan;
|
isdn_data->channels_remote_crv[gen->CRV] = ftdmchan;
|
||||||
memset(&ftdmchan->caller_data, 0, sizeof(ftdmchan->caller_data));
|
memset(&ftdmchan->caller_data, 0, sizeof(ftdmchan->caller_data));
|
||||||
|
|
||||||
@ -1091,34 +1101,32 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* copy number readd prefix as needed */
|
/* copy number readd prefix as needed */
|
||||||
isdn_get_number(callingnum, ftdmchan->caller_data.cid_num.digits);
|
isdn_get_number(callingnum, caller_data->cid_num.digits);
|
||||||
isdn_get_number(callingnum, ftdmchan->caller_data.cid_name);
|
isdn_get_number(callingnum, caller_data->cid_name);
|
||||||
isdn_get_number(callingnum, ftdmchan->caller_data.ani.digits);
|
isdn_get_number(callingnum, caller_data->ani.digits);
|
||||||
|
|
||||||
// ftdm_set_string(ftdmchan->caller_data.cid_num.digits, (char *)callingnum->Digit);
|
|
||||||
// ftdm_set_string(ftdmchan->caller_data.cid_name, (char *)callingnum->Digit);
|
|
||||||
// ftdm_set_string(ftdmchan->caller_data.ani.digits, (char *)callingnum->Digit);
|
|
||||||
if (!overlap_dial) {
|
if (!overlap_dial) {
|
||||||
// ftdm_set_string(ftdmchan->caller_data.dnis.digits, (char *)callednum->Digit);
|
isdn_get_number(callednum, caller_data->dnis.digits);
|
||||||
isdn_get_number(callednum, ftdmchan->caller_data.dnis.digits);
|
|
||||||
}
|
}
|
||||||
#ifdef __TODO_OR_REMOVE__
|
#ifdef __TODO_OR_REMOVE__
|
||||||
ftdmchan->caller_data.CRV = gen->CRV;
|
ftdmchan->caller_data.CRV = gen->CRV;
|
||||||
#endif
|
#endif
|
||||||
if (cplen > sizeof(ftdmchan->caller_data.raw_data)) {
|
if (cplen > sizeof(caller_data->raw_data)) {
|
||||||
cplen = sizeof(ftdmchan->caller_data.raw_data);
|
cplen = sizeof(caller_data->raw_data);
|
||||||
}
|
}
|
||||||
gen->CRVFlag = !(gen->CRVFlag);
|
gen->CRVFlag = !(gen->CRVFlag);
|
||||||
memcpy(ftdmchan->caller_data.raw_data, msg, cplen);
|
memcpy(caller_data->raw_data, msg, cplen);
|
||||||
ftdmchan->caller_data.raw_data_len = cplen;
|
caller_data->raw_data_len = cplen;
|
||||||
fail = 0;
|
fail = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fail) {
|
if (fail) {
|
||||||
Q931ie_Cause cause;
|
Q931ie_Cause cause;
|
||||||
|
|
||||||
gen->MesType = Q931mes_DISCONNECT;
|
gen->MesType = Q931mes_DISCONNECT;
|
||||||
gen->CRVFlag = 1; /* inbound call */
|
gen->CRVFlag = 1; /* inbound call */
|
||||||
|
|
||||||
cause.IEId = Q931ie_CAUSE;
|
cause.IEId = Q931ie_CAUSE;
|
||||||
cause.Size = sizeof(Q931ie_Cause);
|
cause.Size = sizeof(Q931ie_Cause);
|
||||||
cause.CodStand = Q931_CODING_ITU;
|
cause.CodStand = Q931_CODING_ITU;
|
||||||
@ -1152,9 +1160,9 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
if (ChanID.IntType) {
|
if (ChanID.IntType) {
|
||||||
ChanID.InfoChanSel = 1; /* None = 0, See Slot = 1, Any = 3 */
|
ChanID.InfoChanSel = 1; /* None = 0, See Slot = 1, Any = 3 */
|
||||||
ChanID.ChanMapType = 3; /* B-Chan */
|
ChanID.ChanMapType = 3; /* B-Chan */
|
||||||
ChanID.ChanSlot = (unsigned char)ftdmchan->chan_id;
|
ChanID.ChanSlot = (unsigned char)ftdm_channel_get_id(ftdmchan);
|
||||||
} else {
|
} else {
|
||||||
ChanID.InfoChanSel = (unsigned char)ftdmchan->chan_id & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
|
ChanID.InfoChanSel = (unsigned char)ftdm_channel_get_id(ftdmchan) & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
|
||||||
}
|
}
|
||||||
gen->ChanID = Q931AppendIE(gen, (L3UCHAR *) &ChanID);
|
gen->ChanID = Q931AppendIE(gen, (L3UCHAR *) &ChanID);
|
||||||
|
|
||||||
@ -1192,7 +1200,7 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
case Q931mes_CALL_PROCEEDING:
|
case Q931mes_CALL_PROCEEDING:
|
||||||
{
|
{
|
||||||
if (ftdmchan) {
|
if (ftdmchan) {
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Received CALL PROCEEDING message for channel %d\n", chan_id);
|
ftdm_log(FTDM_LOG_CRIT, "Received CALL PROCEEDING message for channel %d\n", ftdm_channel_get_id(ftdmchan));
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
|
||||||
} else {
|
} else {
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Received CALL PROCEEDING with no matching channel %d\n", chan_id);
|
ftdm_log(FTDM_LOG_CRIT, "Received CALL PROCEEDING with no matching channel %d\n", chan_id);
|
||||||
@ -1202,7 +1210,7 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
case Q931mes_CONNECT_ACKNOWLEDGE:
|
case Q931mes_CONNECT_ACKNOWLEDGE:
|
||||||
{
|
{
|
||||||
if (ftdmchan) {
|
if (ftdmchan) {
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Received CONNECT_ACK message for channel %d\n", chan_id);
|
ftdm_log(FTDM_LOG_DEBUG, "Received CONNECT_ACK message for channel %d\n", ftdm_channel_get_id(ftdmchan));
|
||||||
} else {
|
} else {
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Received CONNECT_ACK with no matching channel %d\n", chan_id);
|
ftdm_log(FTDM_LOG_DEBUG, "Received CONNECT_ACK with no matching channel %d\n", chan_id);
|
||||||
}
|
}
|
||||||
@ -1212,9 +1220,9 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
|||||||
case Q931mes_INFORMATION:
|
case Q931mes_INFORMATION:
|
||||||
{
|
{
|
||||||
if (ftdmchan) {
|
if (ftdmchan) {
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Received INFORMATION message for channel %d\n", ftdmchan->chan_id);
|
ftdm_log(FTDM_LOG_CRIT, "Received INFORMATION message for channel %d\n", ftdm_channel_get_id(ftdmchan));
|
||||||
|
|
||||||
if (ftdmchan->state == FTDM_CHANNEL_STATE_DIALTONE) {
|
if (ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_DIALTONE) {
|
||||||
char digit = '\0';
|
char digit = '\0';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1312,14 +1320,16 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
ftdm_status_t status;
|
ftdm_status_t status;
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "%d:%d STATE [%s]\n",
|
ftdm_log(FTDM_LOG_DEBUG, "%d:%d STATE [%s]\n",
|
||||||
ftdmchan->span_id, ftdmchan->chan_id, ftdm_channel_state2str(ftdmchan->state));
|
ftdm_channel_get_span_id(ftdmchan),
|
||||||
|
ftdm_channel_get_id(ftdmchan),
|
||||||
|
ftdm_channel_get_state_str(ftdmchan));
|
||||||
|
|
||||||
memset(&sig, 0, sizeof(sig));
|
memset(&sig, 0, sizeof(sig));
|
||||||
sig.chan_id = ftdmchan->chan_id;
|
sig.span_id = ftdm_channel_get_span_id(ftdmchan);
|
||||||
sig.span_id = ftdmchan->span_id;
|
sig.chan_id = ftdm_channel_get_id(ftdmchan);
|
||||||
sig.channel = ftdmchan;
|
sig.channel = ftdmchan;
|
||||||
|
|
||||||
switch (ftdmchan->state) {
|
switch (ftdm_channel_get_state(ftdmchan)) {
|
||||||
case FTDM_CHANNEL_STATE_DOWN:
|
case FTDM_CHANNEL_STATE_DOWN:
|
||||||
{
|
{
|
||||||
if (gen->CRV) {
|
if (gen->CRV) {
|
||||||
@ -1348,22 +1358,22 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
gen->CRV = crv;
|
gen->CRV = crv;
|
||||||
gen->CRVFlag = 1; /* inbound */
|
gen->CRVFlag = 1; /* inbound */
|
||||||
|
|
||||||
if (FTDM_SPAN_IS_NT(ftdmchan->span)) {
|
if (FTDM_SPAN_IS_NT(ftdm_channel_get_span(ftdmchan))) {
|
||||||
Q931ie_ChanID ChanID;
|
Q931ie_ChanID ChanID;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set new Channel ID
|
* Set new Channel ID
|
||||||
*/
|
*/
|
||||||
Q931InitIEChanID(&ChanID);
|
Q931InitIEChanID(&ChanID);
|
||||||
ChanID.IntType = FTDM_SPAN_IS_BRI(ftdmchan->span) ? 0 : 1; /* PRI = 1, BRI = 0 */
|
ChanID.IntType = FTDM_SPAN_IS_BRI(ftdm_channel_get_span(ftdmchan)) ? 0 : 1; /* PRI = 1, BRI = 0 */
|
||||||
ChanID.PrefExcl = 1; /* always exclusive in NT-mode */
|
ChanID.PrefExcl = 1; /* always exclusive in NT-mode */
|
||||||
|
|
||||||
if (ChanID.IntType) {
|
if (ChanID.IntType) {
|
||||||
ChanID.InfoChanSel = 1; /* None = 0, See Slot = 1, Any = 3 */
|
ChanID.InfoChanSel = 1; /* None = 0, See Slot = 1, Any = 3 */
|
||||||
ChanID.ChanMapType = 3; /* B-Chan */
|
ChanID.ChanMapType = 3; /* B-Chan */
|
||||||
ChanID.ChanSlot = (unsigned char)ftdmchan->chan_id;
|
ChanID.ChanSlot = (unsigned char)ftdm_channel_get_id(ftdmchan);
|
||||||
} else {
|
} else {
|
||||||
ChanID.InfoChanSel = (unsigned char)ftdmchan->chan_id & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
|
ChanID.InfoChanSel = (unsigned char)ftdm_channel_get_id(ftdmchan) & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
|
||||||
}
|
}
|
||||||
gen->ChanID = Q931AppendIE(gen, (L3UCHAR *) &ChanID);
|
gen->ChanID = Q931AppendIE(gen, (L3UCHAR *) &ChanID);
|
||||||
}
|
}
|
||||||
@ -1442,6 +1452,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
break;
|
break;
|
||||||
case FTDM_CHANNEL_STATE_DIALING:
|
case FTDM_CHANNEL_STATE_DIALING:
|
||||||
if (!(isdn_data->opts & FTDM_ISDN_OPT_SUGGEST_CHANNEL)) {
|
if (!(isdn_data->opts & FTDM_ISDN_OPT_SUGGEST_CHANNEL)) {
|
||||||
|
ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(ftdmchan);
|
||||||
Q931ie_BearerCap BearerCap;
|
Q931ie_BearerCap BearerCap;
|
||||||
Q931ie_ChanID ChanID;
|
Q931ie_ChanID ChanID;
|
||||||
Q931ie_CallingNum CallingNum;
|
Q931ie_CallingNum CallingNum;
|
||||||
@ -1456,7 +1467,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
/*
|
/*
|
||||||
* get codec type
|
* get codec type
|
||||||
*/
|
*/
|
||||||
ftdm_channel_command(ftdmchan->span->channels[ftdmchan->chan_id], FTDM_COMMAND_GET_NATIVE_CODEC, &codec);
|
ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_NATIVE_CODEC, &codec);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Q.931 Setup Message
|
* Q.931 Setup Message
|
||||||
@ -1481,14 +1492,14 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
* ChannelID IE
|
* ChannelID IE
|
||||||
*/
|
*/
|
||||||
Q931InitIEChanID(&ChanID);
|
Q931InitIEChanID(&ChanID);
|
||||||
ChanID.IntType = FTDM_SPAN_IS_BRI(ftdmchan->span) ? 0 : 1; /* PRI = 1, BRI = 0 */
|
ChanID.IntType = FTDM_SPAN_IS_BRI(ftdm_channel_get_span(ftdmchan)) ? 0 : 1; /* PRI = 1, BRI = 0 */
|
||||||
ChanID.PrefExcl = FTDM_SPAN_IS_NT(ftdmchan->span) ? 1 : 0; /* Exclusive in NT-mode = 1, Preferred otherwise = 0 */
|
ChanID.PrefExcl = FTDM_SPAN_IS_NT(ftdm_channel_get_span(ftdmchan)) ? 1 : 0; /* Exclusive in NT-mode = 1, Preferred otherwise = 0 */
|
||||||
if (ChanID.IntType) {
|
if (ChanID.IntType) {
|
||||||
ChanID.InfoChanSel = 1; /* None = 0, See Slot = 1, Any = 3 */
|
ChanID.InfoChanSel = 1; /* None = 0, See Slot = 1, Any = 3 */
|
||||||
ChanID.ChanMapType = 3; /* B-Chan */
|
ChanID.ChanMapType = 3; /* B-Chan */
|
||||||
ChanID.ChanSlot = (unsigned char)ftdmchan->chan_id;
|
ChanID.ChanSlot = (unsigned char)ftdm_channel_get_id(ftdmchan);
|
||||||
} else {
|
} else {
|
||||||
ChanID.InfoChanSel = (unsigned char)ftdmchan->chan_id & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
|
ChanID.InfoChanSel = (unsigned char)ftdm_channel_get_id(ftdmchan) & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
|
||||||
}
|
}
|
||||||
gen->ChanID = Q931AppendIE(gen, (L3UCHAR *) &ChanID);
|
gen->ChanID = Q931AppendIE(gen, (L3UCHAR *) &ChanID);
|
||||||
|
|
||||||
@ -1504,26 +1515,26 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
/*
|
/*
|
||||||
* Display IE
|
* Display IE
|
||||||
*/
|
*/
|
||||||
if (!(isdn_data->opts & FTDM_ISDN_OPT_OMIT_DISPLAY_IE) && FTDM_SPAN_IS_NT(ftdmchan->span)) {
|
if (!(isdn_data->opts & FTDM_ISDN_OPT_OMIT_DISPLAY_IE) && FTDM_SPAN_IS_NT(ftdm_channel_get_span(ftdmchan))) {
|
||||||
Q931InitIEDisplay(&Display);
|
Q931InitIEDisplay(&Display);
|
||||||
Display.Size = Display.Size + (unsigned char)strlen(ftdmchan->caller_data.cid_name);
|
Display.Size = Display.Size + (unsigned char)strlen(caller_data->cid_name);
|
||||||
gen->Display = Q931AppendIE(gen, (L3UCHAR *) &Display);
|
gen->Display = Q931AppendIE(gen, (L3UCHAR *) &Display);
|
||||||
ptrDisplay = Q931GetIEPtr(gen->Display, gen->buf);
|
ptrDisplay = Q931GetIEPtr(gen->Display, gen->buf);
|
||||||
ftdm_copy_string((char *)ptrDisplay->Display, ftdmchan->caller_data.cid_name, strlen(ftdmchan->caller_data.cid_name)+1);
|
ftdm_copy_string((char *)ptrDisplay->Display, caller_data->cid_name, strlen(caller_data->cid_name) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CallingNum IE
|
* CallingNum IE
|
||||||
*/
|
*/
|
||||||
Q931InitIECallingNum(&CallingNum);
|
Q931InitIECallingNum(&CallingNum);
|
||||||
CallingNum.TypNum = ftdmchan->caller_data.ani.type;
|
CallingNum.TypNum = caller_data->ani.type;
|
||||||
CallingNum.NumPlanID = Q931_NUMPLAN_E164;
|
CallingNum.NumPlanID = Q931_NUMPLAN_E164;
|
||||||
CallingNum.PresInd = Q931_PRES_ALLOWED;
|
CallingNum.PresInd = Q931_PRES_ALLOWED;
|
||||||
CallingNum.ScreenInd = Q931_SCREEN_USER_NOT_SCREENED;
|
CallingNum.ScreenInd = Q931_SCREEN_USER_NOT_SCREENED;
|
||||||
CallingNum.Size = CallingNum.Size + (unsigned char)strlen(ftdmchan->caller_data.cid_num.digits);
|
CallingNum.Size = CallingNum.Size + (unsigned char)strlen(caller_data->cid_num.digits);
|
||||||
gen->CallingNum = Q931AppendIE(gen, (L3UCHAR *) &CallingNum);
|
gen->CallingNum = Q931AppendIE(gen, (L3UCHAR *) &CallingNum);
|
||||||
ptrCallingNum = Q931GetIEPtr(gen->CallingNum, gen->buf);
|
ptrCallingNum = Q931GetIEPtr(gen->CallingNum, gen->buf);
|
||||||
ftdm_copy_string((char *)ptrCallingNum->Digit, ftdmchan->caller_data.cid_num.digits, strlen(ftdmchan->caller_data.cid_num.digits)+1);
|
ftdm_copy_string((char *)ptrCallingNum->Digit, caller_data->cid_num.digits, strlen(caller_data->cid_num.digits) + 1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CalledNum IE
|
* CalledNum IE
|
||||||
@ -1531,10 +1542,10 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
Q931InitIECalledNum(&CalledNum);
|
Q931InitIECalledNum(&CalledNum);
|
||||||
CalledNum.TypNum = Q931_TON_UNKNOWN;
|
CalledNum.TypNum = Q931_TON_UNKNOWN;
|
||||||
CalledNum.NumPlanID = Q931_NUMPLAN_E164;
|
CalledNum.NumPlanID = Q931_NUMPLAN_E164;
|
||||||
CalledNum.Size = CalledNum.Size + (unsigned char)strlen(ftdmchan->caller_data.ani.digits);
|
CalledNum.Size = CalledNum.Size + (unsigned char)strlen(caller_data->ani.digits);
|
||||||
gen->CalledNum = Q931AppendIE(gen, (L3UCHAR *) &CalledNum);
|
gen->CalledNum = Q931AppendIE(gen, (L3UCHAR *) &CalledNum);
|
||||||
ptrCalledNum = Q931GetIEPtr(gen->CalledNum, gen->buf);
|
ptrCalledNum = Q931GetIEPtr(gen->CalledNum, gen->buf);
|
||||||
ftdm_copy_string((char *)ptrCalledNum->Digit, ftdmchan->caller_data.ani.digits, strlen(ftdmchan->caller_data.ani.digits)+1);
|
ftdm_copy_string((char *)ptrCalledNum->Digit, caller_data->ani.digits, strlen(caller_data->ani.digits) + 1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* High-Layer Compatibility IE (Note: Required for AVM FritzBox)
|
* High-Layer Compatibility IE (Note: Required for AVM FritzBox)
|
||||||
@ -1559,7 +1570,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
call = Q931GetCallByCRV(&isdn_data->q931, gen->CRV);
|
call = Q931GetCallByCRV(&isdn_data->q931, gen->CRV);
|
||||||
if (call) {
|
if (call) {
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Storing reference to current span in call %d [0x%x]\n", gen->CRV, gen->CRV);
|
ftdm_log(FTDM_LOG_DEBUG, "Storing reference to current span in call %d [0x%x]\n", gen->CRV, gen->CRV);
|
||||||
Q931CallSetPrivate(call, ftdmchan->span);
|
Q931CallSetPrivate(call, ftdm_channel_get_span(ftdmchan));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1567,7 +1578,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
|
case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
|
||||||
{
|
{
|
||||||
/* reply RELEASE with RELEASE_COMPLETE message */
|
/* reply RELEASE with RELEASE_COMPLETE message */
|
||||||
if(ftdmchan->last_state == FTDM_CHANNEL_STATE_HANGUP) {
|
if (ftdm_channel_get_last_state(ftdmchan) == FTDM_CHANNEL_STATE_HANGUP) {
|
||||||
gen->MesType = Q931mes_RELEASE_COMPLETE;
|
gen->MesType = Q931mes_RELEASE_COMPLETE;
|
||||||
|
|
||||||
Q931Rx43(&isdn_data->q931, gen, gen->Size);
|
Q931Rx43(&isdn_data->q931, gen, gen->Size);
|
||||||
@ -1577,6 +1588,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
break;
|
break;
|
||||||
case FTDM_CHANNEL_STATE_HANGUP:
|
case FTDM_CHANNEL_STATE_HANGUP:
|
||||||
{
|
{
|
||||||
|
ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(ftdmchan);
|
||||||
Q931ie_Cause cause;
|
Q931ie_Cause cause;
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Hangup: Direction %s\n", ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? "Outbound" : "Inbound");
|
ftdm_log(FTDM_LOG_DEBUG, "Hangup: Direction %s\n", ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? "Outbound" : "Inbound");
|
||||||
@ -1593,7 +1605,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
* BRI PTMP needs special handling here...
|
* BRI PTMP needs special handling here...
|
||||||
* TODO: cleanup / refine (see above)
|
* TODO: cleanup / refine (see above)
|
||||||
*/
|
*/
|
||||||
if (ftdmchan->last_state == FTDM_CHANNEL_STATE_RING) {
|
if (ftdm_channel_get_last_state(ftdmchan) == FTDM_CHANNEL_STATE_RING) {
|
||||||
/*
|
/*
|
||||||
* inbound call [was: number unknown (= not found in routing state)]
|
* inbound call [was: number unknown (= not found in routing state)]
|
||||||
* (in Q.931 spec terms: Reject request)
|
* (in Q.931 spec terms: Reject request)
|
||||||
@ -1601,7 +1613,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
gen->MesType = Q931mes_RELEASE_COMPLETE;
|
gen->MesType = Q931mes_RELEASE_COMPLETE;
|
||||||
|
|
||||||
//cause.Value = (unsigned char) FTDM_CAUSE_UNALLOCATED;
|
//cause.Value = (unsigned char) FTDM_CAUSE_UNALLOCATED;
|
||||||
cause.Value = (unsigned char) ftdmchan->caller_data.hangup_cause;
|
cause.Value = (unsigned char) caller_data->hangup_cause;
|
||||||
*cause.Diag = '\0';
|
*cause.Diag = '\0';
|
||||||
gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
|
gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
|
||||||
Q931Rx43(&isdn_data->q931, gen, gen->Size);
|
Q931Rx43(&isdn_data->q931, gen, gen->Size);
|
||||||
@ -1610,13 +1622,13 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
//ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
|
//ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
|
||||||
}
|
}
|
||||||
else if (ftdmchan->last_state <= FTDM_CHANNEL_STATE_PROGRESS) {
|
else if (ftdm_channel_get_last_state(ftdmchan) <= FTDM_CHANNEL_STATE_PROGRESS) {
|
||||||
/*
|
/*
|
||||||
* just release all unanswered calls [was: inbound call, remote side hung up before we answered]
|
* just release all unanswered calls [was: inbound call, remote side hung up before we answered]
|
||||||
*/
|
*/
|
||||||
gen->MesType = Q931mes_RELEASE;
|
gen->MesType = Q931mes_RELEASE;
|
||||||
|
|
||||||
cause.Value = (unsigned char) ftdmchan->caller_data.hangup_cause;
|
cause.Value = (unsigned char) caller_data->hangup_cause;
|
||||||
*cause.Diag = '\0';
|
*cause.Diag = '\0';
|
||||||
gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
|
gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
|
||||||
Q931Rx43(&isdn_data->q931, gen, gen->Size);
|
Q931Rx43(&isdn_data->q931, gen, gen->Size);
|
||||||
@ -1630,7 +1642,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
*/
|
*/
|
||||||
gen->MesType = Q931mes_DISCONNECT;
|
gen->MesType = Q931mes_DISCONNECT;
|
||||||
|
|
||||||
cause.Value = (unsigned char) ftdmchan->caller_data.hangup_cause;
|
cause.Value = (unsigned char) caller_data->hangup_cause;
|
||||||
*cause.Diag = '\0';
|
*cause.Diag = '\0';
|
||||||
gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
|
gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
|
||||||
Q931Rx43(&isdn_data->q931, gen, gen->Size);
|
Q931Rx43(&isdn_data->q931, gen, gen->Size);
|
||||||
@ -1643,6 +1655,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
|
|
||||||
sig.event_id = FTDM_SIGEVENT_STOP;
|
sig.event_id = FTDM_SIGEVENT_STOP;
|
||||||
status = isdn_data->sig_cb(&sig);
|
status = isdn_data->sig_cb(&sig);
|
||||||
|
|
||||||
gen->MesType = Q931mes_RELEASE;
|
gen->MesType = Q931mes_RELEASE;
|
||||||
gen->CRVFlag = ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? 0 : 1;
|
gen->CRVFlag = ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? 0 : 1;
|
||||||
Q931Rx43(&isdn_data->q931, gen, gen->Size);
|
Q931Rx43(&isdn_data->q931, gen, gen->Size);
|
||||||
@ -1656,14 +1669,20 @@ static __inline__ void check_state(ftdm_span_t *span)
|
|||||||
{
|
{
|
||||||
if (ftdm_test_flag(span, FTDM_SPAN_STATE_CHANGE)) {
|
if (ftdm_test_flag(span, FTDM_SPAN_STATE_CHANGE)) {
|
||||||
uint32_t j;
|
uint32_t j;
|
||||||
|
|
||||||
ftdm_clear_flag_locked(span, FTDM_SPAN_STATE_CHANGE);
|
ftdm_clear_flag_locked(span, FTDM_SPAN_STATE_CHANGE);
|
||||||
for(j = 1; j <= span->chan_count; j++) {
|
|
||||||
if (ftdm_test_flag((span->channels[j]), FTDM_CHANNEL_STATE_CHANGE)) {
|
for (j = 1; j <= ftdm_span_get_chan_count(span); j++) {
|
||||||
ftdm_mutex_lock(span->channels[j]->mutex);
|
ftdm_channel_t *chan = ftdm_span_get_channel(span, j);
|
||||||
ftdm_clear_flag((span->channels[j]), FTDM_CHANNEL_STATE_CHANGE);
|
|
||||||
state_advance(span->channels[j]);
|
if (ftdm_test_flag(chan, FTDM_CHANNEL_STATE_CHANGE)) {
|
||||||
ftdm_channel_complete_state(span->channels[j]);
|
ftdm_channel_lock(chan);
|
||||||
ftdm_mutex_unlock(span->channels[j]->mutex);
|
|
||||||
|
ftdm_clear_flag(chan, FTDM_CHANNEL_STATE_CHANGE);
|
||||||
|
state_advance(chan);
|
||||||
|
ftdm_channel_complete_state(chan);
|
||||||
|
|
||||||
|
ftdm_channel_unlock(chan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1677,27 +1696,33 @@ static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *e
|
|||||||
ftdm_sigmsg_t sig;
|
ftdm_sigmsg_t sig;
|
||||||
|
|
||||||
memset(&sig, 0, sizeof(sig));
|
memset(&sig, 0, sizeof(sig));
|
||||||
sig.chan_id = event->channel->chan_id;
|
sig.span_id = ftdm_channel_get_span_id(event->channel);
|
||||||
sig.span_id = event->channel->span_id;
|
sig.chan_id = ftdm_channel_get_id(event->channel);
|
||||||
sig.channel = event->channel;
|
sig.channel = event->channel;
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "EVENT [%s][%d:%d] STATE [%s]\n",
|
ftdm_log(FTDM_LOG_DEBUG, "EVENT [%s][%d:%d] STATE [%s]\n",
|
||||||
ftdm_oob_event2str(event->enum_id), event->channel->span_id, event->channel->chan_id, ftdm_channel_state2str(event->channel->state));
|
ftdm_oob_event2str(event->enum_id),
|
||||||
|
ftdm_channel_get_span_id(event->channel),
|
||||||
|
ftdm_channel_get_id(event->channel),
|
||||||
|
ftdm_channel_get_state_str(event->channel));
|
||||||
|
|
||||||
switch (event->enum_id) {
|
switch (event->enum_id) {
|
||||||
case FTDM_OOB_ALARM_TRAP:
|
case FTDM_OOB_ALARM_TRAP:
|
||||||
{
|
{
|
||||||
sig.event_id = FTDM_OOB_ALARM_TRAP;
|
sig.event_id = FTDM_OOB_ALARM_TRAP;
|
||||||
if (event->channel->state != FTDM_CHANNEL_STATE_DOWN) {
|
if (ftdm_channel_get_state(event->channel) != FTDM_CHANNEL_STATE_DOWN) {
|
||||||
ftdm_set_state_locked(event->channel, FTDM_CHANNEL_STATE_RESTART);
|
ftdm_set_state_locked(event->channel, FTDM_CHANNEL_STATE_RESTART);
|
||||||
}
|
}
|
||||||
ftdm_set_flag(event->channel, FTDM_CHANNEL_SUSPENDED);
|
ftdm_set_flag(event->channel, FTDM_CHANNEL_SUSPENDED);
|
||||||
ftdm_channel_get_alarms(event->channel, &alarmbits);
|
ftdm_channel_get_alarms(event->channel, &alarmbits);
|
||||||
isdn_data->sig_cb(&sig);
|
isdn_data->sig_cb(&sig);
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) has alarms [%s]\n",
|
ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) has alarms [%s]\n",
|
||||||
event->channel->span_id, event->channel->chan_id,
|
ftdm_channel_get_span_id(event->channel),
|
||||||
event->channel->physical_span_id, event->channel->physical_chan_id,
|
ftdm_channel_get_id(event->channel),
|
||||||
event->channel->last_error);
|
ftdm_channel_get_ph_span_id(event->channel),
|
||||||
|
ftdm_channel_get_ph_id(event->channel),
|
||||||
|
ftdm_channel_get_last_error(event->channel));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FTDM_OOB_ALARM_CLEAR:
|
case FTDM_OOB_ALARM_CLEAR:
|
||||||
@ -1744,14 +1769,13 @@ static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *e
|
|||||||
|
|
||||||
static __inline__ void check_events(ftdm_span_t *span)
|
static __inline__ void check_events(ftdm_span_t *span)
|
||||||
{
|
{
|
||||||
ftdm_status_t status;
|
ftdm_status_t status = ftdm_span_poll_event(span, 5, NULL);
|
||||||
|
|
||||||
status = ftdm_span_poll_event(span, 5, NULL);
|
|
||||||
|
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case FTDM_SUCCESS:
|
case FTDM_SUCCESS:
|
||||||
{
|
{
|
||||||
ftdm_event_t *event;
|
ftdm_event_t *event;
|
||||||
|
|
||||||
while (ftdm_span_next_event(span, &event) == FTDM_SUCCESS) {
|
while (ftdm_span_next_event(span, &event) == FTDM_SUCCESS) {
|
||||||
if (event->enum_id == FTDM_OOB_NOOP) {
|
if (event->enum_id == FTDM_OOB_NOOP) {
|
||||||
continue;
|
continue;
|
||||||
@ -1781,6 +1805,7 @@ static int teletone_handler(teletone_generation_session_t *ts, teletone_tone_map
|
|||||||
if (!dt_buffer) {
|
if (!dt_buffer) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
wrote = teletone_mux_tones(ts, map);
|
wrote = teletone_mux_tones(ts, map);
|
||||||
ftdm_buffer_write(dt_buffer, ts->buffer, wrote * 2);
|
ftdm_buffer_write(dt_buffer, ts->buffer, wrote * 2);
|
||||||
return 0;
|
return 0;
|
||||||
@ -1807,9 +1832,11 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
|
|||||||
ftdm_buffer_set_loops(dt_buffer, -1);
|
ftdm_buffer_set_loops(dt_buffer, -1);
|
||||||
|
|
||||||
/* get a tone generation friendly interval to avoid distortions */
|
/* get a tone generation friendly interval to avoid distortions */
|
||||||
for (x = 1; x <= span->chan_count; x++) {
|
for (x = 1; x <= ftdm_span_get_chan_count(span); x++) {
|
||||||
if (span->channels[x]->type != FTDM_CHAN_TYPE_DQ921) {
|
ftdm_channel_t *chan = ftdm_span_get_channel(span, x);
|
||||||
ftdm_channel_command(span->channels[x], FTDM_COMMAND_GET_INTERVAL, &interval);
|
|
||||||
|
if (ftdm_channel_get_type(chan) != FTDM_CHAN_TYPE_DQ921) {
|
||||||
|
ftdm_channel_command(chan, FTDM_COMMAND_GET_INTERVAL, &interval);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1834,11 +1861,11 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
|
|||||||
/*
|
/*
|
||||||
* check b-channel states and generate & send tones if neccessary
|
* check b-channel states and generate & send tones if neccessary
|
||||||
*/
|
*/
|
||||||
for (x = 1; x <= span->chan_count; x++) {
|
for (x = 1; x <= ftdm_span_get_chan_count(span); x++) {
|
||||||
ftdm_channel_t *ftdmchan = span->channels[x];
|
ftdm_channel_t *chan = ftdm_span_get_channel(span, x);
|
||||||
ftdm_size_t len = sizeof(frame), rlen;
|
ftdm_size_t len = sizeof(frame), rlen;
|
||||||
|
|
||||||
if (ftdmchan->type == FTDM_CHAN_TYPE_DQ921) {
|
if (ftdm_channel_get_type(chan) == FTDM_CHAN_TYPE_DQ921) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1847,40 +1874,41 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
|
|||||||
* (Recycle buffer content if succeeding channels share the
|
* (Recycle buffer content if succeeding channels share the
|
||||||
* same state, this saves some cpu cycles)
|
* same state, this saves some cpu cycles)
|
||||||
*/
|
*/
|
||||||
switch (ftdmchan->state) {
|
switch (ftdm_channel_get_state(chan)) {
|
||||||
case FTDM_CHANNEL_STATE_DIALTONE:
|
case FTDM_CHANNEL_STATE_DIALTONE:
|
||||||
{
|
{
|
||||||
ftdm_isdn_bchan_data_t *data = (ftdm_isdn_bchan_data_t *)ftdmchan->mod_data;
|
ftdm_isdn_bchan_data_t *data = (ftdm_isdn_bchan_data_t *)chan->mod_data;
|
||||||
|
ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(chan);
|
||||||
|
|
||||||
/* check overlap dial timeout first before generating tone */
|
/* check overlap dial timeout first before generating tone */
|
||||||
if (data && data->digit_timeout && data->digit_timeout <= now) {
|
if (data && data->digit_timeout && data->digit_timeout <= now) {
|
||||||
if (strlen(ftdmchan->caller_data.dnis.digits) > 0) {
|
if (strlen(caller_data->dnis.digits) > 0) {
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Overlap dial timeout, advancing to RING state\n");
|
ftdm_log(FTDM_LOG_DEBUG, "Overlap dial timeout, advancing to RING state\n");
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RING);
|
ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_RING);
|
||||||
} else {
|
} else {
|
||||||
/* no digits received, hangup */
|
/* no digits received, hangup */
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Overlap dial timeout, no digits received, going to HANGUP state\n");
|
ftdm_log(FTDM_LOG_DEBUG, "Overlap dial timeout, no digits received, going to HANGUP state\n");
|
||||||
ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_RECOVERY_ON_TIMER_EXPIRE; /* TODO: probably wrong cause value */
|
caller_data->hangup_cause = FTDM_CAUSE_RECOVERY_ON_TIMER_EXPIRE; /* TODO: probably wrong cause value */
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
|
ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP);
|
||||||
}
|
}
|
||||||
data->digit_timeout = 0;
|
data->digit_timeout = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last_chan_state != ftdmchan->state) {
|
if (last_chan_state != ftdm_channel_get_state(chan)) {
|
||||||
ftdm_buffer_zero(dt_buffer);
|
ftdm_buffer_zero(dt_buffer);
|
||||||
teletone_run(&ts, ftdmchan->span->tone_map[FTDM_TONEMAP_DIAL]);
|
teletone_run(&ts, span->tone_map[FTDM_TONEMAP_DIAL]);
|
||||||
last_chan_state = ftdmchan->state;
|
last_chan_state = ftdm_channel_get_state(chan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FTDM_CHANNEL_STATE_RING:
|
case FTDM_CHANNEL_STATE_RING:
|
||||||
{
|
{
|
||||||
if (last_chan_state != ftdmchan->state) {
|
if (last_chan_state != ftdm_channel_get_state(chan)) {
|
||||||
ftdm_buffer_zero(dt_buffer);
|
ftdm_buffer_zero(dt_buffer);
|
||||||
teletone_run(&ts, ftdmchan->span->tone_map[FTDM_TONEMAP_RING]);
|
teletone_run(&ts, span->tone_map[FTDM_TONEMAP_RING]);
|
||||||
last_chan_state = ftdmchan->state;
|
last_chan_state = ftdm_channel_get_state(chan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1889,17 +1917,19 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OPEN)) {
|
if (!ftdm_test_flag(chan, FTDM_CHANNEL_OPEN)) {
|
||||||
if (ftdm_channel_open_chan(ftdmchan) != FTDM_SUCCESS) {
|
if (ftdm_channel_open_chan(chan) != FTDM_SUCCESS) {
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
|
ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ftdm_log(FTDM_LOG_NOTICE, "Successfully opened channel %d:%d\n", ftdmchan->span_id, ftdmchan->chan_id);
|
ftdm_log(FTDM_LOG_NOTICE, "Successfully opened channel %d:%d\n",
|
||||||
|
ftdm_channel_get_span_id(chan),
|
||||||
|
ftdm_channel_get_id(chan));
|
||||||
}
|
}
|
||||||
|
|
||||||
flags = FTDM_READ;
|
flags = FTDM_READ;
|
||||||
|
|
||||||
status = ftdm_channel_wait(ftdmchan, &flags, (gated) ? 0 : interval);
|
status = ftdm_channel_wait(chan, &flags, (gated) ? 0 : interval);
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case FTDM_FAIL:
|
case FTDM_FAIL:
|
||||||
continue;
|
continue;
|
||||||
@ -1915,12 +1945,12 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
|
|||||||
}
|
}
|
||||||
gated = 1;
|
gated = 1;
|
||||||
|
|
||||||
status = ftdm_channel_read(ftdmchan, frame, &len);
|
status = ftdm_channel_read(chan, frame, &len);
|
||||||
if (status != FTDM_SUCCESS || len <= 0) {
|
if (status != FTDM_SUCCESS || len <= 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ftdmchan->effective_codec != FTDM_CODEC_SLIN) {
|
if (chan->effective_codec != FTDM_CODEC_SLIN) {
|
||||||
len *= 2;
|
len *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1929,23 +1959,23 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
|
|||||||
|
|
||||||
rlen = ftdm_buffer_read_loop(dt_buffer, frame, len);
|
rlen = ftdm_buffer_read_loop(dt_buffer, frame, len);
|
||||||
|
|
||||||
if (ftdmchan->effective_codec != FTDM_CODEC_SLIN) {
|
if (chan->effective_codec != FTDM_CODEC_SLIN) {
|
||||||
fio_codec_t codec_func = NULL;
|
fio_codec_t codec_func = NULL;
|
||||||
|
|
||||||
if (ftdmchan->native_codec == FTDM_CODEC_ULAW) {
|
if (chan->native_codec == FTDM_CODEC_ULAW) {
|
||||||
codec_func = fio_slin2ulaw;
|
codec_func = fio_slin2ulaw;
|
||||||
} else if (ftdmchan->native_codec == FTDM_CODEC_ALAW) {
|
} else if (chan->native_codec == FTDM_CODEC_ALAW) {
|
||||||
codec_func = fio_slin2alaw;
|
codec_func = fio_slin2alaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (codec_func) {
|
if (codec_func) {
|
||||||
status = codec_func(frame, sizeof(frame), &rlen);
|
status = codec_func(frame, sizeof(frame), &rlen);
|
||||||
} else {
|
} else {
|
||||||
snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "codec error!");
|
snprintf(chan->last_error, sizeof(chan->last_error), "codec error!");
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ftdm_channel_write(ftdmchan, frame, sizeof(frame), &rlen);
|
ftdm_channel_write(chan, frame, sizeof(frame), &rlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2045,8 +2075,8 @@ static void *ftdm_isdn_run(ftdm_thread_t *me, void *obj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
ftdm_channel_close(&isdn_data->dchans[0]);
|
// ftdm_channel_close(&isdn_data->dchans[0]);
|
||||||
ftdm_channel_close(&isdn_data->dchans[1]);
|
// ftdm_channel_close(&isdn_data->dchans[1]);
|
||||||
ftdm_clear_flag(isdn_data, FTDM_ISDN_RUNNING);
|
ftdm_clear_flag(isdn_data, FTDM_ISDN_RUNNING);
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
@ -2244,8 +2274,8 @@ static ftdm_status_t ftdm_isdn_stop(ftdm_span_t *span)
|
|||||||
*/
|
*/
|
||||||
static ftdm_status_t ftdm_isdn_start(ftdm_span_t *span)
|
static ftdm_status_t ftdm_isdn_start(ftdm_span_t *span)
|
||||||
{
|
{
|
||||||
ftdm_status_t ret;
|
|
||||||
ftdm_isdn_data_t *isdn_data = span->signal_data;
|
ftdm_isdn_data_t *isdn_data = span->signal_data;
|
||||||
|
ftdm_status_t ret;
|
||||||
|
|
||||||
if (ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING)) {
|
if (ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING)) {
|
||||||
return FTDM_FAIL;
|
return FTDM_FAIL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user