Changes in uspace/srv/net/tl/tcp/tcp_header.h [89e57cee:aadf01e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tl/tcp/tcp_header.h
r89e57cee raadf01e 28 28 29 29 /** @addtogroup tcp 30 * @{30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * TCP header definition.35 * Based on the RFC793.36 */ 37 38 #ifndef NET_TCP_HEADER_H_39 #define NET_TCP_HEADER_H_34 * TCP header definition. 35 * Based on the RFC~793. 36 */ 37 38 #ifndef __NET_TCP_HEADER_H__ 39 #define __NET_TCP_HEADER_H__ 40 40 41 41 #include <sys/types.h> 42 42 43 /** TCP header size in bytes. */ 44 #define TCP_HEADER_SIZE sizeof(tcp_header_t) 43 /** TCP header size in bytes. 44 */ 45 #define TCP_HEADER_SIZE sizeof(tcp_header_t) 45 46 46 47 /** Returns the actual TCP header length in bytes. 47 * @param[in] header The TCP packet header.48 */ 49 #define TCP_HEADER_LENGTH(header) ((header)->header_length * 4 U)48 * @param[in] header The TCP packet header. 49 */ 50 #define TCP_HEADER_LENGTH(header) ((header)->header_length * 4u) 50 51 51 52 /** Returns the TCP header length. 52 * @param[in] length The TCP header length in bytes.53 */ 54 #define TCP_COMPUTE_HEADER_LENGTH(length) ((uint8_t) ((length) / 4U))53 * @param[in] length The TCP header length in bytes. 54 */ 55 #define TCP_COMPUTE_HEADER_LENGTH(length) ((uint8_t) ((length) / 4u)) 55 56 56 57 /** Type definition of the transmission datagram header. 57 * @see tcp_header58 */ 59 typedef struct tcp_header 58 * @see tcp_header 59 */ 60 typedef struct tcp_header tcp_header_t; 60 61 61 62 /** Type definition of the transmission datagram header pointer. 62 * @see tcp_header63 */ 64 typedef tcp_header_t * tcp_header_ref;63 * @see tcp_header 64 */ 65 typedef tcp_header_t * tcp_header_ref; 65 66 66 67 /** Type definition of the transmission datagram header option. 67 * @see tcp_option68 */ 69 typedef struct tcp_option 68 * @see tcp_option 69 */ 70 typedef struct tcp_option tcp_option_t; 70 71 71 72 /** Type definition of the transmission datagram header option pointer. 72 * @see tcp_option 73 */ 74 typedef tcp_option_t *tcp_option_ref; 75 76 /** Type definition of the Maximum segment size TCP option. */ 77 typedef struct tcp_max_segment_size_option tcp_max_segment_size_option_t; 73 * @see tcp_option 74 */ 75 typedef tcp_option_t * tcp_option_ref; 76 77 /** Type definition of the Maximum segment size TCP option. 78 * @see ... 79 */ 80 typedef struct tcp_max_segment_size_option tcp_max_segment_size_option_t; 78 81 79 82 /** Type definition of the Maximum segment size TCP option pointer. 80 * @see tcp_max_segment_size_option 81 */ 82 typedef tcp_max_segment_size_option_t *tcp_max_segment_size_option_ref; 83 84 /** Transmission datagram header. */ 85 struct tcp_header { 83 * @see tcp_max_segment_size_option 84 */ 85 typedef tcp_max_segment_size_option_t * tcp_max_segment_size_option_ref; 86 87 /** Transmission datagram header. 88 */ 89 struct tcp_header{ 90 /** The source port number. 91 */ 86 92 uint16_t source_port; 93 /** The destination port number. 94 */ 87 95 uint16_t destination_port; 96 /** The sequence number of the first data octet in this segment (except when SYN is present). 97 * If SYN is present the sequence number is the initial sequence number (ISN) and the first data octet is ISN+1. 98 */ 88 99 uint32_t sequence_number; 100 /** 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. 101 * Once a~connection is established this is always sent. 102 * @see acknowledge 103 */ 89 104 uint32_t acknowledgement_number; 90 91 105 #ifdef ARCH_IS_BIG_ENDIAN 106 /** The number of 32~bit words in the TCP Header. 107 * This indicates where the data begins. 108 * The TCP header (even one including options) is an integral number of 32~bits long. 109 */ 92 110 uint8_t header_length:4; 111 /** Four bits reserved for future use. 112 * Must be zero. 113 */ 93 114 uint8_t reserved1:4; 94 115 #else 116 /** Four bits reserved for future use. 117 * Must be zero. 118 */ 95 119 uint8_t reserved1:4; 120 /** The number of 32~bit words in the TCP Header. 121 * This indicates where the data begins. 122 * The TCP header (even one including options) is an integral number of 32~bits long. 123 */ 96 124 uint8_t header_length:4; 97 125 #endif 98 99 126 #ifdef ARCH_IS_BIG_ENDIAN 127 /** Two bits reserved for future use. 128 * Must be zero. 129 */ 100 130 uint8_t reserved2:2; 131 /** Urgent Pointer field significant. 132 * @see tcp_header:urgent_pointer 133 */ 101 134 uint8_t urgent:1; 135 /** Acknowledgment field significant 136 * @see tcp_header:acknowledgement_number 137 */ 102 138 uint8_t acknowledge:1; 139 /** Push function. 140 */ 103 141 uint8_t push:1; 142 /** Reset the connection. 143 */ 104 144 uint8_t reset:1; 145 /** Synchronize the sequence numbers. 146 */ 105 147 uint8_t synchronize:1; 148 /** No more data from the sender. 149 */ 106 150 uint8_t finalize:1; 107 151 #else 152 /** No more data from the sender. 153 */ 108 154 uint8_t finalize:1; 155 /** Synchronize the sequence numbers. 156 */ 109 157 uint8_t synchronize:1; 158 /** Reset the connection. 159 */ 110 160 uint8_t reset:1; 161 /** Push function. 162 */ 111 163 uint8_t push:1; 164 /** Acknowledgment field significant. 165 * @see tcp_header:acknowledgement_number 166 */ 112 167 uint8_t acknowledge:1; 168 /** Urgent Pointer field significant. 169 * @see tcp_header:urgent_pointer 170 */ 113 171 uint8_t urgent:1; 172 /** Two bits reserved for future use. 173 * Must be zero. 174 */ 114 175 uint8_t reserved2:2; 115 176 #endif 116 177 /** The number of data octets beginning with the one indicated in the acknowledgment field which the sender of this segment is willing to accept. 178 * @see tcp_header:acknowledge 179 */ 117 180 uint16_t window; 181 /** 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. 182 * 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. 183 * The pad is not transmitted as part of the segment. 184 * While computing the checksum, the checksum field itself is replaced with zeros. 185 * The checksum also coves a~pseudo header conceptually. 186 * The pseudo header conceptually prefixed to the TCP header contains the source address, the destination address, the protocol, and the TCP length. 187 * This information gives protection against misrouted datagrams. 188 * If the computed checksum is zero, it is transmitted as all ones (the equivalent in one's complement arithmetic). 189 */ 118 190 uint16_t checksum; 191 /** This field communicates the current value of the urgent pointer as a~positive offset from the sequence number in this segment. 192 * The urgent pointer points to the sequence number of the octet following the urgent data. 193 * This field is only be interpreted in segments with the URG control bit set. 194 * @see tcp_header:urgent 195 */ 119 196 uint16_t urgent_pointer; 120 197 } __attribute__ ((packed)); 121 198 122 /** Transmission datagram header option. */ 123 struct tcp_option { 124 /** Option type. */ 199 /** Transmission datagram header option. 200 */ 201 struct tcp_option{ 202 /** Option type. 203 */ 125 204 uint8_t type; 126 /** Option length. */ 205 /** Option length. 206 */ 127 207 uint8_t length; 128 208 }; 129 209 130 /** Maximum segment size TCP option. */ 131 struct tcp_max_segment_size_option { 210 /** Maximum segment size TCP option. 211 */ 212 struct tcp_max_segment_size_option{ 132 213 /** TCP option. 133 * @see TCPOPT_MAX_SEGMENT_SIZE134 * @see TCPOPT_MAX_SEGMENT_SIZE_LENGTH214 * @see TCPOPT_MAX_SEGMENT_SIZE 215 * @see TCPOPT_MAX_SEGMENT_SIZE_LENGTH 135 216 */ 136 217 tcp_option_t option; 137 138 /** Maximum segment size in bytes.*/218 /** Maximum segment size in bytes. 219 */ 139 220 uint16_t max_segment_size; 140 221 } __attribute__ ((packed));
Note:
See TracChangeset
for help on using the changeset viewer.