source: mainline/uspace/lib/net/include/ip_header.h@ 995689d1

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 995689d1 was 849ed54, checked in by Martin Decky <martin@…>, 15 years ago

Networking work:
Split the networking stack into end-user library (libsocket) and two helper libraries (libnet and libnetif).
Don't use over-the-hand compiling and linking, but rather separation of conserns.
There might be still some issues and the non-modular networking architecture is currently broken, but this will be fixed soon.

  • 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 fragment offest high bits.
45 * @param[in] length The prefixed data total length.
46 */
47#define IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length) ((((length) / 8u) &0x1F00) >> 8)
48
49/** Returns the fragment offest low bits.
50 * @param[in] length The prefixed data total length.
51 */
52#define IP_COMPUTE_FRAGMENT_OFFSET_LOW(length) (((length) / 8u) &0xFF)
53
54/** Returns the IP header length.
55 * @param[in] length The IP header length in bytes.
56 */
57#define IP_COMPUTE_HEADER_LENGTH(length) ((uint8_t) ((length) / 4u))
58
59/** Returns the fragment offest.
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)
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 actual IP packet data length.
70 * @param[in] header The IP packet header.
71 */
72#define IP_HEADER_DATA_LENGTH(header) (IP_TOTAL_LENGTH(header) - IP_HEADER_LENGTH(header))
73
74/** Returns the actual IP header length in bytes.
75 * @param[in] header The IP packet header.
76 */
77#define IP_HEADER_LENGTH(header) ((header)->header_length * 4u)
78
79/** Returns the actual IP packet total length.
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 */
86/*@{*/
87
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
95
96/** Don't fragment flag value.
97 * Permits the packet fragmentation.
98 */
99#define IPFLAG_DONT_FRAGMENT (0x1 << IPFLAG_FRAGMENT_SHIFT)
100
101/** Last fragment flag value.
102 * Indicates the last packet fragment.
103 */
104#define IPFLAG_LAST_FRAGMENT (0x0 << IPFLAG_FRAGMENTED_SHIFT)
105
106/** May fragment flag value.
107 * Allows the packet fragmentation.
108 */
109#define IPFLAG_MAY_FRAGMENT (0x0 << IPFLAG_FRAGMENT_SHIFT)
110
111/** More fragments flag value.
112 * Indicates that more packet fragments follow.
113 */
114#define IPFLAG_MORE_FRAGMENTS (0x1 << IPFLAG_FRAGMENTED_SHIFT)
115
116/*@}*/
117
118/** Type definition of the internet header.
119 * @see ip_header
120 */
121typedef struct ip_header ip_header_t;
122
123/** Type definition of the internet header pointer.
124 * @see ip_header
125 */
126typedef ip_header_t * ip_header_ref;
127
128/** Type definition of the internet option header.
129 * @see ip_header
130 */
131typedef struct ip_option ip_option_t;
132
133/** Type definition of the internet option header pointer.
134 * @see ip_header
135 */
136typedef ip_option_t * ip_option_ref;
137
138/** Type definition of the internet version 4 pseudo header.
139 * @see ipv4_pseudo_header
140 */
141typedef struct ipv4_pseudo_header ipv4_pseudo_header_t;
142
143/** Type definition of the internet version 4 pseudo header pointer.
144 * @see ipv4_pseudo_header
145 */
146typedef ipv4_pseudo_header_t * ipv4_pseudo_header_ref;
147
148/** Internet header.
149 * The variable options should be included after the header itself and indicated by the increased header length value.
150 */
151struct ip_header{
152#ifdef ARCH_IS_BIG_ENDIAN
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;
160#else
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 */
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 */
178 uint16_t total_length;
179 /** An identifying value assigned by the sender to aid in assembling the fragments of a~datagram.
180 */
181 uint16_t identification;
182#ifdef ARCH_IS_BIG_ENDIAN
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;
190#else
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 */
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 */
209 uint8_t ttl;
210 /** This field indicates the next level protocol used in the data portion of the internet datagram.
211 */
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 */
218 uint16_t header_checksum;
219 /** The source address.
220 */
221 uint32_t source_address;
222 /** The destination address.
223 */
224 uint32_t destination_address;
225} __attribute__ ((packed));
226
227/** Internet option header.
228 * Only type field is always valid.
229 * Other fields' validity depends on the option type.
230 */
231struct ip_option{
232 /** A single octet of option-type.
233 */
234 uint8_t type;
235 /** An option length octet.
236 */
237 uint8_t length;
238 /** A~pointer.
239 */
240 uint8_t pointer;
241#ifdef ARCH_IS_BIG_ENDIAN
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;
248#else
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;
255#endif
256} __attribute__ ((packed));
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.