]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
--resolve FS-5432
authorKen Rice <krice@freeswitch.org>
Wed, 3 Jul 2013 16:21:03 +0000 (11:21 -0500)
committerKen Rice <krice@freeswitch.org>
Wed, 3 Jul 2013 19:13:05 +0000 (14:13 -0500)
conf/vanilla/sip_profiles/internal.xml
src/mod/endpoints/mod_sofia/conf/sofia.conf.xml
src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia.c
src/mod/endpoints/mod_sofia/sofia_presence.c

index df838406d105bbbe87b8708ab1ba7eb6a7ddbbcb..423ec2a60a56d0ff3350148d27e6f160e52b3617 100644 (file)
 
     <!--force suscription expires to a lower value than requested-->
     <!--<param name="force-subscription-expires" value="60"/>-->
+
+    <!-- add a random deviation to the expires value of the 202 Accepted -->
+    <!--<param name="sip-subscription-max-deviation" value="120"/>-->
+
     <!-- disable register and transfer which may be undesirable in a public switch -->
     <!--<param name="disable-transfer" value="true"/>-->
     <!--<param name="disable-register" value="true"/>-->
index bf6bee7b28435c92e71e494436500d7c0739709a..5bd3a6dc1237f963a80b1de89c3cb483a9cbd6f6 100644 (file)
 
         <!-- force suscription expires to a lower value than requested -->
         <!-- <param name="force-subscription-expires" value="60"/> -->
+
+        <!-- add a random deviation to the expires value of the 202 Accepted -->
+        <!--<param name="sip-subscription-max-deviation" value="120"/>-->
+
         <!-- disable register and transfer which may be undesirable in a public
              switch -->
         <!-- <param name="disable-transfer" value="true"/> -->
index 90e8dad19e0175152d4fc4b37b65bd0553e67d16..365f5857877014fd58157258bc046719faae2329 100644 (file)
@@ -672,6 +672,7 @@ struct sofia_profile {
        su_strlst_t *tls_verify_in_subjects;
        uint32_t sip_force_expires;
        uint32_t sip_expires_max_deviation;
+       uint32_t sip_subscription_max_deviation;
        int ireg_seconds;
        sofia_paid_type_t paid_type;
        uint32_t rtp_digit_delay;
index 54b683441c04fb53272802ca508cc8ef0bbf6fc2..d226b928f4943853015b8f82c9ba08cb66e85343 100644 (file)
@@ -3685,6 +3685,7 @@ switch_status_t config_sofia(sofia_config_t reload, char *profile_name)
                                        profile->rtp_digit_delay = 40;
                                        profile->sip_force_expires = 0;
                                        profile->sip_expires_max_deviation = 0;
+                                       profile->sip_subscription_max_deviation = 0;
                                        profile->tls_version = 0;
                                        profile->tls_timeout = 300;
                                        profile->mflags = MFLAG_REFER | MFLAG_REGISTER;
@@ -4635,6 +4636,13 @@ switch_status_t config_sofia(sofia_config_t reload, char *profile_name)
                                                } else {
                                                        profile->sip_expires_max_deviation = 0;
                                                }
+                                       } else if (!strcasecmp(var, "sip-subscription-max-deviation")) {
+                                               int32_t sip_subscription_max_deviation = atoi(val);
+                                               if (sip_subscription_max_deviation >= 0) {
+                                                       profile->sip_subscription_max_deviation = sip_subscription_max_deviation;
+                                               } else {
+                                                       profile->sip_subscription_max_deviation = 0;
+                                               }
                                        } else if (!strcasecmp(var, "reuse-connections")) {
                                                switch_bool_t value = switch_true(val);
                                                if (!value) {
index 91ca35e87930e041153abc552a1d96e6ef584dad..47203d476dc2b9849f7c3b1ce94d6c179b7d43dd 100644 (file)
@@ -3516,6 +3516,7 @@ void sofia_presence_handle_sip_i_subscribe(int status,
 
        long exp_delta = 0;
        char exp_delta_str[30] = "";
+       uint32_t sub_max_deviation_var = 0;
        sip_to_t const *to;
        const char *from_user = NULL, *from_host = NULL;
        const char *to_user = NULL, *to_host = NULL;
@@ -3615,6 +3616,18 @@ void sofia_presence_handle_sip_i_subscribe(int status,
                }
        }
 
+       if ((sub_max_deviation_var = profile->sip_subscription_max_deviation)) {
+               if (sub_max_deviation_var > 0) {
+                       int sub_deviation;
+                       srand( (unsigned) ( (unsigned)(intptr_t)switch_thread_self() + switch_micro_time_now() ) );
+                       /* random negative number between 0 and negative sub_max_deviation_var: */
+                       sub_deviation = ( rand() % sub_max_deviation_var ) - sub_max_deviation_var;
+                       if ( (exp_delta + sub_deviation) > 45 ) {
+                               exp_delta += sub_deviation;
+                       }
+               }
+       }
+
        if (mod_sofia_globals.debug_presence > 0 || mod_sofia_globals.debug_sla > 0) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DELTA %ld\n", exp_delta);
        }