From f71a0e3f6055d097a7edc0ccef26785041bb0150 Mon Sep 17 00:00:00 2001 From: Ben Ford Date: Tue, 7 May 2019 11:08:33 -0500 Subject: [PATCH] pjsip_options.c: Allow immediate qualifies for new contacts. When multiple endpoints try to register close together using the same AOR with qualify_frequency set, one contact would qualify immediately while the other contacts would have to wait out the duration of the timer before being able to qualify. Changing the conditional to check the contact container count for a non-zero value allows all contacts to qualify immediately. Change-Id: I79478118ee7e0d6e76af7c354d66684220db9415 --- res/res_pjsip/pjsip_options.c | 47 ++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c index 81e8304541..c88b1b8fd7 100644 --- a/res/res_pjsip/pjsip_options.c +++ b/res/res_pjsip/pjsip_options.c @@ -2106,30 +2106,31 @@ static int sip_options_contact_add_task(void *obj) } if (task_data->aor_options->qualify_frequency) { - /* If this is the first contact we need to schedule up qualification */ - if (ao2_container_count(task_data->aor_options->contacts) == 1) { - ast_debug(3, "Starting scheduled callback on AOR '%s' for qualifying as there is now a contact on it\n", + /* There will always be a contact here, and we need to immediately schedule + * a qualify so that contacts are not waiting for the qualify_frequency + * timer duration before qualifying. + */ + ast_debug(3, "Starting scheduled callback on AOR '%s' for qualifying as there is now a contact on it\n", + task_data->aor_options->name); + /* + * We immediately schedule the initial qualify so that we get + * reachable/unreachable as soon as possible. Realistically + * since they pretty much just registered they should be + * reachable. + */ + if (task_data->aor_options->sched_task) { + ast_sip_sched_task_cancel(task_data->aor_options->sched_task); + ao2_ref(task_data->aor_options->sched_task, -1); + task_data->aor_options->sched_task = NULL; + } + task_data->aor_options->sched_task = ast_sip_schedule_task( + task_data->aor_options->serializer, 1, sip_options_qualify_aor, + ast_taskprocessor_name(task_data->aor_options->serializer), + task_data->aor_options, + AST_SIP_SCHED_TASK_VARIABLE | AST_SIP_SCHED_TASK_DATA_AO2); + if (!task_data->aor_options->sched_task) { + ast_log(LOG_ERROR, "Unable to schedule qualify for contacts of AOR '%s'\n", task_data->aor_options->name); - /* - * We immediately schedule the initial qualify so that we get - * reachable/unreachable as soon as possible. Realistically - * since they pretty much just registered they should be - * reachable. - */ - if (task_data->aor_options->sched_task) { - ast_sip_sched_task_cancel(task_data->aor_options->sched_task); - ao2_ref(task_data->aor_options->sched_task, -1); - task_data->aor_options->sched_task = NULL; - } - task_data->aor_options->sched_task = ast_sip_schedule_task( - task_data->aor_options->serializer, 1, sip_options_qualify_aor, - ast_taskprocessor_name(task_data->aor_options->serializer), - task_data->aor_options, - AST_SIP_SCHED_TASK_VARIABLE | AST_SIP_SCHED_TASK_DATA_AO2); - if (!task_data->aor_options->sched_task) { - ast_log(LOG_ERROR, "Unable to schedule qualify for contacts of AOR '%s'\n", - task_data->aor_options->name); - } } } else { /* -- 2.47.2