Ignore:
Timestamp:
Mar 22, 2007 1:16:37 AM (17 years ago)
Author:
bennylp
Message:

Completed initial test for ICE

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjnath/src/pjnath-test/ice.c

    r1093 r1094  
    2424struct ice_data 
    2525{ 
     26    const char     *obj_name; 
    2627    pj_bool_t       complete; 
    2728    pj_status_t     err_code; 
    2829    unsigned        rx_rtp_cnt; 
    2930    unsigned        rx_rtcp_cnt; 
     31 
     32    char            rx_rtp_data[32]; 
     33    char            rx_rtcp_data[32]; 
    3034}; 
    3135 
     
    3842    id->complete = PJ_TRUE; 
    3943    id->err_code = status; 
     44    PJ_LOG(3,(THIS_FILE, "    ICE %s complete %s", id->obj_name, 
     45              (status==PJ_SUCCESS ? "successfully" : "with failure"))); 
    4046} 
    4147 
     
    4753{ 
    4854    struct ice_data *id = (struct ice_data*) icemt->user_data; 
     55 
    4956    id->rx_rtp_cnt++; 
     57    pj_memcpy(id->rx_rtp_data, pkt, size); 
     58 
     59    PJ_UNUSED_ARG(src_addr); 
     60    PJ_UNUSED_ARG(src_addr_len); 
    5061} 
    5162 
     
    5768{ 
    5869    struct ice_data *id = (struct ice_data*) icemt->user_data; 
     70 
    5971    id->rx_rtcp_cnt++; 
     72    pj_memcpy(id->rx_rtcp_data, pkt, size); 
     73 
     74    PJ_UNUSED_ARG(src_addr); 
     75    PJ_UNUSED_ARG(src_addr_len); 
    6076} 
    6177 
     
    129145 
    130146 
    131 /* Direct agent to agent communication */ 
    132 static int ice_direct_test() 
     147/* Perform ICE test with the following parameters: 
     148 * 
     149 * - title:     The title of the test 
     150 * - ocand_cnt, 
     151 *   ocand      Additional candidates to be added to offerer 
     152 * - acand_cnt, 
     153 *   acand      Additional candidates to be added to answerer 
     154 * 
     155 * The additional candidates are invalid candidates, meaning they 
     156 * won't be reachable by the agents. They are used to "confuse" 
     157 * ICE processing. 
     158 */ 
     159static int perform_ice_test(const char *title, 
     160                            unsigned ocand_cnt, 
     161                            const pj_ice_cand ocand[], 
     162                            unsigned acand_cnt, 
     163                            const pj_ice_cand acand[]) 
    133164{ 
    134165    pj_icemt *im1, *im2; 
    135166    pj_icemt_cb icemt_cb; 
    136167    struct ice_data *id1, *id2; 
     168    pj_timestamp t_start, t_end; 
     169    pj_ice_cand *rcand; 
     170    unsigned i; 
    137171    pj_status_t status; 
    138172 
    139     PJ_LOG(3,(THIS_FILE, "...direct communication")); 
     173    PJ_LOG(3,(THIS_FILE, "...%s", title)); 
    140174 
    141175    pj_bzero(&icemt_cb, sizeof(icemt_cb)); 
     
    145179 
    146180    /* Create first ICE */ 
    147     status = pj_icemt_create(&stun_cfg, NULL, PJ_ICE_ROLE_CONTROLLING, 
     181    status = pj_icemt_create(&stun_cfg, "offerer", PJ_ICE_ROLE_CONTROLLING, 
    148182                             &icemt_cb, 0, PJ_FALSE, PJ_FALSE, NULL, &im1); 
    149183    if (status != PJ_SUCCESS) 
     
    151185 
    152186    id1 = PJ_POOL_ZALLOC_T(im1->pool, struct ice_data); 
     187    id1->obj_name = "offerer"; 
    153188    im1->user_data = id1; 
    154189 
     190    /* Add additional candidates */ 
     191    for (i=0; i<ocand_cnt; ++i) { 
     192        status = pj_ice_add_cand(im1->ice, 1, ocand[i].type, 65535, 
     193                                 &ocand[i].foundation, &ocand[i].addr, 
     194                                 &ocand[i].base_addr, &ocand[i].srv_addr, 
     195                                 sizeof(pj_sockaddr_in), NULL); 
     196        if (status != PJ_SUCCESS) 
     197            return -22; 
     198    } 
     199 
    155200    /* Create second ICE */ 
    156     status = pj_icemt_create(&stun_cfg, NULL, PJ_ICE_ROLE_CONTROLLED, 
     201    status = pj_icemt_create(&stun_cfg, "answerer", PJ_ICE_ROLE_CONTROLLED, 
    157202                             &icemt_cb, 0, PJ_FALSE, PJ_FALSE, NULL, &im2); 
    158203    if (status != PJ_SUCCESS) 
     
    160205 
    161206    id2 = PJ_POOL_ZALLOC_T(im2->pool, struct ice_data); 
     207    id2->obj_name = "answerer"; 
    162208    im2->user_data = id2; 
    163209 
     210    /* Add additional candidates */ 
     211    for (i=0; i<acand_cnt; ++i) { 
     212        status = pj_ice_add_cand(im1->ice, 1, acand[i].type, 65535, 
     213                                 &acand[i].foundation, &acand[i].addr, 
     214                                 &acand[i].base_addr, &acand[i].srv_addr, 
     215                                 sizeof(pj_sockaddr_in), NULL); 
     216        if (status != PJ_SUCCESS) 
     217            return -22; 
     218    } 
     219 
     220    /* Set credentials */ 
    164221    { 
    165         pj_str_t u1 = pj_str("uname1"); 
     222        pj_str_t u1 = pj_str("offerer"); 
    166223        pj_str_t p1 = pj_str("pass1"); 
    167         pj_str_t u2 = pj_str("uname2"); 
     224        pj_str_t u2 = pj_str("answerer"); 
    168225        pj_str_t p2 = pj_str("pass2"); 
    169226 
     
    182239        return -35; 
    183240 
     241    /* Mark start time */ 
     242    pj_get_timestamp(&t_start); 
     243 
    184244    /* Both can start now */ 
    185245    status = pj_ice_start_check(im1->ice); 
     
    187247        return -40; 
    188248 
    189 #if 0 
     249#if 1 
    190250    status = pj_ice_start_check(im2->ice); 
    191251    if (status != PJ_SUCCESS) 
    192         return -40; 
     252        return -45; 
    193253#endif 
    194254 
    195255    /* Just wait until both completes, or timed out */ 
    196     while (!id1->complete || !id2->complete) 
     256    while (!id1->complete || !id2->complete) { 
     257        pj_timestamp t_now; 
     258 
    197259        handle_events(1); 
    198260 
     261        pj_get_timestamp(&t_now); 
     262        if (pj_elapsed_msec(&t_start, &t_now) >= 10000) { 
     263            PJ_LOG(3,(THIS_FILE, "....error: timed-out")); 
     264            return -50; 
     265        } 
     266    } 
     267 
     268    /* Mark end-time */ 
     269    pj_get_timestamp(&t_end); 
     270 
     271    /* Check status */ 
     272    if (id1->err_code != PJ_SUCCESS) 
     273        return -53; 
     274    if (id2->err_code != PJ_SUCCESS) 
     275        return -56; 
     276 
     277    /* Verify that offerer gets answerer's transport address */ 
     278    rcand = im1->ice->clist.checks[im1->ice->comp[0].nominated_check_id].rcand; 
     279    if (pj_memcmp(&rcand->addr, &im2->ice->lcand[0].addr, sizeof(pj_sockaddr_in))!=0) { 
     280        PJ_LOG(3,(THIS_FILE, "....error: address mismatch")); 
     281        return -60; 
     282    } 
     283 
     284    /* And the other way around */ 
     285    rcand = im2->ice->clist.checks[im2->ice->comp[0].nominated_check_id].rcand; 
     286    if (pj_memcmp(&rcand->addr, &im1->ice->lcand[0].addr, sizeof(pj_sockaddr_in))!=0) { 
     287        PJ_LOG(3,(THIS_FILE, "....error: address mismatch")); 
     288        return -70; 
     289    } 
     290 
     291    /* Done */ 
     292    PJ_LOG(3,(THIS_FILE, "....success: ICE completed in %d msec",  
     293              pj_elapsed_msec(&t_start, &t_end))); 
     294 
     295    /* Wait for some more time */ 
     296    PJ_LOG(3,(THIS_FILE, ".....waiting..")); 
     297    for (;;) { 
     298        pj_timestamp t_now; 
     299 
     300        pj_get_timestamp(&t_now); 
     301        if (pj_elapsed_msec(&t_end, &t_now) > 10000) 
     302            break; 
     303 
     304        handle_events(1); 
     305    } 
     306 
     307 
     308    pj_icemt_destroy(im1); 
     309    pj_icemt_destroy(im2); 
    199310    return 0; 
    200  
    201311} 
    202312 
     
    208318    pj_ioqueue_t *ioqueue; 
    209319    pj_timer_heap_t *timer_heap; 
    210      
     320    pj_ice_cand ocand[PJ_ICE_MAX_CAND]; 
     321    pj_ice_cand acand[PJ_ICE_MAX_CAND]; 
     322    pj_str_t s; 
     323 
    211324    pool = pj_pool_create(mem, NULL, 4000, 4000, NULL); 
    212325    pj_ioqueue_create(pool, 12, &ioqueue); 
     
    217330    pj_log_set_level(5); 
    218331 
     332    /* Basic create/destroy */ 
    219333    rc = ice_basic_create_destroy_test(); 
    220334    if (rc != 0) 
    221335        goto on_return; 
    222336 
    223     rc = ice_direct_test(); 
     337    /* Direct communication */ 
     338    rc = perform_ice_test("Direct connection", 0, NULL, 0, NULL); 
    224339    if (rc != 0) 
    225340        goto on_return; 
     341 
     342    /* Direct communication with invalid address */ 
     343    pj_bzero(ocand, sizeof(ocand)); 
     344    pj_sockaddr_in_init(&ocand[0].addr.ipv4, pj_cstr(&s, "127.0.0.127"), 1234); 
     345    pj_sockaddr_in_init(&ocand[0].base_addr.ipv4, pj_cstr(&s, "127.0.0.128"), 1234); 
     346    ocand[0].comp_id = 1; 
     347    ocand[0].foundation = pj_str("H2"); 
     348    ocand[0].type = PJ_ICE_CAND_TYPE_HOST; 
     349 
     350    rc = perform_ice_test("Direct connection with 1 invalid address", 1, ocand, 0, NULL); 
     351    if (rc != 0) 
     352        goto on_return; 
     353 
    226354 
    227355on_return: 
Note: See TracChangeset for help on using the changeset viewer.