Ignore:
Timestamp:
Aug 2, 2017 2:51:59 AM (7 years ago)
Author:
ming
Message:

Fixed #2032: NAT64 support for IPv4 interoperability

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r5449 r5636  
    12981298        stun_resolve_add_ref(sess); 
    12991299 
    1300         ++sess->idx; 
    1301         if (sess->idx >= sess->count) 
    1302             sess->status = status; 
     1300        if (pjsua_var.ua_cfg.stun_try_ipv6 && sess->af == pj_AF_INET()) { 
     1301            sess->af = pj_AF_INET6(); 
     1302        } else { 
     1303            ++sess->idx; 
     1304            sess->af = pj_AF_INET(); 
     1305            if (sess->idx >= sess->count) 
     1306                sess->status = status; 
     1307        } 
    13031308 
    13041309        resolve_stun_entry(sess); 
     
    13401345 
    13411346    /* Loop while we have entry to try */ 
    1342     for (; sess->idx < sess->count; ++sess->idx) { 
     1347    for (; sess->idx < sess->count; 
     1348         (pjsua_var.ua_cfg.stun_try_ipv6 && sess->af == pj_AF_INET())? 
     1349         sess->af = pj_AF_INET6(): (++sess->idx, sess->af = pj_AF_INET())) 
     1350    { 
    13431351        int af; 
    13441352        char target[64]; 
     
    13591367            PJ_LOG(2,(THIS_FILE, "Invalid STUN server entry %s", target)); 
    13601368            continue; 
    1361         } else if (af != pj_AF_INET()) { 
    1362             /* Ignore IPv6 STUN server for now */ 
    1363             status = PJ_EAFNOTSUP; 
    1364             PJ_LOG(3,(THIS_FILE, "Ignored STUN server entry %s, currently " 
    1365                                  "only IPv4 STUN server is supported (does " 
    1366                                  "IPv6 still need a mapped address?)", 
    1367                       target)); 
    1368             continue; 
    13691369        } 
    13701370         
     
    13751375        pj_assert(sess->stun_sock == NULL); 
    13761376 
    1377         PJ_LOG(4,(THIS_FILE, "Trying STUN server %s (%d of %d)..", 
    1378                   target, sess->idx+1, sess->count)); 
     1377        PJ_LOG(4,(THIS_FILE, "Trying STUN server %s %s (%d of %d)..", 
     1378                  target, (sess->af == pj_AF_INET()? "IPv4": "IPv6"), 
     1379                  sess->idx+1, sess->count)); 
    13791380 
    13801381        /* Use STUN_sock to test this entry */ 
     
    13831384        sess->async_wait = PJ_FALSE; 
    13841385        status = pj_stun_sock_create(&pjsua_var.stun_cfg, "stunresolve", 
    1385                                      pj_AF_INET(), &stun_sock_cb, 
     1386                                     sess->af, &stun_sock_cb, 
    13861387                                     NULL, sess, &sess->stun_sock); 
    13871388        if (status != PJ_SUCCESS) { 
     
    14891490    sess->waiter = pj_thread_this(); 
    14901491    sess->status = PJ_EPENDING; 
     1492    sess->af = pj_AF_INET(); 
    14911493    sess->srv = (pj_str_t*) pj_pool_calloc(pool, count, sizeof(pj_str_t)); 
    14921494    for (i=0; i<count; ++i) { 
     
    21582160            pj_sockaddr_set_port(p_pub_addr, (pj_uint16_t)port); 
    21592161 
    2160     } else if (stun_srv.slen && af == pj_AF_INET()) { 
     2162    } else if (stun_srv.slen && 
     2163               (af == pj_AF_INET() || pjsua_var.ua_cfg.stun_try_ipv6)) 
     2164    { 
    21612165        pjstun_setting stun_opt; 
    21622166 
    21632167        /* 
    21642168         * STUN is specified, resolve the address with STUN. 
    2165          * Currently, this is available for IPv4 address only. 
     2169         * Currently, this is only to get IPv4 mapped address 
     2170         * (does IPv6 still need a mapped address?). 
    21662171         */ 
    21672172        pj_bzero(&stun_opt, sizeof(stun_opt)); 
    21682173        stun_opt.use_stun2 = pjsua_var.ua_cfg.stun_map_use_stun2; 
     2174        stun_opt.af = pjsua_var.stun_srv.addr.sa_family; 
    21692175        stun_opt.srv1  = stun_opt.srv2  = stun_srv; 
    21702176        stun_opt.port1 = stun_opt.port2 =  
    2171                          pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port); 
     2177                         pj_sockaddr_get_port(&pjsua_var.stun_srv); 
    21722178        status = pjstun_get_mapped_addr2(&pjsua_var.cp.factory, &stun_opt, 
    21732179                                         1, &sock, &p_pub_addr->ipv4); 
     
    28952901 
    28962902    /* Make sure we have STUN */ 
    2897     if (pjsua_var.stun_srv.ipv4.sin_family == 0) { 
     2903    if (pjsua_var.stun_srv.addr.sa_family == 0) { 
    28982904        pjsua_var.nat_status = PJNATH_ESTUNINSERVER; 
    28992905        return PJNATH_ESTUNINSERVER; 
    29002906    } 
    29012907 
    2902     status = pj_stun_detect_nat_type(&pjsua_var.stun_srv.ipv4,  
    2903                                      &pjsua_var.stun_cfg,  
    2904                                      NULL, &nat_detect_cb); 
     2908    status = pj_stun_detect_nat_type2(&pjsua_var.stun_srv,  
     2909                                      &pjsua_var.stun_cfg,  
     2910                                      NULL, &nat_detect_cb); 
    29052911 
    29062912    if (status != PJ_SUCCESS) { 
Note: See TracChangeset for help on using the changeset viewer.