diff --git a/sflphone-common/libs/pjproject-1.0.3/pjlib-util/include/pjlib-util/srv_resolver.h b/sflphone-common/libs/pjproject-1.0.3/pjlib-util/include/pjlib-util/srv_resolver.h index 216e91b9e5d525d9807b1d26cd4896b639fba186..da41024acdec6fb7533c3392fdca9ded0524f3ef 100644 --- a/sflphone-common/libs/pjproject-1.0.3/pjlib-util/include/pjlib-util/srv_resolver.h +++ b/sflphone-common/libs/pjproject-1.0.3/pjlib-util/include/pjlib-util/srv_resolver.h @@ -104,7 +104,19 @@ typedef enum pj_dns_srv_option * this option is not specified, the SRV resolver will query * 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; diff --git a/sflphone-common/libs/pjproject-1.0.3/pjlib-util/src/pjlib-util/srv_resolver.c b/sflphone-common/libs/pjproject-1.0.3/pjlib-util/src/pjlib-util/srv_resolver.c index 83963495574d53a1b9cfdaa596d02629eda89e1d..c4b433561c1796e757253887cb04a21be1882a31 100644 --- a/sflphone-common/libs/pjproject-1.0.3/pjlib-util/src/pjlib-util/srv_resolver.c +++ b/sflphone-common/libs/pjproject-1.0.3/pjlib-util/src/pjlib-util/srv_resolver.c @@ -19,6 +19,7 @@ */ #include <pjlib-util/srv_resolver.h> #include <pjlib-util/errno.h> +#include <pj/addr_resolv.h> #include <pj/array.h> #include <pj/assert.h> #include <pj/log.h> @@ -71,7 +72,7 @@ struct pj_dns_srv_async_query pj_str_t full_name; pj_str_t domain_part; pj_uint16_t def_port; - + /* SRV records and their resolved IP addresses: */ unsigned srv_cnt; struct srv_target srv[PJ_DNS_SRV_MAX_ADDR]; @@ -134,7 +135,7 @@ PJ_DEF(pj_status_t) pj_dns_srv_resolve( const pj_str_t *domain_name, query_job->domain_part.ptr = target_name.ptr + len; query_job->domain_part.slen = target_name.slen - len; query_job->def_port = (pj_uint16_t)def_port; - + /* Start the asynchronous query_job */ query_job->dns_state = PJ_DNS_TYPE_SRV; @@ -582,14 +583,54 @@ static void dns_callback(void *user_data, } else if (status != PJ_SUCCESS) { char errmsg[PJ_ERR_MSG_SIZE]; - - /* Update last error */ - query_job->last_error = status; - - /* Log error */ - pj_strerror(status, errmsg, sizeof(errmsg)); - PJ_LOG(4,(query_job->objname, "DNS A record resolution failed: %s", - errmsg)); + + 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 */ + query_job->last_error = status; + + /* Log error */ + pj_strerror(status, errmsg, sizeof(errmsg)); + PJ_LOG(4,(query_job->objname, "DNS A record resolution failed: %s", + errmsg)); + } } ++query_job->host_resolved; diff --git a/sflphone-common/libs/pjproject-1.0.3/pjsip/src/pjsip/sip_resolve.c b/sflphone-common/libs/pjproject-1.0.3/pjsip/src/pjsip/sip_resolve.c index 3c9e610af87da4540fc32d37ecb45a594919ac4f..1f07fe40398701211f86c9dd1417de38edec794c 100644 --- a/sflphone-common/libs/pjproject-1.0.3/pjsip/src/pjsip/sip_resolve.c +++ b/sflphone-common/libs/pjproject-1.0.3/pjsip/src/pjsip/sip_resolve.c @@ -360,11 +360,17 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver, target->addr.port)); if (query->query_type == PJ_DNS_TYPE_SRV) { - - status = pj_dns_srv_resolve(&query->naptr[0].name, - &query->naptr[0].res_type, - query->req.def_port, pool, resolver->res, - PJ_TRUE, query, &srv_resolver_cb, NULL); + 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, + &query->naptr[0].res_type, + query->req.def_port, pool, resolver->res, + option, query, &srv_resolver_cb, NULL); } else if (query->query_type == PJ_DNS_TYPE_A) {