Changeset 5636 for pjproject/trunk/pjnath/src/pjnath/ice_session.c
- Timestamp:
- Aug 2, 2017 2:51:59 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjnath/src/pjnath/ice_session.c
r5534 r5636 2186 2186 pj_ice_sess_checklist *clist; 2187 2187 pj_stun_xor_mapped_addr_attr *xaddr; 2188 const pj_sockaddr_t *source_addr = src_addr; 2188 2189 unsigned i; 2189 2190 … … 2287 2288 * Request was sent from. 2288 2289 */ 2289 if (pj_sockaddr_cmp(&check->rcand->addr, (const pj_sockaddr*)src_addr)!=0) 2290 if (check->rcand->addr.addr.sa_family == pj_AF_INET() && 2291 ((pj_sockaddr *)src_addr)->addr.sa_family == pj_AF_INET6()) 2290 2292 { 2293 /* If the address family is different, we need to check 2294 * whether the two addresses are equivalent (i.e. the IPv6 2295 * is synthesized from IPv4). 2296 */ 2297 pj_sockaddr synth_addr; 2298 pj_status_t status; 2299 2300 status = pj_sockaddr_synthesize(pj_AF_INET6(), &synth_addr, 2301 &check->rcand->addr); 2302 if (status == PJ_SUCCESS && 2303 pj_sockaddr_cmp(&synth_addr, src_addr) == 0) 2304 { 2305 source_addr = &check->rcand->addr; 2306 } 2307 } 2308 2309 if (pj_sockaddr_cmp(&check->rcand->addr, source_addr) != 0) { 2291 2310 status = PJNATH_EICEINSRCADDR; 2292 2311 LOG4((ice->obj_name, … … 2475 2494 pj_stun_tx_data *tdata; 2476 2495 pj_ice_rx_check *rcheck, tmp_rcheck; 2496 const pj_sockaddr_t *source_addr = src_addr; 2497 unsigned source_addr_len = src_addr_len; 2477 2498 pj_status_t status; 2478 2499 … … 2588 2609 } 2589 2610 2611 if (((pj_sockaddr *)src_addr)->addr.sa_family == pj_AF_INET6()) { 2612 unsigned i; 2613 unsigned transport_id = ((pj_ice_msg_data*)token)->transport_id; 2614 pj_ice_sess_cand *lcand = NULL; 2615 2616 for (i = 0; i < ice->clist.count; ++i) { 2617 pj_ice_sess_check *c = &ice->clist.checks[i]; 2618 if (c->lcand->comp_id == sd->comp_id && 2619 c->lcand->transport_id == transport_id) 2620 { 2621 lcand = c->lcand; 2622 break; 2623 } 2624 } 2625 2626 if (lcand != NULL && lcand->addr.addr.sa_family == pj_AF_INET()) { 2627 /* We are behind NAT64, so src_addr is a synthesized IPv6 2628 * address. Instead of putting this synth IPv6 address as 2629 * the XOR-MAPPED-ADDRESS, we need to find its original 2630 * IPv4 address. 2631 */ 2632 for (i = 0; i < ice->rcand_cnt; ++i) { 2633 pj_status_t status; 2634 pj_sockaddr synth_addr; 2635 2636 if (ice->rcand[i].addr.addr.sa_family != pj_AF_INET()) 2637 continue; 2638 2639 status = pj_sockaddr_synthesize(pj_AF_INET6(), &synth_addr, 2640 &ice->rcand[i].addr); 2641 if (status == PJ_SUCCESS && 2642 pj_sockaddr_cmp(src_addr, &synth_addr) == 0) 2643 { 2644 /* We find the original IPv4 address. */ 2645 source_addr = &ice->rcand[i].addr; 2646 source_addr_len = pj_sockaddr_get_len(source_addr); 2647 break; 2648 } 2649 } 2650 } 2651 } 2652 2653 2590 2654 /* Add XOR-MAPPED-ADDRESS attribute */ 2591 2655 status = pj_stun_msg_add_sockaddr_attr(tdata->pool, tdata->msg, 2592 2656 PJ_STUN_ATTR_XOR_MAPPED_ADDR, 2593 PJ_TRUE, src_addr, src_addr_len); 2657 PJ_TRUE, source_addr, 2658 source_addr_len); 2594 2659 2595 2660 /* Create a msg_data to be associated with this response */ … … 2620 2685 rcheck->comp_id = sd->comp_id; 2621 2686 rcheck->transport_id = ((pj_ice_msg_data*)token)->transport_id; 2622 rcheck->src_addr_len = s rc_addr_len;2623 pj_sockaddr_cp(&rcheck->src_addr, s rc_addr);2687 rcheck->src_addr_len = source_addr_len; 2688 pj_sockaddr_cp(&rcheck->src_addr, source_addr); 2624 2689 rcheck->use_candidate = (uc_attr != NULL); 2625 2690 rcheck->priority = prio_attr->value;
Note: See TracChangeset
for help on using the changeset viewer.