diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-12-31 11:26:21 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-12-31 11:26:21 +0000 |
commit | baa2f7d1c0e83897cc89fd8a02846af9f1eca4e6 (patch) | |
tree | 1e2618ba0671369ca7b701e4c97ad5f189d28b83 /pjlib/src/pj/os_symbian.h | |
parent | d378a0cda4735265cce253e38d636cb416ff8ad5 (diff) |
Fixed IPv6/IPv4 address issue in Symbian: Symbian, at least 9.1, seems to have dual stack IP, so IPv4 address can be returned as a mapped IPv6 address
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1647 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib/src/pj/os_symbian.h')
-rw-r--r-- | pjlib/src/pj/os_symbian.h | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/pjlib/src/pj/os_symbian.h b/pjlib/src/pj/os_symbian.h index 36ecb653..c0e2045a 100644 --- a/pjlib/src/pj/os_symbian.h +++ b/pjlib/src/pj/os_symbian.h @@ -239,18 +239,25 @@ public: // Convert TInetAddr to pj_sockaddr_in static inline pj_status_t Addr2pj(const TInetAddr & sym_addr, pj_sockaddr &pj_addr, - int *addr_len) + int *addr_len, + pj_bool_t convert_ipv4_mapped_addr = PJ_FALSE) { + TUint fam = sym_addr.Family(); pj_bzero(&pj_addr, *addr_len); - pj_addr.addr.sa_family = (pj_uint16_t)sym_addr.Family(); - if (pj_addr.addr.sa_family == PJ_AF_INET) { + if (fam == PJ_AF_INET || + (convert_ipv4_mapped_addr && + fam == PJ_AF_INET6 && + sym_addr.IsV4Mapped())) + { + pj_addr.addr.sa_family = PJ_AF_INET; PJ_ASSERT_RETURN(*addr_len>=(int)sizeof(pj_sockaddr_in), PJ_ETOOSMALL); pj_addr.ipv4.sin_addr.s_addr = pj_htonl(sym_addr.Address()); pj_addr.ipv4.sin_port = pj_htons((pj_uint16_t) sym_addr.Port()); *addr_len = sizeof(pj_sockaddr_in); - } else if (pj_addr.addr.sa_family == PJ_AF_INET6) { + } else if (fam == PJ_AF_INET6) { PJ_ASSERT_RETURN(*addr_len>=(int)sizeof(pj_sockaddr_in6), PJ_ETOOSMALL); const TIp6Addr & ip6 = sym_addr.Ip6Address(); + pj_addr.addr.sa_family = PJ_AF_INET6; pj_memcpy(&pj_addr.ipv6.sin6_addr, ip6.u.iAddr8, 16); pj_addr.ipv6.sin6_port = pj_htons((pj_uint16_t) sym_addr.Port()); pj_addr.ipv6.sin6_scope_id = pj_htonl(sym_addr.Scope()); |