提交 16c2da13 authored 作者: wadam's avatar wadam

Merge branch 'releases.3.4' of ssh://git.sangoma.com/smg_freeswitch into releases.3.4

...@@ -87,6 +87,7 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_complete_state(const char *file, const c ...@@ -87,6 +87,7 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_complete_state(const char *file, const c
ftdm_assert(!fchan->history[hindex].end_time, "End time should be zero!\n"); ftdm_assert(!fchan->history[hindex].end_time, "End time should be zero!\n");
fchan->history[hindex].end_time = ftdm_current_time_in_ms(); fchan->history[hindex].end_time = ftdm_current_time_in_ms();
fchan->last_state_change_time = ftdm_current_time_in_ms();
fchan->state_status = FTDM_STATE_STATUS_COMPLETED; fchan->state_status = FTDM_STATE_STATUS_COMPLETED;
......
...@@ -1632,7 +1632,9 @@ static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int c ...@@ -1632,7 +1632,9 @@ static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int c
ftdm_mutex_lock(ftdmchan->mutex); ftdm_mutex_lock(ftdmchan->mutex);
/* throw the reset flag */ /* throw the reset flag */
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX); sngss7_set_ckt_flag (sngss7_info, FLAG_LOCAL_REL);
sngss7_clear_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
sngss7_tx_reset_restart(sngss7_info);
switch (ftdmchan->state) { switch (ftdmchan->state) {
/**************************************************************************/ /**************************************************************************/
......
...@@ -122,8 +122,11 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ ...@@ -122,8 +122,11 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
/* as per Q.764, 2.8.2.3 xiv ... remove the block from this channel */ /* as per Q.764, 2.8.2.3 xiv ... remove the block from this channel */
sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN);
sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX);
sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX_DN);
sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX); sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX);
sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX_DN);
/* KONRAD FIX ME : check in case there is a ckt and grp block */ /* KONRAD FIX ME : check in case there is a ckt and grp block */
} }
...@@ -324,9 +327,8 @@ handle_glare: ...@@ -324,9 +327,8 @@ handle_glare:
/* throw the TX reset flag */ /* throw the TX reset flag */
if (!sngss7_tx_reset_status_pending(sngss7_info)) { if (!sngss7_tx_reset_status_pending(sngss7_info)) {
sngss7_info->ckt_flags=0; sngss7_tx_reset_restart(sngss7_info);
sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
/* go to RESTART */ /* go to RESTART */
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
...@@ -398,9 +400,8 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ ...@@ -398,9 +400,8 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ
/* throw the TX reset flag */ /* throw the TX reset flag */
if (!sngss7_tx_reset_status_pending(sngss7_info)) { if (!sngss7_tx_reset_status_pending(sngss7_info)) {
sngss7_info->ckt_flags=0; sngss7_tx_reset_restart(sngss7_info);
sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
/* go to RESTART */ /* go to RESTART */
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
...@@ -665,9 +666,8 @@ ftdm_status_t handle_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circ ...@@ -665,9 +666,8 @@ ftdm_status_t handle_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circ
/* throw the TX reset flag */ /* throw the TX reset flag */
if (!sngss7_tx_reset_status_pending(sngss7_info)) { if (!sngss7_tx_reset_status_pending(sngss7_info)) {
sngss7_info->ckt_flags=0; sngss7_tx_reset_restart(sngss7_info);
sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL); sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
/* go to RESTART */ /* go to RESTART */
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
...@@ -769,6 +769,10 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ ...@@ -769,6 +769,10 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
/* send out the release complete */ /* send out the release complete */
ft_to_sngss7_rlc (ftdmchan); ft_to_sngss7_rlc (ftdmchan);
} else {
SS7_DEBUG_CHAN(ftdmchan, "Collision of REL messages - resetting state.\n", " ");
ft_to_sngss7_rlc (ftdmchan);
goto rel_ind_reset;
} }
break; break;
/**************************************************************************/ /**************************************************************************/
...@@ -791,11 +795,11 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ ...@@ -791,11 +795,11 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
/**************************************************************************/ /**************************************************************************/
default: default:
rel_ind_reset:
/* throw the TX reset flag */ /* throw the TX reset flag */
if (!sngss7_tx_reset_status_pending(sngss7_info)) { 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_REMOTE_REL); sngss7_tx_reset_restart(sngss7_info);
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
/* go to RESTART */ /* go to RESTART */
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
...@@ -1650,6 +1654,7 @@ ftdm_status_t handle_blo_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ ...@@ -1650,6 +1654,7 @@ ftdm_status_t handle_blo_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
/* throw the ckt block flag */ /* throw the ckt block flag */
sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN);
/* set the channel to suspended state */ /* set the channel to suspended state */
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
...@@ -1981,7 +1986,7 @@ ftdm_status_t handle_rsc_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ ...@@ -1981,7 +1986,7 @@ ftdm_status_t handle_rsc_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP); sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP);
/* go to DOWN */ /* go to DOWN */
/*ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN);*/ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
break; break;
/**********************************************************************/ /**********************************************************************/
......
...@@ -1049,11 +1049,13 @@ if (ftdmchan->state == new_state) { \ ...@@ -1049,11 +1049,13 @@ if (ftdmchan->state == new_state) { \
#define sngss7_set_options(obj, option) ((obj)->options |= (option)) #define sngss7_set_options(obj, option) ((obj)->options |= (option))
#define sngss7_tx_block_status_clear(obj) (!sngss7_test_ckt_blk_flag(obj, (FLAG_CKT_MN_BLOCK_TX | \ #define sngss7_tx_block_status_clear(obj) (!sngss7_test_ckt_blk_flag(obj, (FLAG_CKT_MN_BLOCK_TX | \
FLAG_CKT_MN_BLOCK_TX_DN | \ FLAG_CKT_MN_BLOCK_TX_DN | \
FLAG_GRP_MN_BLOCK_TX | \ FLAG_GRP_MN_BLOCK_TX | \
FLAG_GRP_MN_BLOCK_TX_DN | \ FLAG_GRP_MN_BLOCK_TX_DN | \
FLAG_GRP_HW_BLOCK_TX | \ FLAG_GRP_HW_BLOCK_TX | \
FLAG_GRP_HW_BLOCK_TX_DN ))) FLAG_GRP_HW_BLOCK_TX_DN | \
FLAG_GRP_HW_UNBLK_TX | \
FLAG_CKT_MN_UNBLK_TX )))
#define sngss7_block_status_clear(obj) (obj->blk_flags == 0) #define sngss7_block_status_clear(obj) (obj->blk_flags == 0)
...@@ -1062,12 +1064,23 @@ if (ftdmchan->state == new_state) { \ ...@@ -1062,12 +1064,23 @@ if (ftdmchan->state == new_state) { \
FLAG_GRP_RESET_TX | \ FLAG_GRP_RESET_TX | \
FLAG_GRP_RESET_RX ))) FLAG_GRP_RESET_RX )))
#define sngss7_tx_reset_status_pending(obj) ((sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) && \ #define sngss7_tx_reset_sent(obj) ((sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) && \
sngss7_test_ckt_flag(obj, (FLAG_RESET_SENT))) || \ sngss7_test_ckt_flag(obj, (FLAG_RESET_SENT))) || \
(sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX)) && \ (sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX)) && \
sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_SENT)))) sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_SENT))))
#define sngss7_tx_reset_status_pending(obj) (sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) || sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX)))
#define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && (sngss7_reset_status_clear(obj))) #define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && \
(sngss7_reset_status_clear(obj)) && \
(!sngss7_test_ckt_flag((obj),FLAG_INFID_PAUSED)))
#define sngss7_tx_reset_restart(obj) do { clear_tx_grs_flags((obj)); \
clear_tx_grs_data((obj)); \
clear_tx_rsc_flags((obj)); \
sngss7_set_ckt_flag((obj), (FLAG_RESET_TX)); \
} while (0);
#ifdef SMG_RELAY_DBG #ifdef SMG_RELAY_DBG
......
...@@ -2098,6 +2098,55 @@ void sngss7_set_sig_status(sngss7_chan_data_t *sngss7_info, ftdm_signaling_statu ...@@ -2098,6 +2098,55 @@ void sngss7_set_sig_status(sngss7_chan_data_t *sngss7_info, ftdm_signaling_statu
return; return;
} }
#if 0
ftdm_status_t check_for_invalid_states(ftdm_channel_t *ftmchan)
{
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
if (!sngss7_info) {
SS7_WARN_CHAN(ftdmchan, "Found ftdmchan with no sig module data!%s\n", " ");
return FTDM_FAIL;
}
if (sngss7_test_flag(sngss7_intf, SNGSS7_PAUSED)) {
return FTDM_SUCCESS;
}
switch (ftdmchan->state) {
case UP:
case DOWN:
return FTDM_SUCCESS;
default:
if ((ftdm_current_time_in_ms() - ftdmchan->last_state_change_time) > 30000) {
SS7_WARN_CHAN(ftdmchan, "Circuite in state=%s too long - resetting!%s\n",
ftdm_channel_state2str(ftdmchan->state));
ftdm_channel_lock(ftdmchan);
if (sngss7_channel_status_clear(sngss7_info)) {
sngss7_tx_reset_restart(sngss7_info);
if (ftdmchan->state == FTDM_CHANNEL_STATE_RESTART) {
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
} else {
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
}
} else {
}
ftdm_channel_unlock(ftdmchan);
}
}
return FTDM_SUCCESS;
}
#endif
/******************************************************************************/ /******************************************************************************/
ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan)
{ {
...@@ -2232,11 +2281,16 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) ...@@ -2232,11 +2281,16 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan)
SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
} }
/* Only locally blocked, thus remove a remote block */
sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
sngss7_clear_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN);
break; break;
/**************************************************************************/ /**************************************************************************/
case (2): case (2):
/* remotely blocked */ /* remotely blocked */
sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN);
/* set the channel to suspended state */ /* set the channel to suspended state */
SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
...@@ -2244,8 +2298,11 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan) ...@@ -2244,8 +2298,11 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan)
/**************************************************************************/ /**************************************************************************/
case (3): case (3):
/* both locally and remotely blocked */ /* both locally and remotely blocked */
sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_UNBLK_TX); 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);
}
sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX); sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
sngss7_set_ckt_blk_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX_DN);
/* set the channel to suspended state */ /* set the channel to suspended state */
SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); SS7_STATE_CHANGE(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
......
...@@ -469,6 +469,7 @@ struct ftdm_channel { ...@@ -469,6 +469,7 @@ struct ftdm_channel {
int32_t txdrops; int32_t txdrops;
int32_t rxdrops; int32_t rxdrops;
ftdm_usrmsg_t *usrmsg; ftdm_usrmsg_t *usrmsg;
ftdm_time_t last_state_change_time;
}; };
struct ftdm_span { struct ftdm_span {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论