]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-6413 stable-version
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 31 Mar 2014 20:24:16 +0000 (01:24 +0500)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 31 Mar 2014 20:24:16 +0000 (01:24 +0500)
src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia_presence.c

index 8b3f07561240f59ca91c96e12af45e9da876b521..8f6b5fafc398b1271b7427b8cf7a1a837f6d9deb 100644 (file)
@@ -5963,6 +5963,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
        switch_management_interface_t *management_interface;
        switch_application_interface_t *app_interface;
        struct in_addr in;
+       struct tm tm = {0};
+       time_t now;
 
        memset(&mod_sofia_globals, 0, sizeof(mod_sofia_globals));
        mod_sofia_globals.destroy_private.destroy_nh = 1;
@@ -5971,6 +5973,11 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
        mod_sofia_globals.pool = pool;
        switch_mutex_init(&mod_sofia_globals.mutex, SWITCH_MUTEX_NESTED, mod_sofia_globals.pool);
 
+       now = switch_epoch_time_now(NULL);
+       tm = *(localtime(&now));
+
+       mod_sofia_globals.presence_epoch = now - (tm.tm_yday * 86400);
+
        switch_find_local_ip(mod_sofia_globals.guess_ip, sizeof(mod_sofia_globals.guess_ip), &mod_sofia_globals.guess_mask, AF_INET);
        in.s_addr = mod_sofia_globals.guess_mask;
        switch_set_string(mod_sofia_globals.guess_mask_str, inet_ntoa(in));
index c174f60420b848b7343bd812c9483ce6be5b19fb..a48dc1921d0cdef228c7ef064eea6dd4ceb7e226 100644 (file)
@@ -400,6 +400,7 @@ struct mod_sofia_globals {
        int presence_flush;
        switch_thread_t *presence_thread;
        uint32_t max_reg_threads;
+       time_t presence_epoch;
 };
 extern struct mod_sofia_globals mod_sofia_globals;
 
@@ -705,7 +706,7 @@ struct sofia_profile {
        int watchdog_enabled;
        switch_mutex_t *gw_mutex;
        uint32_t queued_events;
-       uint32_t cseq_base;
+       uint32_t last_cseq;
        int tls_only;
        int tls_verify_date;
        enum tport_tls_verify_policy tls_verify_policy;
index 2d94d1b7e3fa4e671d23af07ea7a04cb7b89fcfd..09cf9e2d8c9295cf16d7f7fdc42b9c90e68e4a6a 100644 (file)
@@ -2097,6 +2097,28 @@ static int sofia_dialog_probe_callback(void *pArg, int argc, char **argv, char *
        return 0;
 }
 
+static uint32_t sofia_presence_get_cseq(sofia_profile_t *profile)
+{
+       uint32_t callsequence;
+       uint32_t now = (uint32_t) switch_epoch_time_now(NULL);
+
+       switch_mutex_lock(profile->ireg_mutex);
+
+       callsequence = (now - mod_sofia_globals.presence_epoch) * 100;
+
+       if (profile->last_cseq && callsequence <= profile->last_cseq) {
+               callsequence = ++profile->last_cseq;
+       }
+
+       profile->last_cseq = callsequence;
+
+       switch_mutex_unlock(profile->ireg_mutex);
+
+       return callsequence;
+
+}
+
+
 #define send_presence_notify(_a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_k,_l) \
 _send_presence_notify(_a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_k,_l,__FILE__, __SWITCH_FUNC__, __LINE__)
 
@@ -2268,13 +2290,7 @@ static void _send_presence_notify(sofia_profile_t *profile,
                                                  );
        }
 
-       
-       switch_mutex_lock(profile->ireg_mutex);
-       if (!profile->cseq_base) {
-               profile->cseq_base = (now - 1312693200) * 10;
-       }
-       callsequence = ++profile->cseq_base;
-       switch_mutex_unlock(profile->ireg_mutex);
+       callsequence = sofia_presence_get_cseq(profile);
        
        if (cparams) {
                send_contact = switch_mprintf("%s;%s", contact_str, cparams);