Skip to content
Snippets Groups Projects
Commit 00de1821 authored by Alexandre Savard's avatar Alexandre Savard
Browse files

[#1841] Reapply pjsip patch concerning DNS SRV resolution

parent 485a75b6
Branches
Tags
No related merge requests found
...@@ -104,7 +104,19 @@ typedef enum pj_dns_srv_option ...@@ -104,7 +104,19 @@ typedef enum pj_dns_srv_option
* this option is not specified, the SRV resolver will query * this option is not specified, the SRV resolver will query
* the DNS A record for the target instead. * the DNS A record for the target instead.
*/ */
PJ_DNS_SRV_RESOLVE_AAAA = 4 PJ_DNS_SRV_RESOLVE_AAAA = 4,
/**
* Specify if the resolver should fallback to getaddrinfo
* under IPV4 mode if DNS A fails after DNS SRV.
*/
PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV4 = 8,
/**
* Specify if the resolver should fallback to getaddrinfo
* under IPV6 mode if DNS A fails after DNS SRV.
*/
PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV6 = 16,
} pj_dns_srv_option; } pj_dns_srv_option;
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
*/ */
#include <pjlib-util/srv_resolver.h> #include <pjlib-util/srv_resolver.h>
#include <pjlib-util/errno.h> #include <pjlib-util/errno.h>
#include <pj/addr_resolv.h>
#include <pj/array.h> #include <pj/array.h>
#include <pj/assert.h> #include <pj/assert.h>
#include <pj/log.h> #include <pj/log.h>
...@@ -583,6 +584,45 @@ static void dns_callback(void *user_data, ...@@ -583,6 +584,45 @@ static void dns_callback(void *user_data,
} else if (status != PJ_SUCCESS) { } else if (status != PJ_SUCCESS) {
char errmsg[PJ_ERR_MSG_SIZE]; char errmsg[PJ_ERR_MSG_SIZE];
if ((query_job->option &
(PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV4 | PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV6)))
{
pj_strerror(status, errmsg, sizeof(errmsg));
PJ_LOG(4,(query_job->objname,
"DNS A record resolution failed: %s,"
" trying getaddrinfo()",
errmsg));
pj_addrinfo ai;
unsigned count;
int af;
if ((query_job->option & PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV6)) {
af = pj_AF_INET6();
} else {
af = pj_AF_INET();
}
count = 1;
status = pj_getaddrinfo(af, &query_job->domain_part, &count, &ai);
if (status != PJ_SUCCESS) {
query_job->last_error = status;
pj_strerror(status, errmsg, sizeof(errmsg));
PJ_LOG(4,(query_job->objname, "DNS resolution failed with getaddrinfo(): %s",
errmsg));
} else {
if (srv->addr_cnt < ADDR_MAX_COUNT) {
srv->addr[srv->addr_cnt++].s_addr = ai.ai_addr.ipv4.sin_addr.s_addr;
}
PJ_LOG(5,(query_job->objname,
"DNS getaddrinfo() for %.*s: %s",
(int)srv->target_name.slen,
srv->target_name.ptr,
pj_inet_ntoa(srv->addr[srv->addr_cnt])));
}
} else {
/* Update last error */ /* Update last error */
query_job->last_error = status; query_job->last_error = status;
...@@ -591,6 +631,7 @@ static void dns_callback(void *user_data, ...@@ -591,6 +631,7 @@ static void dns_callback(void *user_data,
PJ_LOG(4,(query_job->objname, "DNS A record resolution failed: %s", PJ_LOG(4,(query_job->objname, "DNS A record resolution failed: %s",
errmsg)); errmsg));
} }
}
++query_job->host_resolved; ++query_job->host_resolved;
......
...@@ -361,10 +361,17 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver, ...@@ -361,10 +361,17 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver,
if (query->query_type == PJ_DNS_TYPE_SRV) { if (query->query_type == PJ_DNS_TYPE_SRV) {
unsigned option = PJ_TRUE;
if (type & PJSIP_TRANSPORT_IPV6) {
option |= PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV6;
} else {
option |= PJ_DNS_SRV_FALLBACK_GETADDRINFO_IPV4;
}
status = pj_dns_srv_resolve(&query->naptr[0].name, status = pj_dns_srv_resolve(&query->naptr[0].name,
&query->naptr[0].res_type, &query->naptr[0].res_type,
query->req.def_port, pool, resolver->res, query->req.def_port, pool, resolver->res,
PJ_TRUE, query, &srv_resolver_cb, NULL); option, query, &srv_resolver_cb, NULL);
} else if (query->query_type == PJ_DNS_TYPE_A) { } else if (query->query_type == PJ_DNS_TYPE_A) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment