Blame view

include/net/ndisc.h 4.42 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  #ifndef _NDISC_H
  #define _NDISC_H
  
  /*
   *	ICMP codes for neighbour discovery messages
   */
  
  #define NDISC_ROUTER_SOLICITATION	133
  #define NDISC_ROUTER_ADVERTISEMENT	134
  #define NDISC_NEIGHBOUR_SOLICITATION	135
  #define NDISC_NEIGHBOUR_ADVERTISEMENT	136
  #define NDISC_REDIRECT			137
  
  /*
fadf6bf06   Templin, Fred L   [IPV6] SIT: Add P...
15
16
17
18
19
20
21
22
23
   * Router type: cross-layer information from link-layer to
   * IPv6 layer reported by certain link types (e.g., RFC4214).
   */
  #define NDISC_NODETYPE_UNSPEC		0	/* unspecified (default) */
  #define NDISC_NODETYPE_HOST		1	/* host or unauthorized router */
  #define NDISC_NODETYPE_NODEFAULT	2	/* non-default router */
  #define NDISC_NODETYPE_DEFAULT		3	/* default router */
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
31
32
33
   *	ndisc options
   */
  
  enum {
  	__ND_OPT_PREFIX_INFO_END = 0,
  	ND_OPT_SOURCE_LL_ADDR = 1,	/* RFC2461 */
  	ND_OPT_TARGET_LL_ADDR = 2,	/* RFC2461 */
  	ND_OPT_PREFIX_INFO = 3,		/* RFC2461 */
  	ND_OPT_REDIRECT_HDR = 4,	/* RFC2461 */
  	ND_OPT_MTU = 5,			/* RFC2461 */
70ceb4f53   YOSHIFUJI Hideaki   [IPV6]: ROUTE: Ad...
34
35
  	__ND_OPT_ARRAY_MAX,
  	ND_OPT_ROUTE_INFO = 24,		/* RFC4191 */
31910575a   Pierre Ynard   [IPv6]: Export us...
36
  	ND_OPT_RDNSS = 25,		/* RFC5006 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
40
41
42
43
  	__ND_OPT_MAX
  };
  
  #define MAX_RTR_SOLICITATION_DELAY	HZ
  
  #define ND_REACHABLE_TIME		(30*HZ)
  #define ND_RETRANS_TIMER		HZ
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
44
  #include <linux/compiler.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
  #include <linux/icmpv6.h>
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
46
47
  #include <linux/in6.h>
  #include <linux/types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
  #include <net/neighbour.h>
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
49
50
  
  struct ctl_table;
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
51
52
53
54
  struct inet6_dev;
  struct net_device;
  struct net_proto_family;
  struct sk_buff;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  
  extern struct neigh_table nd_tbl;
  
  struct nd_msg {
          struct icmp6hdr	icmph;
          struct in6_addr	target;
  	__u8		opt[0];
  };
  
  struct rs_msg {
  	struct icmp6hdr	icmph;
  	__u8		opt[0];
  };
  
  struct ra_msg {
          struct icmp6hdr		icmph;
e69a4adc6   Al Viro   [IPV6]: Misc endi...
71
72
  	__be32			reachable_time;
  	__be32			retrans_timer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
74
75
76
77
  };
  
  struct nd_opt_hdr {
  	__u8		nd_opt_type;
  	__u8		nd_opt_len;
bc10502db   Eric Dumazet   net: use __packed...
78
  } __packed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79

2c2aba6c5   David S. Miller   ipv6: Use univers...
80
81
82
83
84
85
86
87
88
  static inline u32 ndisc_hashfn(const void *pkey, const struct net_device *dev, __u32 *hash_rnd)
  {
  	const u32 *p32 = pkey;
  
  	return (((p32[0] ^ dev->ifindex) * hash_rnd[0]) +
  		(p32[1] * hash_rnd[1]) +
  		(p32[2] * hash_rnd[2]) +
  		(p32[3] * hash_rnd[3]));
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89

f83c7790d   David S. Miller   ipv6: Create fast...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  static inline struct neighbour *__ipv6_neigh_lookup(struct neigh_table *tbl, struct net_device *dev, const void *pkey)
  {
  	struct neigh_hash_table *nht;
  	const u32 *p32 = pkey;
  	struct neighbour *n;
  	u32 hash_val;
  
  	rcu_read_lock_bh();
  	nht = rcu_dereference_bh(tbl->nht);
  	hash_val = ndisc_hashfn(pkey, dev, nht->hash_rnd) >> (32 - nht->hash_shift);
  	for (n = rcu_dereference_bh(nht->hash_buckets[hash_val]);
  	     n != NULL;
  	     n = rcu_dereference_bh(n->next)) {
  		u32 *n32 = (u32 *) n->primary_key;
  		if (n->dev == dev &&
  		    ((n32[0] ^ p32[0]) | (n32[1] ^ p32[1]) |
  		     (n32[2] ^ p32[2]) | (n32[3] ^ p32[3])) == 0) {
  			if (!atomic_inc_not_zero(&n->refcnt))
  				n = NULL;
  			break;
  		}
  	}
  	rcu_read_unlock_bh();
  
  	return n;
  }
9b0f976f2   Denis V. Lunev   [INET]: Remove st...
116
  extern int			ndisc_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
120
121
122
123
  
  extern void			ndisc_cleanup(void);
  
  extern int			ndisc_rcv(struct sk_buff *skb);
  
  extern void			ndisc_send_ns(struct net_device *dev,
  					      struct neighbour *neigh,
9acd9f3ae   YOSHIFUJI Hideaki   [IPV6]: Make addr...
124
125
126
  					      const struct in6_addr *solicit,
  					      const struct in6_addr *daddr,
  					      const struct in6_addr *saddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
128
  
  extern void			ndisc_send_rs(struct net_device *dev,
9acd9f3ae   YOSHIFUJI Hideaki   [IPV6]: Make addr...
129
130
  					      const struct in6_addr *saddr,
  					      const struct in6_addr *daddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
133
  extern void			ndisc_send_redirect(struct sk_buff *skb,
  						    struct neighbour *neigh,
9acd9f3ae   YOSHIFUJI Hideaki   [IPV6]: Make addr...
134
  						    const struct in6_addr *target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135

b71d1d426   Eric Dumazet   inet: constify ip...
136
137
  extern int			ndisc_mc_map(const struct in6_addr *addr, char *buf,
  					     struct net_device *dev, int dir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138

305d552ac   Brian Haley   bonding: send IPv...
139
140
141
142
143
144
145
146
147
148
149
150
151
  extern struct sk_buff		*ndisc_build_skb(struct net_device *dev,
  						 const struct in6_addr *daddr,
  						 const struct in6_addr *saddr,
  						 struct icmp6hdr *icmp6h,
  						 const struct in6_addr *target,
  						 int llinfo);
  
  extern void			ndisc_send_skb(struct sk_buff *skb,
  					       struct net_device *dev,
  					       struct neighbour *neigh,
  					       const struct in6_addr *daddr,
  					       const struct in6_addr *saddr,
  					       struct icmp6hdr *icmp6h);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
156
  
  /*
   *	IGMP
   */
9b0f976f2   Denis V. Lunev   [INET]: Remove st...
157
  extern int			igmp6_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
159
160
161
162
163
  
  extern void			igmp6_cleanup(void);
  
  extern int			igmp6_event_query(struct sk_buff *skb);
  
  extern int			igmp6_event_report(struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
  
  #ifdef CONFIG_SYSCTL
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
166
  extern int 			ndisc_ifinfo_sysctl_change(struct ctl_table *ctl,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
  							   int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
168
169
170
  							   void __user *buffer,
  							   size_t *lenp,
  							   loff_t *ppos);
f221e726b   Alexey Dobriyan   sysctl: simplify ...
171
172
  int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl,
  				 void __user *oldval, size_t __user *oldlenp,
0686caa35   YOSHIFUJI Hideaki   ndisc: Add missin...
173
  				 void __user *newval, size_t newlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
175
176
177
  #endif
  
  extern void 			inet6_ifinfo_notify(int event,
  						    struct inet6_dev *idev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
  #endif