32,7 → 32,7 |
|
/** @file |
* TCP header definition. |
* Names according to the linux src/include/linux/tcp.h header file. |
* Based on the RFC~793. |
*/ |
|
#ifndef __NET_TCP_HEADER_H__ |
40,6 → 40,16 |
|
#include <sys/types.h> |
|
/** Returns the actual TCP header length. |
* @param header The TCP packet header. Input parameter. |
*/ |
#define TCP_HEADER_LENGTH( header ) (( header )->header_length * 4u ) |
|
/** Returns the actual TCP header length. |
* @param header The TCP packet header. Input parameter. |
*/ |
#define TCP_COMPUTE_HEADER_LENGTH( length ) (( uint8_t ) (( length ) / 4u )) |
|
/** Type definition of the transmission datagram header. |
* @see tcp_header |
*/ |
50,105 → 60,162 |
*/ |
typedef tcp_header_t * tcp_header_ref; |
|
/** Type definition of the transmission datagram header option. |
* @see tcp_option |
*/ |
typedef struct tcp_option tcp_option_t; |
|
/** Type definition of the transmission datagram header option pointer. |
* @see tcp_option |
*/ |
typedef tcp_option_t * tcp_option_ref; |
|
/** Type definition of the Maximum segment size TCP option. |
* @see ... |
*/ |
typedef struct tcp_max_segment_size_option tcp_max_segment_size_option_t; |
|
/** Type definition of the Maximum segment size TCP option pointer. |
* @see tcp_max_segment_size_option |
*/ |
typedef tcp_max_segment_size_option_t * tcp_max_segment_size_option_ref; |
|
/** Transmission datagram header. |
*/ |
struct tcp_header{ |
/** The 16-bit source port number, used by the receiver to reply. |
/** The source port number. |
*/ |
uint16_t source; |
/** The 16-bit destination port number. |
uint16_t source_port; |
/** The destination port number. |
*/ |
uint16_t dest; |
/** The sequence number of the first data byte in this segment. |
* If the SYN control bit is set, the sequence number is the initial sequence number (n) and the first data byte is n+1. |
uint16_t destination_port; |
/** The sequence number of the first data octet in this segment (except when SYN is present). |
* If SYN is present the sequence number is the initial sequence number (ISN) and the first data octet is ISN+1. |
*/ |
uint32_t seq; |
/** If the ACK control bit is set, this field contains the value of the next sequence number that the receiver is expecting to receive. |
uint32_t sequence_number; |
/** If the ACK control bit is set this field contains the value of the next sequence number the sender of the segment is expecting to receive. |
* Once a~connection is established this is always sent. |
* @see acknowledge |
*/ |
uint32_t ack_seq; |
uint32_t acknowledgement_number; |
#ifdef ARCH_IS_BIG_ENDIAN |
/** The number of 32-bit words in the TCP header. |
* It indicates where the data begins. |
/** The number of 32~bit words in the TCP Header. |
* This indicates where the data begins. |
* The TCP header (even one including options) is an integral number of 32~bits long. |
*/ |
uint8_t doff:4; |
uint8_t header_length:4; |
/** Four bits reserved for future use. |
* Must be zero. |
*/ |
uint8_t res1:4; |
uint8_t reserved1:4; |
#else |
/** Four bits reserved for future use. |
* Must be zero. |
*/ |
uint8_t res1:4; |
/** The number of 32-bit words in the TCP header. |
* It indicates where the data begins. |
uint8_t reserved1:4; |
/** The number of 32~bit words in the TCP Header. |
* This indicates where the data begins. |
* The TCP header (even one including options) is an integral number of 32~bits long. |
*/ |
uint8_t doff:4; |
uint8_t header_length:4; |
#endif |
#ifdef ARCH_IS_BIG_ENDIAN |
/** Two bits reserved for future use. |
* Must be zero. |
*/ |
uint8_t res2:2; |
/** Indicates that the urgent pointer field is significant in this segment. |
uint8_t reserved2:2; |
/** Urgent Pointer field significant. |
* @see tcp_header:urgent_pointer |
*/ |
uint8_t urg:1; |
/** Indicates that the acknowledgment field is significant in this segment. |
uint8_t urgent:1; |
/** Acknowledgment field significant |
* @see tcp_header:acknowledgement_number |
*/ |
uint8_t ack:1; |
uint8_t acknowledge:1; |
/** Push function. |
*/ |
uint8_t psh:1; |
/** Resets the connection. |
uint8_t push:1; |
/** Reset the connection. |
*/ |
uint8_t rst:1; |
/** Synchronizes the sequence numbers. |
uint8_t reset:1; |
/** Synchronize the sequence numbers. |
*/ |
uint8_t syn:1; |
/** No more data from sender. |
uint8_t synchronize:1; |
/** No more data from the sender. |
*/ |
uint8_t fin:1; |
uint8_t finalize:1; |
#else |
/** No more data from sender. |
/** No more data from the sender. |
*/ |
uint8_t fin:1; |
/** Synchronizes the sequence numbers. |
uint8_t finalize:1; |
/** Synchronize the sequence numbers. |
*/ |
uint8_t syn:1; |
/** Resets the connection. |
uint8_t synchronize:1; |
/** Reset the connection. |
*/ |
uint8_t rst:1; |
uint8_t reset:1; |
/** Push function. |
*/ |
uint8_t psh:1; |
/** Indicates that the acknowledgment field is significant in this segment. |
uint8_t push:1; |
/** Acknowledgment field significant. |
* @see tcp_header:acknowledgement_number |
*/ |
uint8_t ack:1; |
/** Indicates that the urgent pointer field is significant in this segment. |
uint8_t acknowledge:1; |
/** Urgent Pointer field significant. |
* @see tcp_header:urgent_pointer |
*/ |
uint8_t urg:1; |
uint8_t urgent:1; |
/** Two bits reserved for future use. |
* Must be zero. |
*/ |
uint8_t res2:2; |
uint8_t reserved2:2; |
#endif |
/** Used in ACK segments. |
* It specifies the number of data bytes, beginning with the one indicated in the acknowledgment number field that the receiver (the sender of this segment) is willing to accept. |
/** The number of data octets beginning with the one indicated in the acknowledgment field which the sender of this segment is willing to accept. |
* @see tcp_header:acknowledge |
*/ |
uint16_t window; |
/** The 16-bit one's complement of the one's complement sum of all 16-bit words in a pseudo-header, the TCP header, and the TCP data. |
* While computing the checksum, the checksum field itself is considered zero. |
/** The checksum field is the 16~bit one's complement of the one's complement sum of all 16~bit words in the header and text. |
* If a~segment contains an odd number of header and text octets to be checksummed, the last octet is padded on the right with zeros to form a~16~bit word for checksum purposes. |
* The pad is not transmitted as part of the segment. |
* While computing the checksum, the checksum field itself is replaced with zeros. |
* The checksum also coves a~pseudo header conceptually. |
* The pseudo header conceptually prefixed to the TCP header contains the source address, the destination address, the protocol, and the TCP length. |
* This information gives protection against misrouted datagrams. |
* If the computed checksum is zero, it is transmitted as all ones (the equivalent in one's complement arithmetic). |
*/ |
uint16_t check; |
/** Points to the first data octet following the urgent data. |
* Only significant when the URG control bit is set. |
uint16_t checksum; |
/** This field communicates the current value of the urgent pointer as a~positive offset from the sequence number in this segment. |
* The urgent pointer points to the sequence number of the octet following the urgent data. |
* This field is only be interpreted in segments with the URG control bit set. |
* @see tcp_header:urgent |
*/ |
uint16_t urg_ptr; |
uint16_t urgent_pointer; |
} __attribute__ ((packed)); |
|
/** Transmission datagram header option. |
*/ |
struct tcp_option{ |
/** Option type. |
*/ |
uint8_t type; |
/** Option length. |
*/ |
uint8_t length; |
}; |
|
/** Maximum segment size TCP option. |
*/ |
struct tcp_max_segment_size_option{ |
/** TCP option. |
* @see TCPOPT_MAX_SEGMENT_SIZE |
* @see TCPOPT_MAX_SEGMENT_SIZE_LENGTH |
*/ |
tcp_option_t option; |
/** Maximum segment size in bytes. |
*/ |
uint16_t max_segment_size; |
} __attribute__ ((packed)); |
|
#endif |
|
/** @} |