Ignore:
Timestamp:
Oct 24, 2011 9:28:13 AM (13 years ago)
Author:
ming
Message:

Re #1395: Backport of PJSIP 1.x branch into PJSIP 2.0 trunk

TODO: ticket #1268 (Option for automatic/manual sending of RTCP SDES/BYE for the stream) for video stream.

Location:
pjproject/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk

  • pjproject/trunk/pjmedia/src/pjmedia/transport_ice.c

    r3664 r3841  
    7373    pj_sockaddr          rtcp_src_addr; /**< Actual source RTCP address.    */ 
    7474    unsigned             rtp_src_cnt;   /**< How many pkt from this addr.   */ 
     75    unsigned             rtcp_src_cnt;  /**< How many pkt from this addr.   */ 
    7576 
    7677    unsigned             tx_drop_pct;   /**< Percent of tx pkts to drop.    */ 
     
    15171518    if (tp_ice->use_ice || tp_ice->rtp_src_cnt) { 
    15181519        info->src_rtp_name  = tp_ice->rtp_src_addr; 
     1520    } 
     1521    if (tp_ice->use_ice || tp_ice->rtcp_src_cnt) { 
    15191522        info->src_rtcp_name = tp_ice->rtcp_src_addr; 
    15201523    } 
     
    15821585    tp_ice->rtcp_src_addr = tp_ice->remote_rtcp; 
    15831586    tp_ice->rtp_src_cnt = 0; 
     1587    tp_ice->rtcp_src_cnt = 0; 
    15841588 
    15851589    return PJ_SUCCESS; 
     
    16571661{ 
    16581662    struct transport_ice *tp_ice; 
     1663    pj_bool_t discard = PJ_FALSE; 
    16591664 
    16601665    tp_ice = (struct transport_ice*) pj_ice_strans_get_user_data(ice_st); 
     
    16721677        } 
    16731678 
    1674         (*tp_ice->rtp_cb)(tp_ice->stream, pkt, size); 
    1675  
    16761679        /* See if source address of RTP packet is different than the  
    16771680         * configured address, and switch RTP remote address to  
     
    16801683         */ 
    16811684        if (!tp_ice->use_ice) { 
    1682  
    1683             /* Increment counter and avoid zero */ 
    1684             if (++tp_ice->rtp_src_cnt == 0)  
    1685                 tp_ice->rtp_src_cnt = 1; 
    1686  
    1687             if (pj_sockaddr_cmp(&tp_ice->remote_rtp, src_addr) != 0) { 
     1685            pj_bool_t enable_switch = 
     1686                    ((tp_ice->options & PJMEDIA_ICE_NO_SRC_ADDR_CHECKING)==0); 
     1687 
     1688            if (!enable_switch || 
     1689                pj_sockaddr_cmp(&tp_ice->remote_rtp, src_addr) == 0) 
     1690            { 
     1691                /* Don't switch while we're receiving from remote_rtp */ 
     1692                tp_ice->rtp_src_cnt = 0; 
     1693            } else { 
     1694 
     1695                ++tp_ice->rtp_src_cnt; 
    16881696 
    16891697                /* Check if the source address is recognized. */ 
     
    16931701                    /* Reset counter */ 
    16941702                    tp_ice->rtp_src_cnt = 0; 
     1703                    discard = PJ_TRUE; 
    16951704                } 
    16961705 
    1697                 if ((tp_ice->options & PJMEDIA_ICE_NO_SRC_ADDR_CHECKING)==0 && 
    1698                     tp_ice->rtp_src_cnt >= PJMEDIA_RTP_NAT_PROBATION_CNT)  
    1699                 { 
     1706                if (tp_ice->rtp_src_cnt < PJMEDIA_RTP_NAT_PROBATION_CNT) { 
     1707                    discard = PJ_TRUE; 
     1708                } else { 
    17001709                    char addr_text[80]; 
    17011710 
     
    17261735 
    17271736                        PJ_LOG(4,(tp_ice->base.name, 
    1728                                   "Remote RTCP address switched to %s", 
     1737                                  "Remote RTCP address switched to predicted " 
     1738                                  "address %s", 
    17291739                                  pj_sockaddr_print(&tp_ice->remote_rtcp,  
    17301740                                                    addr_text, 
     
    17341744            } 
    17351745        } 
     1746 
     1747        if (!discard) 
     1748            (*tp_ice->rtp_cb)(tp_ice->stream, pkt, size); 
     1749 
    17361750    } else if (comp_id==2 && tp_ice->rtcp_cb) { 
    1737         (*tp_ice->rtcp_cb)(tp_ice->stream, pkt, size); 
    17381751 
    17391752        /* Check if RTCP source address is the same as the configured 
     
    17421755         */ 
    17431756        if (!tp_ice->use_ice && 
    1744             pj_sockaddr_cmp(&tp_ice->remote_rtcp, src_addr) != 0) 
     1757            (tp_ice->options & PJMEDIA_ICE_NO_SRC_ADDR_CHECKING)==0) 
    17451758        { 
    1746             pj_sockaddr_cp(&tp_ice->rtcp_src_addr, src_addr); 
    1747  
    1748             if ((tp_ice->options & PJMEDIA_ICE_NO_SRC_ADDR_CHECKING)==0) { 
     1759            if (pj_sockaddr_cmp(&tp_ice->remote_rtcp, src_addr) == 0) { 
     1760                tp_ice->rtcp_src_cnt = 0; 
     1761            } else { 
    17491762                char addr_text[80]; 
    17501763 
    1751                 pj_sockaddr_cp(&tp_ice->remote_rtcp, src_addr); 
    1752  
    1753                 pj_assert(tp_ice->addr_len == pj_sockaddr_get_len(src_addr)); 
    1754  
    1755                 PJ_LOG(4,(tp_ice->base.name, 
    1756                           "Remote RTCP address switched to %s", 
    1757                           pj_sockaddr_print(&tp_ice->remote_rtcp, addr_text, 
    1758                                             sizeof(addr_text), 3))); 
     1764                ++tp_ice->rtcp_src_cnt; 
     1765                if (tp_ice->rtcp_src_cnt < PJMEDIA_RTCP_NAT_PROBATION_CNT) { 
     1766                    discard = PJ_TRUE; 
     1767                } else { 
     1768                    tp_ice->rtcp_src_cnt = 0; 
     1769                    pj_sockaddr_cp(&tp_ice->rtcp_src_addr, src_addr); 
     1770                    pj_sockaddr_cp(&tp_ice->remote_rtcp, src_addr); 
     1771 
     1772                    pj_assert(tp_ice->addr_len==pj_sockaddr_get_len(src_addr)); 
     1773 
     1774                    PJ_LOG(4,(tp_ice->base.name, 
     1775                              "Remote RTCP address switched to %s", 
     1776                              pj_sockaddr_print(&tp_ice->remote_rtcp, 
     1777                                                addr_text, sizeof(addr_text), 
     1778                                                3))); 
     1779                } 
    17591780            } 
    17601781        } 
     1782 
     1783        if (!discard) 
     1784            (*tp_ice->rtcp_cb)(tp_ice->stream, pkt, size); 
    17611785    } 
    17621786 
Note: See TracChangeset for help on using the changeset viewer.