diff options
author | Joshua Colp <jcolp@digium.com> | 2015-04-29 13:09:20 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2015-04-29 13:09:20 -0500 |
commit | 648b22f19d5223a87ae03a16286b2d94bd29b3fb (patch) | |
tree | 36c78fb234f05b30381740a5c38ecb62ae26a0b7 /res | |
parent | 03261b9614996a55874233e021e6e83482be11b1 (diff) | |
parent | 4f1db2070da56f0357c10fad729dd5e90644a042 (diff) |
Merge "res_pjsip_outbound_registration: Don't fail on delayed processing."
Diffstat (limited to 'res')
-rw-r--r-- | res/res_pjsip.c | 6 | ||||
-rw-r--r-- | res/res_pjsip/pjsip_outbound_auth.c | 2 | ||||
-rw-r--r-- | res/res_pjsip_outbound_authenticator_digest.c | 6 | ||||
-rw-r--r-- | res/res_pjsip_outbound_publish.c | 4 | ||||
-rw-r--r-- | res/res_pjsip_outbound_registration.c | 23 |
5 files changed, 25 insertions, 16 deletions
diff --git a/res/res_pjsip.c b/res/res_pjsip.c index a613bccf6..8be019f87 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -2009,13 +2009,13 @@ void ast_sip_unregister_outbound_authenticator(struct ast_sip_outbound_authentic } int ast_sip_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge, - pjsip_transaction *tsx, pjsip_tx_data **new_request) + pjsip_tx_data *old_request, pjsip_tx_data **new_request) { if (!registered_outbound_authenticator) { ast_log(LOG_WARNING, "No SIP outbound authenticator registered. Cannot respond to authentication challenge\n"); return -1; } - return registered_outbound_authenticator->create_request_with_auth(auths, challenge, tsx, new_request); + return registered_outbound_authenticator->create_request_with_auth(auths, challenge, old_request, new_request); } struct endpoint_identifier_list { @@ -3107,7 +3107,7 @@ static void send_request_cb(void *token, pjsip_event *e) && endpoint && ++req_data->challenge_count < MAX_RX_CHALLENGES /* Not in a challenge loop */ && !ast_sip_create_request_with_auth(&endpoint->outbound_auths, - challenge, tsx, &tdata) + challenge, tsx->last_tx, &tdata) && endpt_send_request(endpoint, tdata, -1, req_data, send_request_cb) == PJ_SUCCESS; ao2_cleanup(endpoint); diff --git a/res/res_pjsip/pjsip_outbound_auth.c b/res/res_pjsip/pjsip_outbound_auth.c index 1f754227a..8b39b000d 100644 --- a/res/res_pjsip/pjsip_outbound_auth.c +++ b/res/res_pjsip/pjsip_outbound_auth.c @@ -63,7 +63,7 @@ static pj_bool_t outbound_auth(pjsip_rx_data *rdata) return PJ_FALSE; } - if (ast_sip_create_request_with_auth(&endpoint->outbound_auths, rdata, tsx, &tdata)) { + if (ast_sip_create_request_with_auth(&endpoint->outbound_auths, rdata, tsx->last_tx, &tdata)) { return PJ_FALSE; } diff --git a/res/res_pjsip_outbound_authenticator_digest.c b/res/res_pjsip_outbound_authenticator_digest.c index 35e59f21a..de77616fd 100644 --- a/res/res_pjsip_outbound_authenticator_digest.c +++ b/res/res_pjsip_outbound_authenticator_digest.c @@ -102,13 +102,13 @@ cleanup: } static int digest_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge, - pjsip_transaction *tsx, pjsip_tx_data **new_request) + pjsip_tx_data *old_request, pjsip_tx_data **new_request) { pjsip_auth_clt_sess auth_sess; pjsip_cseq_hdr *cseq; if (pjsip_auth_clt_init(&auth_sess, ast_sip_get_pjsip_endpoint(), - tsx->pool, 0) != PJ_SUCCESS) { + old_request->pool, 0) != PJ_SUCCESS) { ast_log(LOG_WARNING, "Failed to initialize client authentication session\n"); return -1; } @@ -119,7 +119,7 @@ static int digest_create_request_with_auth(const struct ast_sip_auth_vector *aut } switch (pjsip_auth_clt_reinit_req(&auth_sess, challenge, - tsx->last_tx, new_request)) { + old_request, new_request)) { case PJ_SUCCESS: /* PJSIP creates a new transaction for new_request (meaning it creates a new * branch). However, it recycles the Call-ID, from-tag, and CSeq from the diff --git a/res/res_pjsip_outbound_publish.c b/res/res_pjsip_outbound_publish.c index 8b6f6e41e..f7669932e 100644 --- a/res/res_pjsip_outbound_publish.c +++ b/res/res_pjsip_outbound_publish.c @@ -867,8 +867,10 @@ static void sip_outbound_publish_callback(struct pjsip_publishc_cbparam *param) } if (param->code == 401 || param->code == 407) { + pjsip_transaction *tsx = pjsip_rdata_get_tsx(param->rdata); + if (!ast_sip_create_request_with_auth(&publish->outbound_auths, - param->rdata, pjsip_rdata_get_tsx(param->rdata), &tdata)) { + param->rdata, tsx->last_tx, &tdata)) { pjsip_publishc_send(client->client, tdata); } client->auth_attempts++; diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c index 69e012448..c2eb62b32 100644 --- a/res/res_pjsip_outbound_registration.c +++ b/res/res_pjsip_outbound_registration.c @@ -568,8 +568,8 @@ struct registration_response { struct sip_outbound_registration_client_state *client_state; /*! \brief The response message */ pjsip_rx_data *rdata; - /*! \brief The response transaction */ - pjsip_transaction *tsx; + /*! \brief Request for which the response was received */ + pjsip_tx_data *old_request; }; /*! \brief Registration response structure destructor */ @@ -581,6 +581,10 @@ static void registration_response_destroy(void *obj) pjsip_rx_data_free_cloned(response->rdata); } + if (response->old_request) { + pjsip_tx_data_dec_ref(response->old_request); + } + ao2_cleanup(response->client_state); } @@ -633,19 +637,19 @@ static int handle_registration_response(void *data) ast_copy_pj_str(client_uri, &info.client_uri, sizeof(client_uri)); if (response->client_state->status == SIP_REGISTRATION_STOPPED) { - ast_debug(1, "Not handling registration response from '%s' (transaction %s). Registration already stopped\n", - server_uri, response->tsx ? response->tsx->obj_name : "<none>"); + ast_debug(1, "Not handling registration response from server '%s' for client '%s'. Registration already stopped\n", + server_uri, client_uri); return 0; } - ast_debug(1, "Processing REGISTER response %d from '%s' (transaction %s)\n", - response->code, server_uri, response->tsx ? response->tsx->obj_name : "<none>"); + ast_debug(1, "Processing REGISTER response %d from server '%s' for client '%s'\n", + response->code, server_uri, client_uri); if (!response->client_state->auth_attempted && (response->code == 401 || response->code == 407)) { pjsip_tx_data *tdata; if (!ast_sip_create_request_with_auth(&response->client_state->outbound_auths, - response->rdata, response->tsx, &tdata)) { + response->rdata, response->old_request, &tdata)) { ao2_ref(response->client_state, +1); response->client_state->auth_attempted = 1; ast_debug(1, "Sending authenticated REGISTER to server '%s' from client '%s'\n", @@ -748,9 +752,12 @@ static void sip_outbound_registration_response_cb(struct pjsip_regc_cbparam *par if (param->rdata) { struct pjsip_retry_after_hdr *retry_after = pjsip_msg_find_hdr(param->rdata->msg_info.msg, PJSIP_H_RETRY_AFTER, NULL); + pjsip_transaction *tsx; response->retry_after = retry_after ? retry_after->ivalue : 0; - response->tsx = pjsip_rdata_get_tsx(param->rdata); + tsx = pjsip_rdata_get_tsx(param->rdata); + response->old_request = tsx->last_tx; + pjsip_tx_data_add_ref(response->old_request); pjsip_rx_data_clone(param->rdata, 0, &response->rdata); } |