#define SOFIA_PRESENCE_COLLISION_DELTA 50
#define SOFIA_PRESENCE_ROLLOVER_YEAR (86400 * 365 * SOFIA_PRESENCE_COLLISION_DELTA)
-static uint32_t check_presence_epoch(void)
+static switch_uint31_t check_presence_epoch(void)
{
time_t now = switch_epoch_time_now(NULL);
- uint32_t callsequence = (uint32_t)((now - mod_sofia_globals.presence_epoch) * SOFIA_PRESENCE_COLLISION_DELTA);
+ switch_uint31_t callsequence = { .value = (uint32_t)((now - mod_sofia_globals.presence_epoch) * SOFIA_PRESENCE_COLLISION_DELTA) };
- if (!mod_sofia_globals.presence_year || callsequence >= SOFIA_PRESENCE_ROLLOVER_YEAR) {
+ if (!mod_sofia_globals.presence_year || callsequence.value >= SOFIA_PRESENCE_ROLLOVER_YEAR) {
struct tm tm;
switch_mutex_lock(mod_sofia_globals.mutex);
tm = *(localtime(&now));
if (tm.tm_year != mod_sofia_globals.presence_year) {
mod_sofia_globals.presence_epoch = (uint32_t)now - (tm.tm_yday * 86400) - (tm.tm_hour * 60 * 60) - (tm.tm_min * 60) - tm.tm_sec;
mod_sofia_globals.presence_year = tm.tm_year;
- callsequence = (uint32_t)(((uint32_t)now - mod_sofia_globals.presence_epoch) * SOFIA_PRESENCE_COLLISION_DELTA);
+ callsequence.value = (uint32_t)(((uint32_t)now - mod_sofia_globals.presence_epoch) * SOFIA_PRESENCE_COLLISION_DELTA);
}
switch_mutex_unlock(mod_sofia_globals.mutex);
uint32_t sofia_presence_get_cseq(sofia_profile_t *profile)
{
- uint32_t callsequence;
+ switch_uint31_t callsequence;
int diff = 0;
switch_mutex_lock(profile->ireg_mutex);
callsequence = check_presence_epoch();
- if (profile->last_cseq) {
- diff = callsequence - profile->last_cseq;
+ if (profile->last_cseq.value) {
+ diff = (int)callsequence.value - (int)profile->last_cseq.value;
if (diff <= 0 && diff > -100000) {
- callsequence = ++profile->last_cseq;
+ callsequence.value = ++profile->last_cseq.value;
}
}
switch_mutex_unlock(profile->ireg_mutex);
- return callsequence;
-
+ return (uint32_t)callsequence.value;
}
}
FST_TEARDOWN_END()
+ FST_TEST_BEGIN(test_switch_uint31_t_overflow)
+ {
+ switch_uint31_t x;
+ uint32_t overflow;
+
+ x.value = 0x7fffffff;
+ x.value++;
+
+ fst_check_int_equals(x.value, 0);
+ x.value++;
+ fst_check_int_equals(x.value, 1);
+ x.value -= 2;
+ fst_check_int_equals(x.value, 0x7fffffff);
+
+ overflow = (uint32_t)0x7fffffff + 1;
+ x.value = overflow;
+ fst_check_int_equals(x.value, 0);
+ }
+ FST_TEST_END()
+
FST_TEST_BEGIN(test_switch_parse_cidr_v6)
{
ip_t ip, mask;