/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * ip6.h - Common structures and definitions as defined by * advanced BSD API. */ #ifndef _NETINET_IP6_H #define _NETINET_IP6_H #pragma ident "%Z%%M% %I% %E% SMI" #ifdef __cplusplus extern "C" { #endif #include #include struct ip6_hdr { union { struct ip6_hdrctl { uint32_t ip6_un1_flow; /* 4 bits version, */ /* 8 bits tclass, and */ /* 20 bits flow-ID */ uint16_t ip6_un1_plen; /* payload length */ uint8_t ip6_un1_nxt; /* next header */ uint8_t ip6_un1_hlim; /* hop limit */ } ip6_un1; uint8_t ip6_un2_vfc; /* 4 bits version and */ /* top 4 bits of tclass */ } ip6_ctlun; struct in6_addr ip6_src; /* source address */ struct in6_addr ip6_dst; /* destination address */ }; typedef struct ip6_hdr ip6_t; #define ip6_vfc ip6_ctlun.ip6_un2_vfc /* 4 bits version and */ /* top 4 bits of tclass */ #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow #define ip6_vcf ip6_flow /* Version, tclass, flow-ID */ #define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen #define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt #define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim /* Hop-by-Hop options header */ struct ip6_hbh { uint8_t ip6h_nxt; /* next header */ uint8_t ip6h_len; /* length in units of 8 octets */ /* followed by options */ }; typedef struct ip6_hbh ip6_hbh_t; /* Destination options header */ struct ip6_dest { uint8_t ip6d_nxt; /* next header */ uint8_t ip6d_len; /* length in units of 8 octets */ /* followed by options */ }; typedef struct ip6_dest ip6_dest_t; /* Routing header */ struct ip6_rthdr { uint8_t ip6r_nxt; /* next header */ uint8_t ip6r_len; /* length in units of 8 octets */ uint8_t ip6r_type; /* routing type */ uint8_t ip6r_segleft; /* segments left */ /* followed by routing type specific data */ }; typedef struct ip6_rthdr ip6_rthdr_t; /* Type 0 Routing header */ struct ip6_rthdr0 { uint8_t ip6r0_nxt; /* next header */ uint8_t ip6r0_len; /* length in units of 8 octets */ uint8_t ip6r0_type; /* always zero */ uint8_t ip6r0_segleft; /* segments left */ uint32_t ip6r0_reserved; /* reserved field */ }; typedef struct ip6_rthdr0 ip6_rthdr0_t; /* Fragment header */ struct ip6_frag { uint8_t ip6f_nxt; /* next header */ uint8_t ip6f_reserved; /* reserved field */ uint16_t ip6f_offlg; /* offset, reserved, and flag */ uint32_t ip6f_ident; /* identification */ }; typedef struct ip6_frag ip6_frag_t; /* ip6f_offlg field related constants (in network byte order) */ #ifdef _BIG_ENDIAN #define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */ #define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */ #define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */ #else #define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */ #define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */ #define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */ #endif /* IPv6 options */ struct ip6_opt { uint8_t ip6o_type; uint8_t ip6o_len; }; /* * The high-order 3 bits of the option type define the behavior * when processing an unknown option and whether or not the option * content changes in flight. */ #define IP6OPT_TYPE(o) ((o) & 0xc0) #define IP6OPT_TYPE_SKIP 0x00 #define IP6OPT_TYPE_DISCARD 0x40 #define IP6OPT_TYPE_FORCEICMP 0x80 #define IP6OPT_TYPE_ICMP 0xc0 #define IP6OPT_MUTABLE 0x20 #define IP6OPT_PAD1 0x00 /* 00 0 00000 */ #define IP6OPT_PADN 0x01 /* 00 0 00001 */ #define IP6OPT_JUMBO 0xc2 /* 11 0 00010 = 194 */ #define IP6OPT_NSAP_ADDR 0xc3 /* 11 0 00011 */ #define IP6OPT_TUNNEL_LIMIT 0x04 /* 00 0 00100 */ #define IP6OPT_ROUTER_ALERT 0x05 /* 00 0 00101 */ #define IP6OPT_BINDING_UPDATE 0xc6 /* 11 0 00110 */ #define IP6OPT_BINDING_ACK 0x07 /* 00 0 00111 */ #define IP6OPT_BINDING_REQ 0x08 /* 00 0 01000 */ #define IP6OPT_HOME_ADDRESS 0xc9 /* 11 0 01001 */ #define IP6OPT_EID 0x8a /* 10 0 01010 */ #define IP6OPT_LS 0x0a /* 00 0 01010 */ #define IP6_MAX_OPT_LENGTH 255 /* Jumbo Payload Option */ struct ip6_opt_jumbo { uint8_t ip6oj_type; uint8_t ip6oj_len; uint8_t ip6oj_jumbo_len[4]; }; #define IP6OPT_JUMBO_LEN 6 /* NSAP Address Option */ struct ip6_opt_nsap { uint8_t ip6on_type; uint8_t ip6on_len; uint8_t ip6on_src_nsap_len; uint8_t ip6on_dst_nsap_len; /* Followed by source NSAP */ /* Followed by destination NSAP */ }; /* Tunnel Limit Option */ struct ip6_opt_tunnel { uint8_t ip6ot_type; uint8_t ip6ot_len; uint8_t ip6ot_encap_limit; }; /* Router Alert Option */ struct ip6_opt_router { uint8_t ip6or_type; uint8_t ip6or_len; uint8_t ip6or_value[2]; }; /* Router alert values (in network byte order) */ #ifdef _BIG_ENDIAN #define IP6_ALERT_MLD 0x0000 #define IP6_ALERT_RSVP 0x0001 #define IP6_ALERT_AN 0x0002 #else #define IP6_ALERT_MLD 0x0000 #define IP6_ALERT_RSVP 0x0100 #define IP6_ALERT_AN 0x0200 #endif /* Binding Update Option */ struct ip6_opt_binding_update { uint8_t ip6ou_type; uint8_t ip6ou_len; uint8_t ip6ou_flags; uint8_t ip6ou_prefixlen; uint8_t ip6ou_seqno[2]; uint8_t ip6ou_lifetime[4]; uint8_t ip6ou_coa[16]; /* Optional based on flags */ /* Followed by sub-options */ }; /* Binding Update Flags */ #define IP6_BUF_ACK 0x80 /* Request a binding ack */ #define IP6_BUF_HOME 0x40 /* Home Registration */ #define IP6_BUF_COA 0x20 /* Care-of-address present in option */ #define IP6_BUF_ROUTER 0x10 /* Sending mobile node is a router */ /* Binding Ack Option */ struct ip6_opt_binding_ack { uint8_t ip6oa_type; uint8_t ip6oa_len; uint8_t ip6oa_status; uint8_t ip6oa_seqno[2]; uint8_t ip6oa_lifetime[4]; uint8_t ip6oa_refresh[4]; /* Followed by sub-options */ }; /* Binding Request Option */ struct ip6_opt_binding_request { uint8_t ip6or_type; uint8_t ip6or_len; /* Followed by sub-options */ }; /* Home Address Option */ struct ip6_opt_home_address { uint8_t ip6oh_type; uint8_t ip6oh_len; uint8_t ip6oh_addr[16]; /* Home Address */ /* Followed by sub-options */ }; /* Labeled Security Option */ struct ip6_opt_labeled_security { uint8_t ip6ol_type; uint8_t ip6ol_len; /* always even for defined values */ uint8_t ip6ol_doi[4]; /* Followed by sub-options */ }; #define IP6LS_DOI_V4 0 /* IPv4 transition */ #define IP6LS_TT_LEVEL 1 /* level or classification; 2-octet value */ #define IP6LS_TT_VECTOR 2 /* compartments; bit vector (even # octets) */ #define IP6LS_TT_ENUM 3 /* set membership; list of 2-octet values */ #define IP6LS_TT_RANGES 4 /* set membership; pairs of 2-octet values */ #define IP6LS_TT_V4 5 /* IPv4 compatible option */ #define IP6LS_TT_DEST 6 /* destination-only data; per DOI */ #ifdef __cplusplus } #endif #endif /* _NETINET_IP6_H */