Changeset 568 for pjproject/trunk/pjmedia/src/pjmedia/transport_udp.c
- Timestamp:
- Jun 29, 2006 2:45:17 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/src/pjmedia/transport_udp.c
r558 r568 72 72 pj_sock_t rtcp_sock; /**< RTCP socket */ 73 73 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. */ 74 76 pj_ioqueue_key_t *rtcp_key; /**< RTCP socket key in ioqueue */ 75 77 pj_ioqueue_op_key_t rtcp_read_op; /**< Pending read operation */ … … 90 92 void *user_data, 91 93 const pj_sockaddr_t *rem_addr, 94 const pj_sockaddr_t *rem_rtcp, 92 95 unsigned addr_len, 93 96 void (*rtp_cb)(void*, … … 276 279 /* Kick of pending RTCP read from the ioqueue */ 277 280 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); 280 285 if (status != PJ_EPENDING) 281 286 goto on_error; … … 385 390 if (udp->rtp_src_cnt >= PJMEDIA_RTP_NAT_PROBATION_CNT) { 386 391 387 pj_uint16_t port;388 389 392 /* Set remote RTP address to source address */ 390 393 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);398 394 399 395 /* Reset counter */ … … 404 400 pj_inet_ntoa(udp->rtp_src_addr.sin_addr), 405 401 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 } 406 424 } 407 425 } … … 441 459 (*cb)(user_data, udp->rtcp_pkt, bytes_read); 442 460 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 443 479 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); 446 485 447 486 } while (status == PJ_SUCCESS); … … 453 492 void *user_data, 454 493 const pj_sockaddr_t *rem_addr, 494 const pj_sockaddr_t *rem_rtcp, 455 495 unsigned addr_len, 456 496 void (*rtp_cb)(void*, … … 462 502 { 463 503 struct transport_udp *udp = (struct transport_udp*) tp; 504 const pj_sockaddr_in *rtcp_addr; 464 505 465 506 /* Validate arguments */ … … 474 515 pj_memcpy(&udp->rem_rtp_addr, rem_addr, sizeof(pj_sockaddr_in)); 475 516 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 } 480 530 481 531 /* Save the callbacks */
Note: See TracChangeset
for help on using the changeset viewer.