From 457ba355aa34f42867a4711fb40b220a029b071b Mon Sep 17 00:00:00 2001 From: Joshua Colp <jcolp@digium.com> Date: Mon, 6 Aug 2018 11:22:22 +0000 Subject: [PATCH] res_pjsip: Reduce processing when a Contact is updated. When a Contact is updated the only material change that qualify support cares about is the underlying configuration for the AOR. In this case we will update things with the new AOR information but otherwise the callback to indicate the Contact has changed can be ignored. This is because it is only when a Contact is added or deleted that material changes occur within the qualify support. An update can't change the URI since it would result in a new Contact so it can be ignored. Change-Id: I2f97ebfa79969a36a97bb7b9afd5b6268cf1a07d --- UPGRADE-16.txt | 2 ++ res/res_pjsip/pjsip_options.c | 64 ++++------------------------------- 2 files changed, 9 insertions(+), 57 deletions(-) diff --git a/UPGRADE-16.txt b/UPGRADE-16.txt index 8b4fdf70ad..41e22c67d2 100644 --- a/UPGRADE-16.txt +++ b/UPGRADE-16.txt @@ -39,6 +39,8 @@ AMI: - The ContactStatus and Status fields for the manager events ContactStatus and ContactStatusDetail are now set to "NonQualified" when a contact exists but has not been qualified. + - The ContactStatus event will no longer be sent by PJSIP when a device + refreshes its registration. ARI: - The ContactInfo event's contact_status field is now set to "NonQualified" diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c index 5eaf9e8fd4..3ef1e46916 100644 --- a/res/res_pjsip/pjsip_options.c +++ b/res/res_pjsip/pjsip_options.c @@ -2064,7 +2064,7 @@ struct sip_options_contact_observer_task_data { /*! * \brief Check if the contact qualify options are different than local aor qualify options */ -static int has_qualify_changed (struct ast_sip_contact *contact, struct sip_options_aor *aor_options) +static int has_qualify_changed (const struct ast_sip_contact *contact, const struct sip_options_aor *aor_options) { if (!contact) { return 0; @@ -2185,77 +2185,27 @@ static void contact_observer_created(const void *obj) sip_options_contact_add_management_task, (void *) obj); } -/*! - * \brief Task which updates a dynamic contact to an AOR - * \note Run by aor_options->serializer - */ -static int sip_options_contact_update_task(void *obj) -{ - struct sip_options_contact_observer_task_data *task_data = obj; - struct ast_sip_contact_status *contact_status; - - contact_status = ast_sip_get_contact_status(task_data->contact); - if (contact_status) { - switch (contact_status->status) { - case CREATED: - case UNAVAILABLE: - case AVAILABLE: - case UNKNOWN: - /* Refresh the ContactStatus AMI events. */ - sip_options_contact_status_update(contact_status); - break; - case REMOVED: - break; - } - ao2_ref(contact_status, -1); - } - - ao2_ref(task_data->contact, -1); - ao2_ref(task_data->aor_options, -1); - ast_free(task_data); - return 0; -} - /*! \brief Observer callback invoked on contact update */ static void contact_observer_updated(const void *obj) { - struct sip_options_contact_observer_task_data *task_data; - - task_data = ast_malloc(sizeof(*task_data)); - if (!task_data) { - return; - } + const struct ast_sip_contact *contact = obj; + struct sip_options_aor *aor_options = ao2_find(sip_options_aors, contact->aor, OBJ_SEARCH_KEY); - task_data->contact = (struct ast_sip_contact *) obj; - task_data->aor_options = ao2_find(sip_options_aors, task_data->contact->aor, - OBJ_SEARCH_KEY); - - if (has_qualify_changed(task_data->contact, task_data->aor_options)) { + if (has_qualify_changed(contact, aor_options)) { struct ast_sip_aor *aor; aor = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "aor", - task_data->contact->aor); + contact->aor); if (aor) { ast_debug(3, "AOR '%s' qualify options have been modified. Synchronize an AOR local state\n", - task_data->contact->aor); + contact->aor); ast_sip_push_task_wait_serializer(management_serializer, sip_options_aor_observer_modified_task, aor); ao2_ref(aor, -1); } } - if (!task_data->aor_options) { - ast_free(task_data); - return; - } - - ao2_ref(task_data->contact, +1); - if (ast_sip_push_task(task_data->aor_options->serializer, - sip_options_contact_update_task, task_data)) { - ao2_ref(task_data->contact, -1); - ao2_ref(task_data->aor_options, -1); - ast_free(task_data); - } + ao2_cleanup(aor_options); } /*! -- GitLab