/*! * \internal * \brief Attempt to qualify the contact * * \details Sends a SIP OPTIONS request to the given contact in order to make * sure that contact is available. */ static int qualify_contact(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact) { pjsip_tx_data *tdata; RAII_VAR(struct ast_sip_endpoint *, endpoint_local, NULL, ao2_cleanup); if (endpoint) { endpoint_local = ao2_bump(endpoint); } else { if (!ast_strlen_zero(contact->endpoint_name)) { endpoint_local = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", contact->endpoint_name); } if (!endpoint_local) { endpoint_local = find_an_endpoint(contact); } if (!endpoint_local) { ast_log(LOG_WARNING, "Unable to find an endpoint to qualify contact %s. Deleting this contact\n", contact->uri); contact_deleted(contact); return -1; } } if (ast_sip_create_request("OPTIONS", NULL, endpoint_local, NULL, contact, &tdata)) { ast_log(LOG_ERROR, "Unable to create request to qualify contact %s\n", contact->uri); return -1; } /* If an outbound proxy is specified set it on this request */ if (!ast_strlen_zero(contact->outbound_proxy) && ast_sip_set_outbound_proxy(tdata, contact->outbound_proxy)) { pjsip_tx_data_dec_ref(tdata); ast_log(LOG_ERROR, "Unable to apply outbound proxy on request to qualify contact %s\n", contact->uri); return -1; } init_start_time(contact); ao2_ref(contact, +1); if (ast_sip_send_out_of_dialog_request(tdata, endpoint_local, (int)(contact->qualify_timeout * 1000), contact, qualify_contact_cb) != PJ_SUCCESS) { ast_log(LOG_ERROR, "Unable to send request to qualify contact %s\n", contact->uri); update_contact_status(contact, UNAVAILABLE, 0); ao2_ref(contact, -1); return -1; } return 0; }
/*! * \internal * \brief Attempt to qualify the contact * * \details Sends a SIP OPTIONS request to the given contact in order to make * sure that contact is available. */ static int qualify_contact(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact) { pjsip_tx_data *tdata; RAII_VAR(struct ast_sip_endpoint *, endpoint_local, NULL, ao2_cleanup); if (contact->authenticate_qualify) { endpoint_local = ao2_bump(endpoint); if (!endpoint_local) { /* * Find the "first" endpoint to completely qualify the contact - any * endpoint that is associated with the contact should do. */ endpoint_local = find_an_endpoint(contact); if (!endpoint_local) { ast_log(LOG_ERROR, "Unable to find an endpoint to qualify contact %s\n", contact->uri); return -1; } } } if (ast_sip_create_request("OPTIONS", NULL, NULL, NULL, contact, &tdata)) { ast_log(LOG_ERROR, "Unable to create request to qualify contact %s\n", contact->uri); return -1; } /* If an outbound proxy is specified set it on this request */ if (!ast_strlen_zero(contact->outbound_proxy) && ast_sip_set_outbound_proxy(tdata, contact->outbound_proxy)) { pjsip_tx_data_dec_ref(tdata); ast_log(LOG_ERROR, "Unable to apply outbound proxy on request to qualify contact %s\n", contact->uri); return -1; } init_start_time(contact); ao2_ref(contact, +1); if (ast_sip_send_out_of_dialog_request(tdata, endpoint_local, (int)(contact->qualify_timeout * 1000), contact, qualify_contact_cb) != PJ_SUCCESS) { ast_log(LOG_ERROR, "Unable to send request to qualify contact %s\n", contact->uri); update_contact_status(contact, UNAVAILABLE); ao2_ref(contact, -1); return -1; } return 0; }
/*! * \internal * \brief Adds a Route header to an outgoing request if * path information is available. * * \param endpoint The endpoint with which this request is associated * \param contact The contact to which this request is being sent * \param tdata The outbound request */ static void path_outgoing_request(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact, pjsip_tx_data *tdata) { RAII_VAR(struct ast_sip_aor *, aor, NULL, ao2_cleanup); if (!endpoint) { return; } aor = find_aor(endpoint, tdata->msg->line.req.uri); if (!aor || !aor->support_path) { return; } if (add_supported(tdata)) { return; } if (contact && !ast_strlen_zero(contact->path)) { ast_sip_set_outbound_proxy(tdata, contact->path); } }