Changeset 4262 for pjproject/trunk/pjsip/src/pjsip/sip_transport_tcp.c
- Timestamp:
- Sep 20, 2012 6:00:23 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip/sip_transport_tcp.c
r4260 r4262 58 58 pjsip_tpmgr *tpmgr; 59 59 pj_activesock_t *asock; 60 pj_sockaddr bound_addr; 60 61 pj_qos_type qos_type; 61 62 pj_qos_params qos_params; … … 142 143 pj_pool_t *pool, 143 144 pj_sock_t sock, pj_bool_t is_server, 144 const pj_sockaddr _in*local,145 const pj_sockaddr _in*remote,145 const pj_sockaddr *local, 146 const pj_sockaddr *remote, 146 147 struct tcp_transport **p_tcp); 147 148 … … 160 161 static void sockaddr_to_host_port( pj_pool_t *pool, 161 162 pjsip_host_port *host_port, 162 const pj_sockaddr _in*addr )163 const pj_sockaddr *addr ) 163 164 { 164 165 host_port->host.ptr = (char*) pj_pool_alloc(pool, PJ_INET6_ADDRSTRLEN+4); 165 pj_sockaddr_print(addr, host_port->host.ptr, PJ_INET6_ADDRSTRLEN+4, 2);166 pj_sockaddr_print(addr, host_port->host.ptr, PJ_INET6_ADDRSTRLEN+4, 0); 166 167 host_port->host.slen = pj_ansi_strlen(host_port->host.ptr); 167 168 host_port->port = pj_sockaddr_get_port(addr); … … 268 269 listener = PJ_POOL_ZALLOC_T(pool, struct tcp_listener); 269 270 listener->factory.pool = pool; 270 listener->factory.type = PJSIP_TRANSPORT_TCP; 271 listener->factory.type_name = "tcp"; 271 listener->factory.type = cfg->af==pj_AF_INET() ? PJSIP_TRANSPORT_TCP : 272 PJSIP_TRANSPORT_TCP6; 273 listener->factory.type_name = (char*) 274 pjsip_transport_get_type_name(listener->factory.type); 272 275 listener->factory.flag = 273 pjsip_transport_get_flag_from_type( PJSIP_TRANSPORT_TCP);276 pjsip_transport_get_flag_from_type(listener->factory.type); 274 277 listener->qos_type = cfg->qos_type; 275 278 pj_memcpy(&listener->qos_params, &cfg->qos_params, … … 277 280 278 281 pj_ansi_strcpy(listener->factory.obj_name, "tcplis"); 279 280 status = pj_lock_create_recursive_mutex(pool, "tcplis", 282 if (listener->factory.type==PJSIP_TRANSPORT_TCP6) 283 pj_ansi_strcat(listener->factory.obj_name, "6"); 284 285 status = pj_lock_create_recursive_mutex(pool, listener->factory.obj_name, 281 286 &listener->factory.lock); 282 287 if (status != PJ_SUCCESS) … … 293 298 2, listener->factory.obj_name, 294 299 "SIP TCP listener socket"); 300 301 /* Bind address may be different than factory.local_addr because 302 * factory.local_addr will be resolved below. 303 */ 304 pj_sockaddr_cp(&listener->bound_addr, &cfg->bind_addr); 295 305 296 306 /* Bind socket */ … … 328 338 pj_sockaddr hostip; 329 339 330 status = pj_gethostip(pj_AF_INET(), &hostip); 340 status = pj_gethostip(listener->bound_addr.addr.sa_family, 341 &hostip); 331 342 if (status != PJ_SUCCESS) 332 343 goto on_error; 333 344 334 pj_memcpy(pj_sockaddr_get_addr(listener_addr), 335 pj_sockaddr_get_addr(&hostip), 336 pj_sockaddr_get_addr_len(&hostip)); 345 pj_sockaddr_copy_addr(listener_addr, &hostip); 337 346 } 338 347 … … 340 349 sockaddr_to_host_port(listener->factory.pool, 341 350 &listener->factory.addr_name, 342 (pj_sockaddr_in*)listener_addr);351 listener_addr); 343 352 } 344 353 … … 537 546 pj_pool_t *pool, 538 547 pj_sock_t sock, pj_bool_t is_server, 539 const pj_sockaddr _in*local,540 const pj_sockaddr _in*remote,548 const pj_sockaddr *local, 549 const pj_sockaddr *remote, 541 550 struct tcp_transport **p_tcp) 542 551 { … … 546 555 pj_activesock_cb tcp_callback; 547 556 const pj_str_t ka_pkt = PJSIP_TCP_KEEP_ALIVE_DATA; 557 char print_addr[PJ_INET6_ADDRSTRLEN+10]; 548 558 pj_status_t status; 549 559 … … 581 591 } 582 592 583 tcp->base.key.type = PJSIP_TRANSPORT_TCP; 584 pj_memcpy(&tcp->base.key.rem_addr, remote, sizeof(pj_sockaddr_in)); 585 tcp->base.type_name = "tcp"; 586 tcp->base.flag = pjsip_transport_get_flag_from_type(PJSIP_TRANSPORT_TCP); 593 tcp->base.key.type = listener->factory.type; 594 pj_sockaddr_cp(&tcp->base.key.rem_addr, remote); 595 tcp->base.type_name = (char*) 596 pjsip_transport_get_type_name(tcp->base.key.type); 597 tcp->base.flag = pjsip_transport_get_flag_from_type(tcp->base.key.type); 587 598 588 599 tcp->base.info = (char*) pj_pool_alloc(pool, 64); 589 pj_ansi_snprintf(tcp->base.info, 64, "TCP to %s:%d", 590 pj_inet_ntoa(remote->sin_addr), 591 (int)pj_ntohs(remote->sin_port)); 592 593 tcp->base.addr_len = sizeof(pj_sockaddr_in); 594 pj_memcpy(&tcp->base.local_addr, local, sizeof(pj_sockaddr_in)); 600 pj_ansi_snprintf(tcp->base.info, 64, "%s to %s", 601 tcp->base.type_name, 602 pj_sockaddr_print(remote, print_addr, 603 sizeof(print_addr), 3)); 604 605 tcp->base.addr_len = pj_sockaddr_get_len(remote); 606 pj_sockaddr_cp(&tcp->base.local_addr, local); 595 607 sockaddr_to_host_port(pool, &tcp->base.local_name, local); 596 608 sockaddr_to_host_port(pool, &tcp->base.remote_name, remote); … … 602 614 tcp->base.do_shutdown = &tcp_shutdown; 603 615 tcp->base.destroy = &tcp_destroy_transport; 604 605 616 606 617 /* Create active socket */ … … 802 813 pj_pool_t *pool; 803 814 pj_ssize_t size; 804 pj_sockaddr _in*rem_addr;815 pj_sockaddr *rem_addr; 805 816 void *readbuf[1]; 806 817 pj_status_t status; … … 825 836 826 837 tcp->rdata.pkt_info.src_addr = tcp->base.key.rem_addr; 827 tcp->rdata.pkt_info.src_addr_len = sizeof( pj_sockaddr_in);828 rem_addr = (pj_sockaddr_in*)&tcp->base.key.rem_addr;829 pj_ ansi_strcpy(tcp->rdata.pkt_info.src_name,830 pj_inet_ntoa(rem_addr->sin_addr));831 tcp->rdata.pkt_info.src_port = pj_ ntohs(rem_addr->sin_port);838 tcp->rdata.pkt_info.src_addr_len = sizeof(tcp->rdata.pkt_info.src_addr); 839 rem_addr = &tcp->base.key.rem_addr; 840 pj_sockaddr_print(rem_addr, tcp->rdata.pkt_info.src_name, 841 sizeof(tcp->rdata.pkt_info.src_name), 0); 842 tcp->rdata.pkt_info.src_port = pj_sockaddr_get_port(rem_addr); 832 843 833 844 size = sizeof(tcp->rdata.pkt_info.packet); … … 859 870 struct tcp_transport *tcp; 860 871 pj_sock_t sock; 861 pj_sockaddr _inlocal_addr;872 pj_sockaddr local_addr; 862 873 pj_status_t status; 863 874 … … 866 877 addr_len && p_transport, PJ_EINVAL); 867 878 868 /* Check that address is a sockaddr_in */ 869 PJ_ASSERT_RETURN(rem_addr->addr.sa_family == pj_AF_INET() && 870 addr_len == sizeof(pj_sockaddr_in), PJ_EINVAL); 879 /* Check that address is a sockaddr_in or sockaddr_in6*/ 880 PJ_ASSERT_RETURN((rem_addr->addr.sa_family == pj_AF_INET() && 881 addr_len == sizeof(pj_sockaddr_in)) || 882 (rem_addr->addr.sa_family == pj_AF_INET6() && 883 addr_len == sizeof(pj_sockaddr_in6)), PJ_EINVAL); 871 884 872 885 873 886 listener = (struct tcp_listener*)factory; 874 887 875 876 888 /* Create socket */ 877 status = pj_sock_socket(pj_AF_INET(), pj_SOCK_STREAM(), 0, &sock); 889 status = pj_sock_socket(rem_addr->addr.sa_family, pj_SOCK_STREAM(), 890 0, &sock); 878 891 if (status != PJ_SUCCESS) 879 892 return status; … … 885 898 "outgoing SIP TCP socket"); 886 899 887 /* Bind to any port */ 888 status = pj_sock_bind_in(sock, 0, 0); 900 /* Bind to listener's address and any port */ 901 pj_bzero(&local_addr, sizeof(local_addr)); 902 pj_sockaddr_cp(&local_addr, &listener->bound_addr); 903 pj_sockaddr_set_port(&local_addr, 0); 904 905 status = pj_sock_bind(sock, &local_addr, 906 pj_sockaddr_get_len(&local_addr)); 889 907 if (status != PJ_SUCCESS) { 890 908 pj_sock_close(sock); … … 893 911 894 912 /* Get the local port */ 895 addr_len = sizeof( pj_sockaddr_in);913 addr_len = sizeof(local_addr); 896 914 status = pj_sock_getsockname(sock, &local_addr, &addr_len); 897 915 if (status != PJ_SUCCESS) { … … 901 919 902 920 /* Initially set the address from the listener's address */ 903 local_addr.sin_addr.s_addr = 904 ((pj_sockaddr_in*)&listener->factory.local_addr)->sin_addr.s_addr; 921 if (!pj_sockaddr_has_addr(&local_addr)) { 922 pj_sockaddr_copy_addr(&local_addr, &listener->factory.local_addr); 923 } 905 924 906 925 /* Create the transport descriptor */ 907 926 status = tcp_create(listener, NULL, sock, PJ_FALSE, &local_addr, 908 (pj_sockaddr_in*)rem_addr, &tcp);927 rem_addr, &tcp); 909 928 if (status != PJ_SUCCESS) 910 929 return status; … … 914 933 tcp->has_pending_connect = PJ_TRUE; 915 934 status = pj_activesock_start_connect(tcp->asock, tcp->base.pool, rem_addr, 916 sizeof(pj_sockaddr_in));935 addr_len); 917 936 if (status == PJ_SUCCESS) { 918 937 on_connect_complete(tcp->asock, PJ_SUCCESS); … … 926 945 * set is different now that asynchronous connect() is started. 927 946 */ 928 addr_len = sizeof( pj_sockaddr_in);947 addr_len = sizeof(local_addr); 929 948 if (pj_sock_getsockname(sock, &local_addr, &addr_len)==PJ_SUCCESS) { 930 pj_sockaddr _in *tp_addr = (pj_sockaddr_in*)&tcp->base.local_addr;949 pj_sockaddr *tp_addr = &tcp->base.local_addr; 931 950 932 951 /* Some systems (like old Win32 perhaps) may not set local address 933 952 * properly before socket is fully connected. 934 953 */ 935 if ( tp_addr->sin_addr.s_addr != local_addr.sin_addr.s_addr&&936 local_addr.sin_addr.s_addr != 0)954 if (pj_sockaddr_cmp(tp_addr, &local_addr) && 955 pj_sockaddr_get_port(&local_addr) != 0) 937 956 { 938 tp_addr->sin_addr.s_addr = local_addr.sin_addr.s_addr; 939 tp_addr->sin_port = local_addr.sin_port; 957 pj_sockaddr_cp(tp_addr, &local_addr); 940 958 sockaddr_to_host_port(tcp->base.pool, &tcp->base.local_name, 941 959 &local_addr); … … 973 991 char addr[PJ_INET6_ADDRSTRLEN+10]; 974 992 pjsip_tp_state_callback state_cb; 993 pj_sockaddr tmp_src_addr; 975 994 pj_status_t status; 976 995 … … 996 1015 "incoming SIP TCP socket"); 997 1016 1017 /* tcp_create() expect pj_sockaddr, so copy src_addr to temporary var, 1018 * just in case. 1019 */ 1020 pj_bzero(&tmp_src_addr, sizeof(tmp_src_addr)); 1021 pj_sockaddr_cp(&tmp_src_addr, src_addr); 1022 998 1023 /* 999 1024 * Incoming connection! … … 1001 1026 */ 1002 1027 status = tcp_create( listener, NULL, sock, PJ_TRUE, 1003 (const pj_sockaddr_in*)&listener->factory.local_addr,1004 (const pj_sockaddr_in*)src_addr, &tcp);1028 &listener->factory.local_addr, 1029 &tmp_src_addr, &tcp); 1005 1030 if (status == PJ_SUCCESS) { 1006 1031 status = tcp_start_read(tcp); … … 1106 1131 1107 1132 /* Check the address is supported */ 1108 PJ_ASSERT_RETURN(rem_addr && addr_len==sizeof(pj_sockaddr_in), PJ_EINVAL);1109 1110 1133 PJ_ASSERT_RETURN(rem_addr && (addr_len==sizeof(pj_sockaddr_in) || 1134 addr_len==sizeof(pj_sockaddr_in6)), 1135 PJ_EINVAL); 1111 1136 1112 1137 /* Init op key. */ … … 1289 1314 { 1290 1315 struct tcp_transport *tcp; 1291 pj_sockaddr _inaddr;1316 pj_sockaddr addr; 1292 1317 int addrlen; 1293 1318 pjsip_tp_state_callback state_cb; … … 1334 1359 * on some systems, like old Win32 probably?). 1335 1360 */ 1336 addrlen = sizeof( pj_sockaddr_in);1361 addrlen = sizeof(addr); 1337 1362 if (pj_sock_getsockname(tcp->sock, &addr, &addrlen)==PJ_SUCCESS) { 1338 pj_sockaddr _in *tp_addr = (pj_sockaddr_in*)&tcp->base.local_addr;1363 pj_sockaddr *tp_addr = &tcp->base.local_addr; 1339 1364 1340 1365 if (pj_sockaddr_has_addr(&addr) && 1341 tp_addr->sin_addr.s_addr != addr.sin_addr.s_addr)1366 pj_sockaddr_cmp(&addr, tp_addr) != 0) 1342 1367 { 1343 tp_addr->sin_addr.s_addr = addr.sin_addr.s_addr; 1344 tp_addr->sin_port = addr.sin_port; 1368 pj_sockaddr_cp(tp_addr, &addr); 1345 1369 sockaddr_to_host_port(tcp->base.pool, &tcp->base.local_name, 1346 1370 tp_addr);
Note: See TracChangeset
for help on using the changeset viewer.