Changeset 54 for pjproject/trunk/pjsip/src/pjsip/sip_endpoint.c
- Timestamp:
- Nov 18, 2005 10:43:42 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip/sip_endpoint.c
r51 r54 33 33 #include <pj/assert.h> 34 34 #include <pj/errno.h> 35 35 #include <pj/lock.h> 36 36 37 37 #define PJSIP_EX_NO_MEMORY PJ_NO_MEMORY_EXCEPTION … … 64 64 65 65 /** Transport manager. */ 66 pjsip_transport_mgr *transport_mgr; 66 pjsip_tpmgr *transport_mgr; 67 68 /** Ioqueue. */ 69 pj_ioqueue_t *ioqueue; 67 70 68 71 /** DNS Resolver. */ … … 96 99 * Prototypes. 97 100 */ 98 static void endpt_transport_callback( pjsip_endpoint *, pjsip_rx_data *rdata ); 101 static void endpt_transport_callback(pjsip_endpoint*, 102 pj_status_t, pjsip_rx_data*); 99 103 100 104 … … 355 359 pjsip_endpoint *endpt; 356 360 pjsip_max_forwards_hdr *mf_hdr; 361 pj_lock_t *lock = NULL; 357 362 358 363 PJ_LOG(5, (THIS_FILE, "pjsip_endpt_create()")); … … 399 404 } 400 405 406 /* Set recursive lock for the timer heap. */ 407 status = pj_lock_create_recursive_mutex( endpt->pool, "edpt%p", &lock); 408 if (status != PJ_SUCCESS) { 409 goto on_error; 410 } 411 pj_timer_heap_set_lock(endpt->timer_heap, lock, PJ_TRUE); 412 413 /* Set maximum timed out entries to process in a single poll. */ 414 pj_timer_heap_set_max_timed_out_per_poll(endpt->timer_heap, 415 PJSIP_MAX_TIMED_OUT_ENTRIES); 416 417 /* Create ioqueue. */ 418 status = pj_ioqueue_create( endpt->pool, PJSIP_MAX_TRANSPORTS, &endpt->ioqueue); 419 if (status != PJ_SUCCESS) { 420 goto on_error; 421 } 422 401 423 /* Create transport manager. */ 402 status = pjsip_t ransport_mgr_create( endpt->pool,403 endpt,404 405 424 status = pjsip_tpmgr_create( endpt->pool, endpt, 425 endpt->ioqueue, endpt->timer_heap, 426 &endpt_transport_callback, 427 &endpt->transport_mgr); 406 428 if (status != PJ_SUCCESS) { 407 429 goto on_error; … … 446 468 on_error: 447 469 if (endpt->transport_mgr) { 448 pjsip_t ransport_mgr_destroy(endpt->transport_mgr);470 pjsip_tpmgr_destroy(endpt->transport_mgr); 449 471 endpt->transport_mgr = NULL; 450 472 } … … 471 493 472 494 /* Shutdown and destroy all transports. */ 473 pjsip_t ransport_mgr_destroy(endpt->transport_mgr);495 pjsip_tpmgr_destroy(endpt->transport_mgr); 474 496 475 497 /* Delete endpoint mutex. */ … … 533 555 const pj_time_val *max_timeout) 534 556 { 535 pj_time_val timeout;536 int i;557 /* timeout is 'out' var. This just to make compiler happy. */ 558 pj_time_val timeout = { 0, 0}; 537 559 538 560 PJ_LOG(5, (THIS_FILE, "pjsip_endpt_handle_events()")); 539 561 540 562 /* Poll the timer. The timer heap has its own mutex for better 541 * granularity, so we don't need to lock end endpoint. We also keep 542 * polling the timer while we have events. 563 * granularity, so we don't need to lock end endpoint. 543 564 */ 544 timeout.sec = timeout.msec = 0; /* timeout is 'out' var. This just to make compiler happy. */ 545 for (i=0; i<10; ++i) { 546 if (pj_timer_heap_poll( endpt->timer_heap, &timeout ) < 1) 547 break; 548 } 565 timeout.sec = timeout.msec = 0; 566 pj_timer_heap_poll( endpt->timer_heap, &timeout ); 549 567 550 568 /* If caller specifies maximum time to wait, then compare the value with … … 555 573 } 556 574 557 /* Poll events in the transport manager. */558 pj sip_transport_mgr_handle_events( endpt->transport_mgr, &timeout);575 /* Poll ioqueue. */ 576 pj_ioqueue_poll( endpt->ioqueue, &timeout); 559 577 } 560 578 … … 659 677 { 660 678 pjsip_role_e role; 661 if (rdata->msg ->type == PJSIP_REQUEST_MSG) {679 if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG) { 662 680 role = PJSIP_ROLE_UAS; 663 681 } else { 664 682 role = PJSIP_ROLE_UAC; 665 683 } 666 pjsip_tsx_create_key(rdata-> pool, &rdata->key, role,667 &rdata-> cseq->method, rdata);684 pjsip_tsx_create_key(rdata->tp_info.pool, &rdata->endpt_info.key, role, 685 &rdata->msg_info.cseq->method, rdata); 668 686 } 669 687 … … 673 691 */ 674 692 static void endpt_transport_callback( pjsip_endpoint *endpt, 693 pj_status_t status, 675 694 pjsip_rx_data *rdata ) 676 695 { 677 pjsip_msg *msg = rdata->msg ;696 pjsip_msg *msg = rdata->msg_info.msg; 678 697 pjsip_transaction *tsx; 679 698 pj_bool_t a_new_transaction_just_been_created = PJ_FALSE; 680 699 681 700 PJ_LOG(5, (THIS_FILE, "endpt_transport_callback(rdata=%p)", rdata)); 701 702 if (status != PJ_SUCCESS) { 703 const char *src_addr = pj_inet_ntoa(rdata->pkt_info.addr.sin_addr); 704 int port = pj_ntohs(rdata->pkt_info.addr.sin_port); 705 PJSIP_ENDPT_LOG_ERROR((endpt, "transport", status, 706 "Src.addr=%s:%d, packet:--\n" 707 "%s\n" 708 "-- end of packet. Error", 709 src_addr, port, rdata->msg_info.msg_buf)); 710 return; 711 } 682 712 683 713 /* For response, check that the value in Via sent-by match the transport. … … 688 718 const pj_sockaddr_in *addr; 689 719 const char *addr_addr; 690 int port = rdata-> via->sent_by.port;720 int port = rdata->msg_info.via->sent_by.port; 691 721 pj_bool_t mismatch = PJ_FALSE; 692 722 if (port == 0) { 693 723 int type; 694 type = pjsip_transport_get_type(rdata->transport);724 type = rdata->tp_info.transport->type; 695 725 port = pjsip_transport_get_default_port_for_type(type); 696 726 } 697 addr = pjsip_transport_get_addr_name(rdata->transport);727 addr = &rdata->tp_info.transport->public_addr; 698 728 addr_addr = pj_inet_ntoa(addr->sin_addr); 699 if (pj_strcmp2(&rdata-> via->sent_by.host, addr_addr) != 0)729 if (pj_strcmp2(&rdata->msg_info.via->sent_by.host, addr_addr) != 0) 700 730 mismatch = PJ_TRUE; 701 731 else if (port != pj_ntohs(addr->sin_port)) { … … 707 737 * both the port in sent-by and rport. We try to be lenient here! 708 738 */ 709 if (rdata-> via->rport_param != pj_sockaddr_in_get_port(addr))739 if (rdata->msg_info.via->rport_param != pj_sockaddr_in_get_port(addr)) 710 740 mismatch = PJ_TRUE; 711 741 else { … … 730 760 /* Find the transaction for the received message. */ 731 761 PJ_LOG(5, (THIS_FILE, "finding tsx with key=%.*s", 732 rdata-> key.slen, rdata->key.ptr));762 rdata->endpt_info.key.slen, rdata->endpt_info.key.ptr)); 733 763 734 764 /* Start lock mutex in the endpoint. */ … … 736 766 737 767 /* Find the transaction in the hash table. */ 738 tsx = pj_hash_get( endpt->tsx_table, rdata-> key.ptr, rdata->key.slen );768 tsx = pj_hash_get( endpt->tsx_table, rdata->endpt_info.key.ptr, rdata->endpt_info.key.slen ); 739 769 740 770 /* Unlock mutex. */ … … 753 783 /* Inform TU about the 200 message, only if it's INVITE. */ 754 784 if (PJSIP_IS_STATUS_IN_CLASS(msg->line.status.code, 200) && 755 rdata-> cseq->method.id == PJSIP_INVITE_METHOD)785 rdata->msg_info.cseq->method.id == PJSIP_INVITE_METHOD) 756 786 { 757 787 pjsip_event e; … … 777 807 * For non-ACK request message, create a new transaction. 778 808 */ 779 } else if (rdata->msg ->line.req.method.id != PJSIP_ACK_METHOD) {809 } else if (rdata->msg_info.msg->line.req.method.id != PJSIP_ACK_METHOD) { 780 810 781 811 pj_status_t status; … … 806 836 pjsip_tsx_on_rx_msg( tsx, rdata ); 807 837 808 } else if (rdata->msg ->line.req.method.id == PJSIP_ACK_METHOD) {838 } else if (rdata->msg_info.msg->line.req.method.id == PJSIP_ACK_METHOD) { 809 839 /* 810 840 * This is an ACK message, but the INVITE transaction could not … … 915 945 * Find/create transport. 916 946 */ 917 PJ_DEF(void) pjsip_endpt_get_transport( pjsip_endpoint *endpt, 918 pj_pool_t *pool, 919 pjsip_transport_type_e type, 920 const pj_sockaddr_in *remote, 921 void *token, 922 pjsip_transport_completion_callback *cb) 923 { 924 PJ_LOG(5, (THIS_FILE, "pjsip_endpt_get_transport()")); 925 pjsip_transport_get( endpt->transport_mgr, pool, type, 926 remote, token, cb); 927 } 928 929 930 PJ_DEF(pj_status_t) pjsip_endpt_create_listener( pjsip_endpoint *endpt, 931 pjsip_transport_type_e type, 932 pj_sockaddr_in *addr, 933 const pj_sockaddr_in *addr_name) 934 { 935 PJ_LOG(5, (THIS_FILE, "pjsip_endpt_create_listener()")); 936 return pjsip_create_listener( endpt->transport_mgr, type, addr, addr_name ); 937 } 938 939 PJ_DEF(pj_status_t) pjsip_endpt_create_udp_listener( pjsip_endpoint *endpt, 940 pj_sock_t sock, 941 const pj_sockaddr_in *addr_name) 942 { 943 PJ_LOG(5, (THIS_FILE, "pjsip_endpt_create_udp_listener()")); 944 return pjsip_create_udp_listener( endpt->transport_mgr, sock, addr_name ); 945 } 947 PJ_DECL(pj_status_t) pjsip_endpt_alloc_transport( pjsip_endpoint *endpt, 948 pjsip_transport_type_e type, 949 const pj_sockaddr_in *remote, 950 pjsip_transport **p_transport) 951 { 952 PJ_LOG(5, (THIS_FILE, "pjsip_endpt_alloc_transport()")); 953 return pjsip_tpmgr_alloc_transport( endpt->transport_mgr, type, remote, 954 p_transport); 955 } 956 946 957 947 958 PJ_DEF(void) pjsip_endpt_dump( pjsip_endpoint *endpt, pj_bool_t detail ) … … 949 960 #if PJ_LOG_MAX_LEVEL >= 3 950 961 unsigned count; 951 pj_hash_iterator_t itr_val;952 pj_hash_iterator_t *itr;953 962 954 963 PJ_LOG(5, (THIS_FILE, "pjsip_endpt_dump()")); … … 1015 1024 1016 1025 /* Transports. 1017 * Note: transport is not properly locked in this function.1018 * See pjsip_transport_first, pjsip_transport_next.1019 1026 */ 1020 itr = pjsip_transport_first( endpt->transport_mgr, &itr_val ); 1021 if (itr) { 1022 PJ_LOG(3, (THIS_FILE, " Dumping transports:")); 1023 1024 do { 1025 char src_addr[128], dst_addr[128]; 1026 int src_port, dst_port; 1027 const pj_sockaddr_in *addr; 1028 pjsip_transport_t *t; 1029 1030 t = pjsip_transport_this(endpt->transport_mgr, itr); 1031 addr = pjsip_transport_get_local_addr(t); 1032 pj_native_strcpy(src_addr, pj_inet_ntoa(addr->sin_addr)); 1033 src_port = pj_ntohs(addr->sin_port); 1034 1035 addr = pjsip_transport_get_remote_addr(t); 1036 pj_native_strcpy(dst_addr, pj_inet_ntoa(addr->sin_addr)); 1037 dst_port = pj_ntohs(addr->sin_port); 1038 1039 PJ_LOG(3, (THIS_FILE, " %s %s %s:%d --> %s:%d (refcnt=%d)", 1040 pjsip_transport_get_type_name(t), 1041 pjsip_transport_get_obj_name(t), 1042 src_addr, src_port, 1043 dst_addr, dst_port, 1044 pjsip_transport_get_ref_cnt(t))); 1045 1046 itr = pjsip_transport_next(endpt->transport_mgr, itr); 1047 } while (itr); 1048 } 1027 pjsip_tpmgr_dump_transports( endpt->transport_mgr ); 1049 1028 1050 1029 /* Timer. */
Note: See TracChangeset
for help on using the changeset viewer.