linux/include/net/ndisc.h
<<
>>
Prefs
   1#ifndef _NDISC_H
   2#define _NDISC_H
   3
   4/*
   5 *      ICMP codes for neighbour discovery messages
   6 */
   7
   8#define NDISC_ROUTER_SOLICITATION       133
   9#define NDISC_ROUTER_ADVERTISEMENT      134
  10#define NDISC_NEIGHBOUR_SOLICITATION    135
  11#define NDISC_NEIGHBOUR_ADVERTISEMENT   136
  12#define NDISC_REDIRECT                  137
  13
  14/*
  15 * Router type: cross-layer information from link-layer to
  16 * IPv6 layer reported by certain link types (e.g., RFC4214).
  17 */
  18#define NDISC_NODETYPE_UNSPEC           0       /* unspecified (default) */
  19#define NDISC_NODETYPE_HOST             1       /* host or unauthorized router */
  20#define NDISC_NODETYPE_NODEFAULT        2       /* non-default router */
  21#define NDISC_NODETYPE_DEFAULT          3       /* default router */
  22
  23/*
  24 *      ndisc options
  25 */
  26
  27enum {
  28        __ND_OPT_PREFIX_INFO_END = 0,
  29        ND_OPT_SOURCE_LL_ADDR = 1,      /* RFC2461 */
  30        ND_OPT_TARGET_LL_ADDR = 2,      /* RFC2461 */
  31        ND_OPT_PREFIX_INFO = 3,         /* RFC2461 */
  32        ND_OPT_REDIRECT_HDR = 4,        /* RFC2461 */
  33        ND_OPT_MTU = 5,                 /* RFC2461 */
  34        __ND_OPT_ARRAY_MAX,
  35        ND_OPT_ROUTE_INFO = 24,         /* RFC4191 */
  36        ND_OPT_RDNSS = 25,              /* RFC5006 */
  37        __ND_OPT_MAX
  38};
  39
  40#define MAX_RTR_SOLICITATION_DELAY      HZ
  41
  42#define ND_REACHABLE_TIME               (30*HZ)
  43#define ND_RETRANS_TIMER                HZ
  44
  45#include <linux/compiler.h>
  46#include <linux/icmpv6.h>
  47#include <linux/in6.h>
  48#include <linux/types.h>
  49
  50#include <net/neighbour.h>
  51
  52struct ctl_table;
  53struct inet6_dev;
  54struct net_device;
  55struct net_proto_family;
  56struct sk_buff;
  57
  58extern struct neigh_table nd_tbl;
  59
  60struct nd_msg {
  61        struct icmp6hdr icmph;
  62        struct in6_addr target;
  63        __u8            opt[0];
  64};
  65
  66struct rs_msg {
  67        struct icmp6hdr icmph;
  68        __u8            opt[0];
  69};
  70
  71struct ra_msg {
  72        struct icmp6hdr         icmph;
  73        __be32                  reachable_time;
  74        __be32                  retrans_timer;
  75};
  76
  77struct nd_opt_hdr {
  78        __u8            nd_opt_type;
  79        __u8            nd_opt_len;
  80} __packed;
  81
  82static inline u32 ndisc_hashfn(const void *pkey, const struct net_device *dev, __u32 *hash_rnd)
  83{
  84        const u32 *p32 = pkey;
  85
  86        return (((p32[0] ^ dev->ifindex) * hash_rnd[0]) +
  87                (p32[1] * hash_rnd[1]) +
  88                (p32[2] * hash_rnd[2]) +
  89                (p32[3] * hash_rnd[3]));
  90}
  91
  92static inline struct neighbour *__ipv6_neigh_lookup(struct neigh_table *tbl, struct net_device *dev, const void *pkey)
  93{
  94        struct neigh_hash_table *nht;
  95        const u32 *p32 = pkey;
  96        struct neighbour *n;
  97        u32 hash_val;
  98
  99        rcu_read_lock_bh();
 100        nht = rcu_dereference_bh(tbl->nht);
 101        hash_val = ndisc_hashfn(pkey, dev, nht->hash_rnd) >> (32 - nht->hash_shift);
 102        for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]);
 103             n != NULL;
 104             n = rcu_dereference_bh(n->next)) {
 105                u32 *n32 = (u32 *) n->primary_key;
 106                if (n->dev == dev &&
 107                    ((n32[0] ^ p32[0]) | (n32[1] ^ p32[1]) |
 108                     (n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0) {
 109                        if (!atomic_inc_not_zero(&n->refcnt))
 110                                n = NULL;
 111                        break;
 112                }
 113        }
 114        rcu_read_unlock_bh();
 115
 116        return n;
 117}
 118
 119extern int                      ndisc_init(void);
 120
 121extern void                     ndisc_cleanup(void);
 122
 123extern int                      ndisc_rcv(struct sk_buff *skb);
 124
 125extern void                     ndisc_send_ns(struct net_device *dev,
 126                                              struct neighbour *neigh,
 127                                              const struct in6_addr *solicit,
 128                                              const struct in6_addr *daddr,
 129                                              const struct in6_addr *saddr);
 130
 131extern void                     ndisc_send_rs(struct net_device *dev,
 132                                              const struct in6_addr *saddr,
 133                                              const struct in6_addr *daddr);
 134
 135extern void                     ndisc_send_redirect(struct sk_buff *skb,
 136                                                    const struct in6_addr *target);
 137
 138extern int                      ndisc_mc_map(const struct in6_addr *addr, char *buf,
 139                                             struct net_device *dev, int dir);
 140
 141extern struct sk_buff           *ndisc_build_skb(struct net_device *dev,
 142                                                 const struct in6_addr *daddr,
 143                                                 const struct in6_addr *saddr,
 144                                                 struct icmp6hdr *icmp6h,
 145                                                 const struct in6_addr *target,
 146                                                 int llinfo);
 147
 148extern void                     ndisc_send_skb(struct sk_buff *skb,
 149                                               struct net_device *dev,
 150                                               struct neighbour *neigh,
 151                                               const struct in6_addr *daddr,
 152                                               const struct in6_addr *saddr,
 153                                               struct icmp6hdr *icmp6h);
 154
 155
 156
 157/*
 158 *      IGMP
 159 */
 160extern int                      igmp6_init(void);
 161
 162extern void                     igmp6_cleanup(void);
 163
 164extern int                      igmp6_event_query(struct sk_buff *skb);
 165
 166extern int                      igmp6_event_report(struct sk_buff *skb);
 167
 168
 169#ifdef CONFIG_SYSCTL
 170extern int                      ndisc_ifinfo_sysctl_change(struct ctl_table *ctl,
 171                                                           int write,
 172                                                           void __user *buffer,
 173                                                           size_t *lenp,
 174                                                           loff_t *ppos);
 175int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl,
 176                                 void __user *oldval, size_t __user *oldlenp,
 177                                 void __user *newval, size_t newlen);
 178#endif
 179
 180extern void                     inet6_ifinfo_notify(int event,
 181                                                    struct inet6_dev *idev);
 182
 183#endif
 184