source: mainline/uspace/srv/net/tl/tcp/tcp.h@ 46ae62c

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 46ae62c was 89e57cee, checked in by Jakub Jermar <jakub@…>, 15 years ago

Cleanup tpc.

  • Property mode set to 100644
File size: 8.1 KB
RevLine 
[21580dd]1/*
2 * Copyright (c) 2008 Lukas Mejdrech
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup tcp
[89e57cee]30 * @{
[21580dd]31 */
32
33/** @file
[89e57cee]34 * TCP module.
[21580dd]35 */
36
[89e57cee]37#ifndef NET_TCP_H_
38#define NET_TCP_H_
[21580dd]39
40#include <fibril_synch.h>
41
[c69d327]42#include <net/packet.h>
[e526f08]43#include <net/device.h>
[849ed54]44#include <socket_core.h>
45#include <tl_common.h>
[21580dd]46
47/** Type definition of the TCP global data.
[89e57cee]48 * @see tcp_globals
[21580dd]49 */
[89e57cee]50typedef struct tcp_globals tcp_globals_t;
[21580dd]51
52/** Type definition of the TCP socket specific data.
[89e57cee]53 * @see tcp_socket_data
[21580dd]54 */
[89e57cee]55typedef struct tcp_socket_data tcp_socket_data_t;
[21580dd]56
57/** Type definition of the TCP socket specific data pointer.
[89e57cee]58 * @see tcp_socket_data
[21580dd]59 */
[89e57cee]60typedef tcp_socket_data_t *tcp_socket_data_ref;
[21580dd]61
62/** Type definition of the TCP operation data.
[89e57cee]63 * @see tcp_operation
[21580dd]64 */
[89e57cee]65typedef struct tcp_operation tcp_operation_t;
[21580dd]66
67/** Type definition of the TCP operation data pointer.
[89e57cee]68 * @see tcp_operation
[21580dd]69 */
[89e57cee]70typedef tcp_operation_t *tcp_operation_ref;
[21580dd]71
72/** TCP socket state type definition.
[89e57cee]73 * @see tcp_socket_state
[21580dd]74 */
[89e57cee]75typedef enum tcp_socket_state tcp_socket_state_t;
[21580dd]76
[89e57cee]77/** TCP socket state. */
78enum tcp_socket_state {
[21580dd]79 /** Initial.
[89e57cee]80 *
81 * Not connected or bound.
[21580dd]82 */
83 TCP_SOCKET_INITIAL,
[89e57cee]84
[21580dd]85 /** Listening.
[89e57cee]86 *
87 * Awaiting a connection request from another TCP layer.
88 * When SYN is received a new bound socket in the
89 * TCP_SOCKET_SYN_RECEIVED state should be created.
[21580dd]90 */
91 TCP_SOCKET_LISTEN,
[89e57cee]92
[21580dd]93 /** Connecting issued.
[89e57cee]94 *
95 * A SYN has been sent, and TCP is awaiting the response SYN.
96 * Should continue to the TCP_SOCKET_ESTABLISHED state.
[21580dd]97 */
98 TCP_SOCKET_SYN_SENT,
[89e57cee]99
[21580dd]100 /** Connecting received.
[89e57cee]101 *
102 * A SYN has been received, a SYN has been sent, and TCP is awaiting an
103 * ACK. Should continue to the TCP_SOCKET_ESTABLISHED state.
[21580dd]104 */
105 TCP_SOCKET_SYN_RECEIVED,
[89e57cee]106
[21580dd]107 /** Connected.
[89e57cee]108 *
109 * The three-way handshake has been completed.
[21580dd]110 */
111 TCP_SOCKET_ESTABLISHED,
[89e57cee]112
[21580dd]113 /** Closing started.
[89e57cee]114 *
115 * The local application has issued a CLOSE.
116 * TCP has sent a FIN, and is awaiting an ACK or a FIN.
117 * Should continue to the TCP_SOCKET_FIN_WAIT_2 state when an ACK is
118 * received.
119 * Should continue to the TCP_SOCKET_CLOSING state when a FIN is
120 * received.
[21580dd]121 */
122 TCP_SOCKET_FIN_WAIT_1,
[89e57cee]123
[21580dd]124 /** Closing confirmed.
[89e57cee]125 *
126 * A FIN has been sent, and an ACK received.
127 * TCP is awaiting a~FIN from the remote TCP layer.
128 * Should continue to the TCP_SOCKET_CLOSING state.
[21580dd]129 */
130 TCP_SOCKET_FIN_WAIT_2,
[89e57cee]131
[21580dd]132 /** Closing.
[89e57cee]133 *
134 * A FIN has been sent, a FIN has been received, and an ACK has been
135 * sent.
136 * TCP is awaiting an ACK for the FIN that was sent.
137 * Should continue to the TCP_SOCKET_TIME_WAIT state.
[21580dd]138 */
139 TCP_SOCKET_CLOSING,
[89e57cee]140
[21580dd]141 /** Closing received.
[89e57cee]142 *
143 * TCP has received a FIN, and has sent an ACK.
144 * It is awaiting a close request from the local application before
145 * sending a FIN.
146 * Should continue to the TCP_SOCKET_SOCKET_LAST_ACK state.
[21580dd]147 */
148 TCP_SOCKET_CLOSE_WAIT,
[89e57cee]149
150 /**
151 * A FIN has been received, and an ACK and a FIN have been sent.
152 * TCP is awaiting an ACK.
153 * Should continue to the TCP_SOCKET_TIME_WAIT state.
[21580dd]154 */
155 TCP_SOCKET_LAST_ACK,
[89e57cee]156
[21580dd]157 /** Closing finished.
[89e57cee]158 *
159 * FINs have been received and ACK’d, and TCP is waiting two MSLs to
160 * remove the connection from the table.
[21580dd]161 */
162 TCP_SOCKET_TIME_WAIT,
[89e57cee]163
[21580dd]164 /** Closed.
[89e57cee]165 *
166 * Imaginary, this indicates that a connection has been removed from
167 * the connection table.
[21580dd]168 */
169 TCP_SOCKET_CLOSED
170};
171
[89e57cee]172/** TCP operation data. */
173struct tcp_operation {
174 /** Operation result. */
[aadf01e]175 int result;
[89e57cee]176 /** Safety lock. */
[aadf01e]177 fibril_mutex_t mutex;
[89e57cee]178 /** Operation result signaling. */
[aadf01e]179 fibril_condvar_t condvar;
[21580dd]180};
181
[89e57cee]182/** TCP socket specific data. */
183struct tcp_socket_data {
184 /** TCP socket state. */
[aadf01e]185 tcp_socket_state_t state;
[89e57cee]186
187 /**
188 * Data fragment size.
189 * Sending optimalization.
[21580dd]190 */
[aadf01e]191 size_t data_fragment_size;
[89e57cee]192
193 /** Device identifier. */
[aadf01e]194 device_id_t device_id;
[89e57cee]195
196 /**
197 * Listening backlog.
198 * The maximal number of connected but not yet accepted sockets.
[21580dd]199 */
[aadf01e]200 int backlog;
[89e57cee]201
202// /** Segment size. */
203// size_t segment_size;
204
205 /**
206 * Parent listening socket identifier.
207 * Set if this socket is an accepted one.
[21580dd]208 */
[aadf01e]209 int listening_socket_id;
[89e57cee]210
211 /** Treshold size in bytes. */
[aadf01e]212 size_t treshold;
[89e57cee]213 /** Window size in bytes. */
[aadf01e]214 size_t window;
[89e57cee]215 /** Acknowledgement timeout. */
[aadf01e]216 suseconds_t timeout;
[89e57cee]217 /** Last acknowledged byte. */
[aadf01e]218 uint32_t acknowledged;
[89e57cee]219 /** Next incoming sequence number. */
[aadf01e]220 uint32_t next_incoming;
[89e57cee]221 /** Incoming FIN. */
[aadf01e]222 uint32_t fin_incoming;
[89e57cee]223 /** Next outgoing sequence number. */
[aadf01e]224 uint32_t next_outgoing;
[89e57cee]225 /** Last outgoing sequence number. */
[aadf01e]226 uint32_t last_outgoing;
[89e57cee]227 /** Outgoing FIN. */
[aadf01e]228 uint32_t fin_outgoing;
[89e57cee]229
230 /**
231 * Expected sequence number by the remote host.
232 * The sequence number the other host expects.
233 * The notification is sent only upon a packet reecival.
[21580dd]234 */
[aadf01e]235 uint32_t expected;
[89e57cee]236
237 /**
238 * Expected sequence number counter.
239 * Counts the number of received notifications for the same sequence
240 * number.
[21580dd]241 */
[aadf01e]242 int expected_count;
[89e57cee]243
[21580dd]244 /** Incoming packet queue.
[89e57cee]245 *
246 * Packets are buffered until received in the right order.
247 * The packets are excluded after successfully read.
248 * Packets are sorted by their starting byte.
249 * Packets metric is set as their data length.
[21580dd]250 */
[aadf01e]251 packet_t incoming;
[89e57cee]252
[21580dd]253 /** Outgoing packet queue.
[89e57cee]254 *
255 * Packets are buffered until acknowledged by the remote host in the
256 * right order.
257 * The packets are excluded after acknowledged.
258 * Packets are sorted by their starting byte.
259 * Packets metric is set as their data length.
[21580dd]260 */
[aadf01e]261 packet_t outgoing;
[89e57cee]262
263 /** IP pseudo header. */
[14f1db0]264 void *pseudo_header;
[89e57cee]265 /** IP pseudo header length. */
[aadf01e]266 size_t headerlen;
[89e57cee]267 /** Remote host address. */
268 struct sockaddr *addr;
269 /** Remote host address length. */
[aadf01e]270 socklen_t addrlen;
[89e57cee]271 /** Remote host port. */
[aadf01e]272 uint16_t dest_port;
[89e57cee]273 /** Parent local sockets. */
[aadf01e]274 socket_cores_ref local_sockets;
[89e57cee]275
[21580dd]276 /** Local sockets safety lock.
[89e57cee]277 *
278 * May be locked for writing while holding the global lock for reading
279 * when changing the local sockets only.
280 * The global lock may be locked only before locking the local lock.
281 * The global lock may be locked more weakly than the local lock.
282 * The global lock may be released before releasing the local lock.
283 * @see tcp_globals:lock
284 */
285 fibril_rwlock_t *local_lock;
286
287 /** Pending operation data. */
[aadf01e]288 tcp_operation_t operation;
[89e57cee]289
290 /**
291 * Timeouts in a row counter.
292 * If TCP_MAX_TIMEOUTS is reached, the connection is lost.
[21580dd]293 */
[aadf01e]294 int timeout_count;
[21580dd]295};
296
[89e57cee]297/** TCP global data. */
298struct tcp_globals {
299 /** Networking module phone. */
[aadf01e]300 int net_phone;
[89e57cee]301 /** IP module phone. */
[aadf01e]302 int ip_phone;
[89e57cee]303 /** ICMP module phone. */
[aadf01e]304 int icmp_phone;
[89e57cee]305 /** Last used free port. */
[aadf01e]306 int last_used_port;
[89e57cee]307 /** Active sockets. */
[aadf01e]308 socket_ports_t sockets;
[89e57cee]309 /** Device packet dimensions. */
[aadf01e]310 packet_dimensions_t dimensions;
[89e57cee]311
312 /**
313 * Safety lock.
314 * Write lock is used only for adding or removing socket ports.
[21580dd]315 */
[aadf01e]316 fibril_rwlock_t lock;
[21580dd]317};
318
319#endif
320
321/** @}
322 */
Note: See TracBrowser for help on using the repository browser.