diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c index cd88dc38e9db7d885b3724bd856969ddfe397fa1..72499c5f69176566192c8301ace66e23d3a92cfd 100644 --- a/res/res_pjsip_outbound_registration.c +++ b/res/res_pjsip_outbound_registration.c @@ -1788,6 +1788,10 @@ static int handle_registration_response(void *data) } else { ast_debug(1, "Processing response %d from %s for %s(%s)\n", response->code, server_uri, client_state->registration_name, client_uri); + ast_debug(1, "No destination addresses available (tdata=%p, addr.count=%d)\n" + "Setting client's retry counter to max_retries(%d) immediately\n", + tdata, tdata ? tdata->dest_info.addr.count : 0, client_state->max_retries); + client_state->retries = client_state->max_retries; } @@ -1854,7 +1858,7 @@ static int handle_registration_response(void *data) client_state->registration_resend_timer_id = ast_sched_add(sched, 1, registration_resend, response); return 0; } - if(!response->retry_after && endpoint && endpoint->failover_reg_addr == 1){ + if((!response->retry_after && endpoint && endpoint->failover_reg_addr == 1) && (tdata && tdata->dest_info.addr.count)){ // 2nd registration on 504 with xml failed, back to the original registration schedule. endpoint->failover_reg_addr = 2; @@ -2087,7 +2091,7 @@ static int handle_registration_response(void *data) ao2_ref(response, -1); return 0; } - } else if (response->retry_after) { + } else if (response->retry_after && tdata && tdata->dest_info.addr.count) { /* If we have been instructed to retry after a period of time, schedule it as such */ schedule_retry(response, response->retry_after, server_uri, client_uri, client_num); } else if (client_state->failover_max_retries && @@ -2120,6 +2124,13 @@ static int handle_registration_response(void *data) } } else if (client_state->retry_interval && sip_outbound_registration_is_temporal(response->code, client_state)) { + if (!tdata || !tdata->dest_info.addr.count) { + client_state->retries = client_state->max_retries; + ast_log(LOG_ERROR, "No destination addresses available (tdata=%p, addr.count=%d)\n" + "Setting client's retry counter to max_retries(%d) immediately\n", + tdata, tdata ? tdata->dest_info.addr.count : 0, client_state->max_retries); + } + if (client_state->retries == client_state->max_retries) { /* If we received enough temporal responses to exceed our maximum give up permanently */ update_client_state_status(client_state, SIP_REGISTRATION_REJECTED_PERMANENT); @@ -2161,6 +2172,12 @@ static int handle_registration_response(void *data) schedule_retry(response, waiting_time, server_uri, client_uri, client_num); } } else { + if (!tdata || !tdata->dest_info.addr.count) { + client_state->retries = client_state->max_retries; + ast_log(LOG_ERROR, "No destination addresses available (tdata=%p, addr.count=%d)\n" + "Setting client's retry counter to max_retries(%d) immediately\n", + tdata, tdata ? tdata->dest_info.addr.count : 0, client_state->max_retries); + } if (response->code == 403 && client_state->forbidden_retry_interval && client_state->retries < client_state->max_retries) {