1a9643ea8Slogwang /* $FreeBSD$ */ 2a9643ea8Slogwang /* $KAME: ip6.h,v 1.18 2001/03/29 05:34:30 itojun Exp $ */ 3a9643ea8Slogwang 4a9643ea8Slogwang /*- 5*22ce4affSfengbojiang * SPDX-License-Identifier: BSD-3-Clause 6*22ce4affSfengbojiang * 7a9643ea8Slogwang * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 8a9643ea8Slogwang * All rights reserved. 9a9643ea8Slogwang * 10a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 11a9643ea8Slogwang * modification, are permitted provided that the following conditions 12a9643ea8Slogwang * are met: 13a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright 14a9643ea8Slogwang * notice, this list of conditions and the following disclaimer. 15a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright 16a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in the 17a9643ea8Slogwang * documentation and/or other materials provided with the distribution. 18a9643ea8Slogwang * 3. Neither the name of the project nor the names of its contributors 19a9643ea8Slogwang * may be used to endorse or promote products derived from this software 20a9643ea8Slogwang * without specific prior written permission. 21a9643ea8Slogwang * 22a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 23a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24a9643ea8Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25a9643ea8Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 26a9643ea8Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27a9643ea8Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28a9643ea8Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29a9643ea8Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30a9643ea8Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31a9643ea8Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32a9643ea8Slogwang * SUCH DAMAGE. 33a9643ea8Slogwang */ 34a9643ea8Slogwang 35a9643ea8Slogwang /*- 36a9643ea8Slogwang * Copyright (c) 1982, 1986, 1993 37a9643ea8Slogwang * The Regents of the University of California. All rights reserved. 38a9643ea8Slogwang * 39a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 40a9643ea8Slogwang * modification, are permitted provided that the following conditions 41a9643ea8Slogwang * are met: 42a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright 43a9643ea8Slogwang * notice, this list of conditions and the following disclaimer. 44a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright 45a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in the 46a9643ea8Slogwang * documentation and/or other materials provided with the distribution. 47*22ce4affSfengbojiang * 3. Neither the name of the University nor the names of its contributors 48a9643ea8Slogwang * may be used to endorse or promote products derived from this software 49a9643ea8Slogwang * without specific prior written permission. 50a9643ea8Slogwang * 51a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 52a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 53a9643ea8Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 54a9643ea8Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 55a9643ea8Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 56a9643ea8Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 57a9643ea8Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 58a9643ea8Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 59a9643ea8Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 60a9643ea8Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 61a9643ea8Slogwang * SUCH DAMAGE. 62a9643ea8Slogwang * 63a9643ea8Slogwang * @(#)ip.h 8.1 (Berkeley) 6/10/93 64a9643ea8Slogwang */ 65a9643ea8Slogwang 66a9643ea8Slogwang #ifndef _NETINET_IP6_H_ 67a9643ea8Slogwang #define _NETINET_IP6_H_ 68a9643ea8Slogwang 69a9643ea8Slogwang /* 70a9643ea8Slogwang * Definition for internet protocol version 6. 71a9643ea8Slogwang * RFC 2460 72a9643ea8Slogwang */ 73a9643ea8Slogwang 74a9643ea8Slogwang struct ip6_hdr { 75a9643ea8Slogwang union { 76a9643ea8Slogwang struct ip6_hdrctl { 77a9643ea8Slogwang u_int32_t ip6_un1_flow; /* 20 bits of flow-ID */ 78a9643ea8Slogwang u_int16_t ip6_un1_plen; /* payload length */ 79a9643ea8Slogwang u_int8_t ip6_un1_nxt; /* next header */ 80a9643ea8Slogwang u_int8_t ip6_un1_hlim; /* hop limit */ 81a9643ea8Slogwang } ip6_un1; 82a9643ea8Slogwang u_int8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */ 83a9643ea8Slogwang } ip6_ctlun; 84a9643ea8Slogwang struct in6_addr ip6_src; /* source address */ 85a9643ea8Slogwang struct in6_addr ip6_dst; /* destination address */ 86a9643ea8Slogwang } __packed; 87a9643ea8Slogwang 88a9643ea8Slogwang #define ip6_vfc ip6_ctlun.ip6_un2_vfc 89a9643ea8Slogwang #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow 90a9643ea8Slogwang #define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen 91a9643ea8Slogwang #define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt 92a9643ea8Slogwang #define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim 93a9643ea8Slogwang #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim 94a9643ea8Slogwang 95a9643ea8Slogwang #define IPV6_VERSION 0x60 96a9643ea8Slogwang #define IPV6_VERSION_MASK 0xf0 97a9643ea8Slogwang 98a9643ea8Slogwang #if BYTE_ORDER == BIG_ENDIAN 99a9643ea8Slogwang #define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */ 100a9643ea8Slogwang #define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */ 101a9643ea8Slogwang #else 102a9643ea8Slogwang #if BYTE_ORDER == LITTLE_ENDIAN 103a9643ea8Slogwang #define IPV6_FLOWINFO_MASK 0xffffff0f /* flow info (28 bits) */ 104a9643ea8Slogwang #define IPV6_FLOWLABEL_MASK 0xffff0f00 /* flow label (20 bits) */ 105a9643ea8Slogwang #endif /* LITTLE_ENDIAN */ 106a9643ea8Slogwang #endif 107*22ce4affSfengbojiang #define IPV6_FLOWLABEL_LEN 20 108a9643ea8Slogwang 109a9643ea8Slogwang /* 110a9643ea8Slogwang * Extension Headers 111a9643ea8Slogwang */ 112a9643ea8Slogwang 113a9643ea8Slogwang struct ip6_ext { 114a9643ea8Slogwang u_int8_t ip6e_nxt; 115a9643ea8Slogwang u_int8_t ip6e_len; 116a9643ea8Slogwang } __packed; 117a9643ea8Slogwang 118a9643ea8Slogwang /* Hop-by-Hop options header */ 119a9643ea8Slogwang /* XXX should we pad it to force alignment on an 8-byte boundary? */ 120a9643ea8Slogwang struct ip6_hbh { 121a9643ea8Slogwang u_int8_t ip6h_nxt; /* next header */ 122a9643ea8Slogwang u_int8_t ip6h_len; /* length in units of 8 octets */ 123a9643ea8Slogwang /* followed by options */ 124a9643ea8Slogwang } __packed; 125a9643ea8Slogwang 126a9643ea8Slogwang /* Destination options header */ 127a9643ea8Slogwang /* XXX should we pad it to force alignment on an 8-byte boundary? */ 128a9643ea8Slogwang struct ip6_dest { 129a9643ea8Slogwang u_int8_t ip6d_nxt; /* next header */ 130a9643ea8Slogwang u_int8_t ip6d_len; /* length in units of 8 octets */ 131a9643ea8Slogwang /* followed by options */ 132a9643ea8Slogwang } __packed; 133a9643ea8Slogwang 134a9643ea8Slogwang /* Option types and related macros */ 135a9643ea8Slogwang #define IP6OPT_PAD1 0x00 /* 00 0 00000 */ 136a9643ea8Slogwang #define IP6OPT_PADN 0x01 /* 00 0 00001 */ 137a9643ea8Slogwang #define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */ 138a9643ea8Slogwang #define IP6OPT_NSAP_ADDR 0xC3 /* 11 0 00011 */ 139a9643ea8Slogwang #define IP6OPT_TUNNEL_LIMIT 0x04 /* 00 0 00100 */ 140a9643ea8Slogwang #ifndef _KERNEL 141a9643ea8Slogwang #define IP6OPT_RTALERT 0x05 /* 00 0 00101 (KAME definition) */ 142a9643ea8Slogwang #endif 143a9643ea8Slogwang #define IP6OPT_ROUTER_ALERT 0x05 /* 00 0 00101 (RFC3542, recommended) */ 144a9643ea8Slogwang 145a9643ea8Slogwang #define IP6OPT_RTALERT_LEN 4 146a9643ea8Slogwang #define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */ 147a9643ea8Slogwang #define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */ 148a9643ea8Slogwang #define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */ 149a9643ea8Slogwang #define IP6OPT_MINLEN 2 150a9643ea8Slogwang 151a9643ea8Slogwang #define IP6OPT_EID 0x8a /* 10 0 01010 */ 152a9643ea8Slogwang 153a9643ea8Slogwang #define IP6OPT_TYPE(o) ((o) & 0xC0) 154a9643ea8Slogwang #define IP6OPT_TYPE_SKIP 0x00 155a9643ea8Slogwang #define IP6OPT_TYPE_DISCARD 0x40 156a9643ea8Slogwang #define IP6OPT_TYPE_FORCEICMP 0x80 157a9643ea8Slogwang #define IP6OPT_TYPE_ICMP 0xC0 158a9643ea8Slogwang 159a9643ea8Slogwang #define IP6OPT_MUTABLE 0x20 160a9643ea8Slogwang 161a9643ea8Slogwang /* IPv6 options: common part */ 162a9643ea8Slogwang struct ip6_opt { 163a9643ea8Slogwang u_int8_t ip6o_type; 164a9643ea8Slogwang u_int8_t ip6o_len; 165a9643ea8Slogwang } __packed; 166a9643ea8Slogwang 167a9643ea8Slogwang /* Jumbo Payload Option */ 168a9643ea8Slogwang struct ip6_opt_jumbo { 169a9643ea8Slogwang u_int8_t ip6oj_type; 170a9643ea8Slogwang u_int8_t ip6oj_len; 171a9643ea8Slogwang u_int8_t ip6oj_jumbo_len[4]; 172a9643ea8Slogwang } __packed; 173a9643ea8Slogwang #define IP6OPT_JUMBO_LEN 6 174a9643ea8Slogwang 175a9643ea8Slogwang /* NSAP Address Option */ 176a9643ea8Slogwang struct ip6_opt_nsap { 177a9643ea8Slogwang u_int8_t ip6on_type; 178a9643ea8Slogwang u_int8_t ip6on_len; 179a9643ea8Slogwang u_int8_t ip6on_src_nsap_len; 180a9643ea8Slogwang u_int8_t ip6on_dst_nsap_len; 181a9643ea8Slogwang /* followed by source NSAP */ 182a9643ea8Slogwang /* followed by destination NSAP */ 183a9643ea8Slogwang } __packed; 184a9643ea8Slogwang 185a9643ea8Slogwang /* Tunnel Limit Option */ 186a9643ea8Slogwang struct ip6_opt_tunnel { 187a9643ea8Slogwang u_int8_t ip6ot_type; 188a9643ea8Slogwang u_int8_t ip6ot_len; 189a9643ea8Slogwang u_int8_t ip6ot_encap_limit; 190a9643ea8Slogwang } __packed; 191a9643ea8Slogwang 192a9643ea8Slogwang /* Router Alert Option */ 193a9643ea8Slogwang struct ip6_opt_router { 194a9643ea8Slogwang u_int8_t ip6or_type; 195a9643ea8Slogwang u_int8_t ip6or_len; 196a9643ea8Slogwang u_int8_t ip6or_value[2]; 197a9643ea8Slogwang } __packed; 198a9643ea8Slogwang /* Router alert values (in network byte order) */ 199a9643ea8Slogwang #if BYTE_ORDER == BIG_ENDIAN 200a9643ea8Slogwang #define IP6_ALERT_MLD 0x0000 201a9643ea8Slogwang #define IP6_ALERT_RSVP 0x0001 202a9643ea8Slogwang #define IP6_ALERT_AN 0x0002 203a9643ea8Slogwang #else 204a9643ea8Slogwang #if BYTE_ORDER == LITTLE_ENDIAN 205a9643ea8Slogwang #define IP6_ALERT_MLD 0x0000 206a9643ea8Slogwang #define IP6_ALERT_RSVP 0x0100 207a9643ea8Slogwang #define IP6_ALERT_AN 0x0200 208a9643ea8Slogwang #endif /* LITTLE_ENDIAN */ 209a9643ea8Slogwang #endif 210a9643ea8Slogwang 211a9643ea8Slogwang /* Routing header */ 212a9643ea8Slogwang struct ip6_rthdr { 213a9643ea8Slogwang u_int8_t ip6r_nxt; /* next header */ 214a9643ea8Slogwang u_int8_t ip6r_len; /* length in units of 8 octets */ 215a9643ea8Slogwang u_int8_t ip6r_type; /* routing type */ 216a9643ea8Slogwang u_int8_t ip6r_segleft; /* segments left */ 217a9643ea8Slogwang /* followed by routing type specific data */ 218a9643ea8Slogwang } __packed; 219a9643ea8Slogwang 220a9643ea8Slogwang /* Type 0 Routing header, deprecated by RFC 5095. */ 221a9643ea8Slogwang struct ip6_rthdr0 { 222a9643ea8Slogwang u_int8_t ip6r0_nxt; /* next header */ 223a9643ea8Slogwang u_int8_t ip6r0_len; /* length in units of 8 octets */ 224a9643ea8Slogwang u_int8_t ip6r0_type; /* always zero */ 225a9643ea8Slogwang u_int8_t ip6r0_segleft; /* segments left */ 226a9643ea8Slogwang u_int32_t ip6r0_reserved; /* reserved field */ 227a9643ea8Slogwang /* followed by up to 127 struct in6_addr */ 228a9643ea8Slogwang } __packed; 229a9643ea8Slogwang 230a9643ea8Slogwang /* Fragment header */ 231a9643ea8Slogwang struct ip6_frag { 232a9643ea8Slogwang u_int8_t ip6f_nxt; /* next header */ 233a9643ea8Slogwang u_int8_t ip6f_reserved; /* reserved field */ 234a9643ea8Slogwang u_int16_t ip6f_offlg; /* offset, reserved, and flag */ 235a9643ea8Slogwang u_int32_t ip6f_ident; /* identification */ 236a9643ea8Slogwang } __packed; 237a9643ea8Slogwang 238a9643ea8Slogwang #if BYTE_ORDER == BIG_ENDIAN 239a9643ea8Slogwang #define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */ 240a9643ea8Slogwang #define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */ 241a9643ea8Slogwang #define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */ 242a9643ea8Slogwang #else /* BYTE_ORDER == LITTLE_ENDIAN */ 243a9643ea8Slogwang #define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */ 244a9643ea8Slogwang #define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */ 245a9643ea8Slogwang #define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */ 246a9643ea8Slogwang #endif /* BYTE_ORDER == LITTLE_ENDIAN */ 247a9643ea8Slogwang 248a9643ea8Slogwang /* 249a9643ea8Slogwang * Internet implementation parameters. 250a9643ea8Slogwang */ 251a9643ea8Slogwang #define IPV6_MAXHLIM 255 /* maximum hoplimit */ 252a9643ea8Slogwang #define IPV6_DEFHLIM 64 /* default hlim */ 253a9643ea8Slogwang #define IPV6_FRAGTTL 120 /* ttl for fragment packets, in slowtimo tick */ 254a9643ea8Slogwang #define IPV6_HLIMDEC 1 /* subtracted when forwarding */ 255a9643ea8Slogwang 256a9643ea8Slogwang #define IPV6_MMTU 1280 /* minimal MTU and reassembly. 1024 + 256 */ 257a9643ea8Slogwang #define IPV6_MAXPACKET 65535 /* ip6 max packet size without Jumbo payload*/ 258a9643ea8Slogwang #define IPV6_MAXOPTHDR 2048 /* max option header size, 256 64-bit words */ 259a9643ea8Slogwang 260a9643ea8Slogwang #endif /* not _NETINET_IP6_H_ */ 261