1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2003 Sun Microsystems, Inc. 24 * All rights reserved. 25 * Use is subject to license terms. 26 */ 27 28 /* 29 * ip6.h - Common structures and definitions as defined by 30 * advanced BSD API. 31 */ 32 33 #ifndef _NETINET_IP6_H 34 #define _NETINET_IP6_H 35 36 #pragma ident "%Z%%M% %I% %E% SMI" 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 #include <sys/types.h> 43 #include <netinet/in.h> 44 45 struct ip6_hdr { 46 union { 47 struct ip6_hdrctl { 48 uint32_t ip6_un1_flow; /* 4 bits version, */ 49 /* 8 bits tclass, and */ 50 /* 20 bits flow-ID */ 51 uint16_t ip6_un1_plen; /* payload length */ 52 uint8_t ip6_un1_nxt; /* next header */ 53 uint8_t ip6_un1_hlim; /* hop limit */ 54 } ip6_un1; 55 uint8_t ip6_un2_vfc; /* 4 bits version and */ 56 /* top 4 bits of tclass */ 57 } ip6_ctlun; 58 struct in6_addr ip6_src; /* source address */ 59 struct in6_addr ip6_dst; /* destination address */ 60 }; 61 typedef struct ip6_hdr ip6_t; 62 63 #define ip6_vfc ip6_ctlun.ip6_un2_vfc /* 4 bits version and */ 64 /* top 4 bits of tclass */ 65 #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow 66 #define ip6_vcf ip6_flow /* Version, tclass, flow-ID */ 67 #define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen 68 #define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt 69 #define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim 70 #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim 71 72 /* Hop-by-Hop options header */ 73 struct ip6_hbh { 74 uint8_t ip6h_nxt; /* next header */ 75 uint8_t ip6h_len; /* length in units of 8 octets */ 76 /* followed by options */ 77 }; 78 typedef struct ip6_hbh ip6_hbh_t; 79 80 /* Destination options header */ 81 struct ip6_dest { 82 uint8_t ip6d_nxt; /* next header */ 83 uint8_t ip6d_len; /* length in units of 8 octets */ 84 /* followed by options */ 85 }; 86 typedef struct ip6_dest ip6_dest_t; 87 88 /* Routing header */ 89 struct ip6_rthdr { 90 uint8_t ip6r_nxt; /* next header */ 91 uint8_t ip6r_len; /* length in units of 8 octets */ 92 uint8_t ip6r_type; /* routing type */ 93 uint8_t ip6r_segleft; /* segments left */ 94 /* followed by routing type specific data */ 95 }; 96 typedef struct ip6_rthdr ip6_rthdr_t; 97 98 /* Type 0 Routing header */ 99 struct ip6_rthdr0 { 100 uint8_t ip6r0_nxt; /* next header */ 101 uint8_t ip6r0_len; /* length in units of 8 octets */ 102 uint8_t ip6r0_type; /* always zero */ 103 uint8_t ip6r0_segleft; /* segments left */ 104 uint32_t ip6r0_reserved; /* reserved field */ 105 }; 106 typedef struct ip6_rthdr0 ip6_rthdr0_t; 107 108 /* Fragment header */ 109 struct ip6_frag { 110 uint8_t ip6f_nxt; /* next header */ 111 uint8_t ip6f_reserved; /* reserved field */ 112 uint16_t ip6f_offlg; /* offset, reserved, and flag */ 113 uint32_t ip6f_ident; /* identification */ 114 }; 115 typedef struct ip6_frag ip6_frag_t; 116 117 /* ip6f_offlg field related constants (in network byte order) */ 118 #ifdef _BIG_ENDIAN 119 #define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */ 120 #define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */ 121 #define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */ 122 #else 123 #define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */ 124 #define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */ 125 #define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */ 126 #endif 127 128 /* IPv6 options */ 129 struct ip6_opt { 130 uint8_t ip6o_type; 131 uint8_t ip6o_len; 132 }; 133 134 /* 135 * The high-order 3 bits of the option type define the behavior 136 * when processing an unknown option and whether or not the option 137 * content changes in flight. 138 */ 139 #define IP6OPT_TYPE(o) ((o) & 0xc0) 140 #define IP6OPT_TYPE_SKIP 0x00 141 #define IP6OPT_TYPE_DISCARD 0x40 142 #define IP6OPT_TYPE_FORCEICMP 0x80 143 #define IP6OPT_TYPE_ICMP 0xc0 144 #define IP6OPT_MUTABLE 0x20 145 146 #define IP6OPT_PAD1 0x00 /* 00 0 00000 */ 147 #define IP6OPT_PADN 0x01 /* 00 0 00001 */ 148 #define IP6OPT_JUMBO 0xc2 /* 11 0 00010 = 194 */ 149 #define IP6OPT_NSAP_ADDR 0xc3 /* 11 0 00011 */ 150 #define IP6OPT_TUNNEL_LIMIT 0x04 /* 00 0 00100 */ 151 #define IP6OPT_ROUTER_ALERT 0x05 /* 00 0 00101 */ 152 #define IP6OPT_BINDING_UPDATE 0xc6 /* 11 0 00110 */ 153 #define IP6OPT_BINDING_ACK 0x07 /* 00 0 00111 */ 154 #define IP6OPT_BINDING_REQ 0x08 /* 00 0 01000 */ 155 #define IP6OPT_HOME_ADDRESS 0xc9 /* 11 0 01001 */ 156 #define IP6OPT_EID 0x8a /* 10 0 01010 */ 157 158 /* Jumbo Payload Option */ 159 struct ip6_opt_jumbo { 160 uint8_t ip6oj_type; 161 uint8_t ip6oj_len; 162 uint8_t ip6oj_jumbo_len[4]; 163 }; 164 #define IP6OPT_JUMBO_LEN 6 165 166 /* NSAP Address Option */ 167 struct ip6_opt_nsap { 168 uint8_t ip6on_type; 169 uint8_t ip6on_len; 170 uint8_t ip6on_src_nsap_len; 171 uint8_t ip6on_dst_nsap_len; 172 /* Followed by source NSAP */ 173 /* Followed by destination NSAP */ 174 }; 175 176 /* Tunnel Limit Option */ 177 struct ip6_opt_tunnel { 178 uint8_t ip6ot_type; 179 uint8_t ip6ot_len; 180 uint8_t ip6ot_encap_limit; 181 }; 182 183 /* Router Alert Option */ 184 struct ip6_opt_router { 185 uint8_t ip6or_type; 186 uint8_t ip6or_len; 187 uint8_t ip6or_value[2]; 188 }; 189 190 /* Router alert values (in network byte order) */ 191 #ifdef _BIG_ENDIAN 192 #define IP6_ALERT_MLD 0x0000 193 #define IP6_ALERT_RSVP 0x0001 194 #define IP6_ALERT_AN 0x0002 195 #else 196 #define IP6_ALERT_MLD 0x0000 197 #define IP6_ALERT_RSVP 0x0100 198 #define IP6_ALERT_AN 0x0200 199 #endif 200 201 /* Binding Update Option */ 202 struct ip6_opt_binding_update { 203 uint8_t ip6ou_type; 204 uint8_t ip6ou_len; 205 uint8_t ip6ou_flags; 206 uint8_t ip6ou_prefixlen; 207 uint8_t ip6ou_seqno[2]; 208 uint8_t ip6ou_lifetime[4]; 209 uint8_t ip6ou_coa[16]; /* Optional based on flags */ 210 /* Followed by sub-options */ 211 }; 212 213 /* Binding Update Flags */ 214 #define IP6_BUF_ACK 0x80 /* Request a binding ack */ 215 #define IP6_BUF_HOME 0x40 /* Home Registration */ 216 #define IP6_BUF_COA 0x20 /* Care-of-address present in option */ 217 #define IP6_BUF_ROUTER 0x10 /* Sending mobile node is a router */ 218 219 /* Binding Ack Option */ 220 struct ip6_opt_binding_ack { 221 uint8_t ip6oa_type; 222 uint8_t ip6oa_len; 223 uint8_t ip6oa_status; 224 uint8_t ip6oa_seqno[2]; 225 uint8_t ip6oa_lifetime[4]; 226 uint8_t ip6oa_refresh[4]; 227 /* Followed by sub-options */ 228 }; 229 230 /* Binding Request Option */ 231 struct ip6_opt_binding_request { 232 uint8_t ip6or_type; 233 uint8_t ip6or_len; 234 /* Followed by sub-options */ 235 }; 236 237 /* Home Address Option */ 238 struct ip6_opt_home_address { 239 uint8_t ip6oh_type; 240 uint8_t ip6oh_len; 241 uint8_t ip6oh_addr[16]; /* Home Address */ 242 /* Followed by sub-options */ 243 }; 244 245 #ifdef __cplusplus 246 } 247 #endif 248 249 #endif /* _NETINET_IP6_H */ 250