mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-10-29 22:54:18 +00:00
Merge branch 'master' of homer:smg_freeswitch into davidy_test
This commit is contained in:
commit
09a8f6b19a
35 files changed
+984
-255
No files matched your search
@@ -373,6 +373,7 @@ FT_DECLARE(ftdm_status_t) ftdm_interrupt_signal(ftdm_interrupt_t *interrupt)
|
||||
if (!SetEvent(interrupt->event)) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Failed to signal interrupt\n");
|
||||
return FTDM_FAIL;
|
||||
|
||||
}
|
||||
#else
|
||||
int err;
|
||||
@@ -404,6 +405,7 @@ FT_DECLARE(ftdm_status_t) ftdm_interrupt_destroy(ftdm_interrupt_t **ininterrupt)
|
||||
#else
|
||||
close(interrupt->readfd);
|
||||
close(interrupt->writefd);
|
||||
|
||||
interrupt->readfd = -1;
|
||||
interrupt->writefd = -1;
|
||||
#endif
|
||||
@@ -416,6 +418,7 @@ FT_DECLARE(ftdm_status_t) ftdm_interrupt_multiple_wait(ftdm_interrupt_t *interru
|
||||
{
|
||||
int numdevices = 0;
|
||||
unsigned i;
|
||||
|
||||
#if defined(__WINDOWS__)
|
||||
DWORD res = 0;
|
||||
HANDLE ints[20];
|
||||
@@ -428,6 +431,7 @@ FT_DECLARE(ftdm_status_t) ftdm_interrupt_multiple_wait(ftdm_interrupt_t *interru
|
||||
for (i = 0; i < size; i++) {
|
||||
ints[i] = interrupts[i]->event;
|
||||
if (interrupts[i]->device != FTDM_INVALID_SOCKET) {
|
||||
|
||||
ints[size+numdevices] = interrupts[i]->device;
|
||||
numdevices++;
|
||||
}
|
||||
@@ -454,7 +458,7 @@ FT_DECLARE(ftdm_status_t) ftdm_interrupt_multiple_wait(ftdm_interrupt_t *interru
|
||||
struct pollfd ints[size*2];
|
||||
|
||||
memset(&ints, 0, sizeof(ints));
|
||||
|
||||
pollagain:
|
||||
for (i = 0; i < size; i++) {
|
||||
ints[i].events = POLLIN;
|
||||
ints[i].revents = 0;
|
||||
@@ -463,6 +467,7 @@ FT_DECLARE(ftdm_status_t) ftdm_interrupt_multiple_wait(ftdm_interrupt_t *interru
|
||||
ints[size+numdevices].events = POLLIN;
|
||||
ints[size+numdevices].revents = 0;
|
||||
ints[size+numdevices].fd = interrupts[i]->device;
|
||||
|
||||
numdevices++;
|
||||
}
|
||||
}
|
||||
@@ -470,6 +475,9 @@ FT_DECLARE(ftdm_status_t) ftdm_interrupt_multiple_wait(ftdm_interrupt_t *interru
|
||||
res = poll(ints, size + numdevices, ms);
|
||||
|
||||
if (res == -1) {
|
||||
if (errno == EINTR) {
|
||||
goto pollagain;
|
||||
}
|
||||
ftdm_log(FTDM_LOG_CRIT, "interrupt poll failed (%s)\n", strerror(errno));
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
@@ -60,6 +60,9 @@ static ftdm_status_t handle_show_flags(ftdm_stream_handle_t *stream, int span, i
|
||||
static ftdm_status_t handle_show_blocks(ftdm_stream_handle_t *stream, int span, int chan, int verbose);
|
||||
static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, int chan, int verbose);
|
||||
|
||||
static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int chan, int verbose);
|
||||
static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int chan, int range, int verbose);
|
||||
|
||||
static ftdm_status_t handle_status_link(ftdm_stream_handle_t *stream, char *name);
|
||||
static ftdm_status_t handle_status_linkset(ftdm_stream_handle_t *stream, char *name);
|
||||
|
||||
@@ -72,13 +75,14 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha
|
||||
{
|
||||
char *mycmd = NULL;
|
||||
char *argv[10] = { 0 };
|
||||
int argc = 0;
|
||||
int span = 0;
|
||||
int chan = 0;
|
||||
int trace = 0;
|
||||
int trace_level = 7;
|
||||
int verbose = 1;
|
||||
int c = 0;
|
||||
int argc = 0;
|
||||
int span = 0;
|
||||
int chan = 0;
|
||||
int range = 0;
|
||||
int trace = 0;
|
||||
int trace_level = 7;
|
||||
int verbose = 1;
|
||||
int c = 0;
|
||||
|
||||
if (data) {
|
||||
mycmd = ftdm_strdup(data);
|
||||
@@ -332,6 +336,61 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha
|
||||
/**********************************************************************/
|
||||
}
|
||||
/**************************************************************************/
|
||||
} else if (!strcasecmp(argv[c], "rsc")) {
|
||||
/**************************************************************************/
|
||||
if (check_arg_count(argc, 2)) goto handle_cli_error_argc;
|
||||
c++;
|
||||
|
||||
if (!strcasecmp(argv[c], "span")) {
|
||||
/**********************************************************************/
|
||||
if (check_arg_count(argc, 5)) goto handle_cli_error_argc;
|
||||
|
||||
if (extract_span_chan(argv, c, &span, &chan)) goto handle_cli_error_span_chan;
|
||||
|
||||
handle_tx_rsc(stream, span, chan, verbose);
|
||||
/**********************************************************************/
|
||||
} else {
|
||||
/**********************************************************************/
|
||||
stream->write_function(stream, "Unknown \"rsc\" command\n");
|
||||
goto handle_cli_error;
|
||||
/**********************************************************************/
|
||||
}
|
||||
/**************************************************************************/
|
||||
} else if (!strcasecmp(argv[c], "grs")) {
|
||||
/**************************************************************************/
|
||||
if (check_arg_count(argc, 2)) goto handle_cli_error_argc;
|
||||
c++;
|
||||
|
||||
if (!strcasecmp(argv[c], "span")) {
|
||||
/**********************************************************************/
|
||||
if (check_arg_count(argc, 5)) goto handle_cli_error_argc;
|
||||
|
||||
if (extract_span_chan(argv, c, &span, &chan)) goto handle_cli_error_span_chan;
|
||||
c = c + 4;
|
||||
|
||||
if (check_arg_count(argc, 7)) goto handle_cli_error_argc;
|
||||
|
||||
if (!strcasecmp(argv[c], "range")) {
|
||||
/******************************************************************/
|
||||
c++;
|
||||
range = atoi(argv[c]);
|
||||
/******************************************************************/
|
||||
} else {
|
||||
/******************************************************************/
|
||||
stream->write_function(stream, "Unknown \"grs range\" command\n");
|
||||
goto handle_cli_error;
|
||||
/******************************************************************/
|
||||
}
|
||||
|
||||
handle_tx_grs(stream, span, chan, range, verbose);
|
||||
/**********************************************************************/
|
||||
} else {
|
||||
/**********************************************************************/
|
||||
stream->write_function(stream, "Unknown \"grs\" command\n");
|
||||
goto handle_cli_error;
|
||||
/**********************************************************************/
|
||||
}
|
||||
/**************************************************************************/
|
||||
} else {
|
||||
/**************************************************************************/
|
||||
goto handle_cli_error;
|
||||
@@ -376,6 +435,8 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream)
|
||||
stream->write_function(stream, "Ftmod_sangoma_ss7 circuit control:\n");
|
||||
stream->write_function(stream, "ftdm ss7 block span X chan Y\n");
|
||||
stream->write_function(stream, "ftdm ss7 unblk span X chan Y\n");
|
||||
stream->write_function(stream, "ftdm ss7 rsc span X chan Y\n");
|
||||
stream->write_function(stream, "ftdm ss7 grs span X chan Y range Z\n");
|
||||
stream->write_function(stream, "\n");
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
@@ -1090,6 +1151,125 @@ static ftdm_status_t handle_set_uninhibit(ftdm_stream_handle_t *stream, char *na
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int chan, int verbose)
|
||||
{
|
||||
int x;
|
||||
sngss7_chan_data_t *ss7_info;
|
||||
ftdm_channel_t *ftdmchan;
|
||||
int lspan;
|
||||
int lchan;
|
||||
|
||||
x=1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
|
||||
ftdmchan = ss7_info->ftdmchan;
|
||||
|
||||
/* if span == 0 then all spans should be printed */
|
||||
if (span == 0) {
|
||||
lspan = ftdmchan->physical_span_id;
|
||||
} else {
|
||||
lspan = span;
|
||||
}
|
||||
|
||||
/* if chan == 0 then all chans should be printed */
|
||||
if (chan == 0) {
|
||||
lchan = ftdmchan->physical_chan_id;
|
||||
} else {
|
||||
lchan = chan;
|
||||
}
|
||||
|
||||
if ((ftdmchan->physical_span_id == lspan) && (ftdmchan->physical_chan_id == lchan)) {
|
||||
/* now that we have the right channel...put a lock on it so no-one else can use it */
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* check if there is a pending state change|give it a bit to clear */
|
||||
if (check_for_state_change(ftdmchan)) {
|
||||
SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", ss7_info->circuit->cic);
|
||||
SS7_ASSERT;
|
||||
} else {
|
||||
/* throw the ckt block flag */
|
||||
sngss7_set_flag(ss7_info, FLAG_RESET_TX);
|
||||
|
||||
/* set the channel to suspended state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
}
|
||||
|
||||
/* unlock the channel again before we exit */
|
||||
ftdm_mutex_unlock(ftdmchan->mutex);
|
||||
|
||||
} /* if ( span and chan) */
|
||||
|
||||
} /* if ( cic != 0) */
|
||||
|
||||
/* go the next circuit */
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
|
||||
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int chan, int range, int verbose)
|
||||
{
|
||||
int x;
|
||||
sngss7_chan_data_t *sngss7_info;
|
||||
ftdm_channel_t *ftdmchan;
|
||||
sngss7_span_data_t *sngss7_span;
|
||||
|
||||
if (range > 31) {
|
||||
stream->write_function(stream, "Invalid range value %d", range);
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
x=1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
|
||||
ftdmchan = sngss7_info->ftdmchan;
|
||||
sngss7_span = ftdmchan->span->mod_data;
|
||||
|
||||
if ((ftdmchan->physical_span_id == span) &&
|
||||
((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) {
|
||||
/* now that we have the right channel...put a lock on it so no-one else can use it */
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* check if there is a pending state change|give it a bit to clear */
|
||||
if (check_for_state_change(ftdmchan)) {
|
||||
SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", sngss7_info->circuit->cic);
|
||||
SS7_ASSERT;
|
||||
} else {
|
||||
/* throw the grp reset flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX);
|
||||
if (ftdmchan->physical_chan_id == chan) {
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_BASE);
|
||||
sngss7_span->tx_grs.circuit = sngss7_info->circuit->id;
|
||||
sngss7_span->tx_grs.range = range-1;
|
||||
}
|
||||
|
||||
/* set the channel to suspended state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
|
||||
}
|
||||
|
||||
/* unlock the channel again before we exit */
|
||||
ftdm_mutex_unlock(ftdmchan->mutex);
|
||||
|
||||
} /* if ( span and chan) */
|
||||
|
||||
} /* if ( cic != 0) */
|
||||
|
||||
/* go the next circuit */
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
|
||||
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t extract_span_chan(char *argv[10], int pos, int *span, int *chan)
|
||||
{
|
||||
|
||||
@@ -99,7 +99,11 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
SS7_ASSERT;
|
||||
};
|
||||
|
||||
SS7_MSG_TRACE(ftdmchan, sngss7_info, "Rx IAM\n");
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_GLARE)) {
|
||||
SS7_MSG_TRACE(ftdmchan, sngss7_info, "Rx IAM (glare detected on circuit)\n");
|
||||
} else {
|
||||
SS7_MSG_TRACE(ftdmchan, sngss7_info, "Rx IAM\n");
|
||||
}
|
||||
|
||||
/* check if the circuit has a remote block */
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) ||
|
||||
@@ -201,6 +205,9 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
SS7_DEBUG_CHAN(ftdmchan,"No TMR/Bearer Cap information in IAM!%s\n", " ");
|
||||
}
|
||||
|
||||
/* add any special variables for the dialplan */
|
||||
/*ftdm_channel_add_var(ftdmchan, "ss7_stuff", "s");*/
|
||||
|
||||
/* set the state of the channel to collecting...the rest is done by the chan monitor */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_COLLECT);
|
||||
|
||||
@@ -208,11 +215,36 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
|
||||
break;
|
||||
/**************************************************************************/
|
||||
case (FTDM_CHANNEL_STATE_DIALING):
|
||||
case (FTDM_CHANNEL_STATE_TERMINATING):
|
||||
case (FTDM_CHANNEL_STATE_HANGUP):
|
||||
case (FTDM_CHANNEL_STATE_HANGUP_COMPLETE):
|
||||
|
||||
SS7_INFO_CHAN(ftdmchan, "Got IAM on channel in %s state...glare!\n", ftdm_channel_state2str (ftdmchan->state));
|
||||
|
||||
/* save the info so that we can use it later on */
|
||||
sngss7_info->glare.spInstId = spInstId;
|
||||
sngss7_info->glare.circuit = circuit;
|
||||
memcpy(&sngss7_info->glare.iam, siConEvnt, sizeof(*siConEvnt));
|
||||
|
||||
if (!(sngss7_test_flag(sngss7_info, FLAG_GLARE))) {
|
||||
/* glare, throw the flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GLARE);
|
||||
|
||||
/* setup the hangup cause */
|
||||
ftdmchan->caller_data.hangup_cause = 34; /* Circuit Congrestion */
|
||||
|
||||
/* this is a remote hangup request */
|
||||
sngss7_set_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
|
||||
/* move the state of the channel to Terminating to end the call */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
|
||||
}
|
||||
|
||||
break;
|
||||
/**************************************************************************/
|
||||
default: /* should not have gotten an IAM while in this state */
|
||||
SS7_ERROR("Got IAM in an invalid state (%s) on span=%d, chan=%d!\n",
|
||||
ftdm_channel_state2str(ftdmchan->state),
|
||||
ftdmchan->physical_span_id,
|
||||
ftdmchan->physical_chan_id);
|
||||
SS7_ERROR_CHAN(ftdmchan, "Got IAM on channel in invalid state(%s)...reset!\n", ftdm_channel_state2str (ftdmchan->state));
|
||||
|
||||
/* move the state of the channel to RESTART to force a reset */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
@@ -540,10 +572,6 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
/**************************************************************************/
|
||||
default:
|
||||
|
||||
/* fill in the channels SS7 Stack information */
|
||||
sngss7_info->suInstId = get_unique_id();
|
||||
sngss7_info->spInstId = spInstId;
|
||||
|
||||
/* throw the reset flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_RX);
|
||||
|
||||
@@ -1028,10 +1056,26 @@ ftdm_status_t handle_reattempt(uint32_t suInstId, uint32_t spInstId, uint32_t ci
|
||||
SS7_ASSERT;
|
||||
};
|
||||
|
||||
/* glare, throw the flag, go to down state*/
|
||||
sngss7_set_flag(sngss7_info, FLAG_GLARE);
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_GLARE)) {
|
||||
/* the glare flag is already up so it was caught ... do nothing */
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Glare flag is already up...nothing to do!%s\n", " ");
|
||||
} else {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Glare flag is not up yet...indicating glare from reattempt!%s\n", " ");
|
||||
/* glare, throw the flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GLARE);
|
||||
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_CANCEL);
|
||||
/* clear any existing glare data from the channel */
|
||||
memset(&sngss7_info->glare, 0x0, sizeof(sngss7_glare_data_t));
|
||||
|
||||
/* setup the hangup cause */
|
||||
ftdmchan->caller_data.hangup_cause = 34; /* Circuit Congrestion */
|
||||
|
||||
/* this is a remote hangup request */
|
||||
sngss7_set_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
|
||||
/* move the state of the channel to Terminating to end the call */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
|
||||
}
|
||||
|
||||
/* unlock the channel again before we exit */
|
||||
ftdm_mutex_unlock(ftdmchan->mutex);
|
||||
@@ -1640,9 +1684,9 @@ ftdm_status_t handle_grs_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
{
|
||||
SS7_FUNC_TRACE_ENTER(__FUNCTION__);
|
||||
|
||||
sngss7_chan_data_t *sngss7_info = NULL;
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
sngss7_span_data_t *span = NULL;
|
||||
sngss7_chan_data_t *sngss7_info = NULL;
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
sngss7_span_data_t *sngss7_span = NULL;
|
||||
int range;
|
||||
int x;
|
||||
|
||||
@@ -1680,11 +1724,11 @@ ftdm_status_t handle_grs_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
};
|
||||
|
||||
/* fill in the span structure for this circuit */
|
||||
span = ftdmchan->span->mod_data;
|
||||
span->grs.circuit = circuit;
|
||||
span->grs.range = range;
|
||||
sngss7_span = ftdmchan->span->mod_data;
|
||||
sngss7_span->rx_grs.circuit = circuit;
|
||||
sngss7_span->rx_grs.range = range;
|
||||
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Rx GRS (%d:%d)\n",
|
||||
SS7_INFO_CHAN(ftdmchan, "Rx GRS (%d:%d)\n",
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[circuit].cic,
|
||||
(g_ftdm_sngss7_data.cfg.isupCkt[circuit].cic + range));
|
||||
|
||||
@@ -1755,7 +1799,7 @@ ftdm_status_t handle_grs_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
SS7_ASSERT;
|
||||
};
|
||||
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Rx GRA (%d:%d)\n",
|
||||
SS7_INFO_CHAN(ftdmchan, "Rx GRA (%d:%d)\n",
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[circuit].cic,
|
||||
(g_ftdm_sngss7_data.cfg.isupCkt[circuit].cic + range));
|
||||
|
||||
|
||||
@@ -303,24 +303,17 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
|
||||
|
||||
/* clean out all pending channel state changes */
|
||||
while ((ftdmchan = ftdm_queue_dequeue (ftdmspan->pendingchans))) {
|
||||
/* double check that this channel has a state change pending */
|
||||
if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
|
||||
/*first lock the channel */
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/*first lock the channel */
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* process state changes for this channel until they are all done */
|
||||
while (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
|
||||
ftdm_sangoma_ss7_process_state_change (ftdmchan);
|
||||
|
||||
/* unlock the channel */
|
||||
ftdm_mutex_unlock (ftdmchan->mutex);
|
||||
} else {
|
||||
/* since we handle state changes again after handling the trillium queue
|
||||
* this can occur since we'll clear the flag for the event but can't pop
|
||||
* the channel out of pendingchans
|
||||
*/
|
||||
/* SS7_ERROR("ftdm_core reported state change, but state change flag not set on ft-span = %d, ft-chan = %d\n",
|
||||
ftdmchan->physical_span_id,
|
||||
ftdmchan->physical_chan_id);*/
|
||||
}
|
||||
|
||||
/* unlock the channel */
|
||||
ftdm_mutex_unlock (ftdmchan->mutex);
|
||||
}/* while ((ftdmchan = ftdm_queue_dequeue(ftdmspan->pendingchans))) */
|
||||
|
||||
/* clean out all pending stack events */
|
||||
@@ -329,6 +322,9 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
|
||||
ftdm_safe_free(sngss7_event);
|
||||
}/* while ((sngss7_event = ftdm_queue_dequeue(ftdmspan->signal_data->event_queue))) */
|
||||
|
||||
/* signal the core that sig events are queued for processing */
|
||||
ftdm_span_trigger_signals(ftdmspan);
|
||||
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case FTDM_TIMEOUT:
|
||||
@@ -352,12 +348,12 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
|
||||
sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
|
||||
|
||||
/* check if there is a GRS being processed on the span */
|
||||
if (sngss7_span->grs.range > 0) {
|
||||
if (sngss7_span->rx_grs.range > 0) {
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Found Rx GRS on span %d...checking circuits\n", ftdmspan->span_id);
|
||||
/*SS7_DEBUG("Found Rx GRS on span %d...checking circuits\n", ftdmspan->span_id);*/
|
||||
|
||||
/* check all the circuits in the range to see if they are done resetting */
|
||||
for ( i = sngss7_span->grs.circuit; i < (sngss7_span->grs.circuit + sngss7_span->grs.range + 1); i++) {
|
||||
for ( i = sngss7_span->rx_grs.circuit; i < (sngss7_span->rx_grs.circuit + sngss7_span->rx_grs.range + 1); i++) {
|
||||
|
||||
/* extract the channel in question */
|
||||
if (extract_chan_data(i, &sngss7_info, &ftdmchan)) {
|
||||
@@ -382,11 +378,11 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
|
||||
} /* for ( i = circuit; i < (circuit + range + 1); i++) */
|
||||
|
||||
SS7_DEBUG("All circuits out of reset for GRS: circuit=%d, range=%d\n",
|
||||
sngss7_span->grs.circuit,
|
||||
sngss7_span->grs.range);
|
||||
sngss7_span->rx_grs.circuit,
|
||||
sngss7_span->rx_grs.range);
|
||||
|
||||
/* check all the circuits in the range to see if they are done resetting */
|
||||
for ( i = sngss7_span->grs.circuit; i < (sngss7_span->grs.circuit + sngss7_span->grs.range + 1); i++) {
|
||||
for ( i = sngss7_span->rx_grs.circuit; i < (sngss7_span->rx_grs.circuit + sngss7_span->rx_grs.range + 1); i++) {
|
||||
|
||||
/* extract the channel in question */
|
||||
if (extract_chan_data(i, &sngss7_info, &ftdmchan)) {
|
||||
@@ -403,7 +399,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
|
||||
} /* for ( i = circuit; i < (circuit + range + 1); i++) */
|
||||
|
||||
GRS_UNLOCK_ALL:
|
||||
for ( i = sngss7_span->grs.circuit; i < (sngss7_span->grs.circuit + sngss7_span->grs.range + 1); i++) {
|
||||
for ( i = sngss7_span->rx_grs.circuit; i < (sngss7_span->rx_grs.circuit + sngss7_span->rx_grs.range + 1); i++) {
|
||||
/* extract the channel in question */
|
||||
if (extract_chan_data(i, &sngss7_info, &ftdmchan)) {
|
||||
SS7_ERROR("Failed to extract channel data for circuit = %d!\n", i);
|
||||
@@ -451,6 +447,11 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev
|
||||
/* now that we have the right channel...put a lock on it so no-one else can use it */
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* while there's a state change present on this channel process it */
|
||||
while (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
|
||||
ftdm_sangoma_ss7_process_state_change(ftdmchan);
|
||||
}
|
||||
|
||||
/* figure out the type of event and send it to the right handler */
|
||||
switch (sngss7_event->event_id) {
|
||||
/**************************************************************************/
|
||||
@@ -514,10 +515,9 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev
|
||||
/******************************************************************************/
|
||||
static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
{
|
||||
ftdm_sigmsg_t sigev;
|
||||
ftdm_signaling_status_t status;
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
int i = 0;
|
||||
ftdm_sigmsg_t sigev;
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
int i = 0;
|
||||
|
||||
memset (&sigev, 0, sizeof (sigev));
|
||||
|
||||
@@ -748,7 +748,11 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
/* go to RESTART State until RSCa is received */
|
||||
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
} else {
|
||||
if (!(sngss7_test_flag (sngss7_info, FLAG_RESET_RX))) {
|
||||
/* if the hangup is from a rx RSC, rx GRS, or glare don't sent RLC */
|
||||
if (!(sngss7_test_flag(sngss7_info, FLAG_RESET_RX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_GLARE))) {
|
||||
|
||||
/* send out the release complete */
|
||||
ft_to_sngss7_rlc (ftdmchan);
|
||||
}
|
||||
@@ -799,14 +803,14 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
* we insure that this is the last circuit to have the state change queued
|
||||
*/
|
||||
sngss7_span_data_t *span = ftdmchan->span->mod_data;
|
||||
if (span->grs.circuit == sngss7_info->circuit->id) {
|
||||
if (span->rx_grs.circuit == sngss7_info->circuit->id) {
|
||||
/* send out the GRA */
|
||||
ft_to_sngss7_gra(ftdmchan);
|
||||
|
||||
/* clean out the spans GRS structure */
|
||||
sngss7_span_data_t *span = ftdmchan->span->mod_data;
|
||||
span->grs.circuit = 0;
|
||||
span->grs.range = 0;
|
||||
span->rx_grs.circuit = 0;
|
||||
span->rx_grs.range = 0;
|
||||
}
|
||||
|
||||
/* clear the grp reset flag */
|
||||
@@ -820,6 +824,7 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_RESET_TX_RSP)) {
|
||||
/* clear the reset flag */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_RESET_TX_RSP);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_RESET_SENT);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_RESET_TX);
|
||||
}
|
||||
|
||||
@@ -845,9 +850,8 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan,"All reset flags cleared %s\n", "");
|
||||
/* all flags are down so we can bring up the sig status */
|
||||
status = FTDM_SIG_STATE_UP;
|
||||
sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
|
||||
sigev.raw_data = &status;
|
||||
sigev.sigstatus = FTDM_SIG_STATE_UP;
|
||||
ftdm_span_send_signal (ftdmchan->span, &sigev);
|
||||
}
|
||||
} else {
|
||||
@@ -879,7 +883,26 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
ftdm_channel_t *close_chan = ftdmchan;
|
||||
/* close the channel */
|
||||
ftdm_channel_close (&close_chan);
|
||||
}
|
||||
} /* if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OPEN)) */
|
||||
|
||||
/* check if there is a glared call that needs to be processed */
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_GLARE)) {
|
||||
|
||||
/* clear the glare flag */
|
||||
sngss7_clear_flag (sngss7_info, FLAG_GLARE);
|
||||
|
||||
/* check if we have an IAM stored...if we don't have one just exit */
|
||||
if (sngss7_info->glare.circuit != 0) {
|
||||
/* send the saved call back in to us */
|
||||
handle_con_ind (0,
|
||||
sngss7_info->glare.spInstId,
|
||||
sngss7_info->glare.circuit,
|
||||
&sngss7_info->glare.iam);
|
||||
|
||||
/* clear the glare info */
|
||||
memset(&sngss7_info->glare, 0x0, sizeof(sngss7_glare_data_t));
|
||||
} /* if (sngss7_info->glare.circuit != 0) */
|
||||
} /* if (sngss7_test_flag(sngss7_info, FLAG_GLARE)) */
|
||||
|
||||
break;
|
||||
/**************************************************************************/
|
||||
@@ -930,9 +953,8 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
|
||||
/* if the sig_status is up...bring it down */
|
||||
if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) {
|
||||
status = FTDM_SIG_STATE_DOWN;
|
||||
sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
|
||||
sigev.raw_data = &status;
|
||||
sigev.sigstatus = FTDM_SIG_STATE_DOWN;
|
||||
ftdm_span_send_signal (ftdmchan->span, &sigev);
|
||||
}
|
||||
|
||||
@@ -994,9 +1016,8 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing PAUSE flag %s\n", "");
|
||||
|
||||
/* bring the channel signaling status to down */
|
||||
status = FTDM_SIG_STATE_DOWN;
|
||||
sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
|
||||
sigev.raw_data = &status;
|
||||
sigev.sigstatus = FTDM_SIG_STATE_DOWN;
|
||||
ftdm_span_send_signal (ftdmchan->span, &sigev);
|
||||
|
||||
/* check the last state and return to it to allow the call to finish */
|
||||
@@ -1091,9 +1112,8 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_UCIC_BLOCK flag %s\n", "");
|
||||
|
||||
/* bring the channel signaling status to down */
|
||||
status = FTDM_SIG_STATE_DOWN;
|
||||
sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
|
||||
sigev.raw_data = &status;
|
||||
sigev.sigstatus = FTDM_SIG_STATE_DOWN;
|
||||
ftdm_span_send_signal (ftdmchan->span, &sigev);
|
||||
|
||||
/* remove any reset flags */
|
||||
@@ -1167,11 +1187,13 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_ss7_outgoing_call)
|
||||
SS7_ASSERT;
|
||||
};
|
||||
|
||||
/* check if the channel sig state is UP */
|
||||
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP)) {
|
||||
SS7_ERROR_CHAN(ftdmchan, "Requested channel sig state is down, cancelling call!%s\n", " ");
|
||||
goto outgoing_fail;
|
||||
}
|
||||
|
||||
/* check if there is a remote block */
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
@@ -1181,15 +1203,19 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_ss7_outgoing_call)
|
||||
goto outgoing_break;
|
||||
}
|
||||
|
||||
/* check if there is a local block */
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX))) {
|
||||
|
||||
/* KONRAD FIX ME : we should check if this is a TEST call and allow it */
|
||||
|
||||
/* the channel is blocked...can't send any calls here */
|
||||
SS7_ERROR_CHAN(ftdmchan, "Requested channel is locally blocked, re-hunt channel!%s\n", " ");
|
||||
goto outgoing_break;
|
||||
}
|
||||
|
||||
/* check the state of the channel */
|
||||
switch (ftdmchan->state){
|
||||
/**************************************************************************/
|
||||
case FTDM_CHANNEL_STATE_DOWN:
|
||||
@@ -1208,7 +1234,7 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_ss7_outgoing_call)
|
||||
ftdmchan->physical_span_id,
|
||||
ftdmchan->physical_chan_id);
|
||||
|
||||
goto outgoing_fail;
|
||||
goto outgoing_break;
|
||||
break;
|
||||
/**************************************************************************/
|
||||
} /* switch (ftdmchan->state) (original call) */
|
||||
@@ -1268,6 +1294,7 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span)
|
||||
{
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
sngss7_chan_data_t *sngss7_info = NULL;
|
||||
sngss7_span_data_t *sngss7_span = NULL;
|
||||
int x;
|
||||
|
||||
|
||||
@@ -1278,6 +1305,7 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span)
|
||||
/* extract the channel structure and sngss7 channel data */
|
||||
ftdmchan = span->channels[x];
|
||||
sngss7_info = ftdmchan->call_data;
|
||||
sngss7_span = ftdmchan->span->mod_data;
|
||||
|
||||
/* lock the channel */
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
@@ -1289,6 +1317,8 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span)
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX);
|
||||
if (x == 1) {
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_BASE);
|
||||
sngss7_span->tx_grs.circuit = sngss7_info->circuit->id;
|
||||
sngss7_span->tx_grs.range = span->chan_count -1;
|
||||
}
|
||||
|
||||
/* throw the channel to suspend */
|
||||
@@ -1388,7 +1418,10 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config)
|
||||
span->state_map = &sangoma_ss7_state_map;
|
||||
span->mod_data = ss7_span_info;
|
||||
|
||||
/* set the flag to indicate that this span uses channel state change queues */
|
||||
ftdm_set_flag (span, FTDM_SPAN_USE_CHAN_QUEUE);
|
||||
/* set the flag to indicate that this span uses sig event queues */
|
||||
ftdm_set_flag (span, FTDM_SPAN_USE_SIGNALS_QUEUE);
|
||||
|
||||
/* parse the configuration and apply to the global config structure */
|
||||
if (ftmod_ss7_parse_xml(ftdm_parameters, span)) {
|
||||
|
||||
@@ -321,8 +321,7 @@ typedef struct sngss7_timer_data {
|
||||
}sngss7_timer_data_t;
|
||||
|
||||
typedef struct sngss7_glare_data {
|
||||
uint32_t suInstId;
|
||||
uint32_t spInstId;
|
||||
uint32_t spInstId;
|
||||
uint32_t circuit;
|
||||
SiConEvnt iam;
|
||||
}sngss7_glare_data_t;
|
||||
@@ -347,7 +346,8 @@ typedef struct sngss7_chan_data {
|
||||
|
||||
typedef struct sngss7_span_data {
|
||||
ftdm_sched_t *sched;
|
||||
sngss7_group_data_t grs;
|
||||
sngss7_group_data_t rx_grs;
|
||||
sngss7_group_data_t tx_grs;
|
||||
ftdm_queue_t *event_queue;
|
||||
}sngss7_span_data_t;
|
||||
|
||||
@@ -612,31 +612,40 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha
|
||||
#define SS7_MSG_TRACE(fchan, sngss7info ,msg) if (g_ftdm_sngss7_data.message_trace) { \
|
||||
switch (g_ftdm_sngss7_data.message_trace_level) { \
|
||||
case 0: \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "[CIC:%d]%s",sngss7info->circuit->cic, msg); \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
|
||||
sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
|
||||
break; \
|
||||
case 1: \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_ALERT, "[CIC:%d]%s",sngss7info->circuit->cic, msg); \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_ALERT, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
|
||||
sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
|
||||
break; \
|
||||
case 2: \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_CRIT, "[CIC:%d]%s",sngss7info->circuit->cic, msg); \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_CRIT, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
|
||||
sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
|
||||
break; \
|
||||
case 3: \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_ERROR, "[CIC:%d]%s",sngss7info->circuit->cic, msg); \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_ERROR, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
|
||||
sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
|
||||
break; \
|
||||
case 4: \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_WARNING, "[CIC:%d]%s",sngss7info->circuit->cic, msg); \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_WARNING, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
|
||||
sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
|
||||
break; \
|
||||
case 5: \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_NOTICE, "[CIC:%d]%s",sngss7info->circuit->cic, msg); \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_NOTICE, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
|
||||
sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
|
||||
break; \
|
||||
case 6: \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_INFO, "[CIC:%d]%s",sngss7info->circuit->cic, msg); \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_INFO, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
|
||||
sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
|
||||
break; \
|
||||
case 7: \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "[CIC:%d]%s",sngss7info->circuit->cic, msg); \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
|
||||
sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
|
||||
break; \
|
||||
default: \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_INFO, "[CIC:%d]%s",sngss7info->circuit->cic, msg); \
|
||||
ftdm_log_chan(fchan, FTDM_LOG_INFO, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
|
||||
sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
|
||||
break; \
|
||||
} /* switch (g_ftdm_sngss7_data.message_trace_level) */ \
|
||||
} /* if(g_ftdm_sngss7_data.message_trace) */
|
||||
|
||||
@@ -60,9 +60,10 @@ void ft_to_sngss7_lpa (ftdm_channel_t * ftdmchan);
|
||||
|
||||
void ft_to_sngss7_gra (ftdm_channel_t * ftdmchan);
|
||||
void ft_to_sngss7_grs (ftdm_channel_t * ftdmchan);
|
||||
/******************************************************************************/
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
void
|
||||
ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
||||
void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
||||
{
|
||||
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
|
||||
|
||||
@@ -133,7 +134,6 @@ ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
|
||||
{
|
||||
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
|
||||
@@ -415,7 +415,7 @@ void ft_to_sngss7_gra (ftdm_channel_t * ftdmchan)
|
||||
{
|
||||
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
|
||||
|
||||
sngss7_span_data_t *span = ftdmchan->span->mod_data;
|
||||
sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
SiStaEvnt gra;
|
||||
|
||||
@@ -426,11 +426,11 @@ void ft_to_sngss7_gra (ftdm_channel_t * ftdmchan)
|
||||
|
||||
/* fill in the range */
|
||||
gra.rangStat.range.pres = PRSNT_NODEF;
|
||||
gra.rangStat.range.val = span->grs.range;
|
||||
gra.rangStat.range.val = sngss7_span->rx_grs.range;
|
||||
|
||||
/* fill in the status */
|
||||
gra.rangStat.status.pres = PRSNT_NODEF;
|
||||
gra.rangStat.status.len = ((span->grs.range + 1) >> 3) + (((span->grs.range + 1) & 0x07) ? 1 : 0);
|
||||
gra.rangStat.status.len = ((sngss7_span->rx_grs.range + 1) >> 3) + (((sngss7_span->rx_grs.range + 1) & 0x07) ? 1 : 0);
|
||||
|
||||
/* the status field should be 1 if blocked for maintenace reasons
|
||||
* and 0 is not blocked....since we memset the struct nothing to do
|
||||
@@ -440,12 +440,14 @@ void ft_to_sngss7_gra (ftdm_channel_t * ftdmchan)
|
||||
sng_cc_sta_request (1,
|
||||
0,
|
||||
0,
|
||||
span->grs.circuit,
|
||||
sngss7_span->rx_grs.circuit,
|
||||
0,
|
||||
SIT_STA_GRSRSP,
|
||||
&gra);
|
||||
|
||||
SS7_MSG_TRACE(ftdmchan, sngss7_info, "Tx GRA\n");
|
||||
SS7_INFO_CHAN(ftdmchan, "Tx GRA (%d:%d)\n",
|
||||
sngss7_info->circuit->cic,
|
||||
(sngss7_info->circuit->cic + sngss7_span->rx_grs.range));
|
||||
|
||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||
return;
|
||||
@@ -454,31 +456,32 @@ void ft_to_sngss7_gra (ftdm_channel_t * ftdmchan)
|
||||
/******************************************************************************/
|
||||
void ft_to_sngss7_grs (ftdm_channel_t * ftdmchan)
|
||||
{
|
||||
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
|
||||
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
ftdm_span_t *span = ftdmchan->span;
|
||||
|
||||
SiStaEvnt grs;
|
||||
|
||||
memset (&grs, 0x0, sizeof (grs));
|
||||
|
||||
grs.rangStat.eh.pres = PRSNT_NODEF;
|
||||
grs.rangStat.range.pres = PRSNT_NODEF;
|
||||
grs.rangStat.range.val = span->chan_count-1;
|
||||
|
||||
sng_cc_sta_request (1,
|
||||
0,
|
||||
0,
|
||||
sngss7_info->circuit->id,
|
||||
0,
|
||||
SIT_STA_GRSREQ,
|
||||
&grs);
|
||||
|
||||
|
||||
SS7_MSG_TRACE(ftdmchan, sngss7_info, "Tx GRS\n");
|
||||
|
||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
|
||||
|
||||
sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
|
||||
SiStaEvnt grs;
|
||||
|
||||
memset (&grs, 0x0, sizeof (grs));
|
||||
|
||||
grs.rangStat.eh.pres = PRSNT_NODEF;
|
||||
grs.rangStat.range.pres = PRSNT_NODEF;
|
||||
grs.rangStat.range.val = sngss7_span->tx_grs.range;
|
||||
|
||||
sng_cc_sta_request (1,
|
||||
0,
|
||||
0,
|
||||
sngss7_span->tx_grs.circuit,
|
||||
0,
|
||||
SIT_STA_GRSREQ,
|
||||
&grs);
|
||||
|
||||
SS7_INFO_CHAN(ftdmchan, "Tx GRS (%d:%d)\n",
|
||||
sngss7_info->circuit->cic,
|
||||
(sngss7_info->circuit->cic + sngss7_span->tx_grs.range));
|
||||
|
||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user