diff options
Diffstat (limited to 'res/res_pjsip/pjsip_options.c')
-rw-r--r-- | res/res_pjsip/pjsip_options.c | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c index 6fd3c2575..51987f4de 100644 --- a/res/res_pjsip/pjsip_options.c +++ b/res/res_pjsip/pjsip_options.c @@ -518,6 +518,18 @@ 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)) { @@ -1164,12 +1176,10 @@ static int qualify_and_schedule_all_cb(void *obj, void *arg, int flags) 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; @@ -1496,6 +1506,29 @@ 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)); |