Changeset 105 for pjproject/trunk/pjsip/src/pjsip/sip_transport.c
- Timestamp:
- Dec 26, 2005 12:52:19 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip/sip_transport.c
r80 r105 47 47 }; 48 48 49 50 51 49 /***************************************************************************** 52 50 * … … 82 80 unsigned i; 83 81 82 /* Sanity check. 83 * Check that transport_names[] are indexed on transport type. 84 */ 85 PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 86 PJSIP_TRANSPORT_UDP, PJSIP_TRANSPORT_UNSPECIFIED); 87 88 /* Get transport type from name. */ 84 89 for (i=0; i<PJ_ARRAY_SIZE(transport_names); ++i) { 85 90 if (pj_stricmp(name, &transport_names[i].name) == 0) { … … 101 106 unsigned i; 102 107 108 /* Sanity check. 109 * Check that transport_names[] are indexed on transport type. 110 */ 111 PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 112 PJSIP_TRANSPORT_UDP, PJSIP_TRANSPORT_UNSPECIFIED); 113 114 /* Get the transport type for the specified flags. */ 103 115 for (i=0; i<PJ_ARRAY_SIZE(transport_names); ++i) { 104 116 if (transport_names[i].flag == flag) { … … 114 126 pjsip_transport_get_flag_from_type( pjsip_transport_type_e type ) 115 127 { 128 /* Sanity check. 129 * Check that transport_names[] are indexed on transport type. 130 */ 131 PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 132 PJSIP_TRANSPORT_UDP, 0); 133 134 /* Check that argument is valid. */ 116 135 PJ_ASSERT_RETURN(type < PJ_ARRAY_SIZE(transport_names), 0); 136 137 /* Return transport flag. */ 117 138 return transport_names[type].flag; 118 139 } … … 124 145 pjsip_transport_get_default_port_for_type(pjsip_transport_type_e type) 125 146 { 147 /* Sanity check. 148 * Check that transport_names[] are indexed on transport type. 149 */ 150 PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 151 PJSIP_TRANSPORT_UDP, 0); 152 153 /* Check that argument is valid. */ 126 154 PJ_ASSERT_RETURN(type < PJ_ARRAY_SIZE(transport_names), 5060); 155 156 /* Return the port. */ 127 157 return transport_names[type].port; 128 158 } … … 225 255 *****************************************************************************/ 226 256 227 /*228 * Transport key for indexing in the hash table.229 */230 typedef struct transport_key231 {232 pj_uint8_t type;233 pj_uint8_t zero;234 pj_uint16_t port;235 pj_uint32_t addr;236 } transport_key;237 238 257 239 258 /***************************************************************************** … … 270 289 PJ_DEF(pj_status_t) pjsip_transport_send( pjsip_transport *tr, 271 290 pjsip_tx_data *tdata, 272 const pj_sockaddr_in *addr, 291 const pj_sockaddr *addr, 292 int addr_len, 273 293 void *token, 274 294 void (*cb)(void *token, … … 318 338 319 339 /* Send to transport. */ 320 status = (*tr->send_msg)(tr, tdata, addr, (void*)tdata,340 status = (*tr->send_msg)(tr, tdata, addr, addr_len, (void*)tdata, 321 341 &transport_send_callback); 322 342 … … 396 416 pjsip_transport *tp ) 397 417 { 398 transport_key key;418 int key_len; 399 419 400 420 /* Init. */ … … 407 427 * Register to hash table. 408 428 */ 409 key.type = (pj_uint8_t)tp->type; 410 key.zero = 0; 411 key.addr = pj_ntohl(tp->rem_addr.sin_addr.s_addr); 412 key.port = pj_ntohs(tp->rem_addr.sin_port); 413 429 key_len = sizeof(tp->key.type) + tp->addr_len; 414 430 pj_lock_acquire(mgr->lock); 415 pj_hash_set(tp->pool, mgr->table, & key, sizeof(key), tp);431 pj_hash_set(tp->pool, mgr->table, &tp->key, key_len, tp); 416 432 pj_lock_release(mgr->lock); 417 433 … … 426 442 pjsip_transport *tp) 427 443 { 428 transport_key key; 429 444 int key_len; 445 446 /* Must have no user. */ 430 447 PJ_ASSERT_RETURN(pj_atomic_get(tp->ref_cnt) == 0, PJSIP_EBUSY); 431 448 … … 445 462 * Unregister from hash table. 446 463 */ 447 key.type = (pj_uint8_t)tp->type; 448 key.zero = 0; 449 key.addr = pj_ntohl(tp->rem_addr.sin_addr.s_addr); 450 key.port = pj_ntohs(tp->rem_addr.sin_port); 451 452 pj_hash_set(tp->pool, mgr->table, &key, sizeof(key), NULL); 464 key_len = sizeof(tp->key.type) + tp->addr_len; 465 pj_hash_set(tp->pool, mgr->table, &tp->key, key_len, NULL); 453 466 454 467 pj_lock_release(mgr->lock); … … 602 615 { 603 616 pjsip_transport *tr = rdata->tp_info.transport; 604 pj_str_t s;605 617 606 618 char *current_pkt; … … 683 695 * MUST add received parameter to the via. 684 696 */ 685 s = pj_str(pj_inet_ntoa(rdata->pkt_info.addr.sin_addr)); 686 if (pj_strcmp(&s, &rdata->msg_info.via->sent_by.host) != 0) { 687 pj_strdup(rdata->tp_info.pool, 688 &rdata->msg_info.via->recvd_param, &s); 697 if (pj_strcmp2(&rdata->msg_info.via->sent_by.host, 698 rdata->pkt_info.src_name) != 0) 699 { 700 pj_strdup2(rdata->tp_info.pool, 701 &rdata->msg_info.via->recvd_param, 702 rdata->pkt_info.src_name); 689 703 } 690 704 … … 693 707 */ 694 708 if (rdata->msg_info.via->rport_param == 0) { 695 rdata->msg_info.via->rport_param = 696 pj_ntohs(rdata->pkt_info.addr.sin_port); 709 rdata->msg_info.via->rport_param = rdata->pkt_info.src_port; 697 710 } 698 711 … … 736 749 PJ_DEF(pj_status_t) pjsip_tpmgr_alloc_transport( pjsip_tpmgr *mgr, 737 750 pjsip_transport_type_e type, 738 const pj_sockaddr_in *remote, 751 const pj_sockaddr_t *remote, 752 int addr_len, 739 753 pjsip_transport **p_transport) 740 754 { 741 transport_key key; 755 struct transport_key 756 { 757 pjsip_transport_type_e type; 758 pj_sockaddr addr; 759 } key; 760 int key_len; 742 761 pjsip_transport *transport; 743 762 pjsip_tpfactory *factory; … … 746 765 pj_lock_acquire(mgr->lock); 747 766 767 key_len = sizeof(key.type) + addr_len; 768 748 769 /* First try to get exact destination. */ 749 key.type = (pj_uint8_t)type; 750 key.zero = 0; 751 key.addr = pj_ntohl(remote->sin_addr.s_addr); 752 key.port = pj_ntohs(remote->sin_port); 753 754 transport = pj_hash_get(mgr->table, &key, sizeof(key)); 755 if (transport != NULL) { 770 key.type = type; 771 pj_memcpy(&key.addr, remote, addr_len); 772 773 transport = pj_hash_get(mgr->table, &key, key_len); 774 if (transport == NULL) { 756 775 unsigned flag = pjsip_transport_get_flag_from_type(type); 757 758 /* For datagram transports, try lookup with zero address. */ 759 if (flag & PJSIP_TRANSPORT_DATAGRAM) { 760 key.addr = 0; 761 key.port = 0; 762 763 transport = pj_hash_get(mgr->table, &key, sizeof(key)); 776 const pj_sockaddr *remote_addr = (const pj_sockaddr*)remote; 777 778 /* For datagram transports, try lookup with zero address. 779 */ 780 if ( (flag & PJSIP_TRANSPORT_DATAGRAM) && 781 (remote_addr->sa_family == PJ_AF_INET)) 782 { 783 pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.addr; 784 785 pj_memset(addr, 0, sizeof(pj_sockaddr_in)); 786 addr->sin_family = PJ_AF_INET; 787 addr->sin_addr.s_addr = 0; 788 addr->sin_port = 0; 789 790 key_len = sizeof(key.type) + sizeof(pj_sockaddr_in); 791 transport = pj_hash_get(mgr->table, &key, key_len); 764 792 } 765 793 } … … 816 844 817 845 do { 818 char src_addr[128], dst_addr[128]; 819 int src_port, dst_port; 820 pjsip_transport *t; 821 822 t = pj_hash_this(mgr->table, itr); 823 pj_native_strcpy(src_addr, pj_inet_ntoa(t->local_addr.sin_addr)); 824 src_port = pj_ntohs(t->local_addr.sin_port); 825 826 pj_native_strcpy(dst_addr, pj_inet_ntoa(t->rem_addr.sin_addr)); 827 dst_port = pj_ntohs(t->rem_addr.sin_port); 828 829 PJ_LOG(3, (THIS_FILE, " %s %s %s:%d --> %s:%d (refcnt=%d)", 830 t->type_name, 846 pjsip_transport *t = pj_hash_this(mgr->table, itr); 847 848 PJ_LOG(3, (THIS_FILE, " %s %s (refcnt=%d)", 831 849 t->obj_name, 832 src_addr, src_port, 833 dst_addr, dst_port, 850 t->info, 834 851 pj_atomic_get(t->ref_cnt))); 835 852
Note: See TracChangeset
for help on using the changeset viewer.