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