Ignore:
Timestamp:
Jun 29, 2006 2:45:17 PM (18 years ago)
Author:
bennylp
Message:

Improvements in PJMEDIA to support RFC 3605 (RTCP attribute in SDP) and other changes to improve RTCP communication behind NAT. Also fixed bug related to RTCP reporting changes in revision 565

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/transport_udp.c

    r558 r568  
    7272    pj_sock_t           rtcp_sock;      /**< RTCP socket                    */ 
    7373    pj_sockaddr_in      rtcp_addr_name; /**< Published RTCP address.        */ 
     74    pj_sockaddr_in      rtcp_src_addr;  /**< Actual source RTCP address.    */ 
     75    int                 rtcp_addr_len;  /**< Length of RTCP src address.    */ 
    7476    pj_ioqueue_key_t   *rtcp_key;       /**< RTCP socket key in ioqueue     */ 
    7577    pj_ioqueue_op_key_t rtcp_read_op;   /**< Pending read operation         */ 
     
    9092                                       void *user_data, 
    9193                                       const pj_sockaddr_t *rem_addr, 
     94                                       const pj_sockaddr_t *rem_rtcp, 
    9295                                       unsigned addr_len, 
    9396                                       void (*rtp_cb)(void*, 
     
    276279    /* Kick of pending RTCP read from the ioqueue */ 
    277280    size = sizeof(tp->rtcp_pkt); 
    278     status = pj_ioqueue_recv(tp->rtcp_key, &tp->rtcp_read_op, 
    279                              tp->rtcp_pkt, &size, PJ_IOQUEUE_ALWAYS_ASYNC); 
     281    tp->rtcp_addr_len = sizeof(tp->rtcp_src_addr); 
     282    status = pj_ioqueue_recvfrom( tp->rtcp_key, &tp->rtcp_read_op, 
     283                                  tp->rtcp_pkt, &size, PJ_IOQUEUE_ALWAYS_ASYNC, 
     284                                  &tp->rtcp_src_addr, &tp->rtcp_addr_len); 
    280285    if (status != PJ_EPENDING) 
    281286        goto on_error; 
     
    385390                if (udp->rtp_src_cnt >= PJMEDIA_RTP_NAT_PROBATION_CNT) { 
    386391                 
    387                     pj_uint16_t port; 
    388  
    389392                    /* Set remote RTP address to source address */ 
    390393                    udp->rem_rtp_addr = udp->rtp_src_addr; 
    391  
    392                     /* Also update remote RTCP address */ 
    393                     pj_memcpy(&udp->rem_rtcp_addr, &udp->rem_rtp_addr,  
    394                               sizeof(pj_sockaddr_in)); 
    395                     port = (pj_uint16_t) 
    396                            (pj_ntohs(udp->rem_rtp_addr.sin_port)+1); 
    397                     udp->rem_rtcp_addr.sin_port = pj_htons(port); 
    398394 
    399395                    /* Reset counter */ 
     
    404400                              pj_inet_ntoa(udp->rtp_src_addr.sin_addr), 
    405401                              pj_ntohs(udp->rtp_src_addr.sin_port))); 
     402 
     403                    /* Also update remote RTCP address if actual RTCP source 
     404                     * address is not heard yet. 
     405                     */ 
     406                    if (udp->rtcp_src_addr.sin_addr.s_addr == 0) { 
     407                        pj_uint16_t port; 
     408 
     409                        pj_memcpy(&udp->rem_rtcp_addr, &udp->rem_rtp_addr,  
     410                                  sizeof(pj_sockaddr_in)); 
     411                        port = (pj_uint16_t) 
     412                               (pj_ntohs(udp->rem_rtp_addr.sin_port)+1); 
     413                        udp->rem_rtcp_addr.sin_port = pj_htons(port); 
     414 
     415                        pj_memcpy(&udp->rtcp_src_addr, &udp->rem_rtcp_addr,  
     416                                  sizeof(pj_sockaddr_in)); 
     417 
     418                        PJ_LOG(4,(udp->base.name, 
     419                                  "Remote RTCP address switched to %s:%d", 
     420                                  pj_inet_ntoa(udp->rtcp_src_addr.sin_addr), 
     421                                  pj_ntohs(udp->rtcp_src_addr.sin_port))); 
     422 
     423                    } 
    406424                } 
    407425            } 
     
    441459            (*cb)(user_data, udp->rtcp_pkt, bytes_read); 
    442460 
     461        /* Check if RTCP source address is the same as the configured 
     462         * remote address, and switch the address when they are 
     463         * different. 
     464         */ 
     465        if ((udp->options & PJMEDIA_UDP_NO_SRC_ADDR_CHECKING)==0 && 
     466            ((udp->rem_rtcp_addr.sin_addr.s_addr !=  
     467               udp->rtcp_src_addr.sin_addr.s_addr) || 
     468             (udp->rem_rtcp_addr.sin_port !=  
     469               udp->rtcp_src_addr.sin_port))) 
     470        { 
     471            pj_memcpy(&udp->rem_rtcp_addr, &udp->rtcp_src_addr, 
     472                      sizeof(pj_sockaddr_in)); 
     473            PJ_LOG(4,(udp->base.name, 
     474                      "Remote RTCP address switched to %s:%d", 
     475                      pj_inet_ntoa(udp->rtcp_src_addr.sin_addr), 
     476                      pj_ntohs(udp->rtcp_src_addr.sin_port))); 
     477        } 
     478 
    443479        bytes_read = sizeof(udp->rtcp_pkt); 
    444         status = pj_ioqueue_recv(udp->rtcp_key, &udp->rtcp_read_op, 
    445                                      udp->rtcp_pkt, &bytes_read, 0); 
     480        udp->rtcp_addr_len = sizeof(udp->rtcp_src_addr); 
     481        status = pj_ioqueue_recvfrom(udp->rtcp_key, &udp->rtcp_read_op, 
     482                                     udp->rtcp_pkt, &bytes_read, 0, 
     483                                     &udp->rtcp_src_addr,  
     484                                     &udp->rtcp_addr_len); 
    446485 
    447486    } while (status == PJ_SUCCESS); 
     
    453492                                       void *user_data, 
    454493                                       const pj_sockaddr_t *rem_addr, 
     494                                       const pj_sockaddr_t *rem_rtcp, 
    455495                                       unsigned addr_len, 
    456496                                       void (*rtp_cb)(void*, 
     
    462502{ 
    463503    struct transport_udp *udp = (struct transport_udp*) tp; 
     504    const pj_sockaddr_in *rtcp_addr; 
    464505 
    465506    /* Validate arguments */ 
     
    474515    pj_memcpy(&udp->rem_rtp_addr, rem_addr, sizeof(pj_sockaddr_in)); 
    475516 
    476     /* Guess RTCP address from RTP address */ 
    477     pj_memcpy(&udp->rem_rtcp_addr, rem_addr, sizeof(pj_sockaddr_in)); 
    478     udp->rem_rtcp_addr.sin_port = (pj_uint16_t) pj_htons((pj_uint16_t)( 
    479                                     pj_ntohs(udp->rem_rtp_addr.sin_port)+1)); 
     517    /* Copy remote RTP address, if one is specified. */ 
     518    rtcp_addr = rem_rtcp; 
     519    if (rtcp_addr && rtcp_addr->sin_addr.s_addr != 0) { 
     520        pj_memcpy(&udp->rem_rtcp_addr, rem_rtcp, sizeof(pj_sockaddr_in)); 
     521 
     522    } else { 
     523        int rtcp_port; 
     524 
     525        /* Otherwise guess the RTCP address from the RTP address */ 
     526        pj_memcpy(&udp->rem_rtcp_addr, rem_addr, sizeof(pj_sockaddr_in)); 
     527        rtcp_port = pj_ntohs(udp->rem_rtp_addr.sin_port) + 1; 
     528        udp->rem_rtcp_addr.sin_port = pj_htons((pj_uint16_t)rtcp_port); 
     529    } 
    480530 
    481531    /* Save the callbacks */ 
Note: See TracChangeset for help on using the changeset viewer.