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