Changes in uspace/srv/net/tl/tcp/tcp.c [14f1db0:6092b56e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tl/tcp/tcp.c
r14f1db0 r6092b56e 46 46 #include <ipc/services.h> 47 47 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> 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" 73 74 74 75 #include "tcp.h" 75 76 #include "tcp_header.h" 76 77 #include "tcp_module.h" 77 78 /** TCP module name.79 */80 #define NAME "TCP protocol"81 78 82 79 /** The TCP window default value. … … 424 421 break; 425 422 default: 426 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));423 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 427 424 } 428 425 … … 476 473 // release the acknowledged packets 477 474 next_packet = pq_next(packet); 478 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));475 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 479 476 packet = next_packet; 480 477 offset -= length; … … 520 517 next_packet = pq_next(next_packet); 521 518 pq_insert_after(tmp_packet, next_packet); 522 pq_release _remote(tcp_globals.net_phone, packet_get_id(tmp_packet));519 pq_release(tcp_globals.net_phone, packet_get_id(tmp_packet)); 523 520 } 524 521 assert(new_sequence_number + total_length == socket_data->next_incoming + socket_data->window); … … 551 548 socket_data->incoming = next_packet; 552 549 } 553 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));550 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 554 551 packet = next_packet; 555 552 continue; … … 571 568 if(length <= 0){ 572 569 // remove the empty packet 573 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));570 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 574 571 packet = next_packet; 575 572 continue; … … 598 595 } 599 596 // remove the duplicit or corrupted packet 600 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));597 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 601 598 packet = next_packet; 602 599 continue; … … 620 617 if(ERROR_OCCURRED(pq_add(&socket_data->incoming, packet, new_sequence_number, length))){ 621 618 // remove the corrupted packets 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));619 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 620 pq_release(tcp_globals.net_phone, packet_get_id(next_packet)); 624 621 }else{ 625 622 while(next_packet){ … … 629 626 if(ERROR_OCCURRED(pq_set_order(next_packet, new_sequence_number, length)) 630 627 || ERROR_OCCURRED(pq_insert_after(packet, next_packet))){ 631 pq_release _remote(tcp_globals.net_phone, packet_get_id(next_packet));628 pq_release(tcp_globals.net_phone, packet_get_id(next_packet)); 632 629 } 633 630 next_packet = tmp_packet; … … 637 634 printf("unexpected\n"); 638 635 // release duplicite or restricted 639 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));636 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 640 637 } 641 638 … … 682 679 // queue the received packet 683 680 if(ERROR_OCCURRED(dyn_fifo_push(&socket->received, packet_get_id(packet), SOCKET_MAX_RECEIVED_SIZE)) 684 681 || ERROR_OCCURRED(tl_get_ip_packet_dimension(tcp_globals.ip_phone, &tcp_globals.dimensions, socket_data->device_id, &packet_dimension))){ 685 682 return tcp_release_and_return(packet, ERROR_CODE); 686 683 } … … 713 710 next_packet = pq_detach(packet); 714 711 if(next_packet){ 715 pq_release _remote(tcp_globals.net_phone, packet_get_id(next_packet));712 pq_release(tcp_globals.net_phone, packet_get_id(next_packet)); 716 713 } 717 714 // trim if longer than the header … … 783 780 free(socket_data->addr); 784 781 free(socket_data); 785 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));782 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 786 783 return ERROR_CODE; 787 784 } … … 849 846 next_packet = pq_detach(packet); 850 847 if(next_packet){ 851 pq_release _remote(tcp_globals.net_phone, packet_get_id(next_packet));848 pq_release(tcp_globals.net_phone, packet_get_id(next_packet)); 852 849 } 853 850 // trim if longer than the header … … 898 895 899 896 socket_data->next_incoming = ntohl(header->sequence_number);// + 1; 900 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));897 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 901 898 socket_data->state = TCP_SOCKET_ESTABLISHED; 902 899 listening_socket = socket_cores_find(socket_data->local_sockets, socket_data->listening_socket_id); … … 984 981 // add to acknowledged or release 985 982 if(pq_add(&acknowledged, packet, 0, 0) != EOK){ 986 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));983 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 987 984 } 988 985 packet = next; … … 993 990 // release acknowledged 994 991 if(acknowledged){ 995 pq_release _remote(tcp_globals.net_phone, packet_get_id(acknowledged));992 pq_release(tcp_globals.net_phone, packet_get_id(acknowledged)); 996 993 } 997 994 return; … … 1009 1006 } 1010 1007 1011 int tcp_message _standalone(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){1008 int tcp_message(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){ 1012 1009 ERROR_DECLARE; 1013 1010 … … 1022 1019 case NET_TL_RECEIVED: 1023 1020 //fibril_rwlock_read_lock(&tcp_globals.lock); 1024 if(! ERROR_OCCURRED(packet_translate _remote(tcp_globals.net_phone, &packet, IPC_GET_PACKET(call)))){1021 if(! ERROR_OCCURRED(packet_translate(tcp_globals.net_phone, &packet, IPC_GET_PACKET(call)))){ 1025 1022 ERROR_CODE = tcp_received_msg(IPC_GET_DEVICE(call), packet, SERVICE_TCP, IPC_GET_ERROR(call)); 1026 1023 } … … 1065 1062 int socket_id; 1066 1063 size_t addrlen; 1067 size_t size;1068 1064 fibril_rwlock_t lock; 1069 1065 ipc_call_t answer; … … 1111 1107 socket_id = SOCKET_GET_SOCKET_ID(call); 1112 1108 res = socket_create(&local_sockets, app_phone, socket_data, &socket_id); 1113 SOCKET_SET_SOCKET_ID(answer, socket_id);1109 *SOCKET_SET_SOCKET_ID(answer) = socket_id; 1114 1110 fibril_rwlock_write_unlock(&lock); 1115 1111 if(res == EOK){ 1116 if 1117 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, ((packet_dimension->content < socket_data->data_fragment_size) ? packet_dimension->content : socket_data->data_fragment_size));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); 1118 1114 } 1119 // SOCKET_SET_DATA_FRAGMENT_SIZE(answer, MAX_TCP_FRAGMENT_SIZE);1120 SOCKET_SET_HEADER_SIZE(answer, TCP_HEADER_SIZE);1115 // *SOCKET_SET_DATA_FRAGMENT_SIZE(answer) = MAX_TCP_FRAGMENT_SIZE; 1116 *SOCKET_SET_HEADER_SIZE(answer) = TCP_HEADER_SIZE; 1121 1117 answer_count = 3; 1122 1118 }else{ … … 1170 1166 fibril_rwlock_read_lock(&tcp_globals.lock); 1171 1167 fibril_rwlock_write_lock(&lock); 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); 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); 1174 1169 fibril_rwlock_write_unlock(&lock); 1175 1170 fibril_rwlock_read_unlock(&tcp_globals.lock); 1176 1171 if(res > 0){ 1177 SOCKET_SET_SOCKET_ID(answer, res);1178 SOCKET_SET_ADDRESS_LENGTH(answer, addrlen);1172 *SOCKET_SET_SOCKET_ID(answer) = res; 1173 *SOCKET_SET_ADDRESS_LENGTH(answer) = addrlen; 1179 1174 answer_count = 3; 1180 1175 } … … 1183 1178 fibril_rwlock_read_lock(&tcp_globals.lock); 1184 1179 fibril_rwlock_write_lock(&lock); 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); 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)); 1187 1181 if(res != EOK){ 1188 1182 fibril_rwlock_write_unlock(&lock); … … 1197 1191 fibril_rwlock_read_lock(&tcp_globals.lock); 1198 1192 fibril_rwlock_write_lock(&lock); 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); 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)); 1201 1194 if(res != EOK){ 1202 1195 fibril_rwlock_write_unlock(&lock); … … 1215 1208 fibril_rwlock_read_unlock(&tcp_globals.lock); 1216 1209 if(res > 0){ 1217 SOCKET_SET_READ_DATA_LENGTH(answer, res);1210 *SOCKET_SET_READ_DATA_LENGTH(answer) = res; 1218 1211 answer_count = 1; 1219 1212 res = EOK; … … 1227 1220 fibril_rwlock_read_unlock(&tcp_globals.lock); 1228 1221 if(res > 0){ 1229 SOCKET_SET_READ_DATA_LENGTH(answer, res);1230 SOCKET_SET_ADDRESS_LENGTH(answer, addrlen);1222 *SOCKET_SET_READ_DATA_LENGTH(answer) = res; 1223 *SOCKET_SET_ADDRESS_LENGTH(answer) = addrlen; 1231 1224 answer_count = 3; 1232 1225 res = EOK; … … 1568 1561 }else{ 1569 1562 if(ERROR_OCCURRED(pq_insert_after(previous, copy))){ 1570 pq_release _remote(tcp_globals.net_phone, packet_get_id(copy));1563 pq_release(tcp_globals.net_phone, packet_get_id(copy)); 1571 1564 return sending; 1572 1565 } … … 1600 1593 // adjust the pseudo header 1601 1594 if(ERROR_OCCURRED(ip_client_set_pseudo_header_data_length(socket_data->pseudo_header, socket_data->headerlen, packet_get_data_length(packet)))){ 1602 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));1595 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 1603 1596 return NULL; 1604 1597 } … … 1607 1600 header = (tcp_header_ref) packet_get_data(packet); 1608 1601 if(! header){ 1609 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));1602 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 1610 1603 return NULL; 1611 1604 } … … 1628 1621 // prepare the timeout 1629 1622 || ERROR_OCCURRED(tcp_prepare_timeout(tcp_timeout, socket, socket_data, sequence_number, socket_data->state, socket_data->timeout, true))){ 1630 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));1623 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 1631 1624 return NULL; 1632 1625 } … … 1753 1746 return NO_DATA; 1754 1747 } 1755 ERROR_PROPAGATE(packet_translate _remote(tcp_globals.net_phone, &packet, packet_id));1748 ERROR_PROPAGATE(packet_translate(tcp_globals.net_phone, &packet, packet_id)); 1756 1749 1757 1750 // reply the packets … … 1760 1753 // release the packet 1761 1754 dyn_fifo_pop(&socket->received); 1762 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));1755 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 1763 1756 // return the total length 1764 1757 return (int) length; … … 1892 1885 ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone, &tcp_globals.dimensions, socket_data->device_id, &packet_dimension)); 1893 1886 // get a new packet 1894 *packet = packet_get_4 _remote(tcp_globals.net_phone, TCP_HEADER_SIZE, packet_dimension->addr_len, packet_dimension->prefix, packet_dimension->suffix);1887 *packet = packet_get_4(tcp_globals.net_phone, TCP_HEADER_SIZE, packet_dimension->addr_len, packet_dimension->prefix, packet_dimension->suffix); 1895 1888 if(! * packet){ 1896 1889 return ENOMEM; … … 1996 1989 1997 1990 int tcp_release_and_return(packet_t packet, int result){ 1998 pq_release _remote(tcp_globals.net_phone, packet_get_id(packet));1991 pq_release(tcp_globals.net_phone, packet_get_id(packet)); 1999 1992 return result; 2000 }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 connection2012 * - 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 1993 } 2059 1994
Note:
See TracChangeset
for help on using the changeset viewer.