39,13 → 39,240 |
|
#include <fibril_sync.h> |
|
#include "../../structures/packet/packet.h" |
|
#include "../../include/device.h" |
|
#include "../../socket/socket_core.h" |
|
#include "../tl_common.h" |
|
/** Type definition of the TCP global data. |
* @see tcp_globals |
*/ |
typedef struct tcp_globals tcp_globals_t; |
|
/** Type definition of the TCP socket specific data. |
* @see tcp_socket_data |
*/ |
typedef struct tcp_socket_data tcp_socket_data_t; |
|
/** Type definition of the TCP socket specific data pointer. |
* @see tcp_socket_data |
*/ |
typedef tcp_socket_data_t * tcp_socket_data_ref; |
|
/** Type definition of the TCP operation data. |
* @see tcp_operation |
*/ |
typedef struct tcp_operation tcp_operation_t; |
|
/** Type definition of the TCP operation data pointer. |
* @see tcp_operation |
*/ |
typedef tcp_operation_t * tcp_operation_ref; |
|
/** TCP socket state type definition. |
* @see tcp_socket_state |
*/ |
typedef enum tcp_socket_state tcp_socket_state_t; |
|
/** Device packet dimensions. |
* Maps devices to the packet dimensions. |
* @see device.h |
*/ |
DEVICE_MAP_DECLARE( packet_dimensions, packet_dimension_t ); |
|
/** TCP socket state. |
*/ |
enum tcp_socket_state{ |
/** Initial. |
* Not connected or bound. |
*/ |
TCP_SOCKET_INITIAL, |
/** Listening. |
* Awaiting a connection request from another TCP layer. |
* When SYN is received a new bound socket in the TCP_SOCKET_SYN_RECEIVED state should be created. |
*/ |
TCP_SOCKET_LISTEN, |
/** Connecting issued. |
* A~SYN has been sent, and TCP is awaiting the response SYN. |
* Should continue to the TCP_SOCKET_ESTABLISHED state. |
*/ |
TCP_SOCKET_SYN_SENT, |
/** Connecting received. |
* A~SYN has been received, a~SYN has been sent, and TCP is awaiting an ACK. |
* Should continue to the TCP_SOCKET_ESTABLISHED state. |
*/ |
TCP_SOCKET_SYN_RECEIVED, |
/** Connected. |
* The three-way handshake has been completed. |
*/ |
TCP_SOCKET_ESTABLISHED, |
/** Closing started. |
* The local application has issued a~CLOSE. |
* TCP has sent a~FIN, and is awaiting an ACK or a~FIN. |
* Should continue to the TCP_SOCKET_FIN_WAIT_2 state when an ACK is received. |
* Should continue to the TCP_SOCKET_CLOSING state when a~FIN is received. |
*/ |
TCP_SOCKET_FIN_WAIT_1, |
/** Closing confirmed. |
* A~FIN has been sent, and an ACK received. |
* TCP is awaiting a~FIN from the remote TCP layer. |
* Should continue to the TCP_SOCKET_CLOSING state. |
*/ |
TCP_SOCKET_FIN_WAIT_2, |
/** Closing. |
* A FIN has been sent, a FIN has been received, and an ACK has been sent. |
* TCP is awaiting an ACK for the FIN that was sent. |
* Should continue to the TCP_SOCKET_TIME_WAIT state. |
*/ |
TCP_SOCKET_CLOSING, |
/** Closing received. |
* TCP has received a~FIN, and has sent an ACK. |
* It is awaiting a~close request from the local application before sending a~FIN. |
* Should continue to the TCP_SOCKET_SOCKET_LAST_ACK state. |
*/ |
TCP_SOCKET_CLOSE_WAIT, |
/** |
* A~FIN has been received, and an ACK and a~FIN have been sent. |
* TCP is awaiting an ACK. |
* Should continue to the TCP_SOCKET_TIME_WAIT state. |
*/ |
TCP_SOCKET_LAST_ACK, |
/** Closing finished. |
* FINs have been received and ACK’d, and TCP is waiting two MSLs to remove the connection from the table. |
*/ |
TCP_SOCKET_TIME_WAIT, |
/** Closed. |
* Imaginary, this indicates that a~connection has been removed from the connection table. |
*/ |
TCP_SOCKET_CLOSED |
}; |
|
/** TCP operation data. |
*/ |
struct tcp_operation{ |
/** Operation result. |
*/ |
int result; |
/** Safety lock. |
*/ |
fibril_mutex_t mutex; |
/** Operation result signaling. |
*/ |
fibril_condvar_t condvar; |
}; |
|
/** TCP socket specific data. |
*/ |
struct tcp_socket_data{ |
/** TCP socket state. |
*/ |
tcp_socket_state_t state; |
/** Data fragment size. |
* Sending optimalization. |
*/ |
size_t data_fragment_size; |
/** Device identifier. |
*/ |
device_id_t device_id; |
/** Listening backlog. |
* The maximal number of connected but not yet accepted sockets. |
*/ |
int backlog; |
// /** Segment size. |
// */ |
// size_t segment_size; |
/** Parent listening socket identifier. |
* Set if this socket is an accepted one. |
*/ |
int listening_socket_id; |
/** Treshold size in bytes. |
*/ |
size_t treshold; |
/** Window size in bytes. |
*/ |
size_t window; |
/** Acknowledgement timeout. |
*/ |
suseconds_t timeout; |
/** Last acknowledged byte. |
*/ |
uint32_t acknowledged; |
/** Next incoming sequence number. |
*/ |
uint32_t next_incoming; |
/** Incoming FIN. |
*/ |
uint32_t fin_incoming; |
/** Next outgoing sequence number. |
*/ |
uint32_t next_outgoing; |
/** Last outgoing sequence number. |
*/ |
uint32_t last_outgoing; |
/** Outgoing FIN. |
*/ |
uint32_t fin_outgoing; |
/** Expected sequence number by the remote host. |
* The sequence number the other host expects. |
* The notification is sent only upon a packet reecival. |
*/ |
uint32_t expected; |
/** Expected sequence number counter. |
* Counts the number of received notifications for the same sequence number. |
*/ |
int expected_count; |
/** Incoming packet queue. |
* Packets are buffered until received in the right order. |
* The packets are excluded after successfully read. |
* Packets are sorted by their starting byte. |
* Packets metric is set as their data length. |
*/ |
packet_t incoming; |
/** Outgoing packet queue. |
* Packets are buffered until acknowledged by the remote host in the right order. |
* The packets are excluded after acknowledged. |
* Packets are sorted by their starting byte. |
* Packets metric is set as their data length. |
*/ |
packet_t outgoing; |
/** IP pseudo header. |
*/ |
ip_pseudo_header_ref pseudo_header; |
/** IP pseudo header length. |
*/ |
size_t headerlen; |
/** Remote host address. |
*/ |
struct sockaddr * addr; |
/** Remote host address length. |
*/ |
socklen_t addrlen; |
/** Remote host port. |
*/ |
uint16_t dest_port; |
/** Parent local sockets. |
*/ |
socket_cores_ref local_sockets; |
/** Local sockets safety lock. |
* May be locked for writing while holding the global lock for reading when changing the local sockets only. |
* The global lock may to be locked only before locking the local lock. |
* The global lock may be locked more weakly than the local lock. |
* The global lock may be released before releasing the local lock. |
* @see tcp_globals:lock |
*/ |
fibril_rwlock_t * local_lock; |
/** Pending operation data. |
*/ |
tcp_operation_t operation; |
/** Timeouts in a row counter. |
* If TCP_MAX_TIMEOUTS is reached, the connection is lost. |
*/ |
int timeout_count; |
}; |
|
/** TCP global data. |
*/ |
struct tcp_globals{ |
64,7 → 291,11 |
/** Active sockets. |
*/ |
socket_ports_t sockets; |
/** Device packet dimensions. |
*/ |
packet_dimensions_t dimensions; |
/** Safety lock. |
* Write lock is used only for adding or removing socket ports. |
*/ |
fibril_rwlock_t lock; |
}; |