summaryrefslogtreecommitdiff
path: root/pjnath
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2016-06-20 10:10:42 +0000
committerNanang Izzuddin <nanang@teluu.com>2016-06-20 10:10:42 +0000
commitb80242b94843137edd58e9075a892c7971b7bf55 (patch)
tree7162251a3b656d1af18c48b1ce02332a54de351c /pjnath
parentbddd40a4e4db55d1c6b046a4fe21b733e76f9fd5 (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.c25
-rw-r--r--pjnath/src/pjnath/turn_session.c24
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;