]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Revert "Update qualifies when AOR configuration changes." 03/4903/1
authorMark Michelson <mmichelson@digium.com>
Wed, 8 Feb 2017 17:50:11 +0000 (11:50 -0600)
committerMark Michelson <mmichelson@digium.com>
Wed, 8 Feb 2017 17:54:28 +0000 (11:54 -0600)
This reverts commit 6492e91392b8fd394193e411c6eb64b45486093f.

The change in question was intended to prevent the need to reload in
order to update qualifies on contacts when an AOR changes. However, this
ended up causing a deadlock instead.

Change-Id: I1a835c90a5bb65b6dc3a1e94cddc12a4afc3d71e

res/res_pjsip.c
res/res_pjsip/include/res_pjsip_private.h
res/res_pjsip/location.c
res/res_pjsip/pjsip_options.c
res/res_pjsip_registrar.c

index 852921a4db7a61106d6e046b2ee4d9fb224b7e2d..9ddcefbb3c9e29e85f1a54e2d7f7729be4e1b276 100644 (file)
@@ -4376,6 +4376,7 @@ AST_TEST_DEFINE(xml_sanitization_exceeds_buffer)
 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;
 }
index 6ddbd1f269d92585ec3c7f1b2629e61b26a73db5..0bdb63325af1f280bb1f57c2ffb736bf7e509f01 100644 (file)
@@ -183,18 +183,6 @@ void ast_sip_destroy_global_headers(void);
  */
 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.
  *
index cfe65b18e3703dbf833dbc7e2dd184f81d45ff02..5abfcabadfcdd38b97fa00bab71b5d8a0edb3b38 100644 (file)
@@ -1137,12 +1137,6 @@ static int contact_apply_handler(const struct ast_sorcery *sorcery, void *object
        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)
 {
@@ -1159,7 +1153,7 @@ int ast_sip_initialize_sorcery_location(void)
        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, aor_apply_handler)) {
+               ast_sorcery_object_register(sorcery, "aor", aor_alloc, NULL, NULL)) {
                return -1;
        }
 
index 51987f4de4523260d806c4ade2d72a377d8024bb..6fd3c25757a20bd54fa14240f72a4e869db80035 100644 (file)
@@ -518,18 +518,6 @@ static int qualify_contact_task(void *obj)
 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)) {
@@ -1176,10 +1164,12 @@ static int qualify_and_schedule_all_cb(void *obj, void *arg, int flags)
        struct ast_sip_aor *aor = obj;
        struct ao2_container *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);
+       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);
+               }
        }
 
        return 0;
@@ -1506,29 +1496,6 @@ int ast_res_pjsip_init_options_handling(int reload)
        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));
index d190487ac87756395d87053f20f302cdcc4dd9b2..2db753889007aaf6fbdda8b319ef80b2ca42e7e5 100644 (file)
@@ -456,6 +456,8 @@ static int register_aor_core(pjsip_rx_data *rdata,
                        }
 
                        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));
                        }