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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 55091847 was 28a3e74, checked in by Jiri Svoboda <jiri@…>, 14 years ago

Fix comment style.

  • Property mode set to 100644
File size: 7.8 KB
Line 
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
30 * @{
31 */
32
33/** @file
34 * TCP module.
35 */
36
37#ifndef NET_TCP_H_
38#define NET_TCP_H_
39
40#include <fibril_synch.h>
41
42#include <net/packet.h>
43#include <net/device.h>
44#include <socket_core.h>
45#include <tl_common.h>
46
47/** Type definition of the TCP global data.
48 * @see tcp_globals
49 */
50typedef struct tcp_globals tcp_globals_t;
51
52/** Type definition of the TCP socket specific data.
53 * @see tcp_socket_data
54 */
55typedef struct tcp_socket_data tcp_socket_data_t;
56
57/** Type definition of the TCP operation data.
58 * @see tcp_operation
59 */
60typedef struct tcp_operation tcp_operation_t;
61
62/** TCP socket state type definition.
63 * @see tcp_socket_state
64 */
65typedef enum tcp_socket_state tcp_socket_state_t;
66
67/** TCP socket state. */
68enum tcp_socket_state {
69 /** Initial.
70 *
71 * Not connected or bound.
72 */
73 TCP_SOCKET_INITIAL,
74
75 /** Listening.
76 *
77 * Awaiting a connection request from another TCP layer.
78 * When SYN is received a new bound socket in the
79 * TCP_SOCKET_SYN_RECEIVED state should be created.
80 */
81 TCP_SOCKET_LISTEN,
82
83 /** Connecting issued.
84 *
85 * A SYN has been sent, and TCP is awaiting the response SYN.
86 * Should continue to the TCP_SOCKET_ESTABLISHED state.
87 */
88 TCP_SOCKET_SYN_SENT,
89
90 /** Connecting received.
91 *
92 * A SYN has been received, a SYN has been sent, and TCP is awaiting an
93 * ACK. Should continue to the TCP_SOCKET_ESTABLISHED state.
94 */
95 TCP_SOCKET_SYN_RECEIVED,
96
97 /** Connected.
98 *
99 * The three-way handshake has been completed.
100 */
101 TCP_SOCKET_ESTABLISHED,
102
103 /** Closing started.
104 *
105 * The local application has issued a CLOSE.
106 * TCP has sent a FIN, and is awaiting an ACK or a FIN.
107 * Should continue to the TCP_SOCKET_FIN_WAIT_2 state when an ACK is
108 * received.
109 * Should continue to the TCP_SOCKET_CLOSING state when a FIN is
110 * received.
111 */
112 TCP_SOCKET_FIN_WAIT_1,
113
114 /** Closing confirmed.
115 *
116 * A FIN has been sent, and an ACK received.
117 * TCP is awaiting a~FIN from the remote TCP layer.
118 * Should continue to the TCP_SOCKET_CLOSING state.
119 */
120 TCP_SOCKET_FIN_WAIT_2,
121
122 /** Closing.
123 *
124 * A FIN has been sent, a FIN has been received, and an ACK has been
125 * sent.
126 * TCP is awaiting an ACK for the FIN that was sent.
127 * Should continue to the TCP_SOCKET_TIME_WAIT state.
128 */
129 TCP_SOCKET_CLOSING,
130
131 /** Closing received.
132 *
133 * TCP has received a FIN, and has sent an ACK.
134 * It is awaiting a close request from the local application before
135 * sending a FIN.
136 * Should continue to the TCP_SOCKET_SOCKET_LAST_ACK state.
137 */
138 TCP_SOCKET_CLOSE_WAIT,
139
140 /**
141 * A FIN has been received, and an ACK and a FIN have been sent.
142 * TCP is awaiting an ACK.
143 * Should continue to the TCP_SOCKET_TIME_WAIT state.
144 */
145 TCP_SOCKET_LAST_ACK,
146
147 /** Closing finished.
148 *
149 * FINs have been received and ACK’d, and TCP is waiting two MSLs to
150 * remove the connection from the table.
151 */
152 TCP_SOCKET_TIME_WAIT,
153
154 /** Closed.
155 *
156 * Imaginary, this indicates that a connection has been removed from
157 * the connection table.
158 */
159 TCP_SOCKET_CLOSED
160};
161
162/** TCP operation data. */
163struct tcp_operation {
164 /** Operation result. */
165 int result;
166 /** Safety lock. */
167 fibril_mutex_t mutex;
168 /** Operation result signaling. */
169 fibril_condvar_t condvar;
170};
171
172/** TCP socket specific data. */
173struct tcp_socket_data {
174 /** TCP socket state. */
175 tcp_socket_state_t state;
176
177 /**
178 * Data fragment size.
179 * Sending optimalization.
180 */
181 size_t data_fragment_size;
182
183 /** Device identifier. */
184 device_id_t device_id;
185
186 /**
187 * Listening backlog.
188 * The maximal number of connected but not yet accepted sockets.
189 */
190 int backlog;
191
192 /**
193 * Parent listening socket identifier.
194 * Set if this socket is an accepted one.
195 */
196 int listening_socket_id;
197
198 /** Treshold size in bytes. */
199 size_t treshold;
200 /** Window size in bytes. */
201 size_t window;
202 /** Acknowledgement timeout. */
203 suseconds_t timeout;
204 /** Last acknowledged byte. */
205 uint32_t acknowledged;
206 /** Next incoming sequence number. */
207 uint32_t next_incoming;
208 /** Incoming FIN. */
209 uint32_t fin_incoming;
210 /** Next outgoing sequence number. */
211 uint32_t next_outgoing;
212 /** Last outgoing sequence number. */
213 uint32_t last_outgoing;
214 /** Outgoing FIN. */
215 uint32_t fin_outgoing;
216
217 /**
218 * Expected sequence number by the remote host.
219 * The sequence number the other host expects.
220 * The notification is sent only upon a packet reecival.
221 */
222 uint32_t expected;
223
224 /**
225 * Expected sequence number counter.
226 * Counts the number of received notifications for the same sequence
227 * number.
228 */
229 int expected_count;
230
231 /** Incoming packet queue.
232 *
233 * Packets are buffered until received in the right order.
234 * The packets are excluded after successfully read.
235 * Packets are sorted by their starting byte.
236 * Packets metric is set as their data length.
237 */
238 packet_t *incoming;
239
240 /** Outgoing packet queue.
241 *
242 * Packets are buffered until acknowledged by the remote host in the
243 * right order.
244 * The packets are excluded after acknowledged.
245 * Packets are sorted by their starting byte.
246 * Packets metric is set as their data length.
247 */
248 packet_t *outgoing;
249
250 /** IP pseudo header. */
251 void *pseudo_header;
252 /** IP pseudo header length. */
253 size_t headerlen;
254 /** Remote host address. */
255 struct sockaddr *addr;
256 /** Remote host address length. */
257 socklen_t addrlen;
258 /** Remote host port. */
259 uint16_t dest_port;
260 /** Parent local sockets. */
261 socket_cores_t *local_sockets;
262
263 /** Local sockets safety lock.
264 *
265 * May be locked for writing while holding the global lock for reading
266 * when changing the local sockets only.
267 * The global lock may be locked only before locking the local lock.
268 * The global lock may be locked more weakly than the local lock.
269 * The global lock may be released before releasing the local lock.
270 * @see tcp_globals:lock
271 */
272 fibril_rwlock_t *local_lock;
273
274 /** Pending operation data. */
275 tcp_operation_t operation;
276
277 /**
278 * Timeouts in a row counter.
279 * If TCP_MAX_TIMEOUTS is reached, the connection is lost.
280 */
281 int timeout_count;
282};
283
284/** TCP global data. */
285struct tcp_globals {
286 /** Networking module phone. */
287 int net_phone;
288 /** IP module phone. */
289 int ip_phone;
290 /** ICMP module phone. */
291 int icmp_phone;
292 /** Last used free port. */
293 int last_used_port;
294 /** Active sockets. */
295 socket_ports_t sockets;
296 /** Device packet dimensions. */
297 packet_dimensions_t dimensions;
298
299 /**
300 * Safety lock.
301 * Write lock is used only for adding or removing socket ports.
302 */
303 fibril_rwlock_t lock;
304};
305
306#endif
307
308/** @}
309 */
Note: See TracBrowser for help on using the repository browser.