#ifndef _NDISC_H
#define _NDISC_H
#include <net/ipv6_stubs.h>
#define NDISC_ROUTER_SOLICITATION …
#define NDISC_ROUTER_ADVERTISEMENT …
#define NDISC_NEIGHBOUR_SOLICITATION …
#define NDISC_NEIGHBOUR_ADVERTISEMENT …
#define NDISC_REDIRECT …
#define NDISC_NODETYPE_UNSPEC …
#define NDISC_NODETYPE_HOST …
#define NDISC_NODETYPE_NODEFAULT …
#define NDISC_NODETYPE_DEFAULT …
enum { … };
#define MAX_RTR_SOLICITATION_DELAY …
#define ND_REACHABLE_TIME …
#define ND_RETRANS_TIMER …
#include <linux/compiler.h>
#include <linux/icmpv6.h>
#include <linux/in6.h>
#include <linux/types.h>
#include <linux/if_arp.h>
#include <linux/netdevice.h>
#include <linux/hash.h>
#include <net/neighbour.h>
#define ND_DEBUG …
#define ND_PRINTK(val, level, fmt, ...) …
struct ctl_table;
struct inet6_dev;
struct net_device;
struct net_proto_family;
struct sk_buff;
struct prefix_info;
extern struct neigh_table nd_tbl;
struct nd_msg { … };
struct rs_msg { … };
struct ra_msg { … };
struct rd_msg { … };
struct nd_opt_hdr { … } __packed;
struct ndisc_options { … };
#define nd_opts_src_lladdr …
#define nd_opts_tgt_lladdr …
#define nd_opts_pi …
#define nd_opts_pi_end …
#define nd_opts_rh …
#define nd_opts_mtu …
#define nd_opts_nonce …
#define nd_802154_opts_src_lladdr …
#define nd_802154_opts_tgt_lladdr …
#define NDISC_OPT_SPACE(len) …
struct ndisc_options *ndisc_parse_options(const struct net_device *dev,
u8 *opt, int opt_len,
struct ndisc_options *ndopts);
void __ndisc_fill_addr_option(struct sk_buff *skb, int type, const void *data,
int data_len, int pad);
#define NDISC_OPS_REDIRECT_DATA_SPACE …
struct ndisc_ops { … };
#if IS_ENABLED(CONFIG_IPV6)
static inline int ndisc_ops_is_useropt(const struct net_device *dev,
u8 nd_opt_type)
{ … }
static inline int ndisc_ops_parse_options(const struct net_device *dev,
struct nd_opt_hdr *nd_opt,
struct ndisc_options *ndopts)
{ … }
static inline void ndisc_ops_update(const struct net_device *dev,
struct neighbour *n, u32 flags,
u8 icmp6_type,
const struct ndisc_options *ndopts)
{ … }
static inline int ndisc_ops_opt_addr_space(const struct net_device *dev,
u8 icmp6_type)
{ … }
static inline int ndisc_ops_redirect_opt_addr_space(const struct net_device *dev,
struct neighbour *neigh,
u8 *ha_buf, u8 **ha)
{ … }
static inline void ndisc_ops_fill_addr_option(const struct net_device *dev,
struct sk_buff *skb,
u8 icmp6_type)
{ … }
static inline void ndisc_ops_fill_redirect_addr_option(const struct net_device *dev,
struct sk_buff *skb,
const u8 *ha)
{ … }
static inline void ndisc_ops_prefix_rcv_add_addr(struct net *net,
struct net_device *dev,
const struct prefix_info *pinfo,
struct inet6_dev *in6_dev,
struct in6_addr *addr,
int addr_type, u32 addr_flags,
bool sllao, bool tokenized,
__u32 valid_lft,
u32 prefered_lft,
bool dev_addr_generated)
{ … }
#endif
static inline int ndisc_addr_option_pad(unsigned short type)
{ … }
static inline int __ndisc_opt_addr_space(unsigned char addr_len, int pad)
{ … }
#if IS_ENABLED(CONFIG_IPV6)
static inline int ndisc_opt_addr_space(struct net_device *dev, u8 icmp6_type)
{ … }
static inline int ndisc_redirect_opt_addr_space(struct net_device *dev,
struct neighbour *neigh,
u8 *ops_data_buf,
u8 **ops_data)
{ … }
#endif
static inline u8 *__ndisc_opt_addr_data(struct nd_opt_hdr *p,
unsigned char addr_len, int prepad)
{ … }
static inline u8 *ndisc_opt_addr_data(struct nd_opt_hdr *p,
struct net_device *dev)
{ … }
static inline u32 ndisc_hashfn(const void *pkey, const struct net_device *dev, __u32 *hash_rnd)
{ … }
static inline struct neighbour *__ipv6_neigh_lookup_noref(struct net_device *dev, const void *pkey)
{ … }
static inline
struct neighbour *__ipv6_neigh_lookup_noref_stub(struct net_device *dev,
const void *pkey)
{ … }
static inline struct neighbour *__ipv6_neigh_lookup(struct net_device *dev, const void *pkey)
{ … }
static inline void __ipv6_confirm_neigh(struct net_device *dev,
const void *pkey)
{ … }
static inline void __ipv6_confirm_neigh_stub(struct net_device *dev,
const void *pkey)
{ … }
static inline struct neighbour *ip_neigh_gw6(struct net_device *dev,
const void *addr)
{ … }
int ndisc_init(void);
int ndisc_late_init(void);
void ndisc_late_cleanup(void);
void ndisc_cleanup(void);
enum skb_drop_reason ndisc_rcv(struct sk_buff *skb);
struct sk_buff *ndisc_ns_create(struct net_device *dev, const struct in6_addr *solicit,
const struct in6_addr *saddr, u64 nonce);
void ndisc_send_ns(struct net_device *dev, const struct in6_addr *solicit,
const struct in6_addr *daddr, const struct in6_addr *saddr,
u64 nonce);
void ndisc_send_skb(struct sk_buff *skb, const struct in6_addr *daddr,
const struct in6_addr *saddr);
void ndisc_send_rs(struct net_device *dev,
const struct in6_addr *saddr, const struct in6_addr *daddr);
void ndisc_send_na(struct net_device *dev, const struct in6_addr *daddr,
const struct in6_addr *solicited_addr,
bool router, bool solicited, bool override, bool inc_opt);
void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target);
int ndisc_mc_map(const struct in6_addr *addr, char *buf, struct net_device *dev,
int dir);
void ndisc_update(const struct net_device *dev, struct neighbour *neigh,
const u8 *lladdr, u8 new, u32 flags, u8 icmp6_type,
struct ndisc_options *ndopts);
int igmp6_init(void);
int igmp6_late_init(void);
void igmp6_cleanup(void);
void igmp6_late_cleanup(void);
void igmp6_event_query(struct sk_buff *skb);
void igmp6_event_report(struct sk_buff *skb);
#ifdef CONFIG_SYSCTL
int ndisc_ifinfo_sysctl_change(const struct ctl_table *ctl, int write,
void *buffer, size_t *lenp, loff_t *ppos);
#endif
void inet6_ifinfo_notify(int event, struct inet6_dev *idev);
#endif