1#ifndef _NET_NEIGHBOUR_H
2#define _NET_NEIGHBOUR_H
3
4#include <linux/neighbour.h>
5
6/*
7 *	Generic neighbour manipulation
8 *
9 *	Authors:
10 *	Pedro Roque		<roque@di.fc.ul.pt>
11 *	Alexey Kuznetsov	<kuznet@ms2.inr.ac.ru>
12 *
13 * 	Changes:
14 *
15 *	Harald Welte:		<laforge@gnumonks.org>
16 *		- Add neighbour cache statistics like rtstat
17 */
18
19#include <asm/atomic.h>
20#include <linux/netdevice.h>
21#include <linux/skbuff.h>
22#include <linux/rcupdate.h>
23#include <linux/seq_file.h>
24
25#include <linux/err.h>
26#include <linux/sysctl.h>
27#include <net/rtnetlink.h>
28
29#define NUD_IN_TIMER	(NUD_INCOMPLETE|NUD_REACHABLE|NUD_DELAY|NUD_PROBE)
30#define NUD_VALID	(NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY)
31#define NUD_CONNECTED	(NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE)
32
33struct neighbour;
34
35struct neigh_parms
36{
37	struct net_device *dev;
38	struct neigh_parms *next;
39	int	(*neigh_setup)(struct neighbour *);
40	void	(*neigh_cleanup)(struct neighbour *);
41	struct neigh_table *tbl;
42
43	void	*sysctl_table;
44
45	int dead;
46	atomic_t refcnt;
47	struct rcu_head rcu_head;
48
49	int	base_reachable_time;
50	int	retrans_time;
51	int	gc_staletime;
52	int	reachable_time;
53	int	delay_probe_time;
54
55	int	queue_len;
56	int	ucast_probes;
57	int	app_probes;
58	int	mcast_probes;
59	int	anycast_delay;
60	int	proxy_delay;
61	int	proxy_qlen;
62	int	locktime;
63};
64
65struct neigh_statistics
66{
67	unsigned long allocs;		/* number of allocated neighs */
68	unsigned long destroys;		/* number of destroyed neighs */
69	unsigned long hash_grows;	/* number of hash resizes */
70
71	unsigned long res_failed;	/* nomber of failed resolutions */
72
73	unsigned long lookups;		/* number of lookups */
74	unsigned long hits;		/* number of hits (among lookups) */
75
76	unsigned long rcv_probes_mcast;	/* number of received mcast ipv6 */
77	unsigned long rcv_probes_ucast; /* number of received ucast ipv6 */
78
79	unsigned long periodic_gc_runs;	/* number of periodic GC runs */
80	unsigned long forced_gc_runs;	/* number of forced GC runs */
81};
82
83#define NEIGH_CACHE_STAT_INC(tbl, field)				\
84	do {								\
85		preempt_disable();					\
86		(per_cpu_ptr((tbl)->stats, smp_processor_id())->field)++; \
87		preempt_enable();					\
88	} while (0)
89
90struct neighbour
91{
92	struct neighbour	*next;
93	struct neigh_table	*tbl;
94	struct neigh_parms	*parms;
95	struct net_device		*dev;
96	unsigned long		used;
97	unsigned long		confirmed;
98	unsigned long		updated;
99	__u8			flags;
100	__u8			nud_state;
101	__u8			type;
102	__u8			dead;
103	atomic_t		probes;
104	rwlock_t		lock;
105	unsigned char		ha[ALIGN(MAX_ADDR_LEN, sizeof(unsigned long))];
106	struct hh_cache		*hh;
107	atomic_t		refcnt;
108	int			(*output)(struct sk_buff *skb);
109	struct sk_buff_head	arp_queue;
110	struct timer_list	timer;
111	struct neigh_ops	*ops;
112	u8			primary_key[0];
113};
114
115struct neigh_ops
116{
117	int			family;
118	void			(*solicit)(struct neighbour *, struct sk_buff*);
119	void			(*error_report)(struct neighbour *, struct sk_buff*);
120	int			(*output)(struct sk_buff*);
121	int			(*connected_output)(struct sk_buff*);
122	int			(*hh_output)(struct sk_buff*);
123	int			(*queue_xmit)(struct sk_buff*);
124};
125
126struct pneigh_entry
127{
128	struct pneigh_entry	*next;
129	struct net_device		*dev;
130	u8			flags;
131	u8			key[0];
132};
133
134/*
135 *	neighbour table manipulation
136 */
137
138
139struct neigh_table
140{
141	struct neigh_table	*next;
142	int			family;
143	int			entry_size;
144	int			key_len;
145	__u32			(*hash)(const void *pkey, const struct net_device *);
146	int			(*constructor)(struct neighbour *);
147	int			(*pconstructor)(struct pneigh_entry *);
148	void			(*pdestructor)(struct pneigh_entry *);
149	void			(*proxy_redo)(struct sk_buff *skb);
150	char			*id;
151	struct neigh_parms	parms;
152	/* HACK. gc_* shoul follow parms without a gap! */
153	int			gc_interval;
154	int			gc_thresh1;
155	int			gc_thresh2;
156	int			gc_thresh3;
157	unsigned long		last_flush;
158	struct timer_list 	gc_timer;
159	struct timer_list 	proxy_timer;
160	struct sk_buff_head	proxy_queue;
161	atomic_t		entries;
162	rwlock_t		lock;
163	unsigned long		last_rand;
164	struct kmem_cache		*kmem_cachep;
165	struct neigh_statistics	*stats;
166	struct neighbour	**hash_buckets;
167	unsigned int		hash_mask;
168	__u32			hash_rnd;
169	unsigned int		hash_chain_gc;
170	struct pneigh_entry	**phash_buckets;
171#ifdef CONFIG_PROC_FS
172	struct proc_dir_entry	*pde;
173#endif
174};
175
176/* flags for neigh_update() */
177#define NEIGH_UPDATE_F_OVERRIDE			0x00000001
178#define NEIGH_UPDATE_F_WEAK_OVERRIDE		0x00000002
179#define NEIGH_UPDATE_F_OVERRIDE_ISROUTER	0x00000004
180#define NEIGH_UPDATE_F_ISROUTER			0x40000000
181#define NEIGH_UPDATE_F_ADMIN			0x80000000
182
183extern void			neigh_table_init(struct neigh_table *tbl);
184extern void			neigh_table_init_no_netlink(struct neigh_table *tbl);
185extern int			neigh_table_clear(struct neigh_table *tbl);
186extern struct neighbour *	neigh_lookup(struct neigh_table *tbl,
187					     const void *pkey,
188					     struct net_device *dev);
189extern struct neighbour *	neigh_lookup_nodev(struct neigh_table *tbl,
190						   const void *pkey);
191extern struct neighbour *	neigh_create(struct neigh_table *tbl,
192					     const void *pkey,
193					     struct net_device *dev);
194extern void			neigh_destroy(struct neighbour *neigh);
195extern int			__neigh_event_send(struct neighbour *neigh, struct sk_buff *skb);
196extern int			neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
197					     u32 flags);
198extern void			neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev);
199extern int			neigh_ifdown(struct neigh_table *tbl, struct net_device *dev);
200extern int			neigh_resolve_output(struct sk_buff *skb);
201extern int			neigh_connected_output(struct sk_buff *skb);
202extern int			neigh_compat_output(struct sk_buff *skb);
203extern struct neighbour 	*neigh_event_ns(struct neigh_table *tbl,
204						u8 *lladdr, void *saddr,
205						struct net_device *dev);
206
207extern struct neigh_parms	*neigh_parms_alloc(struct net_device *dev, struct neigh_table *tbl);
208extern void			neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms);
209extern void			neigh_parms_destroy(struct neigh_parms *parms);
210extern unsigned long		neigh_rand_reach_time(unsigned long base);
211
212extern void			pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
213					       struct sk_buff *skb);
214extern struct pneigh_entry	*pneigh_lookup(struct neigh_table *tbl, const void *key, struct net_device *dev, int creat);
215extern int			pneigh_delete(struct neigh_table *tbl, const void *key, struct net_device *dev);
216
217extern void neigh_app_ns(struct neighbour *n);
218extern void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie);
219extern void __neigh_for_each_release(struct neigh_table *tbl, int (*cb)(struct neighbour *));
220extern void pneigh_for_each(struct neigh_table *tbl, void (*cb)(struct pneigh_entry *));
221
222struct neigh_seq_state {
223	struct neigh_table *tbl;
224	void *(*neigh_sub_iter)(struct neigh_seq_state *state,
225				struct neighbour *n, loff_t *pos);
226	unsigned int bucket;
227	unsigned int flags;
228#define NEIGH_SEQ_NEIGH_ONLY	0x00000001
229#define NEIGH_SEQ_IS_PNEIGH	0x00000002
230#define NEIGH_SEQ_SKIP_NOARP	0x00000004
231};
232extern void *neigh_seq_start(struct seq_file *, loff_t *, struct neigh_table *, unsigned int);
233extern void *neigh_seq_next(struct seq_file *, void *, loff_t *);
234extern void neigh_seq_stop(struct seq_file *, void *);
235
236extern int			neigh_sysctl_register(struct net_device *dev,
237						      struct neigh_parms *p,
238						      int p_id, int pdev_id,
239						      char *p_name,
240						      proc_handler *proc_handler,
241						      ctl_handler *strategy);
242extern void			neigh_sysctl_unregister(struct neigh_parms *p);
243
244static inline void __neigh_parms_put(struct neigh_parms *parms)
245{
246	atomic_dec(&parms->refcnt);
247}
248
249static inline void neigh_parms_put(struct neigh_parms *parms)
250{
251	if (atomic_dec_and_test(&parms->refcnt))
252		neigh_parms_destroy(parms);
253}
254
255static inline struct neigh_parms *neigh_parms_clone(struct neigh_parms *parms)
256{
257	atomic_inc(&parms->refcnt);
258	return parms;
259}
260
261/*
262 *	Neighbour references
263 */
264
265static inline void neigh_release(struct neighbour *neigh)
266{
267	if (atomic_dec_and_test(&neigh->refcnt))
268		neigh_destroy(neigh);
269}
270
271static inline struct neighbour * neigh_clone(struct neighbour *neigh)
272{
273	if (neigh)
274		atomic_inc(&neigh->refcnt);
275	return neigh;
276}
277
278#define neigh_hold(n)	atomic_inc(&(n)->refcnt)
279
280static inline void neigh_confirm(struct neighbour *neigh)
281{
282	if (neigh)
283		neigh->confirmed = jiffies;
284}
285
286static inline int neigh_is_connected(struct neighbour *neigh)
287{
288	return neigh->nud_state&NUD_CONNECTED;
289}
290
291static inline int neigh_is_valid(struct neighbour *neigh)
292{
293	return neigh->nud_state&NUD_VALID;
294}
295
296static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
297{
298	neigh->used = jiffies;
299	if (!(neigh->nud_state&(NUD_CONNECTED|NUD_DELAY|NUD_PROBE)))
300		return __neigh_event_send(neigh, skb);
301	return 0;
302}
303
304static inline int neigh_hh_output(struct hh_cache *hh, struct sk_buff *skb)
305{
306	unsigned seq;
307	int hh_len;
308
309	do {
310		int hh_alen;
311
312		seq = read_seqbegin(&hh->hh_lock);
313		hh_len = hh->hh_len;
314		hh_alen = HH_DATA_ALIGN(hh_len);
315		memcpy(skb->data - hh_alen, hh->hh_data, hh_alen);
316	} while (read_seqretry(&hh->hh_lock, seq));
317
318	skb_push(skb, hh_len);
319	return hh->hh_output(skb);
320}
321
322static inline struct neighbour *
323__neigh_lookup(struct neigh_table *tbl, const void *pkey, struct net_device *dev, int creat)
324{
325	struct neighbour *n = neigh_lookup(tbl, pkey, dev);
326
327	if (n || !creat)
328		return n;
329
330	n = neigh_create(tbl, pkey, dev);
331	return IS_ERR(n) ? NULL : n;
332}
333
334static inline struct neighbour *
335__neigh_lookup_errno(struct neigh_table *tbl, const void *pkey,
336  struct net_device *dev)
337{
338	struct neighbour *n = neigh_lookup(tbl, pkey, dev);
339
340	if (n)
341		return n;
342
343	return neigh_create(tbl, pkey, dev);
344}
345
346struct neighbour_cb {
347	unsigned long sched_next;
348	unsigned int flags;
349};
350
351#define LOCALLY_ENQUEUED 0x1
352
353#define NEIGH_CB(skb)	((struct neighbour_cb *)(skb)->cb)
354
355#endif
356