#ifndef _NETINET6_IP6_VAR_H_
#define _NETINET6_IP6_VAR_H_
struct ip6stat {
u_int64_t ip6s_total;
u_int64_t ip6s_tooshort;
u_int64_t ip6s_toosmall;
u_int64_t ip6s_fragments;
u_int64_t ip6s_fragdropped;
u_int64_t ip6s_fragtimeout;
u_int64_t ip6s_fragoverflow;
u_int64_t ip6s_forward;
u_int64_t ip6s_cantforward;
u_int64_t ip6s_redirectsent;
u_int64_t ip6s_delivered;
u_int64_t ip6s_localout;
u_int64_t ip6s_odropped;
u_int64_t ip6s_reassembled;
u_int64_t ip6s_fragmented;
u_int64_t ip6s_ofragments;
u_int64_t ip6s_cantfrag;
u_int64_t ip6s_badoptions;
u_int64_t ip6s_noroute;
u_int64_t ip6s_badvers;
u_int64_t ip6s_rawout;
u_int64_t ip6s_badscope;
u_int64_t ip6s_notmember;
u_int64_t ip6s_nxthist[256];
u_int64_t ip6s_m1;
u_int64_t ip6s_m2m[32];
u_int64_t ip6s_mext1;
u_int64_t ip6s_mext2m;
u_int64_t ip6s_nogif;
u_int64_t ip6s_toomanyhdr;
u_int64_t ip6s_sources_none;
u_int64_t ip6s_sources_sameif[16];
u_int64_t ip6s_sources_otherif[16];
u_int64_t ip6s_sources_samescope[16];
u_int64_t ip6s_sources_otherscope[16];
u_int64_t ip6s_sources_deprecated[16];
u_int64_t ip6s_rtcachehit;
u_int64_t ip6s_rtcachemiss;
u_int64_t ip6s_wrongif;
u_int64_t ip6s_idropped;
};
#ifdef _KERNEL
struct ip6q {
TAILQ_ENTRY(ip6q) ip6q_queue;
LIST_HEAD(ip6asfrag_list, ip6asfrag) ip6q_asfrag;
struct in6_addr ip6q_src, ip6q_dst;
int ip6q_unfrglen;
int ip6q_nfrag;
u_int32_t ip6q_ident;
u_int8_t ip6q_nxt;
u_int8_t ip6q_ecn;
u_int8_t ip6q_ttl;
};
struct ip6asfrag {
LIST_ENTRY(ip6asfrag) ip6af_list;
struct mbuf *ip6af_m;
int ip6af_offset;
int ip6af_frglen;
int ip6af_off;
u_int16_t ip6af_mff;
};
struct ip6_moptions {
LIST_HEAD(, in6_multi_mship) im6o_memberships;
unsigned short im6o_ifidx;
u_char im6o_hlim;
u_char im6o_loop;
};
struct ip6po_rhinfo {
struct ip6_rthdr *ip6po_rhi_rthdr;
struct route ip6po_rhi_route;
};
#define ip6po_rthdr ip6po_rhinfo.ip6po_rhi_rthdr
#define ip6po_route ip6po_rhinfo.ip6po_rhi_route
struct ip6_pktopts {
int ip6po_hlim;
struct in6_pktinfo *ip6po_pktinfo;
struct ip6_hbh *ip6po_hbh;
struct ip6_dest *ip6po_dest1;
struct ip6po_rhinfo ip6po_rhinfo;
struct ip6_dest *ip6po_dest2;
int ip6po_tclass;
int ip6po_minmtu;
#define IP6PO_MINMTU_MCASTONLY -1
#define IP6PO_MINMTU_DISABLE 0
#define IP6PO_MINMTU_ALL 1
int ip6po_flags;
#define IP6PO_DONTFRAG 0x04
};
#include <sys/percpu.h>
enum ip6stat_counters {
ip6s_total,
ip6s_tooshort,
ip6s_toosmall,
ip6s_fragments,
ip6s_fragdropped,
ip6s_fragtimeout,
ip6s_fragoverflow,
ip6s_forward,
ip6s_cantforward,
ip6s_redirectsent,
ip6s_delivered,
ip6s_localout,
ip6s_odropped,
ip6s_reassembled,
ip6s_fragmented,
ip6s_ofragments,
ip6s_cantfrag,
ip6s_badoptions,
ip6s_noroute,
ip6s_badvers,
ip6s_rawout,
ip6s_badscope,
ip6s_notmember,
ip6s_nxthist,
ip6s_m1 = ip6s_nxthist + 256,
ip6s_m2m,
ip6s_mext1 = ip6s_m2m + 32,
ip6s_mext2m,
ip6s_nogif,
ip6s_toomanyhdr,
ip6s_sources_none,
ip6s_sources_sameif,
ip6s_sources_otherif = ip6s_sources_sameif + 16,
ip6s_sources_samescope = ip6s_sources_otherif + 16,
ip6s_sources_otherscope = ip6s_sources_samescope + 16,
ip6s_sources_deprecated = ip6s_sources_otherscope + 16,
ip6s_rtcachehit = ip6s_sources_deprecated + 16,
ip6s_rtcachemiss,
ip6s_wrongif,
ip6s_idropped,
ip6s_ncounters,
};
extern struct cpumem *ip6counters;
static inline void
ip6stat_inc(enum ip6stat_counters c)
{
counters_inc(ip6counters, c);
}
static inline void
ip6stat_add(enum ip6stat_counters c, uint64_t v)
{
counters_add(ip6counters, c, v);
}
#define IPV6_UNSPECSRC 0x01
#define IPV6_FORWARDING 0x02
#define IPV6_MINMTU 0x04
#define IPV6_REDIRECT 0x08
#define IPV6_FORWARDING_IPSEC 0x10
extern int ip6_mtudisc_timeout;
extern struct rttimer_queue icmp6_mtudisc_timeout_q;
extern int ip6_defhlim;
extern int ip6_defmcasthlim;
extern int ip6_forwarding;
extern int ip6_mforwarding;
extern int ip6_multipath;
extern int ip6_mcast_pmtu;
extern int ip6_neighborgcthresh;
extern int ip6_maxdynroutes;
extern struct socket *ip6_mrouter[RT_TABLEID_MAX + 1];
extern int ip6_sendredirects;
extern int ip6_maxfragpackets;
extern int ip6_maxfrags;
extern int ip6_hdrnestlimit;
extern int ip6_dad_count;
extern int ip6_dad_pending;
extern const struct pr_usrreqs rip6_usrreqs;
struct inpcb;
struct ipsec_level;
int icmp6_ctloutput(int, struct socket *, int, int, struct mbuf *);
void ip6_init(void);
void ip6intr(void);
int ip6_input_if(struct mbuf **, int *, int, int, struct ifnet *,
struct netstack *);
int ip6_ours_enqueue(struct mbuf **, int *, int);
void ip6_freepcbopts(struct ip6_pktopts *);
void ip6_freemoptions(struct ip6_moptions *);
int ip6_unknown_opt(struct mbuf **, u_int8_t *, int);
int ip6_get_prevhdr(struct mbuf *, int);
int ip6_nexthdr(struct mbuf *, int, int, int *);
int ip6_lasthdr(struct mbuf *, int, int, int *);
int ip6_mforward(struct ip6_hdr *, struct ifnet *, struct mbuf *, int);
int ip6_process_hopopts(struct mbuf **, u_int8_t *, int, u_int32_t *,
u_int32_t *);
void ip6_savecontrol(struct inpcb *, struct mbuf *, struct mbuf **);
int ip6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
void ip6_forward(struct mbuf *, struct route *, int);
void ip6_mloopback(struct ifnet *, struct mbuf *, struct sockaddr_in6 *);
int ip6_output(struct mbuf *, struct ip6_pktopts *, struct route *, int,
struct ip6_moptions *, const struct ipsec_level *);
int ip6_fragment(struct mbuf *, struct mbuf_list *, int, u_char, u_long);
int ip6_ctloutput(int, struct socket *, int, int, struct mbuf *);
int ip6_raw_ctloutput(int, struct socket *, int, int, struct mbuf *);
void ip6_initpktopts(struct ip6_pktopts *);
int ip6_setpktopts(struct mbuf *, struct ip6_pktopts *,
struct ip6_pktopts *, int, int);
void ip6_clearpktopts(struct ip6_pktopts *, int);
void ip6_randomid_init(void);
u_int32_t ip6_randomid(void);
void ip6_send(struct mbuf *);
int route6_input(struct mbuf **, int *, int, int, struct netstack *);
void frag6_init(void);
int frag6_input(struct mbuf **, int *, int, int, struct netstack *);
int frag6_deletefraghdr(struct mbuf *, int);
void frag6_slowtimo(void);
void rip6_init(void);
int rip6_input(struct mbuf **, int *, int, int, struct netstack *);
void rip6_ctlinput(int, struct sockaddr *, u_int, void *);
int rip6_ctloutput(int, struct socket *, int, int, struct mbuf *);
int rip6_output(struct mbuf *, struct socket *, struct sockaddr *,
struct mbuf *);
int rip6_attach(struct socket *, int, int);
int rip6_detach(struct socket *);
int rip6_bind(struct socket *, struct mbuf *, struct proc *);
int rip6_connect(struct socket *, struct mbuf *);
int rip6_disconnect(struct socket *);
int rip6_shutdown(struct socket *);
int rip6_send(struct socket *, struct mbuf *, struct mbuf *,
struct mbuf *);
int rip6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
int dest6_input(struct mbuf **, int *, int, int, struct netstack *);
int in6_pcbselsrc(const struct in6_addr **, const struct sockaddr_in6 *,
struct inpcb *, struct ip6_pktopts *);
int in6_selectsrc(const struct in6_addr **, const struct sockaddr_in6 *,
struct ip6_moptions *, unsigned int);
struct rtentry *in6_selectroute(const struct in6_addr *, struct ip6_pktopts *,
struct route *, unsigned int rtableid);
u_int32_t ip6_randomflowlabel(void);
#ifdef IPSEC
struct tdb;
int ip6_output_ipsec_lookup(struct mbuf *, const struct ipsec_level *,
struct tdb **);
int ip6_output_ipsec_send(struct tdb *, struct mbuf *, struct route *,
u_int, int, int);
#endif
#endif
#endif