source: mainline/uspace/srv/net/il/ip/ip_header.h@ 21580dd

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 21580dd was 21580dd, checked in by Lukas Mejdrech <lukas@…>, 15 years ago

Merged with network branch svn://svn.helenos.org/HelenOS/branches/network revision 4759; ipc_share_* and ipc_data_* changed to async_*; client connection in module.c returns on IPC_M_PHONE_HUNGUP; * Qemu scripts renamed to net-qe.*; (the dp8390 does not respond)

  • Property mode set to 100644
File size: 9.3 KB
Line 
1/*
2 * Copyright (c) 2009 Lukas Mejdrech
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup ip
30 * @{
31 */
32
33/** @file
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
41#include <byteorder.h>
42#include <sys/types.h>
43
44/** Returns the actual IP header length in bytes.
45 * @param[in] header The IP packet header.
46 */
47#define IP_HEADER_LENGTH( header ) (( header )->header_length * 4u )
48
49/** Returns the IP header length.
50 * @param[in] length The IP header length in bytes.
51 */
52#define IP_COMPUTE_HEADER_LENGTH( length ) (( uint8_t ) (( length ) / 4u ))
53
54/** Returns the actual IP packet total length.
55 * @param[in] header The IP packet header.
56 */
57#define IP_TOTAL_LENGTH( header ) ntohs(( header )->total_length )
58
59/** Returns the actual IP packet data length.
60 * @param[in] header The IP packet header.
61 */
62#define IP_HEADER_DATA_LENGTH( header ) ( IP_TOTAL_LENGTH( header ) - IP_HEADER_LENGTH( header ))
63
64/** Returns the IP packet header checksum.
65 * @param[in] header The IP packet header.
66 */
67#define IP_HEADER_CHECKSUM( header ) ( htons( ip_checksum(( uint8_t * )( header ), IP_HEADER_LENGTH( header ))))
68
69/** Returns the fragment offest.
70 * @param[in] header The IP packet header.
71 */
72#define IP_FRAGMENT_OFFSET( header ) (((( header )->fragment_offset_high << 8 ) + ( header )->fragment_offset_low ) * 8u )
73
74/** Returns the fragment offest high bits.
75 * @param[in] length The prefixed data total length.
76 */
77#define IP_COMPUTE_FRAGMENT_OFFSET_HIGH( length ) (((( length ) / 8u ) & 0x1F00 ) >> 8 )
78
79/** Returns the fragment offest low bits.
80 * @param[in] length The prefixed data total length.
81 */
82#define IP_COMPUTE_FRAGMENT_OFFSET_LOW( length ) ((( length ) / 8u ) & 0xFF )
83
84/** Type definition of the internet header.
85 * @see ip_header
86 */
87typedef struct ip_header ip_header_t;
88
89/** Type definition of the internet header pointer.
90 * @see ip_header
91 */
92typedef ip_header_t * ip_header_ref;
93
94/** Internet header.
95 * The variable options should be included after the header itself and indicated by the increased header length value.
96 */
97struct ip_header{
98#ifdef ARCH_IS_BIG_ENDIAN
99 /** The Version field indicates the format of the internet header.
100 */
101 uint8_t version:4;
102 /** Internet Header Length is the length of the internet header in 32~bit words, and thus points to the beginning of the data.
103 * Note that the minimum value for a~correct header is~5.
104 */
105 uint8_t header_length:4;
106#else
107 /** Internet Header Length is the length of the internet header in 32~bit words, and thus points to the beginning of the data.
108 * Note that the minimum value for a~correct header is~5.
109 */
110 uint8_t header_length:4;
111 /** The Version field indicates the format of the internet header.
112 */
113 uint8_t version:4;
114#endif
115 /** The Type of Service provides an indication of the abstract parameters of the quality of service desired.
116 * These parameters are to be used to guide the selection of the actual service parameters when transmitting a~datagram through a~particular network.
117 * 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).
118 * The major choice is a~three way tradeoff between low-delay, high-reliability, and high-throughput.
119 */
120 uint8_t tos;
121 /** Total Length is the length of the datagram, measured in octets, including internet header and data.
122 * This field allows the length of a~datagram to be up to 65,535~octets.
123 */
124 uint16_t total_length;
125 /** An identifying value assigned by the sender to aid in assembling the fragments of a~datagram.
126 */
127 uint16_t identification;
128#ifdef ARCH_IS_BIG_ENDIAN
129 /** Various control flags.
130 */
131 uint8_t flags:3;
132 /** This field indicates where in the datagram this fragment belongs.
133 * High bits.
134 */
135 uint8_t fragment_offset_high:5;
136#else
137 /** This field indicates where in the datagram this fragment belongs.
138 * High bits.
139 */
140 uint8_t fragment_offset_high:5;
141 /** Various control flags.
142 */
143 uint8_t flags:3;
144#endif
145 /** This field indicates where in the datagram this fragment belongs.
146 * Low bits.
147 */
148 uint8_t fragment_offset_low;
149 /** This field indicates the maximum time the datagram is allowed to remain in the internet system.
150 * If this field contains the value zero, then the datagram must be destroyed.
151 * This field is modified in internet header processing.
152 * 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.
153 * The intention is to cause undeliverable datagrams to be discarded, and to bound the maximum datagram lifetime.
154 */
155 uint8_t ttl;
156 /** This field indicates the next level protocol used in the data portion of the internet datagram.
157 */
158 uint8_t protocol;
159 /** A checksum of the header only.
160 * Since some header fields change (e.g., time to live), this is recomputed and verified at each point that the internet header is processed.
161 * 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.
162 * For purposes of computing the checksum, the value of the checksum field is zero.
163 */
164 uint16_t header_checksum;
165 /** The source address.
166 */
167 uint32_t source_address;
168 /** The destination address.
169 */
170 uint32_t destination_address;
171} __attribute__ ((packed));
172
173/** Type definition of the internet option header.
174 * @see ip_header
175 */
176typedef struct ip_option ip_option_t;
177
178/** Type definition of the internet option header pointer.
179 * @see ip_header
180 */
181typedef ip_option_t * ip_option_ref;
182
183/** Internet option header.
184 * Only type field is always valid.
185 * Other fields' validity depends on the option type.
186 */
187struct ip_option{
188 /** A single octet of option-type.
189 */
190 uint8_t type;
191 /** An option length octet.
192 */
193 uint8_t length;
194 /** A~pointer.
195 */
196 uint8_t pointer;
197#ifdef ARCH_IS_BIG_ENDIAN
198 /** The number of IP modules that cannot register timestamps due to lack of space.
199 */
200 uint8_t overflow:4;
201 /** Various internet timestamp control flags.
202 */
203 uint8_t flags:4;
204#else
205 /** Various internet timestamp control flags.
206 */
207 uint8_t flags:4;
208 /** The number of IP modules that cannot register timestamps due to lack of space.
209 */
210 uint8_t overflow:4;
211#endif
212} __attribute__ ((packed));
213
214/** @name IP flags definitions
215 */
216/*@{*/
217
218/** Fragment flag field shift.
219 */
220#define IPFLAG_FRAGMENT_SHIFT 1
221
222/** Fragmented flag field shift.
223 */
224#define IPFLAG_FRAGMENTED_SHIFT 0
225
226/** May fragment flag value.
227 * Allows the packet fragmentation.
228 */
229#define IPFLAG_MAY_FRAGMENT ( 0x0 << IPFLAG_FRAGMENT_SHIFT )
230
231/** Don't fragment flag value.
232 * Permits the packet fragmentation.
233 */
234#define IPFLAG_DONT_FRAGMENT ( 0x1 << IPFLAG_FRAGMENT_SHIFT )
235
236/** Last fragment flag value.
237 * Indicates the last packet fragment.
238 */
239#define IPFLAG_LAST_FRAGMENT ( 0x0 << IPFLAG_FRAGMENTED_SHIFT )
240
241/** More fragments flag value.
242 * Indicates that more packet fragments follow.
243 */
244#define IPFLAG_MORE_FRAGMENTS ( 0x1 << IPFLAG_FRAGMENTED_SHIFT )
245
246/*@}*/
247
248/** Type definition of the internet version 4 pseudo header.
249 * @see ipv4_pseudo_header
250 */
251typedef struct ipv4_pseudo_header ipv4_pseudo_header_t;
252
253/** Type definition of the internet version 4 pseudo header pointer.
254 * @see ipv4_pseudo_header
255 */
256typedef ipv4_pseudo_header_t * ipv4_pseudo_header_ref;
257
258/** Internet version 4 pseudo header.
259 */
260struct ipv4_pseudo_header{
261 /** The source address.
262 */
263 uint32_t source_address;
264 /** The destination address.
265 */
266 uint32_t destination_address;
267 /** Reserved byte.
268 * Must be zero.
269 */
270 uint8_t reserved;
271 /** This field indicates the next level protocol used in the data portion of the internet datagram.
272 */
273 uint8_t protocol;
274 /** Data length is the length of the datagram, measured in octets.
275 */
276 uint16_t data_length;
277} __attribute__ ((packed));
278
279#endif
280
281/** @}
282 */
Note: See TracBrowser for help on using the repository browser.