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