arp.c revision 6b175b26c1048d331508940ad3516ead1998084f
1/* linux/net/ipv4/arp.c
2 *
3 * Version:	$Id: arp.c,v 1.99 2001/08/30 22:55:42 davem Exp $
4 *
5 * Copyright (C) 1994 by Florian  La Roche
6 *
7 * This module implements the Address Resolution Protocol ARP (RFC 826),
8 * which is used to convert IP addresses (or in the future maybe other
9 * high-level addresses) into a low-level hardware address (like an Ethernet
10 * address).
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version
15 * 2 of the License, or (at your option) any later version.
16 *
17 * Fixes:
18 *		Alan Cox	:	Removed the Ethernet assumptions in
19 *					Florian's code
20 *		Alan Cox	:	Fixed some small errors in the ARP
21 *					logic
22 *		Alan Cox	:	Allow >4K in /proc
23 *		Alan Cox	:	Make ARP add its own protocol entry
24 *		Ross Martin     :       Rewrote arp_rcv() and arp_get_info()
25 *		Stephen Henson	:	Add AX25 support to arp_get_info()
26 *		Alan Cox	:	Drop data when a device is downed.
27 *		Alan Cox	:	Use init_timer().
28 *		Alan Cox	:	Double lock fixes.
29 *		Martin Seine	:	Move the arphdr structure
30 *					to if_arp.h for compatibility.
31 *					with BSD based programs.
32 *		Andrew Tridgell :       Added ARP netmask code and
33 *					re-arranged proxy handling.
34 *		Alan Cox	:	Changed to use notifiers.
35 *		Niibe Yutaka	:	Reply for this device or proxies only.
36 *		Alan Cox	:	Don't proxy across hardware types!
37 *		Jonathan Naylor :	Added support for NET/ROM.
38 *		Mike Shaver     :       RFC1122 checks.
39 *		Jonathan Naylor :	Only lookup the hardware address for
40 *					the correct hardware type.
41 *		Germano Caronni	:	Assorted subtle races.
42 *		Craig Schlenter :	Don't modify permanent entry
43 *					during arp_rcv.
44 *		Russ Nelson	:	Tidied up a few bits.
45 *		Alexey Kuznetsov:	Major changes to caching and behaviour,
46 *					eg intelligent arp probing and
47 *					generation
48 *					of host down events.
49 *		Alan Cox	:	Missing unlock in device events.
50 *		Eckes		:	ARP ioctl control errors.
51 *		Alexey Kuznetsov:	Arp free fix.
52 *		Manuel Rodriguez:	Gratuitous ARP.
53 *              Jonathan Layes  :       Added arpd support through kerneld
54 *                                      message queue (960314)
55 *		Mike Shaver	:	/proc/sys/net/ipv4/arp_* support
56 *		Mike McLagan    :	Routing by source
57 *		Stuart Cheshire	:	Metricom and grat arp fixes
58 *					*** FOR 2.1 clean this up ***
59 *		Lawrence V. Stefani: (08/12/96) Added FDDI support.
60 *		Alan Cox 	:	Took the AP1000 nasty FDDI hack and
61 *					folded into the mainstream FDDI code.
62 *					Ack spit, Linus how did you allow that
63 *					one in...
64 *		Jes Sorensen	:	Make FDDI work again in 2.1.x and
65 *					clean up the APFDDI & gen. FDDI bits.
66 *		Alexey Kuznetsov:	new arp state machine;
67 *					now it is in net/core/neighbour.c.
68 *		Krzysztof Halasa:	Added Frame Relay ARP support.
69 *		Arnaldo C. Melo :	convert /proc/net/arp to seq_file
70 *		Shmulik Hen:		Split arp_send to arp_create and
71 *					arp_xmit so intermediate drivers like
72 *					bonding can change the skb before
73 *					sending (e.g. insert 8021q tag).
74 *		Harald Welte	:	convert to make use of jenkins hash
75 */
76
77#include <linux/module.h>
78#include <linux/types.h>
79#include <linux/string.h>
80#include <linux/kernel.h>
81#include <linux/capability.h>
82#include <linux/socket.h>
83#include <linux/sockios.h>
84#include <linux/errno.h>
85#include <linux/in.h>
86#include <linux/mm.h>
87#include <linux/inet.h>
88#include <linux/inetdevice.h>
89#include <linux/netdevice.h>
90#include <linux/etherdevice.h>
91#include <linux/fddidevice.h>
92#include <linux/if_arp.h>
93#include <linux/trdevice.h>
94#include <linux/skbuff.h>
95#include <linux/proc_fs.h>
96#include <linux/seq_file.h>
97#include <linux/stat.h>
98#include <linux/init.h>
99#include <linux/net.h>
100#include <linux/rcupdate.h>
101#include <linux/jhash.h>
102#ifdef CONFIG_SYSCTL
103#include <linux/sysctl.h>
104#endif
105
106#include <net/net_namespace.h>
107#include <net/ip.h>
108#include <net/icmp.h>
109#include <net/route.h>
110#include <net/protocol.h>
111#include <net/tcp.h>
112#include <net/sock.h>
113#include <net/arp.h>
114#include <net/ax25.h>
115#include <net/netrom.h>
116#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
117#include <net/atmclip.h>
118struct neigh_table *clip_tbl_hook;
119#endif
120
121#include <asm/system.h>
122#include <asm/uaccess.h>
123
124#include <linux/netfilter_arp.h>
125
126/*
127 *	Interface to generic neighbour cache.
128 */
129static u32 arp_hash(const void *pkey, const struct net_device *dev);
130static int arp_constructor(struct neighbour *neigh);
131static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb);
132static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb);
133static void parp_redo(struct sk_buff *skb);
134
135static struct neigh_ops arp_generic_ops = {
136	.family =		AF_INET,
137	.solicit =		arp_solicit,
138	.error_report =		arp_error_report,
139	.output =		neigh_resolve_output,
140	.connected_output =	neigh_connected_output,
141	.hh_output =		dev_queue_xmit,
142	.queue_xmit =		dev_queue_xmit,
143};
144
145static struct neigh_ops arp_hh_ops = {
146	.family =		AF_INET,
147	.solicit =		arp_solicit,
148	.error_report =		arp_error_report,
149	.output =		neigh_resolve_output,
150	.connected_output =	neigh_resolve_output,
151	.hh_output =		dev_queue_xmit,
152	.queue_xmit =		dev_queue_xmit,
153};
154
155static struct neigh_ops arp_direct_ops = {
156	.family =		AF_INET,
157	.output =		dev_queue_xmit,
158	.connected_output =	dev_queue_xmit,
159	.hh_output =		dev_queue_xmit,
160	.queue_xmit =		dev_queue_xmit,
161};
162
163struct neigh_ops arp_broken_ops = {
164	.family =		AF_INET,
165	.solicit =		arp_solicit,
166	.error_report =		arp_error_report,
167	.output =		neigh_compat_output,
168	.connected_output =	neigh_compat_output,
169	.hh_output =		dev_queue_xmit,
170	.queue_xmit =		dev_queue_xmit,
171};
172
173struct neigh_table arp_tbl = {
174	.family =	AF_INET,
175	.entry_size =	sizeof(struct neighbour) + 4,
176	.key_len =	4,
177	.hash =		arp_hash,
178	.constructor =	arp_constructor,
179	.proxy_redo =	parp_redo,
180	.id =		"arp_cache",
181	.parms = {
182		.tbl =			&arp_tbl,
183		.base_reachable_time =	30 * HZ,
184		.retrans_time =	1 * HZ,
185		.gc_staletime =	60 * HZ,
186		.reachable_time =		30 * HZ,
187		.delay_probe_time =	5 * HZ,
188		.queue_len =		3,
189		.ucast_probes =	3,
190		.mcast_probes =	3,
191		.anycast_delay =	1 * HZ,
192		.proxy_delay =		(8 * HZ) / 10,
193		.proxy_qlen =		64,
194		.locktime =		1 * HZ,
195	},
196	.gc_interval =	30 * HZ,
197	.gc_thresh1 =	128,
198	.gc_thresh2 =	512,
199	.gc_thresh3 =	1024,
200};
201
202int arp_mc_map(__be32 addr, u8 *haddr, struct net_device *dev, int dir)
203{
204	switch (dev->type) {
205	case ARPHRD_ETHER:
206	case ARPHRD_FDDI:
207	case ARPHRD_IEEE802:
208		ip_eth_mc_map(addr, haddr);
209		return 0;
210	case ARPHRD_IEEE802_TR:
211		ip_tr_mc_map(addr, haddr);
212		return 0;
213	case ARPHRD_INFINIBAND:
214		ip_ib_mc_map(addr, dev->broadcast, haddr);
215		return 0;
216	default:
217		if (dir) {
218			memcpy(haddr, dev->broadcast, dev->addr_len);
219			return 0;
220		}
221	}
222	return -EINVAL;
223}
224
225
226static u32 arp_hash(const void *pkey, const struct net_device *dev)
227{
228	return jhash_2words(*(u32 *)pkey, dev->ifindex, arp_tbl.hash_rnd);
229}
230
231static int arp_constructor(struct neighbour *neigh)
232{
233	__be32 addr = *(__be32*)neigh->primary_key;
234	struct net_device *dev = neigh->dev;
235	struct in_device *in_dev;
236	struct neigh_parms *parms;
237
238	neigh->type = inet_addr_type(&init_net, addr);
239
240	rcu_read_lock();
241	in_dev = __in_dev_get_rcu(dev);
242	if (in_dev == NULL) {
243		rcu_read_unlock();
244		return -EINVAL;
245	}
246
247	parms = in_dev->arp_parms;
248	__neigh_parms_put(neigh->parms);
249	neigh->parms = neigh_parms_clone(parms);
250	rcu_read_unlock();
251
252	if (!dev->header_ops) {
253		neigh->nud_state = NUD_NOARP;
254		neigh->ops = &arp_direct_ops;
255		neigh->output = neigh->ops->queue_xmit;
256	} else {
257		/* Good devices (checked by reading texts, but only Ethernet is
258		   tested)
259
260		   ARPHRD_ETHER: (ethernet, apfddi)
261		   ARPHRD_FDDI: (fddi)
262		   ARPHRD_IEEE802: (tr)
263		   ARPHRD_METRICOM: (strip)
264		   ARPHRD_ARCNET:
265		   etc. etc. etc.
266
267		   ARPHRD_IPDDP will also work, if author repairs it.
268		   I did not it, because this driver does not work even
269		   in old paradigm.
270		 */
271
272#if 1
273		/* So... these "amateur" devices are hopeless.
274		   The only thing, that I can say now:
275		   It is very sad that we need to keep ugly obsolete
276		   code to make them happy.
277
278		   They should be moved to more reasonable state, now
279		   they use rebuild_header INSTEAD OF hard_start_xmit!!!
280		   Besides that, they are sort of out of date
281		   (a lot of redundant clones/copies, useless in 2.1),
282		   I wonder why people believe that they work.
283		 */
284		switch (dev->type) {
285		default:
286			break;
287		case ARPHRD_ROSE:
288#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
289		case ARPHRD_AX25:
290#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
291		case ARPHRD_NETROM:
292#endif
293			neigh->ops = &arp_broken_ops;
294			neigh->output = neigh->ops->output;
295			return 0;
296#endif
297		;}
298#endif
299		if (neigh->type == RTN_MULTICAST) {
300			neigh->nud_state = NUD_NOARP;
301			arp_mc_map(addr, neigh->ha, dev, 1);
302		} else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) {
303			neigh->nud_state = NUD_NOARP;
304			memcpy(neigh->ha, dev->dev_addr, dev->addr_len);
305		} else if (neigh->type == RTN_BROADCAST || dev->flags&IFF_POINTOPOINT) {
306			neigh->nud_state = NUD_NOARP;
307			memcpy(neigh->ha, dev->broadcast, dev->addr_len);
308		}
309
310		if (dev->header_ops->cache)
311			neigh->ops = &arp_hh_ops;
312		else
313			neigh->ops = &arp_generic_ops;
314
315		if (neigh->nud_state&NUD_VALID)
316			neigh->output = neigh->ops->connected_output;
317		else
318			neigh->output = neigh->ops->output;
319	}
320	return 0;
321}
322
323static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb)
324{
325	dst_link_failure(skb);
326	kfree_skb(skb);
327}
328
329static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
330{
331	__be32 saddr = 0;
332	u8  *dst_ha = NULL;
333	struct net_device *dev = neigh->dev;
334	__be32 target = *(__be32*)neigh->primary_key;
335	int probes = atomic_read(&neigh->probes);
336	struct in_device *in_dev = in_dev_get(dev);
337
338	if (!in_dev)
339		return;
340
341	switch (IN_DEV_ARP_ANNOUNCE(in_dev)) {
342	default:
343	case 0:		/* By default announce any local IP */
344		if (skb && inet_addr_type(&init_net, ip_hdr(skb)->saddr) == RTN_LOCAL)
345			saddr = ip_hdr(skb)->saddr;
346		break;
347	case 1:		/* Restrict announcements of saddr in same subnet */
348		if (!skb)
349			break;
350		saddr = ip_hdr(skb)->saddr;
351		if (inet_addr_type(&init_net, saddr) == RTN_LOCAL) {
352			/* saddr should be known to target */
353			if (inet_addr_onlink(in_dev, target, saddr))
354				break;
355		}
356		saddr = 0;
357		break;
358	case 2:		/* Avoid secondary IPs, get a primary/preferred one */
359		break;
360	}
361
362	if (in_dev)
363		in_dev_put(in_dev);
364	if (!saddr)
365		saddr = inet_select_addr(dev, target, RT_SCOPE_LINK);
366
367	if ((probes -= neigh->parms->ucast_probes) < 0) {
368		if (!(neigh->nud_state&NUD_VALID))
369			printk(KERN_DEBUG "trying to ucast probe in NUD_INVALID\n");
370		dst_ha = neigh->ha;
371		read_lock_bh(&neigh->lock);
372	} else if ((probes -= neigh->parms->app_probes) < 0) {
373#ifdef CONFIG_ARPD
374		neigh_app_ns(neigh);
375#endif
376		return;
377	}
378
379	arp_send(ARPOP_REQUEST, ETH_P_ARP, target, dev, saddr,
380		 dst_ha, dev->dev_addr, NULL);
381	if (dst_ha)
382		read_unlock_bh(&neigh->lock);
383}
384
385static int arp_ignore(struct in_device *in_dev, struct net_device *dev,
386		      __be32 sip, __be32 tip)
387{
388	int scope;
389
390	switch (IN_DEV_ARP_IGNORE(in_dev)) {
391	case 0:	/* Reply, the tip is already validated */
392		return 0;
393	case 1:	/* Reply only if tip is configured on the incoming interface */
394		sip = 0;
395		scope = RT_SCOPE_HOST;
396		break;
397	case 2:	/*
398		 * Reply only if tip is configured on the incoming interface
399		 * and is in same subnet as sip
400		 */
401		scope = RT_SCOPE_HOST;
402		break;
403	case 3:	/* Do not reply for scope host addresses */
404		sip = 0;
405		scope = RT_SCOPE_LINK;
406		dev = NULL;
407		break;
408	case 4:	/* Reserved */
409	case 5:
410	case 6:
411	case 7:
412		return 0;
413	case 8:	/* Do not reply */
414		return 1;
415	default:
416		return 0;
417	}
418	return !inet_confirm_addr(dev, sip, tip, scope);
419}
420
421static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)
422{
423	struct flowi fl = { .nl_u = { .ip4_u = { .daddr = sip,
424						 .saddr = tip } } };
425	struct rtable *rt;
426	int flag = 0;
427	/*unsigned long now; */
428
429	if (ip_route_output_key(&rt, &fl) < 0)
430		return 1;
431	if (rt->u.dst.dev != dev) {
432		NET_INC_STATS_BH(LINUX_MIB_ARPFILTER);
433		flag = 1;
434	}
435	ip_rt_put(rt);
436	return flag;
437}
438
439/* OBSOLETE FUNCTIONS */
440
441/*
442 *	Find an arp mapping in the cache. If not found, post a request.
443 *
444 *	It is very UGLY routine: it DOES NOT use skb->dst->neighbour,
445 *	even if it exists. It is supposed that skb->dev was mangled
446 *	by a virtual device (eql, shaper). Nobody but broken devices
447 *	is allowed to use this function, it is scheduled to be removed. --ANK
448 */
449
450static int arp_set_predefined(int addr_hint, unsigned char * haddr, __be32 paddr, struct net_device * dev)
451{
452	switch (addr_hint) {
453	case RTN_LOCAL:
454		printk(KERN_DEBUG "ARP: arp called for own IP address\n");
455		memcpy(haddr, dev->dev_addr, dev->addr_len);
456		return 1;
457	case RTN_MULTICAST:
458		arp_mc_map(paddr, haddr, dev, 1);
459		return 1;
460	case RTN_BROADCAST:
461		memcpy(haddr, dev->broadcast, dev->addr_len);
462		return 1;
463	}
464	return 0;
465}
466
467
468int arp_find(unsigned char *haddr, struct sk_buff *skb)
469{
470	struct net_device *dev = skb->dev;
471	__be32 paddr;
472	struct neighbour *n;
473
474	if (!skb->dst) {
475		printk(KERN_DEBUG "arp_find is called with dst==NULL\n");
476		kfree_skb(skb);
477		return 1;
478	}
479
480	paddr = ((struct rtable*)skb->dst)->rt_gateway;
481
482	if (arp_set_predefined(inet_addr_type(&init_net, paddr), haddr, paddr, dev))
483		return 0;
484
485	n = __neigh_lookup(&arp_tbl, &paddr, dev, 1);
486
487	if (n) {
488		n->used = jiffies;
489		if (n->nud_state&NUD_VALID || neigh_event_send(n, skb) == 0) {
490			read_lock_bh(&n->lock);
491			memcpy(haddr, n->ha, dev->addr_len);
492			read_unlock_bh(&n->lock);
493			neigh_release(n);
494			return 0;
495		}
496		neigh_release(n);
497	} else
498		kfree_skb(skb);
499	return 1;
500}
501
502/* END OF OBSOLETE FUNCTIONS */
503
504int arp_bind_neighbour(struct dst_entry *dst)
505{
506	struct net_device *dev = dst->dev;
507	struct neighbour *n = dst->neighbour;
508
509	if (dev == NULL)
510		return -EINVAL;
511	if (n == NULL) {
512		__be32 nexthop = ((struct rtable*)dst)->rt_gateway;
513		if (dev->flags&(IFF_LOOPBACK|IFF_POINTOPOINT))
514			nexthop = 0;
515		n = __neigh_lookup_errno(
516#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
517		    dev->type == ARPHRD_ATM ? clip_tbl_hook :
518#endif
519		    &arp_tbl, &nexthop, dev);
520		if (IS_ERR(n))
521			return PTR_ERR(n);
522		dst->neighbour = n;
523	}
524	return 0;
525}
526
527/*
528 * Check if we can use proxy ARP for this path
529 */
530
531static inline int arp_fwd_proxy(struct in_device *in_dev, struct rtable *rt)
532{
533	struct in_device *out_dev;
534	int imi, omi = -1;
535
536	if (!IN_DEV_PROXY_ARP(in_dev))
537		return 0;
538
539	if ((imi = IN_DEV_MEDIUM_ID(in_dev)) == 0)
540		return 1;
541	if (imi == -1)
542		return 0;
543
544	/* place to check for proxy_arp for routes */
545
546	if ((out_dev = in_dev_get(rt->u.dst.dev)) != NULL) {
547		omi = IN_DEV_MEDIUM_ID(out_dev);
548		in_dev_put(out_dev);
549	}
550	return (omi != imi && omi != -1);
551}
552
553/*
554 *	Interface to link layer: send routine and receive handler.
555 */
556
557/*
558 *	Create an arp packet. If (dest_hw == NULL), we create a broadcast
559 *	message.
560 */
561struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip,
562			   struct net_device *dev, __be32 src_ip,
563			   unsigned char *dest_hw, unsigned char *src_hw,
564			   unsigned char *target_hw)
565{
566	struct sk_buff *skb;
567	struct arphdr *arp;
568	unsigned char *arp_ptr;
569
570	/*
571	 *	Allocate a buffer
572	 */
573
574	skb = alloc_skb(sizeof(struct arphdr)+ 2*(dev->addr_len+4)
575				+ LL_RESERVED_SPACE(dev), GFP_ATOMIC);
576	if (skb == NULL)
577		return NULL;
578
579	skb_reserve(skb, LL_RESERVED_SPACE(dev));
580	skb_reset_network_header(skb);
581	arp = (struct arphdr *) skb_put(skb,sizeof(struct arphdr) + 2*(dev->addr_len+4));
582	skb->dev = dev;
583	skb->protocol = htons(ETH_P_ARP);
584	if (src_hw == NULL)
585		src_hw = dev->dev_addr;
586	if (dest_hw == NULL)
587		dest_hw = dev->broadcast;
588
589	/*
590	 *	Fill the device header for the ARP frame
591	 */
592	if (dev_hard_header(skb, dev, ptype, dest_hw, src_hw, skb->len) < 0)
593		goto out;
594
595	/*
596	 * Fill out the arp protocol part.
597	 *
598	 * The arp hardware type should match the device type, except for FDDI,
599	 * which (according to RFC 1390) should always equal 1 (Ethernet).
600	 */
601	/*
602	 *	Exceptions everywhere. AX.25 uses the AX.25 PID value not the
603	 *	DIX code for the protocol. Make these device structure fields.
604	 */
605	switch (dev->type) {
606	default:
607		arp->ar_hrd = htons(dev->type);
608		arp->ar_pro = htons(ETH_P_IP);
609		break;
610
611#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
612	case ARPHRD_AX25:
613		arp->ar_hrd = htons(ARPHRD_AX25);
614		arp->ar_pro = htons(AX25_P_IP);
615		break;
616
617#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
618	case ARPHRD_NETROM:
619		arp->ar_hrd = htons(ARPHRD_NETROM);
620		arp->ar_pro = htons(AX25_P_IP);
621		break;
622#endif
623#endif
624
625#ifdef CONFIG_FDDI
626	case ARPHRD_FDDI:
627		arp->ar_hrd = htons(ARPHRD_ETHER);
628		arp->ar_pro = htons(ETH_P_IP);
629		break;
630#endif
631#ifdef CONFIG_TR
632	case ARPHRD_IEEE802_TR:
633		arp->ar_hrd = htons(ARPHRD_IEEE802);
634		arp->ar_pro = htons(ETH_P_IP);
635		break;
636#endif
637	}
638
639	arp->ar_hln = dev->addr_len;
640	arp->ar_pln = 4;
641	arp->ar_op = htons(type);
642
643	arp_ptr=(unsigned char *)(arp+1);
644
645	memcpy(arp_ptr, src_hw, dev->addr_len);
646	arp_ptr+=dev->addr_len;
647	memcpy(arp_ptr, &src_ip,4);
648	arp_ptr+=4;
649	if (target_hw != NULL)
650		memcpy(arp_ptr, target_hw, dev->addr_len);
651	else
652		memset(arp_ptr, 0, dev->addr_len);
653	arp_ptr+=dev->addr_len;
654	memcpy(arp_ptr, &dest_ip, 4);
655
656	return skb;
657
658out:
659	kfree_skb(skb);
660	return NULL;
661}
662
663/*
664 *	Send an arp packet.
665 */
666void arp_xmit(struct sk_buff *skb)
667{
668	/* Send it off, maybe filter it using firewalling first.  */
669	NF_HOOK(NF_ARP, NF_ARP_OUT, skb, NULL, skb->dev, dev_queue_xmit);
670}
671
672/*
673 *	Create and send an arp packet.
674 */
675void arp_send(int type, int ptype, __be32 dest_ip,
676	      struct net_device *dev, __be32 src_ip,
677	      unsigned char *dest_hw, unsigned char *src_hw,
678	      unsigned char *target_hw)
679{
680	struct sk_buff *skb;
681
682	/*
683	 *	No arp on this interface.
684	 */
685
686	if (dev->flags&IFF_NOARP)
687		return;
688
689	skb = arp_create(type, ptype, dest_ip, dev, src_ip,
690			 dest_hw, src_hw, target_hw);
691	if (skb == NULL) {
692		return;
693	}
694
695	arp_xmit(skb);
696}
697
698/*
699 *	Process an arp request.
700 */
701
702static int arp_process(struct sk_buff *skb)
703{
704	struct net_device *dev = skb->dev;
705	struct in_device *in_dev = in_dev_get(dev);
706	struct arphdr *arp;
707	unsigned char *arp_ptr;
708	struct rtable *rt;
709	unsigned char *sha;
710	__be32 sip, tip;
711	u16 dev_type = dev->type;
712	int addr_type;
713	struct neighbour *n;
714
715	/* arp_rcv below verifies the ARP header and verifies the device
716	 * is ARP'able.
717	 */
718
719	if (in_dev == NULL)
720		goto out;
721
722	arp = arp_hdr(skb);
723
724	switch (dev_type) {
725	default:
726		if (arp->ar_pro != htons(ETH_P_IP) ||
727		    htons(dev_type) != arp->ar_hrd)
728			goto out;
729		break;
730	case ARPHRD_ETHER:
731	case ARPHRD_IEEE802_TR:
732	case ARPHRD_FDDI:
733	case ARPHRD_IEEE802:
734		/*
735		 * ETHERNET, Token Ring and Fibre Channel (which are IEEE 802
736		 * devices, according to RFC 2625) devices will accept ARP
737		 * hardware types of either 1 (Ethernet) or 6 (IEEE 802.2).
738		 * This is the case also of FDDI, where the RFC 1390 says that
739		 * FDDI devices should accept ARP hardware of (1) Ethernet,
740		 * however, to be more robust, we'll accept both 1 (Ethernet)
741		 * or 6 (IEEE 802.2)
742		 */
743		if ((arp->ar_hrd != htons(ARPHRD_ETHER) &&
744		     arp->ar_hrd != htons(ARPHRD_IEEE802)) ||
745		    arp->ar_pro != htons(ETH_P_IP))
746			goto out;
747		break;
748	case ARPHRD_AX25:
749		if (arp->ar_pro != htons(AX25_P_IP) ||
750		    arp->ar_hrd != htons(ARPHRD_AX25))
751			goto out;
752		break;
753	case ARPHRD_NETROM:
754		if (arp->ar_pro != htons(AX25_P_IP) ||
755		    arp->ar_hrd != htons(ARPHRD_NETROM))
756			goto out;
757		break;
758	}
759
760	/* Understand only these message types */
761
762	if (arp->ar_op != htons(ARPOP_REPLY) &&
763	    arp->ar_op != htons(ARPOP_REQUEST))
764		goto out;
765
766/*
767 *	Extract fields
768 */
769	arp_ptr= (unsigned char *)(arp+1);
770	sha	= arp_ptr;
771	arp_ptr += dev->addr_len;
772	memcpy(&sip, arp_ptr, 4);
773	arp_ptr += 4;
774	arp_ptr += dev->addr_len;
775	memcpy(&tip, arp_ptr, 4);
776/*
777 *	Check for bad requests for 127.x.x.x and requests for multicast
778 *	addresses.  If this is one such, delete it.
779 */
780	if (ipv4_is_loopback(tip) || ipv4_is_multicast(tip))
781		goto out;
782
783/*
784 *     Special case: We must set Frame Relay source Q.922 address
785 */
786	if (dev_type == ARPHRD_DLCI)
787		sha = dev->broadcast;
788
789/*
790 *  Process entry.  The idea here is we want to send a reply if it is a
791 *  request for us or if it is a request for someone else that we hold
792 *  a proxy for.  We want to add an entry to our cache if it is a reply
793 *  to us or if it is a request for our address.
794 *  (The assumption for this last is that if someone is requesting our
795 *  address, they are probably intending to talk to us, so it saves time
796 *  if we cache their address.  Their address is also probably not in
797 *  our cache, since ours is not in their cache.)
798 *
799 *  Putting this another way, we only care about replies if they are to
800 *  us, in which case we add them to the cache.  For requests, we care
801 *  about those for us and those for our proxies.  We reply to both,
802 *  and in the case of requests for us we add the requester to the arp
803 *  cache.
804 */
805
806	/* Special case: IPv4 duplicate address detection packet (RFC2131) */
807	if (sip == 0) {
808		if (arp->ar_op == htons(ARPOP_REQUEST) &&
809		    inet_addr_type(&init_net, tip) == RTN_LOCAL &&
810		    !arp_ignore(in_dev,dev,sip,tip))
811			arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
812				 dev->dev_addr, sha);
813		goto out;
814	}
815
816	if (arp->ar_op == htons(ARPOP_REQUEST) &&
817	    ip_route_input(skb, tip, sip, 0, dev) == 0) {
818
819		rt = (struct rtable*)skb->dst;
820		addr_type = rt->rt_type;
821
822		if (addr_type == RTN_LOCAL) {
823			n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
824			if (n) {
825				int dont_send = 0;
826
827				if (!dont_send)
828					dont_send |= arp_ignore(in_dev,dev,sip,tip);
829				if (!dont_send && IN_DEV_ARPFILTER(in_dev))
830					dont_send |= arp_filter(sip,tip,dev);
831				if (!dont_send)
832					arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);
833
834				neigh_release(n);
835			}
836			goto out;
837		} else if (IN_DEV_FORWARD(in_dev)) {
838			    if (addr_type == RTN_UNICAST  && rt->u.dst.dev != dev &&
839			     (arp_fwd_proxy(in_dev, rt) || pneigh_lookup(&arp_tbl, &init_net, &tip, dev, 0))) {
840				n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
841				if (n)
842					neigh_release(n);
843
844				if (NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED ||
845				    skb->pkt_type == PACKET_HOST ||
846				    in_dev->arp_parms->proxy_delay == 0) {
847					arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);
848				} else {
849					pneigh_enqueue(&arp_tbl, in_dev->arp_parms, skb);
850					in_dev_put(in_dev);
851					return 0;
852				}
853				goto out;
854			}
855		}
856	}
857
858	/* Update our ARP tables */
859
860	n = __neigh_lookup(&arp_tbl, &sip, dev, 0);
861
862	if (IPV4_DEVCONF_ALL(dev->nd_net, ARP_ACCEPT)) {
863		/* Unsolicited ARP is not accepted by default.
864		   It is possible, that this option should be enabled for some
865		   devices (strip is candidate)
866		 */
867		if (n == NULL &&
868		    arp->ar_op == htons(ARPOP_REPLY) &&
869		    inet_addr_type(&init_net, sip) == RTN_UNICAST)
870			n = __neigh_lookup(&arp_tbl, &sip, dev, 1);
871	}
872
873	if (n) {
874		int state = NUD_REACHABLE;
875		int override;
876
877		/* If several different ARP replies follows back-to-back,
878		   use the FIRST one. It is possible, if several proxy
879		   agents are active. Taking the first reply prevents
880		   arp trashing and chooses the fastest router.
881		 */
882		override = time_after(jiffies, n->updated + n->parms->locktime);
883
884		/* Broadcast replies and request packets
885		   do not assert neighbour reachability.
886		 */
887		if (arp->ar_op != htons(ARPOP_REPLY) ||
888		    skb->pkt_type != PACKET_HOST)
889			state = NUD_STALE;
890		neigh_update(n, sha, state, override ? NEIGH_UPDATE_F_OVERRIDE : 0);
891		neigh_release(n);
892	}
893
894out:
895	if (in_dev)
896		in_dev_put(in_dev);
897	kfree_skb(skb);
898	return 0;
899}
900
901static void parp_redo(struct sk_buff *skb)
902{
903	arp_process(skb);
904}
905
906
907/*
908 *	Receive an arp request from the device layer.
909 */
910
911static int arp_rcv(struct sk_buff *skb, struct net_device *dev,
912		   struct packet_type *pt, struct net_device *orig_dev)
913{
914	struct arphdr *arp;
915
916	if (dev->nd_net != &init_net)
917		goto freeskb;
918
919	/* ARP header, plus 2 device addresses, plus 2 IP addresses.  */
920	if (!pskb_may_pull(skb, (sizeof(struct arphdr) +
921				 (2 * dev->addr_len) +
922				 (2 * sizeof(u32)))))
923		goto freeskb;
924
925	arp = arp_hdr(skb);
926	if (arp->ar_hln != dev->addr_len ||
927	    dev->flags & IFF_NOARP ||
928	    skb->pkt_type == PACKET_OTHERHOST ||
929	    skb->pkt_type == PACKET_LOOPBACK ||
930	    arp->ar_pln != 4)
931		goto freeskb;
932
933	if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
934		goto out_of_mem;
935
936	memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
937
938	return NF_HOOK(NF_ARP, NF_ARP_IN, skb, dev, NULL, arp_process);
939
940freeskb:
941	kfree_skb(skb);
942out_of_mem:
943	return 0;
944}
945
946/*
947 *	User level interface (ioctl)
948 */
949
950/*
951 *	Set (create) an ARP cache entry.
952 */
953
954static int arp_req_set_proxy(struct net *net, struct net_device *dev, int on)
955{
956	if (dev == NULL) {
957		IPV4_DEVCONF_ALL(net, PROXY_ARP) = on;
958		return 0;
959	}
960	if (__in_dev_get_rtnl(dev)) {
961		IN_DEV_CONF_SET(__in_dev_get_rtnl(dev), PROXY_ARP, on);
962		return 0;
963	}
964	return -ENXIO;
965}
966
967static int arp_req_set_public(struct net *net, struct arpreq *r,
968		struct net_device *dev)
969{
970	__be32 ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr;
971	__be32 mask = ((struct sockaddr_in *)&r->arp_netmask)->sin_addr.s_addr;
972
973	if (mask && mask != htonl(0xFFFFFFFF))
974		return -EINVAL;
975	if (!dev && (r->arp_flags & ATF_COM)) {
976		dev = dev_getbyhwaddr(&init_net, r->arp_ha.sa_family,
977				r->arp_ha.sa_data);
978		if (!dev)
979			return -ENODEV;
980	}
981	if (mask) {
982		if (pneigh_lookup(&arp_tbl, &init_net, &ip, dev, 1) == NULL)
983			return -ENOBUFS;
984		return 0;
985	}
986
987	return arp_req_set_proxy(net, dev, 1);
988}
989
990static int arp_req_set(struct net *net, struct arpreq *r,
991		struct net_device * dev)
992{
993	__be32 ip;
994	struct neighbour *neigh;
995	int err;
996
997	if (r->arp_flags & ATF_PUBL)
998		return arp_req_set_public(net, r, dev);
999
1000	ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr;
1001	if (r->arp_flags & ATF_PERM)
1002		r->arp_flags |= ATF_COM;
1003	if (dev == NULL) {
1004		struct flowi fl = { .nl_u = { .ip4_u = { .daddr = ip,
1005							 .tos = RTO_ONLINK } } };
1006		struct rtable * rt;
1007		if ((err = ip_route_output_key(&rt, &fl)) != 0)
1008			return err;
1009		dev = rt->u.dst.dev;
1010		ip_rt_put(rt);
1011		if (!dev)
1012			return -EINVAL;
1013	}
1014	switch (dev->type) {
1015#ifdef CONFIG_FDDI
1016	case ARPHRD_FDDI:
1017		/*
1018		 * According to RFC 1390, FDDI devices should accept ARP
1019		 * hardware types of 1 (Ethernet).  However, to be more
1020		 * robust, we'll accept hardware types of either 1 (Ethernet)
1021		 * or 6 (IEEE 802.2).
1022		 */
1023		if (r->arp_ha.sa_family != ARPHRD_FDDI &&
1024		    r->arp_ha.sa_family != ARPHRD_ETHER &&
1025		    r->arp_ha.sa_family != ARPHRD_IEEE802)
1026			return -EINVAL;
1027		break;
1028#endif
1029	default:
1030		if (r->arp_ha.sa_family != dev->type)
1031			return -EINVAL;
1032		break;
1033	}
1034
1035	neigh = __neigh_lookup_errno(&arp_tbl, &ip, dev);
1036	err = PTR_ERR(neigh);
1037	if (!IS_ERR(neigh)) {
1038		unsigned state = NUD_STALE;
1039		if (r->arp_flags & ATF_PERM)
1040			state = NUD_PERMANENT;
1041		err = neigh_update(neigh, (r->arp_flags&ATF_COM) ?
1042				   r->arp_ha.sa_data : NULL, state,
1043				   NEIGH_UPDATE_F_OVERRIDE|
1044				   NEIGH_UPDATE_F_ADMIN);
1045		neigh_release(neigh);
1046	}
1047	return err;
1048}
1049
1050static unsigned arp_state_to_flags(struct neighbour *neigh)
1051{
1052	unsigned flags = 0;
1053	if (neigh->nud_state&NUD_PERMANENT)
1054		flags = ATF_PERM|ATF_COM;
1055	else if (neigh->nud_state&NUD_VALID)
1056		flags = ATF_COM;
1057	return flags;
1058}
1059
1060/*
1061 *	Get an ARP cache entry.
1062 */
1063
1064static int arp_req_get(struct arpreq *r, struct net_device *dev)
1065{
1066	__be32 ip = ((struct sockaddr_in *) &r->arp_pa)->sin_addr.s_addr;
1067	struct neighbour *neigh;
1068	int err = -ENXIO;
1069
1070	neigh = neigh_lookup(&arp_tbl, &ip, dev);
1071	if (neigh) {
1072		read_lock_bh(&neigh->lock);
1073		memcpy(r->arp_ha.sa_data, neigh->ha, dev->addr_len);
1074		r->arp_flags = arp_state_to_flags(neigh);
1075		read_unlock_bh(&neigh->lock);
1076		r->arp_ha.sa_family = dev->type;
1077		strlcpy(r->arp_dev, dev->name, sizeof(r->arp_dev));
1078		neigh_release(neigh);
1079		err = 0;
1080	}
1081	return err;
1082}
1083
1084static int arp_req_delete_public(struct net *net, struct arpreq *r,
1085		struct net_device *dev)
1086{
1087	__be32 ip = ((struct sockaddr_in *) &r->arp_pa)->sin_addr.s_addr;
1088	__be32 mask = ((struct sockaddr_in *)&r->arp_netmask)->sin_addr.s_addr;
1089
1090	if (mask == htonl(0xFFFFFFFF))
1091		return pneigh_delete(&arp_tbl, &init_net, &ip, dev);
1092
1093	if (mask)
1094		return -EINVAL;
1095
1096	return arp_req_set_proxy(net, dev, 0);
1097}
1098
1099static int arp_req_delete(struct net *net, struct arpreq *r,
1100		struct net_device * dev)
1101{
1102	int err;
1103	__be32 ip;
1104	struct neighbour *neigh;
1105
1106	if (r->arp_flags & ATF_PUBL)
1107		return arp_req_delete_public(net, r, dev);
1108
1109	ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr;
1110	if (dev == NULL) {
1111		struct flowi fl = { .nl_u = { .ip4_u = { .daddr = ip,
1112							 .tos = RTO_ONLINK } } };
1113		struct rtable * rt;
1114		if ((err = ip_route_output_key(&rt, &fl)) != 0)
1115			return err;
1116		dev = rt->u.dst.dev;
1117		ip_rt_put(rt);
1118		if (!dev)
1119			return -EINVAL;
1120	}
1121	err = -ENXIO;
1122	neigh = neigh_lookup(&arp_tbl, &ip, dev);
1123	if (neigh) {
1124		if (neigh->nud_state&~NUD_NOARP)
1125			err = neigh_update(neigh, NULL, NUD_FAILED,
1126					   NEIGH_UPDATE_F_OVERRIDE|
1127					   NEIGH_UPDATE_F_ADMIN);
1128		neigh_release(neigh);
1129	}
1130	return err;
1131}
1132
1133/*
1134 *	Handle an ARP layer I/O control request.
1135 */
1136
1137int arp_ioctl(struct net *net, unsigned int cmd, void __user *arg)
1138{
1139	int err;
1140	struct arpreq r;
1141	struct net_device *dev = NULL;
1142
1143	switch (cmd) {
1144		case SIOCDARP:
1145		case SIOCSARP:
1146			if (!capable(CAP_NET_ADMIN))
1147				return -EPERM;
1148		case SIOCGARP:
1149			err = copy_from_user(&r, arg, sizeof(struct arpreq));
1150			if (err)
1151				return -EFAULT;
1152			break;
1153		default:
1154			return -EINVAL;
1155	}
1156
1157	if (r.arp_pa.sa_family != AF_INET)
1158		return -EPFNOSUPPORT;
1159
1160	if (!(r.arp_flags & ATF_PUBL) &&
1161	    (r.arp_flags & (ATF_NETMASK|ATF_DONTPUB)))
1162		return -EINVAL;
1163	if (!(r.arp_flags & ATF_NETMASK))
1164		((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr =
1165							   htonl(0xFFFFFFFFUL);
1166	rtnl_lock();
1167	if (r.arp_dev[0]) {
1168		err = -ENODEV;
1169		if ((dev = __dev_get_by_name(&init_net, r.arp_dev)) == NULL)
1170			goto out;
1171
1172		/* Mmmm... It is wrong... ARPHRD_NETROM==0 */
1173		if (!r.arp_ha.sa_family)
1174			r.arp_ha.sa_family = dev->type;
1175		err = -EINVAL;
1176		if ((r.arp_flags & ATF_COM) && r.arp_ha.sa_family != dev->type)
1177			goto out;
1178	} else if (cmd == SIOCGARP) {
1179		err = -ENODEV;
1180		goto out;
1181	}
1182
1183	switch (cmd) {
1184	case SIOCDARP:
1185		err = arp_req_delete(net, &r, dev);
1186		break;
1187	case SIOCSARP:
1188		err = arp_req_set(net, &r, dev);
1189		break;
1190	case SIOCGARP:
1191		err = arp_req_get(&r, dev);
1192		if (!err && copy_to_user(arg, &r, sizeof(r)))
1193			err = -EFAULT;
1194		break;
1195	}
1196out:
1197	rtnl_unlock();
1198	return err;
1199}
1200
1201static int arp_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1202{
1203	struct net_device *dev = ptr;
1204
1205	if (dev->nd_net != &init_net)
1206		return NOTIFY_DONE;
1207
1208	switch (event) {
1209	case NETDEV_CHANGEADDR:
1210		neigh_changeaddr(&arp_tbl, dev);
1211		rt_cache_flush(0);
1212		break;
1213	default:
1214		break;
1215	}
1216
1217	return NOTIFY_DONE;
1218}
1219
1220static struct notifier_block arp_netdev_notifier = {
1221	.notifier_call = arp_netdev_event,
1222};
1223
1224/* Note, that it is not on notifier chain.
1225   It is necessary, that this routine was called after route cache will be
1226   flushed.
1227 */
1228void arp_ifdown(struct net_device *dev)
1229{
1230	neigh_ifdown(&arp_tbl, dev);
1231}
1232
1233
1234/*
1235 *	Called once on startup.
1236 */
1237
1238static struct packet_type arp_packet_type = {
1239	.type =	__constant_htons(ETH_P_ARP),
1240	.func =	arp_rcv,
1241};
1242
1243static int arp_proc_init(void);
1244
1245void __init arp_init(void)
1246{
1247	neigh_table_init(&arp_tbl);
1248
1249	dev_add_pack(&arp_packet_type);
1250	arp_proc_init();
1251#ifdef CONFIG_SYSCTL
1252	neigh_sysctl_register(NULL, &arp_tbl.parms, NET_IPV4,
1253			      NET_IPV4_NEIGH, "ipv4", NULL, NULL);
1254#endif
1255	register_netdevice_notifier(&arp_netdev_notifier);
1256}
1257
1258#ifdef CONFIG_PROC_FS
1259#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
1260
1261/* ------------------------------------------------------------------------ */
1262/*
1263 *	ax25 -> ASCII conversion
1264 */
1265static char *ax2asc2(ax25_address *a, char *buf)
1266{
1267	char c, *s;
1268	int n;
1269
1270	for (n = 0, s = buf; n < 6; n++) {
1271		c = (a->ax25_call[n] >> 1) & 0x7F;
1272
1273		if (c != ' ') *s++ = c;
1274	}
1275
1276	*s++ = '-';
1277
1278	if ((n = ((a->ax25_call[6] >> 1) & 0x0F)) > 9) {
1279		*s++ = '1';
1280		n -= 10;
1281	}
1282
1283	*s++ = n + '0';
1284	*s++ = '\0';
1285
1286	if (*buf == '\0' || *buf == '-')
1287	   return "*";
1288
1289	return buf;
1290
1291}
1292#endif /* CONFIG_AX25 */
1293
1294#define HBUFFERLEN 30
1295
1296static void arp_format_neigh_entry(struct seq_file *seq,
1297				   struct neighbour *n)
1298{
1299	char hbuffer[HBUFFERLEN];
1300	const char hexbuf[] = "0123456789ABCDEF";
1301	int k, j;
1302	char tbuf[16];
1303	struct net_device *dev = n->dev;
1304	int hatype = dev->type;
1305
1306	read_lock(&n->lock);
1307	/* Convert hardware address to XX:XX:XX:XX ... form. */
1308#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
1309	if (hatype == ARPHRD_AX25 || hatype == ARPHRD_NETROM)
1310		ax2asc2((ax25_address *)n->ha, hbuffer);
1311	else {
1312#endif
1313	for (k = 0, j = 0; k < HBUFFERLEN - 3 && j < dev->addr_len; j++) {
1314		hbuffer[k++] = hexbuf[(n->ha[j] >> 4) & 15];
1315		hbuffer[k++] = hexbuf[n->ha[j] & 15];
1316		hbuffer[k++] = ':';
1317	}
1318	hbuffer[--k] = 0;
1319#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
1320	}
1321#endif
1322	sprintf(tbuf, "%u.%u.%u.%u", NIPQUAD(*(u32*)n->primary_key));
1323	seq_printf(seq, "%-16s 0x%-10x0x%-10x%s     *        %s\n",
1324		   tbuf, hatype, arp_state_to_flags(n), hbuffer, dev->name);
1325	read_unlock(&n->lock);
1326}
1327
1328static void arp_format_pneigh_entry(struct seq_file *seq,
1329				    struct pneigh_entry *n)
1330{
1331	struct net_device *dev = n->dev;
1332	int hatype = dev ? dev->type : 0;
1333	char tbuf[16];
1334
1335	sprintf(tbuf, "%u.%u.%u.%u", NIPQUAD(*(u32*)n->key));
1336	seq_printf(seq, "%-16s 0x%-10x0x%-10x%s     *        %s\n",
1337		   tbuf, hatype, ATF_PUBL | ATF_PERM, "00:00:00:00:00:00",
1338		   dev ? dev->name : "*");
1339}
1340
1341static int arp_seq_show(struct seq_file *seq, void *v)
1342{
1343	if (v == SEQ_START_TOKEN) {
1344		seq_puts(seq, "IP address       HW type     Flags       "
1345			      "HW address            Mask     Device\n");
1346	} else {
1347		struct neigh_seq_state *state = seq->private;
1348
1349		if (state->flags & NEIGH_SEQ_IS_PNEIGH)
1350			arp_format_pneigh_entry(seq, v);
1351		else
1352			arp_format_neigh_entry(seq, v);
1353	}
1354
1355	return 0;
1356}
1357
1358static void *arp_seq_start(struct seq_file *seq, loff_t *pos)
1359{
1360	/* Don't want to confuse "arp -a" w/ magic entries,
1361	 * so we tell the generic iterator to skip NUD_NOARP.
1362	 */
1363	return neigh_seq_start(seq, pos, &arp_tbl, NEIGH_SEQ_SKIP_NOARP);
1364}
1365
1366/* ------------------------------------------------------------------------ */
1367
1368static const struct seq_operations arp_seq_ops = {
1369	.start  = arp_seq_start,
1370	.next   = neigh_seq_next,
1371	.stop   = neigh_seq_stop,
1372	.show   = arp_seq_show,
1373};
1374
1375static int arp_seq_open(struct inode *inode, struct file *file)
1376{
1377	return seq_open_net(inode, file, &arp_seq_ops,
1378			    sizeof(struct neigh_seq_state));
1379}
1380
1381static const struct file_operations arp_seq_fops = {
1382	.owner		= THIS_MODULE,
1383	.open           = arp_seq_open,
1384	.read           = seq_read,
1385	.llseek         = seq_lseek,
1386	.release	= seq_release_net,
1387};
1388
1389static int __init arp_proc_init(void)
1390{
1391	if (!proc_net_fops_create(&init_net, "arp", S_IRUGO, &arp_seq_fops))
1392		return -ENOMEM;
1393	return 0;
1394}
1395
1396#else /* CONFIG_PROC_FS */
1397
1398static int __init arp_proc_init(void)
1399{
1400	return 0;
1401}
1402
1403#endif /* CONFIG_PROC_FS */
1404
1405EXPORT_SYMBOL(arp_broken_ops);
1406EXPORT_SYMBOL(arp_find);
1407EXPORT_SYMBOL(arp_create);
1408EXPORT_SYMBOL(arp_xmit);
1409EXPORT_SYMBOL(arp_send);
1410EXPORT_SYMBOL(arp_tbl);
1411
1412#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
1413EXPORT_SYMBOL(clip_tbl_hook);
1414#endif
1415