Changeset 1094 for pjproject/trunk/pjnath/src/pjnath-test/ice.c
- Timestamp:
- Mar 22, 2007 1:16:37 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjnath/src/pjnath-test/ice.c
r1093 r1094 24 24 struct ice_data 25 25 { 26 const char *obj_name; 26 27 pj_bool_t complete; 27 28 pj_status_t err_code; 28 29 unsigned rx_rtp_cnt; 29 30 unsigned rx_rtcp_cnt; 31 32 char rx_rtp_data[32]; 33 char rx_rtcp_data[32]; 30 34 }; 31 35 … … 38 42 id->complete = PJ_TRUE; 39 43 id->err_code = status; 44 PJ_LOG(3,(THIS_FILE, " ICE %s complete %s", id->obj_name, 45 (status==PJ_SUCCESS ? "successfully" : "with failure"))); 40 46 } 41 47 … … 47 53 { 48 54 struct ice_data *id = (struct ice_data*) icemt->user_data; 55 49 56 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); 50 61 } 51 62 … … 57 68 { 58 69 struct ice_data *id = (struct ice_data*) icemt->user_data; 70 59 71 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); 60 76 } 61 77 … … 129 145 130 146 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 */ 159 static 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[]) 133 164 { 134 165 pj_icemt *im1, *im2; 135 166 pj_icemt_cb icemt_cb; 136 167 struct ice_data *id1, *id2; 168 pj_timestamp t_start, t_end; 169 pj_ice_cand *rcand; 170 unsigned i; 137 171 pj_status_t status; 138 172 139 PJ_LOG(3,(THIS_FILE, "... direct communication"));173 PJ_LOG(3,(THIS_FILE, "...%s", title)); 140 174 141 175 pj_bzero(&icemt_cb, sizeof(icemt_cb)); … … 145 179 146 180 /* 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, 148 182 &icemt_cb, 0, PJ_FALSE, PJ_FALSE, NULL, &im1); 149 183 if (status != PJ_SUCCESS) … … 151 185 152 186 id1 = PJ_POOL_ZALLOC_T(im1->pool, struct ice_data); 187 id1->obj_name = "offerer"; 153 188 im1->user_data = id1; 154 189 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 155 200 /* 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, 157 202 &icemt_cb, 0, PJ_FALSE, PJ_FALSE, NULL, &im2); 158 203 if (status != PJ_SUCCESS) … … 160 205 161 206 id2 = PJ_POOL_ZALLOC_T(im2->pool, struct ice_data); 207 id2->obj_name = "answerer"; 162 208 im2->user_data = id2; 163 209 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 */ 164 221 { 165 pj_str_t u1 = pj_str(" uname1");222 pj_str_t u1 = pj_str("offerer"); 166 223 pj_str_t p1 = pj_str("pass1"); 167 pj_str_t u2 = pj_str(" uname2");224 pj_str_t u2 = pj_str("answerer"); 168 225 pj_str_t p2 = pj_str("pass2"); 169 226 … … 182 239 return -35; 183 240 241 /* Mark start time */ 242 pj_get_timestamp(&t_start); 243 184 244 /* Both can start now */ 185 245 status = pj_ice_start_check(im1->ice); … … 187 247 return -40; 188 248 189 #if 0249 #if 1 190 250 status = pj_ice_start_check(im2->ice); 191 251 if (status != PJ_SUCCESS) 192 return -4 0;252 return -45; 193 253 #endif 194 254 195 255 /* 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 197 259 handle_events(1); 198 260 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); 199 310 return 0; 200 201 311 } 202 312 … … 208 318 pj_ioqueue_t *ioqueue; 209 319 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 211 324 pool = pj_pool_create(mem, NULL, 4000, 4000, NULL); 212 325 pj_ioqueue_create(pool, 12, &ioqueue); … … 217 330 pj_log_set_level(5); 218 331 332 /* Basic create/destroy */ 219 333 rc = ice_basic_create_destroy_test(); 220 334 if (rc != 0) 221 335 goto on_return; 222 336 223 rc = ice_direct_test(); 337 /* Direct communication */ 338 rc = perform_ice_test("Direct connection", 0, NULL, 0, NULL); 224 339 if (rc != 0) 225 340 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 226 354 227 355 on_return:
Note: See TracChangeset
for help on using the changeset viewer.