in6_var.h revision 287733
12061Sjkh/*-
235479Sbde * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
32061Sjkh * All rights reserved.
433611Sjb *
532427Sjb * Redistribution and use in source and binary forms, with or without
632427Sjb * modification, are permitted provided that the following conditions
733611Sjb * are met:
833611Sjb * 1. Redistributions of source code must retain the above copyright
932427Sjb *    notice, this list of conditions and the following disclaimer.
1032427Sjb * 2. Redistributions in binary form must reproduce the above copyright
112061Sjkh *    notice, this list of conditions and the following disclaimer in the
1215603Smarkm *    documentation and/or other materials provided with the distribution.
1330169Sjkh * 3. Neither the name of the project nor the names of its contributors
1420710Sasami *    may be used to endorse or promote products derived from this software
1520710Sasami *    without specific prior written permission.
163197Scsgr *
172061Sjkh * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
1812483Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1934509Sbde * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
202160Scsgr * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
212834Swollman * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
222061Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
232061Sjkh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
242160Scsgr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2517308Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2619320Sadam * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2727788Sasami * SUCH DAMAGE.
2830169Sjkh *
2925980Sasami *	$KAME: in6_var.h,v 1.56 2001/03/29 05:34:31 itojun Exp $
301594Srgrimes */
3117308Speter
3217308Speter/*-
3327910Sasami * Copyright (c) 1985, 1986, 1993
3427910Sasami *	The Regents of the University of California.  All rights reserved.
3527910Sasami *
3617308Speter * Redistribution and use in source and binary forms, with or without
3717308Speter * modification, are permitted provided that the following conditions
3817308Speter * are met:
3919175Sbde * 1. Redistributions of source code must retain the above copyright
4019175Sbde *    notice, this list of conditions and the following disclaimer.
4119175Sbde * 2. Redistributions in binary form must reproduce the above copyright
4219175Sbde *    notice, this list of conditions and the following disclaimer in the
4317308Speter *    documentation and/or other materials provided with the distribution.
4427910Sasami * 4. Neither the name of the University nor the names of its contributors
4534509Sbde *    may be used to endorse or promote products derived from this software
4627910Sasami *    without specific prior written permission.
4717308Speter *
482061Sjkh * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
492061Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
501594Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
5130169Sjkh * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
5230169Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
5330169Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
5430169Sjkh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
5530169Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
5630169Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5730169Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5830169Sjkh * SUCH DAMAGE.
597407Srgrimes *
607108Sphk *	@(#)in_var.h	8.1 (Berkeley) 6/10/93
617108Sphk * $FreeBSD: stable/10/sys/netinet6/in6_var.h 287733 2015-09-13 01:59:50Z hrs $
627108Sphk */
637407Srgrimes
647407Srgrimes#ifndef _NETINET6_IN6_VAR_H_
657407Srgrimes#define _NETINET6_IN6_VAR_H_
667108Sphk
672061Sjkh#include <sys/tree.h>
682061Sjkh
692061Sjkh#ifdef _KERNEL
7017308Speter#include <sys/fnv_hash.h>
712061Sjkh#include <sys/libkern.h>
722061Sjkh#endif
732061Sjkh
742061Sjkh/*
752061Sjkh * Interface address, Internet version.  One of these structures
7635427Sbde * is allocated for each interface with an Internet address.
7735427Sbde * The ifaddr structure contains the protocol-independent part
7830169Sjkh * of the structure and is assumed to be first.
792626Scsgr */
802061Sjkh
812061Sjkh/*
822061Sjkh * pltime/vltime are just for future reference (required to implements 2
832061Sjkh * hour rule for hosts).  they should never be modified by nd6_timeout or
842061Sjkh * anywhere else.
852061Sjkh *	userland -> kernel: accept pltime/vltime
8619320Sadam *	kernel -> userland: throw up everything
872061Sjkh *	in kernel: modify preferred/expire only
882061Sjkh */
892061Sjkhstruct in6_addrlifetime {
902061Sjkh	time_t ia6t_expire;	/* valid lifetime expiration time */
912061Sjkh	time_t ia6t_preferred;	/* preferred lifetime expiration time */
922061Sjkh	u_int32_t ia6t_vltime;	/* valid lifetime */
932061Sjkh	u_int32_t ia6t_pltime;	/* prefix lifetime */
942061Sjkh};
952061Sjkh
962061Sjkhstruct nd_ifinfo;
972061Sjkhstruct scope6_id;
982834Swollmanstruct lltable;
992834Swollmanstruct mld_ifinfo;
1002834Swollman
1012834Swollman#ifdef _KERNEL
1022834Swollman#include <sys/counter.h>
1032834Swollman
1041594Srgrimesstruct in6_ifextra {
1054486Sphk	counter_u64_t *in6_ifstat;
1064486Sphk	counter_u64_t *icmp6_ifstat;
1074486Sphk	struct nd_ifinfo *nd_ifinfo;
1084486Sphk	struct scope6_id *scope6_id;
1094486Sphk	struct lltable *lltable;
1102061Sjkh	struct mld_ifinfo *mld_ifinfo;
1112061Sjkh};
11225979Sjkh#else
11325979Sjkh
11425979Sjkhstruct in6_ifextra {
11525979Sjkh	void *in6_ifstat;
1162061Sjkh	void *icmp6_ifstat;
11725979Sjkh	struct nd_ifinfo *nd_ifinfo;
1182061Sjkh	struct scope6_id *scope6_id;
1192061Sjkh	struct lltable *lltable;
12017308Speter	struct mld_ifinfo *mld_ifinfo;
1212061Sjkh};
1222061Sjkh#endif /* !_KERNEL */
1232061Sjkh
1242061Sjkh#define	LLTABLE6(ifp)	(((struct in6_ifextra *)(ifp)->if_afdata[AF_INET6])->lltable)
1252061Sjkh
12612483Speterstruct	in6_ifaddr {
12712483Speter	struct	ifaddr ia_ifa;		/* protocol-independent info */
12812483Speter#define	ia_ifp		ia_ifa.ifa_ifp
12912483Speter#define ia_flags	ia_ifa.ifa_flags
1302061Sjkh	struct	sockaddr_in6 ia_addr;	/* interface address */
13135479Sbde	struct	sockaddr_in6 ia_net;	/* network number of interface */
1328854Srgrimes	struct	sockaddr_in6 ia_dstaddr; /* space for destination addr */
1332061Sjkh	struct	sockaddr_in6 ia_prefixmask; /* prefix mask */
1342061Sjkh	u_int32_t ia_plen;		/* prefix length */
13512483Speter	TAILQ_ENTRY(in6_ifaddr)	ia_link;	/* list of IPv6 addresses */
1362061Sjkh	int	ia6_flags;
13735479Sbde
13835479Sbde	struct in6_addrlifetime ia6_lifetime;
13935479Sbde	time_t	ia6_createtime; /* the creation time of this address, which is
14035479Sbde				 * currently used for temporary addresses only.
14135479Sbde				 */
14235479Sbde	time_t	ia6_updatetime;
14335479Sbde
14435479Sbde	/* back pointer to the ND prefix (for autoconfigured addresses only) */
14535479Sbde	struct nd_prefix *ia6_ndpr;
14635462Sjkh
14735462Sjkh	/* multicast addresses joined from the kernel */
14818714Sache	LIST_HEAD(, in6_multi_mship) ia6_memberships;
14917308Speter	/* entry in bucket of inet6 addresses */
15034541Sbde	LIST_ENTRY(in6_ifaddr) ia6_hash;
15134575Sbde};
15234575Sbde
15334575Sbde/* List of in6_ifaddr's. */
15434592SbdeTAILQ_HEAD(in6_ifaddrhead, in6_ifaddr);
15517308SpeterLIST_HEAD(in6_ifaddrlisthead, in6_ifaddr);
15634575Sbde
15735427Sbde/* control structure to manage address selection policy */
15834575Sbdestruct in6_addrpolicy {
15935427Sbde	struct sockaddr_in6 addr; /* prefix address */
16034575Sbde	struct sockaddr_in6 addrmask; /* prefix mask */
16115603Smarkm	int preced;		/* precedence */
16217308Speter	int label;		/* matching label */
16317308Speter	u_quad_t use;		/* statistics */
16417308Speter};
16517308Speter
16617308Speter/*
16717308Speter * IPv6 interface statistics, as defined in RFC2465 Ipv6IfStatsEntry (p12).
16817308Speter */
16917308Speterstruct in6_ifstat {
17017308Speter	uint64_t ifs6_in_receive;	/* # of total input datagram */
17118362Sjkh	uint64_t ifs6_in_hdrerr;	/* # of datagrams with invalid hdr */
17219966Sache	uint64_t ifs6_in_toobig;	/* # of datagrams exceeded MTU */
17318362Sjkh	uint64_t ifs6_in_noroute;	/* # of datagrams with no route */
17417308Speter	uint64_t ifs6_in_addrerr;	/* # of datagrams with invalid dst */
17527910Sasami	uint64_t ifs6_in_protounknown;	/* # of datagrams with unknown proto */
17617308Speter					/* NOTE: increment on final dst if */
17717308Speter	uint64_t ifs6_in_truncated;	/* # of truncated datagrams */
17817308Speter	uint64_t ifs6_in_discard;	/* # of discarded datagrams */
17928803Speter					/* NOTE: fragment timeout is not here */
18027910Sasami	uint64_t ifs6_in_deliver;	/* # of datagrams delivered to ULP */
18128803Speter					/* NOTE: increment on final dst if */
18230113Sjkh	uint64_t ifs6_out_forward;	/* # of datagrams forwarded */
18327910Sasami					/* NOTE: increment on outgoing if */
18417308Speter	uint64_t ifs6_out_request;	/* # of outgoing datagrams from ULP */
1852061Sjkh					/* NOTE: does not include forwrads */
18627910Sasami	uint64_t ifs6_out_discard;	/* # of discarded datagrams */
1872061Sjkh	uint64_t ifs6_out_fragok;	/* # of datagrams fragmented */
18828803Speter	uint64_t ifs6_out_fragfail;	/* # of datagrams failed on fragment */
18927910Sasami	uint64_t ifs6_out_fragcreat;	/* # of fragment datagrams */
1902061Sjkh					/* NOTE: this is # after fragment */
19117308Speter	uint64_t ifs6_reass_reqd;	/* # of incoming fragmented packets */
19227910Sasami					/* NOTE: increment on final dst if */
19317308Speter	uint64_t ifs6_reass_ok;		/* # of reassembled packets */
19427910Sasami					/* NOTE: this is # after reass */
19527910Sasami					/* NOTE: increment on final dst if */
19627910Sasami	uint64_t ifs6_reass_fail;	/* # of reass failures */
19717308Speter					/* NOTE: may not be packet count */
19827910Sasami					/* NOTE: increment on final dst if */
19917308Speter	uint64_t ifs6_in_mcast;		/* # of inbound multicast datagrams */
20027910Sasami	uint64_t ifs6_out_mcast;	/* # of outbound multicast datagrams */
20127910Sasami};
20227910Sasami
20327910Sasami/*
20427910Sasami * ICMPv6 interface statistics, as defined in RFC2466 Ipv6IfIcmpEntry.
20527910Sasami * XXX: I'm not sure if this file is the right place for this structure...
20627910Sasami */
20727910Sasamistruct icmp6_ifstat {
20827910Sasami	/*
20927910Sasami	 * Input statistics
21027910Sasami	 */
21127910Sasami	/* ipv6IfIcmpInMsgs, total # of input messages */
21234509Sbde	uint64_t ifs6_in_msg;
21327910Sasami	/* ipv6IfIcmpInErrors, # of input error messages */
21427910Sasami	uint64_t ifs6_in_error;
21527910Sasami	/* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */
21627910Sasami	uint64_t ifs6_in_dstunreach;
21727910Sasami	/* ipv6IfIcmpInAdminProhibs, # of input administratively prohibited errs */
21835479Sbde	uint64_t ifs6_in_adminprohib;
21927910Sasami	/* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */
22027910Sasami	uint64_t ifs6_in_timeexceed;
22134688Sbde	/* ipv6IfIcmpInParmProblems, # of input parameter problem errors */
22234688Sbde	uint64_t ifs6_in_paramprob;
22327910Sasami	/* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */
22435427Sbde	uint64_t ifs6_in_pkttoobig;
22527910Sasami	/* ipv6IfIcmpInEchos, # of input echo requests */
22635427Sbde	uint64_t ifs6_in_echo;
22727910Sasami	/* ipv6IfIcmpInEchoReplies, # of input echo replies */
22835427Sbde	uint64_t ifs6_in_echoreply;
22927910Sasami	/* ipv6IfIcmpInRouterSolicits, # of input router solicitations */
23027910Sasami	uint64_t ifs6_in_routersolicit;
23127910Sasami	/* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */
23227910Sasami	uint64_t ifs6_in_routeradvert;
23327910Sasami	/* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */
23427910Sasami	uint64_t ifs6_in_neighborsolicit;
23527910Sasami	/* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advertisements */
23627910Sasami	uint64_t ifs6_in_neighboradvert;
23727910Sasami	/* ipv6IfIcmpInRedirects, # of input redirects */
23817308Speter	uint64_t ifs6_in_redirect;
23917308Speter	/* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */
24027910Sasami	uint64_t ifs6_in_mldquery;
24117308Speter	/* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */
24227910Sasami	uint64_t ifs6_in_mldreport;
24327910Sasami	/* ipv6IfIcmpInGroupMembReductions, # of input MLD done */
24427910Sasami	uint64_t ifs6_in_mlddone;
24527910Sasami
24633133Sadam	/*
24717466Speter	 * Output statistics. We should solve unresolved routing problem...
24817308Speter	 */
24927910Sasami	/* ipv6IfIcmpOutMsgs, total # of output messages */
25017308Speter	uint64_t ifs6_out_msg;
25134688Sbde	/* ipv6IfIcmpOutErrors, # of output error messages */
25234688Sbde	uint64_t ifs6_out_error;
25327910Sasami	/* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */
25434688Sbde	uint64_t ifs6_out_dstunreach;
25530113Sjkh	/* ipv6IfIcmpOutAdminProhibs, # of output administratively prohibited errs */
25630277Sasami	uint64_t ifs6_out_adminprohib;
25734688Sbde	/* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */
25834688Sbde	uint64_t ifs6_out_timeexceed;
25933133Sadam	/* ipv6IfIcmpOutParmProblems, # of output parameter problem errors */
26017308Speter	uint64_t ifs6_out_paramprob;
26117308Speter	/* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */
26227910Sasami	uint64_t ifs6_out_pkttoobig;
26317308Speter	/* ipv6IfIcmpOutEchos, # of output echo requests */
26427910Sasami	uint64_t ifs6_out_echo;
26527910Sasami	/* ipv6IfIcmpOutEchoReplies, # of output echo replies */
26617308Speter	uint64_t ifs6_out_echoreply;
26717308Speter	/* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */
26827910Sasami	uint64_t ifs6_out_routersolicit;
26917308Speter	/* ipv6IfIcmpOutRouterAdvertisements, # of output router advertisements */
27035479Sbde	uint64_t ifs6_out_routeradvert;
27127910Sasami	/* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */
27227910Sasami	uint64_t ifs6_out_neighborsolicit;
27317308Speter	/* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advertisements */
27417308Speter	uint64_t ifs6_out_neighboradvert;
27527910Sasami	/* ipv6IfIcmpOutRedirects, # of output redirects */
27617308Speter	uint64_t ifs6_out_redirect;
27734509Sbde	/* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */
27827910Sasami	uint64_t ifs6_out_mldquery;
27933133Sadam	/* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */
28017308Speter	uint64_t ifs6_out_mldreport;
28117308Speter	/* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */
28227910Sasami	uint64_t ifs6_out_mlddone;
28317308Speter};
28427910Sasami
28517308Speterstruct	in6_ifreq {
28617308Speter	char	ifr_name[IFNAMSIZ];
28727910Sasami	union {
28817308Speter		struct	sockaddr_in6 ifru_addr;
28927910Sasami		struct	sockaddr_in6 ifru_dstaddr;
29033133Sadam		int	ifru_flags;
29117308Speter		int	ifru_flags6;
29217308Speter		int	ifru_metric;
29334509Sbde		caddr_t	ifru_data;
29417308Speter		struct in6_addrlifetime ifru_lifetime;
29529503Sbde		struct in6_ifstat ifru_stat;
29633133Sadam		struct icmp6_ifstat ifru_icmp6stat;
29717962Speter		u_int32_t ifru_scope_id[16];
29817962Speter	} ifr_ifru;
29935427Sbde};
30017962Speter
30127910Sasamistruct	in6_aliasreq {
30233133Sadam	char	ifra_name[IFNAMSIZ];
30317962Speter	struct	sockaddr_in6 ifra_addr;
30417962Speter	struct	sockaddr_in6 ifra_dstaddr;
30535427Sbde	struct	sockaddr_in6 ifra_prefixmask;
30617962Speter	int	ifra_flags;
30735427Sbde	struct in6_addrlifetime ifra_lifetime;
30833133Sadam	int	ifra_vhid;
30917962Speter};
31017962Speter
31127910Sasami/* pre-10.x compat */
31217962Speterstruct	oin6_aliasreq {
31327910Sasami	char	ifra_name[IFNAMSIZ];
31433133Sadam	struct	sockaddr_in6 ifra_addr;
31535479Sbde	struct	sockaddr_in6 ifra_dstaddr;
31617308Speter	struct	sockaddr_in6 ifra_prefixmask;
31717308Speter	int	ifra_flags;
31827910Sasami	struct in6_addrlifetime ifra_lifetime;
31917308Speter};
32030205Sbde
32135479Sbde/* prefix type macro */
32217308Speter#define IN6_PREFIX_ND	1
32317308Speter#define IN6_PREFIX_RR	2
32435427Sbde
32535427Sbde/*
32635479Sbde * prefix related flags passed between kernel(NDP related part) and
32735427Sbde * user land command(ifconfig) and daemon(rtadvd).
32835427Sbde */
32927910Sasamistruct in6_prflags {
33017962Speter	struct prf_ra {
33127910Sasami		u_char onlink : 1;
3322061Sjkh		u_char autonomous : 1;
33317308Speter		u_char reserved : 6;
33427910Sasami	} prf_ra;
33527910Sasami	u_char prf_reserved1;
33627910Sasami	u_short prf_reserved2;
33727910Sasami	/* want to put this on 4byte offset */
33827910Sasami	struct prf_rr {
33927910Sasami		u_char decrvalid : 1;
34027910Sasami		u_char decrprefd : 1;
34127910Sasami		u_char reserved : 6;
34217308Speter	} prf_rr;
34317308Speter	u_char prf_reserved3;
34417308Speter	u_short prf_reserved4;
34517308Speter};
34617308Speter
34717308Speterstruct  in6_prefixreq {
34817308Speter	char	ipr_name[IFNAMSIZ];
34912483Speter	u_char	ipr_origin;
35017308Speter	u_char	ipr_plen;
35112483Speter	u_int32_t ipr_vltime;
35217308Speter	u_int32_t ipr_pltime;
35312483Speter	struct in6_prflags ipr_flags;
3542061Sjkh	struct	sockaddr_in6 ipr_prefix;
35517962Speter};
35617962Speter
35717308Speter#define PR_ORIG_RA	0
35817962Speter#define PR_ORIG_RR	1
35917962Speter#define PR_ORIG_STATIC	2
36033595Snate#define PR_ORIG_KERNEL	3
36133595Snate
36233595Snate#define ipr_raf_onlink		ipr_flags.prf_ra.onlink
36333595Snate#define ipr_raf_auto		ipr_flags.prf_ra.autonomous
36433595Snate
36517962Speter#define ipr_statef_onlink	ipr_flags.prf_state.onlink
36617962Speter
36717308Speter#define ipr_rrf_decrvalid	ipr_flags.prf_rr.decrvalid
3682061Sjkh#define ipr_rrf_decrprefd	ipr_flags.prf_rr.decrprefd
36917308Speter
37017308Speterstruct	in6_rrenumreq {
37117308Speter	char	irr_name[IFNAMSIZ];
37217308Speter	u_char	irr_origin;
37317308Speter	u_char	irr_m_len;	/* match len for matchprefix */
37417308Speter	u_char	irr_m_minlen;	/* minlen for matching prefix */
3752302Spaul	u_char	irr_m_maxlen;	/* maxlen for matching prefix */
3762302Spaul	u_char	irr_u_uselen;	/* uselen for adding prefix */
3772302Spaul	u_char	irr_u_keeplen;	/* keeplen from matching prefix */
37835462Sjkh	struct irr_raflagmask {
3792302Spaul		u_char onlink : 1;
38018714Sache		u_char autonomous : 1;
38110760Sache		u_char reserved : 6;
38218714Sache	} irr_raflagmask;
3832302Spaul	u_int32_t irr_vltime;
38410760Sache	u_int32_t irr_pltime;
38518714Sache	struct in6_prflags irr_flags;
38610760Sache	struct	sockaddr_in6 irr_matchprefix;
38710760Sache	struct	sockaddr_in6 irr_useprefix;
3882302Spaul};
3892302Spaul
3902302Spaul#define irr_raf_mask_onlink	irr_raflagmask.onlink
3912302Spaul#define irr_raf_mask_auto	irr_raflagmask.autonomous
39230132Sfsmp#define irr_raf_mask_reserved	irr_raflagmask.reserved
3932302Spaul
3942302Spaul#define irr_raf_onlink		irr_flags.prf_ra.onlink
39517308Speter#define irr_raf_auto		irr_flags.prf_ra.autonomous
39617308Speter
39717308Speter#define irr_statef_onlink	irr_flags.prf_state.onlink
39817308Speter
39917308Speter#define irr_rrf			irr_flags.prf_rr
40017308Speter#define irr_rrf_decrvalid	irr_flags.prf_rr.decrvalid
4012061Sjkh#define irr_rrf_decrprefd	irr_flags.prf_rr.decrprefd
40217308Speter
4032061Sjkh/*
40430205Sbde * Given a pointer to an in6_ifaddr (ifaddr),
40530205Sbde * return a pointer to the addr as a sockaddr_in6
40630205Sbde */
40730205Sbde#define IA6_IN6(ia)	(&((ia)->ia_addr.sin6_addr))
40830205Sbde#define IA6_DSTIN6(ia)	(&((ia)->ia_dstaddr.sin6_addr))
40930205Sbde#define IA6_MASKIN6(ia)	(&((ia)->ia_prefixmask.sin6_addr))
41030205Sbde#define IA6_SIN6(ia)	(&((ia)->ia_addr))
41130205Sbde#define IA6_DSTSIN6(ia)	(&((ia)->ia_dstaddr))
41230169Sjkh#define IFA_IN6(x)	(&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr)
41330205Sbde#define IFA_DSTIN6(x)	(&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr)
41417308Speter
41517308Speter#define IFPR_IN6(x)	(&((struct sockaddr_in6 *)((x)->ifpr_prefix))->sin6_addr)
41630205Sbde
41717308Speter#ifdef _KERNEL
4182061Sjkh#define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m)	(	\
41917308Speter	(((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
42017308Speter	(((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \
42117308Speter	(((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \
42217308Speter	(((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 )
42317308Speter#endif
42417308Speter
4253626Swollman#define SIOCSIFADDR_IN6		 _IOW('i', 12, struct in6_ifreq)
4263626Swollman#define SIOCGIFADDR_IN6		_IOWR('i', 33, struct in6_ifreq)
4273626Swollman
4283626Swollman#ifdef _KERNEL
42930205Sbde/*
43030205Sbde * SIOCSxxx ioctls should be unused (see comments in in6.c), but
43130205Sbde * we do not shift numbers for binary compatibility.
43230205Sbde */
43330205Sbde#define SIOCSIFDSTADDR_IN6	 _IOW('i', 14, struct in6_ifreq)
43430205Sbde#define SIOCSIFNETMASK_IN6	 _IOW('i', 22, struct in6_ifreq)
43530205Sbde#endif
43630205Sbde
43730169Sjkh#define SIOCGIFDSTADDR_IN6	_IOWR('i', 34, struct in6_ifreq)
43830205Sbde#define SIOCGIFNETMASK_IN6	_IOWR('i', 37, struct in6_ifreq)
4393626Swollman
4403626Swollman#define SIOCDIFADDR_IN6		 _IOW('i', 25, struct in6_ifreq)
44130205Sbde#define OSIOCAIFADDR_IN6	 _IOW('i', 26, struct oin6_aliasreq)
4423626Swollman#define SIOCAIFADDR_IN6		 _IOW('i', 27, struct in6_aliasreq)
4433626Swollman
44417308Speter#define SIOCSIFPHYADDR_IN6       _IOW('i', 70, struct in6_aliasreq)
44517308Speter#define	SIOCGIFPSRCADDR_IN6	_IOWR('i', 71, struct in6_ifreq)
44617308Speter#define	SIOCGIFPDSTADDR_IN6	_IOWR('i', 72, struct in6_ifreq)
44717308Speter
44817308Speter#define SIOCGIFAFLAG_IN6	_IOWR('i', 73, struct in6_ifreq)
44917308Speter
45017308Speter#ifdef _KERNEL
45117308Speter#define OSIOCGIFINFO_IN6	_IOWR('i', 76, struct in6_ondireq)
45217308Speter#endif
45317308Speter#define SIOCGIFINFO_IN6		_IOWR('i', 108, struct in6_ndireq)
4543626Swollman#define SIOCSIFINFO_IN6		_IOWR('i', 109, struct in6_ndireq)
45517308Speter#define SIOCSNDFLUSH_IN6	_IOWR('i', 77, struct in6_ifreq)
45617308Speter#define SIOCGNBRINFO_IN6	_IOWR('i', 78, struct in6_nbrinfo)
45717308Speter#define SIOCSPFXFLUSH_IN6	_IOWR('i', 79, struct in6_ifreq)
45817308Speter#define SIOCSRTRFLUSH_IN6	_IOWR('i', 80, struct in6_ifreq)
45917308Speter
46017308Speter#define SIOCGIFALIFETIME_IN6	_IOWR('i', 81, struct in6_ifreq)
46117308Speter#define SIOCSIFALIFETIME_IN6	_IOWR('i', 82, struct in6_ifreq)
46217308Speter#define SIOCGIFSTAT_IN6		_IOWR('i', 83, struct in6_ifreq)
46317308Speter#define SIOCGIFSTAT_ICMP6	_IOWR('i', 84, struct in6_ifreq)
46417308Speter
46517308Speter#define SIOCSDEFIFACE_IN6	_IOWR('i', 85, struct in6_ndifreq)
46617308Speter#define SIOCGDEFIFACE_IN6	_IOWR('i', 86, struct in6_ndifreq)
46727910Sasami
46827910Sasami#define SIOCSIFINFO_FLAGS	_IOWR('i', 87, struct in6_ndireq) /* XXX */
46927910Sasami
47027910Sasami#define SIOCSSCOPE6		_IOW('i', 88, struct in6_ifreq)
47134575Sbde#define SIOCGSCOPE6		_IOWR('i', 89, struct in6_ifreq)
47227910Sasami#define SIOCGSCOPE6DEF		_IOWR('i', 90, struct in6_ifreq)
47335479Sbde
47430113Sjkh#define SIOCSIFPREFIX_IN6	_IOW('i', 100, struct in6_prefixreq) /* set */
47530113Sjkh#define SIOCGIFPREFIX_IN6	_IOWR('i', 101, struct in6_prefixreq) /* get */
47635479Sbde#define SIOCDIFPREFIX_IN6	_IOW('i', 102, struct in6_prefixreq) /* del */
47730113Sjkh#define SIOCAIFPREFIX_IN6	_IOW('i', 103, struct in6_rrenumreq) /* add */
47830113Sjkh#define SIOCCIFPREFIX_IN6	_IOW('i', 104, \
47934509Sbde				     struct in6_rrenumreq) /* change */
48035479Sbde#define SIOCSGIFPREFIX_IN6	_IOW('i', 105, \
48130170Sjkh				     struct in6_rrenumreq) /* set global */
48230113Sjkh
48329938Smckay#define SIOCGETSGCNT_IN6	_IOWR('u', 106, \
48434509Sbde				      struct sioc_sg_req6) /* get s,g pkt cnt */
48529938Smckay#define SIOCGETMIFCNT_IN6	_IOWR('u', 107, \
48617308Speter				      struct sioc_mif_req6) /* get pkt cnt per if */
48717308Speter
48817308Speter#define SIOCAADDRCTL_POLICY	_IOW('u', 108, struct in6_addrpolicy)
48917308Speter#define SIOCDADDRCTL_POLICY	_IOW('u', 109, struct in6_addrpolicy)
49017308Speter
49127910Sasami#define IN6_IFF_ANYCAST		0x01	/* anycast address */
49227910Sasami#define IN6_IFF_TENTATIVE	0x02	/* tentative address */
49327910Sasami#define IN6_IFF_DUPLICATED	0x04	/* DAD detected duplicate */
49417308Speter#define IN6_IFF_DETACHED	0x08	/* may be detached from the link */
49517308Speter#define IN6_IFF_DEPRECATED	0x10	/* deprecated address */
49634520Sbde#define IN6_IFF_NODAD		0x20	/* don't perform DAD on this address
49734520Sbde					 * (used only at first SIOC* call)
49835479Sbde					 */
49930113Sjkh#define IN6_IFF_AUTOCONF	0x40	/* autoconfigurable address. */
50030113Sjkh#define IN6_IFF_TEMPORARY	0x80	/* temporary (anonymous) address. */
50134520Sbde#define	IN6_IFF_PREFER_SOURCE	0x0100	/* preferred address for SAS */
50217308Speter
50317308Speter/* do not input/output */
50417308Speter#define IN6_IFF_NOTREADY (IN6_IFF_TENTATIVE|IN6_IFF_DUPLICATED)
50517308Speter
50614119Speter#ifdef _KERNEL
5072061Sjkh#define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b))
5087130Srgrimes#define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b))
5097130Srgrimes#endif
5107130Srgrimes
5112061Sjkh#ifdef _KERNEL
51230113SjkhVNET_DECLARE(struct in6_ifaddrhead, in6_ifaddrhead);
51317308SpeterVNET_DECLARE(struct in6_ifaddrlisthead *, in6_ifaddrhashtbl);
51430169SjkhVNET_DECLARE(u_long, in6_ifaddrhmask);
51530169Sjkh#define	V_in6_ifaddrhead		VNET(in6_ifaddrhead)
5162685Srgrimes#define	V_in6_ifaddrhashtbl		VNET(in6_ifaddrhashtbl)
5176927Snate#define	V_in6_ifaddrhmask		VNET(in6_ifaddrhmask)
51827790Sasami
51927790Sasami#define	IN6ADDR_NHASH_LOG2		8
52027790Sasami#define	IN6ADDR_NHASH			(1 << IN6ADDR_NHASH_LOG2)
52130169Sjkh#define	IN6ADDR_HASHVAL(x)		(in6_addrhash(x))
52230169Sjkh#define	IN6ADDR_HASH(x) \
52330169Sjkh    (&V_in6_ifaddrhashtbl[IN6ADDR_HASHVAL(x) & V_in6_ifaddrhmask])
5243197Scsgr
52530169Sjkhstatic __inline uint32_t
52630169Sjkhin6_addrhash(struct in6_addr *in6)
52730169Sjkh{
52830169Sjkh	uint32_t x;
52930169Sjkh
53030169Sjkh	x = in6->s6_addr32[0] ^ in6->s6_addr32[1] ^ in6->s6_addr32[2] ^
53130169Sjkh	    in6->s6_addr32[3];
53230169Sjkh	return (fnv_32_buf(&x, sizeof(x), FNV1_32_INIT));
53330169Sjkh}
53430169Sjkh
53532427Sjbextern struct rwlock in6_ifaddr_lock;
53632427Sjb#define	IN6_IFADDR_LOCK_ASSERT(	)	rw_assert(&in6_ifaddr_lock, RA_LOCKED)
53732427Sjb#define	IN6_IFADDR_RLOCK()		rw_rlock(&in6_ifaddr_lock)
53826152Speter#define	IN6_IFADDR_RLOCK_ASSERT()	rw_assert(&in6_ifaddr_lock, RA_RLOCKED)
5392061Sjkh#define	IN6_IFADDR_RUNLOCK()		rw_runlock(&in6_ifaddr_lock)
54035452Sandreas#define	IN6_IFADDR_WLOCK()		rw_wlock(&in6_ifaddr_lock)
5412061Sjkh#define	IN6_IFADDR_WLOCK_ASSERT()	rw_assert(&in6_ifaddr_lock, RA_WLOCKED)
54230169Sjkh#define	IN6_IFADDR_WUNLOCK()		rw_wunlock(&in6_ifaddr_lock)
5432061Sjkh
54416786Snate#define in6_ifstat_inc(ifp, tag) \
5452883Sphkdo {								\
54627790Sasami	if (ifp)						\
54717308Speter		counter_u64_add(((struct in6_ifextra *)		\
5487281Srgrimes		    ((ifp)->if_afdata[AF_INET6]))->in6_ifstat[	\
5493242Spaul		    offsetof(struct in6_ifstat, tag) / sizeof(uint64_t)], 1);\
5503242Spaul} while (/*CONSTCOND*/ 0)
55130169Sjkh
5527171Satsextern u_char inet6ctlerrmap[];
5532061SjkhVNET_DECLARE(unsigned long, in6_maxmtu);
5543213Spst#define	V_in6_maxmtu			VNET(in6_maxmtu)
55530169Sjkh#endif /* _KERNEL */
55630169Sjkh
55730169Sjkh/*
55830169Sjkh * IPv6 multicast MLD-layer source entry.
55917308Speter */
5605749Swollmanstruct ip6_msource {
56134520Sbde	RB_ENTRY(ip6_msource)	im6s_link;	/* RB tree links */
56217308Speter	struct in6_addr		im6s_addr;
56317308Speter	struct im6s_st {
56430169Sjkh		uint16_t	ex;		/* # of exclusive members */
56526504Sjhay		uint16_t	in;		/* # of inclusive members */
56630169Sjkh	}			im6s_st[2];	/* state at t0, t1 */
56730169Sjkh	uint8_t			im6s_stp;	/* pending query */
5682061Sjkh};
56917308SpeterRB_HEAD(ip6_msource_tree, ip6_msource);
57017308Speter
57117308Speter/*
57227910Sasami * IPv6 multicast PCB-layer source entry.
57327910Sasami *
5745366Snate * NOTE: overlapping use of struct ip6_msource fields at start.
57527910Sasami */
57627910Sasamistruct in6_msource {
57727910Sasami	RB_ENTRY(ip6_msource)	im6s_link;	/* Common field */
57827910Sasami	struct in6_addr		im6s_addr;	/* Common field */
57927910Sasami	uint8_t			im6sl_st[2];	/* state before/at commit */
58027910Sasami};
58127910Sasami
58227910Sasami#ifdef _KERNEL
58327910Sasami/*
58427910Sasami * IPv6 source tree comparison function.
58527910Sasami *
58627910Sasami * An ordered predicate is necessary; bcmp() is not documented to return
58727910Sasami * an indication of order, memcmp() is, and is an ISO C99 requirement.
58835479Sbde */
58930113Sjkhstatic __inline int
59034623Sbdeip6_msource_cmp(const struct ip6_msource *a, const struct ip6_msource *b)
59134575Sbde{
59227910Sasami
5935366Snate	return (memcmp(&a->im6s_addr, &b->im6s_addr, sizeof(struct in6_addr)));
59417308Speter}
59535427SbdeRB_PROTOTYPE(ip6_msource_tree, ip6_msource, im6s_link, ip6_msource_cmp);
59617308Speter#endif /* _KERNEL */
59735427Sbde
59835427Sbde/*
59935427Sbde * IPv6 multicast PCB-layer group filter descriptor.
60035427Sbde */
60135427Sbdestruct in6_mfilter {
60235427Sbde	struct ip6_msource_tree	im6f_sources; /* source list for (S,G) */
60335427Sbde	u_long			im6f_nsrc;    /* # of source entries */
60435427Sbde	uint8_t			im6f_st[2];   /* state before/at commit */
60535427Sbde};
60635427Sbde
60735427Sbde/*
60835427Sbde * Legacy KAME IPv6 multicast membership descriptor.
60935427Sbde */
61035427Sbdestruct in6_multi_mship {
61135427Sbde	struct	in6_multi *i6mm_maddr;
61234541Sbde	LIST_ENTRY(in6_multi_mship) i6mm_chain;
61335427Sbde};
61424754Sjdp
61534541Sbde/*
61635427Sbde * IPv6 group descriptor.
61735427Sbde *
61835427Sbde * For every entry on an ifnet's if_multiaddrs list which represents
61935427Sbde * an IP multicast group, there is one of these structures.
62035427Sbde *
62134541Sbde * If any source filters are present, then a node will exist in the RB-tree
62235427Sbde * to permit fast lookup by source whenever an operation takes place.
62334541Sbde * This permits pre-order traversal when we issue reports.
62435427Sbde * Source filter trees are kept separately from the socket layer to
6258295Srgrimes * greatly simplify locking.
62634541Sbde *
62734541Sbde * When MLDv2 is active, in6m_timer is the response to group query timer.
62835427Sbde * The state-change timer in6m_sctimer is separate; whenever state changes
62935427Sbde * for the group the state change record is generated and transmitted,
63034541Sbde * and kept if retransmissions are necessary.
63135427Sbde *
63235427Sbde * FUTURE: in6m_link is now only used when groups are being purged
63335427Sbde * on a detaching ifnet. It could be demoted to a SLIST_ENTRY, but
63435427Sbde * because it is at the very start of the struct, we can't do this
63535427Sbde * w/o breaking the ABI for ifmcstat.
63634541Sbde */
63735427Sbdestruct in6_multi {
63835427Sbde	LIST_ENTRY(in6_multi) in6m_entry; /* list glue */
63935427Sbde	struct	in6_addr in6m_addr;	/* IPv6 multicast address */
64035427Sbde	struct	ifnet *in6m_ifp;	/* back pointer to ifnet */
64134541Sbde	struct	ifmultiaddr *in6m_ifma;	/* back pointer to ifmultiaddr */
64235427Sbde	u_int	in6m_refcount;		/* reference count */
64335427Sbde	u_int	in6m_state;		/* state of the membership */
64435427Sbde	u_int	in6m_timer;		/* MLD6 listener report timer */
64535427Sbde
64634541Sbde	/* New fields for MLDv2 follow. */
64734541Sbde	struct mld_ifinfo	*in6m_mli;	/* MLD info */
64835479Sbde	SLIST_ENTRY(in6_multi)	 in6m_nrele;	/* to-be-released by MLD */
64930113Sjkh	struct ip6_msource_tree	 in6m_srcs;	/* tree of sources */
65030113Sjkh	u_long			 in6m_nsrc;	/* # of tree entries */
6518489Srgrimes
65234541Sbde	struct ifqueue		 in6m_scq;	/* queue of pending
65335427Sbde						 * state-change packets */
65435427Sbde	struct timeval		 in6m_lastgsrtv;	/* last G-S-R query */
65535427Sbde	uint16_t		 in6m_sctimer;	/* state-change timer */
65635427Sbde	uint16_t		 in6m_scrv;	/* state-change rexmit count */
65735427Sbde
65835427Sbde	/*
65935427Sbde	 * SSM state counters which track state at T0 (the time the last
66035427Sbde	 * state-change report's RV timer went to zero) and T1
66135427Sbde	 * (time of pending report, i.e. now).
66235427Sbde	 * Used for computing MLDv2 state-change reports. Several refcounts
66335427Sbde	 * are maintained here to optimize for common use-cases.
66435427Sbde	 */
66535427Sbde	struct in6m_st {
66635427Sbde		uint16_t	iss_fmode;	/* MLD filter mode */
66735427Sbde		uint16_t	iss_asm;	/* # of ASM listeners */
66835427Sbde		uint16_t	iss_ex;		/* # of exclusive members */
66934541Sbde		uint16_t	iss_in;		/* # of inclusive members */
67035427Sbde		uint16_t	iss_rec;	/* # of recorded sources */
6712160Scsgr	}			in6m_st[2];	/* state at t0, t1 */
67234541Sbde};
67334541Sbde
67435427Sbde/*
6752626Scsgr * Helper function to derive the filter mode on a source entry
6762061Sjkh * from its internal counters. Predicates are:
67717308Speter *  A source is only excluded if all listeners exclude it.
67817308Speter *  A source is only included if no listeners exclude it,
67917308Speter *  and at least one listener includes it.
68027910Sasami * May be used by ifmcstat(8).
68127910Sasami */
68227910Sasamistatic __inline uint8_t
68327910Sasamiim6s_get_mode(const struct in6_multi *inm, const struct ip6_msource *ims,
68427910Sasami    uint8_t t)
68527910Sasami{
68617308Speter
68711806Sphk	t = !!t;
68819175Sbde	if (inm->in6m_st[t].iss_ex > 0 &&
68927910Sasami	    inm->in6m_st[t].iss_ex == ims->im6s_st[t].ex)
69027910Sasami		return (MCAST_EXCLUDE);
69127910Sasami	else if (ims->im6s_st[t].in > 0 && ims->im6s_st[t].ex == 0)
69227910Sasami		return (MCAST_INCLUDE);
69327910Sasami	return (MCAST_UNDEFINED);
69427910Sasami}
69527910Sasami
69627910Sasami#ifdef _KERNEL
69727910Sasami
69827910Sasami/*
69927910Sasami * Lock macros for IPv6 layer multicast address lists.  IPv6 lock goes
70027910Sasami * before link layer multicast locks in the lock order.  In most cases,
70127910Sasami * consumers of IN_*_MULTI() macros should acquire the locks before
70227910Sasami * calling them; users of the in_{add,del}multi() functions should not.
70327910Sasami */
70427910Sasamiextern struct mtx in6_multi_mtx;
70527910Sasami#define	IN6_MULTI_LOCK()		mtx_lock(&in6_multi_mtx)
70627910Sasami#define	IN6_MULTI_UNLOCK()		mtx_unlock(&in6_multi_mtx)
70727910Sasami#define	IN6_MULTI_LOCK_ASSERT()		mtx_assert(&in6_multi_mtx, MA_OWNED)
70827910Sasami#define	IN6_MULTI_UNLOCK_ASSERT()	mtx_assert(&in6_multi_mtx, MA_NOTOWNED)
70927910Sasami
71027910Sasami/*
71134509Sbde * Look up an in6_multi record for an IPv6 multicast address
71221673Sjkh * on the interface ifp.
71327910Sasami * If no record found, return NULL.
71427910Sasami *
71527910Sasami * SMPng: The IN6_MULTI_LOCK and IF_ADDR_LOCK on ifp must be held.
71627910Sasami */
71727910Sasamistatic __inline struct in6_multi *
71827910Sasamiin6m_lookup_locked(struct ifnet *ifp, const struct in6_addr *mcaddr)
71927910Sasami{
72027910Sasami	struct ifmultiaddr *ifma;
72127910Sasami	struct in6_multi *inm;
72227910Sasami
72327910Sasami	IN6_MULTI_LOCK_ASSERT();
72427910Sasami	IF_ADDR_LOCK_ASSERT(ifp);
72527910Sasami
72627910Sasami	inm = NULL;
72727910Sasami	TAILQ_FOREACH(ifma, &((ifp)->if_multiaddrs), ifma_link) {
72827910Sasami		if (ifma->ifma_addr->sa_family == AF_INET6) {
72927910Sasami			inm = (struct in6_multi *)ifma->ifma_protospec;
73027910Sasami			if (IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, mcaddr))
73119175Sbde				break;
73227910Sasami			inm = NULL;
73327910Sasami		}
73427910Sasami	}
73527910Sasami	return (inm);
73627910Sasami}
73727910Sasami
73827910Sasami/*
73927910Sasami * Wrapper for in6m_lookup_locked().
74034688Sbde *
74127910Sasami * SMPng: Assumes that neithr the IN6_MULTI_LOCK() or IF_ADDR_LOCK() are held.
74227910Sasami */
74327910Sasamistatic __inline struct in6_multi *
74427910Sasamiin6m_lookup(struct ifnet *ifp, const struct in6_addr *mcaddr)
74535479Sbde{
74630113Sjkh	struct in6_multi *inm;
74730113Sjkh
74819175Sbde	IN6_MULTI_LOCK();
7492061Sjkh	IF_ADDR_RLOCK(ifp);
75035479Sbde	inm = in6m_lookup_locked(ifp, mcaddr);
75130113Sjkh	IF_ADDR_RUNLOCK(ifp);
75230113Sjkh	IN6_MULTI_UNLOCK();
75335294Sdt
75430113Sjkh	return (inm);
75530113Sjkh}
75630113Sjkh
75730113Sjkh/* Acquire an in6_multi record. */
75830113Sjkhstatic __inline void
75930113Sjkhin6m_acquire_locked(struct in6_multi *inm)
76030113Sjkh{
76130113Sjkh
76230113Sjkh	IN6_MULTI_LOCK_ASSERT();
76330113Sjkh	++inm->in6m_refcount;
76430113Sjkh}
76530113Sjkh
76630113Sjkhstruct ip6_moptions;
76732427Sjbstruct sockopt;
76832427Sjb
7691594Srgrimes/* Multicast KPIs. */
770int	im6o_mc_filter(const struct ip6_moptions *, const struct ifnet *,
771	    const struct sockaddr *, const struct sockaddr *);
772int	in6_mc_join(struct ifnet *, const struct in6_addr *,
773	    struct in6_mfilter *, struct in6_multi **, int);
774int	in6_mc_join_locked(struct ifnet *, const struct in6_addr *,
775	    struct in6_mfilter *, struct in6_multi **, int);
776int	in6_mc_leave(struct in6_multi *, struct in6_mfilter *);
777int	in6_mc_leave_locked(struct in6_multi *, struct in6_mfilter *);
778void	in6m_clear_recorded(struct in6_multi *);
779void	in6m_commit(struct in6_multi *);
780void	in6m_print(const struct in6_multi *);
781int	in6m_record_source(struct in6_multi *, const struct in6_addr *);
782void	in6m_release_locked(struct in6_multi *);
783void	ip6_freemoptions(struct ip6_moptions *);
784int	ip6_getmoptions(struct inpcb *, struct sockopt *);
785int	ip6_setmoptions(struct inpcb *, struct sockopt *);
786
787/* Legacy KAME multicast KPIs. */
788struct in6_multi_mship *
789	in6_joingroup(struct ifnet *, struct in6_addr *, int *, int);
790int	in6_leavegroup(struct in6_multi_mship *);
791
792/* flags to in6_update_ifa */
793#define IN6_IFAUPDATE_DADDELAY	0x1 /* first time to configure an address */
794
795int	in6_mask2len(struct in6_addr *, u_char *);
796int	in6_control(struct socket *, u_long, caddr_t, struct ifnet *,
797	struct thread *);
798int	in6_update_ifa(struct ifnet *, struct in6_aliasreq *,
799	struct in6_ifaddr *, int);
800void	in6_purgeaddr(struct ifaddr *);
801int	in6if_do_dad(struct ifnet *);
802void	in6_purgeif(struct ifnet *);
803void	in6_savemkludge(struct in6_ifaddr *);
804void	*in6_domifattach(struct ifnet *);
805void	in6_domifdetach(struct ifnet *, void *);
806void	in6_setmaxmtu(void);
807int	in6_if2idlen(struct ifnet *);
808struct in6_ifaddr *in6ifa_ifpforlinklocal(struct ifnet *, int);
809struct in6_ifaddr *in6ifa_ifpwithaddr(struct ifnet *, struct in6_addr *);
810struct in6_ifaddr *in6ifa_llaonifp(struct ifnet *);
811char	*ip6_sprintf(char *, const struct in6_addr *);
812int	in6_addr2zoneid(struct ifnet *, struct in6_addr *, u_int32_t *);
813int	in6_matchlen(struct in6_addr *, struct in6_addr *);
814int	in6_are_prefix_equal(struct in6_addr *, struct in6_addr *, int);
815void	in6_prefixlen2mask(struct in6_addr *, int);
816int	in6_prefix_ioctl(struct socket *, u_long, caddr_t,
817	struct ifnet *);
818int	in6_prefix_add_ifid(int, struct in6_ifaddr *);
819void	in6_prefix_remove_ifid(int, struct in6_ifaddr *);
820void	in6_purgeprefix(struct ifnet *);
821void	in6_ifremloop(struct ifaddr *);
822void	in6_ifaddloop(struct ifaddr *);
823
824int	in6_is_addr_deprecated(struct sockaddr_in6 *);
825int	in6_src_ioctl(u_long, caddr_t);
826
827/*
828 * Extended API for IPv6 FIB support.
829 */
830void	in6_rtredirect(struct sockaddr *, struct sockaddr *, struct sockaddr *,
831	    int, struct sockaddr *, u_int);
832int	in6_rtrequest(int, struct sockaddr *, struct sockaddr *,
833	    struct sockaddr *, int, struct rtentry **, u_int);
834void	in6_rtalloc(struct route_in6 *, u_int);
835void	in6_rtalloc_ign(struct route_in6 *, u_long, u_int);
836struct rtentry *in6_rtalloc1(struct sockaddr *, int, u_long, u_int);
837#endif /* _KERNEL */
838
839#endif /* _NETINET6_IN6_VAR_H_ */
840