提交 1b964054 authored 作者: Moises Silva's avatar Moises Silva

freetdm: Add new queue for ss7 clone messages, all incoming messages are queued now

上级 28e27248
...@@ -511,6 +511,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev ...@@ -511,6 +511,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev
{ {
sngss7_chan_data_t *sngss7_info = NULL; sngss7_chan_data_t *sngss7_info = NULL;
ftdm_channel_t *ftdmchan = NULL; ftdm_channel_t *ftdmchan = NULL;
sngss7_event_data_t *event_clone = NULL;
/* get the ftdmchan and ss7_chan_data from the circuit */ /* get the ftdmchan and ss7_chan_data from the circuit */
if (extract_chan_data(sngss7_event->circuit, &sngss7_info, &ftdmchan)) { if (extract_chan_data(sngss7_event->circuit, &sngss7_info, &ftdmchan)) {
...@@ -521,6 +522,22 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev ...@@ -521,6 +522,22 @@ 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 */ /* now that we have the right channel ... put a lock on it so no-one else can use it */
ftdm_channel_lock(ftdmchan); ftdm_channel_lock(ftdmchan);
if (sngss7_info->event_queue) {
if (sngss7_event->event_id == SNGSS7_CON_IND_EVENT) {
/* this is the first event in a call, flush the event queue */
while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) {
SS7_WARN("Discarding clone event from past call for circuit = %d!\n", sngss7_event->circuit);
ftdm_safe_free(event_clone);
}
}
/* clone the event and save it for later usage */
event_clone = ftdm_calloc(1, sizeof(*sngss7_event));
if (event_clone) {
memcpy(clone, sngss7_event, sizeof(*sngss7_event));
ftdm_queue_enqueue(sngss7_info->event_queue, clone);
}
}
/* while there's a state change present on this channel process it */ /* while there's a state change present on this channel process it */
ftdm_channel_advance_states(ftdmchan); ftdm_channel_advance_states(ftdmchan);
...@@ -576,6 +593,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev ...@@ -576,6 +593,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev
break; break;
/**************************************************************************/ /**************************************************************************/
case (SNGSS7_SSP_STA_CFM_EVENT): case (SNGSS7_SSP_STA_CFM_EVENT):
SS7_ERROR("dazed and confused ... hu?!\n");
break; break;
/**************************************************************************/ /**************************************************************************/
default: default:
......
...@@ -485,6 +485,7 @@ typedef struct sngss7_chan_data { ...@@ -485,6 +485,7 @@ typedef struct sngss7_chan_data {
sngss7_group_data_t rx_gra; sngss7_group_data_t rx_gra;
sngss7_group_data_t tx_grs; sngss7_group_data_t tx_grs;
sngss7_group_data_t ucic; sngss7_group_data_t ucic;
ftdm_queue_t *event_queue;
} sngss7_chan_data_t; } sngss7_chan_data_t;
#define SNGSS7_RX_GRS_PENDING (1 << 0) #define SNGSS7_RX_GRS_PENDING (1 << 0)
......
...@@ -2925,6 +2925,9 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan) ...@@ -2925,6 +2925,9 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
/* prepare the global info sturcture */ /* prepare the global info sturcture */
ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t)); ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t));
ss7_info->ftdmchan = NULL; ss7_info->ftdmchan = NULL;
if (ftdm_queue_create(&ss7_info->event_queue, SNGSS7_EVENT_QUEUE_SIZE) != FTDM_SUCCESS) {
SS7_CRITICAL("Failed to create ss7 cic event queue\n");
}
ss7_info->circuit = &g_ftdm_sngss7_data.cfg.isupCkt[x]; ss7_info->circuit = &g_ftdm_sngss7_data.cfg.isupCkt[x];
g_ftdm_sngss7_data.cfg.isupCkt[x].obj = ss7_info; g_ftdm_sngss7_data.cfg.isupCkt[x].obj = ss7_info;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论