diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2016-06-20 10:10:42 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2016-06-20 10:10:42 +0000 |
commit | b80242b94843137edd58e9075a892c7971b7bf55 (patch) | |
tree | 7162251a3b656d1af18c48b1ce02332a54de351c /pjnath/src/pjnath/stun_sock.c | |
parent | bddd40a4e4db55d1c6b046a4fe21b733e76f9fd5 (diff) |
Close #1927: IPv6 support in DNS SRV:
- support DNS A and AAAA resolution for each target in DNS SRV record
- support fallback to DNS A and DNS AAAA resolution when DNS SRV record is not available
- support IPv6 nameservers.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5349 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjnath/src/pjnath/stun_sock.c')
-rw-r--r-- | pjnath/src/pjnath/stun_sock.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/pjnath/src/pjnath/stun_sock.c b/pjnath/src/pjnath/stun_sock.c index 2525307b..8a4297b3 100644 --- a/pjnath/src/pjnath/stun_sock.c +++ b/pjnath/src/pjnath/stun_sock.c @@ -416,10 +416,11 @@ PJ_DEF(pj_status_t) pj_stun_sock_start( pj_stun_sock *stun_sock, pj_assert(stun_sock->q == NULL); - opt = PJ_DNS_SRV_FALLBACK_A; - if (stun_sock->af == pj_AF_INET6()) { - opt |= (PJ_DNS_SRV_RESOLVE_AAAA | PJ_DNS_SRV_FALLBACK_AAAA); - } + /* Init DNS resolution option */ + if (stun_sock->af == pj_AF_INET6()) + opt = (PJ_DNS_SRV_RESOLVE_AAAA_ONLY | PJ_DNS_SRV_FALLBACK_AAAA); + else + opt = PJ_DNS_SRV_FALLBACK_A; status = pj_dns_srv_resolve(domain, &res_name, default_port, stun_sock->pool, resolver, opt, @@ -574,14 +575,18 @@ static void dns_srv_resolver_cb(void *user_data, pj_assert(rec->count); pj_assert(rec->entry[0].server.addr_count); - - PJ_TODO(SUPPORT_IPV6_IN_RESOLVER); - pj_assert(stun_sock->af == pj_AF_INET()); + pj_assert(rec->entry[0].server.addr[0].af == stun_sock->af); /* Set the address */ - pj_sockaddr_in_init(&stun_sock->srv_addr.ipv4, NULL, - rec->entry[0].port); - stun_sock->srv_addr.ipv4.sin_addr = rec->entry[0].server.addr[0]; + pj_sockaddr_init(stun_sock->af, &stun_sock->srv_addr, NULL, + rec->entry[0].port); + if (stun_sock->af == pj_AF_INET6()) { + stun_sock->srv_addr.ipv6.sin6_addr = + rec->entry[0].server.addr[0].ip.v6; + } else { + stun_sock->srv_addr.ipv4.sin_addr = + rec->entry[0].server.addr[0].ip.v4; + } /* Start sending Binding request */ get_mapped_addr(stun_sock); |