ip6.h revision 53541
1219820Sjeff/* 2219820Sjeff * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 3219820Sjeff * All rights reserved. 4219820Sjeff * 5219820Sjeff * Redistribution and use in source and binary forms, with or without 6219820Sjeff * modification, are permitted provided that the following conditions 7219820Sjeff * are met: 8219820Sjeff * 1. Redistributions of source code must retain the above copyright 9219820Sjeff * notice, this list of conditions and the following disclaimer. 10219820Sjeff * 2. Redistributions in binary form must reproduce the above copyright 11219820Sjeff * notice, this list of conditions and the following disclaimer in the 12219820Sjeff * documentation and/or other materials provided with the distribution. 13219820Sjeff * 3. Neither the name of the project nor the names of its contributors 14219820Sjeff * may be used to endorse or promote products derived from this software 15219820Sjeff * without specific prior written permission. 16219820Sjeff * 17219820Sjeff * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 18219820Sjeff * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19219820Sjeff * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20219820Sjeff * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 21219820Sjeff * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22219820Sjeff * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23219820Sjeff * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24219820Sjeff * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25219820Sjeff * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26219820Sjeff * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27219820Sjeff * SUCH DAMAGE. 28219820Sjeff * 29219820Sjeff * $FreeBSD: head/sys/netinet6/ip6.h 53541 1999-11-22 02:45:11Z shin $ 30219820Sjeff */ 31219820Sjeff 32219820Sjeff/* 33219820Sjeff * Copyright (c) 1982, 1986, 1993 34219820Sjeff * The Regents of the University of California. All rights reserved. 35219820Sjeff * 36219820Sjeff * Redistribution and use in source and binary forms, with or without 37219820Sjeff * modification, are permitted provided that the following conditions 38219820Sjeff * are met: 39219820Sjeff * 1. Redistributions of source code must retain the above copyright 40219820Sjeff * notice, this list of conditions and the following disclaimer. 41219820Sjeff * 2. Redistributions in binary form must reproduce the above copyright 42219820Sjeff * notice, this list of conditions and the following disclaimer in the 43219820Sjeff * documentation and/or other materials provided with the distribution. 44219820Sjeff * 3. All advertising materials mentioning features or use of this software 45219820Sjeff * must display the following acknowledgement: 46219820Sjeff * This product includes software developed by the University of 47219820Sjeff * California, Berkeley and its contributors. 48219820Sjeff * 4. Neither the name of the University nor the names of its contributors 49219820Sjeff * may be used to endorse or promote products derived from this software 50219820Sjeff * without specific prior written permission. 51219820Sjeff * 52219820Sjeff * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 53219820Sjeff * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 54219820Sjeff * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 55219820Sjeff * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 56219820Sjeff * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 57219820Sjeff * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 58219820Sjeff * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 59219820Sjeff * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 60219820Sjeff * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 61219820Sjeff * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 62219820Sjeff * SUCH DAMAGE. 63219820Sjeff * 64219820Sjeff * @(#)ip.h 8.1 (Berkeley) 6/10/93 65219820Sjeff */ 66219820Sjeff 67219820Sjeff#ifndef _NETINET6_IPV6_H_ 68219820Sjeff#define _NETINET6_IPV6_H_ 69219820Sjeff 70219820Sjeff/* 71219820Sjeff * Definition for internet protocol version 6. 72219820Sjeff * RFC 2460 73219820Sjeff */ 74219820Sjeff 75219820Sjeffstruct ip6_hdr { 76219820Sjeff union { 77219820Sjeff struct ip6_hdrctl { 78219820Sjeff u_int32_t ip6_un1_flow; /* 20 bits of flow-ID */ 79219820Sjeff u_int16_t ip6_un1_plen; /* payload length */ 80219820Sjeff u_int8_t ip6_un1_nxt; /* next header */ 81219820Sjeff u_int8_t ip6_un1_hlim; /* hop limit */ 82219820Sjeff } ip6_un1; 83219820Sjeff u_int8_t ip6_un2_vfc; /* 4 bits version, 4 bits class */ 84219820Sjeff } ip6_ctlun; 85219820Sjeff struct in6_addr ip6_src; /* source address */ 86219820Sjeff struct in6_addr ip6_dst; /* destination address */ 87219820Sjeff}; 88219820Sjeff 89219820Sjeff#define ip6_vfc ip6_ctlun.ip6_un2_vfc 90219820Sjeff#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow 91219820Sjeff#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen 92219820Sjeff#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt 93219820Sjeff#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim 94219820Sjeff#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim 95219820Sjeff 96219820Sjeff#define IPV6_VERSION 0x60 97219820Sjeff#define IPV6_VERSION_MASK 0xf0 98219820Sjeff 99219820Sjeff#if BYTE_ORDER == BIG_ENDIAN 100219820Sjeff#define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */ 101219820Sjeff#define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */ 102219820Sjeff#endif /* BIG_ENDIAN */ 103219820Sjeff#if BYTE_ORDER == LITTLE_ENDIAN 104219820Sjeff#define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */ 105219820Sjeff#define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */ 106219820Sjeff#endif /* LITTLE_ENDIAN */ 107219820Sjeff/* ECN bits proposed by Sally Floyd */ 108219820Sjeff#define IP6TOS_CE 0x01 /* congestion experienced */ 109219820Sjeff#define IP6TOS_ECT 0x02 /* ECN-capable transport */ 110219820Sjeff 111219820Sjeff/* 112219820Sjeff * Extension Headers 113219820Sjeff */ 114219820Sjeff 115219820Sjeffstruct ip6_ext { 116219820Sjeff u_char ip6e_nxt; 117219820Sjeff u_char ip6e_len; 118219820Sjeff}; 119219820Sjeff 120219820Sjeff/* Hop-by-Hop options header */ 121219820Sjeff/* XXX should we pad it to force alignment on an 8-byte boundary? */ 122219820Sjeffstruct ip6_hbh { 123219820Sjeff u_int8_t ip6h_nxt; /* next header */ 124219820Sjeff u_int8_t ip6h_len; /* length in units of 8 octets */ 125219820Sjeff /* followed by options */ 126219820Sjeff}; 127219820Sjeff 128219820Sjeff/* Destination options header */ 129219820Sjeff/* XXX should we pad it to force alignment on an 8-byte boundary? */ 130219820Sjeffstruct ip6_dest { 131219820Sjeff u_int8_t ip6d_nxt; /* next header */ 132219820Sjeff u_int8_t ip6d_len; /* length in units of 8 octets */ 133219820Sjeff /* followed by options */ 134219820Sjeff}; 135219820Sjeff 136219820Sjeff/* Option types and related macros */ 137219820Sjeff#define IP6OPT_PAD1 0x00 /* 00 0 00000 */ 138219820Sjeff#define IP6OPT_PADN 0x01 /* 00 0 00001 */ 139219820Sjeff#define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */ 140219820Sjeff#define IP6OPT_JUMBO_LEN 6 141219820Sjeff#define IP6OPT_RTALERT 0x05 /* 00 0 00101 */ 142219820Sjeff#define IP6OPT_RTALERT_LEN 4 143219820Sjeff#define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */ 144219820Sjeff#define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */ 145219820Sjeff#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */ 146219820Sjeff#define IP6OPT_MINLEN 2 147219820Sjeff 148219820Sjeff#define IP6OPT_TYPE(o) ((o) & 0xC0) 149219820Sjeff#define IP6OPT_TYPE_SKIP 0x00 150219820Sjeff#define IP6OPT_TYPE_DISCARD 0x40 151219820Sjeff#define IP6OPT_TYPE_FORCEICMP 0x80 152219820Sjeff#define IP6OPT_TYPE_ICMP 0xC0 153219820Sjeff 154219820Sjeff#define IP6OPT_MUTABLE 0x20 155219820Sjeff 156219820Sjeff/* Routing header */ 157219820Sjeffstruct ip6_rthdr { 158219820Sjeff u_int8_t ip6r_nxt; /* next header */ 159219820Sjeff u_int8_t ip6r_len; /* length in units of 8 octets */ 160219820Sjeff u_int8_t ip6r_type; /* routing type */ 161219820Sjeff u_int8_t ip6r_segleft; /* segments left */ 162219820Sjeff /* followed by routing type specific data */ 163219820Sjeff}; 164219820Sjeff 165219820Sjeff/* Type 0 Routing header */ 166219820Sjeffstruct ip6_rthdr0 { 167219820Sjeff u_int8_t ip6r0_nxt; /* next header */ 168219820Sjeff u_int8_t ip6r0_len; /* length in units of 8 octets */ 169219820Sjeff u_int8_t ip6r0_type; /* always zero */ 170219820Sjeff u_int8_t ip6r0_segleft; /* segments left */ 171219820Sjeff u_int8_t ip6r0_reserved; /* reserved field */ 172219820Sjeff u_int8_t ip6r0_slmap[3]; /* strict/loose bit map */ 173219820Sjeff struct in6_addr ip6r0_addr[1]; /* up to 23 addresses */ 174219820Sjeff}; 175219820Sjeff 176219820Sjeff/* Fragment header */ 177219820Sjeffstruct ip6_frag { 178219820Sjeff u_int8_t ip6f_nxt; /* next header */ 179219820Sjeff u_int8_t ip6f_reserved; /* reserved field */ 180219820Sjeff u_int16_t ip6f_offlg; /* offset, reserved, and flag */ 181219820Sjeff u_int32_t ip6f_ident; /* identification */ 182219820Sjeff}; 183219820Sjeff 184219820Sjeff#if BYTE_ORDER == BIG_ENDIAN 185219820Sjeff#define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */ 186219820Sjeff#define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */ 187219820Sjeff#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */ 188219820Sjeff#else /* BYTE_ORDER == LITTLE_ENDIAN */ 189219820Sjeff#define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */ 190219820Sjeff#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_ */ 246