123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754 |
- /* $OpenBSD: in6.h,v 1.83 2015/06/08 22:19:28 krw Exp $ */
- /* $KAME: in6.h,v 1.83 2001/03/29 02:55:07 jinmei Exp $ */
- /*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
- /*
- * Copyright (c) 1982, 1986, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)in.h 8.3 (Berkeley) 1/3/94
- */
- #ifndef __KAME_NETINET_IN_H_INCLUDED_
- #error "do not include netinet6/in6.h directly, include netinet/in.h. see RFC2553"
- #endif
- #ifndef _NETINET6_IN6_H_
- #define _NETINET6_IN6_H_
- /*
- * Identification of the network protocol stack
- * for *BSD-current/release: http://www.kame.net/dev/cvsweb2.cgi/kame/COVERAGE
- * has the table of implementation/integration differences.
- */
- #define __KAME__
- /*
- * IPv6 address
- */
- struct in6_addr {
- union {
- u_int8_t __u6_addr8[16];
- u_int16_t __u6_addr16[8];
- u_int32_t __u6_addr32[4];
- } __u6_addr; /* 128-bit IP6 address */
- };
- #define s6_addr __u6_addr.__u6_addr8
- #ifdef _KERNEL /* XXX nonstandard */
- #define s6_addr8 __u6_addr.__u6_addr8
- #define s6_addr16 __u6_addr.__u6_addr16
- #define s6_addr32 __u6_addr.__u6_addr32
- #endif
- #ifndef INET6_ADDRSTRLEN
- #define INET6_ADDRSTRLEN 46
- #endif
- /*
- * Socket address for IPv6
- */
- #if __BSD_VISIBLE
- #define SIN6_LEN /* Indicates sockaddr_in6 has a sin6_len field */
- #endif /* __BSD_VISIBLE */
- struct sockaddr_in6 {
- u_int8_t sin6_len; /* length of this struct(sa_family_t)*/
- sa_family_t sin6_family; /* AF_INET6 (sa_family_t) */
- in_port_t sin6_port; /* Transport layer port # (in_port_t)*/
- u_int32_t sin6_flowinfo; /* IP6 flow information */
- struct in6_addr sin6_addr; /* IP6 address */
- u_int32_t sin6_scope_id; /* intface scope id */
- };
- /*
- * Local definition for masks
- */
- #ifdef _KERNEL /* XXX nonstandard */
- #define IN6MASK0 {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}}
- #define IN6MASK32 {{{ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
- #define IN6MASK64 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
- #define IN6MASK96 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
- 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}}
- #define IN6MASK128 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}}
- extern const struct sockaddr_in6 sa6_any;
- extern const struct in6_addr in6mask0;
- extern const struct in6_addr in6mask32;
- extern const struct in6_addr in6mask64;
- extern const struct in6_addr in6mask96;
- extern const struct in6_addr in6mask128;
- #endif /* _KERNEL */
- /* Both kernel and libc define these for use */
- extern const struct in6_addr in6addr_any;
- extern const struct in6_addr in6addr_loopback;
- extern const struct in6_addr in6addr_intfacelocal_allnodes;
- extern const struct in6_addr in6addr_linklocal_allnodes;
- extern const struct in6_addr in6addr_linklocal_allrouters;
- #if __BSD_VISIBLE
- /*
- * IPv6 route structure
- */
- struct route_in6 {
- struct rtentry *ro_rt;
- u_long ro_tableid; /* padded to long for alignment */
- struct sockaddr_in6 ro_dst;
- };
- /*
- * Definition of some useful macros to handle IP6 addresses
- */
- #define IN6ADDR_ANY_INIT \
- {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}}
- #define IN6ADDR_LOOPBACK_INIT \
- {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
- #define IN6ADDR_NODELOCAL_ALLNODES_INIT \
- {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
- #define IN6ADDR_INTFACELOCAL_ALLNODES_INIT \
- {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
- #define IN6ADDR_LINKLOCAL_ALLNODES_INIT \
- {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}}
- #define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \
- {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}}
- #define IN6_ARE_ADDR_EQUAL(a, b) \
- (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
- #endif /* __BSD_VISIBLE */
- /*
- * Macros started with IPV6_ADDR is KAME local
- */
- #define __IPV6_ADDR_INT32_ONE htonl(1)
- #define __IPV6_ADDR_INT32_TWO htonl(2)
- #define __IPV6_ADDR_INT32_MNL htonl(0xff010000)
- #define __IPV6_ADDR_INT32_MLL htonl(0xff020000)
- #define __IPV6_ADDR_INT32_SMP htonl(0x0000ffff)
- #define __IPV6_ADDR_INT16_ULL htons(0xfe80)
- #define __IPV6_ADDR_INT16_USL htons(0xfec0)
- #define __IPV6_ADDR_INT16_MLL htons(0xff02)
- /*
- * Unspecified
- */
- #define IN6_IS_ADDR_UNSPECIFIED(a) \
- ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == 0))
- /*
- * Loopback
- */
- #define IN6_IS_ADDR_LOOPBACK(a) \
- ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) == __IPV6_ADDR_INT32_ONE))
- /*
- * IPv4 compatible
- */
- #define IN6_IS_ADDR_V4COMPAT(a) \
- ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[12]) != __IPV6_ADDR_INT32_ONE))
- /*
- * Mapped
- */
- #define IN6_IS_ADDR_V4MAPPED(a) \
- ((*(const u_int32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
- (*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == __IPV6_ADDR_INT32_SMP))
- /*
- * Unicast Scope
- * Note that we must check topmost 10 bits only, not 16 bits (see RFC2373).
- */
- #define IN6_IS_ADDR_LINKLOCAL(a) \
- (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
- #define IN6_IS_ADDR_SITELOCAL(a) \
- (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
- /*
- * Multicast
- */
- #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f)
- #define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff)
- #define __IPV6_ADDR_SCOPE_NODELOCAL 0x01
- #define __IPV6_ADDR_SCOPE_INTFACELOCAL 0x01
- #define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02
- #define __IPV6_ADDR_SCOPE_SITELOCAL 0x05
- #define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* just used in this file */
- #define __IPV6_ADDR_SCOPE_GLOBAL 0x0e
- #define IN6_IS_ADDR_MC_NODELOCAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL))
- #define IN6_IS_ADDR_MC_INTFACELOCAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_INTFACELOCAL))
- #define IN6_IS_ADDR_MC_LINKLOCAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL))
- #define IN6_IS_ADDR_MC_SITELOCAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL))
- #define IN6_IS_ADDR_MC_ORGLOCAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL))
- #define IN6_IS_ADDR_MC_GLOBAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL))
- #ifdef _KERNEL
- #define IN6_IS_SCOPE_LINKLOCAL(a) \
- ((IN6_IS_ADDR_LINKLOCAL(a)) || \
- (IN6_IS_ADDR_MC_LINKLOCAL(a)))
- #define IN6_IS_SCOPE_EMBED(a) \
- ((IN6_IS_ADDR_LINKLOCAL(a)) || \
- (IN6_IS_ADDR_MC_LINKLOCAL(a)) || \
- (IN6_IS_ADDR_MC_INTFACELOCAL(a)))
- #define IFA6_IS_DEPRECATED(a) \
- ((a)->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME && \
- (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
- (a)->ia6_lifetime.ia6t_pltime)
- #define IFA6_IS_INVALID(a) \
- ((a)->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME && \
- (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
- (a)->ia6_lifetime.ia6t_vltime)
- #endif /* _KERNEL */
- /*
- * Options for use with [gs]etsockopt at the IPV6 level.
- * First word of comment is data type; bool is stored in int.
- */
- #define IPV6_UNICAST_HOPS 4 /* int; IP6 hops */
- #define IPV6_MULTICAST_IF 9 /* u_char; set/get IP6 multicast i/f */
- #define IPV6_MULTICAST_HOPS 10 /* u_char; set/get IP6 multicast hops */
- #define IPV6_MULTICAST_LOOP 11 /* u_char; set/get IP6 multicast loopback */
- #define IPV6_JOIN_GROUP 12 /* ip6_mreq; join a group membership */
- #define IPV6_LEAVE_GROUP 13 /* ip6_mreq; leave a group membership */
- #define IPV6_PORTRANGE 14 /* int; range to choose for unspec port */
- #if __BSD_VISIBLE
- #define ICMP6_FILTER 18 /* icmp6_filter; icmp6 filter */
- #endif
- /* RFC2292 options */
- #ifdef _KERNEL
- #define IPV6_2292PKTINFO 19 /* bool; send/rcv if, src/dst addr */
- #define IPV6_2292HOPLIMIT 20 /* bool; hop limit */
- #define IPV6_2292NEXTHOP 21 /* bool; next hop addr */
- #define IPV6_2292HOPOPTS 22 /* bool; hop-by-hop option */
- #define IPV6_2292DSTOPTS 23 /* bool; destination option */
- #define IPV6_2292RTHDR 24 /* bool; routing header */
- #define IPV6_2292PKTOPTIONS 25 /* buf/cmsghdr; set/get IPv6 options */
- #endif
- #define IPV6_CHECKSUM 26 /* int; checksum offset for raw socket */
- #define IPV6_V6ONLY 27 /* bool; make AF_INET6 sockets v6 only */
- /* new socket options introduced in RFC3542 */
- #define IPV6_RTHDRDSTOPTS 35 /* ip6_dest; send dst option before rthdr */
- #define IPV6_RECVPKTINFO 36 /* bool; recv if, dst addr */
- #define IPV6_RECVHOPLIMIT 37 /* bool; recv hop limit */
- #define IPV6_RECVRTHDR 38 /* bool; recv routing header */
- #define IPV6_RECVHOPOPTS 39 /* bool; recv hop-by-hop option */
- #define IPV6_RECVDSTOPTS 40 /* bool; recv dst option after rthdr */
- #ifdef _KERNEL
- #define IPV6_RECVRTHDRDSTOPTS 41 /* bool; recv dst option before rthdr */
- #endif
- #define IPV6_USE_MIN_MTU 42 /* bool; send packets at the minimum MTU */
- #define IPV6_RECVPATHMTU 43 /* bool; notify an according MTU */
- #define IPV6_PATHMTU 44 /* mtuinfo; get the current path MTU (sopt),
- 4 bytes int; MTU notification (cmsg) */
- /* More new socket options introduced in RFC3542 */
- #define IPV6_PKTINFO 46 /* in6_pktinfo; send if, src addr */
- #define IPV6_HOPLIMIT 47 /* int; send hop limit */
- #define IPV6_NEXTHOP 48 /* sockaddr; next hop addr */
- #define IPV6_HOPOPTS 49 /* ip6_hbh; send hop-by-hop option */
- #define IPV6_DSTOPTS 50 /* ip6_dest; send dst option befor rthdr */
- #define IPV6_RTHDR 51 /* ip6_rthdr; send routing header */
- #define IPV6_AUTH_LEVEL 53 /* int; authentication used */
- #define IPV6_ESP_TRANS_LEVEL 54 /* int; transport encryption */
- #define IPV6_ESP_NETWORK_LEVEL 55 /* int; full-packet encryption */
- #if __BSD_VISIBLE
- #define IPSEC6_OUTSA 56 /* set the outbound SA for a socket */
- #endif
- #define IPV6_RECVTCLASS 57 /* bool; recv traffic class values */
- #define IPV6_AUTOFLOWLABEL 59 /* bool; attach flowlabel automagically */
- #define IPV6_IPCOMP_LEVEL 60 /* int; compression */
- #define IPV6_TCLASS 61 /* int; send traffic class value */
- #define IPV6_DONTFRAG 62 /* bool; disable IPv6 fragmentation */
- #define IPV6_PIPEX 63 /* bool; using PIPEX */
- #define IPV6_RECVDSTPORT 64 /* bool; receive IP dst port w/dgram */
- #define IPV6_RTABLE 0x1021 /* int; routing table, see SO_RTABLE */
- /* to define items, should talk with KAME guys first, for *BSD compatibility */
- #define IPV6_RTHDR_LOOSE 0 /* this hop need not be a neighbor */
- #define IPV6_RTHDR_TYPE_0 0 /* IPv6 routing header type 0 */
- /*
- * Defaults and limits for options
- */
- #define IPV6_DEFAULT_MULTICAST_HOPS 1 /* normally limit m'casts to 1 hop */
- #define IPV6_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */
- /*
- * Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP.
- */
- struct ipv6_mreq {
- struct in6_addr ipv6mr_multiaddr;
- unsigned int ipv6mr_interface;
- };
- /*
- * IPV6_PKTINFO: Packet information(RFC3542 sec 6)
- */
- struct in6_pktinfo {
- struct in6_addr ipi6_addr; /* src/dst IPv6 address */
- unsigned int ipi6_ifindex; /* send/recv interface index */
- };
- /*
- * Control structure for IPV6_RECVPATHMTU socket option.
- * XXX Not allowed here by POSIX, but required by RFC 3542, so go
- * XXX with the code on the pavement.
- */
- struct ip6_mtuinfo {
- struct sockaddr_in6 ip6m_addr; /* or sockaddr_storage? */
- u_int32_t ip6m_mtu;
- };
- /*
- * Argument for IPV6_PORTRANGE:
- * - which range to search when port is unspecified at bind() or connect()
- */
- #define IPV6_PORTRANGE_DEFAULT 0 /* default range */
- #define IPV6_PORTRANGE_HIGH 1 /* "high" - request firewall bypass */
- #define IPV6_PORTRANGE_LOW 2 /* "low" - vouchsafe security */
- #ifdef __BSD_VISIBLE
- #ifndef _SOCKLEN_T_DEFINED_
- #define _SOCKLEN_T_DEFINED_
- typedef __socklen_t socklen_t; /* length type for network syscalls */
- #endif
- #endif /* __BSD_VISIBLE */
- #ifdef _KERNEL
- extern u_char inet6ctlerrmap[];
- extern struct niqueue ip6intrq; /* IP6 packet input queue */
- extern struct in6_addr zeroin6_addr;
- struct mbuf;
- struct ifnet;
- struct cmsghdr;
- int in6_cksum(struct mbuf *, u_int8_t, u_int32_t, u_int32_t);
- void in6_proto_cksum_out(struct mbuf *, struct ifnet *);
- int in6_localaddr(struct in6_addr *);
- int in6_addrscope(struct in6_addr *);
- struct in6_ifaddr *in6_ifawithscope(struct ifnet *, struct in6_addr *, u_int);
- void in6_get_rand_ifid(struct ifnet *, struct in6_addr *);
- int in6_mask2len(struct in6_addr *, u_char *);
- struct inpcb;
- int in6_embedscope(struct in6_addr *, const struct sockaddr_in6 *,
- struct inpcb *, struct ifnet **);
- int in6_recoverscope(struct sockaddr_in6 *, const struct in6_addr *,
- struct ifnet *);
- void in6_clearscope(struct in6_addr *);
- struct sockaddr;
- struct sockaddr_in6;
- struct ifaddr;
- struct in6_ifaddr;
- /*
- * Convert between address family specific and general structs.
- * Inline functions check the source type and are stricter than
- * casts or defines.
- */
- static __inline struct sockaddr_in6 *
- satosin6(struct sockaddr *sa)
- {
- return ((struct sockaddr_in6 *)(sa));
- }
- static __inline struct sockaddr *
- sin6tosa(struct sockaddr_in6 *sin6)
- {
- return ((struct sockaddr *)(sin6));
- }
- static __inline struct in6_ifaddr *
- ifatoia6(struct ifaddr *ifa)
- {
- return ((struct in6_ifaddr *)(ifa));
- }
- #endif /* _KERNEL */
- #if __BSD_VISIBLE
- /*
- * Definitions for inet6 sysctl operations.
- *
- * Third level is protocol number.
- * Fourth level is desired variable within that protocol.
- */
- #define IPV6PROTO_MAXID (IPPROTO_DIVERT + 1) /* don't list to IPV6PROTO_MAX */
- #define CTL_IPV6PROTO_NAMES { \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, \
- { "tcp6", CTLTYPE_NODE }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { "udp6", CTLTYPE_NODE }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, \
- { "ip6", CTLTYPE_NODE }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, \
- { "ipsec6", CTLTYPE_NODE }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { "icmp6", CTLTYPE_NODE }, \
- { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { "pim6", CTLTYPE_NODE }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- /*110*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*120*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*130*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*140*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*150*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*160*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*170*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*180*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*190*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*200*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*210*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*220*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*230*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*240*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
- /*250*/ { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { "divert", CTLTYPE_NODE }, \
- }
- /*
- * Names for IP sysctl objects
- */
- #define IPV6CTL_FORWARDING 1 /* act as router */
- #define IPV6CTL_SENDREDIRECTS 2 /* may send redirects when forwarding*/
- #define IPV6CTL_DEFHLIM 3 /* default Hop-Limit */
- #define IPV6CTL_FORWSRCRT 5 /* forward source-routed dgrams */
- #define IPV6CTL_STATS 6 /* stats */
- #define IPV6CTL_MRTSTATS 7 /* multicast forwarding stats */
- #define IPV6CTL_MRTPROTO 8 /* multicast routing protocol */
- #define IPV6CTL_MAXFRAGPACKETS 9 /* max packets reassembly queue */
- #define IPV6CTL_SOURCECHECK 10 /* verify source route and intf */
- #define IPV6CTL_SOURCECHECK_LOGINT 11 /* minimume logging interval */
- #define IPV6CTL_ACCEPT_RTADV 12
- #define IPV6CTL_LOG_INTERVAL 14
- #define IPV6CTL_HDRNESTLIMIT 15
- #define IPV6CTL_DAD_COUNT 16
- #define IPV6CTL_AUTO_FLOWLABEL 17
- #define IPV6CTL_DEFMCASTHLIM 18
- #define IPV6CTL_USE_DEPRECATED 21 /* use deprecated addr (RFC2462 5.5.4) */
- #define IPV6CTL_RR_PRUNE 22 /* walk timer for router renumbering */
- #define IPV6CTL_V6ONLY 24
- /* 25 to 40: resrved */
- #define IPV6CTL_MAXFRAGS 41 /* max fragments */
- #define IPV6CTL_MFORWARDING 42
- #define IPV6CTL_MULTIPATH 43
- #define IPV6CTL_MCAST_PMTU 44 /* path MTU discovery for multicast */
- #define IPV6CTL_NEIGHBORGCTHRESH 45
- #define IPV6CTL_MAXIFPREFIXES 46
- #define IPV6CTL_MAXIFDEFROUTERS 47
- #define IPV6CTL_MAXDYNROUTES 48
- #define IPV6CTL_DAD_PENDING 49
- #define IPV6CTL_MTUDISCTIMEOUT 50
- #define IPV6CTL_IFQUEUE 51
- #define IPV6CTL_MRTMIF 52
- #define IPV6CTL_MRTMFC 53
- #define IPV6CTL_MAXID 54
- /* New entries should be added here from current IPV6CTL_MAXID value. */
- /* to define items, should talk with KAME guys first, for *BSD compatibility */
- #define IPV6CTL_NAMES { \
- { 0, 0 }, \
- { "forwarding", CTLTYPE_INT }, \
- { "redirect", CTLTYPE_INT }, \
- { "hlim", CTLTYPE_INT }, \
- { 0, 0 }, \
- { "forwsrcrt", CTLTYPE_INT }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { "mrtproto", CTLTYPE_INT }, \
- { "maxfragpackets", CTLTYPE_INT }, \
- { "sourcecheck", CTLTYPE_INT }, \
- { "sourcecheck_logint", CTLTYPE_INT }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { "log_interval", CTLTYPE_INT }, \
- { "hdrnestlimit", CTLTYPE_INT }, \
- { "dad_count", CTLTYPE_INT }, \
- { "auto_flowlabel", CTLTYPE_INT }, \
- { "defmcasthlim", CTLTYPE_INT }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { "use_deprecated", CTLTYPE_INT }, \
- { "rr_prune", CTLTYPE_INT }, \
- { 0, 0 }, \
- { "v6only", CTLTYPE_INT }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { 0, 0 }, \
- { "maxfrags", CTLTYPE_INT }, \
- { "mforwarding", CTLTYPE_INT }, \
- { "multipath", CTLTYPE_INT }, \
- { "multicast_mtudisc", CTLTYPE_INT }, \
- { "neighborgcthresh", CTLTYPE_INT }, \
- { "maxifprefixes", CTLTYPE_INT }, \
- { "maxifdefrouters", CTLTYPE_INT }, \
- { "maxdynroutes", CTLTYPE_INT }, \
- { "dad_pending", CTLTYPE_INT }, \
- { "mtudisctimeout", CTLTYPE_INT }, \
- { "ifq", CTLTYPE_NODE }, \
- { "mrtmif", CTLTYPE_STRUCT }, \
- { "mrtmfc", CTLTYPE_STRUCT }, \
- }
- #define IPV6CTL_VARS { \
- NULL, \
- &ip6_forwarding, \
- &ip6_sendredirects, \
- &ip6_defhlim, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- &ip6_maxfragpackets, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- &ip6_log_interval, \
- &ip6_hdrnestlimit, \
- &ip6_dad_count, \
- &ip6_auto_flowlabel, \
- &ip6_defmcasthlim, \
- NULL, \
- NULL, \
- &ip6_use_deprecated, \
- &ip6_rr_prune, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- &ip6_maxfrags, \
- &ip6_mforwarding, \
- &ip6_multipath, \
- &ip6_mcast_pmtu, \
- &ip6_neighborgcthresh, \
- &ip6_maxifprefixes, \
- &ip6_maxifdefrouters, \
- &ip6_maxdynroutes, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- NULL, \
- }
- __BEGIN_DECLS
- struct cmsghdr;
- extern int inet6_opt_init(void *, socklen_t);
- extern int inet6_opt_append(void *, socklen_t, int, u_int8_t,
- socklen_t, u_int8_t, void **);
- extern int inet6_opt_finish(void *, socklen_t, int);
- extern int inet6_opt_set_val(void *, int, void *, socklen_t);
- extern int inet6_opt_next(void *, socklen_t, int, u_int8_t *,
- socklen_t *, void **);
- extern int inet6_opt_find(void *, socklen_t, int, u_int8_t,
- socklen_t *, void **);
- extern int inet6_opt_get_val(void *, int, void *, socklen_t);
- extern socklen_t inet6_rth_space(int, int);
- extern void *inet6_rth_init(void *, socklen_t, int, int);
- extern int inet6_rth_add(void *, const struct in6_addr *);
- extern int inet6_rth_reverse(const void *, void *);
- extern int inet6_rth_segments(const void *);
- extern struct in6_addr *inet6_rth_getaddr(const void *, int);
- __END_DECLS
- #endif /* __BSD_VISIBLE */
- #endif /* !_NETINET6_IN6_H_ */
|