Merge remote-tracking branch 'origin/master'
[unleashed/lotheac.git] / usr / src / uts / common / netinet / ip6.h
blobaf0bf1bc302bcf1f620ba1ba4beacc45470c9806
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
27 * ip6.h - Common structures and definitions as defined by
28 * advanced BSD API.
31 #ifndef _NETINET_IP6_H
32 #define _NETINET_IP6_H
34 #pragma ident "%Z%%M% %I% %E% SMI"
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
40 #include <sys/types.h>
41 #include <netinet/in.h>
43 struct ip6_hdr {
44 union {
45 struct ip6_hdrctl {
46 uint32_t ip6_un1_flow; /* 4 bits version, */
47 /* 8 bits tclass, and */
48 /* 20 bits flow-ID */
49 uint16_t ip6_un1_plen; /* payload length */
50 uint8_t ip6_un1_nxt; /* next header */
51 uint8_t ip6_un1_hlim; /* hop limit */
52 } ip6_un1;
53 uint8_t ip6_un2_vfc; /* 4 bits version and */
54 /* top 4 bits of tclass */
55 } ip6_ctlun;
56 struct in6_addr ip6_src; /* source address */
57 struct in6_addr ip6_dst; /* destination address */
59 typedef struct ip6_hdr ip6_t;
61 #define ip6_vfc ip6_ctlun.ip6_un2_vfc /* 4 bits version and */
62 /* top 4 bits of tclass */
63 #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
64 #define ip6_vcf ip6_flow /* Version, tclass, flow-ID */
65 #define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
66 #define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
67 #define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
68 #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
70 /* Hop-by-Hop options header */
71 struct ip6_hbh {
72 uint8_t ip6h_nxt; /* next header */
73 uint8_t ip6h_len; /* length in units of 8 octets */
74 /* followed by options */
76 typedef struct ip6_hbh ip6_hbh_t;
78 /* Destination options header */
79 struct ip6_dest {
80 uint8_t ip6d_nxt; /* next header */
81 uint8_t ip6d_len; /* length in units of 8 octets */
82 /* followed by options */
84 typedef struct ip6_dest ip6_dest_t;
86 /* Routing header */
87 struct ip6_rthdr {
88 uint8_t ip6r_nxt; /* next header */
89 uint8_t ip6r_len; /* length in units of 8 octets */
90 uint8_t ip6r_type; /* routing type */
91 uint8_t ip6r_segleft; /* segments left */
92 /* followed by routing type specific data */
94 typedef struct ip6_rthdr ip6_rthdr_t;
96 /* Type 0 Routing header */
97 struct ip6_rthdr0 {
98 uint8_t ip6r0_nxt; /* next header */
99 uint8_t ip6r0_len; /* length in units of 8 octets */
100 uint8_t ip6r0_type; /* always zero */
101 uint8_t ip6r0_segleft; /* segments left */
102 uint32_t ip6r0_reserved; /* reserved field */
104 typedef struct ip6_rthdr0 ip6_rthdr0_t;
106 /* Fragment header */
107 struct ip6_frag {
108 uint8_t ip6f_nxt; /* next header */
109 uint8_t ip6f_reserved; /* reserved field */
110 uint16_t ip6f_offlg; /* offset, reserved, and flag */
111 uint32_t ip6f_ident; /* identification */
113 typedef struct ip6_frag ip6_frag_t;
115 /* ip6f_offlg field related constants (in network byte order) */
116 #ifdef _BIG_ENDIAN
117 #define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */
118 #define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */
119 #define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
120 #else
121 #define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */
122 #define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */
123 #define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */
124 #endif
126 /* IPv6 options */
127 struct ip6_opt {
128 uint8_t ip6o_type;
129 uint8_t ip6o_len;
133 * The high-order 3 bits of the option type define the behavior
134 * when processing an unknown option and whether or not the option
135 * content changes in flight.
137 #define IP6OPT_TYPE(o) ((o) & 0xc0)
138 #define IP6OPT_TYPE_SKIP 0x00
139 #define IP6OPT_TYPE_DISCARD 0x40
140 #define IP6OPT_TYPE_FORCEICMP 0x80
141 #define IP6OPT_TYPE_ICMP 0xc0
142 #define IP6OPT_MUTABLE 0x20
144 #define IP6OPT_PAD1 0x00 /* 00 0 00000 */
145 #define IP6OPT_PADN 0x01 /* 00 0 00001 */
146 #define IP6OPT_JUMBO 0xc2 /* 11 0 00010 = 194 */
147 #define IP6OPT_NSAP_ADDR 0xc3 /* 11 0 00011 */
148 #define IP6OPT_TUNNEL_LIMIT 0x04 /* 00 0 00100 */
149 #define IP6OPT_ROUTER_ALERT 0x05 /* 00 0 00101 */
150 #define IP6OPT_BINDING_UPDATE 0xc6 /* 11 0 00110 */
151 #define IP6OPT_BINDING_ACK 0x07 /* 00 0 00111 */
152 #define IP6OPT_BINDING_REQ 0x08 /* 00 0 01000 */
153 #define IP6OPT_HOME_ADDRESS 0xc9 /* 11 0 01001 */
154 #define IP6OPT_EID 0x8a /* 10 0 01010 */
156 #define IP6_MAX_OPT_LENGTH 255
158 /* Jumbo Payload Option */
159 struct ip6_opt_jumbo {
160 uint8_t ip6oj_type;
161 uint8_t ip6oj_len;
162 uint8_t ip6oj_jumbo_len[4];
164 #define IP6OPT_JUMBO_LEN 6
166 /* NSAP Address Option */
167 struct ip6_opt_nsap {
168 uint8_t ip6on_type;
169 uint8_t ip6on_len;
170 uint8_t ip6on_src_nsap_len;
171 uint8_t ip6on_dst_nsap_len;
172 /* Followed by source NSAP */
173 /* Followed by destination NSAP */
176 /* Tunnel Limit Option */
177 struct ip6_opt_tunnel {
178 uint8_t ip6ot_type;
179 uint8_t ip6ot_len;
180 uint8_t ip6ot_encap_limit;
183 /* Router Alert Option */
184 struct ip6_opt_router {
185 uint8_t ip6or_type;
186 uint8_t ip6or_len;
187 uint8_t ip6or_value[2];
190 /* Router alert values (in network byte order) */
191 #ifdef _BIG_ENDIAN
192 #define IP6_ALERT_MLD 0x0000
193 #define IP6_ALERT_RSVP 0x0001
194 #define IP6_ALERT_AN 0x0002
195 #else
196 #define IP6_ALERT_MLD 0x0000
197 #define IP6_ALERT_RSVP 0x0100
198 #define IP6_ALERT_AN 0x0200
199 #endif
201 /* Binding Update Option */
202 struct ip6_opt_binding_update {
203 uint8_t ip6ou_type;
204 uint8_t ip6ou_len;
205 uint8_t ip6ou_flags;
206 uint8_t ip6ou_prefixlen;
207 uint8_t ip6ou_seqno[2];
208 uint8_t ip6ou_lifetime[4];
209 uint8_t ip6ou_coa[16]; /* Optional based on flags */
210 /* Followed by sub-options */
213 /* Binding Update Flags */
214 #define IP6_BUF_ACK 0x80 /* Request a binding ack */
215 #define IP6_BUF_HOME 0x40 /* Home Registration */
216 #define IP6_BUF_COA 0x20 /* Care-of-address present in option */
217 #define IP6_BUF_ROUTER 0x10 /* Sending mobile node is a router */
219 /* Binding Ack Option */
220 struct ip6_opt_binding_ack {
221 uint8_t ip6oa_type;
222 uint8_t ip6oa_len;
223 uint8_t ip6oa_status;
224 uint8_t ip6oa_seqno[2];
225 uint8_t ip6oa_lifetime[4];
226 uint8_t ip6oa_refresh[4];
227 /* Followed by sub-options */
230 /* Binding Request Option */
231 struct ip6_opt_binding_request {
232 uint8_t ip6or_type;
233 uint8_t ip6or_len;
234 /* Followed by sub-options */
237 /* Home Address Option */
238 struct ip6_opt_home_address {
239 uint8_t ip6oh_type;
240 uint8_t ip6oh_len;
241 uint8_t ip6oh_addr[16]; /* Home Address */
242 /* Followed by sub-options */
245 /* Labeled Security Option */
246 struct ip6_opt_labeled_security {
247 uint8_t ip6ol_type;
248 uint8_t ip6ol_len; /* always even for defined values */
249 uint8_t ip6ol_doi[4];
250 /* Followed by sub-options */
253 #define IP6LS_DOI_V4 0 /* IPv4 transition */
255 #define IP6LS_TT_LEVEL 1 /* level or classification; 2-octet value */
256 #define IP6LS_TT_VECTOR 2 /* compartments; bit vector (even # octets) */
257 #define IP6LS_TT_ENUM 3 /* set membership; list of 2-octet values */
258 #define IP6LS_TT_RANGES 4 /* set membership; pairs of 2-octet values */
259 #define IP6LS_TT_V4 5 /* IPv4 compatible option */
260 #define IP6LS_TT_DEST 6 /* destination-only data; per DOI */
262 #ifdef __cplusplus
264 #endif
266 #endif /* _NETINET_IP6_H */