[Asterisk-code-review] Update qualifies when AOR configuration changes. (asterisk[certified/13.13])

Anonymous Coward asteriskteam at digium.com
Fri Feb 3 09:24:34 CST 2017


Anonymous Coward #1000019 has submitted this change and it was merged. ( https://gerrit.asterisk.org/4861 )

Change subject: Update qualifies when AOR configuration changes.
......................................................................


Update qualifies when AOR configuration changes.

Prior to this change, qualifies would only update in the following
cases:
* A reload of res_pjsip.so was issued.
* A dynamic contact was re-registered after its AOR's qualify_frequency
  had been changed
This does not work well if you are using realtime for your AORs. You can
update your database to have a new qualify_frequency, but the permanent
contacts on that AOR will not have their qualifies updated. And the
dynamic contacts on that AOR will not have their qualifies updated until
the next registration, which could be a long time.

This change seeks to fix this problem by making it so that whenever AOR
configuration is applied, the contacts pertaining to that AOR have their
qualifies updated.

Additions from this patch:
* AOR sorcery objects now have an apply handler that calls into a newly
  added function in the OPTIONS code. This causes all contacts
  associated with that AOR to re-schedule qualifies.
* When it is time to qualify a contact, the OPTIONS code checks to see
  if the AOR can still be retrieved. If not, then qualification is
  canceled on the contact.

Alterations from this patch:
* The registrar code no longer updates contact's qualify_frequence and
  qualify_timeout. There is no point to this since those values already
  get updated when the AOR changes.
* Reloading res_pjsip.so no longer calls the OPTIONS initialization
  function. Reloading res_pjsip.so results in re-loading AORs, which
  results in re-scheduling qualifies.

Change-Id: I2e7c3316da28f389c45954f24c4e9389abac1121
---
M res/res_pjsip.c
M res/res_pjsip/include/res_pjsip_private.h
M res/res_pjsip/location.c
M res/res_pjsip/pjsip_options.c
M res/res_pjsip_registrar.c
5 files changed, 58 insertions(+), 10 deletions(-)

Approvals:
  George Joseph: Looks good to me, but someone else must approve
  Anonymous Coward #1000019: Verified
  Joshua Colp: Looks good to me, approved



diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index 0f13687..72b0783 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -4325,7 +4325,6 @@
 static int reload_configuration_task(void *obj)
 {
 	ast_res_pjsip_reload_configuration();
-	ast_res_pjsip_init_options_handling(1);
 	ast_sip_initialize_dns();
 	return 0;
 }
diff --git a/res/res_pjsip/include/res_pjsip_private.h b/res/res_pjsip/include/res_pjsip_private.h
index 11ad12c..8ba2528 100644
--- a/res/res_pjsip/include/res_pjsip_private.h
+++ b/res/res_pjsip/include/res_pjsip_private.h
@@ -184,6 +184,18 @@
 int ast_res_pjsip_init_options_handling(int reload);
 
 /*!
+ * \internal
+ * \brief Indicate OPTIONS handling for this AOR needs updating.
+ *
+ * When AOR configuration is retrieved, it is possible that the
+ * qualify frequency has changed. The OPTIONs code needs to update
+ * its qualifies to reflect these changes.
+ *
+ * \param aor The AOR that has been retrieved
+ */
+void ast_res_pjsip_update_options(struct ast_sip_aor *aor);
+
+/*!
  * \internal Initialize message IP updating handling.
  *
  * \retval 0 on success
diff --git a/res/res_pjsip/location.c b/res/res_pjsip/location.c
index d8f0c58..9ab6e56 100644
--- a/res/res_pjsip/location.c
+++ b/res/res_pjsip/location.c
@@ -1144,6 +1144,12 @@
 	return status ? 0 : -1;
 }
 
+static int aor_apply_handler(const struct ast_sorcery *sorcery, void *object)
+{
+	ast_res_pjsip_update_options(object);
+	return 0;
+}
+
 /*! \brief Initialize sorcery with location support */
 int ast_sip_initialize_sorcery_location(void)
 {
@@ -1160,7 +1166,7 @@
 	ast_sorcery_apply_default(sorcery, "aor", "config", "pjsip.conf,criteria=type=aor");
 
 	if (ast_sorcery_object_register(sorcery, "contact", contact_alloc, NULL, contact_apply_handler) ||
-		ast_sorcery_object_register(sorcery, "aor", aor_alloc, NULL, NULL)) {
+		ast_sorcery_object_register(sorcery, "aor", aor_alloc, NULL, aor_apply_handler)) {
 		return -1;
 	}
 
diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c
index 698203f..1e474ef 100644
--- a/res/res_pjsip/pjsip_options.c
+++ b/res/res_pjsip/pjsip_options.c
@@ -528,6 +528,18 @@
 static int qualify_contact_sched(const void *obj)
 {
 	struct sched_data *data = (struct sched_data *) obj;
+	struct ast_sip_aor *aor;
+
+	/* This helps us to determine if an AOR has been removed
+	 * from configuration, and if so, stop qualifying the
+	 * contact
+	 */
+	aor = ast_sip_location_retrieve_aor(data->contact->aor);
+	if (!aor) {
+		ao2_ref(data, -1);
+		return 0;
+	}
+	ao2_ref(aor, -1);
 
 	ao2_ref(data->contact, +1);
 	if (ast_sip_push_task(NULL, qualify_contact_task, data->contact)) {
@@ -1173,12 +1185,10 @@
 	struct ast_sip_aor *aor = obj;
 	struct ao2_container *contacts;
 
-	if (aor->permanent_contacts) {
-		contacts = ast_sip_location_retrieve_aor_contacts(aor);
-		if (contacts) {
-			ao2_callback(contacts, OBJ_NODATA, qualify_and_schedule_cb_with_aor, aor);
-			ao2_ref(contacts, -1);
-		}
+	contacts = ast_sip_location_retrieve_aor_contacts(aor);
+	if (contacts) {
+		ao2_callback(contacts, OBJ_NODATA, qualify_and_schedule_cb_with_aor, aor);
+		ao2_ref(contacts, -1);
 	}
 
 	return 0;
@@ -1505,6 +1515,29 @@
 	return 0;
 }
 
+static int unschedule_for_aor_cb(void *obj, void *arg, int flags)
+{
+	struct sched_data *data = obj;
+	struct ast_sip_aor *aor = arg;
+
+	if (!strcmp(ast_sorcery_object_get_id(aor), data->contact->aor)) {
+		AST_SCHED_DEL_UNREF(sched, data->id, ao2_ref(data, -1));
+	}
+
+	return 0;
+}
+
+void ast_res_pjsip_update_options(struct ast_sip_aor *aor)
+{
+	/* This can happen if an AOR is created and applied before OPTIONs code has been initialized */
+	if (!sched_qualifies) {
+		return;
+	}
+
+	ao2_callback(sched_qualifies, OBJ_NODATA | OBJ_UNLINK, unschedule_for_aor_cb, aor);
+	qualify_and_schedule_all_cb(aor, NULL, 0);
+}
+
 void ast_res_pjsip_cleanup_options_handling(void)
 {
 	ast_cli_unregister_multiple(cli_options, ARRAY_LEN(cli_options));
diff --git a/res/res_pjsip_registrar.c b/res/res_pjsip_registrar.c
index d54bffa..dc3dfcf 100644
--- a/res/res_pjsip_registrar.c
+++ b/res/res_pjsip_registrar.c
@@ -456,8 +456,6 @@
 			}
 
 			contact_update->expiration_time = ast_tvadd(ast_tvnow(), ast_samp2tv(expiration, 1));
-			contact_update->qualify_frequency = aor->qualify_frequency;
-			contact_update->authenticate_qualify = aor->authenticate_qualify;
 			if (path_str) {
 				ast_string_field_set(contact_update, path, ast_str_buffer(path_str));
 			}

-- 
To view, visit https://gerrit.asterisk.org/4861
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I2e7c3316da28f389c45954f24c4e9389abac1121
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: certified/13.13
Gerrit-Owner: Mark Michelson <mmichelson at digium.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>



More information about the asterisk-code-review mailing list