cfg.t.cfg.s.snRout.slsRange = LSN_ANSI_5BIT_SLS_RANGE; /* max value of SLS for this DPC */
}
cfg.t.cfg.s.snRout.lsetSel = 0x1; /* linkset selection bit in SLS for STP */
- cfg.t.cfg.s.snRout.multiMsgPrior = FALSE; /* TRUE if multiple cong priorities of messages */
- cfg.t.cfg.s.snRout.rctReq = TRUE; /* route set congestion test required or not */
+ cfg.t.cfg.s.snRout.multiMsgPrior = TRUE; /* TRUE if multiple cong priorities of messages */
+ cfg.t.cfg.s.snRout.rctReq = TRUE; /* route set congestion test required or not */
cfg.t.cfg.s.snRout.slsLnk = FALSE;
#ifdef LSNV2
# if (SS7_NTT || defined(TDS_ROLL_UPGRADE_SUPPORT))
/**********************************************************************/
} else if (!strcasecmp(argv[c], "mem")) {
/**********************************************************************/
- /*uint32_t availMem;*/
-
- /*sng_sta_mem(&availMem);*/
+ sng_isup_reg_info_show();
/**********************************************************************/
} else if (!strcasecmp(argv[c], "stats")) {
/**********************************************************************/
ftdm_status_t handle_ucic(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
+ftdm_status_t handle_olm_msg(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
/******************************************************************************/
/* FUNCTIONS ******************************************************************/
/**************************************************************************/
case SIT_STA_OVERLOAD: /* Overload */
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx Overload\n", sngss7_info->circuit->cic);
- SS7_WARN(" %s indication not currently supported\n", DECODE_LCC_EVENT(evntType));
+ handle_olm_msg(suInstId, spInstId, circuit, globalFlg, evntType, siStaEvnt);
break;
/**************************************************************************/
case SIT_STA_LMCGBREQ: /* when LM requests ckt grp blocking */
{
SS7_FUNC_TRACE_ENTER(__FUNCTION__);
- sngss7_chan_data_t *sngss7_info = NULL;
- ftdm_channel_t *ftdmchan = NULL;
+ sngss7_chan_data_t *sngss7_info = NULL;
+ sngss7_span_data_t *sngss7_span = NULL;
+ ftdm_channel_t *ftdmchan = NULL;
+
/* get the ftdmchan and ss7_chan_data from the circuit */
if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) {
return FTDM_FAIL;
}
+ /* check if we just sent a GRS request...*/
+ sngss7_span = ftdmchan->span->mod_data;
+ if (sngss7_span->tx_grs.circuit > 0) {
+ /* we need to put all circuits on this UCIC */
+ sngss7_span->ucic.circuit = sngss7_span->tx_grs.circuit;
+ sngss7_span->ucic.range = sngss7_span->tx_grs.range;
+ goto done;
+ }
+
/* lock the channel */
ftdm_mutex_lock(ftdmchan->mutex);
/* unlock the channel again before we exit */
ftdm_mutex_unlock(ftdmchan->mutex);
-
+done:
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
return FTDM_SUCCESS;
}
return FTDM_SUCCESS;
}
+/******************************************************************************/
+ftdm_status_t handle_olm_msg(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt)
+{
+ SS7_FUNC_TRACE_ENTER(__FUNCTION__);
+
+ sngss7_chan_data_t *sngss7_info = NULL;
+ ftdm_channel_t *ftdmchan = NULL;
+
+ /* get the ftdmchan and ss7_chan_data from the circuit */
+ if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) {
+ SS7_ERROR("Failed to extract channel data for circuit = %d!\n", circuit);
+ SS7_FUNC_TRACE_EXIT(__FUNCTION__);
+ return FTDM_FAIL;
+ }
+
+ /* handle overload */
+ SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]Rx Overload\n", sngss7_info->circuit->cic);
+
+ sng_isup_reg_info_show();
+
+ SS7_FUNC_TRACE_EXIT(__FUNCTION__);
+ return FTDM_SUCCESS;
+}
+
/******************************************************************************/
/* For Emacs:
* Local Variables:
check_if_rx_grs_processed(ftdmspan);
} /* if (sngss7_span->rx_grs.range > 0) */
+ /* check if there is a UCIC to be processed on the span */
+ if (sngss7_span->ucic.range > 0) {
+ /* process the span wide UCIC */
+ process_span_ucic(ftdmspan);
+ } /* if (sngss7_span->ucic.range > 0) */
+
/* check each channel on the span to see if there is an un-procressed SUS/RES flag */
check_for_res_sus_flag(ftdmspan);
} /* master while loop */
} else {
/* inbound call so we need to send out ACM */
ft_to_sngss7_acm (ftdmchan);
+
+ ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
}
break;
ft_to_sngss7_gra(ftdmchan);
/* clean out the spans GRS structure */
- sngss7_span_data_t *span = ftdmchan->span->mod_data;
- span->rx_grs.circuit = 0;
- span->rx_grs.range = 0;
+ clear_rx_grs_data(sngss7_info);
}
/* clear the grp reset flag */
clear_tx_grs_flags(sngss7_info);
/* clean out the spans GRA structure */
- sngss7_span_data_t *span = ftdmchan->span->mod_data;
- span->rx_gra.circuit = 0;
- span->rx_gra.range = 0;
+ clear_rx_gra_data(sngss7_info);
} /* if (sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP)) */
/* check if we came from reset (aka we just processed a reset) */
/* set the unblk flag */
sngss7_set_flag(sngss7_info, FLAG_CKT_UCIC_UNBLK);
+
+ /* clear the block flag */
+ sngss7_clear_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK);
+
+ /* process the flag */
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
/* break out of the processing for now */
/* remove any reset flags */
clear_rx_grs_flags(sngss7_info);
+ clear_rx_grs_data(sngss7_info);
clear_tx_grs_flags(sngss7_info);
+ clear_tx_grs_data(sngss7_info);
clear_rx_rsc_flags(sngss7_info);
clear_tx_rsc_flags(sngss7_info);
sngss7_clear_flag(sngss7_info, FLAG_INFID_PAUSED);
sngss7_set_flag(sngss7_info, FLAG_INFID_RESUME);
}
-#if 0
+#if 1
/* throw the grp reset flag */
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX);
if (x == 1) {
sngss7_group_data_t tx_cgb;
sngss7_group_data_t rx_cgu;
sngss7_group_data_t tx_cgu;
+ sngss7_group_data_t ucic;
ftdm_queue_t *event_queue;
}sngss7_span_data_t;
ftdm_status_t check_if_rx_gra_started(ftdm_span_t *ftdmspan);
ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan);
+ftdm_status_t process_span_ucic(ftdm_span_t *ftdmspan);
+
ftdm_status_t clear_rx_grs_flags(sngss7_chan_data_t *sngss7_info);
ftdm_status_t clear_tx_grs_flags(sngss7_chan_data_t *sngss7_info);
ftdm_status_t clear_rx_rsc_flags(sngss7_chan_data_t *sngss7_info);
ftdm_status_t clear_tx_rsc_flags(sngss7_chan_data_t *sngss7_info);
+ftdm_status_t clear_rx_grs_data(sngss7_chan_data_t *sngss7_info);
+ftdm_status_t clear_rx_gra_data(sngss7_chan_data_t *sngss7_info);
+ftdm_status_t clear_tx_grs_data(sngss7_chan_data_t *sngss7_info);
/* in ftmod_sangoma_ss7_timers.c */
ftdm_status_t check_if_rx_gra_started(ftdm_span_t *ftdmspan);
ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan);
+ftdm_status_t process_span_ucic(ftdm_span_t *ftdmspan);
+
ftdm_status_t clear_rx_grs_flags(sngss7_chan_data_t *sngss7_info);
ftdm_status_t clear_tx_grs_flags(sngss7_chan_data_t *sngss7_info);
ftdm_status_t clear_rx_rsc_flags(sngss7_chan_data_t *sngss7_info);
ftdm_status_t clear_tx_rsc_flags(sngss7_chan_data_t *sngss7_info);
+ftdm_status_t clear_rx_grs_data(sngss7_chan_data_t *sngss7_info);
+ftdm_status_t clear_rx_gra_data(sngss7_chan_data_t *sngss7_info);
+ftdm_status_t clear_tx_grs_data(sngss7_chan_data_t *sngss7_info);
/******************************************************************************/
/* FUNCTIONS ******************************************************************/
} else {
/* keep the odd flag down */
odd = 0;
- /* throw the flag */
- flag = 1;
+ /* break right away since we don't need to write the digits */
+ break;
}
/* push the digits into the trillium structure */
upper = (atoi(&tmp[0])) << 4;
} else {
/* there is no upper ... fill in ST */
- upper = 0xF;
- /* throw the odd flag */
- odd = 1;
+ upper = 0xF0;
+ /* keep the odd flag down */
+ odd = 0;
/* throw the end flag */
flag = 1;
} /* if (tmp != '\0') */
} else {
- /* keep the odd flag down */
+ /* throw the odd flag */
odd = 1;
/* need to add the ST */
lower = 0xF;
int bit = 0;
- ftdm_log(FTDM_LOG_DEBUG, "Found Rx GRS on span %d...checking circuits\n", ftdmspan->span_id);
+ ftdm_log(FTDM_LOG_DEBUG, "Found Rx GRS on span %s...checking circuits\n", ftdmspan->name);
/* check all the circuits in the range to see if they are done resetting */
for ( i = sngss7_span->rx_grs.circuit; i < (sngss7_span->rx_grs.circuit + sngss7_span->rx_grs.range + 1); i++) {
sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
int i;
- for ( i = sngss7_span->rx_gra.circuit; i < (sngss7_span->rx_gra.circuit + sngss7_span->rx_gra.range + 1); i++) {
+ for (i = sngss7_span->rx_gra.circuit; i < (sngss7_span->rx_gra.circuit + sngss7_span->rx_gra.range + 1); i++) {
/* extract the channel in question */
if (extract_chan_data(i, &sngss7_info, &ftdmchan)) {
return FTDM_SUCCESS;
}
+/******************************************************************************/
+ftdm_status_t process_span_ucic(ftdm_span_t *ftdmspan)
+{
+ ftdm_channel_t *ftdmchan = NULL;
+ sngss7_chan_data_t *sngss7_info = NULL;
+ sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
+ int i;
+
+ for (i = sngss7_span->ucic.circuit; i < (sngss7_span->ucic.circuit + sngss7_span->ucic.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);
+ continue;
+ }
+
+ /* lock the channel */
+ ftdm_mutex_lock(ftdmchan->mutex);
+
+ SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx UCIC\n", sngss7_info->circuit->cic);
+
+ /* clear up any pending state changes */
+ while (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
+ ftdm_sangoma_ss7_process_state_change (ftdmchan);
+ }
+
+ /* throw the ckt block flag */
+ sngss7_set_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK);
+
+ /* set the channel to suspended state */
+ ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
+
+ /* unlock the channel again before we exit */
+ ftdm_mutex_unlock(ftdmchan->mutex);
+ }
+
+ /* clear out the ucic data since we're done with it */
+ memset(&sngss7_span->ucic, 0x0, sizeof(sngss7_group_data_t));
+
+ return FTDM_SUCCESS;
+}
+
/******************************************************************************/
ftdm_status_t clear_rx_grs_flags(sngss7_chan_data_t *sngss7_info)
{
return FTDM_SUCCESS;
}
+/******************************************************************************/
+ftdm_status_t clear_rx_grs_data(sngss7_chan_data_t *sngss7_info)
+{
+ ftdm_channel_t *ftdmchan = sngss7_info->ftdmchan;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+
+ /* clear the rx_grs data fields */
+ memset(&sngss7_span->rx_grs, 0x0, sizeof(sngss7_group_data_t));
+
+ return FTDM_SUCCESS;
+}
+
+/******************************************************************************/
+ftdm_status_t clear_rx_gra_data(sngss7_chan_data_t *sngss7_info)
+{
+ ftdm_channel_t *ftdmchan = sngss7_info->ftdmchan;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+
+ /* clear the rx_grs data fields */
+ memset(&sngss7_span->rx_gra, 0x0, sizeof(sngss7_group_data_t));
+
+ return FTDM_SUCCESS;
+}
/******************************************************************************/
ftdm_status_t clear_tx_grs_flags(sngss7_chan_data_t *sngss7_info)
{
return FTDM_SUCCESS;
}
+/******************************************************************************/
+ftdm_status_t clear_tx_grs_data(sngss7_chan_data_t *sngss7_info)
+{
+ ftdm_channel_t *ftdmchan = sngss7_info->ftdmchan;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+
+ /* clear the rx_grs data fields */
+ memset(&sngss7_span->tx_grs, 0x0, sizeof(sngss7_group_data_t));
+
+ return FTDM_SUCCESS;
+}
+
+/******************************************************************************/
+
/******************************************************************************/
ftdm_status_t clear_rx_rsc_flags(sngss7_chan_data_t *sngss7_info)
{