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

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

Redefine packet_t to be just a type alias for struct packet.

  • Property mode set to 100644
File size: 7.9 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// /** Segment size. */
193// size_t segment_size;
194
195 /**
196 * Parent listening socket identifier.
197 * Set if this socket is an accepted one.
198 */
199 int listening_socket_id;
200
201 /** Treshold size in bytes. */
202 size_t treshold;
203 /** Window size in bytes. */
204 size_t window;
205 /** Acknowledgement timeout. */
206 suseconds_t timeout;
207 /** Last acknowledged byte. */
208 uint32_t acknowledged;
209 /** Next incoming sequence number. */
210 uint32_t next_incoming;
211 /** Incoming FIN. */
212 uint32_t fin_incoming;
213 /** Next outgoing sequence number. */
214 uint32_t next_outgoing;
215 /** Last outgoing sequence number. */
216 uint32_t last_outgoing;
217 /** Outgoing FIN. */
218 uint32_t fin_outgoing;
219
220 /**
221 * Expected sequence number by the remote host.
222 * The sequence number the other host expects.
223 * The notification is sent only upon a packet reecival.
224 */
225 uint32_t expected;
226
227 /**
228 * Expected sequence number counter.
229 * Counts the number of received notifications for the same sequence
230 * number.
231 */
232 int expected_count;
233
234 /** Incoming packet queue.
235 *
236 * Packets are buffered until received in the right order.
237 * The packets are excluded after successfully read.
238 * Packets are sorted by their starting byte.
239 * Packets metric is set as their data length.
240 */
241 packet_t *incoming;
242
243 /** Outgoing packet queue.
244 *
245 * Packets are buffered until acknowledged by the remote host in the
246 * right order.
247 * The packets are excluded after acknowledged.
248 * Packets are sorted by their starting byte.
249 * Packets metric is set as their data length.
250 */
251 packet_t *outgoing;
252
253 /** IP pseudo header. */
254 void *pseudo_header;
255 /** IP pseudo header length. */
256 size_t headerlen;
257 /** Remote host address. */
258 struct sockaddr *addr;
259 /** Remote host address length. */
260 socklen_t addrlen;
261 /** Remote host port. */
262 uint16_t dest_port;
263 /** Parent local sockets. */
264 socket_cores_t *local_sockets;
265
266 /** Local sockets safety lock.
267 *
268 * May be locked for writing while holding the global lock for reading
269 * when changing the local sockets only.
270 * The global lock may be locked only before locking the local lock.
271 * The global lock may be locked more weakly than the local lock.
272 * The global lock may be released before releasing the local lock.
273 * @see tcp_globals:lock
274 */
275 fibril_rwlock_t *local_lock;
276
277 /** Pending operation data. */
278 tcp_operation_t operation;
279
280 /**
281 * Timeouts in a row counter.
282 * If TCP_MAX_TIMEOUTS is reached, the connection is lost.
283 */
284 int timeout_count;
285};
286
287/** TCP global data. */
288struct tcp_globals {
289 /** Networking module phone. */
290 int net_phone;
291 /** IP module phone. */
292 int ip_phone;
293 /** ICMP module phone. */
294 int icmp_phone;
295 /** Last used free port. */
296 int last_used_port;
297 /** Active sockets. */
298 socket_ports_t sockets;
299 /** Device packet dimensions. */
300 packet_dimensions_t dimensions;
301
302 /**
303 * Safety lock.
304 * Write lock is used only for adding or removing socket ports.
305 */
306 fibril_rwlock_t lock;
307};
308
309#endif
310
311/** @}
312 */
Note: See TracBrowser for help on using the repository browser.