]> 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:14:20 +0000 (14:14 -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 7beecbfeab421ff1da5af36180d62492a2f1db64..375eecbbc317751b4e92439146a304d6b4addfb6 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 fb1c345f0700e1b47d30e2460ae554223cf5735e..263ca80f0b896cdcd2314f1cf0665b33bed36d04 100644 (file)
@@ -702,6 +702,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 8095a83c312edbd1120b2c8bc3fe2c84f6e9ff5f..813e2a0f360656a8450b10cb6a3551452433e5a4 100644 (file)
@@ -3630,6 +3630,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;
@@ -4573,6 +4574,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 30e8bc3390cdbe14582816a4b00bc08015805593..be21bf8b1c2a7ddae42d6962998b08e758aa6b54 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);
        }