1/* Copyright (C) 1991-1997, 2001, 2003, 2006 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library; if not, write to the Free 16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17 02111-1307 USA. */ 18 19#ifndef _NETINET_IP6_H 20#define _NETINET_IP6_H 1 21 22#include <inttypes.h> 23#include <netinet/in.h> 24 25struct ip6_hdr 26 { 27 union 28 { 29 struct ip6_hdrctl 30 { 31 uint32_t ip6_un1_flow; /* 4 bits version, 8 bits TC, 32 20 bits flow-ID */ 33 uint16_t ip6_un1_plen; /* payload length */ 34 uint8_t ip6_un1_nxt; /* next header */ 35 uint8_t ip6_un1_hlim; /* hop limit */ 36 } ip6_un1; 37 uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits tclass */ 38 } ip6_ctlun; 39 struct in6_addr ip6_src; /* source address */ 40 struct in6_addr ip6_dst; /* destination address */ 41 }; 42 43#define ip6_vfc ip6_ctlun.ip6_un2_vfc 44#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow 45#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen 46#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt 47#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim 48#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim 49 50/* Generic extension header. */ 51struct ip6_ext 52 { 53 uint8_t ip6e_nxt; /* next header. */ 54 uint8_t ip6e_len; /* length in units of 8 octets. */ 55 }; 56 57/* Hop-by-Hop options header. */ 58struct ip6_hbh 59 { 60 uint8_t ip6h_nxt; /* next header. */ 61 uint8_t ip6h_len; /* length in units of 8 octets. */ 62 /* followed by options */ 63 }; 64 65/* Destination options header */ 66struct ip6_dest 67 { 68 uint8_t ip6d_nxt; /* next header */ 69 uint8_t ip6d_len; /* length in units of 8 octets */ 70 /* followed by options */ 71 }; 72 73/* Routing header */ 74struct ip6_rthdr 75 { 76 uint8_t ip6r_nxt; /* next header */ 77 uint8_t ip6r_len; /* length in units of 8 octets */ 78 uint8_t ip6r_type; /* routing type */ 79 uint8_t ip6r_segleft; /* segments left */ 80 /* followed by routing type specific data */ 81 }; 82 83/* Type 0 Routing header */ 84struct ip6_rthdr0 85 { 86 uint8_t ip6r0_nxt; /* next header */ 87 uint8_t ip6r0_len; /* length in units of 8 octets */ 88 uint8_t ip6r0_type; /* always zero */ 89 uint8_t ip6r0_segleft; /* segments left */ 90 uint8_t ip6r0_reserved; /* reserved field */ 91 uint8_t ip6r0_slmap[3]; /* strict/loose bit map */ 92 /* followed by up to 127 struct in6_addr */ 93 struct in6_addr ip6r0_addr[0]; 94 }; 95 96/* Fragment header */ 97struct ip6_frag 98 { 99 uint8_t ip6f_nxt; /* next header */ 100 uint8_t ip6f_reserved; /* reserved field */ 101 uint16_t ip6f_offlg; /* offset, reserved, and flag */ 102 uint32_t ip6f_ident; /* identification */ 103 }; 104 105#if BYTE_ORDER == BIG_ENDIAN 106# define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */ 107# define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */ 108# define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */ 109#else /* BYTE_ORDER == LITTLE_ENDIAN */ 110# define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */ 111# define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */ 112# define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */ 113#endif 114 115/* IPv6 options */ 116struct ip6_opt 117 { 118 uint8_t ip6o_type; 119 uint8_t ip6o_len; 120 }; 121 122/* The high-order 3 bits of the option type define the behavior 123 * when processing an unknown option and whether or not the option 124 * content changes in flight. 125 */ 126#define IP6OPT_TYPE(o) ((o) & 0xc0) 127#define IP6OPT_TYPE_SKIP 0x00 128#define IP6OPT_TYPE_DISCARD 0x40 129#define IP6OPT_TYPE_FORCEICMP 0x80 130#define IP6OPT_TYPE_ICMP 0xc0 131#define IP6OPT_TYPE_MUTABLE 0x20 132 133/* Special option types for padding. */ 134#define IP6OPT_PAD1 0 135#define IP6OPT_PADN 1 136 137#define IP6OPT_JUMBO 0xc2 138#define IP6OPT_NSAP_ADDR 0xc3 139#define IP6OPT_TUNNEL_LIMIT 0x04 140#define IP6OPT_ROUTER_ALERT 0x05 141 142/* Jumbo Payload Option */ 143struct ip6_opt_jumbo 144 { 145 uint8_t ip6oj_type; 146 uint8_t ip6oj_len; 147 uint8_t ip6oj_jumbo_len[4]; 148 }; 149#define IP6OPT_JUMBO_LEN 6 150 151/* NSAP Address Option */ 152struct ip6_opt_nsap 153 { 154 uint8_t ip6on_type; 155 uint8_t ip6on_len; 156 uint8_t ip6on_src_nsap_len; 157 uint8_t ip6on_dst_nsap_len; 158 /* followed by source NSAP */ 159 /* followed by destination NSAP */ 160 }; 161 162/* Tunnel Limit Option */ 163struct ip6_opt_tunnel 164 { 165 uint8_t ip6ot_type; 166 uint8_t ip6ot_len; 167 uint8_t ip6ot_encap_limit; 168 }; 169 170/* Router Alert Option */ 171struct ip6_opt_router 172 { 173 uint8_t ip6or_type; 174 uint8_t ip6or_len; 175 uint8_t ip6or_value[2]; 176 }; 177 178/* Router alert values (in network byte order) */ 179#if BYTE_ORDER == BIG_ENDIAN 180# define IP6_ALERT_MLD 0x0000 181# define IP6_ALERT_RSVP 0x0001 182# define IP6_ALERT_AN 0x0002 183#else /* BYTE_ORDER == LITTLE_ENDING */ 184# define IP6_ALERT_MLD 0x0000 185# define IP6_ALERT_RSVP 0x0100 186# define IP6_ALERT_AN 0x0200 187#endif 188 189#endif /* netinet/ip6.h */ 190