]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: set proper flags when a given layer (ISUP, MTP3 etc) is started
authorMoises Silva <moy@sangoma.com>
Mon, 13 Jun 2011 21:33:41 +0000 (17:33 -0400)
committerMoises Silva <moy@sangoma.com>
Wed, 21 Sep 2011 19:31:12 +0000 (15:31 -0400)
         and verify such flags on shutdown to avoid segfault when shutting down
         a layer that was never started - fix issue #741

libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c
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_relay.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c

index 9ad2efa8e7c4eaee63bf13e26f25ba42ba400505..dd1058f4203c4a8e5a8ef81449d94752512a491c 100644 (file)
@@ -99,17 +99,18 @@ int  ft_to_sngss7_cfg_all(void)
                        return 1;
                } else {
                        SS7_INFO("Started Stack Manager!\n");
-                       sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM);
+                       sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM_STARTED);
                }
 
                /* check if the configuration had a Relay Channel */
-               if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY)) { 
+               if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_PRESENT)) { 
                        /* start up the relay task */
                        if (sng_isup_init_relay()) {
                                SS7_CRITICAL("Failed to start Relay\n");
                                return 1;
                        } else {
                                SS7_INFO("Started Relay!\n");
+                               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_STARTED);
                        }
 
                        /* run general configuration on the relay task */
@@ -122,12 +123,13 @@ int  ft_to_sngss7_cfg_all(void)
 
                } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY)) */
 
-               if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC)) {
+               if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_PRESENT)) {
                        if (sng_isup_init_cc()) {
                                SS7_CRITICAL("Failed to start Call-Control\n");
                                return 1;
                        } else {
                                SS7_INFO("Started Call-Control!\n");
+                               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_STARTED);
                        }
                        if (ftmod_ss7_cc_gen_config()) {
                                SS7_CRITICAL("CC General configuration FAILED!\n");
@@ -143,12 +145,13 @@ int  ft_to_sngss7_cfg_all(void)
                        }
                } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC)) */
 
-               if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) {
+               if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_PRESENT)) {
                        if (sng_isup_init_isup()) {
                                SS7_CRITICAL("Failed to start ISUP\n");
                                return 1;
                        } else {
                                SS7_INFO("Started ISUP!\n");
+                               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_STARTED);
                        }       
                        if (ftmod_ss7_isup_gen_config()) {
                                SS7_CRITICAL("ISUP General configuration FAILED!\n");
@@ -158,12 +161,13 @@ int  ft_to_sngss7_cfg_all(void)
                        }
                } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) */
 
-               if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3)) {
+               if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3_PRESENT)) {
                        if (sng_isup_init_mtp3()) {
                                SS7_CRITICAL("Failed to start MTP3\n");
                                return 1;
                        } else {
                                SS7_INFO("Started MTP3!\n");
+                               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3_STARTED);
                        }
 
                        if (ftmod_ss7_mtp3_gen_config()) {
@@ -174,18 +178,20 @@ int  ft_to_sngss7_cfg_all(void)
                        }
                } /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3)) */
 
-               if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) {
+               if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_PRESENT)) {
                        if (sng_isup_init_mtp2()) {
                                SS7_CRITICAL("Failed to start MTP2\n");
                                return 1;
                        } else {
                                SS7_INFO("Started MTP2!\n");
+                               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_STARTED);
                        }
                        if (sng_isup_init_mtp1()) {
-                               SS7_CRITICAL("Failed to start MTP2\n");
+                               SS7_CRITICAL("Failed to start MTP1\n");
                                return 1;
                        } else {
                                SS7_INFO("Started MTP1!\n");
+                               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP1_STARTED);
                        }
                        if (ftmod_ss7_mtp1_gen_config()) {
                                SS7_CRITICAL("MTP1 General configuration FAILED!\n");
@@ -376,7 +382,7 @@ int  ft_to_sngss7_cfg_all(void)
                x++;
        } /* while (x < (MAX_ISAPS)) */
 
-       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) {
+       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_STARTED)) {
                x = 1;
                while (x < (MAX_ISUP_INFS)) {
                        /* check if this link has been configured already */
index d8c45fd4829ee0dd8b2806f9a9ce1375245ba459..a849bf2f626683c56fde722528ea3c2080dd1e9b 100644 (file)
@@ -1628,32 +1628,36 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_ss7_unload)
 
        ftdm_log (FTDM_LOG_INFO, "Starting ftmod_sangoma_ss7 unload...\n");
 
-       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC)) {
+       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_STARTED)) {
                sng_isup_free_cc();
-               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC);
+               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_STARTED);
        }
 
-       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) {
+       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_STARTED)) {
                ftmod_ss7_shutdown_isup();
                sng_isup_free_isup();
-               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP);
+               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_STARTED);
        }
 
-       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3)) {
+       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3_STARTED)) {
                ftmod_ss7_shutdown_mtp3();
                sng_isup_free_mtp3();
-               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3);
+               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3_STARTED);
        }
 
-       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) {
+       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_STARTED)) {
                ftmod_ss7_shutdown_mtp2();
                sng_isup_free_mtp2();
+               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_STARTED);
+       }
+
+       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP1_STARTED)) {
                sng_isup_free_mtp1();
-               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2);
+               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP1_STARTED);
        }
 
-       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY)) {
-               /* go through all the relays channels and configure it */
+       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_STARTED)) {
+               /* go through all the relays channels and disable them */
                x = 1;
                while (x < (MAX_RELAY_CHANNELS)) {
                        /* check if this relay channel has been configured already */
@@ -1675,11 +1679,12 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_ss7_unload)
                
                ftmod_ss7_shutdown_relay();
                sng_isup_free_relay();
-               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY);
+               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_STARTED);
        }
 
-       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM)) {
+       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM_STARTED)) {
                sng_isup_free_sm();
+               sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM_STARTED);
        }
 
        sng_isup_free_gen();
index 159a02fc01b08bac3e5c14740f05fe1e2dcc6ecc..cda6225217263bae510bc32682e3fcd3e354811d 100644 (file)
@@ -636,13 +636,25 @@ typedef enum {
 } sng_cfg_flag_t;
 
 typedef enum {
-       SNGSS7_SM               = (1 << 0),
-       SNGSS7_RY               = (1 << 1),
-       SNGSS7_MTP1             = (1 << 2),
-       SNGSS7_MTP2             = (1 << 3),
-       SNGSS7_MTP3             = (1 << 4),
-       SNGSS7_ISUP             = (1 << 5),
-       SNGSS7_CC               = (1 << 6)
+       SNGSS7_SM_STARTED       = (1 << 0),
+
+       SNGSS7_RY_PRESENT       = (1 << 2),
+       SNGSS7_RY_STARTED       = (1 << 3),
+       
+       SNGSS7_MTP1_PRESENT     = (1 << 4),
+       SNGSS7_MTP1_STARTED     = (1 << 5),
+
+       SNGSS7_MTP2_PRESENT     = (1 << 6),
+       SNGSS7_MTP2_STARTED     = (1 << 7),
+
+       SNGSS7_MTP3_PRESENT     = (1 << 8),
+       SNGSS7_MTP3_STARTED     = (1 << 9),
+
+       SNGSS7_ISUP_PRESENT     = (1 << 10),
+       SNGSS7_ISUP_STARTED     = (1 << 11),
+
+       SNGSS7_CC_PRESENT       = (1 << 12),
+       SNGSS7_CC_STARTED       = (1 << 13),
 } sng_task_flag_t;
 /******************************************************************************/
 
index 16624cc9028129b93c7c11b8a0be930ecf072126..bfb69712976461772ba89e6fc747cc03c649bbdf 100644 (file)
@@ -300,7 +300,7 @@ ftdm_status_t disable_all_sigs_for_relay(uint32_t procId)
 ftdm_status_t disble_all_mtp2_sigs_for_relay(void)
 {
        /* check if there is a local mtp2 link*/
-       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) {
+       if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_STARTED)) {
                SS7_INFO("Disalbing all mtp2 sig links on local system\n");
 
                ftmod_ss7_disable_grp_mtp2Link(1);
index 69016113b06843ed429717b5349a5967ae29e1c9..2794eb497cd90300f3b3e73702b044a52f75c051 100644 (file)
@@ -2082,7 +2082,7 @@ static int ftmod_ss7_fill_in_relay_channel(sng_relay_t *relay_channel)
                                        relay_channel->port,
                                        relay_channel->procId, 
                                        relay_channel->id);
-               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY);
+               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY_PRESENT);
        } else {
                relay_channel->id = i;
                SS7_DEBUG("found existing relay channel on type:%d, hostname:%s, port:%d, procId:%d, id = %d\n",
@@ -2116,7 +2116,7 @@ static int ftmod_ss7_fill_in_mtp1_link(sng_mtp1_link_t *mtp1Link)
        /* check if this id value has been used already */
        if (g_ftdm_sngss7_data.cfg.mtp1Link[i].id == 0) {
                SS7_DEBUG("Found new MTP1 Link: id=%d, name=%s\n", mtp1Link->id, mtp1Link->name);
-               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP1);
+               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP1_PRESENT);
        } else {
                SS7_DEBUG("Found an existing MTP1 Link: id=%d, name=%s (old name=%s)\n", 
                                        mtp1Link->id, 
@@ -2142,7 +2142,7 @@ static int ftmod_ss7_fill_in_mtp2_link(sng_mtp2_link_t *mtp2Link)
        /* check if this id value has been used already */
        if (g_ftdm_sngss7_data.cfg.mtp2Link[i].id == 0) {
                SS7_DEBUG("Found new MTP2 Link: id=%d, name=%s\n", mtp2Link->id, mtp2Link->name);
-               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2);
+               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2_PRESENT);
        } else {
                SS7_DEBUG("Found an existing MTP2 Link: id=%d, name=%s (old name=%s)\n", 
                                        mtp2Link->id, 
@@ -2219,7 +2219,7 @@ static int ftmod_ss7_fill_in_mtp3_link(sng_mtp3_link_t *mtp3Link)
        /* check if this id value has been used already */
        if (g_ftdm_sngss7_data.cfg.mtp3Link[i].id == 0) {
                SS7_DEBUG("Found new MTP3 Link: id=%d, name=%s\n", mtp3Link->id, mtp3Link->name);
-               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3);
+               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3_PRESENT);
        } else {
                SS7_DEBUG("Found an existing MTP3 Link: id=%d, name=%s (old name=%s)\n", 
                                        mtp3Link->id, 
@@ -2560,7 +2560,7 @@ static int ftmod_ss7_fill_in_isup_interface(sng_isup_inf_t *sng_isup)
        /* check if this id value has been used already */
        if (g_ftdm_sngss7_data.cfg.isupIntf[i].id == 0) {
                SS7_DEBUG("Found new ISUP Interface: id=%d, name=%s\n", sng_isup->id, sng_isup->name);
-               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP);
+               sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP_PRESENT);
        } else {
                SS7_DEBUG("Found an existing ISUP Interface: id=%d, name=%s (old name=%s)\n", 
                                        sng_isup->id, 
@@ -2908,7 +2908,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
                        g_ftdm_sngss7_data.cfg.isupCkt[x].type          = SNG_CKT_VOICE;
                        
                        /* throw the flag to indicate that we need to start call control */
-                       sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC);
+                       sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC_PRESENT);
                }
 
                if (timeslot.channel) {