Changes in uspace/srv/net/tl/tcp/tcp.c [0578271:89e57cee] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tl/tcp/tcp.c
r0578271 r89e57cee 47 47 #include <stdio.h> 48 48 #include <errno.h> 49 #include <err.h> 49 50 50 51 #include <ipc/ipc.h> … … 234 235 int tcp_initialize(async_client_conn_t client_connection) 235 236 { 236 int rc;237 ERROR_DECLARE; 237 238 238 239 assert(client_connection); … … 245 246 tcp_globals.ip_phone = ip_bind_service(SERVICE_IP, IPPROTO_TCP, 246 247 SERVICE_TCP, client_connection); 247 if (tcp_globals.ip_phone < 0) { 248 fibril_rwlock_write_unlock(&tcp_globals.lock); 248 if (tcp_globals.ip_phone < 0) 249 249 return tcp_globals.ip_phone; 250 }251 250 252 rc = socket_ports_initialize(&tcp_globals.sockets); 253 if (rc != EOK) 254 goto out; 255 256 rc = packet_dimensions_initialize(&tcp_globals.dimensions); 257 if (rc != EOK) { 251 ERROR_PROPAGATE(socket_ports_initialize(&tcp_globals.sockets)); 252 if (ERROR_OCCURRED(packet_dimensions_initialize( 253 &tcp_globals.dimensions))) { 258 254 socket_ports_destroy(&tcp_globals.sockets); 259 goto out;255 return ERROR_CODE; 260 256 } 261 257 262 258 tcp_globals.last_used_port = TCP_FREE_PORTS_START - 1; 263 264 out:265 259 fibril_rwlock_write_unlock(&tcp_globals.lock); 266 return rc; 260 261 return EOK; 267 262 } 268 263 … … 271 266 services_t error) 272 267 { 273 int rc;268 ERROR_DECLARE; 274 269 275 270 if (receiver != SERVICE_TCP) … … 277 272 278 273 fibril_rwlock_write_lock(&tcp_globals.lock); 279 rc = tcp_process_packet(device_id, packet, error); 280 if (rc != EOK) 274 if (ERROR_OCCURRED(tcp_process_packet(device_id, packet, error))) 281 275 fibril_rwlock_write_unlock(&tcp_globals.lock); 282 276 283 printf("receive %d \n", rc);284 285 return rc;277 printf("receive %d \n", ERROR_CODE); 278 279 return ERROR_CODE; 286 280 } 287 281 288 282 int tcp_process_packet(device_id_t device_id, packet_t packet, services_t error) 289 283 { 284 ERROR_DECLARE; 285 290 286 size_t length; 291 287 size_t offset; … … 303 299 struct sockaddr *dest; 304 300 size_t addrlen; 305 int rc;306 301 307 302 switch (error) { … … 316 311 317 312 length = (size_t) result; 318 rc = packet_trim(packet, length, 0); 319 if (rc != EOK) 320 return tcp_release_and_return(packet, rc); 313 if (ERROR_OCCURRED(packet_trim(packet, length, 0))) 314 return tcp_release_and_return(packet, ERROR_CODE); 321 315 break; 322 316 default: … … 339 333 340 334 // trim all but TCP header 341 rc = packet_trim(packet, offset, 0); 342 if (rc != EOK) 343 return tcp_release_and_return(packet, rc); 335 if (ERROR_OCCURRED(packet_trim(packet, offset, 0))) 336 return tcp_release_and_return(packet, ERROR_CODE); 344 337 345 338 // get tcp header … … 357 350 addrlen = (size_t) result; 358 351 359 rc = tl_set_address_port(src, addrlen, ntohs(header->source_port));360 if (rc != EOK)361 return tcp_release_and_return(packet, rc);352 if (ERROR_OCCURRED(tl_set_address_port(src, addrlen, 353 ntohs(header->source_port)))) 354 return tcp_release_and_return(packet, ERROR_CODE); 362 355 363 356 // find the destination socket … … 420 413 } 421 414 422 rc = ip_client_get_pseudo_header(IPPROTO_TCP, src, addrlen, 423 dest, addrlen, total_length, &socket_data->pseudo_header, 424 &socket_data->headerlen); 425 if (rc != EOK) { 415 if (ERROR_OCCURRED(ip_client_get_pseudo_header(IPPROTO_TCP, src, 416 addrlen, dest, addrlen, total_length, 417 &socket_data->pseudo_header, &socket_data->headerlen))) { 426 418 fibril_rwlock_write_unlock(socket_data->local_lock); 427 return tcp_release_and_return(packet, rc); 428 } 429 } else { 430 rc = ip_client_set_pseudo_header_data_length( 431 socket_data->pseudo_header, socket_data->headerlen, 432 total_length); 433 if (rc != EOK) { 434 fibril_rwlock_write_unlock(socket_data->local_lock); 435 return tcp_release_and_return(packet, rc); 436 } 419 return tcp_release_and_return(packet, ERROR_CODE); 420 } 421 422 } else if (ERROR_OCCURRED(ip_client_set_pseudo_header_data_length( 423 socket_data->pseudo_header, socket_data->headerlen, 424 total_length))) { 425 fibril_rwlock_write_unlock(socket_data->local_lock); 426 return tcp_release_and_return(packet, ERROR_CODE); 437 427 } 438 428 … … 444 434 fibril_rwlock_write_unlock(socket_data->local_lock); 445 435 446 rc = tl_prepare_icmp_packet(tcp_globals.net_phone, 447 tcp_globals.icmp_phone, packet, error); 448 if (rc == EOK) { 436 if (ERROR_NONE(tl_prepare_icmp_packet(tcp_globals.net_phone, 437 tcp_globals.icmp_phone, packet, error))) { 449 438 // checksum error ICMP 450 439 icmp_parameter_problem_msg(tcp_globals.icmp_phone, … … 463 452 switch (socket_data->state) { 464 453 case TCP_SOCKET_LISTEN: 465 rc = tcp_process_listen(socket, socket_data, header, packet,466 src, dest, addrlen);454 ERROR_CODE = tcp_process_listen(socket, socket_data, header, 455 packet, src, dest, addrlen); 467 456 break; 468 457 case TCP_SOCKET_SYN_RECEIVED: 469 rc = tcp_process_syn_received(socket, socket_data, header,470 packet);458 ERROR_CODE = tcp_process_syn_received(socket, socket_data, 459 header, packet); 471 460 break; 472 461 case TCP_SOCKET_SYN_SENT: 473 rc = tcp_process_syn_sent(socket, socket_data, header, packet); 462 ERROR_CODE = tcp_process_syn_sent(socket, socket_data, header, 463 packet); 474 464 break; 475 465 case TCP_SOCKET_FIN_WAIT_1: … … 482 472 // ack releasing the socket gets processed later 483 473 case TCP_SOCKET_ESTABLISHED: 484 rc = tcp_process_established(socket, socket_data, header,485 packet, fragments, total_length);474 ERROR_CODE = tcp_process_established(socket, socket_data, 475 header, packet, fragments, total_length); 486 476 break; 487 477 default: … … 489 479 } 490 480 491 if (rc != EOK) { 481 if (ERROR_CODE != EOK) { 482 printf("process %d\n", ERROR_CODE); 492 483 fibril_rwlock_write_unlock(socket_data->local_lock); 493 printf("process %d\n", rc);494 484 } 495 485 … … 501 491 tcp_header_ref header, packet_t packet, int fragments, size_t total_length) 502 492 { 493 ERROR_DECLARE; 494 503 495 packet_t next_packet; 504 496 packet_t tmp_packet; … … 509 501 size_t offset; 510 502 uint32_t new_sequence_number; 511 int rc;512 503 513 504 assert(socket); … … 550 541 } 551 542 552 if (offset > 0) { 553 rc = packet_trim(packet, offset, 0); 554 if (rc != EOK) 555 return tcp_release_and_return(packet, rc); 556 } 543 if ((offset > 0) && (ERROR_OCCURRED(packet_trim(packet, 544 offset, 0)))) 545 return tcp_release_and_return(packet, ERROR_CODE); 557 546 558 547 assert(new_sequence_number == socket_data->next_incoming); … … 586 575 if (length <= offset) 587 576 next_packet = pq_next(next_packet); 588 else { 589 rc = packet_trim(next_packet, 0, 590 length - offset)); 591 if (rc != EOK) 592 return tcp_release_and_return(packet, 593 rc); 594 } 577 else if (ERROR_OCCURRED(packet_trim(next_packet, 0, 578 length - offset))) 579 return tcp_release_and_return(packet, 580 ERROR_CODE); 595 581 offset -= length; 596 582 total_length -= length - offset; … … 617 603 // remove the header 618 604 total_length -= TCP_HEADER_LENGTH(header); 619 rc = packet_trim(packet, TCP_HEADER_LENGTH(header), 0);620 if (rc != EOK)621 return tcp_release_and_return(packet, rc);605 if (ERROR_OCCURRED(packet_trim(packet, 606 TCP_HEADER_LENGTH(header), 0))) 607 return tcp_release_and_return(packet, ERROR_CODE); 622 608 623 609 if (total_length) { 624 rc = tcp_queue_received_packet(socket, socket_data, 625 packet, fragments, total_length); 626 if (rc != EOK) 627 return rc; 610 ERROR_PROPAGATE(tcp_queue_received_packet(socket, 611 socket_data, packet, fragments, total_length)); 628 612 } else { 629 613 total_length = 1; … … 633 617 packet = socket_data->incoming; 634 618 while (packet) { 635 rc = pq_get_order(socket_data->incoming, &order, NULL); 636 if (rc != EOK) { 619 620 if (ERROR_OCCURRED(pq_get_order(socket_data->incoming, 621 &order, NULL))) { 637 622 // remove the corrupted packet 638 623 next_packet = pq_detach(packet); … … 671 656 socket_data->next_incoming) { 672 657 // queue received data 673 rc = tcp_queue_received_packet(socket, 658 ERROR_PROPAGATE( 659 tcp_queue_received_packet(socket, 674 660 socket_data, packet, 1, 675 packet_get_data_length(packet)); 676 if (rc != EOK) 677 return rc; 661 packet_get_data_length(packet))); 678 662 socket_data->next_incoming = 679 663 new_sequence_number; … … 693 677 new_sequence_number; 694 678 } 695 rc = packet_trim(packet,length, 0);696 if (rc == EOK) {679 if (ERROR_NONE(packet_trim(packet, 680 length, 0))) { 697 681 // queue received data 698 rc = tcp_queue_received_packet( 682 ERROR_PROPAGATE( 683 tcp_queue_received_packet( 699 684 socket, socket_data, packet, 700 685 1, packet_get_data_length( 701 packet)); 702 if (rc != EOK) 703 return rc; 686 packet))); 704 687 socket_data->next_incoming = 705 688 new_sequence_number; … … 726 709 // remove the header 727 710 total_length -= TCP_HEADER_LENGTH(header); 728 rc = packet_trim(packet, TCP_HEADER_LENGTH(header), 0);729 if (rc != EOK)730 return tcp_release_and_return(packet, rc);711 if (ERROR_OCCURRED(packet_trim(packet, 712 TCP_HEADER_LENGTH(header), 0))) 713 return tcp_release_and_return(packet, ERROR_CODE); 731 714 732 715 next_packet = pq_detach(packet); 733 716 length = packet_get_data_length(packet); 734 rc = pq_add(&socket_data->incoming, packet, new_sequence_number, 735 length); 736 if (rc != EOK) { 717 if (ERROR_OCCURRED(pq_add(&socket_data->incoming, packet, 718 new_sequence_number, length))) { 737 719 // remove the corrupted packets 738 720 pq_release_remote(tcp_globals.net_phone, … … 745 727 tmp_packet = pq_detach(next_packet); 746 728 length = packet_get_data_length(next_packet); 747 748 rc = pq_set_order(next_packet, 749 new_sequence_number, length); 750 if (rc != EOK) { 751 pq_release_remote(tcp_globals.net_phone, 752 packet_get_id(next_packet)); 753 } 754 rc = pq_insert_after(packet, next_packet); 755 if (rc != EOK) { 729 if (ERROR_OCCURRED(pq_set_order(next_packet, 730 new_sequence_number, length)) || 731 ERROR_OCCURRED(pq_insert_after(packet, 732 next_packet))) { 756 733 pq_release_remote(tcp_globals.net_phone, 757 734 packet_get_id(next_packet)); … … 785 762 if (!packet) { 786 763 // create the notification packet 787 rc = tcp_create_notification_packet(&packet, socket, 788 socket_data, 0, 0); 789 if (rc != EOK) 790 return rc; 791 rc = tcp_queue_prepare_packet(socket, socket_data, packet, 1); 792 if (rc != EOK) 793 return rc; 764 ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket, 765 socket_data, 0, 0)); 766 ERROR_PROPAGATE(tcp_queue_prepare_packet(socket, socket_data, 767 packet, 1)); 794 768 packet = tcp_send_prepare_packet(socket, socket_data, packet, 1, 795 769 socket_data->last_outgoing + 1); … … 809 783 size_t total_length) 810 784 { 785 ERROR_DECLARE; 786 811 787 packet_dimension_ref packet_dimension; 812 int rc;813 788 814 789 assert(socket); … … 820 795 821 796 // queue the received packet 822 rc = dyn_fifo_push(&socket->received, packet_get_id(packet), 823 SOCKET_MAX_RECEIVED_SIZE); 824 if (rc != EOK) 825 return tcp_release_and_return(packet, rc); 826 rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone, 827 &tcp_globals.dimensions, socket_data->device_id, &packet_dimension); 828 if (rc != EOK) 829 return tcp_release_and_return(packet, rc); 797 if (ERROR_OCCURRED(dyn_fifo_push(&socket->received, 798 packet_get_id(packet), SOCKET_MAX_RECEIVED_SIZE)) || 799 ERROR_OCCURRED(tl_get_ip_packet_dimension(tcp_globals.ip_phone, 800 &tcp_globals.dimensions, socket_data->device_id, 801 &packet_dimension))) { 802 return tcp_release_and_return(packet, ERROR_CODE); 803 } 830 804 831 805 // decrease the window size … … 846 820 tcp_header_ref header, packet_t packet) 847 821 { 822 ERROR_DECLARE; 823 848 824 packet_t next_packet; 849 int rc;850 825 851 826 assert(socket); … … 869 844 } 870 845 // trim if longer than the header 871 if (packet_get_data_length(packet) > sizeof(*header)) { 872 rc = packet_trim(packet, 0, 873 packet_get_data_length(packet) - sizeof(*header)); 874 if (rc != EOK) 875 return tcp_release_and_return(packet, rc); 846 if ((packet_get_data_length(packet) > sizeof(*header)) && 847 ERROR_OCCURRED(packet_trim(packet, 0, 848 packet_get_data_length(packet) - sizeof(*header)))) { 849 return tcp_release_and_return(packet, ERROR_CODE); 876 850 } 877 851 tcp_prepare_operation_header(socket, socket_data, header, 0, 0); … … 902 876 size_t addrlen) 903 877 { 878 ERROR_DECLARE; 879 904 880 packet_t next_packet; 905 881 socket_core_ref socket; … … 908 884 int listening_socket_id = listening_socket->socket_id; 909 885 int listening_port = listening_socket->port; 910 int rc;911 886 912 887 assert(listening_socket); … … 938 913 memcpy(socket_data->addr, src, socket_data->addrlen); 939 914 socket_data->dest_port = ntohs(header->source_port); 940 rc = tl_set_address_port(socket_data->addr, socket_data->addrlen, 941 socket_data->dest_port); 942 if (rc != EOK) { 915 if (ERROR_OCCURRED(tl_set_address_port(socket_data->addr, 916 socket_data->addrlen, socket_data->dest_port))) { 943 917 free(socket_data->addr); 944 918 free(socket_data); 945 return tcp_release_and_return(packet, rc); 919 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 920 return ERROR_CODE; 946 921 } 947 922 948 923 // create a socket 949 924 socket_id = -1; 950 rc = socket_create(socket_data->local_sockets, listening_socket->phone, 951 socket_data, &socket_id); 952 if (rc != EOK) { 925 if (ERROR_OCCURRED(socket_create(socket_data->local_sockets, 926 listening_socket->phone, socket_data, &socket_id))) { 953 927 free(socket_data->addr); 954 928 free(socket_data); 955 return tcp_release_and_return(packet, rc);929 return tcp_release_and_return(packet, ERROR_CODE); 956 930 } 957 931 … … 990 964 assert(socket_data); 991 965 992 rc = socket_port_add(&tcp_globals.sockets, listening_port, socket,993 (const char *) socket_data->addr, socket_data->addrlen);966 ERROR_CODE = socket_port_add(&tcp_globals.sockets, listening_port, 967 socket, (const char *) socket_data->addr, socket_data->addrlen); 994 968 assert(socket == socket_port_find(&tcp_globals.sockets, listening_port, 995 969 (const char *) socket_data->addr, socket_data->addrlen)); 996 970 997 // rc= socket_bind_free_port(&tcp_globals.sockets, socket,971 // ERROR_CODE = socket_bind_free_port(&tcp_globals.sockets, socket, 998 972 // TCP_FREE_PORTS_START, TCP_FREE_PORTS_END, 999 973 // tcp_globals.last_used_port); 1000 974 // tcp_globals.last_used_port = socket->port; 1001 975 fibril_rwlock_write_unlock(&tcp_globals.lock); 1002 if ( rc!= EOK) {976 if (ERROR_CODE != EOK) { 1003 977 socket_destroy(tcp_globals.net_phone, socket->socket_id, 1004 978 socket_data->local_sockets, &tcp_globals.sockets, 1005 979 tcp_free_socket_data); 1006 return tcp_release_and_return(packet, rc);980 return tcp_release_and_return(packet, ERROR_CODE); 1007 981 } 1008 982 … … 1018 992 1019 993 // trim if longer than the header 1020 if (packet_get_data_length(packet) > sizeof(*header)) { 1021 rc = packet_trim(packet, 0, 1022 packet_get_data_length(packet) - sizeof(*header)); 1023 if (rc != EOK) { 1024 socket_destroy(tcp_globals.net_phone, socket->socket_id, 1025 socket_data->local_sockets, &tcp_globals.sockets, 1026 tcp_free_socket_data); 1027 return tcp_release_and_return(packet, rc); 1028 } 1029 } 1030 1031 tcp_prepare_operation_header(socket, socket_data, header, 1, 0); 1032 1033 rc = tcp_queue_packet(socket, socket_data, packet, 1); 1034 if (rc != EOK) { 994 if ((packet_get_data_length(packet) > sizeof(*header)) && 995 ERROR_OCCURRED(packet_trim(packet, 0, 996 packet_get_data_length(packet) - sizeof(*header)))) { 1035 997 socket_destroy(tcp_globals.net_phone, socket->socket_id, 1036 998 socket_data->local_sockets, &tcp_globals.sockets, 1037 999 tcp_free_socket_data); 1038 return rc; 1000 return tcp_release_and_return(packet, ERROR_CODE); 1001 } 1002 1003 tcp_prepare_operation_header(socket, socket_data, header, 1, 0); 1004 1005 if (ERROR_OCCURRED(tcp_queue_packet(socket, socket_data, packet, 1))) { 1006 socket_destroy(tcp_globals.net_phone, socket->socket_id, 1007 socket_data->local_sockets, &tcp_globals.sockets, 1008 tcp_free_socket_data); 1009 return ERROR_CODE; 1039 1010 } 1040 1011 … … 1060 1031 tcp_socket_data_ref socket_data, tcp_header_ref header, packet_t packet) 1061 1032 { 1033 ERROR_DECLARE; 1034 1062 1035 socket_core_ref listening_socket; 1063 1036 tcp_socket_data_ref listening_socket_data; 1064 int rc;1065 1037 1066 1038 assert(socket); … … 1087 1059 1088 1060 // queue the received packet 1089 rc = dyn_fifo_push(&listening_socket->accepted, 1090 (-1 * socket->socket_id), listening_socket_data->backlog); 1091 if (rc == EOK) { 1061 if (ERROR_NONE(dyn_fifo_push(&listening_socket->accepted, 1062 (-1 * socket->socket_id), 1063 listening_socket_data->backlog))) { 1064 1092 1065 // notify the destination socket 1093 1066 async_msg_5(socket->phone, NET_SOCKET_ACCEPTED, … … 1104 1077 1105 1078 // create the notification packet 1106 rc = tcp_create_notification_packet(&packet, socket, socket_data, 0, 1); 1107 if (rc != EOK) 1108 return rc; 1079 ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket, 1080 socket_data, 0, 1)); 1109 1081 1110 1082 // send the packet 1111 rc = tcp_queue_packet(socket, socket_data, packet, 1); 1112 if (rc != EOK) 1113 return rc; 1083 ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet, 1)); 1114 1084 1115 1085 // flush packets … … 1228 1198 ipc_call_t *answer, int *answer_count) 1229 1199 { 1200 ERROR_DECLARE; 1201 1230 1202 packet_t packet; 1231 int rc;1232 1203 1233 1204 assert(call); … … 1238 1209 switch (IPC_GET_METHOD(*call)) { 1239 1210 case NET_TL_RECEIVED: 1240 // fibril_rwlock_read_lock(&tcp_globals.lock); 1241 rc = packet_translate_remote(tcp_globals.net_phone, &packet, 1242 IPC_GET_PACKET(call)); 1243 if (rc != EOK) { 1244 // fibril_rwlock_read_unlock(&tcp_globals.lock); 1245 return rc; 1246 } 1247 rc = tcp_received_msg(IPC_GET_DEVICE(call), packet, SERVICE_TCP, 1248 IPC_GET_ERROR(call)); 1249 // fibril_rwlock_read_unlock(&tcp_globals.lock); 1250 return rc; 1211 //fibril_rwlock_read_lock(&tcp_globals.lock); 1212 if (ERROR_NONE(packet_translate_remote(tcp_globals.net_phone, 1213 &packet, IPC_GET_PACKET(call)))) { 1214 ERROR_CODE = tcp_received_msg(IPC_GET_DEVICE(call), 1215 packet, SERVICE_TCP, IPC_GET_ERROR(call)); 1216 } 1217 //fibril_rwlock_read_unlock(&tcp_globals.lock); 1218 return ERROR_CODE; 1219 1251 1220 case IPC_M_CONNECT_TO_ME: 1252 1221 return tcp_process_client_messages(callid, *call); … … 1693 1662 struct sockaddr *addr, socklen_t addrlen) 1694 1663 { 1664 ERROR_DECLARE; 1665 1695 1666 socket_core_ref socket; 1696 int rc;1697 1667 1698 1668 assert(local_sockets); … … 1705 1675 return ENOTSOCK; 1706 1676 1707 rc = tcp_connect_core(socket, local_sockets, addr, addrlen);1708 if (rc != EOK) {1677 if (ERROR_OCCURRED(tcp_connect_core(socket, local_sockets, addr, 1678 addrlen))) { 1709 1679 tcp_free_socket_data(socket); 1710 1680 // unbind if bound … … 1715 1685 } 1716 1686 } 1717 return rc;1687 return ERROR_CODE; 1718 1688 } 1719 1689 … … 1722 1692 struct sockaddr *addr, socklen_t addrlen) 1723 1693 { 1694 ERROR_DECLARE; 1695 1724 1696 tcp_socket_data_ref socket_data; 1725 1697 packet_t packet; 1726 int rc;1727 1698 1728 1699 assert(socket); … … 1740 1711 1741 1712 // get the destination port 1742 rc = tl_get_address_port(addr, addrlen, &socket_data->dest_port); 1743 if (rc != EOK) 1744 return rc; 1745 1713 ERROR_PROPAGATE(tl_get_address_port(addr, addrlen, 1714 &socket_data->dest_port)); 1746 1715 if (socket->port <= 0) { 1747 1716 // try to find a free port 1748 rc = socket_bind_free_port(&tcp_globals.sockets, socket, 1749 TCP_FREE_PORTS_START, TCP_FREE_PORTS_END, 1750 tcp_globals.last_used_port); 1751 if (rc != EOK) 1752 return rc; 1717 ERROR_PROPAGATE(socket_bind_free_port(&tcp_globals.sockets, 1718 socket, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END, 1719 tcp_globals.last_used_port)); 1753 1720 // set the next port as the search starting port number 1754 1721 tcp_globals.last_used_port = socket->port; 1755 1722 } 1756 1723 1757 rc =ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,1724 ERROR_PROPAGATE(ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP, 1758 1725 addr, addrlen, &socket_data->device_id, 1759 &socket_data->pseudo_header, &socket_data->headerlen); 1760 if (rc != EOK) 1761 return rc; 1726 &socket_data->pseudo_header, &socket_data->headerlen)); 1762 1727 1763 1728 // create the notification packet 1764 rc = tcp_create_notification_packet(&packet, socket, socket_data, 1, 0); 1765 if (rc != EOK) 1766 return rc; 1729 ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket, 1730 socket_data, 1, 0)); 1767 1731 1768 1732 // unlock the globals and wait for an operation … … 1772 1736 socket_data->addrlen = addrlen; 1773 1737 // send the packet 1774 1775 if (((rc = tcp_queue_packet(socket, socket_data, packet, 1)) != EOK) || 1776 ((rc = tcp_prepare_timeout(tcp_timeout, socket, socket_data, 0, 1777 TCP_SOCKET_INITIAL, NET_DEFAULT_TCP_INITIAL_TIMEOUT, false)) != 1778 EOK)) { 1738 if (ERROR_OCCURRED(tcp_queue_packet(socket, socket_data, packet, 1)) || 1739 ERROR_OCCURRED(tcp_prepare_timeout(tcp_timeout, socket, socket_data, 1740 0, TCP_SOCKET_INITIAL, NET_DEFAULT_TCP_INITIAL_TIMEOUT, false))) { 1779 1741 socket_data->addr = NULL; 1780 1742 socket_data->addrlen = 0; … … 1792 1754 fibril_condvar_wait(&socket_data->operation.condvar, 1793 1755 &socket_data->operation.mutex); 1794 rc= socket_data->operation.result;1795 if ( rc!= EOK) {1756 ERROR_CODE = socket_data->operation.result; 1757 if (ERROR_CODE != EOK) { 1796 1758 socket_data->addr = NULL; 1797 1759 socket_data->addrlen = 0; … … 1800 1762 socket_data->addr = NULL; 1801 1763 socket_data->addrlen = 0; 1802 rc= EINTR;1764 ERROR_CODE = EINTR; 1803 1765 } 1804 1766 } … … 1807 1769 1808 1770 // return the result 1809 return rc;1771 return ERROR_CODE; 1810 1772 } 1811 1773 … … 1814 1776 tcp_socket_data_ref socket_data, packet_t packet, size_t data_length) 1815 1777 { 1778 ERROR_DECLARE; 1779 1816 1780 tcp_header_ref header; 1817 int rc;1818 1781 1819 1782 assert(socket); … … 1830 1793 header->sequence_number = htonl(socket_data->next_outgoing); 1831 1794 1832 rc = packet_set_addr(packet, NULL, (uint8_t *) socket_data->addr, 1833 socket_data->addrlen); 1834 if (rc != EOK) 1795 if (ERROR_OCCURRED(packet_set_addr(packet, NULL, 1796 (uint8_t *) socket_data->addr, socket_data->addrlen))) 1835 1797 return tcp_release_and_return(packet, EINVAL); 1836 1798 … … 1846 1808 packet_t packet, size_t data_length) 1847 1809 { 1848 int rc;1810 ERROR_DECLARE; 1849 1811 1850 1812 assert(socket); … … 1852 1814 assert(socket->specific_data == socket_data); 1853 1815 1854 rc = tcp_queue_prepare_packet(socket, socket_data, packet, data_length); 1855 if (rc != EOK) 1856 return rc; 1857 1858 rc = pq_add(&socket_data->outgoing, packet, socket_data->next_outgoing, 1859 data_length); 1860 if (rc != EOK) 1861 return tcp_release_and_return(packet, rc); 1816 ERROR_PROPAGATE(tcp_queue_prepare_packet(socket, socket_data, packet, 1817 data_length)); 1818 1819 if (ERROR_OCCURRED(pq_add(&socket_data->outgoing, packet, 1820 socket_data->next_outgoing, data_length))) 1821 return tcp_release_and_return(packet, ERROR_CODE); 1862 1822 1863 1823 socket_data->next_outgoing += data_length; … … 1868 1828 tcp_get_packets_to_send(socket_core_ref socket, tcp_socket_data_ref socket_data) 1869 1829 { 1830 ERROR_DECLARE; 1831 1870 1832 packet_t packet; 1871 1833 packet_t copy; … … 1873 1835 packet_t previous = NULL; 1874 1836 size_t data_length; 1875 int rc;1876 1837 1877 1838 assert(socket); … … 1898 1859 if (!sending) { 1899 1860 sending = copy; 1900 } else { 1901 rc = pq_insert_after(previous, copy); 1902 if (rc != EOK) { 1903 pq_release_remote(tcp_globals.net_phone, 1904 packet_get_id(copy)); 1905 return sending; 1906 } 1861 } else if (ERROR_OCCURRED(pq_insert_after(previous, copy))) { 1862 pq_release_remote(tcp_globals.net_phone, 1863 packet_get_id(copy)); 1864 return sending; 1907 1865 } 1908 1866 … … 1926 1884 packet_t packet, size_t data_length, size_t sequence_number) 1927 1885 { 1886 ERROR_DECLARE; 1887 1928 1888 tcp_header_ref header; 1929 1889 uint32_t checksum; 1930 int rc;1931 1890 1932 1891 assert(socket); … … 1935 1894 1936 1895 // adjust the pseudo header 1937 rc = ip_client_set_pseudo_header_data_length(socket_data->pseudo_header,1938 socket_data-> headerlen, packet_get_data_length(packet));1939 if (rc != EOK) {1896 if (ERROR_OCCURRED(ip_client_set_pseudo_header_data_length( 1897 socket_data->pseudo_header, socket_data->headerlen, 1898 packet_get_data_length(packet)))) { 1940 1899 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 1941 1900 return NULL; … … 1962 1921 checksum = compute_checksum(0, socket_data->pseudo_header, 1963 1922 socket_data->headerlen); 1964 checksum = compute_checksum(checksum, 1965 (uint8_t *) packet_get_data(packet), 1923 checksum = compute_checksum(checksum, (uint8_t *) packet_get_data(packet), 1966 1924 packet_get_data_length(packet)); 1967 1925 header->checksum = htons(flip_checksum(compact_checksum(checksum))); 1968 1926 1969 1927 // prepare the packet 1970 rc = ip_client_prepare_packet(packet, IPPROTO_TCP, 0, 0, 0, 0); 1971 if (rc != EOK) { 1972 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 1973 return NULL; 1974 } 1975 rc = tcp_prepare_timeout(tcp_timeout, socket, socket_data, 1976 sequence_number, socket_data->state, socket_data->timeout, true); 1977 if (rc != EOK) { 1928 if (ERROR_OCCURRED(ip_client_prepare_packet(packet, IPPROTO_TCP, 0, 0, 1929 0, 0)) || ERROR_OCCURRED(tcp_prepare_timeout(tcp_timeout, socket, 1930 socket_data, sequence_number, socket_data->state, 1931 socket_data->timeout, true))) { 1978 1932 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 1979 1933 return NULL; … … 2084 2038 size_t *addrlen) 2085 2039 { 2040 ERROR_DECLARE; 2041 2086 2042 socket_core_ref socket; 2087 2043 tcp_socket_data_ref socket_data; … … 2089 2045 packet_t packet; 2090 2046 size_t length; 2091 int rc;2092 2047 2093 2048 assert(local_sockets); … … 2111 2066 // send the source address if desired 2112 2067 if (addrlen) { 2113 rc = data_reply(socket_data->addr, socket_data->addrlen); 2114 if (rc != EOK) 2115 return rc; 2068 ERROR_PROPAGATE(data_reply(socket_data->addr, 2069 socket_data->addrlen)); 2116 2070 *addrlen = socket_data->addrlen; 2117 2071 } … … 2122 2076 return NO_DATA; 2123 2077 2124 rc = packet_translate_remote(tcp_globals.net_phone, &packet, packet_id); 2125 if (rc != EOK) 2126 return rc; 2078 ERROR_PROPAGATE(packet_translate_remote(tcp_globals.net_phone, &packet, 2079 packet_id)); 2127 2080 2128 2081 // reply the packets 2129 rc = socket_reply_packets(packet, &length); 2130 if (rc != EOK) 2131 return rc; 2082 ERROR_PROPAGATE(socket_reply_packets(packet, &length)); 2132 2083 2133 2084 // release the packet … … 2142 2093 size_t *data_fragment_size, int flags) 2143 2094 { 2095 ERROR_DECLARE; 2096 2144 2097 socket_core_ref socket; 2145 2098 tcp_socket_data_ref socket_data; … … 2150 2103 int index; 2151 2104 int result; 2152 int rc;2153 2105 2154 2106 assert(local_sockets); … … 2171 2123 return ENOTCONN; 2172 2124 2173 rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone, 2174 &tcp_globals.dimensions, socket_data->device_id, &packet_dimension); 2175 if (rc != EOK) 2176 return rc; 2125 ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone, 2126 &tcp_globals.dimensions, socket_data->device_id, &packet_dimension)); 2177 2127 2178 2128 *data_fragment_size = … … 2195 2145 2196 2146 tcp_prepare_operation_header(socket, socket_data, header, 0, 0); 2197 rc = tcp_queue_packet(socket, socket_data, packet, 0); 2198 if (rc != EOK) 2199 return rc; 2147 ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet, 2148 0)); 2200 2149 } 2201 2150 … … 2216 2165 tcp_close_message(socket_cores_ref local_sockets, int socket_id) 2217 2166 { 2167 ERROR_DECLARE; 2168 2218 2169 socket_core_ref socket; 2219 2170 tcp_socket_data_ref socket_data; 2220 2171 packet_t packet; 2221 int rc;2222 2172 2223 2173 // find the socket … … 2244 2194 default: 2245 2195 // just destroy 2246 rc =socket_destroy(tcp_globals.net_phone, socket_id,2196 if (ERROR_NONE(socket_destroy(tcp_globals.net_phone, socket_id, 2247 2197 local_sockets, &tcp_globals.sockets, 2248 tcp_free_socket_data); 2249 if (rc == EOK) { 2198 tcp_free_socket_data))) { 2250 2199 fibril_rwlock_write_unlock(socket_data->local_lock); 2251 2200 fibril_rwlock_write_unlock(&tcp_globals.lock); 2252 2201 } 2253 return rc;2202 return ERROR_CODE; 2254 2203 } 2255 2204 … … 2258 2207 2259 2208 // create the notification packet 2260 rc = tcp_create_notification_packet(&packet, socket, socket_data, 0, 1); 2261 if (rc != EOK) 2262 return rc; 2209 ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket, 2210 socket_data, 0, 1)); 2263 2211 2264 2212 // send the packet 2265 rc = tcp_queue_packet(socket, socket_data, packet, 1); 2266 if (rc != EOK) 2267 return rc; 2213 ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet, 1)); 2268 2214 2269 2215 // flush packets … … 2284 2230 tcp_socket_data_ref socket_data, int synchronize, int finalize) 2285 2231 { 2232 ERROR_DECLARE; 2233 2286 2234 packet_dimension_ref packet_dimension; 2287 2235 tcp_header_ref header; 2288 int rc;2289 2236 2290 2237 assert(packet); 2291 2238 2292 2239 // get the device packet dimension 2293 rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone, 2294 &tcp_globals.dimensions, socket_data->device_id, &packet_dimension); 2295 if (rc != EOK) 2296 return rc; 2240 ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone, 2241 &tcp_globals.dimensions, socket_data->device_id, 2242 &packet_dimension)); 2297 2243 2298 2244 // get a new packet … … 2319 2265 int new_socket_id, size_t *data_fragment_size, size_t *addrlen) 2320 2266 { 2267 ERROR_DECLARE; 2268 2321 2269 socket_core_ref accepted; 2322 2270 socket_core_ref socket; 2323 2271 tcp_socket_data_ref socket_data; 2324 2272 packet_dimension_ref packet_dimension; 2325 int rc;2326 2273 2327 2274 assert(local_sockets); … … 2357 2304 // TODO can it be in another state? 2358 2305 if (socket_data->state == TCP_SOCKET_ESTABLISHED) { 2359 rc = data_reply(socket_data->addr, 2360 socket_data->addrlen); 2361 if (rc != EOK) 2362 return rc; 2363 rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone, 2364 &tcp_globals.dimensions, socket_data->device_id, 2365 &packet_dimension); 2366 if (rc != EOK) 2367 return rc; 2306 ERROR_PROPAGATE(data_reply(socket_data->addr, 2307 socket_data->addrlen)); 2308 ERROR_PROPAGATE(tl_get_ip_packet_dimension( 2309 tcp_globals.ip_phone, &tcp_globals.dimensions, 2310 socket_data->device_id, &packet_dimension)); 2368 2311 *addrlen = socket_data->addrlen; 2369 2312 … … 2375 2318 2376 2319 if (new_socket_id > 0) { 2377 rc = socket_cores_update(local_sockets, 2378 accepted->socket_id, new_socket_id); 2379 if (rc != EOK) 2380 return rc; 2320 ERROR_PROPAGATE(socket_cores_update( 2321 local_sockets, accepted->socket_id, 2322 new_socket_id)); 2381 2323 accepted->socket_id = new_socket_id; 2382 2324 } … … 2488 2430 main(int argc, char *argv[]) 2489 2431 { 2490 int rc; 2491 2492 rc = tl_module_start_standalone(tl_client_connection); 2493 return rc; 2432 ERROR_DECLARE; 2433 2434 /* 2435 Start the module 2436 */ 2437 if (ERROR_OCCURRED(tl_module_start_standalone(tl_client_connection))) 2438 return ERROR_CODE; 2439 2440 return EOK; 2494 2441 } 2495 2442
Note:
See TracChangeset
for help on using the changeset viewer.