summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2016-10-31 01:27:34 +0000
committerLiong Sauw Ming <ming@teluu.com>2016-10-31 01:27:34 +0000
commit5a30bbc8b89a334ab5e92f7355bacd307f2fa87f (patch)
treebe33c23dfb08d0bd2d51dffd41ed694998511239
parentd9e2627c11f50e06103bbec466c22bee317a299c (diff)
Fixed #1976: Support to generate a synthesized IPv6 address from IPv4 address
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5476 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/src/pjsip/sip_resolve.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/pjsip/src/pjsip/sip_resolve.c b/pjsip/src/pjsip/sip_resolve.c
index 5053defc..cf13dada 100644
--- a/pjsip/src/pjsip/sip_resolve.c
+++ b/pjsip/src/pjsip/sip_resolve.c
@@ -276,10 +276,34 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver,
if (ip_addr_ver != 0) {
/* Target is an IP address, no need to resolve */
if (ip_addr_ver == 4) {
- pj_sockaddr_init(pj_AF_INET(), &svr_addr.entry[0].addr,
- NULL, 0);
- pj_inet_pton(pj_AF_INET(), &target->addr.host,
- &svr_addr.entry[0].addr.ipv4.sin_addr);
+ if (af == pj_AF_INET6()) {
+ /* Generate a synthesized IPv6 address, if possible. */
+ unsigned int count = 1;
+ pj_addrinfo ai[1];
+ pj_status_t status;
+
+ status = pj_getaddrinfo(pj_AF_INET6(),
+ &target->addr.host, &count, ai);
+ if (status == PJ_SUCCESS && count > 0 &&
+ ai[0].ai_addr.addr.sa_family == pj_AF_INET6())
+ {
+ pj_sockaddr_init(pj_AF_INET6(),
+ &svr_addr.entry[0].addr,
+ NULL, 0);
+ svr_addr.entry[0].addr.ipv6.sin6_addr =
+ ai[0].ai_addr.ipv6.sin6_addr;
+ } else {
+ pj_sockaddr_init(pj_AF_INET(),
+ &svr_addr.entry[0].addr, NULL, 0);
+ pj_inet_pton(pj_AF_INET(), &target->addr.host,
+ &svr_addr.entry[0].addr.ipv4.sin_addr);
+ }
+ } else {
+ pj_sockaddr_init(pj_AF_INET(), &svr_addr.entry[0].addr,
+ NULL, 0);
+ pj_inet_pton(pj_AF_INET(), &target->addr.host,
+ &svr_addr.entry[0].addr.ipv4.sin_addr);
+ }
} else {
pj_sockaddr_init(pj_AF_INET6(), &svr_addr.entry[0].addr,
NULL, 0);