mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-10-25 20:54:15 +00:00
Merge remote-tracking branch 'fsorig/master'
This commit is contained in:
commit
1ad0bc250c
488 files changed
+108347
-4416
No files matched your search
@@ -1188,7 +1188,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read_event(ftdm_channel_t *ftdmchan, ftdm
|
||||
ftdm_channel_lock(ftdmchan);
|
||||
|
||||
if (!span->fio->channel_next_event) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "channel_next_event method not implemented in module %s!", span->fio->name);
|
||||
ftdm_log(FTDM_LOG_ERROR, "channel_next_event method not implemented in module %s!\n", span->fio->name);
|
||||
status = FTDM_NOTIMPL;
|
||||
goto done;
|
||||
}
|
||||
@@ -2548,7 +2548,9 @@ FT_DECLARE(ftdm_status_t) _ftdm_call_place(const char *file, const char *func, i
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* let the user know which channel was picked and which call id was generated */
|
||||
caller_data->fchan = fchan;
|
||||
caller_data->call_id = fchan->caller_data.call_id;
|
||||
done:
|
||||
ftdm_channel_unlock(fchan);
|
||||
|
||||
@@ -4574,7 +4576,7 @@ FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const
|
||||
ftdm_assert_return(span->fio != NULL, FTDM_EINVAL, "span with no I/O configured\n");
|
||||
ftdm_assert_return(span->fio->configure_span != NULL, FTDM_NOTIMPL, "span I/O with no channel configuration implemented\n");
|
||||
|
||||
currindex = span->chan_count;
|
||||
currindex = span->chan_count;
|
||||
*configured = 0;
|
||||
*configured = span->fio->configure_span(span, str, chan_config->type, chan_config->name, chan_config->number);
|
||||
if (!*configured) {
|
||||
@@ -4604,8 +4606,10 @@ FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const
|
||||
}
|
||||
|
||||
if (chan_config->debugdtmf) {
|
||||
span->channels[chan_index]->dtmfdbg.requested = 1;
|
||||
span->channels[chan_index]->dtmfdbg.requested = 1;
|
||||
}
|
||||
|
||||
span->channels[chan_index]->dtmfdetect.duration_ms = chan_config->dtmfdetect_ms;
|
||||
}
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
@@ -4628,6 +4632,7 @@ static ftdm_status_t load_config(void)
|
||||
|
||||
memset(&chan_config, 0, sizeof(chan_config));
|
||||
sprintf(chan_config.group_name, "__default");
|
||||
chan_config.dtmfdetect_ms = 45;
|
||||
|
||||
if (!ftdm_config_open_file(&cfg, cfg_name)) {
|
||||
return FTDM_FAIL;
|
||||
@@ -4802,6 +4807,10 @@ static ftdm_status_t load_config(void)
|
||||
} else if (!strcasecmp(var, "debugdtmf")) {
|
||||
chan_config.debugdtmf = ftdm_true(val);
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Setting debugdtmf to '%s'\n", chan_config.debugdtmf ? "yes" : "no");
|
||||
} else if (!strncasecmp(var, "dtmfdetect_ms", sizeof("dtmfdetect_ms")-1)) {
|
||||
if (sscanf(val, "%d", &(chan_config.dtmfdetect_ms)) != 1) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "invalid dtmfdetect_ms: '%s'\n", val);
|
||||
}
|
||||
} else if (!strncasecmp(var, "iostats", sizeof("iostats")-1)) {
|
||||
if (ftdm_true(val)) {
|
||||
chan_config.iostats = FTDM_TRUE;
|
||||
|
||||
@@ -391,7 +391,7 @@ static void *ftdm_sangoma_isdn_io_run(ftdm_thread_t *me, void *obj)
|
||||
case FTDM_SUCCESS:
|
||||
/* Check if there are any channels that have data available */
|
||||
for (citer = ftdm_span_get_chan_iterator(span, chaniter); citer; citer = ftdm_iterator_next(citer)) {
|
||||
len = 1000;
|
||||
len = sizeof(data);
|
||||
ftdmchan = ftdm_iterator_current(citer);
|
||||
if (FTDM_IS_VOICE_CHANNEL(ftdmchan)) {
|
||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_RX_DISABLED)) {
|
||||
|
||||
@@ -49,7 +49,11 @@
|
||||
#include "private/ftdm_core.h"
|
||||
#include "ftmod_sangoma_isdn_user.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#include <sng_isdn.h>
|
||||
#else
|
||||
#include <sng_isdn/sng_isdn.h>
|
||||
#endif
|
||||
|
||||
/* Theoretical limit for MAX_SPANS_PER_NFAS_LINK is 31,
|
||||
but set to 8 for now to save some memory */
|
||||
@@ -67,8 +71,6 @@
|
||||
#define MI_NOTIFY 0x14
|
||||
#endif
|
||||
|
||||
/* TODO: rename all *_cc_* to *_an_* */
|
||||
|
||||
typedef enum {
|
||||
FLAG_RESET_RX = (1 << 0),
|
||||
FLAG_RESET_TX = (1 << 1),
|
||||
@@ -258,7 +260,7 @@ typedef struct sngisdn_span_data {
|
||||
uint8_t setup_arb;
|
||||
uint8_t facility_ie_decode;
|
||||
uint8_t facility;
|
||||
int8_t facility_timeout;
|
||||
int32_t facility_timeout;
|
||||
uint8_t att_remove_dtmf;
|
||||
int32_t transfer_timeout;
|
||||
uint8_t num_local_numbers;
|
||||
@@ -273,6 +275,24 @@ typedef struct sngisdn_span_data {
|
||||
uint8_t force_sending_complete;
|
||||
uint8_t cid_name_method;
|
||||
uint8_t send_cid_name;
|
||||
|
||||
int32_t timer_t301;
|
||||
int32_t timer_t302;
|
||||
int32_t timer_t303;
|
||||
int32_t timer_t304;
|
||||
int32_t timer_t305;
|
||||
int32_t timer_t306;
|
||||
int32_t timer_t307;
|
||||
int32_t timer_t308;
|
||||
int32_t timer_t310;
|
||||
int32_t timer_t312;
|
||||
int32_t timer_t313;
|
||||
int32_t timer_t314;
|
||||
int32_t timer_t316;
|
||||
int32_t timer_t318;
|
||||
int32_t timer_t319;
|
||||
int32_t timer_t322;
|
||||
|
||||
char* local_numbers[SNGISDN_NUM_LOCAL_NUMBERS];
|
||||
ftdm_timer_id_t timers[SNGISDN_NUM_SPAN_TIMERS];
|
||||
ftdm_sched_t *sched;
|
||||
@@ -479,6 +499,7 @@ ftdm_status_t get_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad);
|
||||
ftdm_status_t get_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd);
|
||||
ftdm_status_t get_facility_ie(ftdm_channel_t *ftdmchan, FacilityStr *facilityStr);
|
||||
ftdm_status_t get_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, uint8_t data_len);
|
||||
ftdm_status_t get_network_specific_fac(ftdm_channel_t *ftdmchan, NetFac *netFac);
|
||||
|
||||
ftdm_status_t set_calling_num(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb);
|
||||
ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb);
|
||||
@@ -488,6 +509,7 @@ ftdm_status_t set_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt);
|
||||
ftdm_status_t set_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad);
|
||||
ftdm_status_t set_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd, ftdm_sngisdn_progind_t prog_ind);
|
||||
ftdm_status_t set_bear_cap_ie(ftdm_channel_t *ftdmchan, BearCap *bearCap);
|
||||
ftdm_status_t set_network_specific_fac(ftdm_channel_t *ftdmchan, NetFac *netFac);
|
||||
ftdm_status_t set_chan_id_ie(ftdm_channel_t *ftdmchan, ChanId *chanId);
|
||||
ftdm_status_t set_restart_ind_ie(ftdm_channel_t *ftdmchan, RstInd *rstInd);
|
||||
ftdm_status_t set_facility_ie(ftdm_channel_t *ftdmchan, FacilityStr *facilityStr);
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
#include "ftmod_sangoma_isdn.h"
|
||||
|
||||
static ftdm_status_t parse_timer(const char* val, int32_t *target);
|
||||
static ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span);
|
||||
static ftdm_status_t parse_signalling(const char* signalling, ftdm_span_t *span);
|
||||
static ftdm_status_t add_local_number(const char* val, ftdm_span_t *span);
|
||||
@@ -42,6 +43,16 @@ static ftdm_status_t set_switchtype_defaults(ftdm_span_t *span);
|
||||
|
||||
extern ftdm_sngisdn_data_t g_sngisdn_data;
|
||||
|
||||
|
||||
static ftdm_status_t parse_timer(const char* val, int32_t *target)
|
||||
{
|
||||
*target = atoi(val);
|
||||
if (*target < 0) {
|
||||
*target = 0;
|
||||
}
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
static ftdm_status_t parse_yesno(const char* var, const char* val, uint8_t *target)
|
||||
{
|
||||
if (ftdm_true(val)) {
|
||||
@@ -369,15 +380,9 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
} else if (!strcasecmp(var, "facility-timeout")) {
|
||||
signal_data->facility_timeout = atoi(val);
|
||||
if (signal_data->facility_timeout < 0) {
|
||||
signal_data->facility_timeout = 0;
|
||||
}
|
||||
parse_timer(val, &signal_data->facility_timeout);
|
||||
} else if (!strcasecmp(var, "transfer-timeout")) {
|
||||
signal_data->transfer_timeout = atoi(val);
|
||||
if (signal_data->transfer_timeout < 0) {
|
||||
signal_data->transfer_timeout = 0;
|
||||
}
|
||||
parse_timer(val, &signal_data->transfer_timeout);
|
||||
} else if (!strcasecmp(var, "att-remove-dtmf")) {
|
||||
parse_yesno(var, val, &signal_data->att_remove_dtmf);
|
||||
} else if (!strcasecmp(var, "facility-ie-decode")) {
|
||||
@@ -428,6 +433,38 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_
|
||||
ftdm_log(FTDM_LOG_WARNING, "Invalid option %s for parameter %s\n", val, var);
|
||||
signal_data->send_cid_name = SNGISDN_OPT_DEFAULT;
|
||||
}
|
||||
} else if (!strcasecmp(var, "timer-t301")) {
|
||||
parse_timer(val, &signal_data->timer_t301);
|
||||
} else if (!strcasecmp(var, "timer-t302")) {
|
||||
parse_timer(val, &signal_data->timer_t302);
|
||||
} else if (!strcasecmp(var, "timer-t303")) {
|
||||
parse_timer(val, &signal_data->timer_t303);
|
||||
} else if (!strcasecmp(var, "timer-t304")) {
|
||||
parse_timer(val, &signal_data->timer_t304);
|
||||
} else if (!strcasecmp(var, "timer-t305")) {
|
||||
parse_timer(val, &signal_data->timer_t305);
|
||||
} else if (!strcasecmp(var, "timer-t306")) {
|
||||
parse_timer(val, &signal_data->timer_t306);
|
||||
} else if (!strcasecmp(var, "timer-t307")) {
|
||||
parse_timer(val, &signal_data->timer_t307);
|
||||
} else if (!strcasecmp(var, "timer-t308")) {
|
||||
parse_timer(val, &signal_data->timer_t308);
|
||||
} else if (!strcasecmp(var, "timer-t310")) {
|
||||
parse_timer(val, &signal_data->timer_t310);
|
||||
} else if (!strcasecmp(var, "timer-t312")) {
|
||||
parse_timer(val, &signal_data->timer_t312);
|
||||
} else if (!strcasecmp(var, "timer-t313")) {
|
||||
parse_timer(val, &signal_data->timer_t313);
|
||||
} else if (!strcasecmp(var, "timer-t314")) {
|
||||
parse_timer(val, &signal_data->timer_t314);
|
||||
} else if (!strcasecmp(var, "timer-t316")) {
|
||||
parse_timer(val, &signal_data->timer_t316);
|
||||
} else if (!strcasecmp(var, "timer-t318")) {
|
||||
parse_timer(val, &signal_data->timer_t318);
|
||||
} else if (!strcasecmp(var, "timer-t319")) {
|
||||
parse_timer(val, &signal_data->timer_t319);
|
||||
} else if (!strcasecmp(var, "timer-t322")) {
|
||||
parse_timer(val, &signal_data->timer_t322);
|
||||
} else {
|
||||
ftdm_log(FTDM_LOG_WARNING, "Ignoring unknown parameter %s\n", ftdm_parameters[paramindex].var);
|
||||
}
|
||||
|
||||
@@ -750,10 +750,12 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
|
||||
cfg.t.cfg.s.inDLSAP.redirAdr.eh.pres = NOTPRSNT; /* redirAdr Numbering Plan */
|
||||
cfg.t.cfg.s.inDLSAP.forwSubsc = FALSE; /* programmed forwarding subscription */
|
||||
cfg.t.cfg.s.inDLSAP.cndSubsc = TRUE; /* calling adddress delivery service subscription */
|
||||
|
||||
/* TODO: Fill in these timers with proper values - eventually pass them */
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t301.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t301.val = 180;
|
||||
if (signal_data->timer_t301 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t301.val = signal_data->timer_t301;
|
||||
}
|
||||
|
||||
/* It looks like ETSI is the only variant that supports Overlap */
|
||||
if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN) {
|
||||
@@ -764,21 +766,54 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t302.val = 0;
|
||||
}
|
||||
|
||||
if (signal_data->timer_t302 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t302.val = signal_data->timer_t302;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t303.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t303.val = 4;
|
||||
|
||||
if (signal_data->timer_t303 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t303.val = signal_data->timer_t303;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t304.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t304.val = 30;
|
||||
|
||||
if (signal_data->timer_t304 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t304.val = signal_data->timer_t304;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t305.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t305.val = 30;
|
||||
|
||||
if (signal_data->timer_t305 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t305.val = signal_data->timer_t305;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t306.enb = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t306.val = 35;
|
||||
|
||||
if (signal_data->timer_t306 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t306.val = signal_data->timer_t306;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t307.enb = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t307.val = 35;
|
||||
|
||||
if (signal_data->timer_t307 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t307.val = signal_data->timer_t307;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t308.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t308.val = 4;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t310.val = 120;
|
||||
|
||||
if (signal_data->timer_t308 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t308.val = signal_data->timer_t308;
|
||||
}
|
||||
|
||||
if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t312.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t312.val = cfg.t.cfg.s.inDLSAP.tmr.t303.val+2;
|
||||
@@ -786,18 +821,52 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t312.enb = FALSE;
|
||||
}
|
||||
|
||||
if (signal_data->timer_t310 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t310.val = signal_data->timer_t310;
|
||||
}
|
||||
|
||||
if (signal_data->timer_t312 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t312.val = signal_data->timer_t312;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t313.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t313.val = 4;
|
||||
|
||||
if (signal_data->timer_t313 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t313.val = signal_data->timer_t313;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t316.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t316.val = 120;
|
||||
|
||||
if (signal_data->timer_t316 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t316.val = signal_data->timer_t316;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t316c.enb = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t316c.val = 35;
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t318.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t318.val = 4;
|
||||
|
||||
if (signal_data->timer_t318 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t318.val = signal_data->timer_t318;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t319.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t319.val = 4;
|
||||
|
||||
if (signal_data->timer_t319 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t319.val = signal_data->timer_t319;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t322.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t322.val = 4;
|
||||
|
||||
if (signal_data->timer_t322 > 0) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t322.val = signal_data->timer_t322;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t332.enb = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t332.val = 35;
|
||||
|
||||
|
||||
@@ -133,8 +133,9 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
|
||||
get_redir_num(ftdmchan, &conEvnt->redirNmb);
|
||||
get_calling_subaddr(ftdmchan, &conEvnt->cgPtySad);
|
||||
get_prog_ind_ie(ftdmchan, &conEvnt->progInd);
|
||||
get_facility_ie(ftdmchan, &conEvnt->facilityStr);
|
||||
get_facility_ie(ftdmchan, &conEvnt->facilityStr);
|
||||
get_calling_name(ftdmchan, conEvnt);
|
||||
get_network_specific_fac(ftdmchan, &conEvnt->netFac[0]);
|
||||
|
||||
ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_INFO, "Incoming call: Called No:[%s] Calling No:[%s]\n", ftdmchan->caller_data.dnis.digits, ftdmchan->caller_data.cid_num.digits);
|
||||
|
||||
@@ -945,14 +946,8 @@ void sngisdn_process_sta_cfm (sngisdn_event_data_t *sngisdn_event)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 2: /* overlap sending/receiving */
|
||||
case 2: /* overlap sending */
|
||||
switch (ftdmchan->state) {
|
||||
case FTDM_CHANNEL_STATE_COLLECT:
|
||||
/* T302 Timeout reached */
|
||||
/* Send the call to user, and see if they accept it */
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "T302 Timer expired, proceeding with call\n");
|
||||
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING);
|
||||
break;
|
||||
case FTDM_CHANNEL_STATE_PROCEED:
|
||||
case FTDM_CHANNEL_STATE_PROGRESS:
|
||||
case FTDM_CHANNEL_STATE_RINGING:
|
||||
@@ -1069,7 +1064,10 @@ void sngisdn_process_sta_cfm (sngisdn_event_data_t *sngisdn_event)
|
||||
case 25: /* Overlap receiving */
|
||||
switch (ftdmchan->state) {
|
||||
case FTDM_CHANNEL_STATE_COLLECT:
|
||||
/* do nothing */
|
||||
/* T302 Timeout reached */
|
||||
/* Send the call to user, and see if they accept it */
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "T302 Timer expired, proceeding with call\n");
|
||||
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING);
|
||||
break;
|
||||
default:
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Don't know how to handle incompatible state. remote call state:%d our state:%s\n", call_state, ftdm_channel_state2str(ftdmchan->state));
|
||||
|
||||
@@ -69,6 +69,7 @@ void sngisdn_snd_setup(ftdm_channel_t *ftdmchan)
|
||||
set_calling_subaddr(ftdmchan, &conEvnt.cgPtySad);
|
||||
set_redir_num(ftdmchan, &conEvnt.redirNmb);
|
||||
set_calling_name(ftdmchan, &conEvnt);
|
||||
set_network_specific_fac(ftdmchan, &conEvnt.netFac[0]);
|
||||
|
||||
/* set_facility_ie will overwrite Calling Name for NI-2 if user specifies custom Facility IE */
|
||||
set_facility_ie(ftdmchan, &conEvnt.facilityStr);
|
||||
@@ -481,6 +482,12 @@ void sngisdn_snd_data(ftdm_channel_t *dchan, uint8_t *data, ftdm_size_t len)
|
||||
sng_l1_frame_t l1_frame;
|
||||
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) dchan->span->signal_data;
|
||||
|
||||
if (len > sizeof(l1_frame.data)) {
|
||||
ftdm_log_chan(dchan, FTDM_LOG_ERROR, "Received frame of %"FTDM_SIZE_FMT" bytes, exceeding max size of %"FTDM_SIZE_FMT" bytes\n",
|
||||
len, sizeof(l1_frame.data));
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&l1_frame, 0, sizeof(l1_frame));
|
||||
l1_frame.len = len;
|
||||
|
||||
|
||||
@@ -43,8 +43,21 @@ SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_descr, ftdm_sngisdn_progind_descr
|
||||
SNGISDN_ENUM_NAMES(SNGISDN_PROGIND_LOC_NAMES, SNGISDN_PROGIND_LOC_STRINGS)
|
||||
SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_loc, ftdm_sngisdn_progind_loc2str, ftdm_sngisdn_progind_loc_t, SNGISDN_PROGIND_LOC_NAMES, SNGISDN_PROGIND_LOC_INVALID)
|
||||
|
||||
static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val);
|
||||
static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val);
|
||||
SNGISDN_ENUM_NAMES(SNGISDN_NETSPECFAC_TYPE_NAMES, SNGISDN_NETSPECFAC_TYPE_STRINGS)
|
||||
SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_netspecfac_type, ftdm_sngisdn_netspecfac_type2str, ftdm_sngisdn_netspecfac_type_t, SNGISDN_NETSPECFAC_TYPE_NAMES, SNGISDN_NETSPECFAC_TYPE_INVALID)
|
||||
|
||||
SNGISDN_ENUM_NAMES(SNGISDN_NETSPECFAC_PLAN_NAMES, SNGISDN_NETSPECFAC_PLAN_STRINGS)
|
||||
SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_netspecfac_plan, ftdm_sngisdn_netspecfac_plan2str, ftdm_sngisdn_netspecfac_plan_t, SNGISDN_NETSPECFAC_PLAN_NAMES, SNGISDN_NETSPECFAC_PLAN_INVALID)
|
||||
|
||||
SNGISDN_ENUM_NAMES(SNGISDN_NETSPECFAC_SPEC_NAMES, SNGISDN_NETSPECFAC_SPEC_STRINGS)
|
||||
SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_netspecfac_spec, ftdm_sngisdn_netspecfac_spec2str, ftdm_sngisdn_netspecfac_spec_t, SNGISDN_NETSPECFAC_SPEC_NAMES, SNGISDN_NETSPECFAC_SPEC_INVALID)
|
||||
|
||||
static uint8_t _get_trillium_val(ftdm2trillium_t *vals, unsigned int num_vals, uint8_t ftdm_val, uint8_t default_val);
|
||||
static uint8_t _get_ftdm_val(ftdm2trillium_t *vals, unsigned int num_vals, uint8_t trillium_val, uint8_t default_val);
|
||||
|
||||
#define get_trillium_val(vals, ftdm_val, default_val) _get_trillium_val(vals, ftdm_array_len(vals), ftdm_val, default_val)
|
||||
#define get_ftdm_val(vals, trillium_val, default_val) _get_ftdm_val(vals, ftdm_array_len(vals), trillium_val, default_val)
|
||||
|
||||
ftdm_status_t get_calling_name_from_usr_usr(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr);
|
||||
ftdm_status_t get_calling_name_from_display(ftdm_channel_t *ftdmchan, Display *display);
|
||||
ftdm_status_t get_calling_name_from_ntDisplay(ftdm_channel_t *ftdmchan, NtDisplay *display);
|
||||
@@ -71,29 +84,51 @@ ftdm2trillium_t ton_codes[] = {
|
||||
{FTDM_TON_RESERVED, IN_TON_EXT},
|
||||
};
|
||||
|
||||
static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val)
|
||||
ftdm2trillium_t nsf_spec_codes[] = {
|
||||
{SNGISDN_NETSPECFAC_SPEC_ACCUNET, 0xe6},
|
||||
{SNGISDN_NETSPECFAC_SPEC_MEGACOM, 0xe3},
|
||||
{SNGISDN_NETSPECFAC_SPEC_MEGACOM_800, 0xe2},
|
||||
{SNGISDN_NETSPECFAC_SPEC_SDDN, 0xe1},
|
||||
{SNGISDN_NETSPECFAC_SPEC_INVALID, 0x00},
|
||||
};
|
||||
|
||||
ftdm2trillium_t nsf_type_codes[] = {
|
||||
{SNGISDN_NETSPECFAC_TYPE_USER_SPEC, 0x00},
|
||||
{SNGISDN_NETSPECFAC_TYPE_NATIONAL_NETWORK_IDENT, 0x02},
|
||||
{SNGISDN_NETSPECFAC_TYPE_INTERNATIONAL_NETWORK_IDENT, 0x03},
|
||||
{SNGISDN_NETSPECFAC_TYPE_INVALID, 0x00},
|
||||
};
|
||||
|
||||
ftdm2trillium_t nsf_plan_codes[] = {
|
||||
{SNGISDN_NETSPECFAC_PLAN_UNKNOWN, 0x00},
|
||||
{SNGISDN_NETSPECFAC_PLAN_CARRIER_IDENT, 0x01},
|
||||
{SNGISDN_NETSPECFAC_PLAN_DATA_NETWORK_IDENT, 0x03},
|
||||
{SNGISDN_NETSPECFAC_PLAN_INVALID, 0x00},
|
||||
};
|
||||
|
||||
static uint8_t _get_trillium_val(ftdm2trillium_t *vals, unsigned int num_vals, uint8_t ftdm_val, uint8_t default_val)
|
||||
{
|
||||
ftdm2trillium_t *val = vals;
|
||||
while(val++) {
|
||||
if (val->ftdm_val == ftdm_val) {
|
||||
return val->trillium_val;
|
||||
int i;
|
||||
for (i = 0; i < num_vals; i++) {
|
||||
if (vals[i].ftdm_val == ftdm_val) {
|
||||
return vals[i].trillium_val;
|
||||
}
|
||||
}
|
||||
|
||||
return default_val;
|
||||
}
|
||||
|
||||
static uint8_t _get_ftdm_val(ftdm2trillium_t *vals, unsigned int num_vals, uint8_t trillium_val, uint8_t default_val)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < num_vals; i++) {
|
||||
if (vals[i].trillium_val == trillium_val) {
|
||||
return vals[i].ftdm_val;
|
||||
}
|
||||
}
|
||||
return default_val;
|
||||
}
|
||||
|
||||
static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val)
|
||||
{
|
||||
ftdm2trillium_t *val = vals;
|
||||
while(val++) {
|
||||
if (val->trillium_val == trillium_val) {
|
||||
return val->ftdm_val;
|
||||
}
|
||||
}
|
||||
return default_val;
|
||||
}
|
||||
|
||||
|
||||
void clear_call_data(sngisdn_chan_data_t *sngisdn_info)
|
||||
{
|
||||
uint32_t cc_id = ((sngisdn_span_data_t*)sngisdn_info->ftdmchan->span->signal_data)->cc_id;
|
||||
@@ -530,6 +565,29 @@ ftdm_status_t get_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd)
|
||||
}
|
||||
|
||||
|
||||
ftdm_status_t get_network_specific_fac(ftdm_channel_t *ftdmchan, NetFac *netFac)
|
||||
{
|
||||
if (!netFac->eh.pres) {
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
if (netFac->netFacSpec.pres == PRSNT_NODEF) {
|
||||
char digits_string [32];
|
||||
memcpy(digits_string, (const char*)netFac->netFacSpec.val, netFac->netFacSpec.len);
|
||||
digits_string[netFac->netFacSpec.len] = '\0';
|
||||
sngisdn_add_var((sngisdn_chan_data_t*)ftdmchan->call_data, "isdn.netFac.spec", digits_string);
|
||||
}
|
||||
|
||||
if (netFac->typeNetId.pres == PRSNT_NODEF) {
|
||||
sngisdn_add_var((sngisdn_chan_data_t*)ftdmchan->call_data, "isdn.netFac.type", ftdm_sngisdn_netspecfac_type2str(get_ftdm_val(nsf_type_codes, netFac->typeNetId.val, 0x00)));
|
||||
}
|
||||
|
||||
if (netFac->netIdPlan.pres == PRSNT_NODEF) {
|
||||
sngisdn_add_var((sngisdn_chan_data_t*)ftdmchan->call_data, "isdn.netFac.plan", ftdm_sngisdn_netspecfac_type2str(get_ftdm_val(nsf_plan_codes, netFac->netIdPlan.val, 0x00)));
|
||||
}
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t set_calling_num(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
||||
{
|
||||
ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
|
||||
@@ -900,6 +958,67 @@ ftdm_status_t set_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd, ftdm_s
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t set_network_specific_fac(ftdm_channel_t *ftdmchan, NetFac *netFac)
|
||||
{
|
||||
const char *str = NULL;
|
||||
|
||||
str = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.netFac.spec");
|
||||
if (ftdm_strlen_zero(str)) {
|
||||
/* Network-specific facility specification is mandatory, cannot send IE
|
||||
without it */
|
||||
return FTDM_SUCCESS;
|
||||
} else {
|
||||
ftdm_sngisdn_netspecfac_spec_t spec = ftdm_str2ftdm_sngisdn_netspecfac_spec(str);
|
||||
|
||||
netFac->eh.pres = PRSNT_NODEF;
|
||||
netFac->netFacSpec.pres = PRSNT_NODEF;
|
||||
|
||||
if (spec == SNGISDN_NETSPECFAC_SPEC_INVALID) {
|
||||
int byte = 0;
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Non-standard NSF specified:%s\n", str);
|
||||
|
||||
if (sscanf(str, "%x", &byte) == 1) {
|
||||
netFac->netFacSpec.val[0] = byte & 0xFF;
|
||||
}
|
||||
|
||||
netFac->netFacSpec.len = 1;
|
||||
} else {
|
||||
/* User is using one of the pre-specified NSF's */
|
||||
netFac->netFacSpec.val[0] = get_trillium_val(nsf_spec_codes, spec, 0x00);
|
||||
netFac->netFacSpec.len = 1;
|
||||
}
|
||||
}
|
||||
|
||||
netFac->lenNetId.pres = PRSNT_NODEF;
|
||||
netFac->lenNetId.val = 0;
|
||||
|
||||
str = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.netFac.type");
|
||||
if (!ftdm_strlen_zero(str)) {
|
||||
netFac->typeNetId.pres = PRSNT_NODEF;
|
||||
netFac->typeNetId.val = ftdm_str2ftdm_sngisdn_netspecfac_type(str);
|
||||
}
|
||||
|
||||
str = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.netFac.plan");
|
||||
if (!ftdm_strlen_zero(str)) {
|
||||
netFac->netIdPlan.pres = PRSNT_NODEF;
|
||||
netFac->netIdPlan.val = ftdm_str2ftdm_sngisdn_netspecfac_plan(str);
|
||||
}
|
||||
|
||||
if (netFac->netIdPlan.pres == PRSNT_NODEF || netFac->typeNetId.pres == PRSNT_NODEF) {
|
||||
netFac->lenNetId.val++;
|
||||
}
|
||||
|
||||
str = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.netFac.ident");
|
||||
if (!ftdm_strlen_zero(str)) {
|
||||
netFac->lenNetId.val++;
|
||||
|
||||
netFac->netId.pres = PRSNT_NODEF;
|
||||
memcpy(netFac->netId.val, str, strlen(str));
|
||||
}
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t set_user_to_user_ie(ftdm_channel_t *ftdmchan, UsrUsr *usrUsr)
|
||||
{
|
||||
sngisdn_chan_data_t *sngisdn_info = ftdmchan->call_data;
|
||||
|
||||
@@ -771,7 +771,7 @@ uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset
|
||||
default:
|
||||
{
|
||||
*str_len += sprintf(&str[*str_len], "Undecoded");
|
||||
print_hex_dump((char*)str, str_len, data, index_start, index_end);
|
||||
print_hex_dump((char*)str, str_len, data, index_start, index_end + 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -101,6 +101,42 @@ typedef enum {
|
||||
#define SNGISDN_PROGIND_LOC_STRINGS "user", "private-net-local-user", "public-net-local-user", "transit-network", "public-net-remote-user", "private-net-remote-user", "beyond-interworking", "invalid"
|
||||
SNGISDN_STR2ENUM_P(ftdm_str2ftdm_sngisdn_progind_loc, ftdm_sngisdn_progind_loc2str, ftdm_sngisdn_progind_loc_t);
|
||||
|
||||
typedef enum {
|
||||
/* User Specified */
|
||||
SNGISDN_NETSPECFAC_TYPE_USER_SPEC,
|
||||
/* National network identification */
|
||||
SNGISDN_NETSPECFAC_TYPE_NATIONAL_NETWORK_IDENT,
|
||||
/* International network identification */
|
||||
SNGISDN_NETSPECFAC_TYPE_INTERNATIONAL_NETWORK_IDENT,
|
||||
/* Invalid */
|
||||
SNGISDN_NETSPECFAC_TYPE_INVALID,
|
||||
} ftdm_sngisdn_netspecfac_type_t;
|
||||
#define SNGISDN_NETSPECFAC_TYPE_STRINGS "user-specified", "national-network-identification", "national-network-identification", "invalid"
|
||||
SNGISDN_STR2ENUM_P(ftdm_str2ftdm_sngisdn_netspecfac_type, ftdm_sngisdn_netspecfac_type2str, ftdm_sngisdn_netspecfac_type_t);
|
||||
|
||||
typedef enum {
|
||||
/* Unknown */
|
||||
SNGISDN_NETSPECFAC_PLAN_UNKNOWN,
|
||||
/* Carrier Identification Code */
|
||||
SNGISDN_NETSPECFAC_PLAN_CARRIER_IDENT,
|
||||
/* Data network identification code */
|
||||
SNGISDN_NETSPECFAC_PLAN_DATA_NETWORK_IDENT,
|
||||
/* Invalid */
|
||||
SNGISDN_NETSPECFAC_PLAN_INVALID,
|
||||
} ftdm_sngisdn_netspecfac_plan_t;
|
||||
#define SNGISDN_NETSPECFAC_PLAN_STRINGS "unknown", "carrier-identification", "data-network-identification", "invalid"
|
||||
SNGISDN_STR2ENUM_P(ftdm_str2ftdm_sngisdn_netspecfac_plan, ftdm_sngisdn_netspecfac_plan2str, ftdm_sngisdn_netspecfac_plan_t);
|
||||
|
||||
typedef enum {
|
||||
/* Unknown */
|
||||
SNGISDN_NETSPECFAC_SPEC_ACCUNET,
|
||||
SNGISDN_NETSPECFAC_SPEC_MEGACOM,
|
||||
SNGISDN_NETSPECFAC_SPEC_MEGACOM_800,
|
||||
SNGISDN_NETSPECFAC_SPEC_SDDN,
|
||||
SNGISDN_NETSPECFAC_SPEC_INVALID,
|
||||
} ftdm_sngisdn_netspecfac_spec_t;
|
||||
#define SNGISDN_NETSPECFAC_SPEC_STRINGS "accunet", "megacom", "megacom-800", "sddn", "invalid"
|
||||
SNGISDN_STR2ENUM_P(ftdm_str2ftdm_sngisdn_netspecfac_spec, ftdm_sngisdn_netspecfac_spec2str, ftdm_sngisdn_netspecfac_spec_t);
|
||||
|
||||
#endif /* __FTMOD_SANGOMA_ISDN_USER_H__*/
|
||||
|
||||
|
||||
@@ -233,11 +233,11 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa
|
||||
|
||||
if (!strcasecmp(var, "dialplan")) {
|
||||
/**********************************************************************/
|
||||
/* do i give a shit about this??? */
|
||||
/* don't care for now */
|
||||
/**********************************************************************/
|
||||
} else if (!strcasecmp(var, "context")) {
|
||||
/**********************************************************************/
|
||||
/* do i give a shit about this??? */
|
||||
/* don't care for now */
|
||||
/**********************************************************************/
|
||||
} else if (!strcasecmp(var, "ccSpanId")) {
|
||||
/**********************************************************************/
|
||||
|
||||
@@ -471,6 +471,7 @@ static FIO_CONFIGURE_FUNCTION(wanpipe_configure)
|
||||
wp_globals.ring_off_ms = num;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
@@ -1010,7 +1011,7 @@ static FIO_READ_FUNCTION(wanpipe_read)
|
||||
|
||||
memset(&hdrframe, 0, sizeof(hdrframe));
|
||||
rx_len = sangoma_readmsg_tdm(ftdmchan->sockfd, &hdrframe, (int)sizeof(hdrframe), data, (int)*datalen, 0);
|
||||
*datalen = rx_len;
|
||||
*datalen = 0;
|
||||
|
||||
if (rx_len == 0) {
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_WARNING, "Read 0 bytes\n");
|
||||
@@ -1027,6 +1028,7 @@ static FIO_READ_FUNCTION(wanpipe_read)
|
||||
#endif
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
*datalen = rx_len;
|
||||
|
||||
if (ftdm_channel_test_feature(ftdmchan, FTDM_CHANNEL_FEATURE_IO_STATS)) {
|
||||
wanpipe_read_stats(ftdmchan, &hdrframe);
|
||||
@@ -1468,13 +1470,19 @@ static __inline__ ftdm_status_t wanpipe_channel_process_event(ftdm_channel_t *fc
|
||||
|
||||
if (tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_dtmf_type == WAN_EC_TONE_PRESENT) {
|
||||
ftdm_set_flag(fchan, FTDM_CHANNEL_MUTE);
|
||||
fchan->dtmfdetect.start_time = ftdm_current_time_in_ms();
|
||||
}
|
||||
|
||||
if (tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_dtmf_type == WAN_EC_TONE_STOP) {
|
||||
ftdm_clear_flag(fchan, FTDM_CHANNEL_MUTE);
|
||||
if (ftdm_test_flag(fchan, FTDM_CHANNEL_INUSE)) {
|
||||
ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Queuing wanpipe DTMF: %c\n", tmp_dtmf[0]);
|
||||
ftdm_channel_queue_dtmf(fchan, tmp_dtmf);
|
||||
ftdm_time_t diff = ftdm_current_time_in_ms() - fchan->dtmfdetect.start_time;
|
||||
if (diff > fchan->dtmfdetect.duration_ms) {
|
||||
ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Queuing wanpipe DTMF: %c (duration:%d min:%d)\n", tmp_dtmf[0], diff, fchan->dtmfdetect.duration_ms);
|
||||
ftdm_channel_queue_dtmf(fchan, tmp_dtmf);
|
||||
} else {
|
||||
ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Ignoring wanpipe DTMF: %c (duration:%d min:%d)\n", tmp_dtmf[0], diff, fchan->dtmfdetect.duration_ms);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
*
|
||||
* Moises Silva <moy@sangoma.com>
|
||||
* W McRoberts <fs@whmcr.com>
|
||||
* Puskás Zsolt <errotan@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -877,10 +878,13 @@ static FIO_COMMAND_FUNCTION(zt_command)
|
||||
static FIO_GET_ALARMS_FUNCTION(zt_get_alarms)
|
||||
{
|
||||
struct zt_spaninfo info;
|
||||
zt_params_t params;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.span_no = ftdmchan->physical_span_id;
|
||||
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
|
||||
if (ioctl(CONTROL_FD, codes.SPANSTAT, &info)) {
|
||||
snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "ioctl failed (%s)", strerror(errno));
|
||||
snprintf(ftdmchan->span->last_error, sizeof(ftdmchan->span->last_error), "ioctl failed (%s)", strerror(errno));
|
||||
@@ -889,6 +893,27 @@ static FIO_GET_ALARMS_FUNCTION(zt_get_alarms)
|
||||
|
||||
ftdmchan->alarm_flags = info.alarms;
|
||||
|
||||
/* get channel alarms if span has no alarms */
|
||||
if (info.alarms == FTDM_ALARM_NONE) {
|
||||
if (ioctl(ftdmchan->sockfd, codes.GET_PARAMS, ¶ms)) {
|
||||
snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "ioctl failed (%s)", strerror(errno));
|
||||
snprintf(ftdmchan->span->last_error, sizeof(ftdmchan->span->last_error), "ioctl failed (%s)", strerror(errno));
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
if (params.chan_alarms > 0) {
|
||||
if (params.chan_alarms == DAHDI_ALARM_YELLOW) {
|
||||
ftdmchan->alarm_flags = FTDM_ALARM_YELLOW;
|
||||
}
|
||||
else if (params.chan_alarms == DAHDI_ALARM_BLUE) {
|
||||
ftdmchan->alarm_flags = FTDM_ALARM_BLUE;
|
||||
}
|
||||
else {
|
||||
ftdmchan->alarm_flags = FTDM_ALARM_RED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1350,6 +1375,7 @@ static FIO_IO_LOAD_FUNCTION(zt_init)
|
||||
zt_interface.write = zt_write;
|
||||
zt_interface.poll_event = zt_poll_event;
|
||||
zt_interface.next_event = zt_next_event;
|
||||
zt_interface.channel_next_event = zt_channel_next_event;
|
||||
zt_interface.channel_destroy = zt_channel_destroy;
|
||||
zt_interface.get_alarms = zt_get_alarms;
|
||||
*fio = &zt_interface;
|
||||
|
||||
@@ -339,6 +339,10 @@ ZT_ABIT = 8
|
||||
#define DAHDI_HDLCRAWMODE _IOW (DAHDI_CODE, 36, int) /* Set a clear channel into HDLC w/out FCS checking/calculation mode */
|
||||
#define DAHDI_HDLCFCSMODE _IOW (DAHDI_CODE, 37, int) /* Set a clear channel into HDLC w/ FCS mode */
|
||||
|
||||
/* Dahdi channel alarms */
|
||||
#define DAHDI_ALARM_YELLOW (1 << 2) /* Yellow Alarm */
|
||||
#define DAHDI_ALARM_BLUE (1 << 4) /* Blue Alarm */
|
||||
|
||||
/* Specify a channel on /dev/dahdi/chan -- must be done before any other ioctl's and is only valid on /dev/dahdi/chan */
|
||||
#define DAHDI_SPECIFY _IOW (DAHDI_CODE, 38, int)
|
||||
|
||||
|
||||
@@ -480,7 +480,7 @@ typedef enum {
|
||||
FTDM_STR2ENUM_P(ftdm_str2ftdm_trunk_type, ftdm_trunk_type2str, ftdm_trunk_type_t)
|
||||
|
||||
/*! \brief Basic channel configuration provided to ftdm_configure_span_channels */
|
||||
typedef struct ftdm_channel_config {
|
||||
typedef struct ftdm_channel_config {
|
||||
char name[FTDM_MAX_NAME_STR_SZ];
|
||||
char number[FTDM_MAX_NUMBER_STR_SZ];
|
||||
char group_name[FTDM_MAX_NAME_STR_SZ];
|
||||
@@ -488,6 +488,7 @@ typedef struct ftdm_channel_config {
|
||||
float rxgain;
|
||||
float txgain;
|
||||
uint8_t debugdtmf;
|
||||
uint32_t dtmfdetect_ms;
|
||||
uint8_t iostats;
|
||||
} ftdm_channel_config_t;
|
||||
|
||||
|
||||
@@ -384,6 +384,11 @@ typedef struct {
|
||||
ftdm_mutex_t *mutex;
|
||||
} ftdm_dtmf_debug_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t duration_ms;
|
||||
ftdm_time_t start_time;
|
||||
} ftdm_dtmf_detect_t;
|
||||
|
||||
/* 2^8 table size, one for each byte (sample) value */
|
||||
#define FTDM_GAINS_TABLE_SIZE 256
|
||||
struct ftdm_channel {
|
||||
@@ -463,6 +468,7 @@ struct ftdm_channel {
|
||||
ftdm_timer_id_t hangup_timer;
|
||||
ftdm_channel_iostats_t iostats;
|
||||
ftdm_dtmf_debug_t dtmfdbg;
|
||||
ftdm_dtmf_detect_t dtmfdetect;
|
||||
ftdm_io_dump_t rxdump;
|
||||
ftdm_io_dump_t txdump;
|
||||
ftdm_interrupt_t *state_completed_interrupt; /*!< Notify when a state change is completed */
|
||||
|
||||
Reference in new issue
Block a user