diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index f8877bd31f..1444645859 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -424,6 +424,7 @@ typedef enum { SUB_STATE_SUBED, SUB_STATE_UNSUBSCRIBE, SUB_STATE_FAILED, + SUB_STATE_FAIL_WAIT, SUB_STATE_EXPIRED, SUB_STATE_NOSUB, v_STATE_LAST diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index b00284df32..09b18f7c5d 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -4372,8 +4372,6 @@ void sofia_presence_handle_sip_r_subscribe(int status, default: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "status (%d) != 200, updated state to SUB_STATE_FAILED.\n", status); gw_sub_ptr->state = SUB_STATE_FAILED; - gw_sub_ptr->expires = switch_epoch_time_now(NULL); - gw_sub_ptr->retry = switch_epoch_time_now(NULL); if (!sofia_private) { nua_handle_destroy(nh); diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 5bb86ba3bc..f089e23829 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -253,6 +253,15 @@ void sofia_sub_check_gateway(sofia_profile_t *profile, time_t now) break; case SUB_STATE_FAILED: + gw_sub_ptr->expires = now; + gw_sub_ptr->retry = now + gw_sub_ptr->retry_seconds; + gw_sub_ptr->state = SUB_STATE_FAIL_WAIT; + break; + case SUB_STATE_FAIL_WAIT: + if (!gw_sub_ptr->retry || now >= gw_sub_ptr->retry) { + gw_sub_ptr->state = SUB_STATE_UNSUBED; + } + break; case SUB_STATE_TRYING: if (gw_sub_ptr->retry && now >= gw_sub_ptr->retry) { gw_sub_ptr->state = SUB_STATE_UNSUBED;