Changeset 1647


Ignore:
Timestamp:
Dec 31, 2007 11:26:21 AM (12 years ago)
Author:
bennylp
Message:

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

Location:
pjproject/trunk/pjlib/src/pj
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/src/pj/addr_resolv_symbian.cpp

    r1608 r1647  
    2121#include <pj/errno.h> 
    2222#include <pj/ip_helper.h> 
     23#include <pj/log.h> 
    2324#include <pj/sock.h> 
    2425#include <pj/string.h> 
     
    2728#include "os_symbian.h" 
    2829  
     30#define THIS_FILE       "addr_resolv_symbian.cpp" 
     31#define TRACE_ME        0 
    2932 
    3033 
     
    8790    while (reqStatus == KErrNone && i < *count) { 
    8891         
    89         // Get the resolved TInetAddr 
    90         TInetAddr inetAddr(nameEntry().iAddr); 
    91         int addrlen; 
     92                // Get the resolved TInetAddr 
     93                TInetAddr inetAddr(nameEntry().iAddr); 
     94                int addrlen; 
    9295 
    93         // Ignore if this is not the same address family 
    94         if (inetAddr.Family() != (unsigned)af) { 
    95             resv.Next(nameEntry, reqStatus); 
    96             User::WaitForRequest(reqStatus); 
    97             continue; 
    98         } 
     96#if TRACE_ME 
     97                if (1) { 
     98                        pj_sockaddr a; 
     99                        char ipaddr[PJ_INET6_ADDRSTRLEN+2]; 
     100                        int namelen; 
     101                         
     102                        namelen = sizeof(pj_sockaddr); 
     103                        if (PjSymbianOS::Addr2pj(inetAddr, a, &namelen,  
     104                                                                         PJ_FALSE) == PJ_SUCCESS)  
     105                        { 
     106                                PJ_LOG(5,(THIS_FILE, "resolve %.*s: %s",  
     107                                                (int)name->slen, name->ptr, 
     108                                                pj_sockaddr_print(&a, ipaddr, sizeof(ipaddr), 2))); 
     109                        } 
     110                } 
     111#endif 
     112                 
     113                // Ignore if this is not the same address family 
     114                // Not a good idea, as Symbian mapps IPv4 to IPv6. 
     115                //fam = inetAddr.Family(); 
     116                //if (fam != af) { 
     117                //    resv.Next(nameEntry, reqStatus); 
     118                //    User::WaitForRequest(reqStatus); 
     119                //    continue; 
     120                //} 
     121                 
     122                // Convert IP address first to get IPv4 mapped address 
     123                addrlen = sizeof(ai[i].ai_addr); 
     124                status = PjSymbianOS::Addr2pj(inetAddr, ai[i].ai_addr,  
     125                                                                          &addrlen, PJ_TRUE); 
     126                if (status != PJ_SUCCESS) 
     127                    return status; 
     128                 
     129                // Ignore if address family doesn't match 
     130                if (ai[i].ai_addr.addr.sa_family != af) { 
     131                    resv.Next(nameEntry, reqStatus); 
     132                    User::WaitForRequest(reqStatus); 
     133                    continue; 
     134                } 
     135 
     136                // Convert the official address to ANSI. 
     137                pj_unicode_to_ansi((const wchar_t*)nameEntry().iName.Ptr(),  
     138                                   nameEntry().iName.Length(), 
     139                                   ai[i].ai_canonname, sizeof(ai[i].ai_canonname)); 
    99140         
    100         // Convert the official address to ANSI. 
    101         pj_unicode_to_ansi((const wchar_t*)nameEntry().iName.Ptr(),  
    102                            nameEntry().iName.Length(), 
    103                            ai[i].ai_canonname, sizeof(ai[i].ai_canonname)); 
    104  
    105         // Convert IP address 
    106         addrlen = sizeof(ai[i].ai_addr); 
    107         status = PjSymbianOS::Addr2pj(inetAddr, ai[i].ai_addr, &addrlen); 
    108         if (status != PJ_SUCCESS) 
    109             return status; 
    110          
    111         // Next 
    112         ++i; 
    113         resv.Next(nameEntry, reqStatus); 
    114         User::WaitForRequest(reqStatus); 
     141                // Next 
     142                ++i; 
     143                resv.Next(nameEntry, reqStatus); 
     144                User::WaitForRequest(reqStatus); 
    115145    } 
    116146 
  • pjproject/trunk/pjlib/src/pj/ip_helper_symbian.cpp

    r1608 r1647  
    2121#include <pj/assert.h> 
    2222#include <pj/errno.h> 
     23#include <pj/log.h> 
    2324#include <pj/string.h> 
    2425#include <pj/compat/socket.h> 
     
    2627 
    2728#include "os_symbian.h" 
     29 
     30#define THIS_FILE       "ip_helper_symbian.cpp" 
     31#define TRACE_ME        0 
    2832 
    2933static pj_status_t rsock_enum_interface(int af, 
     
    5963        TInetAddr &iAddress = info().iAddress; 
    6064        int namelen; 
     65 
     66#if TRACE_ME 
     67                if (1) { 
     68                        pj_sockaddr a; 
     69                        char ipaddr[PJ_INET6_ADDRSTRLEN+2]; 
     70                         
     71                        namelen = sizeof(pj_sockaddr); 
     72                        if (PjSymbianOS::Addr2pj(iAddress, a, &namelen,  
     73                                                                         PJ_FALSE) == PJ_SUCCESS)  
     74                        { 
     75                                PJ_LOG(5,(THIS_FILE, "Enum: found address %s",  
     76                                                pj_sockaddr_print(&a, ipaddr, sizeof(ipaddr), 2))); 
     77                        } 
     78                } 
     79#endif 
    6180         
    62         if (iAddress.Family() != (unsigned)af) { 
     81        namelen = sizeof(ifs[i]); 
     82        if (PjSymbianOS::Addr2pj(iAddress, ifs[i], &namelen,  
     83                                                         PJ_TRUE) != PJ_SUCCESS) 
     84        { 
    6385            continue; 
    6486        } 
    65          
    66         namelen = sizeof(ifs[i]); 
    67         if (PjSymbianOS::Addr2pj(iAddress, ifs[i], &namelen) != PJ_SUCCESS) 
    68             continue; 
     87 
     88        if (ifs[i].addr.sa_family != af) 
     89                    continue; 
    6990         
    7091        ++i; 
  • pjproject/trunk/pjlib/src/pj/os_symbian.h

    r1628 r1647  
    240240    static inline pj_status_t Addr2pj(const TInetAddr & sym_addr, 
    241241                                      pj_sockaddr &pj_addr, 
    242                                       int *addr_len) 
    243     { 
     242                                      int *addr_len, 
     243                                      pj_bool_t convert_ipv4_mapped_addr = PJ_FALSE) 
     244    { 
     245    TUint fam = sym_addr.Family(); 
    244246        pj_bzero(&pj_addr, *addr_len); 
    245         pj_addr.addr.sa_family = (pj_uint16_t)sym_addr.Family(); 
    246         if (pj_addr.addr.sa_family == PJ_AF_INET) { 
     247        if (fam == PJ_AF_INET ||  
     248                        (convert_ipv4_mapped_addr &&  
     249                         fam == PJ_AF_INET6 &&  
     250                         sym_addr.IsV4Mapped()))  
     251        { 
     252                pj_addr.addr.sa_family = PJ_AF_INET; 
    247253            PJ_ASSERT_RETURN(*addr_len>=(int)sizeof(pj_sockaddr_in), PJ_ETOOSMALL); 
    248254            pj_addr.ipv4.sin_addr.s_addr = pj_htonl(sym_addr.Address()); 
    249255            pj_addr.ipv4.sin_port = pj_htons((pj_uint16_t) sym_addr.Port()); 
    250256            *addr_len = sizeof(pj_sockaddr_in); 
    251         } else if (pj_addr.addr.sa_family == PJ_AF_INET6) { 
     257        } else if (fam == PJ_AF_INET6) { 
    252258            PJ_ASSERT_RETURN(*addr_len>=(int)sizeof(pj_sockaddr_in6), PJ_ETOOSMALL); 
    253259            const TIp6Addr & ip6 = sym_addr.Ip6Address(); 
     260            pj_addr.addr.sa_family = PJ_AF_INET6; 
    254261            pj_memcpy(&pj_addr.ipv6.sin6_addr, ip6.u.iAddr8, 16); 
    255262            pj_addr.ipv6.sin6_port = pj_htons((pj_uint16_t) sym_addr.Port()); 
  • pjproject/trunk/pjlib/src/pj/sock_common.c

    r1629 r1647  
    456456    status = pj_getaddrinfo(af, pj_gethostname(), &count, &ai); 
    457457    if (status == PJ_SUCCESS) { 
    458         pj_memcpy(pj_sockaddr_get_addr(addr), 
    459                   pj_sockaddr_get_addr(&ai.ai_addr), 
    460                   pj_sockaddr_get_addr_len(&ai.ai_addr)); 
     458        pj_assert(ai.ai_addr.addr.sa_family == (pj_uint16_t)af); 
     459        pj_sockaddr_copy_addr(addr, &ai.ai_addr); 
    461460    } 
    462461 
     
    466465     */ 
    467466    if (status != PJ_SUCCESS || !pj_sockaddr_has_addr(addr) || 
    468         (af==PJ_AF_INET && (pj_ntohl(addr->ipv4.sin_addr.s_addr) >> 24)==127)) 
     467                (af==PJ_AF_INET && (pj_ntohl(addr->ipv4.sin_addr.s_addr) >> 24)==127)) 
    469468    { 
    470         status = pj_getdefaultipinterface(af, addr); 
     469                status = pj_getdefaultipinterface(af, addr); 
    471470    } 
    472471 
    473472    /* If failed, get the first available interface */ 
    474473    if (status != PJ_SUCCESS) { 
    475         pj_sockaddr itf[1]; 
    476         unsigned count = PJ_ARRAY_SIZE(itf); 
    477  
    478         status = pj_enum_ip_interface(af, &count, itf); 
    479         if (status == PJ_SUCCESS) { 
    480             itf[0].addr.sa_family = (pj_uint16_t)af; 
    481             pj_memcpy(pj_sockaddr_get_addr(addr), 
    482                       pj_sockaddr_get_addr(&itf[0]), 
    483                       pj_sockaddr_get_addr_len(&itf[0])); 
    484         } 
     474                pj_sockaddr itf[1]; 
     475                unsigned count = PJ_ARRAY_SIZE(itf); 
     476         
     477                status = pj_enum_ip_interface(af, &count, itf); 
     478                if (status == PJ_SUCCESS) { 
     479                    pj_assert(itf[0].addr.sa_family == (pj_uint16_t)af); 
     480                    pj_sockaddr_copy_addr(addr, &itf[0]); 
     481                } 
    485482    } 
    486483 
    487484    /* If else fails, returns loopback interface as the last resort */ 
    488485    if (status != PJ_SUCCESS) { 
    489         if (af==PJ_AF_INET) { 
    490             addr->ipv4.sin_addr.s_addr = pj_htonl (0x7f000001); 
    491         } else { 
    492             pj_in6_addr *s6_addr; 
    493  
    494             s6_addr = (pj_in6_addr*) pj_sockaddr_get_addr(addr); 
    495             pj_bzero(s6_addr, sizeof(pj_in6_addr)); 
    496             s6_addr->s6_addr[15] = 1; 
    497         } 
    498         status = PJ_SUCCESS; 
     486                if (af==PJ_AF_INET) { 
     487                    addr->ipv4.sin_addr.s_addr = pj_htonl (0x7f000001); 
     488                } else { 
     489                    pj_in6_addr *s6_addr; 
     490         
     491                    s6_addr = (pj_in6_addr*) pj_sockaddr_get_addr(addr); 
     492                    pj_bzero(s6_addr, sizeof(pj_in6_addr)); 
     493                    s6_addr->s6_addr[15] = 1; 
     494                } 
     495                status = PJ_SUCCESS; 
    499496    } 
    500497 
     
    553550    } 
    554551 
    555     pj_memcpy(pj_sockaddr_get_addr(addr), 
    556               pj_sockaddr_get_addr(&a), 
    557               pj_sockaddr_get_addr_len(&a)); 
     552    pj_sockaddr_copy_addr(addr, &a); 
    558553 
    559554    /* Success */ 
  • pjproject/trunk/pjlib/src/pj/sock_symbian.cpp

    r1608 r1647  
    406406        pj_in_addr inaddr; 
    407407 
    408         if (size <= PJ_INET_ADDRSTRLEN) 
     408        if (size < PJ_INET_ADDRSTRLEN) 
    409409            return PJ_ETOOSMALL; 
    410410 
     
    422422        TBuf<PJ_INET6_ADDRSTRLEN> str16; 
    423423 
    424         if (size <= PJ_INET6_ADDRSTRLEN) 
     424        if (size < PJ_INET6_ADDRSTRLEN) 
    425425            return PJ_ETOOSMALL; 
    426426 
Note: See TracChangeset for help on using the changeset viewer.