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/pjnath/src/pjnath/ice_session.c

    r5534 r5636  
    21862186    pj_ice_sess_checklist *clist; 
    21872187    pj_stun_xor_mapped_addr_attr *xaddr; 
     2188    const pj_sockaddr_t *source_addr = src_addr; 
    21882189    unsigned i; 
    21892190 
     
    22872288     * Request was sent from. 
    22882289     */ 
    2289     if (pj_sockaddr_cmp(&check->rcand->addr, (const pj_sockaddr*)src_addr)!=0) 
     2290    if (check->rcand->addr.addr.sa_family == pj_AF_INET() && 
     2291        ((pj_sockaddr *)src_addr)->addr.sa_family == pj_AF_INET6()) 
    22902292    { 
     2293        /* If the address family is different, we need to check 
     2294         * whether the two addresses are equivalent (i.e. the IPv6 
     2295         * is synthesized from IPv4). 
     2296         */ 
     2297        pj_sockaddr synth_addr; 
     2298        pj_status_t status; 
     2299         
     2300        status = pj_sockaddr_synthesize(pj_AF_INET6(), &synth_addr, 
     2301                                        &check->rcand->addr); 
     2302        if (status == PJ_SUCCESS && 
     2303            pj_sockaddr_cmp(&synth_addr, src_addr) == 0) 
     2304        { 
     2305            source_addr = &check->rcand->addr; 
     2306        } 
     2307    } 
     2308 
     2309    if (pj_sockaddr_cmp(&check->rcand->addr, source_addr) != 0) { 
    22912310        status = PJNATH_EICEINSRCADDR; 
    22922311        LOG4((ice->obj_name,  
     
    24752494    pj_stun_tx_data *tdata; 
    24762495    pj_ice_rx_check *rcheck, tmp_rcheck; 
     2496    const pj_sockaddr_t *source_addr = src_addr; 
     2497    unsigned source_addr_len = src_addr_len; 
    24772498    pj_status_t status; 
    24782499 
     
    25882609    } 
    25892610 
     2611    if (((pj_sockaddr *)src_addr)->addr.sa_family == pj_AF_INET6()) { 
     2612        unsigned i; 
     2613        unsigned transport_id = ((pj_ice_msg_data*)token)->transport_id; 
     2614        pj_ice_sess_cand *lcand = NULL; 
     2615 
     2616        for (i = 0; i < ice->clist.count; ++i) { 
     2617            pj_ice_sess_check *c = &ice->clist.checks[i]; 
     2618            if (c->lcand->comp_id == sd->comp_id && 
     2619                c->lcand->transport_id == transport_id)  
     2620            { 
     2621                lcand = c->lcand; 
     2622                break; 
     2623            } 
     2624        } 
     2625 
     2626        if (lcand != NULL && lcand->addr.addr.sa_family == pj_AF_INET()) { 
     2627            /* We are behind NAT64, so src_addr is a synthesized IPv6 
     2628             * address. Instead of putting this synth IPv6 address as 
     2629             * the XOR-MAPPED-ADDRESS, we need to find its original 
     2630             * IPv4 address. 
     2631             */ 
     2632            for (i = 0; i < ice->rcand_cnt; ++i) { 
     2633                pj_status_t status; 
     2634                pj_sockaddr synth_addr; 
     2635             
     2636                if (ice->rcand[i].addr.addr.sa_family != pj_AF_INET()) 
     2637                    continue; 
     2638 
     2639                status = pj_sockaddr_synthesize(pj_AF_INET6(), &synth_addr, 
     2640                                                &ice->rcand[i].addr); 
     2641                if (status == PJ_SUCCESS && 
     2642                    pj_sockaddr_cmp(src_addr, &synth_addr) == 0) 
     2643                { 
     2644                    /* We find the original IPv4 address. */ 
     2645                    source_addr = &ice->rcand[i].addr; 
     2646                    source_addr_len = pj_sockaddr_get_len(source_addr); 
     2647                    break; 
     2648                } 
     2649            } 
     2650        } 
     2651    } 
     2652 
     2653 
    25902654    /* Add XOR-MAPPED-ADDRESS attribute */ 
    25912655    status = pj_stun_msg_add_sockaddr_attr(tdata->pool, tdata->msg,  
    25922656                                           PJ_STUN_ATTR_XOR_MAPPED_ADDR, 
    2593                                            PJ_TRUE, src_addr, src_addr_len); 
     2657                                           PJ_TRUE, source_addr, 
     2658                                           source_addr_len); 
    25942659 
    25952660    /* Create a msg_data to be associated with this response */ 
     
    26202685    rcheck->comp_id = sd->comp_id; 
    26212686    rcheck->transport_id = ((pj_ice_msg_data*)token)->transport_id; 
    2622     rcheck->src_addr_len = src_addr_len; 
    2623     pj_sockaddr_cp(&rcheck->src_addr, src_addr); 
     2687    rcheck->src_addr_len = source_addr_len; 
     2688    pj_sockaddr_cp(&rcheck->src_addr, source_addr); 
    26242689    rcheck->use_candidate = (uc_attr != NULL); 
    26252690    rcheck->priority = prio_attr->value; 
Note: See TracChangeset for help on using the changeset viewer.