From b803ba974f3ae7f6993089253b4f4ec49421ab15 Mon Sep 17 00:00:00 2001 From: junction1153b Date: Sun, 30 Nov 2025 09:32:27 -0500 Subject: [PATCH] Fix for #2688 New Years Polycom NOTIFY Cseq Rollover --- src/mod/endpoints/mod_sofia/sofia_presence.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 151d6ec634e..13dfeea8711 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -2137,18 +2137,22 @@ static switch_uint31_t check_presence_epoch(void) uint32_t sofia_presence_get_cseq(sofia_profile_t *profile) { switch_uint31_t callsequence; - int diff = 0; switch_mutex_lock(profile->ireg_mutex); callsequence = check_presence_epoch(); - if (profile->last_cseq.value) { - diff = (int)callsequence.value - (int)profile->last_cseq.value; - if (diff <= 0 && diff > -100000) { - callsequence.value = ++profile->last_cseq.value; - } - } + /* Enforce strictly monotonic CSeq for NOTIFY to avoid New Year rollbacks + that some phones (e.g., Polycom) reject with 500. */ + if (profile->last_cseq.value && callsequence.value <= profile->last_cseq.value) { + callsequence.value = profile->last_cseq.value + 1; + } + + /* Keep within 31 bits and non-zero, matching switch_uint31_t semantics. */ + callsequence.value &= 0x7fffffff; + if (callsequence.value == 0) { + callsequence.value = 1; + } profile->last_cseq = callsequence;