Changeset 00aece0 in mainline for uspace/srv/net/tl/tcp/tcp.h
- Timestamp:
- 2012-02-18T16:47:38Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4449c6c
- Parents:
- bd5f3b7 (diff), f943dd3 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tl/tcp/tcp.h
rbd5f3b7 r00aece0 1 1 /* 2 * Copyright (c) 20 08 Lukas Mejdrech2 * Copyright (c) 2011 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 30 30 * @{ 31 31 */ 32 33 /** @file 34 * TCP module. 32 /** @file TCP (Transmission Control Protocol) network module 35 33 */ 36 34 37 #ifndef NET_TCP_H_38 #define NET_TCP_H_35 #ifndef TCP_H 36 #define TCP_H 39 37 40 38 #include <async.h> 41 #include <fibril_synch.h> 42 #include <net/packet.h> 43 #include <net/device.h> 44 #include <socket_core.h> 45 #include <tl_common.h> 39 #include <packet_remote.h> 40 #include "tcp_type.h" 46 41 47 /** Type definition of the TCP global data. 48 * @see tcp_globals 49 */ 50 typedef struct tcp_globals tcp_globals_t; 51 52 /** Type definition of the TCP socket specific data. 53 * @see tcp_socket_data 54 */ 55 typedef struct tcp_socket_data tcp_socket_data_t; 56 57 /** Type definition of the TCP operation data. 58 * @see tcp_operation 59 */ 60 typedef struct tcp_operation tcp_operation_t; 61 62 /** TCP socket state type definition. 63 * @see tcp_socket_state 64 */ 65 typedef enum tcp_socket_state tcp_socket_state_t; 66 67 /** TCP socket state. */ 68 enum 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. */ 163 struct 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. */ 173 struct 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. */ 285 struct tcp_globals { 286 /** Networking module session. */ 287 async_sess_t *net_sess; 288 /** IP module session. */ 289 async_sess_t *ip_sess; 290 /** ICMP module session. */ 291 async_sess_t *icmp_sess; 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 }; 42 extern async_sess_t *net_sess; 43 extern async_sess_t *ip_sess; 44 extern void tcp_transmit_pdu(tcp_pdu_t *); 305 45 306 46 #endif
Note:
See TracChangeset
for help on using the changeset viewer.