mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-03-13 20:50:41 +00:00
Merge branch 'master' into netborder
This commit is contained in:
commit
86884e5256
@ -25,7 +25,7 @@
|
||||
<param name="colorize-console" value="true"/>
|
||||
|
||||
<!-- minimum idle CPU before refusing calls -->
|
||||
<param name="min-idle-cpu" value="25"/>
|
||||
<!--<param name="min-idle-cpu" value="25"/>-->
|
||||
|
||||
<!--
|
||||
Max number of sessions to allow at any given time.
|
||||
|
@ -1055,28 +1055,18 @@ switch_io_routines_t freetdm_io_routines = {
|
||||
static const char* channel_get_variable(switch_core_session_t *session, switch_event_t *var_event, const char *variable_name)
|
||||
{
|
||||
const char *variable = NULL;
|
||||
|
||||
if (var_event) {
|
||||
if ((variable = switch_event_get_header(var_event, variable_name))) {
|
||||
return variable;
|
||||
}
|
||||
}
|
||||
|
||||
if (session) {
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
if ((variable = switch_channel_get_variable(channel, variable_name))) {
|
||||
return variable;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// This is unsafe, I don't see anywhere in the whole code where this is called with NULL session anyway.
|
||||
// There is a new switch_core_get_variable_dup that will strdup it for you and then you must free it.
|
||||
// That messes up the abstraction completely so I am just commenting it out for you.....
|
||||
/*
|
||||
if ((variable = switch_core_get_variable(variable_name))) {
|
||||
return variable;
|
||||
}
|
||||
*/
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -2743,10 +2743,9 @@ static ftdm_status_t ftdmchan_activate_dtmf_buffer(ftdm_channel_t *ftdmchan)
|
||||
if (!ftdmchan->dtmf_buffer) {
|
||||
if (ftdm_buffer_create(&ftdmchan->dtmf_buffer, 1024, 3192, 0) != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Failed to allocate DTMF Buffer!\n");
|
||||
snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "buffer error");
|
||||
return FTDM_FAIL;
|
||||
} else {
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Created DTMF Buffer!\n");
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Created DTMF buffer\n");
|
||||
}
|
||||
}
|
||||
|
||||
@ -3588,8 +3587,17 @@ static FIO_READ_FUNCTION(ftdm_raw_read)
|
||||
return status;
|
||||
}
|
||||
|
||||
static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
/* This function takes care of automatically generating DTMF or FSK tones when needed */
|
||||
static ftdm_status_t handle_tone_generation(ftdm_channel_t *ftdmchan)
|
||||
{
|
||||
/*
|
||||
* datalen: size in bytes of the chunk of data the user requested to read (this function
|
||||
* is called from the ftdm_channel_read function)
|
||||
* dblen: size currently in use in any of the tone generation buffers (data available in the buffer)
|
||||
* gen_dtmf_buffer: buffer holding the raw ASCII digits that the user requested to generate
|
||||
* dtmf_buffer: raw linear tone data generated by teletone to be written to the devices
|
||||
* fsk_buffer: raw linear FSK modulated data for caller id
|
||||
*/
|
||||
ftdm_buffer_t *buffer = NULL;
|
||||
ftdm_size_t dblen = 0;
|
||||
int wrote = 0;
|
||||
@ -3604,7 +3612,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
}
|
||||
|
||||
if (ftdm_buffer_read(ftdmchan->gen_dtmf_buffer, digits, dblen) && !ftdm_strlen_zero_buf(digits)) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generating DTMF [%s]\n", digits);
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generating DTMF [%s]\n", digits);
|
||||
|
||||
cur = digits;
|
||||
|
||||
@ -3618,7 +3626,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
ftdm_buffer_write(ftdmchan->dtmf_buffer, ftdmchan->tone_session.buffer, wrote * 2);
|
||||
x++;
|
||||
} else {
|
||||
ftdm_log(FTDM_LOG_ERROR, "%d:%d Problem Adding DTMF SEQ [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, digits);
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Problem adding DTMF sequence [%s]\n", digits);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
}
|
||||
@ -3631,6 +3639,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
|
||||
|
||||
if (!ftdmchan->buffer_delay || --ftdmchan->buffer_delay == 0) {
|
||||
/* time to pick a buffer, either the dtmf or fsk buffer */
|
||||
if (ftdmchan->dtmf_buffer && (dblen = ftdm_buffer_inuse(ftdmchan->dtmf_buffer))) {
|
||||
buffer = ftdmchan->dtmf_buffer;
|
||||
} else if (ftdmchan->fsk_buffer && (dblen = ftdm_buffer_inuse(ftdmchan->fsk_buffer))) {
|
||||
@ -3638,22 +3647,39 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
}
|
||||
}
|
||||
|
||||
/* if we picked a buffer, time to read from it and write the linear data to the device */
|
||||
if (buffer) {
|
||||
ftdm_size_t dlen = datalen;
|
||||
uint8_t auxbuf[1024];
|
||||
ftdm_size_t dlen = ftdmchan->packet_len;
|
||||
ftdm_size_t len, br, max = sizeof(auxbuf);
|
||||
|
||||
/* if the codec is not linear, then data is really twice as much cuz
|
||||
tone generation is done in linear (we assume anything different than linear is G.711) */
|
||||
if (ftdmchan->native_codec != FTDM_CODEC_SLIN) {
|
||||
dlen *= 2;
|
||||
}
|
||||
|
||||
|
||||
/* we do not expect the user chunks to be bigger than auxbuf */
|
||||
ftdm_assert((dlen <= sizeof(auxbuf)), "Unexpected size for user data chunk size\n");
|
||||
|
||||
/* dblen is the size in use for dtmf_buffer or fsk_buffer, and dlen is the size
|
||||
* of the io chunks to write, we pick the smaller one */
|
||||
len = dblen > dlen ? dlen : dblen;
|
||||
|
||||
/* we can't read more than the size of our auxiliary buffer */
|
||||
ftdm_assert((len <= sizeof(auxbuf)), "Unexpected size to read into auxbuf\n");
|
||||
|
||||
br = ftdm_buffer_read(buffer, auxbuf, len);
|
||||
|
||||
/* the amount read can't possibly be bigger than what we requested */
|
||||
ftdm_assert((br <= len), "Unexpected size read from tone generation buffer\n");
|
||||
|
||||
/* if we read less than the chunk size, we must fill in with silence the rest */
|
||||
if (br < dlen) {
|
||||
memset(auxbuf + br, 0, dlen - br);
|
||||
}
|
||||
|
||||
/* finally we convert to the native format for the channel if necessary */
|
||||
if (ftdmchan->native_codec != FTDM_CODEC_SLIN) {
|
||||
if (ftdmchan->native_codec == FTDM_CODEC_ULAW) {
|
||||
fio_slin2ulaw(auxbuf, max, &dlen);
|
||||
@ -3662,6 +3688,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
}
|
||||
}
|
||||
|
||||
/* write the tone to the channel */
|
||||
return ftdm_raw_write(ftdmchan, auxbuf, &dlen);
|
||||
}
|
||||
|
||||
@ -3741,7 +3768,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
|
||||
rdata[i] = ftdmchan->rxgain_table[rdata[i]];
|
||||
}
|
||||
}
|
||||
handle_dtmf(ftdmchan, *datalen);
|
||||
handle_tone_generation(ftdmchan);
|
||||
|
||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE) && ftdmchan->effective_codec != ftdmchan->native_codec) {
|
||||
if (ftdmchan->native_codec == FTDM_CODEC_ULAW && ftdmchan->effective_codec == FTDM_CODEC_SLIN) {
|
||||
@ -3938,7 +3965,8 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *dat
|
||||
if (!ftdmchan->buffer_delay &&
|
||||
((ftdmchan->dtmf_buffer && ftdm_buffer_inuse(ftdmchan->dtmf_buffer)) ||
|
||||
(ftdmchan->fsk_buffer && ftdm_buffer_inuse(ftdmchan->fsk_buffer)))) {
|
||||
/* read size writing DTMF ATM */
|
||||
/* generating some kind of tone at the moment (see handle_tone_generation),
|
||||
* we ignore user data ... */
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -84,6 +84,8 @@ static ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span
|
||||
signal_data->switchtype = SNGISDN_SWITCH_4ESS;
|
||||
} else if (!strcasecmp(switch_name, "dms100")) {
|
||||
signal_data->switchtype = SNGISDN_SWITCH_DMS100;
|
||||
} else if (!strcasecmp(switch_name, "qsig")) {
|
||||
signal_data->switchtype = SNGISDN_SWITCH_QSIG;
|
||||
} else {
|
||||
ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported switchtype %s for trunktype:%s\n", span->name, switch_name, ftdm_trunk_type2str(span->trunk_type));
|
||||
return FTDM_FAIL;
|
||||
|
@ -667,25 +667,33 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
|
||||
cfg.t.cfg.s.inDLSAP.maxBSrvCnt = 2;
|
||||
cfg.t.cfg.s.inDLSAP.maxDSrvCnt = 2;
|
||||
#endif /* ISDN_SRV */
|
||||
|
||||
if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
|
||||
cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.intType = NETWORK;
|
||||
cfg.t.cfg.s.inDLSAP.clrGlr = FALSE; /* in case of glare, do not clear local call */
|
||||
cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE;
|
||||
|
||||
if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN ||
|
||||
signal_data->switchtype == SNGISDN_SWITCH_INSNET) {
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
|
||||
} else {
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
|
||||
}
|
||||
} else {
|
||||
cfg.t.cfg.s.inDLSAP.ackOpt = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.intType = USER;
|
||||
if (signal_data->switchtype == SNGISDN_SWITCH_QSIG) {
|
||||
cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.intType = SYM_USER;
|
||||
cfg.t.cfg.s.inDLSAP.clrGlr = TRUE; /* in case of glare, clear local call */
|
||||
cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
|
||||
} else {
|
||||
if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
|
||||
cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.intType = NETWORK;
|
||||
cfg.t.cfg.s.inDLSAP.clrGlr = FALSE; /* in case of glare, do not clear local call */
|
||||
cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE;
|
||||
|
||||
if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN ||
|
||||
signal_data->switchtype == SNGISDN_SWITCH_INSNET) {
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
|
||||
} else {
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
|
||||
}
|
||||
} else {
|
||||
cfg.t.cfg.s.inDLSAP.ackOpt = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.intType = USER;
|
||||
cfg.t.cfg.s.inDLSAP.clrGlr = TRUE; /* in case of glare, clear local call */
|
||||
cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Override the restart options if user selected that option */
|
||||
|
@ -352,22 +352,6 @@ int ft_to_sngss7_cfg_all(void)
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) */
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpRoute[1].id != 0) {
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtpRoute[0].flags & SNGSS7_CONFIGURED)) {
|
||||
|
||||
if (ftmod_ss7_mtp3_route_config(0)) {
|
||||
SS7_CRITICAL("MTP3 ROUTE 0 configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("MTP3 ROUTE 0 configuration DONE!\n");
|
||||
}
|
||||
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].flags |= SNGSS7_CONFIGURED;
|
||||
} /* if !SNGSS7_CONFIGURED */
|
||||
}
|
||||
|
||||
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isap[x].id != 0) {
|
||||
/* check if this link has been configured already */
|
||||
@ -1161,10 +1145,10 @@ int ftmod_ss7_mtp3_route_config(int id)
|
||||
cfg.t.cfg.s.snRout.swtchType = k->linkType; /* switch type */
|
||||
cfg.t.cfg.s.snRout.upSwtch = k->switchType; /* user part switch type */
|
||||
cfg.t.cfg.s.snRout.cmbLnkSetId = k->cmbLinkSetId; /* combined link set ID */
|
||||
if (k->id == 0) {
|
||||
cfg.t.cfg.s.snRout.dir = LSN_RTE_UP; /* direction */
|
||||
if (k->dir == SNG_RTE_UP) {
|
||||
cfg.t.cfg.s.snRout.dir = LSN_RTE_UP; /* direction */
|
||||
} else {
|
||||
cfg.t.cfg.s.snRout.dir = LSN_RTE_DN; /* direction */
|
||||
cfg.t.cfg.s.snRout.dir = LSN_RTE_DN; /* direction */
|
||||
}
|
||||
cfg.t.cfg.s.snRout.rteToAdjSp = 0; /* flag indicating this route to adjacent SP */
|
||||
cfg.t.cfg.s.snRout.ssf = k->ssf; /* sub service field */
|
||||
|
@ -680,8 +680,8 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream)
|
||||
stream->write_function(stream, "ftdm ss7 set mtrace X Y\n");
|
||||
stream->write_function(stream, "\n");
|
||||
stream->write_function(stream, "Ftmod_sangoma_ss7 information:\n");
|
||||
stream->write_function(stream, "ftdm ss7 show status link X\n");
|
||||
stream->write_function(stream, "ftdm ss7 show status linkset X\n");
|
||||
stream->write_function(stream, "ftdm ss7 show status mtp3 X\n");
|
||||
stream->write_function(stream, "ftdm ss7 show status mtp2 X\n");
|
||||
stream->write_function(stream, "ftdm ss7 show status span X chan Y\n");
|
||||
stream->write_function(stream, "ftdm ss7 show free span X chan Y\n");
|
||||
stream->write_function(stream, "ftdm ss7 show inuse span X chan Y\n");
|
||||
|
@ -273,6 +273,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
|
||||
ftdm_interrupt_t *ftdm_sangoma_ss7_int[2];
|
||||
ftdm_span_t *ftdmspan = (ftdm_span_t *) obj;
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
ftdm_event_t *event = NULL;
|
||||
sngss7_event_data_t *sngss7_event = NULL;
|
||||
sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data;
|
||||
|
||||
@ -363,6 +364,22 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
|
||||
|
||||
/* check each channel on the span to see if there is an un-procressed SUS/RES flag */
|
||||
check_for_res_sus_flag(ftdmspan);
|
||||
|
||||
/* Poll for events, e.g HW DTMF */
|
||||
switch (ftdm_span_poll_event(ftdmspan, 0, NULL)) {
|
||||
/**********************************************************************/
|
||||
case FTDM_SUCCESS:
|
||||
while (ftdm_span_next_event(ftdmspan, &event) == FTDM_SUCCESS);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case FTDM_TIMEOUT:
|
||||
/* No events pending */
|
||||
break;
|
||||
/**********************************************************************/
|
||||
default:
|
||||
SS7_ERROR("%s:Failed to poll span event\n", ftdmspan->name);
|
||||
/**********************************************************************/
|
||||
} /* switch (ftdm_span_poll_event(span, 0)) */
|
||||
} /* master while loop */
|
||||
|
||||
/* clear the IN_THREAD flag so that we know the thread is done */
|
||||
|
@ -82,6 +82,11 @@ typedef enum {
|
||||
HOLE
|
||||
} sng_ckt_type_t;
|
||||
|
||||
typedef enum {
|
||||
SNG_RTE_UP = 0,
|
||||
SNG_RTE_DN
|
||||
} sng_route_direction_t;
|
||||
|
||||
typedef enum {
|
||||
SNGSS7_LPA_FOR_COT = (1 << 0), /* send LPA when COT arrives */
|
||||
SNGSS7_ACM_OBCI_BITA = (1 << 10) /* in-band indication */
|
||||
@ -236,6 +241,7 @@ typedef struct sng_route {
|
||||
uint32_t ssf;
|
||||
uint32_t nwId;
|
||||
uint32_t isSTP;
|
||||
uint32_t dir;
|
||||
uint32_t t6;
|
||||
uint32_t t8;
|
||||
uint32_t t10;
|
||||
|
@ -1749,33 +1749,46 @@ static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
|
||||
/* default the interface to paused state */
|
||||
sngss7_set_flag(&sng_isup, SNGSS7_PAUSED);
|
||||
|
||||
|
||||
|
||||
/* trickle down the SPC to all sub entities */
|
||||
lnkSet = &g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].lnkSets;
|
||||
|
||||
g_ftdm_sngss7_data.cfg.mtp3Link[lnkSet->lsId].spc = sng_isup.spc;
|
||||
lnkSet = lnkSet->next;
|
||||
|
||||
while (lnkSet->next != NULL) {
|
||||
g_ftdm_sngss7_data.cfg.mtp3Link[lnkSet->lsId].spc = sng_isup.spc;
|
||||
/**************************************************************************/
|
||||
/* go through all the links and check if they belong to this linkset*/
|
||||
i = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtp3Link[i].id != 0) {
|
||||
/* check if this link is in the linkset */
|
||||
if (g_ftdm_sngss7_data.cfg.mtp3Link[i].linkSetId == lnkSet->lsId) {
|
||||
/* fill in the spc */
|
||||
g_ftdm_sngss7_data.cfg.mtp3Link[i].spc = sng_isup.spc;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
/* move to the next lnkSet */
|
||||
lnkSet = lnkSet->next;
|
||||
}
|
||||
/**************************************************************************/
|
||||
} /* while (lnkSet->next != NULL) */
|
||||
|
||||
/* pull values from the lower levels */
|
||||
sng_isup.dpc = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].dpc;
|
||||
sng_isup.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].switchType;
|
||||
sng_isup.nwId = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].nwId;
|
||||
|
||||
sng_isap.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].switchType;
|
||||
|
||||
/* fill in the isap */
|
||||
ftmod_ss7_fill_in_isap(&sng_isap);
|
||||
|
||||
sng_isup.isap = sng_isap.id;
|
||||
/* pull values from the lower levels */
|
||||
sng_isup.isap = sng_isap.id;
|
||||
sng_isup.dpc = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].dpc;
|
||||
sng_isup.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].switchType;
|
||||
sng_isup.nwId = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].nwId;
|
||||
|
||||
/* fill in the isup interface */
|
||||
ftmod_ss7_fill_in_isup_interface(&sng_isup);
|
||||
|
||||
/* setup the self mtp3 route */
|
||||
i = sng_isup.mtpRouteId;
|
||||
|
||||
if(ftmod_ss7_fill_in_self_route(sng_isup.spc,
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].linkType,
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].switchType,
|
||||
@ -2383,6 +2396,7 @@ static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route)
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].nwId = mtp3_route->nwId;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].lnkSets = mtp3_route->lnkSets;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].ssf = mtp3_route->ssf;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].dir = SNG_RTE_DN;
|
||||
if (mtp3_route->t6 != 0) {
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t6 = mtp3_route->t6;
|
||||
} else {
|
||||
@ -2442,6 +2456,52 @@ static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, int ssf)
|
||||
{
|
||||
int i = 1;
|
||||
|
||||
while (g_ftdm_sngss7_data.cfg.mtpRoute[i].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc == spc) {
|
||||
/* we have a match so break out of this loop */
|
||||
break;
|
||||
}
|
||||
/* move on to the next one */
|
||||
i++;
|
||||
}
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpRoute[i].id == 0) {
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].id = i;
|
||||
SS7_DEBUG("found new mtp3 self route\n");
|
||||
} else {
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].id = i;
|
||||
SS7_DEBUG("found existing mtp3 self route\n");
|
||||
}
|
||||
|
||||
strncpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[i].name, "self-route", MAX_NAME_LEN-1);
|
||||
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].id = i;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc = spc;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].linkType = linkType;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].switchType = switchType;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].cmbLinkSetId = i;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].isSTP = 0;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].ssf = ssf;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].dir = SNG_RTE_UP;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t6 = 8;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t8 = 12;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t10 = 300;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t11 = 300;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t15 = 30;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t16 = 20;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t18 = 200;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t19 = 690;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t21 = 650;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t25 = 100;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int ftmod_ss7_fill_in_nsap(sng_route_t *mtp3_route)
|
||||
{
|
||||
@ -2754,45 +2814,6 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, int ssf)
|
||||
{
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == 0){
|
||||
SS7_DEBUG("found new mtp3 self route\n");
|
||||
} else if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == spc) {
|
||||
SS7_DEBUG("found existing mtp3 self route\n");
|
||||
return FTDM_SUCCESS;
|
||||
} else {
|
||||
SS7_ERROR("found new mtp3 self route but it does not match the route already configured (dpc=%d:spc=%d)\n",
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc,
|
||||
spc);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
strncpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[0].name, "self-route", MAX_NAME_LEN-1);
|
||||
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].id = 0;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc = spc;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].linkType = linkType;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].switchType = switchType;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].cmbLinkSetId = 0;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].isSTP = 0;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].ssf = ssf;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t6 = 8;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t8 = 12;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t10 = 300;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t11 = 300;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t15 = 30;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t16 = 20;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t18 = 200;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t19 = 690;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t21 = 650;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t25 = 100;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
|
||||
{
|
||||
@ -2812,7 +2833,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
|
||||
}
|
||||
|
||||
/* find a spot for this circuit in the global structure */
|
||||
x = (ccSpan->procId * 1000);
|
||||
x = (ccSpan->procId * 1000) + 1;
|
||||
flag = 0;
|
||||
while (flag == 0) {
|
||||
/**********************************************************************/
|
||||
|
@ -83,12 +83,12 @@ AC_ARG_ENABLE(64,
|
||||
|
||||
if test "x${ax_cv_c_compiler_vendor}" = "xsun" ; then
|
||||
if test "${enable_64}" = "yes"; then
|
||||
CFLAGS="$CFLAGS -xc99=all -mt -m64 -lgpg-error"
|
||||
CXXFLAGS="$CXXFLAGS -xc99=all -mt -m64 -lgpg-error"
|
||||
CFLAGS="$CFLAGS -mt -m64 -lgpg-error"
|
||||
CXXFLAGS="$CXXFLAGS -mt -m64 -lgpg-error"
|
||||
SUNFLAGS="-xc99=all -mt -m64 -lgpg-error"
|
||||
else
|
||||
CFLAGS="$CFLAGS -xc99=all -mt -lgpg-error"
|
||||
CXXFLAGS="$CXXFLAGS -xc99=all -mt -lgpg-error"
|
||||
CFLAGS="$CFLAGS -mt -lgpg-error"
|
||||
CXXFLAGS="$CXXFLAGS -mt -lgpg-error"
|
||||
SUNFLAGS="-xc99=all -mt -lgpg-error"
|
||||
fi
|
||||
fi
|
||||
|
@ -401,13 +401,14 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
|
||||
char *bridgeto, uint32_t timeout,
|
||||
char *flags,
|
||||
char *cid_name,
|
||||
char *cid_num,
|
||||
char *cid_num,
|
||||
char *profile,
|
||||
switch_call_cause_t *cause,
|
||||
switch_call_cause_t *cancel_cause);
|
||||
static switch_status_t conference_outcall_bg(conference_obj_t *conference,
|
||||
char *conference_name,
|
||||
switch_core_session_t *session, char *bridgeto, uint32_t timeout, const char *flags, const char *cid_name,
|
||||
const char *cid_num, const char *call_uuid, switch_call_cause_t *cancel_cause);
|
||||
const char *cid_num, const char *call_uuid, const char *profile, switch_call_cause_t *cancel_cause);
|
||||
SWITCH_STANDARD_APP(conference_function);
|
||||
static void launch_conference_thread(conference_obj_t *conference);
|
||||
static void launch_conference_video_thread(conference_obj_t *conference);
|
||||
@ -2410,6 +2411,7 @@ static void conference_loop_output(conference_member_t *member)
|
||||
const char *cid_num = switch_channel_get_variable(channel, "conference_auto_outcall_caller_id_number");
|
||||
const char *toval = switch_channel_get_variable(channel, "conference_auto_outcall_timeout");
|
||||
const char *flags = switch_channel_get_variable(channel, "conference_auto_outcall_flags");
|
||||
const char *profile = switch_channel_get_variable(channel, "conference_auto_outcall_profile");
|
||||
const char *ann = switch_channel_get_variable(channel, "conference_auto_outcall_announce");
|
||||
const char *prefix = switch_channel_get_variable(channel, "conference_auto_outcall_prefix");
|
||||
int to = 60;
|
||||
@ -2441,7 +2443,7 @@ static void conference_loop_output(conference_member_t *member)
|
||||
char *dial_str = switch_mprintf("%s%s", switch_str_nil(prefix), argv[x]);
|
||||
switch_assert(dial_str);
|
||||
conference_outcall_bg(member->conference, NULL, NULL, dial_str, to, switch_str_nil(flags), cid_name, cid_num, NULL,
|
||||
&member->conference->cancel_cause);
|
||||
profile, &member->conference->cancel_cause);
|
||||
switch_safe_free(dial_str);
|
||||
}
|
||||
switch_safe_free(cpstr);
|
||||
@ -4264,9 +4266,9 @@ static switch_status_t conf_api_sub_dial(conference_obj_t *conference, switch_st
|
||||
}
|
||||
|
||||
if (conference) {
|
||||
conference_outcall(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], &cause, NULL);
|
||||
conference_outcall(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], NULL, &cause, NULL);
|
||||
} else {
|
||||
conference_outcall(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], &cause, NULL);
|
||||
conference_outcall(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], NULL, &cause, NULL);
|
||||
}
|
||||
stream->write_function(stream, "Call Requested: result: [%s]\n", switch_channel_cause2str(cause));
|
||||
|
||||
@ -4289,9 +4291,9 @@ static switch_status_t conf_api_sub_bgdial(conference_obj_t *conference, switch_
|
||||
switch_uuid_format(uuid_str, &uuid);
|
||||
|
||||
if (conference) {
|
||||
conference_outcall_bg(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL);
|
||||
conference_outcall_bg(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL, NULL);
|
||||
} else {
|
||||
conference_outcall_bg(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL);
|
||||
conference_outcall_bg(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL, NULL);
|
||||
}
|
||||
|
||||
stream->write_function(stream, "OK Job-UUID: %s\n", uuid_str);
|
||||
@ -4807,7 +4809,8 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
|
||||
switch_core_session_t *session,
|
||||
char *bridgeto, uint32_t timeout,
|
||||
char *flags, char *cid_name,
|
||||
char *cid_num,
|
||||
char *cid_num,
|
||||
char *profile,
|
||||
switch_call_cause_t *cause,
|
||||
switch_call_cause_t *cancel_cause)
|
||||
{
|
||||
@ -4817,6 +4820,7 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
|
||||
switch_channel_t *caller_channel = NULL;
|
||||
char appdata[512];
|
||||
int rdlock = 0;
|
||||
switch_bool_t have_flags = SWITCH_FALSE;
|
||||
|
||||
*cause = SWITCH_CAUSE_NORMAL_CLEARING;
|
||||
|
||||
@ -4902,13 +4906,16 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
|
||||
status = SWITCH_STATUS_MEMERR;
|
||||
goto done;
|
||||
}
|
||||
/* add them to the conference */
|
||||
|
||||
if (flags && strcasecmp(flags, "none")) {
|
||||
switch_snprintf(appdata, sizeof(appdata), "%s+flags{%s}", conference_name, flags);
|
||||
switch_caller_extension_add_application(peer_session, extension, (char *) global_app_name, appdata);
|
||||
} else {
|
||||
switch_caller_extension_add_application(peer_session, extension, (char *) global_app_name, conference_name);
|
||||
have_flags = SWITCH_TRUE;
|
||||
}
|
||||
/* add them to the conference */
|
||||
|
||||
switch_snprintf(appdata, sizeof(appdata), "%s%s%s%s%s%s", conference_name,
|
||||
profile?"@":"", profile?profile:"",
|
||||
have_flags?"+flags{":"", have_flags?flags:"", have_flags?"}":"");
|
||||
switch_caller_extension_add_application(peer_session, extension, (char *) global_app_name, appdata);
|
||||
|
||||
switch_channel_set_caller_extension(peer_channel, extension);
|
||||
switch_channel_set_state(peer_channel, CS_EXECUTE);
|
||||
@ -4940,6 +4947,7 @@ struct bg_call {
|
||||
char *cid_num;
|
||||
char *conference_name;
|
||||
char *uuid;
|
||||
char *profile;
|
||||
switch_call_cause_t *cancel_cause;
|
||||
switch_memory_pool_t *pool;
|
||||
};
|
||||
@ -4953,7 +4961,7 @@ static void *SWITCH_THREAD_FUNC conference_outcall_run(switch_thread_t *thread,
|
||||
switch_event_t *event;
|
||||
|
||||
conference_outcall(call->conference, call->conference_name,
|
||||
call->session, call->bridgeto, call->timeout, call->flags, call->cid_name, call->cid_num, &cause, call->cancel_cause);
|
||||
call->session, call->bridgeto, call->timeout, call->flags, call->cid_name, call->cid_num, call->profile, &cause, call->cancel_cause);
|
||||
|
||||
if (call->conference && test_eflag(call->conference, EFLAG_BGDIAL_RESULT) &&
|
||||
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
|
||||
@ -4969,6 +4977,7 @@ static void *SWITCH_THREAD_FUNC conference_outcall_run(switch_thread_t *thread,
|
||||
switch_safe_free(call->cid_num);
|
||||
switch_safe_free(call->conference_name);
|
||||
switch_safe_free(call->uuid);
|
||||
switch_safe_free(call->profile);
|
||||
if (call->pool) {
|
||||
switch_core_destroy_memory_pool(&call->pool);
|
||||
}
|
||||
@ -4981,7 +4990,7 @@ static void *SWITCH_THREAD_FUNC conference_outcall_run(switch_thread_t *thread,
|
||||
static switch_status_t conference_outcall_bg(conference_obj_t *conference,
|
||||
char *conference_name,
|
||||
switch_core_session_t *session, char *bridgeto, uint32_t timeout, const char *flags, const char *cid_name,
|
||||
const char *cid_num, const char *call_uuid, switch_call_cause_t *cancel_cause)
|
||||
const char *cid_num, const char *call_uuid, const char *profile, switch_call_cause_t *cancel_cause)
|
||||
{
|
||||
struct bg_call *call = NULL;
|
||||
switch_thread_t *thread;
|
||||
@ -5025,6 +5034,10 @@ static switch_status_t conference_outcall_bg(conference_obj_t *conference,
|
||||
call->uuid = strdup(call_uuid);
|
||||
}
|
||||
|
||||
if (profile) {
|
||||
call->profile = strdup(profile);
|
||||
}
|
||||
|
||||
switch_threadattr_create(&thd_attr, pool);
|
||||
switch_threadattr_detach_set(thd_attr, 1);
|
||||
switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
|
||||
@ -5750,7 +5763,7 @@ SWITCH_STANDARD_APP(conference_function)
|
||||
/* if we're using "bridge:" make an outbound call and bridge it in */
|
||||
if (!zstr(bridgeto) && strcasecmp(bridgeto, "none")) {
|
||||
switch_call_cause_t cause;
|
||||
if (conference_outcall(conference, NULL, session, bridgeto, 60, NULL, NULL, NULL, &cause, NULL) != SWITCH_STATUS_SUCCESS) {
|
||||
if (conference_outcall(conference, NULL, session, bridgeto, 60, NULL, NULL, NULL, NULL, &cause, NULL) != SWITCH_STATUS_SUCCESS) {
|
||||
goto done;
|
||||
}
|
||||
} else {
|
||||
|
@ -1864,6 +1864,7 @@ SWITCH_STANDARD_APP(att_xfer_function)
|
||||
|
||||
if (switch_ivr_originate(session, &peer_session, &cause, data, 0, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL)
|
||||
!= SWITCH_STATUS_SUCCESS || !peer_session) {
|
||||
switch_channel_set_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE, bond);
|
||||
goto end;
|
||||
}
|
||||
|
||||
@ -1878,6 +1879,7 @@ SWITCH_STANDARD_APP(att_xfer_function)
|
||||
|
||||
if (zstr(bond) && switch_channel_down(peer_channel)) {
|
||||
switch_core_session_rwunlock(peer_session);
|
||||
switch_channel_set_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE, bond);
|
||||
goto end;
|
||||
}
|
||||
|
||||
|
@ -1011,6 +1011,11 @@ typedef struct msg_cnt_callback msg_cnt_callback_t;
|
||||
static int message_count_callback(void *pArg, int argc, char **argv, char **columnNames)
|
||||
{
|
||||
msg_cnt_callback_t *cbt = (msg_cnt_callback_t *) pArg;
|
||||
|
||||
if (argc < 3 || zstr(argv[0]) || zstr(argv[1]) || zstr(argv[2])) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (atoi(argv[0]) == 1) { /* UnRead */
|
||||
if (!strcasecmp(argv[1], "A_URGENT")) { /* Urgent */
|
||||
cbt->total_new_urgent_messages = atoi(argv[2]);
|
||||
@ -1263,7 +1268,7 @@ static void message_count(vm_profile_t *profile, const char *id_in, const char *
|
||||
{
|
||||
char msg_count[80] = "";
|
||||
msg_cnt_callback_t cbt = { 0 };
|
||||
char sql[256];
|
||||
char *sql;
|
||||
char *myid = NULL;
|
||||
|
||||
|
||||
@ -1277,15 +1282,20 @@ static void message_count(vm_profile_t *profile, const char *id_in, const char *
|
||||
|
||||
myid = resolve_id(id_in, domain_name, "message-count");
|
||||
|
||||
switch_snprintf(sql, sizeof(sql), "select 1, read_flags, count(read_epoch) from voicemail_msgs where "
|
||||
"username='%s' and domain='%s' and in_folder='%s' "
|
||||
"and read_epoch=0 group by read_flags union select 0, read_flags, count(read_epoch) from voicemail_msgs where username='%s' "
|
||||
"and domain='%s' and in_folder='%s' and read_epoch<>0 group by read_flags;",
|
||||
myid, domain_name, myfolder, myid, domain_name, myfolder);
|
||||
|
||||
|
||||
sql = switch_mprintf(
|
||||
"select 1, read_flags, count(read_epoch) from voicemail_msgs where "
|
||||
"username='%q' and domain='%q' and in_folder='%q' and read_epoch=0 "
|
||||
"group by read_flags "
|
||||
"union "
|
||||
"select 0, read_flags, count(read_epoch) from voicemail_msgs where "
|
||||
"username='%q' and domain='%q' and in_folder='%q' and read_epoch<>0 "
|
||||
"group by read_flags;",
|
||||
|
||||
myid, domain_name, myfolder,
|
||||
myid, domain_name, myfolder);
|
||||
|
||||
vm_execute_sql_callback(profile, profile->mutex, sql, message_count_callback, &cbt);
|
||||
free(sql);
|
||||
|
||||
*total_new_messages = cbt.total_new_messages + cbt.total_new_urgent_messages;
|
||||
*total_new_urgent_messages = cbt.total_new_urgent_messages;
|
||||
|
@ -1363,7 +1363,7 @@ static switch_status_t speech_channel_stop(speech_channel_t *schannel)
|
||||
}
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) %s stopped\n", schannel->name, speech_channel_type_to_string(schannel->type));
|
||||
} else if (schannel->state == SPEECH_CHANNEL_DONE) {
|
||||
speech_channel_set_state(schannel, SPEECH_CHANNEL_READY);
|
||||
speech_channel_set_state_unlocked(schannel, SPEECH_CHANNEL_READY);
|
||||
}
|
||||
|
||||
done:
|
||||
|
@ -3458,7 +3458,7 @@ SWITCH_STANDARD_API(sofia_contact_function)
|
||||
{
|
||||
char *data;
|
||||
char *user = NULL;
|
||||
char *domain = NULL;
|
||||
char *domain = NULL, *dup_domain = NULL;
|
||||
char *concat = NULL;
|
||||
char *profile_name = NULL;
|
||||
char *p;
|
||||
@ -3501,7 +3501,8 @@ SWITCH_STANDARD_API(sofia_contact_function)
|
||||
}
|
||||
|
||||
if (zstr(domain)) {
|
||||
domain = switch_core_get_variable_pdup("domain", switch_core_session_get_pool(session));
|
||||
dup_domain = switch_core_get_variable_dup("domain");
|
||||
domain = dup_domain;
|
||||
}
|
||||
|
||||
if (!user) goto end;
|
||||
@ -3567,6 +3568,7 @@ SWITCH_STANDARD_API(sofia_contact_function)
|
||||
switch_safe_free(mystream.data);
|
||||
|
||||
switch_safe_free(data);
|
||||
switch_safe_free(dup_domain);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user