66#ifndef _NETINET6_IN6_VAR_H_
67#define _NETINET6_IN6_VAR_H_
70#include <sys/counter.h>
73#include <sys/fnv_hash.h>
74#include <sys/libkern.h>
114#define LLTABLE6(ifp) (((struct in6_ifextra *)(ifp)->if_afdata[AF_INET6])->lltable)
123#define ia_ifp ia_ifa.ifa_ifp
124#define ia_flags ia_ifa.ifa_flags
318#define IN6_PREFIX_ND 1
319#define IN6_PREFIX_RR 2
355#define PR_ORIG_STATIC 2
356#define PR_ORIG_KERNEL 3
358#define ipr_raf_onlink ipr_flags.prf_ra.onlink
359#define ipr_raf_auto ipr_flags.prf_ra.autonomous
361#define ipr_statef_onlink ipr_flags.prf_state.onlink
363#define ipr_rrf_decrvalid ipr_flags.prf_rr.decrvalid
364#define ipr_rrf_decrprefd ipr_flags.prf_rr.decrprefd
386#define irr_raf_mask_onlink irr_raflagmask.onlink
387#define irr_raf_mask_auto irr_raflagmask.autonomous
388#define irr_raf_mask_reserved irr_raflagmask.reserved
390#define irr_raf_onlink irr_flags.prf_ra.onlink
391#define irr_raf_auto irr_flags.prf_ra.autonomous
393#define irr_statef_onlink irr_flags.prf_state.onlink
395#define irr_rrf irr_flags.prf_rr
396#define irr_rrf_decrvalid irr_flags.prf_rr.decrvalid
397#define irr_rrf_decrprefd irr_flags.prf_rr.decrprefd
403#define IA6_IN6(ia) (&((ia)->ia_addr.sin6_addr))
404#define IA6_DSTIN6(ia) (&((ia)->ia_dstaddr.sin6_addr))
405#define IA6_MASKIN6(ia) (&((ia)->ia_prefixmask.sin6_addr))
406#define IA6_SIN6(ia) (&((ia)->ia_addr))
407#define IA6_DSTSIN6(ia) (&((ia)->ia_dstaddr))
408#define IFA_IN6(x) (&((struct sockaddr_in6 *)((x)->ifa_addr))->sin6_addr)
409#define IFA_DSTIN6(x) (&((struct sockaddr_in6 *)((x)->ifa_dstaddr))->sin6_addr)
410#define IFA_MASKIN6(x) (&((struct sockaddr_in6 *)((x)->ifa_netmask))->sin6_addr)
412#define IFPR_IN6(x) (&((struct sockaddr_in6 *)((x)->ifpr_prefix))->sin6_addr)
415#define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \
416 (((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
417 (((d)->s6_addr32[1] ^ (a)->s6_addr32[1]) & (m)->s6_addr32[1]) == 0 && \
418 (((d)->s6_addr32[2] ^ (a)->s6_addr32[2]) & (m)->s6_addr32[2]) == 0 && \
419 (((d)->s6_addr32[3] ^ (a)->s6_addr32[3]) & (m)->s6_addr32[3]) == 0 )
420#define IN6_MASK_ADDR(a, m) do { \
421 (a)->s6_addr32[0] &= (m)->s6_addr32[0]; \
422 (a)->s6_addr32[1] &= (m)->s6_addr32[1]; \
423 (a)->s6_addr32[2] &= (m)->s6_addr32[2]; \
424 (a)->s6_addr32[3] &= (m)->s6_addr32[3]; \
428#define SIOCSIFADDR_IN6 _IOW('i', 12, struct in6_ifreq)
429#define SIOCGIFADDR_IN6 _IOWR('i', 33, struct in6_ifreq)
436#define SIOCSIFDSTADDR_IN6 _IOW('i', 14, struct in6_ifreq)
437#define SIOCSIFNETMASK_IN6 _IOW('i', 22, struct in6_ifreq)
440#define SIOCGIFDSTADDR_IN6 _IOWR('i', 34, struct in6_ifreq)
441#define SIOCGIFNETMASK_IN6 _IOWR('i', 37, struct in6_ifreq)
443#define SIOCDIFADDR_IN6 _IOW('i', 25, struct in6_ifreq)
444#define OSIOCAIFADDR_IN6 _IOW('i', 26, struct oin6_aliasreq)
445#define SIOCAIFADDR_IN6 _IOW('i', 27, struct in6_aliasreq)
447#define SIOCSIFPHYADDR_IN6 _IOW('i', 70, struct in6_aliasreq)
448#define SIOCGIFPSRCADDR_IN6 _IOWR('i', 71, struct in6_ifreq)
449#define SIOCGIFPDSTADDR_IN6 _IOWR('i', 72, struct in6_ifreq)
451#define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq)
454#define OSIOCGIFINFO_IN6 _IOWR('i', 76, struct in6_ondireq)
456#define SIOCGIFINFO_IN6 _IOWR('i', 108, struct in6_ndireq)
457#define SIOCSIFINFO_IN6 _IOWR('i', 109, struct in6_ndireq)
458#define SIOCSNDFLUSH_IN6 _IOWR('i', 77, struct in6_ifreq)
459#define SIOCGNBRINFO_IN6 _IOWR('i', 78, struct in6_nbrinfo)
460#define SIOCSPFXFLUSH_IN6 _IOWR('i', 79, struct in6_ifreq)
461#define SIOCSRTRFLUSH_IN6 _IOWR('i', 80, struct in6_ifreq)
463#define SIOCGIFALIFETIME_IN6 _IOWR('i', 81, struct in6_ifreq)
464#define SIOCGIFSTAT_IN6 _IOWR('i', 83, struct in6_ifreq)
465#define SIOCGIFSTAT_ICMP6 _IOWR('i', 84, struct in6_ifreq)
467#define SIOCSDEFIFACE_IN6 _IOWR('i', 85, struct in6_ndifreq)
468#define SIOCGDEFIFACE_IN6 _IOWR('i', 86, struct in6_ndifreq)
470#define SIOCSIFINFO_FLAGS _IOWR('i', 87, struct in6_ndireq)
472#define SIOCSSCOPE6 _IOW('i', 88, struct in6_ifreq)
473#define SIOCGSCOPE6 _IOWR('i', 89, struct in6_ifreq)
474#define SIOCGSCOPE6DEF _IOWR('i', 90, struct in6_ifreq)
476#define SIOCSIFPREFIX_IN6 _IOW('i', 100, struct in6_prefixreq)
477#define SIOCGIFPREFIX_IN6 _IOWR('i', 101, struct in6_prefixreq)
478#define SIOCDIFPREFIX_IN6 _IOW('i', 102, struct in6_prefixreq)
479#define SIOCAIFPREFIX_IN6 _IOW('i', 103, struct in6_rrenumreq)
480#define SIOCCIFPREFIX_IN6 _IOW('i', 104, \
481 struct in6_rrenumreq)
482#define SIOCSGIFPREFIX_IN6 _IOW('i', 105, \
483 struct in6_rrenumreq)
485#define SIOCGETSGCNT_IN6 _IOWR('u', 106, \
487#define SIOCGETMIFCNT_IN6 _IOWR('u', 107, \
488 struct sioc_mif_req6)
490#define SIOCAADDRCTL_POLICY _IOW('u', 108, struct in6_addrpolicy)
491#define SIOCDADDRCTL_POLICY _IOW('u', 109, struct in6_addrpolicy)
493#define IN6_IFF_ANYCAST 0x01
494#define IN6_IFF_TENTATIVE 0x02
495#define IN6_IFF_DUPLICATED 0x04
496#define IN6_IFF_DETACHED 0x08
497#define IN6_IFF_DEPRECATED 0x10
498#define IN6_IFF_NODAD 0x20
501#define IN6_IFF_AUTOCONF 0x40
502#define IN6_IFF_TEMPORARY 0x80
503#define IN6_IFF_PREFER_SOURCE 0x0100
506#define IN6_IFF_NOTREADY (IN6_IFF_TENTATIVE|IN6_IFF_DUPLICATED)
509#define IN6_ARE_SCOPE_CMP(a,b) ((a)-(b))
510#define IN6_ARE_SCOPE_EQUAL(a,b) ((a)==(b))
517#define V_in6_ifaddrhead VNET(in6_ifaddrhead)
518#define V_in6_ifaddrhashtbl VNET(in6_ifaddrhashtbl)
519#define V_in6_ifaddrhmask VNET(in6_ifaddrhmask)
521#define IN6ADDR_NHASH_LOG2 8
522#define IN6ADDR_NHASH (1 << IN6ADDR_NHASH_LOG2)
523#define IN6ADDR_HASHVAL(x) (in6_addrhash(x))
524#define IN6ADDR_HASH(x) \
525 (&V_in6_ifaddrhashtbl[IN6ADDR_HASHVAL(x) & V_in6_ifaddrhmask])
527static __inline uint32_t
532 x = in6->s6_addr32[0] ^ in6->s6_addr32[1] ^ in6->s6_addr32[2] ^
534 return (fnv_32_buf(&x,
sizeof(x), FNV1_32_INIT));
538#define IN6_IFADDR_LOCK_ASSERT() rm_assert(&in6_ifaddr_lock, RA_LOCKED)
539#define IN6_IFADDR_RLOCK(t) rm_rlock(&in6_ifaddr_lock, (t))
540#define IN6_IFADDR_RLOCK_ASSERT() rm_assert(&in6_ifaddr_lock, RA_RLOCKED)
541#define IN6_IFADDR_RUNLOCK(t) rm_runlock(&in6_ifaddr_lock, (t))
542#define IN6_IFADDR_WLOCK() rm_wlock(&in6_ifaddr_lock)
543#define IN6_IFADDR_WLOCK_ASSERT() rm_assert(&in6_ifaddr_lock, RA_WLOCKED)
544#define IN6_IFADDR_WUNLOCK() rm_wunlock(&in6_ifaddr_lock)
546#define in6_ifstat_inc(ifp, tag) \
549 counter_u64_add(((struct in6_ifextra *) \
550 ((ifp)->if_afdata[AF_INET6]))->in6_ifstat[ \
551 offsetof(struct in6_ifstat, tag) / sizeof(uint64_t)], 1);\
556#define V_in6_maxmtu VNET(in6_maxmtu)
629 return (STAILQ_FIRST(head));
636 STAILQ_INSERT_TAIL(head, imf, im6f_entry);
646#define IP6_MFILTER_FOREACH(imf, head) \
647 STAILQ_FOREACH(imf, head, im6f_entry)
655 STAILQ_FOREACH(imf, head, im6f_entry)
737static __inline uint8_t
745 return (MCAST_EXCLUDE);
747 return (MCAST_INCLUDE);
748 return (MCAST_UNDEFINED);
760#define IN6_MULTI_LIST_LOCK() mtx_lock(&in6_multi_list_mtx)
761#define IN6_MULTI_LIST_UNLOCK() mtx_unlock(&in6_multi_list_mtx)
762#define IN6_MULTI_LIST_LOCK_ASSERT() mtx_assert(&in6_multi_list_mtx, MA_OWNED)
763#define IN6_MULTI_LIST_UNLOCK_ASSERT() mtx_assert(&in6_multi_list_mtx, MA_NOTOWNED)
765#define IN6_MULTI_LOCK() sx_xlock(&in6_multi_sx)
766#define IN6_MULTI_UNLOCK() sx_xunlock(&in6_multi_sx)
767#define IN6_MULTI_LOCK_ASSERT() sx_assert(&in6_multi_sx, SA_XLOCKED)
768#define IN6_MULTI_UNLOCK_ASSERT() sx_assert(&in6_multi_sx, SA_XUNLOCKED)
780 return ((ifma->ifma_addr->sa_family != AF_INET6 ||
781 (ifma->ifma_flags & IFMA_F_ENQUEUED) == 0) ? NULL :
782 ifma->ifma_protospec);
795 struct ifmultiaddr *ifma;
798 CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
853 MPASS(inm->
in6m_ifma->ifma_llifma == NULL);
854 SLIST_INSERT_HEAD(inmh, inm, in6m_nrele);
864int im6o_mc_filter(
const struct ip6_moptions *,
const struct ifnet *,
865 const struct sockaddr *,
const struct sockaddr *);
881#define IN6_IFAUPDATE_DADDELAY 0x1
884int in6_control(
struct socket *, u_long, caddr_t,
struct ifnet *,
#define IN6_ARE_ADDR_EQUAL(a, b)
int in6_src_ioctl(u_long, caddr_t)
int in6_matchlen(struct in6_addr *, struct in6_addr *)
int in6_are_prefix_equal(struct in6_addr *, struct in6_addr *, int)
static __inline void in6m_acquire_locked(struct in6_multi *inm)
void in6m_release_wait(void *)
int in6_is_addr_deprecated(struct sockaddr_in6 *)
STAILQ_HEAD(ip6_mfilter_head, in6_mfilter)
int in6_joingroup(struct ifnet *, const struct in6_addr *, struct in6_mfilter *, struct in6_multi **, int)
struct mbuf * ip6_tryforward(struct mbuf *)
void in6m_release_list_deferred(struct in6_multi_head *)
struct rmlock in6_ifaddr_lock
int im6o_mc_filter(const struct ip6_moptions *, const struct ifnet *, const struct sockaddr *, const struct sockaddr *)
int ip6_getmoptions(struct inpcb *, struct sockopt *)
SLIST_HEAD(in6_multi_head, in6_multi)
void ip6_mfilter_free(struct in6_mfilter *)
static __inline void in6m_rele_locked(struct in6_multi_head *inmh, struct in6_multi *inm)
int in6_if2idlen(struct ifnet *)
RB_HEAD(ip6_msource_tree, ip6_msource)
void in6_purgeaddr(struct ifaddr *)
static void ip6_mfilter_remove(struct ip6_mfilter_head *head, struct in6_mfilter *imf)
void in6m_disconnect_locked(struct in6_multi_head *inmh, struct in6_multi *inm)
MALLOC_DECLARE(M_IP6MADDR)
static __inline uint32_t in6_addrhash(const struct in6_addr *in6)
void in6_prefix_remove_ifid(int, struct in6_ifaddr *)
#define IN6_MULTI_LIST_LOCK()
void in6_detachhead(struct rib_head *rh)
CK_STAILQ_HEAD(in6_ifaddrhead, in6_ifaddr)
void ip6_freemoptions(struct ip6_moptions *)
void in6m_commit(struct in6_multi *)
void in6_prepare_ifra(struct in6_aliasreq *, const struct in6_addr *, const struct in6_addr *)
static void ip6_mfilter_insert(struct ip6_mfilter_head *head, struct in6_mfilter *imf)
void in6m_print(const struct in6_multi *)
void in6_savemkludge(struct in6_ifaddr *)
RB_PROTOTYPE(ip6_msource_tree, ip6_msource, im6s_link, ip6_msource_cmp)
static __inline void in6m_acquire(struct in6_multi *inm)
int in6_prefix_add_ifid(int, struct in6_ifaddr *)
struct in6_ifaddr * in6ifa_ifpforlinklocal(struct ifnet *, int)
VNET_DECLARE(struct in6_ifaddrhead, in6_ifaddrhead)
int in6_leavegroup_locked(struct in6_multi *, struct in6_mfilter *)
int in6_domifmtu(struct ifnet *)
struct rib_head * in6_inithead(uint32_t fibnum)
struct in6_mfilter * ip6_mfilter_alloc(int mflags, int st0, int st1)
int ip6_setmoptions(struct inpcb *, struct sockopt *)
void in6_newaddrmsg(struct in6_ifaddr *, int)
int in6_control(struct socket *, u_long, caddr_t, struct ifnet *, struct thread *)
static __inline struct in6_multi * in6m_ifmultiaddr_get_inm(struct ifmultiaddr *ifma)
void * in6_domifattach(struct ifnet *)
static void ip6_mfilter_init(struct ip6_mfilter_head *head)
static __inline struct in6_multi * in6m_lookup_locked(struct ifnet *ifp, const struct in6_addr *mcaddr)
struct in6_ifaddr * in6ifa_llaonifp(struct ifnet *)
struct in6_ifaddr * in6ifa_ifpwithaddr(struct ifnet *, const struct in6_addr *)
void in6_prefixlen2mask(struct in6_addr *, int)
void in6_domifdetach(struct ifnet *, void *)
static __inline struct in6_multi * in6m_lookup(struct ifnet *ifp, const struct in6_addr *mcaddr)
int in6if_do_dad(struct ifnet *)
void in6_purgeifaddr(struct in6_ifaddr *)
#define IN6_MULTI_LIST_UNLOCK()
int in6_update_ifa(struct ifnet *, struct in6_aliasreq *, struct in6_ifaddr *, int)
int in6_leavegroup(struct in6_multi *, struct in6_mfilter *)
struct mtx in6_multi_list_mtx
#define IN6_MULTI_LIST_LOCK_ASSERT()
static size_t ip6_mfilter_count(struct ip6_mfilter_head *head)
int in6_addr2zoneid(struct ifnet *, struct in6_addr *, u_int32_t *)
struct in6_ifaddr * in6ifa_ifwithaddr(const struct in6_addr *, uint32_t, bool)
int in6m_record_source(struct in6_multi *, const struct in6_addr *)
int in6_prefix_ioctl(struct socket *, u_long, caddr_t, struct ifnet *)
CK_LIST_HEAD(in6_ifaddrlisthead, in6_ifaddr)
static struct in6_mfilter * ip6_mfilter_first(const struct ip6_mfilter_head *head)
int in6_mask2len(struct in6_addr *, u_char *)
static __inline int ip6_msource_cmp(const struct ip6_msource *a, const struct ip6_msource *b)
void in6_purgeprefix(struct ifnet *)
static __inline uint8_t im6s_get_mode(const struct in6_multi *inm, const struct ip6_msource *ims, uint8_t t)
void in6m_clear_recorded(struct in6_multi *)
uint64_t ifs6_in_redirect
uint64_t ifs6_out_mldquery
uint64_t ifs6_in_adminprohib
uint64_t ifs6_out_mlddone
uint64_t ifs6_out_redirect
uint64_t ifs6_out_neighboradvert
uint64_t ifs6_out_timeexceed
uint64_t ifs6_in_routeradvert
uint64_t ifs6_in_routersolicit
uint64_t ifs6_out_routersolicit
uint64_t ifs6_out_mldreport
uint64_t ifs6_out_neighborsolicit
uint64_t ifs6_out_adminprohib
uint64_t ifs6_in_mldquery
uint64_t ifs6_in_timeexceed
uint64_t ifs6_in_pkttoobig
uint64_t ifs6_in_paramprob
uint64_t ifs6_out_echoreply
uint64_t ifs6_in_dstunreach
uint64_t ifs6_in_echoreply
uint64_t ifs6_out_routeradvert
uint64_t ifs6_in_neighboradvert
uint64_t ifs6_out_pkttoobig
uint64_t ifs6_out_paramprob
uint64_t ifs6_out_dstunreach
uint64_t ifs6_in_neighborsolicit
uint64_t ifs6_in_mldreport
struct sockaddr_in6 addrmask
struct in6_addrlifetime ifra_lifetime
struct sockaddr_in6 ifra_prefixmask
struct sockaddr_in6 ifra_addr
struct sockaddr_in6 ifra_dstaddr
CK_LIST_ENTRY(in6_ifaddr) ia6_hash
struct sockaddr_in6 ia_net
CK_STAILQ_ENTRY(in6_ifaddr) ia_link
struct sockaddr_in6 ia_dstaddr
struct sockaddr_in6 ia_addr
struct nd_prefix * ia6_ndpr
struct in6_addrlifetime ia6_lifetime
struct sockaddr_in6 ia_prefixmask
LIST_HEAD(, in6_multi_mship) ia6_memberships
struct sockaddr_in6 ifru_addr
struct icmp6_ifstat ifru_icmp6stat
struct in6_ifstat ifru_stat
struct in6_addrlifetime ifru_lifetime
u_int32_t ifru_scope_id[16]
union in6_ifreq::@2 ifr_ifru
struct sockaddr_in6 ifru_dstaddr
uint64_t ifs6_out_discard
uint64_t ifs6_in_protounknown
uint64_t ifs6_out_forward
uint64_t ifs6_out_request
uint64_t ifs6_out_fragfail
uint64_t ifs6_in_truncated
uint64_t ifs6_out_fragcreat
struct in6_multi * im6f_in6m
struct ip6_msource_tree im6f_sources
STAILQ_ENTRY(in6_mfilter) im6f_entry
struct in6_addr im6s_addr
RB_ENTRY(ip6_msource) im6s_link
struct in6_multi * i6mm_maddr
LIST_ENTRY(in6_multi_mship) i6mm_chain
struct mld_ifsoftc * in6m_mli
struct in6_addr in6m_addr
struct ifmultiaddr * in6m_ifma
SLIST_ENTRY(in6_multi) in6m_nrele
struct ip6_msource_tree in6m_srcs
struct timeval in6m_lastgsrtv
struct in6_multi::in6m_st in6m_st[2]
struct in6_prflags ipr_flags
struct sockaddr_in6 ipr_prefix
struct in6_prflags::prf_ra prf_ra
struct in6_prflags::prf_rr prf_rr
struct in6_prflags irr_flags
struct sockaddr_in6 irr_useprefix
struct sockaddr_in6 irr_matchprefix
struct in6_rrenumreq::irr_raflagmask irr_raflagmask
struct ip6_msource::im6s_st im6s_st[2]
struct in6_addr im6s_addr
RB_ENTRY(ip6_msource) im6s_link
struct sockaddr_in6 ifra_dstaddr
struct in6_addrlifetime ifra_lifetime
struct sockaddr_in6 ifra_prefixmask
struct sockaddr_in6 ifra_addr