]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
only auto-restart if the binded ip changes
authorAnthony Minessale <anthony.minessale@gmail.com>
Thu, 22 Jan 2009 23:07:31 +0000 (23:07 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Thu, 22 Jan 2009 23:07:31 +0000 (23:07 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11428 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia.c
src/switch_core.c

index 530c19cfd25d00be51cd82741711c2d1ca0a21a2..fb42db3331a8fdce6416ae1320eccb894278283f 100644 (file)
@@ -2756,6 +2756,48 @@ static void general_event_handler(switch_event_t *event)
                        const char *cond = switch_event_get_header(event, "condition");
 
                        if (cond && !strcmp(cond, "network-address-change") && mod_sofia_globals.auto_restart) {
+                               const char *old_ip4 = switch_event_get_header_nil(event, "network-address-previous-v4");
+                               const char *new_ip4 = switch_event_get_header_nil(event, "network-address-change-v4");
+                               const char *old_ip6 = switch_event_get_header_nil(event, "network-address-previous-v6");
+                               const char *new_ip6 = switch_event_get_header_nil(event, "network-address-change-v6");
+                               switch_hash_index_t *hi;
+                               const void *var;
+                               void *val;
+                               sofia_profile_t *profile;
+
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "IP change detected [%s]->[%s] [%s]->[%s]\n", old_ip4, new_ip4, old_ip6, new_ip6);
+
+                               switch_mutex_lock(mod_sofia_globals.hash_mutex);
+                               if (mod_sofia_globals.profile_hash) {
+                                       for (hi = switch_hash_first(NULL, mod_sofia_globals.profile_hash); hi; hi = switch_hash_next(hi)) {
+                                               int rb = 0;
+                                               switch_hash_this(hi, &var, NULL, &val);
+                                               if ((profile = (sofia_profile_t *) val) && profile->auto_restart) {
+                                                       if (!strcmp(profile->sipip, old_ip4)) {
+                                                               profile->sipip = switch_core_strdup(profile->pool, new_ip4);
+                                                               rb++;
+                                                       }
+                                                       if (!strcmp(profile->rtpip, old_ip4)) {
+                                                               profile->rtpip = switch_core_strdup(profile->pool, new_ip4);
+                                                               rb++;
+                                                       }
+                                                       if (!strcmp(profile->sipip, old_ip6)) {
+                                                               profile->sipip = switch_core_strdup(profile->pool, new_ip6);
+                                                               rb++;
+                                                       }
+                                                       if (!strcmp(profile->rtpip, old_ip6)) {
+                                                               profile->rtpip = switch_core_strdup(profile->pool, new_ip6);
+                                                               rb++;
+                                                       }
+
+                                                       if (rb) {
+                                                               sofia_set_pflag_locked(profile, PFLAG_RESPAWN);
+                                                               sofia_clear_pflag_locked(profile, PFLAG_RUNNING);
+                                                       }
+                                               }
+                                       }
+                               }
+
                                sofia_glue_restart_all_profiles();
                        }
                        
index e896e2640cbcb869991229b39e3e9dd761c70366..2a712cc2b7a2a09259175a0245862c05b862bd48 100644 (file)
@@ -384,6 +384,7 @@ struct sofia_profile {
        char *presence_hosts;
        char *challenge_realm;
        sofia_dtmf_t dtmf_type;
+       int auto_restart;
        int sip_port;
        int tls_sip_port;
        int tls_version;
index f4c94d00c948c0ea7162085647eaaeef5ac22695..e373335627272d653e20f73febf37d592897d1f0 100644 (file)
@@ -1279,6 +1279,8 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile)
                                                parse_rtp_bugs(profile, val);
                                        } else if (!strcasecmp(var, "user-agent-string")) { 
                                                profile->user_agent = switch_core_strdup(profile->pool, val);
+                                       } else if (!strcasecmp(var, "auto-restart")) {
+                                               profile->auto_restart = switch_true(val);
                                        } else if (!strcasecmp(var, "dtmf-type")) {
                                                if (!strcasecmp(val, "rfc2833")) {
                                                        profile->dtmf_type = DTMF_2833;
@@ -1688,7 +1690,8 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                profile->rport_level = 1;
                                profile->pflags |= PFLAG_STUN_ENABLED;
                                profile->pflags |= PFLAG_DISABLE_100REL;
-                               
+                               profile->auto_restart = 1;
+
                                for (param = switch_xml_child(settings, "param"); param; param = param->next) {
                                        char *var = (char *) switch_xml_attr_soft(param, "name");
                                        char *val = (char *) switch_xml_attr_soft(param, "value");
@@ -1711,6 +1714,8 @@ switch_status_t config_sofia(int reload, char *profile_name)
 #endif
                                        } else if (!strcasecmp(var, "user-agent-string")) {
                                                profile->user_agent = switch_core_strdup(profile->pool, val);
+                                       } else if (!strcasecmp(var, "auto-restart")) {
+                                               profile->auto_restart = switch_true(val);
                                        } else if (!strcasecmp(var, "dtmf-type")) {
                                                if (!strcasecmp(val, "rfc2833")) {
                                                        profile->dtmf_type = DTMF_2833;
index c182929553256c6239abe203b451e80d76f30144..e7348c72c3c712ffd4a1a9bfccef8b39bfa3871c 100644 (file)
@@ -85,6 +85,8 @@ static char main_ip6[256] = "";
 static void check_ip(void) {
        char guess_ip4[256] = "";
        char guess_ip6[256] = "";
+       char old_ip4[256] = "";
+       char old_ip6[256] = "";
        int ok4 = 1, ok6 = 1;
        
        switch_find_local_ip(guess_ip4, sizeof(guess_ip4), AF_INET);
@@ -94,6 +96,7 @@ static void check_ip(void) {
                switch_set_string(main_ip4, guess_ip4);
        } else {
                if (!(ok4 = !strcmp(main_ip4, guess_ip4))) {
+                       switch_set_string(old_ip4, main_ip4);
                        switch_set_string(main_ip4, guess_ip4);
                        switch_core_set_variable("local_ip_v4", guess_ip4);
                }
@@ -103,6 +106,7 @@ static void check_ip(void) {
                switch_set_string(main_ip6, guess_ip6);
        } else {
                if (!(ok6 = !strcmp(main_ip6, guess_ip6))) {
+                       switch_set_string(old_ip6, main_ip6);
                        switch_set_string(main_ip6, guess_ip6);
                        switch_core_set_variable("local_ip_v6", guess_ip6);
                }
@@ -114,9 +118,11 @@ static void check_ip(void) {
                if (switch_event_create(&event, SWITCH_EVENT_TRAP) == SWITCH_STATUS_SUCCESS) {
                        switch_event_add_header(event, SWITCH_STACK_BOTTOM, "condition", "network-address-change");
                        if (!ok4) {
+                               switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "network-address-previous-v4", old_ip4);
                                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "network-address-change-v4", main_ip4);
                        }
                        if (!ok6) {
+                               switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "network-address-previous-v6", old_ip6);
                                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "network-address-change-v6", main_ip6);
                        }
                        switch_event_fire(&event);