Ignore:
Timestamp:
Aug 7, 2012 2:18:15 AM (12 years ago)
Author:
bennylp
Message:

Fixed #1412: Account specific NAT settings: STUN, ICE, and TURN

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/src/pj/sock_common.c

    r3841 r4218  
    957957} 
    958958 
    959 /* Get the default IP interface */ 
    960 PJ_DEF(pj_status_t) pj_getdefaultipinterface(int af, pj_sockaddr *addr) 
    961 { 
     959/* Get IP interface for sending to the specified destination */ 
     960PJ_DEF(pj_status_t) pj_getipinterface(int af, 
     961                                      const pj_str_t *dst, 
     962                                      pj_sockaddr *itf_addr, 
     963                                      pj_bool_t allow_resolve, 
     964                                      pj_sockaddr *p_dst_addr) 
     965{ 
     966    pj_sockaddr dst_addr; 
    962967    pj_sock_t fd; 
    963     pj_str_t cp; 
    964     pj_sockaddr a; 
    965968    int len; 
    966969    pj_uint8_t zero[64]; 
    967970    pj_status_t status; 
    968971 
    969     addr->addr.sa_family = (pj_uint16_t)af; 
    970  
     972    pj_sockaddr_init(af, &dst_addr, NULL, 53); 
     973    status = pj_inet_pton(af, dst, pj_sockaddr_get_addr(&dst_addr)); 
     974    if (status != PJ_SUCCESS) { 
     975        /* "dst" is not an IP address. */ 
     976        if (allow_resolve) { 
     977            status = pj_sockaddr_init(af, &dst_addr, dst, 53); 
     978        } else { 
     979            pj_str_t cp; 
     980 
     981            if (af == PJ_AF_INET) { 
     982                cp = pj_str("1.1.1.1"); 
     983            } else { 
     984                cp = pj_str("1::1"); 
     985            } 
     986            status = pj_sockaddr_init(af, &dst_addr, &cp, 53); 
     987        } 
     988 
     989        if (status != PJ_SUCCESS) 
     990            return status; 
     991    } 
     992 
     993    /* Create UDP socket and connect() to the destination IP */ 
    971994    status = pj_sock_socket(af, pj_SOCK_DGRAM(), 0, &fd); 
    972995    if (status != PJ_SUCCESS) { 
    973996        return status; 
    974997    } 
     998 
     999    status = pj_sock_connect(fd, &dst_addr, pj_sockaddr_get_len(&dst_addr)); 
     1000    if (status != PJ_SUCCESS) { 
     1001        pj_sock_close(fd); 
     1002        return status; 
     1003    } 
     1004 
     1005    len = sizeof(*itf_addr); 
     1006    status = pj_sock_getsockname(fd, itf_addr, &len); 
     1007    if (status != PJ_SUCCESS) { 
     1008        pj_sock_close(fd); 
     1009        return status; 
     1010    } 
     1011 
     1012    pj_sock_close(fd); 
     1013 
     1014    /* Check that the address returned is not zero */ 
     1015    pj_bzero(zero, sizeof(zero)); 
     1016    if (pj_memcmp(pj_sockaddr_get_addr(itf_addr), zero, 
     1017                  pj_sockaddr_get_addr_len(itf_addr))==0) 
     1018    { 
     1019        return PJ_ENOTFOUND; 
     1020    } 
     1021 
     1022    if (p_dst_addr) 
     1023        *p_dst_addr = dst_addr; 
     1024 
     1025    return PJ_SUCCESS; 
     1026} 
     1027 
     1028/* Get the default IP interface */ 
     1029PJ_DEF(pj_status_t) pj_getdefaultipinterface(int af, pj_sockaddr *addr) 
     1030{ 
     1031    pj_str_t cp; 
    9751032 
    9761033    if (af == PJ_AF_INET) { 
     
    9791036        cp = pj_str("1::1"); 
    9801037    } 
    981     status = pj_sockaddr_init(af, &a, &cp, 53); 
    982     if (status != PJ_SUCCESS) { 
    983         pj_sock_close(fd); 
    984         return status; 
    985     } 
    986  
    987     status = pj_sock_connect(fd, &a, pj_sockaddr_get_len(&a)); 
    988     if (status != PJ_SUCCESS) { 
    989         pj_sock_close(fd); 
    990         return status; 
    991     } 
    992  
    993     len = sizeof(a); 
    994     status = pj_sock_getsockname(fd, &a, &len); 
    995     if (status != PJ_SUCCESS) { 
    996         pj_sock_close(fd); 
    997         return status; 
    998     } 
    999  
    1000     pj_sock_close(fd); 
    1001  
    1002     /* Check that the address returned is not zero */ 
    1003     pj_bzero(zero, sizeof(zero)); 
    1004     if (pj_memcmp(pj_sockaddr_get_addr(&a), zero, 
    1005                   pj_sockaddr_get_addr_len(&a))==0) 
    1006     { 
    1007         return PJ_ENOTFOUND; 
    1008     } 
    1009  
    1010     pj_sockaddr_copy_addr(addr, &a); 
    1011  
    1012     /* Success */ 
    1013     return PJ_SUCCESS; 
     1038 
     1039    return pj_getipinterface(af, &cp, addr, PJ_FALSE, NULL); 
    10141040} 
    10151041 
Note: See TracChangeset for help on using the changeset viewer.