Skip to content

Commit

Permalink
Merge "res_pjsip/pjsip_options: Fix From generation on outgoing OPTIO…
Browse files Browse the repository at this point in the history
…NS" into 13
  • Loading branch information
jcolp authored and Gerrit Code Review committed Mar 30, 2016
2 parents c7eb18d + 1583559 commit e1fdb0a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 55 deletions.
10 changes: 9 additions & 1 deletion res/res_pjsip.c
Expand Up @@ -2866,6 +2866,7 @@ static int create_out_of_dialog_request(const pjsip_method *method, struct ast_s
pj_pool_t *pool;
pjsip_tpselector selector = { .type = PJSIP_TPSELECTOR_NONE, };
pjsip_uri *sip_uri;
const char *fromuser;

if (ast_strlen_zero(uri)) {
if (!endpoint && (!contact || ast_strlen_zero(contact->uri))) {
Expand Down Expand Up @@ -2912,7 +2913,8 @@ static int create_out_of_dialog_request(const pjsip_method *method, struct ast_s
return -1;
}

if (sip_dialog_create_from(pool, &from, endpoint ? endpoint->fromuser : NULL,
fromuser = endpoint ? (!ast_strlen_zero(endpoint->fromuser) ? endpoint->fromuser : ast_sorcery_object_get_id(endpoint)) : NULL;
if (sip_dialog_create_from(pool, &from, fromuser,
endpoint ? endpoint->fromdomain : NULL, &remote_uri, &selector)) {
ast_log(LOG_ERROR, "Unable to create From header for %.*s request to endpoint %s\n",
(int) pj_strlen(&method->name), pj_strbuf(&method->name),
Expand Down Expand Up @@ -3207,6 +3209,7 @@ static pj_status_t endpt_send_request(struct ast_sip_endpoint *endpoint,
struct send_request_wrapper *req_wrapper;
pj_status_t ret_val;
pjsip_endpoint *endpt = ast_sip_get_pjsip_endpoint();
pjsip_tpselector selector = { .type = PJSIP_TPSELECTOR_NONE, };

/* Create wrapper to detect if the callback was actually called on an error. */
req_wrapper = ao2_alloc(sizeof(*req_wrapper), send_request_wrapper_destructor);
Expand Down Expand Up @@ -3257,6 +3260,11 @@ static pj_status_t endpt_send_request(struct ast_sip_endpoint *endpoint,
*/
ao2_ref(req_wrapper, +1);

if (endpoint) {
sip_get_tpselector_from_endpoint(endpoint, &selector);
pjsip_tx_data_set_transport(tdata, &selector);
}

ret_val = pjsip_endpt_send_request(endpt, tdata, -1, req_wrapper, endpt_send_request_cb);
if (ret_val != PJ_SUCCESS) {
char errmsg[PJ_ERR_MSG_SIZE];
Expand Down
81 changes: 27 additions & 54 deletions res/res_pjsip/pjsip_options.c
Expand Up @@ -248,31 +248,12 @@ static void init_start_time(const struct ast_sip_contact *contact)

/*!
* \internal
* \brief Match a container contact object with the contact sorcery id looking for.
*
* \param obj pointer to the (user-defined part) of an object.
* \param arg callback argument from ao2_callback()
* \param flags flags from ao2_callback()
*
* \return Values are a combination of enum _cb_results.
*/
static int match_contact_id(void *obj, void *arg, int flags)
{
struct ast_sip_contact *contact = obj;
const char *looking_for = arg;

return strcmp(ast_sorcery_object_get_id(contact), looking_for) ? 0 : CMP_MATCH;
}

/*!
* \internal
* \brief For an endpoint try to match the given contact sorcery id.
* \brief For an endpoint try to match the given contact->aor.
*/
static int on_endpoint(void *obj, void *arg, int flags)
{
struct ast_sip_endpoint *endpoint = obj;
struct ast_sip_contact *contact;
char *looking_for = arg;
char *contact_aor = arg;
char *aor_name;
char *aors;

Expand All @@ -282,24 +263,7 @@ static int on_endpoint(void *obj, void *arg, int flags)

aors = ast_strdupa(endpoint->aors);
while ((aor_name = ast_strip(strsep(&aors, ",")))) {
struct ast_sip_aor *aor;
struct ao2_container *contacts;

aor = ast_sip_location_retrieve_aor(aor_name);
if (!aor) {
continue;
}

contacts = ast_sip_location_retrieve_aor_contacts(aor);
ao2_ref(aor, -1);
if (!contacts) {
continue;
}

contact = ao2_callback(contacts, 0, match_contact_id, looking_for);
ao2_ref(contacts, -1);
if (contact) {
ao2_ref(contact, -1);
if (!strcmp(contact_aor, aor_name)) {
return CMP_MATCH;
}
}
Expand All @@ -313,12 +277,26 @@ static int on_endpoint(void *obj, void *arg, int flags)
*/
static struct ast_sip_endpoint *find_an_endpoint(struct ast_sip_contact *contact)
{
char *looking_for = (char *) ast_sorcery_object_get_id(contact);
struct ao2_container *endpoints = ast_sip_get_endpoints();
struct ao2_container *endpoints;
struct ast_sip_endpoint *endpoint;
struct ast_variable *var;
char *aor = ast_alloca(strlen(contact->aor) + 3);

sprintf(aor, "%%%s%%", contact->aor);
var = ast_variable_new("aors LIKE", aor, "");
endpoints = ast_sorcery_retrieve_by_fields(ast_sip_get_sorcery(),
"endpoint", AST_RETRIEVE_FLAG_MULTIPLE, var);

ast_variables_destroy(var);

endpoint = ao2_callback(endpoints, 0, on_endpoint, looking_for);
/*
* Because aors are a string list, we have to use a pattern match but since a simple
* pattern match could return an endpoint that has an aor of "aaabccc" when searching
* for "abc", we still have to iterate over them to find an exact aor match.
*/
endpoint = ao2_callback(endpoints, 0, on_endpoint, contact->aor);
ao2_ref(endpoints, -1);

return endpoint;
}

Expand Down Expand Up @@ -357,23 +335,18 @@ static int qualify_contact(struct ast_sip_endpoint *endpoint, struct ast_sip_con
pjsip_tx_data *tdata;
RAII_VAR(struct ast_sip_endpoint *, endpoint_local, NULL, ao2_cleanup);

if (contact->authenticate_qualify) {
if (endpoint) {
endpoint_local = ao2_bump(endpoint);
} else {
endpoint_local = find_an_endpoint(contact);
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;
}
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)) {
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;
Expand Down

0 comments on commit e1fdb0a

Please sign in to comment.