Changes in uspace/lib/net/include/ip_header.h [4a3b501:849ed54] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/net/include/ip_header.h
r4a3b501 r849ed54 27 27 */ 28 28 29 /** @addtogroup libnet30 * @{29 /** @addtogroup ip 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * IP header and options definitions.35 * Based on the RFC791.36 */ 37 38 #ifndef LIBNET_IP_HEADER_H_39 #define LIBNET_IP_HEADER_H_34 * IP header and options definitions. 35 * Based on the RFC~791. 36 */ 37 38 #ifndef __NET_IP_HEADER_H__ 39 #define __NET_IP_HEADER_H__ 40 40 41 41 #include <byteorder.h> … … 43 43 44 44 /** Returns the fragment offest high bits. 45 * @param[in] length The prefixed data total length. 46 */ 47 #define IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length) \ 48 ((((length) / 8U) & 0x1f00) >> 8) 45 * @param[in] length The prefixed data total length. 46 */ 47 #define IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length) ((((length) / 8u) &0x1F00) >> 8) 49 48 50 49 /** Returns the fragment offest low bits. 51 * @param[in] length The prefixed data total length. 52 */ 53 #define IP_COMPUTE_FRAGMENT_OFFSET_LOW(length) \ 54 (((length) / 8U) & 0xff) 50 * @param[in] length The prefixed data total length. 51 */ 52 #define IP_COMPUTE_FRAGMENT_OFFSET_LOW(length) (((length) / 8u) &0xFF) 55 53 56 54 /** Returns the IP header length. 57 * @param[in] length The IP header length in bytes. 58 */ 59 #define IP_COMPUTE_HEADER_LENGTH(length) \ 60 ((uint8_t) ((length) / 4U)) 55 * @param[in] length The IP header length in bytes. 56 */ 57 #define IP_COMPUTE_HEADER_LENGTH(length) ((uint8_t) ((length) / 4u)) 61 58 62 59 /** Returns the fragment offest. 63 * @param[in] header The IP packet header. 64 */ 65 #define IP_FRAGMENT_OFFSET(header) \ 66 ((((header)->fragment_offset_high << 8) + \ 67 (header)->fragment_offset_low) * 8U) 60 * @param[in] header The IP packet header. 61 */ 62 #define IP_FRAGMENT_OFFSET(header) ((((header)->fragment_offset_high << 8) + (header)->fragment_offset_low) * 8u) 68 63 69 64 /** Returns the IP packet header checksum. 70 65 * @param[in] header The IP packet header. 71 66 */ 72 #define IP_HEADER_CHECKSUM(header) \ 73 (htons(ip_checksum((uint8_t *) (header), IP_HEADER_LENGTH(header)))) 67 #define IP_HEADER_CHECKSUM(header) (htons(ip_checksum((uint8_t *)(header), IP_HEADER_LENGTH(header)))) 74 68 75 69 /** Returns the actual IP packet data length. 76 * @param[in] header The IP packet header. 77 */ 78 #define IP_HEADER_DATA_LENGTH(header) \ 79 (IP_TOTAL_LENGTH(header) - IP_HEADER_LENGTH(header)) 70 * @param[in] header The IP packet header. 71 */ 72 #define IP_HEADER_DATA_LENGTH(header) (IP_TOTAL_LENGTH(header) - IP_HEADER_LENGTH(header)) 80 73 81 74 /** Returns the actual IP header length in bytes. 82 * @param[in] header The IP packet header. 83 */ 84 #define IP_HEADER_LENGTH(header) \ 85 ((header)->header_length * 4U) 75 * @param[in] header The IP packet header. 76 */ 77 #define IP_HEADER_LENGTH(header) ((header)->header_length * 4u) 86 78 87 79 /** Returns the actual IP packet total length. 88 * @param[in] header The IP packet header.89 */ 90 #define IP_TOTAL_LENGTH(header) \91 ntohs((header)->total_length) 92 93 /** @name IP flags definitions*/80 * @param[in] header The IP packet header. 81 */ 82 #define IP_TOTAL_LENGTH(header) ntohs((header)->total_length) 83 84 /** @name IP flags definitions 85 */ 94 86 /*@{*/ 95 87 96 /** Fragment flag field shift. */ 97 #define IPFLAG_FRAGMENT_SHIFT 1 98 99 /** Fragmented flag field shift. */ 100 #define IPFLAG_FRAGMENTED_SHIFT 0 88 /** Fragment flag field shift. 89 */ 90 #define IPFLAG_FRAGMENT_SHIFT 1 91 92 /** Fragmented flag field shift. 93 */ 94 #define IPFLAG_FRAGMENTED_SHIFT 0 101 95 102 96 /** Don't fragment flag value. 103 * Permits the packet fragmentation.104 */ 105 #define IPFLAG_DONT_FRAGMENT (0x1 << IPFLAG_FRAGMENT_SHIFT)97 * Permits the packet fragmentation. 98 */ 99 #define IPFLAG_DONT_FRAGMENT (0x1 << IPFLAG_FRAGMENT_SHIFT) 106 100 107 101 /** Last fragment flag value. 108 * Indicates the last packet fragment.109 */ 110 #define IPFLAG_LAST_FRAGMENT (0x0 << IPFLAG_FRAGMENTED_SHIFT)102 * Indicates the last packet fragment. 103 */ 104 #define IPFLAG_LAST_FRAGMENT (0x0 << IPFLAG_FRAGMENTED_SHIFT) 111 105 112 106 /** May fragment flag value. 113 * Allows the packet fragmentation.114 */ 115 #define IPFLAG_MAY_FRAGMENT (0x0 << IPFLAG_FRAGMENT_SHIFT)107 * Allows the packet fragmentation. 108 */ 109 #define IPFLAG_MAY_FRAGMENT (0x0 << IPFLAG_FRAGMENT_SHIFT) 116 110 117 111 /** More fragments flag value. 118 * Indicates that more packet fragments follow.119 */ 120 #define IPFLAG_MORE_FRAGMENTS (0x1 << IPFLAG_FRAGMENTED_SHIFT)112 * Indicates that more packet fragments follow. 113 */ 114 #define IPFLAG_MORE_FRAGMENTS (0x1 << IPFLAG_FRAGMENTED_SHIFT) 121 115 122 116 /*@}*/ 123 117 124 118 /** Type definition of the internet header. 125 * @see ip_header126 */ 127 typedef struct ip_header 119 * @see ip_header 120 */ 121 typedef struct ip_header ip_header_t; 128 122 129 123 /** Type definition of the internet header pointer. 130 * @see ip_header131 */ 132 typedef ip_header_t * ip_header_ref;124 * @see ip_header 125 */ 126 typedef ip_header_t * ip_header_ref; 133 127 134 128 /** Type definition of the internet option header. 135 * @see ip_header136 */ 137 typedef struct ip_option 129 * @see ip_header 130 */ 131 typedef struct ip_option ip_option_t; 138 132 139 133 /** Type definition of the internet option header pointer. 140 * @see ip_header141 */ 142 typedef ip_option_t * ip_option_ref;134 * @see ip_header 135 */ 136 typedef ip_option_t * ip_option_ref; 143 137 144 138 /** Type definition of the internet version 4 pseudo header. 145 * @see ipv4_pseudo_header146 */ 147 typedef struct ipv4_pseudo_header 139 * @see ipv4_pseudo_header 140 */ 141 typedef struct ipv4_pseudo_header ipv4_pseudo_header_t; 148 142 149 143 /** Type definition of the internet version 4 pseudo header pointer. 150 * @see ipv4_pseudo_header151 */ 152 typedef ipv4_pseudo_header_t * ipv4_pseudo_header_ref;144 * @see ipv4_pseudo_header 145 */ 146 typedef ipv4_pseudo_header_t * ipv4_pseudo_header_ref; 153 147 154 148 /** Internet header. 155 * 156 * The variable options should be included after the header itself and 157 * indicated by the increased header length value. 158 */ 159 struct ip_header { 149 * The variable options should be included after the header itself and indicated by the increased header length value. 150 */ 151 struct ip_header{ 160 152 #ifdef ARCH_IS_BIG_ENDIAN 161 uint8_t version : 4; 162 uint8_t header_length : 4; 153 /** The Version field indicates the format of the internet header. 154 */ 155 uint8_t version:4; 156 /** Internet Header Length is the length of the internet header in 32~bit words, and thus points to the beginning of the data. 157 * Note that the minimum value for a~correct header is~5. 158 */ 159 uint8_t header_length:4; 163 160 #else 164 uint8_t header_length : 4; 165 uint8_t version : 4; 166 #endif 167 161 /** Internet Header Length is the length of the internet header in 32~bit words, and thus points to the beginning of the data. 162 * Note that the minimum value for a~correct header is~5. 163 */ 164 uint8_t header_length:4; 165 /** The Version field indicates the format of the internet header. 166 */ 167 uint8_t version:4; 168 #endif 169 /** The Type of Service provides an indication of the abstract parameters of the quality of service desired. 170 * These parameters are to be used to guide the selection of the actual service parameters when transmitting a~datagram through a~particular network. 171 * Several networks offer service precedence, which somehow treats high precedence traffic as more important than other traffic (generally by accepting only traffic above a~certain precedence at time of high load). 172 * The major choice is a~three way tradeoff between low-delay, high-reliability, and high-throughput. 173 */ 168 174 uint8_t tos; 175 /** Total Length is the length of the datagram, measured in octets, including internet header and data. 176 * This field allows the length of a~datagram to be up to 65,535~octets. 177 */ 169 178 uint16_t total_length; 179 /** An identifying value assigned by the sender to aid in assembling the fragments of a~datagram. 180 */ 170 181 uint16_t identification; 171 172 182 #ifdef ARCH_IS_BIG_ENDIAN 173 uint8_t flags : 3; 174 uint8_t fragment_offset_high : 5; 183 /** Various control flags. 184 */ 185 uint8_t flags:3; 186 /** This field indicates where in the datagram this fragment belongs. 187 * High bits. 188 */ 189 uint8_t fragment_offset_high:5; 175 190 #else 176 uint8_t fragment_offset_high : 5; 177 uint8_t flags : 3; 178 #endif 179 191 /** This field indicates where in the datagram this fragment belongs. 192 * High bits. 193 */ 194 uint8_t fragment_offset_high:5; 195 /** Various control flags. 196 */ 197 uint8_t flags:3; 198 #endif 199 /** This field indicates where in the datagram this fragment belongs. 200 * Low bits. 201 */ 180 202 uint8_t fragment_offset_low; 203 /** This field indicates the maximum time the datagram is allowed to remain in the internet system. 204 * If this field contains the value zero, then the datagram must be destroyed. 205 * This field is modified in internet header processing. 206 * The time is measured in units of seconds, but since every module that processes a~datagram must decrease the TTL by at least one even if it process the datagram in less than a~second, the TTL must be thought of only as an upper bound on the time a~datagram may exist. 207 * The intention is to cause undeliverable datagrams to be discarded, and to bound the maximum datagram lifetime. 208 */ 181 209 uint8_t ttl; 210 /** This field indicates the next level protocol used in the data portion of the internet datagram. 211 */ 182 212 uint8_t protocol; 213 /** A checksum of the header only. 214 * Since some header fields change (e.g., time to live), this is recomputed and verified at each point that the internet header is processed. 215 * The checksum algorithm is: The checksum field is the 16~bit one's complement of the one's complement sum of all 16~bit words in the header. 216 * For purposes of computing the checksum, the value of the checksum field is zero. 217 */ 183 218 uint16_t header_checksum; 219 /** The source address. 220 */ 184 221 uint32_t source_address; 222 /** The destination address. 223 */ 185 224 uint32_t destination_address; 186 225 } __attribute__ ((packed)); 187 226 188 227 /** Internet option header. 189 * 190 * Only type field is always valid. 191 * Other fields' validity depends on the option type. 192 */ 193 struct ip_option { 228 * Only type field is always valid. 229 * Other fields' validity depends on the option type. 230 */ 231 struct ip_option{ 232 /** A single octet of option-type. 233 */ 194 234 uint8_t type; 235 /** An option length octet. 236 */ 195 237 uint8_t length; 238 /** A~pointer. 239 */ 196 240 uint8_t pointer; 197 198 241 #ifdef ARCH_IS_BIG_ENDIAN 199 uint8_t overflow : 4; 200 uint8_t flags : 4; 242 /** The number of IP modules that cannot register timestamps due to lack of space. 243 */ 244 uint8_t overflow:4; 245 /** Various internet timestamp control flags. 246 */ 247 uint8_t flags:4; 201 248 #else 202 uint8_t flags : 4; 203 uint8_t overflow : 4; 249 /** Various internet timestamp control flags. 250 */ 251 uint8_t flags:4; 252 /** The number of IP modules that cannot register timestamps due to lack of space. 253 */ 254 uint8_t overflow:4; 204 255 #endif 205 256 } __attribute__ ((packed)); 206 257 207 /** Internet version 4 pseudo header. */ 208 struct ipv4_pseudo_header { 258 /** Internet version 4 pseudo header. 259 */ 260 struct ipv4_pseudo_header{ 261 /** The source address. 262 */ 209 263 uint32_t source_address; 264 /** The destination address. 265 */ 210 266 uint32_t destination_address; 267 /** Reserved byte. 268 * Must be zero. 269 */ 211 270 uint8_t reserved; 271 /** This field indicates the next level protocol used in the data portion of the internet datagram. 272 */ 212 273 uint8_t protocol; 274 /** Data length is the length of the datagram, measured in octets. 275 */ 213 276 uint16_t data_length; 214 277 } __attribute__ ((packed));
Note:
See TracChangeset
for help on using the changeset viewer.