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 | |
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')
-rw-r--r-- | pjnath/src/pjnath/stun_sock.c | 25 | ||||
-rw-r--r-- | pjnath/src/pjnath/turn_session.c | 24 |
2 files changed, 33 insertions, 16 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); diff --git a/pjnath/src/pjnath/turn_session.c b/pjnath/src/pjnath/turn_session.c index b53a967c..6e933d42 100644 --- a/pjnath/src/pjnath/turn_session.c +++ b/pjnath/src/pjnath/turn_session.c @@ -608,9 +608,16 @@ PJ_DEF(pj_status_t) pj_turn_session_set_server( pj_turn_session *sess, goto on_return; } + /* Init DNS resolution option for IPv6 */ + if (sess->af == pj_AF_INET6()) + opt |= PJ_DNS_SRV_RESOLVE_AAAA_ONLY; + /* Fallback to DNS A only if default port is specified */ if (default_port>0 && default_port<65536) { - opt = PJ_DNS_SRV_FALLBACK_A; + if (sess->af == pj_AF_INET6()) + opt |= PJ_DNS_SRV_FALLBACK_AAAA; + else + opt |= PJ_DNS_SRV_FALLBACK_A; sess->default_port = (pj_uint16_t)default_port; } @@ -1718,13 +1725,18 @@ static void dns_srv_resolver_cb(void *user_data, for (j=0; j<rec->entry[i].server.addr_count && cnt<PJ_TURN_MAX_DNS_SRV_CNT; ++j) { - pj_sockaddr_in *addr = &sess->srv_addr_list[cnt].ipv4; + if (rec->entry[i].server.addr[j].af == sess->af) { + pj_sockaddr *addr = &sess->srv_addr_list[cnt]; - addr->sin_family = sess->af; - addr->sin_port = pj_htons(rec->entry[i].port); - addr->sin_addr.s_addr = rec->entry[i].server.addr[j].s_addr; + addr->addr.sa_family = sess->af; + pj_sockaddr_set_port(addr, rec->entry[i].port); + if (sess->af == pj_AF_INET6()) + addr->ipv6.sin6_addr = rec->entry[i].server.addr[j].ip.v6; + else + addr->ipv4.sin_addr = rec->entry[i].server.addr[j].ip.v4; - ++cnt; + ++cnt; + } } } sess->srv_addr_cnt = (pj_uint16_t)cnt; |