Changes in uspace/srv/net/tl/tcp/tcp.c [6092b56e:14f1db0] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tl/tcp/tcp.c
r6092b56e r14f1db0 46 46 #include <ipc/services.h> 47 47 48 #include "../../err.h" 49 #include "../../messages.h" 50 #include "../../modules.h" 51 52 #include "../../structures/dynamic_fifo.h" 53 #include "../../structures/packet/packet_client.h" 54 55 #include "../../include/checksum.h" 56 #include "../../include/in.h" 57 #include "../../include/in6.h" 58 #include "../../include/inet.h" 59 #include "../../include/ip_client.h" 60 #include "../../include/ip_interface.h" 61 #include "../../include/ip_protocols.h" 62 #include "../../include/icmp_client.h" 63 #include "../../include/icmp_interface.h" 64 #include "../../include/net_interface.h" 65 #include "../../include/socket_codes.h" 66 #include "../../include/socket_errno.h" 67 #include "../../include/tcp_codes.h" 68 69 #include "../../socket/socket_core.h" 70 #include "../../socket/socket_messages.h" 71 72 #include "../tl_common.h" 73 #include "../tl_messages.h" 48 #include <net_err.h> 49 #include <net_messages.h> 50 #include <net_modules.h> 51 #include <adt/dynamic_fifo.h> 52 #include <packet/packet_client.h> 53 #include <packet_remote.h> 54 #include <net_checksum.h> 55 #include <in.h> 56 #include <in6.h> 57 #include <inet.h> 58 #include <ip_client.h> 59 #include <ip_interface.h> 60 #include <ip_protocols.h> 61 #include <icmp_client.h> 62 #include <icmp_interface.h> 63 #include <net_interface.h> 64 #include <socket_codes.h> 65 #include <socket_errno.h> 66 #include <tcp_codes.h> 67 #include <socket_core.h> 68 #include <socket_messages.h> 69 #include <tl_common.h> 70 #include <tl_messages.h> 71 #include <tl_local.h> 72 #include <tl_interface.h> 74 73 75 74 #include "tcp.h" 76 75 #include "tcp_header.h" 77 76 #include "tcp_module.h" 77 78 /** TCP module name. 79 */ 80 #define NAME "TCP protocol" 78 81 79 82 /** The TCP window default value. … … 421 424 break; 422 425 default: 423 pq_release (tcp_globals.net_phone, packet_get_id(packet));426 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 424 427 } 425 428 … … 473 476 // release the acknowledged packets 474 477 next_packet = pq_next(packet); 475 pq_release (tcp_globals.net_phone, packet_get_id(packet));478 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 476 479 packet = next_packet; 477 480 offset -= length; … … 517 520 next_packet = pq_next(next_packet); 518 521 pq_insert_after(tmp_packet, next_packet); 519 pq_release (tcp_globals.net_phone, packet_get_id(tmp_packet));522 pq_release_remote(tcp_globals.net_phone, packet_get_id(tmp_packet)); 520 523 } 521 524 assert(new_sequence_number + total_length == socket_data->next_incoming + socket_data->window); … … 548 551 socket_data->incoming = next_packet; 549 552 } 550 pq_release (tcp_globals.net_phone, packet_get_id(packet));553 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 551 554 packet = next_packet; 552 555 continue; … … 568 571 if(length <= 0){ 569 572 // remove the empty packet 570 pq_release (tcp_globals.net_phone, packet_get_id(packet));573 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 571 574 packet = next_packet; 572 575 continue; … … 595 598 } 596 599 // remove the duplicit or corrupted packet 597 pq_release (tcp_globals.net_phone, packet_get_id(packet));600 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 598 601 packet = next_packet; 599 602 continue; … … 617 620 if(ERROR_OCCURRED(pq_add(&socket_data->incoming, packet, new_sequence_number, length))){ 618 621 // remove the corrupted packets 619 pq_release (tcp_globals.net_phone, packet_get_id(packet));620 pq_release (tcp_globals.net_phone, packet_get_id(next_packet));622 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 623 pq_release_remote(tcp_globals.net_phone, packet_get_id(next_packet)); 621 624 }else{ 622 625 while(next_packet){ … … 626 629 if(ERROR_OCCURRED(pq_set_order(next_packet, new_sequence_number, length)) 627 630 || ERROR_OCCURRED(pq_insert_after(packet, next_packet))){ 628 pq_release (tcp_globals.net_phone, packet_get_id(next_packet));631 pq_release_remote(tcp_globals.net_phone, packet_get_id(next_packet)); 629 632 } 630 633 next_packet = tmp_packet; … … 634 637 printf("unexpected\n"); 635 638 // release duplicite or restricted 636 pq_release (tcp_globals.net_phone, packet_get_id(packet));639 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 637 640 } 638 641 … … 679 682 // queue the received packet 680 683 if(ERROR_OCCURRED(dyn_fifo_push(&socket->received, packet_get_id(packet), SOCKET_MAX_RECEIVED_SIZE)) 681 684 || ERROR_OCCURRED(tl_get_ip_packet_dimension(tcp_globals.ip_phone, &tcp_globals.dimensions, socket_data->device_id, &packet_dimension))){ 682 685 return tcp_release_and_return(packet, ERROR_CODE); 683 686 } … … 710 713 next_packet = pq_detach(packet); 711 714 if(next_packet){ 712 pq_release (tcp_globals.net_phone, packet_get_id(next_packet));715 pq_release_remote(tcp_globals.net_phone, packet_get_id(next_packet)); 713 716 } 714 717 // trim if longer than the header … … 780 783 free(socket_data->addr); 781 784 free(socket_data); 782 pq_release (tcp_globals.net_phone, packet_get_id(packet));785 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 783 786 return ERROR_CODE; 784 787 } … … 846 849 next_packet = pq_detach(packet); 847 850 if(next_packet){ 848 pq_release (tcp_globals.net_phone, packet_get_id(next_packet));851 pq_release_remote(tcp_globals.net_phone, packet_get_id(next_packet)); 849 852 } 850 853 // trim if longer than the header … … 895 898 896 899 socket_data->next_incoming = ntohl(header->sequence_number);// + 1; 897 pq_release (tcp_globals.net_phone, packet_get_id(packet));900 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 898 901 socket_data->state = TCP_SOCKET_ESTABLISHED; 899 902 listening_socket = socket_cores_find(socket_data->local_sockets, socket_data->listening_socket_id); … … 981 984 // add to acknowledged or release 982 985 if(pq_add(&acknowledged, packet, 0, 0) != EOK){ 983 pq_release (tcp_globals.net_phone, packet_get_id(packet));986 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 984 987 } 985 988 packet = next; … … 990 993 // release acknowledged 991 994 if(acknowledged){ 992 pq_release (tcp_globals.net_phone, packet_get_id(acknowledged));995 pq_release_remote(tcp_globals.net_phone, packet_get_id(acknowledged)); 993 996 } 994 997 return; … … 1006 1009 } 1007 1010 1008 int tcp_message (ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){1011 int tcp_message_standalone(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){ 1009 1012 ERROR_DECLARE; 1010 1013 … … 1019 1022 case NET_TL_RECEIVED: 1020 1023 //fibril_rwlock_read_lock(&tcp_globals.lock); 1021 if(! ERROR_OCCURRED(packet_translate (tcp_globals.net_phone, &packet, IPC_GET_PACKET(call)))){1024 if(! ERROR_OCCURRED(packet_translate_remote(tcp_globals.net_phone, &packet, IPC_GET_PACKET(call)))){ 1022 1025 ERROR_CODE = tcp_received_msg(IPC_GET_DEVICE(call), packet, SERVICE_TCP, IPC_GET_ERROR(call)); 1023 1026 } … … 1062 1065 int socket_id; 1063 1066 size_t addrlen; 1067 size_t size; 1064 1068 fibril_rwlock_t lock; 1065 1069 ipc_call_t answer; … … 1107 1111 socket_id = SOCKET_GET_SOCKET_ID(call); 1108 1112 res = socket_create(&local_sockets, app_phone, socket_data, &socket_id); 1109 *SOCKET_SET_SOCKET_ID(answer) = socket_id;1113 SOCKET_SET_SOCKET_ID(answer, socket_id); 1110 1114 fibril_rwlock_write_unlock(&lock); 1111 1115 if(res == EOK){ 1112 if (tl_get_ip_packet_dimension(tcp_globals.ip_phone, &tcp_globals.dimensions, DEVICE_INVALID_ID, &packet_dimension) == EOK){1113 *SOCKET_SET_DATA_FRAGMENT_SIZE(answer) = ((packet_dimension->content < socket_data->data_fragment_size) ? packet_dimension->content : socket_data->data_fragment_size);1116 if (tl_get_ip_packet_dimension(tcp_globals.ip_phone, &tcp_globals.dimensions, DEVICE_INVALID_ID, &packet_dimension) == EOK){ 1117 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, ((packet_dimension->content < socket_data->data_fragment_size) ? packet_dimension->content : socket_data->data_fragment_size)); 1114 1118 } 1115 // *SOCKET_SET_DATA_FRAGMENT_SIZE(answer) = MAX_TCP_FRAGMENT_SIZE;1116 *SOCKET_SET_HEADER_SIZE(answer) = TCP_HEADER_SIZE;1119 // SOCKET_SET_DATA_FRAGMENT_SIZE(answer, MAX_TCP_FRAGMENT_SIZE); 1120 SOCKET_SET_HEADER_SIZE(answer, TCP_HEADER_SIZE); 1117 1121 answer_count = 3; 1118 1122 }else{ … … 1166 1170 fibril_rwlock_read_lock(&tcp_globals.lock); 1167 1171 fibril_rwlock_write_lock(&lock); 1168 res = tcp_accept_message(&local_sockets, SOCKET_GET_SOCKET_ID(call), SOCKET_GET_NEW_SOCKET_ID(call), SOCKET_SET_DATA_FRAGMENT_SIZE(answer), &addrlen); 1172 res = tcp_accept_message(&local_sockets, SOCKET_GET_SOCKET_ID(call), SOCKET_GET_NEW_SOCKET_ID(call), &size, &addrlen); 1173 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, size); 1169 1174 fibril_rwlock_write_unlock(&lock); 1170 1175 fibril_rwlock_read_unlock(&tcp_globals.lock); 1171 1176 if(res > 0){ 1172 *SOCKET_SET_SOCKET_ID(answer) = res;1173 *SOCKET_SET_ADDRESS_LENGTH(answer) = addrlen;1177 SOCKET_SET_SOCKET_ID(answer, res); 1178 SOCKET_SET_ADDRESS_LENGTH(answer, addrlen); 1174 1179 answer_count = 3; 1175 1180 } … … 1178 1183 fibril_rwlock_read_lock(&tcp_globals.lock); 1179 1184 fibril_rwlock_write_lock(&lock); 1180 res = tcp_send_message(&local_sockets, SOCKET_GET_SOCKET_ID(call), SOCKET_GET_DATA_FRAGMENTS(call), SOCKET_SET_DATA_FRAGMENT_SIZE(answer), SOCKET_GET_FLAGS(call)); 1185 res = tcp_send_message(&local_sockets, SOCKET_GET_SOCKET_ID(call), SOCKET_GET_DATA_FRAGMENTS(call), &size, SOCKET_GET_FLAGS(call)); 1186 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, size); 1181 1187 if(res != EOK){ 1182 1188 fibril_rwlock_write_unlock(&lock); … … 1191 1197 fibril_rwlock_read_lock(&tcp_globals.lock); 1192 1198 fibril_rwlock_write_lock(&lock); 1193 res = tcp_send_message(&local_sockets, SOCKET_GET_SOCKET_ID(call), SOCKET_GET_DATA_FRAGMENTS(call), SOCKET_SET_DATA_FRAGMENT_SIZE(answer), SOCKET_GET_FLAGS(call)); 1199 res = tcp_send_message(&local_sockets, SOCKET_GET_SOCKET_ID(call), SOCKET_GET_DATA_FRAGMENTS(call), &size, SOCKET_GET_FLAGS(call)); 1200 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, size); 1194 1201 if(res != EOK){ 1195 1202 fibril_rwlock_write_unlock(&lock); … … 1208 1215 fibril_rwlock_read_unlock(&tcp_globals.lock); 1209 1216 if(res > 0){ 1210 *SOCKET_SET_READ_DATA_LENGTH(answer) = res;1217 SOCKET_SET_READ_DATA_LENGTH(answer, res); 1211 1218 answer_count = 1; 1212 1219 res = EOK; … … 1220 1227 fibril_rwlock_read_unlock(&tcp_globals.lock); 1221 1228 if(res > 0){ 1222 *SOCKET_SET_READ_DATA_LENGTH(answer) = res;1223 *SOCKET_SET_ADDRESS_LENGTH(answer) = addrlen;1229 SOCKET_SET_READ_DATA_LENGTH(answer, res); 1230 SOCKET_SET_ADDRESS_LENGTH(answer, addrlen); 1224 1231 answer_count = 3; 1225 1232 res = EOK; … … 1561 1568 }else{ 1562 1569 if(ERROR_OCCURRED(pq_insert_after(previous, copy))){ 1563 pq_release (tcp_globals.net_phone, packet_get_id(copy));1570 pq_release_remote(tcp_globals.net_phone, packet_get_id(copy)); 1564 1571 return sending; 1565 1572 } … … 1593 1600 // adjust the pseudo header 1594 1601 if(ERROR_OCCURRED(ip_client_set_pseudo_header_data_length(socket_data->pseudo_header, socket_data->headerlen, packet_get_data_length(packet)))){ 1595 pq_release (tcp_globals.net_phone, packet_get_id(packet));1602 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 1596 1603 return NULL; 1597 1604 } … … 1600 1607 header = (tcp_header_ref) packet_get_data(packet); 1601 1608 if(! header){ 1602 pq_release (tcp_globals.net_phone, packet_get_id(packet));1609 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 1603 1610 return NULL; 1604 1611 } … … 1621 1628 // prepare the timeout 1622 1629 || ERROR_OCCURRED(tcp_prepare_timeout(tcp_timeout, socket, socket_data, sequence_number, socket_data->state, socket_data->timeout, true))){ 1623 pq_release (tcp_globals.net_phone, packet_get_id(packet));1630 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 1624 1631 return NULL; 1625 1632 } … … 1746 1753 return NO_DATA; 1747 1754 } 1748 ERROR_PROPAGATE(packet_translate (tcp_globals.net_phone, &packet, packet_id));1755 ERROR_PROPAGATE(packet_translate_remote(tcp_globals.net_phone, &packet, packet_id)); 1749 1756 1750 1757 // reply the packets … … 1753 1760 // release the packet 1754 1761 dyn_fifo_pop(&socket->received); 1755 pq_release (tcp_globals.net_phone, packet_get_id(packet));1762 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 1756 1763 // return the total length 1757 1764 return (int) length; … … 1885 1892 ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone, &tcp_globals.dimensions, socket_data->device_id, &packet_dimension)); 1886 1893 // get a new packet 1887 *packet = packet_get_4 (tcp_globals.net_phone, TCP_HEADER_SIZE, packet_dimension->addr_len, packet_dimension->prefix, packet_dimension->suffix);1894 *packet = packet_get_4_remote(tcp_globals.net_phone, TCP_HEADER_SIZE, packet_dimension->addr_len, packet_dimension->prefix, packet_dimension->suffix); 1888 1895 if(! * packet){ 1889 1896 return ENOMEM; … … 1989 1996 1990 1997 int tcp_release_and_return(packet_t packet, int result){ 1991 pq_release (tcp_globals.net_phone, packet_get_id(packet));1998 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet)); 1992 1999 return result; 1993 2000 } 1994 2001 2002 /** Default thread for new connections. 2003 * 2004 * @param[in] iid The initial message identifier. 2005 * @param[in] icall The initial message call structure. 2006 * 2007 */ 2008 static void tl_client_connection(ipc_callid_t iid, ipc_call_t * icall) 2009 { 2010 /* 2011 * Accept the connection 2012 * - Answer the first IPC_M_CONNECT_ME_TO call. 2013 */ 2014 ipc_answer_0(iid, EOK); 2015 2016 while(true) { 2017 ipc_call_t answer; 2018 int answer_count; 2019 2020 /* Clear the answer structure */ 2021 refresh_answer(&answer, &answer_count); 2022 2023 /* Fetch the next message */ 2024 ipc_call_t call; 2025 ipc_callid_t callid = async_get_call(&call); 2026 2027 /* Process the message */ 2028 int res = tl_module_message_standalone(callid, &call, &answer, 2029 &answer_count); 2030 2031 /* End if said to either by the message or the processing result */ 2032 if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) || (res == EHANGUP)) 2033 return; 2034 2035 /* Answer the message */ 2036 answer_call(callid, res, &answer, answer_count); 2037 } 2038 } 2039 2040 /** Starts the module. 2041 * 2042 * @param argc The count of the command line arguments. Ignored parameter. 2043 * @param argv The command line parameters. Ignored parameter. 2044 * 2045 * @returns EOK on success. 2046 * @returns Other error codes as defined for each specific module start function. 2047 * 2048 */ 2049 int main(int argc, char *argv[]) 2050 { 2051 ERROR_DECLARE; 2052 2053 /* Start the module */ 2054 if (ERROR_OCCURRED(tl_module_start_standalone(tl_client_connection))) 2055 return ERROR_CODE; 2056 2057 return EOK; 2058 } 2059 1995 2060 /** @} 1996 2061 */
Note:
See TracChangeset
for help on using the changeset viewer.