1139826Simp/*- 252904Sshin * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 352904Sshin * All rights reserved. 453541Sshin * 552904Sshin * Redistribution and use in source and binary forms, with or without 652904Sshin * modification, are permitted provided that the following conditions 752904Sshin * are met: 852904Sshin * 1. Redistributions of source code must retain the above copyright 952904Sshin * notice, this list of conditions and the following disclaimer. 1052904Sshin * 2. Redistributions in binary form must reproduce the above copyright 1152904Sshin * notice, this list of conditions and the following disclaimer in the 1252904Sshin * documentation and/or other materials provided with the distribution. 1352904Sshin * 3. Neither the name of the project nor the names of its contributors 1452904Sshin * may be used to endorse or promote products derived from this software 1552904Sshin * without specific prior written permission. 1653541Sshin * 1752904Sshin * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 1852904Sshin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1952904Sshin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2052904Sshin * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 2152904Sshin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2252904Sshin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2352904Sshin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2452904Sshin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2552904Sshin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2652904Sshin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2752904Sshin * SUCH DAMAGE. 28174510Sobrien * 29174510Sobrien * $KAME: in6_var.h,v 1.56 2001/03/29 05:34:31 itojun Exp $ 3052904Sshin */ 3152904Sshin 32139826Simp/*- 3352904Sshin * Copyright (c) 1985, 1986, 1993 3452904Sshin * The Regents of the University of California. All rights reserved. 3552904Sshin * 3652904Sshin * Redistribution and use in source and binary forms, with or without 3752904Sshin * modification, are permitted provided that the following conditions 3852904Sshin * are met: 3952904Sshin * 1. Redistributions of source code must retain the above copyright 4052904Sshin * notice, this list of conditions and the following disclaimer. 4152904Sshin * 2. Redistributions in binary form must reproduce the above copyright 4252904Sshin * notice, this list of conditions and the following disclaimer in the 4352904Sshin * documentation and/or other materials provided with the distribution. 4452904Sshin * 4. Neither the name of the University nor the names of its contributors 4552904Sshin * may be used to endorse or promote products derived from this software 4652904Sshin * without specific prior written permission. 4752904Sshin * 4852904Sshin * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 4952904Sshin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 5052904Sshin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 5152904Sshin * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 5252904Sshin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 5352904Sshin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 5452904Sshin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 5552904Sshin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 5652904Sshin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 5752904Sshin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5852904Sshin * SUCH DAMAGE. 5952904Sshin * 6052904Sshin * @(#)in_var.h 8.1 (Berkeley) 6/10/93 61174510Sobrien * $FreeBSD$ 6252904Sshin */ 6352904Sshin 6462587Sitojun#ifndef _NETINET6_IN6_VAR_H_ 6562587Sitojun#define _NETINET6_IN6_VAR_H_ 6652904Sshin 67191672Sbms#include <sys/tree.h> 68191672Sbms 69191672Sbms#ifdef _KERNEL 70244272Sae#include <sys/fnv_hash.h> 71191672Sbms#include <sys/libkern.h> 72191672Sbms#endif 73191672Sbms 7452904Sshin/* 7552904Sshin * Interface address, Internet version. One of these structures 7652904Sshin * is allocated for each interface with an Internet address. 7752904Sshin * The ifaddr structure contains the protocol-independent part 7852904Sshin * of the structure and is assumed to be first. 7952904Sshin */ 8052904Sshin 8152904Sshin/* 8252904Sshin * pltime/vltime are just for future reference (required to implements 2 8352904Sshin * hour rule for hosts). they should never be modified by nd6_timeout or 8452904Sshin * anywhere else. 8552904Sshin * userland -> kernel: accept pltime/vltime 8695023Ssuz * kernel -> userland: throw up everything 8752904Sshin * in kernel: modify preferred/expire only 8852904Sshin */ 8952904Sshinstruct in6_addrlifetime { 9062587Sitojun time_t ia6t_expire; /* valid lifetime expiration time */ 9162587Sitojun time_t ia6t_preferred; /* preferred lifetime expiration time */ 9262587Sitojun u_int32_t ia6t_vltime; /* valid lifetime */ 9362587Sitojun u_int32_t ia6t_pltime; /* prefix lifetime */ 9452904Sshin}; 9552904Sshin 96121161Sumestruct nd_ifinfo; 97121161Sumestruct scope6_id; 98186119Sqinglistruct lltable; 99191672Sbmsstruct mld_ifinfo; 100191672Sbms 101253086Sae#ifdef _KERNEL 102253086Sae#include <sys/counter.h> 103253086Sae 104121161Sumestruct in6_ifextra { 105253086Sae counter_u64_t *in6_ifstat; 106253086Sae counter_u64_t *icmp6_ifstat; 107121161Sume struct nd_ifinfo *nd_ifinfo; 108121161Sume struct scope6_id *scope6_id; 109186119Sqingli struct lltable *lltable; 110191672Sbms struct mld_ifinfo *mld_ifinfo; 111121161Sume}; 112253086Sae#else 113121161Sume 114253086Saestruct in6_ifextra { 115253086Sae void *in6_ifstat; 116253086Sae void *icmp6_ifstat; 117253086Sae struct nd_ifinfo *nd_ifinfo; 118253086Sae struct scope6_id *scope6_id; 119253086Sae struct lltable *lltable; 120253086Sae struct mld_ifinfo *mld_ifinfo; 121253086Sae}; 122253086Sae#endif /* !_KERNEL */ 123253086Sae 124186119Sqingli#define LLTABLE6(ifp) (((struct in6_ifextra *)(ifp)->if_afdata[AF_INET6])->lltable) 125186119Sqingli 12652904Sshinstruct in6_ifaddr { 12752904Sshin struct ifaddr ia_ifa; /* protocol-independent info */ 12852904Sshin#define ia_ifp ia_ifa.ifa_ifp 12962587Sitojun#define ia_flags ia_ifa.ifa_flags 13052904Sshin struct sockaddr_in6 ia_addr; /* interface address */ 13152904Sshin struct sockaddr_in6 ia_net; /* network number of interface */ 13252904Sshin struct sockaddr_in6 ia_dstaddr; /* space for destination addr */ 13352904Sshin struct sockaddr_in6 ia_prefixmask; /* prefix mask */ 13462587Sitojun u_int32_t ia_plen; /* prefix length */ 135194907Srwatson TAILQ_ENTRY(in6_ifaddr) ia_link; /* list of IPv6 addresses */ 13652904Sshin int ia6_flags; 13752904Sshin 13878064Sume struct in6_addrlifetime ia6_lifetime; 139151539Ssuz time_t ia6_createtime; /* the creation time of this address, which is 140151539Ssuz * currently used for temporary addresses only. 141151539Ssuz */ 142151539Ssuz time_t ia6_updatetime; 14378064Sume 144120913Sume /* back pointer to the ND prefix (for autoconfigured addresses only) */ 145120913Sume struct nd_prefix *ia6_ndpr; 146170202Sjinmei 147170202Sjinmei /* multicast addresses joined from the kernel */ 148170202Sjinmei LIST_HEAD(, in6_multi_mship) ia6_memberships; 149244272Sae /* entry in bucket of inet6 addresses */ 150244272Sae LIST_ENTRY(in6_ifaddr) ia6_hash; 15152904Sshin}; 15252904Sshin 153194907Srwatson/* List of in6_ifaddr's. */ 154194907SrwatsonTAILQ_HEAD(in6_ifaddrhead, in6_ifaddr); 155244272SaeLIST_HEAD(in6_ifaddrlisthead, in6_ifaddr); 156194907Srwatson 157121742Sume/* control structure to manage address selection policy */ 158121742Sumestruct in6_addrpolicy { 159121742Sume struct sockaddr_in6 addr; /* prefix address */ 160121742Sume struct sockaddr_in6 addrmask; /* prefix mask */ 161121742Sume int preced; /* precedence */ 162121742Sume int label; /* matching label */ 163121742Sume u_quad_t use; /* statistics */ 164121742Sume}; 165121742Sume 16652904Sshin/* 16752904Sshin * IPv6 interface statistics, as defined in RFC2465 Ipv6IfStatsEntry (p12). 16852904Sshin */ 16952904Sshinstruct in6_ifstat { 170253081Sae uint64_t ifs6_in_receive; /* # of total input datagram */ 171253081Sae uint64_t ifs6_in_hdrerr; /* # of datagrams with invalid hdr */ 172253081Sae uint64_t ifs6_in_toobig; /* # of datagrams exceeded MTU */ 173253081Sae uint64_t ifs6_in_noroute; /* # of datagrams with no route */ 174253081Sae uint64_t ifs6_in_addrerr; /* # of datagrams with invalid dst */ 175253081Sae uint64_t ifs6_in_protounknown; /* # of datagrams with unknown proto */ 17652904Sshin /* NOTE: increment on final dst if */ 177253081Sae uint64_t ifs6_in_truncated; /* # of truncated datagrams */ 178253081Sae uint64_t ifs6_in_discard; /* # of discarded datagrams */ 17952904Sshin /* NOTE: fragment timeout is not here */ 180253081Sae uint64_t ifs6_in_deliver; /* # of datagrams delivered to ULP */ 18152904Sshin /* NOTE: increment on final dst if */ 182253081Sae uint64_t ifs6_out_forward; /* # of datagrams forwarded */ 18352904Sshin /* NOTE: increment on outgoing if */ 184253081Sae uint64_t ifs6_out_request; /* # of outgoing datagrams from ULP */ 18552904Sshin /* NOTE: does not include forwrads */ 186253081Sae uint64_t ifs6_out_discard; /* # of discarded datagrams */ 187253081Sae uint64_t ifs6_out_fragok; /* # of datagrams fragmented */ 188253081Sae uint64_t ifs6_out_fragfail; /* # of datagrams failed on fragment */ 189253081Sae uint64_t ifs6_out_fragcreat; /* # of fragment datagrams */ 19052904Sshin /* NOTE: this is # after fragment */ 191253081Sae uint64_t ifs6_reass_reqd; /* # of incoming fragmented packets */ 19252904Sshin /* NOTE: increment on final dst if */ 193253081Sae uint64_t ifs6_reass_ok; /* # of reassembled packets */ 19452904Sshin /* NOTE: this is # after reass */ 19552904Sshin /* NOTE: increment on final dst if */ 196253081Sae uint64_t ifs6_reass_fail; /* # of reass failures */ 19752904Sshin /* NOTE: may not be packet count */ 19852904Sshin /* NOTE: increment on final dst if */ 199253081Sae uint64_t ifs6_in_mcast; /* # of inbound multicast datagrams */ 200253081Sae uint64_t ifs6_out_mcast; /* # of outbound multicast datagrams */ 20152904Sshin}; 20252904Sshin 20352904Sshin/* 20452904Sshin * ICMPv6 interface statistics, as defined in RFC2466 Ipv6IfIcmpEntry. 20552904Sshin * XXX: I'm not sure if this file is the right place for this structure... 20652904Sshin */ 20752904Sshinstruct icmp6_ifstat { 20852904Sshin /* 20952904Sshin * Input statistics 21052904Sshin */ 21152904Sshin /* ipv6IfIcmpInMsgs, total # of input messages */ 212253081Sae uint64_t ifs6_in_msg; 21352904Sshin /* ipv6IfIcmpInErrors, # of input error messages */ 214253081Sae uint64_t ifs6_in_error; 21552904Sshin /* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */ 216253081Sae uint64_t ifs6_in_dstunreach; 21752904Sshin /* ipv6IfIcmpInAdminProhibs, # of input administratively prohibited errs */ 218253081Sae uint64_t ifs6_in_adminprohib; 21952904Sshin /* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */ 220253081Sae uint64_t ifs6_in_timeexceed; 22152904Sshin /* ipv6IfIcmpInParmProblems, # of input parameter problem errors */ 222253081Sae uint64_t ifs6_in_paramprob; 22352904Sshin /* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */ 224253081Sae uint64_t ifs6_in_pkttoobig; 22552904Sshin /* ipv6IfIcmpInEchos, # of input echo requests */ 226253081Sae uint64_t ifs6_in_echo; 22752904Sshin /* ipv6IfIcmpInEchoReplies, # of input echo replies */ 228253081Sae uint64_t ifs6_in_echoreply; 22952904Sshin /* ipv6IfIcmpInRouterSolicits, # of input router solicitations */ 230253081Sae uint64_t ifs6_in_routersolicit; 23152904Sshin /* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */ 232253081Sae uint64_t ifs6_in_routeradvert; 23352904Sshin /* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */ 234253081Sae uint64_t ifs6_in_neighborsolicit; 23552904Sshin /* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advertisements */ 236253081Sae uint64_t ifs6_in_neighboradvert; 23752904Sshin /* ipv6IfIcmpInRedirects, # of input redirects */ 238253081Sae uint64_t ifs6_in_redirect; 23952904Sshin /* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */ 240253081Sae uint64_t ifs6_in_mldquery; 24152904Sshin /* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */ 242253081Sae uint64_t ifs6_in_mldreport; 24352904Sshin /* ipv6IfIcmpInGroupMembReductions, # of input MLD done */ 244253081Sae uint64_t ifs6_in_mlddone; 24552904Sshin 24652904Sshin /* 24753541Sshin * Output statistics. We should solve unresolved routing problem... 24852904Sshin */ 24952904Sshin /* ipv6IfIcmpOutMsgs, total # of output messages */ 250253081Sae uint64_t ifs6_out_msg; 25152904Sshin /* ipv6IfIcmpOutErrors, # of output error messages */ 252253081Sae uint64_t ifs6_out_error; 25352904Sshin /* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */ 254253081Sae uint64_t ifs6_out_dstunreach; 25552904Sshin /* ipv6IfIcmpOutAdminProhibs, # of output administratively prohibited errs */ 256253081Sae uint64_t ifs6_out_adminprohib; 25752904Sshin /* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */ 258253081Sae uint64_t ifs6_out_timeexceed; 25952904Sshin /* ipv6IfIcmpOutParmProblems, # of output parameter problem errors */ 260253081Sae uint64_t ifs6_out_paramprob; 26152904Sshin /* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */ 262253081Sae uint64_t ifs6_out_pkttoobig; 26352904Sshin /* ipv6IfIcmpOutEchos, # of output echo requests */ 264253081Sae uint64_t ifs6_out_echo; 26552904Sshin /* ipv6IfIcmpOutEchoReplies, # of output echo replies */ 266253081Sae uint64_t ifs6_out_echoreply; 26752904Sshin /* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */ 268253081Sae uint64_t ifs6_out_routersolicit; 26952904Sshin /* ipv6IfIcmpOutRouterAdvertisements, # of output router advertisements */ 270253081Sae uint64_t ifs6_out_routeradvert; 27152904Sshin /* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */ 272253081Sae uint64_t ifs6_out_neighborsolicit; 27352904Sshin /* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advertisements */ 274253081Sae uint64_t ifs6_out_neighboradvert; 27552904Sshin /* ipv6IfIcmpOutRedirects, # of output redirects */ 276253081Sae uint64_t ifs6_out_redirect; 27752904Sshin /* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */ 278253081Sae uint64_t ifs6_out_mldquery; 27952904Sshin /* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */ 280253081Sae uint64_t ifs6_out_mldreport; 28152904Sshin /* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */ 282253081Sae uint64_t ifs6_out_mlddone; 28352904Sshin}; 28452904Sshin 28552904Sshinstruct in6_ifreq { 28652904Sshin char ifr_name[IFNAMSIZ]; 28752904Sshin union { 28852904Sshin struct sockaddr_in6 ifru_addr; 28952904Sshin struct sockaddr_in6 ifru_dstaddr; 290102052Ssobomax int ifru_flags; 29152904Sshin int ifru_flags6; 29252904Sshin int ifru_metric; 29352904Sshin caddr_t ifru_data; 29462587Sitojun struct in6_addrlifetime ifru_lifetime; 29562587Sitojun struct in6_ifstat ifru_stat; 29662587Sitojun struct icmp6_ifstat ifru_icmp6stat; 29762587Sitojun u_int32_t ifru_scope_id[16]; 29852904Sshin } ifr_ifru; 29952904Sshin}; 30052904Sshin 30152904Sshinstruct in6_aliasreq { 30252904Sshin char ifra_name[IFNAMSIZ]; 30352904Sshin struct sockaddr_in6 ifra_addr; 30452904Sshin struct sockaddr_in6 ifra_dstaddr; 30552904Sshin struct sockaddr_in6 ifra_prefixmask; 30652904Sshin int ifra_flags; 30762587Sitojun struct in6_addrlifetime ifra_lifetime; 308228571Sglebius int ifra_vhid; 30952904Sshin}; 31052904Sshin 311228768Sglebius/* pre-10.x compat */ 312228768Sglebiusstruct oin6_aliasreq { 313228768Sglebius char ifra_name[IFNAMSIZ]; 314228768Sglebius struct sockaddr_in6 ifra_addr; 315228768Sglebius struct sockaddr_in6 ifra_dstaddr; 316228768Sglebius struct sockaddr_in6 ifra_prefixmask; 317228768Sglebius int ifra_flags; 318228768Sglebius struct in6_addrlifetime ifra_lifetime; 319228768Sglebius}; 320228768Sglebius 32152904Sshin/* prefix type macro */ 32262587Sitojun#define IN6_PREFIX_ND 1 32362587Sitojun#define IN6_PREFIX_RR 2 32452904Sshin 32552904Sshin/* 32652904Sshin * prefix related flags passed between kernel(NDP related part) and 32752904Sshin * user land command(ifconfig) and daemon(rtadvd). 32852904Sshin */ 32952904Sshinstruct in6_prflags { 33052904Sshin struct prf_ra { 33162587Sitojun u_char onlink : 1; 33262587Sitojun u_char autonomous : 1; 33362587Sitojun u_char reserved : 6; 33452904Sshin } prf_ra; 33562587Sitojun u_char prf_reserved1; 33662587Sitojun u_short prf_reserved2; 33752904Sshin /* want to put this on 4byte offset */ 33852904Sshin struct prf_rr { 33962587Sitojun u_char decrvalid : 1; 34062587Sitojun u_char decrprefd : 1; 34162587Sitojun u_char reserved : 6; 34252904Sshin } prf_rr; 34362587Sitojun u_char prf_reserved3; 34462587Sitojun u_short prf_reserved4; 34552904Sshin}; 34652904Sshin 34752904Sshinstruct in6_prefixreq { 34852904Sshin char ipr_name[IFNAMSIZ]; 34952904Sshin u_char ipr_origin; 35052904Sshin u_char ipr_plen; 35162587Sitojun u_int32_t ipr_vltime; 35262587Sitojun u_int32_t ipr_pltime; 35362587Sitojun struct in6_prflags ipr_flags; 35452904Sshin struct sockaddr_in6 ipr_prefix; 35552904Sshin}; 35652904Sshin 35762587Sitojun#define PR_ORIG_RA 0 35862587Sitojun#define PR_ORIG_RR 1 35962587Sitojun#define PR_ORIG_STATIC 2 36062587Sitojun#define PR_ORIG_KERNEL 3 36152904Sshin 36262587Sitojun#define ipr_raf_onlink ipr_flags.prf_ra.onlink 36362587Sitojun#define ipr_raf_auto ipr_flags.prf_ra.autonomous 36452904Sshin 36562587Sitojun#define ipr_statef_onlink ipr_flags.prf_state.onlink 36652904Sshin 36762587Sitojun#define ipr_rrf_decrvalid ipr_flags.prf_rr.decrvalid 36862587Sitojun#define ipr_rrf_decrprefd ipr_flags.prf_rr.decrprefd 36952904Sshin 37052904Sshinstruct in6_rrenumreq { 37152904Sshin char irr_name[IFNAMSIZ]; 37252904Sshin u_char irr_origin; 37352904Sshin u_char irr_m_len; /* match len for matchprefix */ 37452904Sshin u_char irr_m_minlen; /* minlen for matching prefix */ 37552904Sshin u_char irr_m_maxlen; /* maxlen for matching prefix */ 37652904Sshin u_char irr_u_uselen; /* uselen for adding prefix */ 37752904Sshin u_char irr_u_keeplen; /* keeplen from matching prefix */ 37862587Sitojun struct irr_raflagmask { 37962587Sitojun u_char onlink : 1; 38062587Sitojun u_char autonomous : 1; 38162587Sitojun u_char reserved : 6; 38252904Sshin } irr_raflagmask; 38362587Sitojun u_int32_t irr_vltime; 38462587Sitojun u_int32_t irr_pltime; 38562587Sitojun struct in6_prflags irr_flags; 38652904Sshin struct sockaddr_in6 irr_matchprefix; 38752904Sshin struct sockaddr_in6 irr_useprefix; 38852904Sshin}; 38952904Sshin 39062587Sitojun#define irr_raf_mask_onlink irr_raflagmask.onlink 39162587Sitojun#define irr_raf_mask_auto irr_raflagmask.autonomous 39262587Sitojun#define irr_raf_mask_reserved irr_raflagmask.reserved 39352904Sshin 39462587Sitojun#define irr_raf_onlink irr_flags.prf_ra.onlink 39562587Sitojun#define irr_raf_auto irr_flags.prf_ra.autonomous 39652904Sshin 39762587Sitojun#define irr_statef_onlink irr_flags.prf_state.onlink 39852904Sshin 39962587Sitojun#define irr_rrf irr_flags.prf_rr 40062587Sitojun#define irr_rrf_decrvalid irr_flags.prf_rr.decrvalid 40162587Sitojun#define irr_rrf_decrprefd irr_flags.prf_rr.decrprefd 40252904Sshin 40352904Sshin/* 40452904Sshin * Given a pointer to an in6_ifaddr (ifaddr), 40552904Sshin * return a pointer to the addr as a sockaddr_in6 40652904Sshin */ 40762587Sitojun#define IA6_IN6(ia) (&((ia)->ia_addr.sin6_addr)) 40862587Sitojun#define IA6_DSTIN6(ia) (&((ia)->ia_dstaddr.sin6_addr)) 40962587Sitojun#define IA6_MASKIN6(ia) (&((ia)->ia_prefixmask.sin6_addr)) 41062587Sitojun#define IA6_SIN6(ia) (&((ia)->ia_addr)) 41162587Sitojun#define IA6_DSTSIN6(ia) (&((ia)->ia_dstaddr)) 41262587Sitojun#define IFA_IN6(x) (&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr) 41362587Sitojun#define IFA_DSTIN6(x) (&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr) 41452904Sshin 41562587Sitojun#define IFPR_IN6(x) (&((struct sockaddr_in6 *)((x)->ifpr_prefix))->sin6_addr) 41652904Sshin 41752904Sshin#ifdef _KERNEL 41862587Sitojun#define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \ 41952904Sshin (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \ 42052904Sshin (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \ 42152904Sshin (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \ 42252904Sshin (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 ) 42352904Sshin#endif 42452904Sshin 42562587Sitojun#define SIOCSIFADDR_IN6 _IOW('i', 12, struct in6_ifreq) 42662587Sitojun#define SIOCGIFADDR_IN6 _IOWR('i', 33, struct in6_ifreq) 42752904Sshin 42862587Sitojun#ifdef _KERNEL 42962587Sitojun/* 43062587Sitojun * SIOCSxxx ioctls should be unused (see comments in in6.c), but 43162587Sitojun * we do not shift numbers for binary compatibility. 43262587Sitojun */ 43362587Sitojun#define SIOCSIFDSTADDR_IN6 _IOW('i', 14, struct in6_ifreq) 43462587Sitojun#define SIOCSIFNETMASK_IN6 _IOW('i', 22, struct in6_ifreq) 43562587Sitojun#endif 43652904Sshin 43762587Sitojun#define SIOCGIFDSTADDR_IN6 _IOWR('i', 34, struct in6_ifreq) 43862587Sitojun#define SIOCGIFNETMASK_IN6 _IOWR('i', 37, struct in6_ifreq) 43962587Sitojun 44062587Sitojun#define SIOCDIFADDR_IN6 _IOW('i', 25, struct in6_ifreq) 441228768Sglebius#define OSIOCAIFADDR_IN6 _IOW('i', 26, struct oin6_aliasreq) 442228768Sglebius#define SIOCAIFADDR_IN6 _IOW('i', 27, struct in6_aliasreq) 44362587Sitojun 44462587Sitojun#define SIOCSIFPHYADDR_IN6 _IOW('i', 70, struct in6_aliasreq) 44552904Sshin#define SIOCGIFPSRCADDR_IN6 _IOWR('i', 71, struct in6_ifreq) 44652904Sshin#define SIOCGIFPDSTADDR_IN6 _IOWR('i', 72, struct in6_ifreq) 44752904Sshin 44862587Sitojun#define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq) 44952904Sshin 45062587Sitojun#define SIOCGDRLST_IN6 _IOWR('i', 74, struct in6_drlist) 45178064Sume#ifdef _KERNEL 452121472Sume/* XXX: SIOCGPRLST_IN6 is exposed in KAME but in6_oprlist is not. */ 453121472Sume#define SIOCGPRLST_IN6 _IOWR('i', 75, struct in6_oprlist) 454121472Sume#endif 455121472Sume#ifdef _KERNEL 45678064Sume#define OSIOCGIFINFO_IN6 _IOWR('i', 76, struct in6_ondireq) 45778064Sume#endif 45878064Sume#define SIOCGIFINFO_IN6 _IOWR('i', 108, struct in6_ndireq) 459151468Ssuz#define SIOCSIFINFO_IN6 _IOWR('i', 109, struct in6_ndireq) 46062587Sitojun#define SIOCSNDFLUSH_IN6 _IOWR('i', 77, struct in6_ifreq) 46162587Sitojun#define SIOCGNBRINFO_IN6 _IOWR('i', 78, struct in6_nbrinfo) 46262587Sitojun#define SIOCSPFXFLUSH_IN6 _IOWR('i', 79, struct in6_ifreq) 46362587Sitojun#define SIOCSRTRFLUSH_IN6 _IOWR('i', 80, struct in6_ifreq) 46452904Sshin 46562587Sitojun#define SIOCGIFALIFETIME_IN6 _IOWR('i', 81, struct in6_ifreq) 46662587Sitojun#define SIOCSIFALIFETIME_IN6 _IOWR('i', 82, struct in6_ifreq) 46762587Sitojun#define SIOCGIFSTAT_IN6 _IOWR('i', 83, struct in6_ifreq) 46862587Sitojun#define SIOCGIFSTAT_ICMP6 _IOWR('i', 84, struct in6_ifreq) 46952904Sshin 47062587Sitojun#define SIOCSDEFIFACE_IN6 _IOWR('i', 85, struct in6_ndifreq) 47162587Sitojun#define SIOCGDEFIFACE_IN6 _IOWR('i', 86, struct in6_ndifreq) 47262587Sitojun 47362587Sitojun#define SIOCSIFINFO_FLAGS _IOWR('i', 87, struct in6_ndireq) /* XXX */ 47462587Sitojun 47562587Sitojun#define SIOCSSCOPE6 _IOW('i', 88, struct in6_ifreq) 47662587Sitojun#define SIOCGSCOPE6 _IOWR('i', 89, struct in6_ifreq) 47762587Sitojun#define SIOCGSCOPE6DEF _IOWR('i', 90, struct in6_ifreq) 47862587Sitojun 47962587Sitojun#define SIOCSIFPREFIX_IN6 _IOW('i', 100, struct in6_prefixreq) /* set */ 48062587Sitojun#define SIOCGIFPREFIX_IN6 _IOWR('i', 101, struct in6_prefixreq) /* get */ 48162587Sitojun#define SIOCDIFPREFIX_IN6 _IOW('i', 102, struct in6_prefixreq) /* del */ 48262587Sitojun#define SIOCAIFPREFIX_IN6 _IOW('i', 103, struct in6_rrenumreq) /* add */ 48362587Sitojun#define SIOCCIFPREFIX_IN6 _IOW('i', 104, \ 48452904Sshin struct in6_rrenumreq) /* change */ 48562587Sitojun#define SIOCSGIFPREFIX_IN6 _IOW('i', 105, \ 48652904Sshin struct in6_rrenumreq) /* set global */ 48752904Sshin 48862587Sitojun#define SIOCGETSGCNT_IN6 _IOWR('u', 106, \ 48952904Sshin struct sioc_sg_req6) /* get s,g pkt cnt */ 49062587Sitojun#define SIOCGETMIFCNT_IN6 _IOWR('u', 107, \ 49152904Sshin struct sioc_mif_req6) /* get pkt cnt per if */ 49252904Sshin 493121742Sume#define SIOCAADDRCTL_POLICY _IOW('u', 108, struct in6_addrpolicy) 494121742Sume#define SIOCDADDRCTL_POLICY _IOW('u', 109, struct in6_addrpolicy) 495121742Sume 49662587Sitojun#define IN6_IFF_ANYCAST 0x01 /* anycast address */ 49762587Sitojun#define IN6_IFF_TENTATIVE 0x02 /* tentative address */ 49862587Sitojun#define IN6_IFF_DUPLICATED 0x04 /* DAD detected duplicate */ 49962587Sitojun#define IN6_IFF_DETACHED 0x08 /* may be detached from the link */ 50062587Sitojun#define IN6_IFF_DEPRECATED 0x10 /* deprecated address */ 50178064Sume#define IN6_IFF_NODAD 0x20 /* don't perform DAD on this address 50278064Sume * (used only at first SIOC* call) 50378064Sume */ 50478064Sume#define IN6_IFF_AUTOCONF 0x40 /* autoconfigurable address. */ 50578064Sume#define IN6_IFF_TEMPORARY 0x80 /* temporary (anonymous) address. */ 50678064Sume#define IN6_IFF_NOPFX 0x8000 /* skip kernel prefix management. 50778064Sume * XXX: this should be temporary. 50878064Sume */ 50952904Sshin 51052904Sshin/* do not input/output */ 51162587Sitojun#define IN6_IFF_NOTREADY (IN6_IFF_TENTATIVE|IN6_IFF_DUPLICATED) 51252904Sshin 51352904Sshin#ifdef _KERNEL 51462587Sitojun#define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b)) 51562587Sitojun#define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b)) 51662587Sitojun#endif 51752904Sshin 51862587Sitojun#ifdef _KERNEL 519195699SrwatsonVNET_DECLARE(struct in6_ifaddrhead, in6_ifaddrhead); 520244272SaeVNET_DECLARE(struct in6_ifaddrlisthead *, in6_ifaddrhashtbl); 521244272SaeVNET_DECLARE(u_long, in6_ifaddrhmask); 522195727Srwatson#define V_in6_ifaddrhead VNET(in6_ifaddrhead) 523244272Sae#define V_in6_ifaddrhashtbl VNET(in6_ifaddrhashtbl) 524244272Sae#define V_in6_ifaddrhmask VNET(in6_ifaddrhmask) 525186048Sbz 526244272Sae#define IN6ADDR_NHASH_LOG2 8 527244272Sae#define IN6ADDR_NHASH (1 << IN6ADDR_NHASH_LOG2) 528244272Sae#define IN6ADDR_HASHVAL(x) (in6_addrhash(x)) 529244272Sae#define IN6ADDR_HASH(x) \ 530244272Sae (&V_in6_ifaddrhashtbl[IN6ADDR_HASHVAL(x) & V_in6_ifaddrhmask]) 531244272Sae 532244272Saestatic __inline uint32_t 533244272Saein6_addrhash(struct in6_addr *in6) 534244272Sae{ 535244272Sae uint32_t x; 536244272Sae 537244272Sae x = in6->s6_addr32[0] ^ in6->s6_addr32[1] ^ in6->s6_addr32[2] ^ 538244272Sae in6->s6_addr32[3]; 539244272Sae return (fnv_32_buf(&x, sizeof(x), FNV1_32_INIT)); 540244272Sae} 541244272Sae 542194971Srwatsonextern struct rwlock in6_ifaddr_lock; 543194971Srwatson#define IN6_IFADDR_LOCK_ASSERT( ) rw_assert(&in6_ifaddr_lock, RA_LOCKED) 544194971Srwatson#define IN6_IFADDR_RLOCK() rw_rlock(&in6_ifaddr_lock) 545194971Srwatson#define IN6_IFADDR_RLOCK_ASSERT() rw_assert(&in6_ifaddr_lock, RA_RLOCKED) 546194971Srwatson#define IN6_IFADDR_RUNLOCK() rw_runlock(&in6_ifaddr_lock) 547194971Srwatson#define IN6_IFADDR_WLOCK() rw_wlock(&in6_ifaddr_lock) 548194971Srwatson#define IN6_IFADDR_WLOCK_ASSERT() rw_assert(&in6_ifaddr_lock, RA_WLOCKED) 549194971Srwatson#define IN6_IFADDR_WUNLOCK() rw_wunlock(&in6_ifaddr_lock) 550194971Srwatson 55162587Sitojun#define in6_ifstat_inc(ifp, tag) \ 55252904Sshindo { \ 553121161Sume if (ifp) \ 554253086Sae counter_u64_add(((struct in6_ifextra *) \ 555253086Sae ((ifp)->if_afdata[AF_INET6]))->in6_ifstat[ \ 556253086Sae offsetof(struct in6_ifstat, tag) / sizeof(uint64_t)], 1);\ 557120913Sume} while (/*CONSTCOND*/ 0) 55852904Sshin 55962587Sitojunextern u_char inet6ctlerrmap[]; 560207369SbzVNET_DECLARE(unsigned long, in6_maxmtu); 561207369Sbz#define V_in6_maxmtu VNET(in6_maxmtu) 56252904Sshin#endif /* _KERNEL */ 56352904Sshin 56452904Sshin/* 565191672Sbms * IPv6 multicast MLD-layer source entry. 56652904Sshin */ 567191672Sbmsstruct ip6_msource { 568191672Sbms RB_ENTRY(ip6_msource) im6s_link; /* RB tree links */ 569191672Sbms struct in6_addr im6s_addr; 570191672Sbms struct im6s_st { 571191672Sbms uint16_t ex; /* # of exclusive members */ 572191672Sbms uint16_t in; /* # of inclusive members */ 573191672Sbms } im6s_st[2]; /* state at t0, t1 */ 574191672Sbms uint8_t im6s_stp; /* pending query */ 575191672Sbms}; 576191672SbmsRB_HEAD(ip6_msource_tree, ip6_msource); 577191672Sbms 578191672Sbms/* 579191672Sbms * IPv6 multicast PCB-layer source entry. 580191672Sbms * 581191672Sbms * NOTE: overlapping use of struct ip6_msource fields at start. 582191672Sbms */ 583191672Sbmsstruct in6_msource { 584191672Sbms RB_ENTRY(ip6_msource) im6s_link; /* Common field */ 585191672Sbms struct in6_addr im6s_addr; /* Common field */ 586191672Sbms uint8_t im6sl_st[2]; /* state before/at commit */ 587191672Sbms}; 588191672Sbms 589191672Sbms#ifdef _KERNEL 590191672Sbms/* 591191672Sbms * IPv6 source tree comparison function. 592191672Sbms * 593191672Sbms * An ordered predicate is necessary; bcmp() is not documented to return 594191672Sbms * an indication of order, memcmp() is, and is an ISO C99 requirement. 595191672Sbms */ 596191672Sbmsstatic __inline int 597191672Sbmsip6_msource_cmp(const struct ip6_msource *a, const struct ip6_msource *b) 598191672Sbms{ 599191672Sbms 600191672Sbms return (memcmp(&a->im6s_addr, &b->im6s_addr, sizeof(struct in6_addr))); 601191672Sbms} 602191672SbmsRB_PROTOTYPE(ip6_msource_tree, ip6_msource, im6s_link, ip6_msource_cmp); 603191672Sbms#endif /* _KERNEL */ 604191672Sbms 605191672Sbms/* 606191672Sbms * IPv6 multicast PCB-layer group filter descriptor. 607191672Sbms */ 608191672Sbmsstruct in6_mfilter { 609191672Sbms struct ip6_msource_tree im6f_sources; /* source list for (S,G) */ 610191672Sbms u_long im6f_nsrc; /* # of source entries */ 611191672Sbms uint8_t im6f_st[2]; /* state before/at commit */ 612191672Sbms}; 613191672Sbms 614191672Sbms/* 615191672Sbms * Legacy KAME IPv6 multicast membership descriptor. 616191672Sbms */ 61752904Sshinstruct in6_multi_mship { 618191672Sbms struct in6_multi *i6mm_maddr; 619191672Sbms LIST_ENTRY(in6_multi_mship) i6mm_chain; 62052904Sshin}; 62152904Sshin 622191672Sbms/* 623191672Sbms * IPv6 group descriptor. 624191672Sbms * 625191672Sbms * For every entry on an ifnet's if_multiaddrs list which represents 626191672Sbms * an IP multicast group, there is one of these structures. 627191672Sbms * 628191672Sbms * If any source filters are present, then a node will exist in the RB-tree 629191672Sbms * to permit fast lookup by source whenever an operation takes place. 630191672Sbms * This permits pre-order traversal when we issue reports. 631191672Sbms * Source filter trees are kept separately from the socket layer to 632191672Sbms * greatly simplify locking. 633191672Sbms * 634191672Sbms * When MLDv2 is active, in6m_timer is the response to group query timer. 635191672Sbms * The state-change timer in6m_sctimer is separate; whenever state changes 636191672Sbms * for the group the state change record is generated and transmitted, 637191672Sbms * and kept if retransmissions are necessary. 638191672Sbms * 639191672Sbms * FUTURE: in6m_link is now only used when groups are being purged 640191672Sbms * on a detaching ifnet. It could be demoted to a SLIST_ENTRY, but 641191672Sbms * because it is at the very start of the struct, we can't do this 642191672Sbms * w/o breaking the ABI for ifmcstat. 643191672Sbms */ 644191672Sbmsstruct in6_multi { 64562587Sitojun LIST_ENTRY(in6_multi) in6m_entry; /* list glue */ 646191672Sbms struct in6_addr in6m_addr; /* IPv6 multicast address */ 64752904Sshin struct ifnet *in6m_ifp; /* back pointer to ifnet */ 64852904Sshin struct ifmultiaddr *in6m_ifma; /* back pointer to ifmultiaddr */ 649191672Sbms u_int in6m_refcount; /* reference count */ 65052904Sshin u_int in6m_state; /* state of the membership */ 65152904Sshin u_int in6m_timer; /* MLD6 listener report timer */ 652191672Sbms 653191672Sbms /* New fields for MLDv2 follow. */ 654191672Sbms struct mld_ifinfo *in6m_mli; /* MLD info */ 655191672Sbms SLIST_ENTRY(in6_multi) in6m_nrele; /* to-be-released by MLD */ 656191672Sbms struct ip6_msource_tree in6m_srcs; /* tree of sources */ 657191672Sbms u_long in6m_nsrc; /* # of tree entries */ 658191672Sbms 659191672Sbms struct ifqueue in6m_scq; /* queue of pending 660191672Sbms * state-change packets */ 661191672Sbms struct timeval in6m_lastgsrtv; /* last G-S-R query */ 662191672Sbms uint16_t in6m_sctimer; /* state-change timer */ 663191672Sbms uint16_t in6m_scrv; /* state-change rexmit count */ 664191672Sbms 665191672Sbms /* 666191672Sbms * SSM state counters which track state at T0 (the time the last 667191672Sbms * state-change report's RV timer went to zero) and T1 668191672Sbms * (time of pending report, i.e. now). 669191672Sbms * Used for computing MLDv2 state-change reports. Several refcounts 670191672Sbms * are maintained here to optimize for common use-cases. 671191672Sbms */ 672191672Sbms struct in6m_st { 673191672Sbms uint16_t iss_fmode; /* MLD filter mode */ 674191672Sbms uint16_t iss_asm; /* # of ASM listeners */ 675191672Sbms uint16_t iss_ex; /* # of exclusive members */ 676191672Sbms uint16_t iss_in; /* # of inclusive members */ 677191672Sbms uint16_t iss_rec; /* # of recorded sources */ 678191672Sbms } in6m_st[2]; /* state at t0, t1 */ 67952904Sshin}; 68052904Sshin 681191672Sbms/* 682191672Sbms * Helper function to derive the filter mode on a source entry 683191672Sbms * from its internal counters. Predicates are: 684191672Sbms * A source is only excluded if all listeners exclude it. 685191672Sbms * A source is only included if no listeners exclude it, 686191672Sbms * and at least one listener includes it. 687191672Sbms * May be used by ifmcstat(8). 688191672Sbms */ 689191672Sbmsstatic __inline uint8_t 690191672Sbmsim6s_get_mode(const struct in6_multi *inm, const struct ip6_msource *ims, 691191672Sbms uint8_t t) 692191672Sbms{ 693151539Ssuz 694191672Sbms t = !!t; 695191672Sbms if (inm->in6m_st[t].iss_ex > 0 && 696191672Sbms inm->in6m_st[t].iss_ex == ims->im6s_st[t].ex) 697191672Sbms return (MCAST_EXCLUDE); 698191672Sbms else if (ims->im6s_st[t].in > 0 && ims->im6s_st[t].ex == 0) 699191672Sbms return (MCAST_INCLUDE); 700191672Sbms return (MCAST_UNDEFINED); 701191672Sbms} 702191672Sbms 70352904Sshin#ifdef _KERNEL 704151539Ssuz 70552904Sshin/* 706191672Sbms * Lock macros for IPv6 layer multicast address lists. IPv6 lock goes 707191672Sbms * before link layer multicast locks in the lock order. In most cases, 708191672Sbms * consumers of IN_*_MULTI() macros should acquire the locks before 709191672Sbms * calling them; users of the in_{add,del}multi() functions should not. 71052904Sshin */ 711191672Sbmsextern struct mtx in6_multi_mtx; 712191672Sbms#define IN6_MULTI_LOCK() mtx_lock(&in6_multi_mtx) 713191672Sbms#define IN6_MULTI_UNLOCK() mtx_unlock(&in6_multi_mtx) 714191672Sbms#define IN6_MULTI_LOCK_ASSERT() mtx_assert(&in6_multi_mtx, MA_OWNED) 715191672Sbms#define IN6_MULTI_UNLOCK_ASSERT() mtx_assert(&in6_multi_mtx, MA_NOTOWNED) 71652904Sshin 71752904Sshin/* 718191672Sbms * Look up an in6_multi record for an IPv6 multicast address 719191672Sbms * on the interface ifp. 720191672Sbms * If no record found, return NULL. 721191672Sbms * 722191672Sbms * SMPng: The IN6_MULTI_LOCK and IF_ADDR_LOCK on ifp must be held. 72352904Sshin */ 724191672Sbmsstatic __inline struct in6_multi * 725191672Sbmsin6m_lookup_locked(struct ifnet *ifp, const struct in6_addr *mcaddr) 726191672Sbms{ 727191672Sbms struct ifmultiaddr *ifma; 728191672Sbms struct in6_multi *inm; 72952904Sshin 730191672Sbms IN6_MULTI_LOCK_ASSERT(); 731191672Sbms IF_ADDR_LOCK_ASSERT(ifp); 73252904Sshin 733191672Sbms inm = NULL; 734191672Sbms TAILQ_FOREACH(ifma, &((ifp)->if_multiaddrs), ifma_link) { 735191672Sbms if (ifma->ifma_addr->sa_family == AF_INET6) { 736191672Sbms inm = (struct in6_multi *)ifma->ifma_protospec; 737191672Sbms if (IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, mcaddr)) 738191672Sbms break; 739191672Sbms inm = NULL; 740191672Sbms } 741191672Sbms } 742191672Sbms return (inm); 743191672Sbms} 744191672Sbms 74552904Sshin/* 746191672Sbms * Wrapper for in6m_lookup_locked(). 747191672Sbms * 748191672Sbms * SMPng: Assumes that neithr the IN6_MULTI_LOCK() or IF_ADDR_LOCK() are held. 74952904Sshin */ 750191672Sbmsstatic __inline struct in6_multi * 751191672Sbmsin6m_lookup(struct ifnet *ifp, const struct in6_addr *mcaddr) 752191672Sbms{ 753191672Sbms struct in6_multi *inm; 75452904Sshin 755191672Sbms IN6_MULTI_LOCK(); 756229621Sjhb IF_ADDR_RLOCK(ifp); 757191672Sbms inm = in6m_lookup_locked(ifp, mcaddr); 758229621Sjhb IF_ADDR_RUNLOCK(ifp); 759191672Sbms IN6_MULTI_UNLOCK(); 76052904Sshin 761191672Sbms return (inm); 762191672Sbms} 763191672Sbms 764191672Sbms/* Acquire an in6_multi record. */ 765191672Sbmsstatic __inline void 766191672Sbmsin6m_acquire_locked(struct in6_multi *inm) 767191672Sbms{ 768191672Sbms 769191672Sbms IN6_MULTI_LOCK_ASSERT(); 770191672Sbms ++inm->in6m_refcount; 771191672Sbms} 772191672Sbms 773191672Sbmsstruct ip6_moptions; 774191672Sbmsstruct sockopt; 775191672Sbms 776191672Sbms/* Multicast KPIs. */ 777191672Sbmsint im6o_mc_filter(const struct ip6_moptions *, const struct ifnet *, 778191672Sbms const struct sockaddr *, const struct sockaddr *); 779191672Sbmsint in6_mc_join(struct ifnet *, const struct in6_addr *, 780191672Sbms struct in6_mfilter *, struct in6_multi **, int); 781191672Sbmsint in6_mc_join_locked(struct ifnet *, const struct in6_addr *, 782191672Sbms struct in6_mfilter *, struct in6_multi **, int); 783191672Sbmsint in6_mc_leave(struct in6_multi *, struct in6_mfilter *); 784191672Sbmsint in6_mc_leave_locked(struct in6_multi *, struct in6_mfilter *); 785191672Sbmsvoid in6m_clear_recorded(struct in6_multi *); 786191672Sbmsvoid in6m_commit(struct in6_multi *); 787191672Sbmsvoid in6m_print(const struct in6_multi *); 788191672Sbmsint in6m_record_source(struct in6_multi *, const struct in6_addr *); 789191672Sbmsvoid in6m_release_locked(struct in6_multi *); 790191672Sbmsvoid ip6_freemoptions(struct ip6_moptions *); 791191672Sbmsint ip6_getmoptions(struct inpcb *, struct sockopt *); 792191672Sbmsint ip6_setmoptions(struct inpcb *, struct sockopt *); 793191672Sbms 794191672Sbms/* Legacy KAME multicast KPIs. */ 795191672Sbmsstruct in6_multi_mship * 796191672Sbms in6_joingroup(struct ifnet *, struct in6_addr *, int *, int); 797142215Sglebiusint in6_leavegroup(struct in6_multi_mship *); 798191672Sbms 799191672Sbms/* flags to in6_update_ifa */ 800191672Sbms#define IN6_IFAUPDATE_DADDELAY 0x1 /* first time to configure an address */ 801191672Sbms 802241916Sdelphijint in6_mask2len(struct in6_addr *, u_char *); 803241916Sdelphijint in6_control(struct socket *, u_long, caddr_t, struct ifnet *, 804241916Sdelphij struct thread *); 805241916Sdelphijint in6_update_ifa(struct ifnet *, struct in6_aliasreq *, 806241916Sdelphij struct in6_ifaddr *, int); 807241916Sdelphijvoid in6_purgeaddr(struct ifaddr *); 808241916Sdelphijint in6if_do_dad(struct ifnet *); 809241916Sdelphijvoid in6_purgeif(struct ifnet *); 810241916Sdelphijvoid in6_savemkludge(struct in6_ifaddr *); 811241916Sdelphijvoid *in6_domifattach(struct ifnet *); 812241916Sdelphijvoid in6_domifdetach(struct ifnet *, void *); 813241916Sdelphijvoid in6_setmaxmtu(void); 814241916Sdelphijint in6_if2idlen(struct ifnet *); 815241916Sdelphijstruct in6_ifaddr *in6ifa_ifpforlinklocal(struct ifnet *, int); 816241916Sdelphijstruct in6_ifaddr *in6ifa_ifpwithaddr(struct ifnet *, struct in6_addr *); 817252511Shrsstruct in6_ifaddr *in6ifa_llaonifp(struct ifnet *); 818241916Sdelphijchar *ip6_sprintf(char *, const struct in6_addr *); 819241916Sdelphijint in6_addr2zoneid(struct ifnet *, struct in6_addr *, u_int32_t *); 820241916Sdelphijint in6_matchlen(struct in6_addr *, struct in6_addr *); 821241916Sdelphijint in6_are_prefix_equal(struct in6_addr *, struct in6_addr *, int); 822241916Sdelphijvoid in6_prefixlen2mask(struct in6_addr *, int); 823241916Sdelphijint in6_prefix_ioctl(struct socket *, u_long, caddr_t, 824241916Sdelphij struct ifnet *); 825241916Sdelphijint in6_prefix_add_ifid(int, struct in6_ifaddr *); 826241916Sdelphijvoid in6_prefix_remove_ifid(int, struct in6_ifaddr *); 827241916Sdelphijvoid in6_purgeprefix(struct ifnet *); 828142215Sglebiusvoid in6_ifremloop(struct ifaddr *); 829142215Sglebiusvoid in6_ifaddloop(struct ifaddr *); 83078064Sume 831241916Sdelphijint in6_is_addr_deprecated(struct sockaddr_in6 *); 832241916Sdelphijint in6_src_ioctl(u_long, caddr_t); 833231852Sbz 834231852Sbz/* 835231852Sbz * Extended API for IPv6 FIB support. 836231852Sbz */ 837231852Sbzvoid in6_rtredirect(struct sockaddr *, struct sockaddr *, struct sockaddr *, 838231852Sbz int, struct sockaddr *, u_int); 839231852Sbzint in6_rtrequest(int, struct sockaddr *, struct sockaddr *, 840231852Sbz struct sockaddr *, int, struct rtentry **, u_int); 841231852Sbzvoid in6_rtalloc(struct route_in6 *, u_int); 842231852Sbzvoid in6_rtalloc_ign(struct route_in6 *, u_long, u_int); 843231852Sbzstruct rtentry *in6_rtalloc1(struct sockaddr *, int, u_long, u_int); 84452904Sshin#endif /* _KERNEL */ 84552904Sshin 84652904Sshin#endif /* _NETINET6_IN6_VAR_H_ */ 847