Deleted Added
full compact
ip6.h (53541) ip6.h (55009)
1/*
2 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
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 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the project nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
1/*
2 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
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 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the project nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $FreeBSD: head/sys/netinet6/ip6.h 53541 1999-11-22 02:45:11Z shin $
29 * $FreeBSD: head/sys/netinet6/ip6.h 55009 1999-12-22 19:13:38Z shin $
30 */
31
32/*
33 * Copyright (c) 1982, 1986, 1993
34 * The Regents of the University of California. All rights reserved.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution.
44 * 3. All advertising materials mentioning features or use of this software
45 * must display the following acknowledgement:
46 * This product includes software developed by the University of
47 * California, Berkeley and its contributors.
48 * 4. Neither the name of the University nor the names of its contributors
49 * may be used to endorse or promote products derived from this software
50 * without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 *
64 * @(#)ip.h 8.1 (Berkeley) 6/10/93
65 */
66
67#ifndef _NETINET6_IPV6_H_
68#define _NETINET6_IPV6_H_
69
70/*
71 * Definition for internet protocol version 6.
72 * RFC 2460
73 */
74
75struct ip6_hdr {
76 union {
77 struct ip6_hdrctl {
30 */
31
32/*
33 * Copyright (c) 1982, 1986, 1993
34 * The Regents of the University of California. All rights reserved.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution.
44 * 3. All advertising materials mentioning features or use of this software
45 * must display the following acknowledgement:
46 * This product includes software developed by the University of
47 * California, Berkeley and its contributors.
48 * 4. Neither the name of the University nor the names of its contributors
49 * may be used to endorse or promote products derived from this software
50 * without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 *
64 * @(#)ip.h 8.1 (Berkeley) 6/10/93
65 */
66
67#ifndef _NETINET6_IPV6_H_
68#define _NETINET6_IPV6_H_
69
70/*
71 * Definition for internet protocol version 6.
72 * RFC 2460
73 */
74
75struct ip6_hdr {
76 union {
77 struct ip6_hdrctl {
78 u_int32_t ip6_un1_flow; /* 20 bits of flow-ID */
78 u_int32_t ip6_un1_flow; /* 4 bits version,
79 * 8 bits traffic
80 * class,
81 * 20 bits flow-ID */
79 u_int16_t ip6_un1_plen; /* payload length */
80 u_int8_t ip6_un1_nxt; /* next header */
81 u_int8_t ip6_un1_hlim; /* hop limit */
82 } ip6_un1;
82 u_int16_t ip6_un1_plen; /* payload length */
83 u_int8_t ip6_un1_nxt; /* next header */
84 u_int8_t ip6_un1_hlim; /* hop limit */
85 } ip6_un1;
83 u_int8_t ip6_un2_vfc; /* 4 bits version, 4 bits class */
86 u_int8_t ip6_un2_vfc; /* 4 bits version,
87 * top 4 bits trafic class */
84 } ip6_ctlun;
85 struct in6_addr ip6_src; /* source address */
86 struct in6_addr ip6_dst; /* destination address */
87};
88
89#define ip6_vfc ip6_ctlun.ip6_un2_vfc
90#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
91#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
92#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
93#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
94#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
95
96#define IPV6_VERSION 0x60
97#define IPV6_VERSION_MASK 0xf0
98
99#if BYTE_ORDER == BIG_ENDIAN
100#define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */
101#define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */
102#endif /* BIG_ENDIAN */
103#if BYTE_ORDER == LITTLE_ENDIAN
104#define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */
105#define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */
106#endif /* LITTLE_ENDIAN */
107/* ECN bits proposed by Sally Floyd */
108#define IP6TOS_CE 0x01 /* congestion experienced */
109#define IP6TOS_ECT 0x02 /* ECN-capable transport */
110
111/*
112 * Extension Headers
113 */
114
115struct ip6_ext {
116 u_char ip6e_nxt;
117 u_char ip6e_len;
118};
119
120/* Hop-by-Hop options header */
121/* XXX should we pad it to force alignment on an 8-byte boundary? */
122struct ip6_hbh {
123 u_int8_t ip6h_nxt; /* next header */
124 u_int8_t ip6h_len; /* length in units of 8 octets */
125 /* followed by options */
126};
127
128/* Destination options header */
129/* XXX should we pad it to force alignment on an 8-byte boundary? */
130struct ip6_dest {
131 u_int8_t ip6d_nxt; /* next header */
132 u_int8_t ip6d_len; /* length in units of 8 octets */
133 /* followed by options */
134};
135
136/* Option types and related macros */
137#define IP6OPT_PAD1 0x00 /* 00 0 00000 */
138#define IP6OPT_PADN 0x01 /* 00 0 00001 */
139#define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */
140#define IP6OPT_JUMBO_LEN 6
141#define IP6OPT_RTALERT 0x05 /* 00 0 00101 */
142#define IP6OPT_RTALERT_LEN 4
143#define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */
144#define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */
145#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */
146#define IP6OPT_MINLEN 2
147
148#define IP6OPT_TYPE(o) ((o) & 0xC0)
149#define IP6OPT_TYPE_SKIP 0x00
150#define IP6OPT_TYPE_DISCARD 0x40
151#define IP6OPT_TYPE_FORCEICMP 0x80
152#define IP6OPT_TYPE_ICMP 0xC0
153
154#define IP6OPT_MUTABLE 0x20
155
156/* Routing header */
157struct ip6_rthdr {
158 u_int8_t ip6r_nxt; /* next header */
159 u_int8_t ip6r_len; /* length in units of 8 octets */
160 u_int8_t ip6r_type; /* routing type */
161 u_int8_t ip6r_segleft; /* segments left */
162 /* followed by routing type specific data */
163};
164
165/* Type 0 Routing header */
166struct ip6_rthdr0 {
167 u_int8_t ip6r0_nxt; /* next header */
168 u_int8_t ip6r0_len; /* length in units of 8 octets */
169 u_int8_t ip6r0_type; /* always zero */
170 u_int8_t ip6r0_segleft; /* segments left */
171 u_int8_t ip6r0_reserved; /* reserved field */
172 u_int8_t ip6r0_slmap[3]; /* strict/loose bit map */
173 struct in6_addr ip6r0_addr[1]; /* up to 23 addresses */
174};
175
176/* Fragment header */
177struct ip6_frag {
178 u_int8_t ip6f_nxt; /* next header */
179 u_int8_t ip6f_reserved; /* reserved field */
180 u_int16_t ip6f_offlg; /* offset, reserved, and flag */
181 u_int32_t ip6f_ident; /* identification */
182};
183
184#if BYTE_ORDER == BIG_ENDIAN
185#define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */
186#define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */
187#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
188#else /* BYTE_ORDER == LITTLE_ENDIAN */
189#define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */
190#define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */
191#define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */
192#endif /* BYTE_ORDER == LITTLE_ENDIAN */
193
194/*
195 * Internet implementation parameters.
196 */
197#define IPV6_MAXHLIM 255 /* maximun hoplimit */
198#define IPV6_DEFHLIM 64 /* default hlim */
199#define IPV6_FRAGTTL 120 /* ttl for fragment packets, in slowtimo tick */
200#define IPV6_HLIMDEC 1 /* subtracted when forwaeding */
201
202#define IPV6_MMTU 1280 /* minimal MTU and reassembly. 1024 + 256 */
203#define IPV6_MAXPACKET 65535 /* ip6 max packet size without Jumbo payload*/
204
205/*
206 * IP6_EXTHDR_CHECK ensures that region between the IP6 header and the
207 * target header (including IPv6 itself, extension headers and
208 * TCP/UDP/ICMP6 headers) are continuous. KAME requires drivers
209 * to store incoming data into one internal mbuf or one or more external
210 * mbufs(never into two or more internal mbufs). Thus, the third case is
211 * supposed to never be matched but is prepared just in case.
212 */
213
214#define IP6_EXTHDR_CHECK(m, off, hlen, ret) \
215do { \
216 if ((m)->m_next != NULL) { \
217 if (((m)->m_flags & M_LOOP) && \
218 ((m)->m_len < (off) + (hlen)) && \
219 (((m) = m_pullup((m), (off) + (hlen))) == NULL)) { \
220 ip6stat.ip6s_exthdrtoolong++; \
221 return ret; \
222 } else if ((m)->m_flags & M_EXT) { \
223 if ((m)->m_len < (off) + (hlen)) { \
224 ip6stat.ip6s_exthdrtoolong++; \
225 m_freem(m); \
226 return ret; \
227 } \
228 } else { \
229 if ((m)->m_len < (off) + (hlen)) { \
230 ip6stat.ip6s_exthdrtoolong++; \
231 m_freem(m); \
232 return ret; \
233 } \
234 } \
235 } else { \
236 if ((m)->m_len < (off) + (hlen)) { \
237 ip6stat.ip6s_tooshort++; \
238 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated); \
239 m_freem(m); \
240 return ret; \
241 } \
242 } \
243} while (0)
244
245#endif /* not _NETINET_IPV6_H_ */
88 } ip6_ctlun;
89 struct in6_addr ip6_src; /* source address */
90 struct in6_addr ip6_dst; /* destination address */
91};
92
93#define ip6_vfc ip6_ctlun.ip6_un2_vfc
94#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
95#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
96#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
97#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
98#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
99
100#define IPV6_VERSION 0x60
101#define IPV6_VERSION_MASK 0xf0
102
103#if BYTE_ORDER == BIG_ENDIAN
104#define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */
105#define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */
106#endif /* BIG_ENDIAN */
107#if BYTE_ORDER == LITTLE_ENDIAN
108#define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */
109#define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */
110#endif /* LITTLE_ENDIAN */
111/* ECN bits proposed by Sally Floyd */
112#define IP6TOS_CE 0x01 /* congestion experienced */
113#define IP6TOS_ECT 0x02 /* ECN-capable transport */
114
115/*
116 * Extension Headers
117 */
118
119struct ip6_ext {
120 u_char ip6e_nxt;
121 u_char ip6e_len;
122};
123
124/* Hop-by-Hop options header */
125/* XXX should we pad it to force alignment on an 8-byte boundary? */
126struct ip6_hbh {
127 u_int8_t ip6h_nxt; /* next header */
128 u_int8_t ip6h_len; /* length in units of 8 octets */
129 /* followed by options */
130};
131
132/* Destination options header */
133/* XXX should we pad it to force alignment on an 8-byte boundary? */
134struct ip6_dest {
135 u_int8_t ip6d_nxt; /* next header */
136 u_int8_t ip6d_len; /* length in units of 8 octets */
137 /* followed by options */
138};
139
140/* Option types and related macros */
141#define IP6OPT_PAD1 0x00 /* 00 0 00000 */
142#define IP6OPT_PADN 0x01 /* 00 0 00001 */
143#define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */
144#define IP6OPT_JUMBO_LEN 6
145#define IP6OPT_RTALERT 0x05 /* 00 0 00101 */
146#define IP6OPT_RTALERT_LEN 4
147#define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */
148#define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */
149#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */
150#define IP6OPT_MINLEN 2
151
152#define IP6OPT_TYPE(o) ((o) & 0xC0)
153#define IP6OPT_TYPE_SKIP 0x00
154#define IP6OPT_TYPE_DISCARD 0x40
155#define IP6OPT_TYPE_FORCEICMP 0x80
156#define IP6OPT_TYPE_ICMP 0xC0
157
158#define IP6OPT_MUTABLE 0x20
159
160/* Routing header */
161struct ip6_rthdr {
162 u_int8_t ip6r_nxt; /* next header */
163 u_int8_t ip6r_len; /* length in units of 8 octets */
164 u_int8_t ip6r_type; /* routing type */
165 u_int8_t ip6r_segleft; /* segments left */
166 /* followed by routing type specific data */
167};
168
169/* Type 0 Routing header */
170struct ip6_rthdr0 {
171 u_int8_t ip6r0_nxt; /* next header */
172 u_int8_t ip6r0_len; /* length in units of 8 octets */
173 u_int8_t ip6r0_type; /* always zero */
174 u_int8_t ip6r0_segleft; /* segments left */
175 u_int8_t ip6r0_reserved; /* reserved field */
176 u_int8_t ip6r0_slmap[3]; /* strict/loose bit map */
177 struct in6_addr ip6r0_addr[1]; /* up to 23 addresses */
178};
179
180/* Fragment header */
181struct ip6_frag {
182 u_int8_t ip6f_nxt; /* next header */
183 u_int8_t ip6f_reserved; /* reserved field */
184 u_int16_t ip6f_offlg; /* offset, reserved, and flag */
185 u_int32_t ip6f_ident; /* identification */
186};
187
188#if BYTE_ORDER == BIG_ENDIAN
189#define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */
190#define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */
191#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
192#else /* BYTE_ORDER == LITTLE_ENDIAN */
193#define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */
194#define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */
195#define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */
196#endif /* BYTE_ORDER == LITTLE_ENDIAN */
197
198/*
199 * Internet implementation parameters.
200 */
201#define IPV6_MAXHLIM 255 /* maximun hoplimit */
202#define IPV6_DEFHLIM 64 /* default hlim */
203#define IPV6_FRAGTTL 120 /* ttl for fragment packets, in slowtimo tick */
204#define IPV6_HLIMDEC 1 /* subtracted when forwaeding */
205
206#define IPV6_MMTU 1280 /* minimal MTU and reassembly. 1024 + 256 */
207#define IPV6_MAXPACKET 65535 /* ip6 max packet size without Jumbo payload*/
208
209/*
210 * IP6_EXTHDR_CHECK ensures that region between the IP6 header and the
211 * target header (including IPv6 itself, extension headers and
212 * TCP/UDP/ICMP6 headers) are continuous. KAME requires drivers
213 * to store incoming data into one internal mbuf or one or more external
214 * mbufs(never into two or more internal mbufs). Thus, the third case is
215 * supposed to never be matched but is prepared just in case.
216 */
217
218#define IP6_EXTHDR_CHECK(m, off, hlen, ret) \
219do { \
220 if ((m)->m_next != NULL) { \
221 if (((m)->m_flags & M_LOOP) && \
222 ((m)->m_len < (off) + (hlen)) && \
223 (((m) = m_pullup((m), (off) + (hlen))) == NULL)) { \
224 ip6stat.ip6s_exthdrtoolong++; \
225 return ret; \
226 } else if ((m)->m_flags & M_EXT) { \
227 if ((m)->m_len < (off) + (hlen)) { \
228 ip6stat.ip6s_exthdrtoolong++; \
229 m_freem(m); \
230 return ret; \
231 } \
232 } else { \
233 if ((m)->m_len < (off) + (hlen)) { \
234 ip6stat.ip6s_exthdrtoolong++; \
235 m_freem(m); \
236 return ret; \
237 } \
238 } \
239 } else { \
240 if ((m)->m_len < (off) + (hlen)) { \
241 ip6stat.ip6s_tooshort++; \
242 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated); \
243 m_freem(m); \
244 return ret; \
245 } \
246 } \
247} while (0)
248
249#endif /* not _NETINET_IPV6_H_ */