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/pjmedia/src/pjmedia/transport_udp.c

    r5597 r5636  
    653653    struct transport_udp *udp = (struct transport_udp*) tp; 
    654654    const pj_sockaddr *rtcp_addr; 
     655    pj_sockaddr sock_addr, remote_addr, remote_rtcp; 
     656    int rem_addr_len; 
     657    pj_status_t status; 
    655658 
    656659    /* Validate arguments */ 
     
    668671    /* "Attach" the application: */ 
    669672 
     673    rem_addr_len = sizeof(pj_sockaddr); 
     674    pj_sock_getsockname(udp->rtp_sock, &sock_addr, &rem_addr_len); 
     675 
     676    /* Synthesize address, if necessary. */ 
     677    status = pj_sockaddr_synthesize(sock_addr.addr.sa_family, 
     678                                    &remote_addr, rem_addr); 
     679    if (status != PJ_SUCCESS) { 
     680        pj_perror(3, tp->name, status, "Failed to synthesize the correct" 
     681                                       "IP address for RTP"); 
     682    } 
     683    rem_addr_len = pj_sockaddr_get_len(&remote_addr); 
     684 
    670685    /* Copy remote RTP address */ 
    671     pj_memcpy(&udp->rem_rtp_addr, rem_addr, addr_len); 
     686    pj_memcpy(&udp->rem_rtp_addr, &remote_addr, rem_addr_len); 
    672687 
    673688    /* Copy remote RTP address, if one is specified. */ 
    674689    rtcp_addr = (const pj_sockaddr*) rem_rtcp; 
    675690    if (rtcp_addr && pj_sockaddr_has_addr(rtcp_addr)) { 
    676         pj_memcpy(&udp->rem_rtcp_addr, rem_rtcp, addr_len); 
     691        pj_status_t status; 
     692 
     693        status = pj_sockaddr_synthesize(sock_addr.addr.sa_family, 
     694                                        &remote_rtcp, rem_rtcp); 
     695        if (status != PJ_SUCCESS) { 
     696            pj_perror(3, tp->name, status, "Failed to synthesize the correct" 
     697                                           "IP address for RTCP"); 
     698        } 
     699        pj_memcpy(&udp->rem_rtcp_addr, &remote_rtcp, rem_addr_len); 
    677700 
    678701    } else { 
     
    680703 
    681704        /* Otherwise guess the RTCP address from the RTP address */ 
    682         pj_memcpy(&udp->rem_rtcp_addr, rem_addr, addr_len); 
     705        pj_memcpy(&udp->rem_rtcp_addr, &udp->rem_rtp_addr, rem_addr_len); 
    683706        rtcp_port = pj_sockaddr_get_port(&udp->rem_rtp_addr) + 1; 
    684707        pj_sockaddr_set_port(&udp->rem_rtcp_addr, (pj_uint16_t)rtcp_port); 
     
    691714 
    692715    /* Save address length */ 
    693     udp->addr_len = addr_len; 
     716    udp->addr_len = rem_addr_len; 
    694717 
    695718    /* Last, mark transport as attached */ 
Note: See TracChangeset for help on using the changeset viewer.