/* throw the TX reset flag */
if (!sngss7_tx_reset_status_pending(sngss7_info)) {
sngss7_info->ckt_flags=0;
+ sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
/* go to RESTART */
/* throw the TX reset flag */
if (!sngss7_tx_reset_status_pending(sngss7_info)) {
sngss7_info->ckt_flags=0;
+ sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
/* go to RESTART */
/* throw the TX reset flag */
if (!sngss7_tx_reset_status_pending(sngss7_info)) {
sngss7_info->ckt_flags=0;
+ sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
/* go to RESTART */
/**************************************************************************/
default:
- /* throw the reset flag */
- sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_RX);
+ /* throw the TX reset flag */
+ if (!sngss7_tx_reset_status_pending(sngss7_info)) {
+ sngss7_info->ckt_flags=0;
+ sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
+ sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
- /* set the state to RESTART */
- ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+ /* go to RESTART */
+ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+ }
break;
/**************************************************************************/
} /* switch (ftdmchan->state) */
default:
/* set the state of the channel to restart...the rest is done by the chan monitor */
+ sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL);
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
break;
/**************************************************************************/
int state_flag = 1;
int i = 0;
- SS7_DEBUG_CHAN(ftdmchan, "ftmod_sangoma_ss7 processing state %s\n", ftdm_channel_state2str (ftdmchan->state));
+ SS7_DEBUG_CHAN(ftdmchan, "ftmod_sangoma_ss7 processing state %s: ckt=0x%X, blk=0x%X\n",
+ ftdm_channel_state2str (ftdmchan->state),
+ sngss7_info->ckt_flags,
+ sngss7_info->blk_flags);
+
/*check what state we are supposed to be in */
switch (ftdmchan->state) {
}
if (sngss7_test_ckt_flag (sngss7_info, FLAG_REMOTE_REL)) {
+
+ sngss7_clear_ckt_flag (sngss7_info, FLAG_LOCAL_REL);
+
/* check if this hangup is from a tx RSC */
if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX)) {
if (!sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_SENT)) {
/* check if the interface is paused or resumed */
if (sngss7_test_flag(sngss7_intf, SNGSS7_PAUSED)) {
- ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "ISUP intf %d is PAUSED\n", sngss7_intf->id);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Circuit set to PAUSED %s\n"," ");
/* throw the pause flag */
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_RESUME);
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
} else {
- ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "ISUP intf %d is RESUMED\n", sngss7_intf->id);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Circuit set to RESUMED %s\n"," ");
/* throw the resume flag */
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_RESUME);
Reset the circuit CONFIGURED flag so that RESUME will reconfigure
this circuit. */
sngss7_info->circuit->flags &= ~SNGSS7_CONFIGURED;
- SS7_ERROR("Failed to read isup ckt = %d status\n", sngss7_info->circuit->id);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR,"Failed to read isup ckt = %d status\n", sngss7_info->circuit->id);
continue;
}
bits_ab = (state & (SNG_BIT_A + SNG_BIT_B)) >> 0;
bits_cd = (state & (SNG_BIT_C + SNG_BIT_D)) >> 2;
bits_ef = (state & (SNG_BIT_E + SNG_BIT_F)) >> 4;
+
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Circuit state=0x%X ab=0x%X cd=0x%X ef=0x%X\n",state,bits_ab,bits_cd,bits_ef);
if (bits_cd == 0x0) {
/* check if circuit is UCIC or transient */
ftdm_mutex_unlock(ftdmchan->mutex);
#endif
- } /* if (bits_ab == 0x3) */
+ } else { /* if (bits_ab == 0x3) */
+ /* The stack status is not blocked. However this is possible if
+ the circuit state was UP. So even though Master sent out the BLO
+ the status command is not showing it.
+
+ As a kudge. We will try to send out an UBL even though the status
+ indicates that there is no BLO. */
+ if (!sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) {
+ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX);
+
+ /* set the channel to suspended state */
+ SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
+ }
+ }
} else {
/* check the maintenance block status in bits A and B */
switch (bits_ab) {
break;
/**************************************************************************/
case (1):
- /* locally blocked: Therefore we need to state machine to send an unblock */
- sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX);
+ /* The stack status is Blocked. Check if the block was sent
+ by user via console. If the block was not sent by user then, it
+ was sent out by Master due to relay down.
+ Therefore send out the unblock to clear it */
+ if (!sngss7_test_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) {
+ sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX);
+
+ /* set the channel to suspended state */
+ SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
+ }
- /* set the channel to suspended state */
- SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
break;
/**************************************************************************/
case (2):
/* clear the re-config flag ... no matter what */
sngss7_clear_ckt_flag(sngss7_info, FLAG_CKT_RECONFIG);
- } /* if ((sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_RECONFIG)) */
+ }
} /* for (x = 1; x < (span->chan_count + 1); x++) */
return FTDM_SUCCESS;