]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: Add new queue for ss7 clone messages, all incoming messages are queued now
authorMoises Silva <moy@sangoma.com>
Thu, 26 Jan 2012 20:21:51 +0000 (15:21 -0500)
committerMoises Silva <moy@sangoma.com>
Thu, 26 Jan 2012 20:21:51 +0000 (15:21 -0500)
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c

index c963ea7cb7d03b6a05fcfce6d47b1cc783277545..ebee2c382ddc0a3b64ea0415a4c31c9bd28e255b 100644 (file)
@@ -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;
        ftdm_channel_t *ftdmchan = NULL;
+       sngss7_event_data_t *event_clone = NULL;
 
        /* get the ftdmchan and ss7_chan_data from the circuit */
        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
        /* now that we have the right channel ... put a lock on it so no-one else can use it */
        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 */
        ftdm_channel_advance_states(ftdmchan);
 
@@ -576,6 +593,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev
                break;
        /**************************************************************************/
        case (SNGSS7_SSP_STA_CFM_EVENT):
+               SS7_ERROR("dazed and confused ... hu?!\n");
                break;
        /**************************************************************************/
        default:
index 78210d50fb26f2c74a25f9c289e18a6d2c90ad5c..2a1ca1749e7d11abe61fa4ddff469d9d92537679 100644 (file)
@@ -485,6 +485,7 @@ typedef struct sngss7_chan_data {
        sngss7_group_data_t             rx_gra;
        sngss7_group_data_t             tx_grs;
        sngss7_group_data_t             ucic;
+       ftdm_queue_t                    *event_queue;
 } sngss7_chan_data_t;
 
 #define SNGSS7_RX_GRS_PENDING (1 << 0)
index f7d0171f93f44970900f2cc1779035dc514b038c..d7732cce6cef8d1e36deffd194ffeb631838306c 100644 (file)
@@ -2925,6 +2925,9 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
                /* prepare the global info sturcture */
                ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t));
                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];
 
                g_ftdm_sngss7_data.cfg.isupCkt[x].obj                   = ss7_info;