Ignore:
Timestamp:
Mar 23, 2007 7:09:54 PM (17 years ago)
Author:
bennylp
Message:

ICE (work in progress): implemented server reflexive candidate

File:
1 edited

Legend:

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

    r1098 r1099  
    2020#include <pjnath/errno.h> 
    2121#include <pj/assert.h> 
     22#include <pj/log.h> 
    2223 
    2324struct transport_ice 
     
    2627    pj_ice_st           *ice_st; 
    2728 
    28     void  *stream; 
    29     void (*rtp_cb)(void*, 
    30                    const void*, 
    31                    pj_ssize_t); 
    32     void (*rtcp_cb)(void*, 
    33                     const void*, 
    34                     pj_ssize_t); 
     29    pj_time_val          start_ice; 
     30     
     31    void                *stream; 
     32    pj_sockaddr_in       remote_rtp; 
     33    pj_sockaddr_in       remote_rtcp; 
     34 
     35    void               (*rtp_cb)(void*, 
     36                                 const void*, 
     37                                 pj_ssize_t); 
     38    void               (*rtcp_cb)(void*, 
     39                                  const void*, 
     40                                  pj_ssize_t); 
    3541}; 
    3642 
     
    6975                           const pj_sockaddr_t *src_addr, 
    7076                           unsigned src_addr_len); 
    71 static void ice_on_stun_srv_resolved(pj_ice_st *ice_st, 
    72                                      pj_status_t status); 
    73 static void ice_on_interface_status(pj_ice_st *ice_st, 
    74                                     void *notify_data, 
    75                                     pj_status_t status, 
    76                                     int itf_id); 
    7777static void ice_on_ice_complete(pj_ice_st *ice_st,  
    7878                                pj_status_t status); 
     
    108108    pj_bzero(&ice_st_cb, sizeof(ice_st_cb)); 
    109109    ice_st_cb.on_ice_complete = &ice_on_ice_complete; 
    110     ice_st_cb.on_interface_status = &ice_on_interface_status; 
    111110    ice_st_cb.on_rx_data = &ice_on_rx_data; 
    112     ice_st_cb.on_stun_srv_resolved = &ice_on_stun_srv_resolved; 
    113111 
    114112    /* Create ICE */ 
     
    388386    } 
    389387 
     388    /* Mark start time */ 
     389    pj_gettimeofday(&tp_ice->start_ice); 
     390 
    390391    /* Start ICE */ 
    391392    return pj_ice_st_start_ice(tp_ice->ice_st, &uname, &pass, cand_cnt, cand); 
     
    455456    tp_ice->rtcp_cb = rtcp_cb; 
    456457 
    457     PJ_UNUSED_ARG(rem_addr); 
    458     PJ_UNUSED_ARG(rem_rtcp); 
    459     PJ_UNUSED_ARG(addr_len); 
     458    pj_memcpy(&tp_ice->remote_rtp, rem_addr, addr_len); 
     459    pj_memcpy(&tp_ice->remote_rtcp, rem_rtcp, addr_len); 
    460460 
    461461    return PJ_SUCCESS; 
     
    481481{ 
    482482    struct transport_ice *tp_ice = (struct transport_ice*)tp; 
    483     return pj_ice_st_send_data(tp_ice->ice_st, 1, pkt, size); 
     483    if (tp_ice->ice_st->ice) { 
     484        return pj_ice_st_send_data(tp_ice->ice_st, 1, pkt, size); 
     485    } else { 
     486        return pj_ice_st_sendto(tp_ice->ice_st, 1, 0, 
     487                                pkt, size, &tp_ice->remote_rtp, 
     488                                sizeof(pj_sockaddr_in)); 
     489    } 
    484490} 
    485491 
     
    521527 
    522528 
    523 static void ice_on_stun_srv_resolved(pj_ice_st *ice_st, 
    524                                      pj_status_t status) 
    525 { 
    526     struct transport_ice *tp_ice = (struct transport_ice*) ice_st->user_data; 
    527 } 
    528  
    529  
    530 static void ice_on_interface_status(pj_ice_st *ice_st, 
    531                                     void *notify_data, 
    532                                     pj_status_t status, 
    533                                     int itf_id) 
    534 { 
    535     struct transport_ice *tp_ice = (struct transport_ice*) ice_st->user_data; 
    536 } 
    537  
    538  
    539529static void ice_on_ice_complete(pj_ice_st *ice_st,  
    540530                                pj_status_t status) 
    541531{ 
    542532    struct transport_ice *tp_ice = (struct transport_ice*) ice_st->user_data; 
    543 } 
    544  
    545  
     533    pj_time_val end_ice; 
     534    pj_ice_cand *lcand, *rcand; 
     535    pj_ice_check *check; 
     536    char src_addr[32]; 
     537    char dst_addr[32]; 
     538 
     539    if (status != PJ_SUCCESS) { 
     540        char errmsg[PJ_ERR_MSG_SIZE]; 
     541        pj_strerror(status, errmsg, sizeof(errmsg)); 
     542        PJ_LOG(1,(ice_st->obj_name, "ICE negotiation failed: %s", errmsg)); 
     543        return; 
     544    } 
     545 
     546    pj_gettimeofday(&end_ice); 
     547    PJ_TIME_VAL_SUB(end_ice, tp_ice->start_ice); 
     548 
     549    check = &ice_st->ice->clist.checks[ice_st->ice->valid_list[0]]; 
     550     
     551    lcand = check->lcand; 
     552    rcand = check->rcand; 
     553 
     554    pj_ansi_strcpy(src_addr, pj_inet_ntoa(lcand->addr.ipv4.sin_addr)); 
     555    pj_ansi_strcpy(dst_addr, pj_inet_ntoa(rcand->addr.ipv4.sin_addr)); 
     556 
     557    PJ_LOG(3,(ice_st->obj_name,  
     558              "ICE negotiation completed in %d.%03ds. Sending from " 
     559              "%s:%d to %s:%d", 
     560              (int)end_ice.sec, (int)end_ice.msec, 
     561              src_addr, pj_ntohs(lcand->addr.ipv4.sin_port), 
     562              dst_addr, pj_ntohs(rcand->addr.ipv4.sin_port))); 
     563} 
     564 
     565 
Note: See TracChangeset for help on using the changeset viewer.