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 25 struct 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. */ 51 struct 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. */ 58 struct 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 */ 66 struct 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 */ 74 struct 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 */ 84 struct 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 */ 97 struct 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 */ 116 struct 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 */ 143 struct 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 */ 152 struct 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 */ 163 struct 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 */ 171 struct 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