1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81#include <linux/types.h>
82#include <linux/string.h>
83#include <linux/kernel.h>
84#include <linux/sched.h>
85#include <linux/config.h>
86#include <linux/socket.h>
87#include <linux/sockios.h>
88#include <linux/errno.h>
89#include <linux/in.h>
90#include <linux/mm.h>
91#include <linux/inet.h>
92#include <linux/netdevice.h>
93#include <linux/etherdevice.h>
94#include <linux/fddidevice.h>
95#include <linux/if_arp.h>
96#include <linux/trdevice.h>
97#include <linux/skbuff.h>
98#include <linux/proc_fs.h>
99#include <linux/stat.h>
100#include <linux/init.h>
101#ifdef CONFIG_SYSCTL
102#include <linux/sysctl.h>
103#endif
104
105#include <net/ip.h>
106#include <net/icmp.h>
107#include <net/route.h>
108#include <net/protocol.h>
109#include <net/tcp.h>
110#include <net/sock.h>
111#include <net/arp.h>
112#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
113#include <net/ax25.h>
114#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
115#include <net/netrom.h>
116#endif
117#endif
118
119#include <asm/system.h>
120#include <asm/uaccess.h>
121
122
123
124
125static int arp_constructor(struct neighbour *neigh);
126static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb);
127static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb);
128static void parp_redo(struct sk_buff *skb);
129
130static struct neigh_ops arp_generic_ops =
131{
132 AF_INET,
133 NULL,
134 arp_solicit,
135 arp_error_report,
136 neigh_resolve_output,
137 neigh_connected_output,
138 dev_queue_xmit,
139 dev_queue_xmit
140};
141
142static struct neigh_ops arp_hh_ops =
143{
144 AF_INET,
145 NULL,
146 arp_solicit,
147 arp_error_report,
148 neigh_resolve_output,
149 neigh_resolve_output,
150 dev_queue_xmit,
151 dev_queue_xmit
152};
153
154static struct neigh_ops arp_direct_ops =
155{
156 AF_INET,
157 NULL,
158 NULL,
159 NULL,
160 dev_queue_xmit,
161 dev_queue_xmit,
162 dev_queue_xmit,
163 dev_queue_xmit
164};
165
166struct neigh_ops arp_broken_ops =
167{
168 AF_INET,
169 NULL,
170 arp_solicit,
171 arp_error_report,
172 neigh_compat_output,
173 neigh_compat_output,
174 dev_queue_xmit,
175 dev_queue_xmit,
176};
177
178struct neigh_table arp_tbl =
179{
180 NULL,
181 AF_INET,
182 sizeof(struct neighbour) + 4,
183 4,
184 arp_constructor,
185 NULL,
186 NULL,
187 parp_redo,
188 { NULL, NULL, &arp_tbl, 0, NULL, NULL,
189 30*HZ, 1*HZ, 60*HZ, 30*HZ, 5*HZ, 3, 3, 0, 3, 1*HZ, (8*HZ)/10, 64, 1*HZ },
190 30*HZ, 128, 512, 1024,
191};
192
193int arp_mc_map(u32 addr, u8 *haddr, struct device *dev, int dir)
194{
195 switch (dev->type) {
196 case ARPHRD_ETHER:
197 case ARPHRD_IEEE802:
198 case ARPHRD_FDDI:
199 ip_eth_mc_map(addr, haddr);
200 return 0;
201 default:
202 if (dir) {
203 memcpy(haddr, dev->broadcast, dev->addr_len);
204 return 0;
205 }
206 }
207 return -EINVAL;
208}
209
210
211
212static int arp_constructor(struct neighbour *neigh)
213{
214 u32 addr = *(u32*)neigh->primary_key;
215 struct device *dev = neigh->dev;
216 struct in_device *in_dev = dev->ip_ptr;
217
218 if (in_dev == NULL)
219 return -EINVAL;
220
221 neigh->type = inet_addr_type(addr);
222 if (in_dev->arp_parms)
223 neigh->parms = in_dev->arp_parms;
224
225 if (dev->hard_header == NULL) {
226 neigh->nud_state = NUD_NOARP;
227 neigh->ops = &arp_direct_ops;
228 neigh->output = neigh->ops->queue_xmit;
229 } else {
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245#if 1
246
247
248
249
250
251
252
253
254
255
256
257 switch (dev->type) {
258 default:
259 break;
260 case ARPHRD_ROSE:
261#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
262 case ARPHRD_AX25:
263#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
264 case ARPHRD_NETROM:
265#endif
266 neigh->ops = &arp_broken_ops;
267 neigh->output = neigh->ops->output;
268 return 0;
269#endif
270 }
271#endif
272 if (neigh->type == RTN_MULTICAST) {
273 neigh->nud_state = NUD_NOARP;
274 arp_mc_map(addr, neigh->ha, dev, 1);
275 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) {
276 neigh->nud_state = NUD_NOARP;
277 memcpy(neigh->ha, dev->dev_addr, dev->addr_len);
278 } else if (neigh->type == RTN_BROADCAST || dev->flags&IFF_POINTOPOINT) {
279 neigh->nud_state = NUD_NOARP;
280 memcpy(neigh->ha, dev->broadcast, dev->addr_len);
281 }
282 if (dev->hard_header_cache)
283 neigh->ops = &arp_hh_ops;
284 else
285 neigh->ops = &arp_generic_ops;
286 if (neigh->nud_state&NUD_VALID)
287 neigh->output = neigh->ops->connected_output;
288 else
289 neigh->output = neigh->ops->output;
290 }
291
292 return 0;
293}
294
295static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb)
296{
297 dst_link_failure(skb);
298 kfree_skb(skb);
299}
300
301static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
302{
303 u32 saddr;
304 u8 *dst_ha = NULL;
305 struct device *dev = neigh->dev;
306 u32 target = *(u32*)neigh->primary_key;
307 int probes = neigh->probes;
308
309 if (skb && inet_addr_type(skb->nh.iph->saddr) == RTN_LOCAL)
310 saddr = skb->nh.iph->saddr;
311 else
312 saddr = inet_select_addr(dev, target, RT_SCOPE_LINK);
313
314 if ((probes -= neigh->parms->ucast_probes) < 0) {
315 if (!(neigh->nud_state&NUD_VALID))
316 printk(KERN_DEBUG "trying to ucast probe in NUD_INVALID\n");
317 dst_ha = neigh->ha;
318 } else if ((probes -= neigh->parms->app_probes) < 0) {
319#ifdef CONFIG_ARPD
320 neigh_app_ns(neigh);
321#endif
322 return;
323 }
324
325 arp_send(ARPOP_REQUEST, ETH_P_ARP, target, dev, saddr,
326 dst_ha, dev->dev_addr, NULL);
327}
328
329
330
331
332
333
334
335
336
337
338
339
340static int arp_set_predefined(int addr_hint, unsigned char * haddr, u32 paddr, struct device * dev)
341{
342 switch (addr_hint) {
343 case RTN_LOCAL:
344 printk(KERN_DEBUG "ARP: arp called for own IP address\n");
345 memcpy(haddr, dev->dev_addr, dev->addr_len);
346 return 1;
347 case RTN_MULTICAST:
348 arp_mc_map(paddr, haddr, dev, 1);
349 return 1;
350 case RTN_BROADCAST:
351 memcpy(haddr, dev->broadcast, dev->addr_len);
352 return 1;
353 }
354 return 0;
355}
356
357
358int arp_find(unsigned char *haddr, struct sk_buff *skb)
359{
360 struct device *dev = skb->dev;
361 u32 paddr;
362 struct neighbour *n;
363
364 if (!skb->dst) {
365 printk(KERN_DEBUG "arp_find is called with dst==NULL\n");
366 kfree_skb(skb);
367 return 1;
368 }
369
370 paddr = ((struct rtable*)skb->dst)->rt_gateway;
371
372 if (arp_set_predefined(inet_addr_type(paddr), haddr, paddr, dev))
373 return 0;
374
375 start_bh_atomic();
376 n = __neigh_lookup(&arp_tbl, &paddr, dev, 1);
377
378 if (n) {
379 n->used = jiffies;
380 if (n->nud_state&NUD_VALID || neigh_event_send(n, skb) == 0) {
381 memcpy(haddr, n->ha, dev->addr_len);
382 neigh_release(n);
383 end_bh_atomic();
384 return 0;
385 }
386 } else
387 kfree_skb(skb);
388 neigh_release(n);
389 end_bh_atomic();
390 return 1;
391}
392
393
394
395
396
397
398int arp_bind_neighbour(struct dst_entry *dst)
399{
400 struct device *dev = dst->dev;
401
402 if (dev == NULL)
403 return 0;
404 if (dst->neighbour == NULL) {
405 u32 nexthop = ((struct rtable*)dst)->rt_gateway;
406 if (dev->flags&(IFF_LOOPBACK|IFF_POINTOPOINT))
407 nexthop = 0;
408 dst->neighbour = __neigh_lookup(&arp_tbl, &nexthop, dev, 1);
409 }
410 return (dst->neighbour != NULL);
411}
412
413
414
415
416
417
418
419
420
421
422void arp_send(int type, int ptype, u32 dest_ip,
423 struct device *dev, u32 src_ip,
424 unsigned char *dest_hw, unsigned char *src_hw,
425 unsigned char *target_hw)
426{
427 struct sk_buff *skb;
428 struct arphdr *arp;
429 unsigned char *arp_ptr;
430
431
432
433
434
435 if (dev->flags&IFF_NOARP)
436 return;
437
438
439
440
441
442 skb = alloc_skb(sizeof(struct arphdr)+ 2*(dev->addr_len+4)
443 + dev->hard_header_len + 15, GFP_ATOMIC);
444 if (skb == NULL)
445 return;
446
447 skb_reserve(skb, (dev->hard_header_len+15)&~15);
448 skb->nh.raw = skb->data;
449 arp = (struct arphdr *) skb_put(skb,sizeof(struct arphdr) + 2*(dev->addr_len+4));
450 skb->dev = dev;
451 skb->protocol = __constant_htons (ETH_P_ARP);
452 if (src_hw == NULL)
453 src_hw = dev->dev_addr;
454 if (dest_hw == NULL)
455 dest_hw = dev->broadcast;
456
457
458
459
460 dev->hard_header(skb,dev,ptype,dest_hw,src_hw,skb->len);
461
462
463
464
465
466
467
468
469
470
471
472 switch (dev->type) {
473 default:
474 arp->ar_hrd = htons(dev->type);
475 arp->ar_pro = __constant_htons(ETH_P_IP);
476 break;
477
478#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
479 case ARPHRD_AX25:
480 arp->ar_hrd = __constant_htons(ARPHRD_AX25);
481 arp->ar_pro = __constant_htons(AX25_P_IP);
482 break;
483
484#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
485 case ARPHRD_NETROM:
486 arp->ar_hrd = __constant_htons(ARPHRD_NETROM);
487 arp->ar_pro = __constant_htons(AX25_P_IP);
488 break;
489#endif
490#endif
491
492#ifdef CONFIG_FDDI
493 case ARPHRD_FDDI:
494 arp->ar_hrd = __constant_htons(ARPHRD_ETHER);
495 arp->ar_pro = __constant_htons(ETH_P_IP);
496 break;
497#endif
498 }
499
500 arp->ar_hln = dev->addr_len;
501 arp->ar_pln = 4;
502 arp->ar_op = htons(type);
503
504 arp_ptr=(unsigned char *)(arp+1);
505
506 memcpy(arp_ptr, src_hw, dev->addr_len);
507 arp_ptr+=dev->addr_len;
508 memcpy(arp_ptr, &src_ip,4);
509 arp_ptr+=4;
510 if (target_hw != NULL)
511 memcpy(arp_ptr, target_hw, dev->addr_len);
512 else
513 memset(arp_ptr, 0, dev->addr_len);
514 arp_ptr+=dev->addr_len;
515 memcpy(arp_ptr, &dest_ip, 4);
516 skb->dev = dev;
517
518 dev_queue_xmit(skb);
519}
520
521static void parp_redo(struct sk_buff *skb)
522{
523 arp_rcv(skb, skb->dev, NULL);
524}
525
526
527
528
529
530int arp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
531{
532 struct arphdr *arp = skb->nh.arph;
533 unsigned char *arp_ptr= (unsigned char *)(arp+1);
534 struct rtable *rt;
535 unsigned char *sha, *tha;
536 u32 sip, tip;
537 u16 dev_type = dev->type;
538 int addr_type;
539 struct in_device *in_dev = dev->ip_ptr;
540 struct neighbour *n;
541
542
543
544
545
546
547
548
549 if (in_dev == NULL ||
550 arp->ar_hln != dev->addr_len ||
551 dev->flags & IFF_NOARP ||
552 skb->pkt_type == PACKET_OTHERHOST ||
553 skb->pkt_type == PACKET_LOOPBACK ||
554 arp->ar_pln != 4)
555 goto out;
556
557 switch (dev_type) {
558 default:
559 if (arp->ar_pro != __constant_htons(ETH_P_IP))
560 goto out;
561 if (htons(dev_type) != arp->ar_hrd)
562 goto out;
563 break;
564#ifdef CONFIG_NET_ETHERNET
565 case ARPHRD_ETHER:
566
567
568
569
570 if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) &&
571 arp->ar_hrd != __constant_htons(ARPHRD_IEEE802))
572 goto out;
573 if (arp->ar_pro != __constant_htons(ETH_P_IP))
574 goto out;
575 break;
576#endif
577#ifdef CONFIG_FDDI
578 case ARPHRD_FDDI:
579
580
581
582
583
584 if (arp->ar_hrd != __constant_htons(ARPHRD_ETHER) &&
585 arp->ar_hrd != __constant_htons(ARPHRD_IEEE802))
586 goto out;
587 if (arp->ar_pro != __constant_htons(ETH_P_IP))
588 goto out;
589 break;
590#endif
591#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
592 case ARPHRD_AX25:
593 if (arp->ar_pro != __constant_htons(AX25_P_IP))
594 goto out;
595 if (arp->ar_hrd != __constant_htons(ARPHRD_AX25))
596 goto out;
597 break;
598#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
599 case ARPHRD_NETROM:
600 if (arp->ar_pro != __constant_htons(AX25_P_IP))
601 goto out;
602 if (arp->ar_hrd != __constant_htons(ARPHRD_NETROM))
603 goto out;
604 break;
605#endif
606#endif
607 }
608
609
610
611 if (arp->ar_op != __constant_htons(ARPOP_REPLY) &&
612 arp->ar_op != __constant_htons(ARPOP_REQUEST))
613 goto out;
614
615
616
617
618 sha=arp_ptr;
619 arp_ptr += dev->addr_len;
620 memcpy(&sip, arp_ptr, 4);
621 arp_ptr += 4;
622 tha=arp_ptr;
623 arp_ptr += dev->addr_len;
624 memcpy(&tip, arp_ptr, 4);
625
626
627
628
629 if (LOOPBACK(tip) || MULTICAST(tip))
630 goto out;
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650 if (sip == 0) {
651 if (arp->ar_op == __constant_htons(ARPOP_REQUEST) &&
652 inet_addr_type(tip) == RTN_LOCAL)
653 arp_send(ARPOP_REPLY,ETH_P_ARP,tip,dev,tip,sha,dev->dev_addr,dev->dev_addr);
654 goto out;
655 }
656
657 if (arp->ar_op == __constant_htons(ARPOP_REQUEST) &&
658 ip_route_input(skb, tip, sip, 0, dev) == 0) {
659
660 rt = (struct rtable*)skb->dst;
661 addr_type = rt->rt_type;
662
663 if (addr_type == RTN_LOCAL) {
664 n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
665 if (n) {
666 arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);
667 neigh_release(n);
668 }
669 goto out;
670 } else if (IN_DEV_FORWARD(in_dev)) {
671 if ((rt->rt_flags&RTCF_DNAT) ||
672 (addr_type == RTN_UNICAST && rt->u.dst.dev != dev &&
673 (IN_DEV_PROXY_ARP(in_dev) || pneigh_lookup(&arp_tbl, &tip, dev, 0)))) {
674 n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
675 neigh_release(n);
676
677 if (skb->stamp.tv_sec == 0 ||
678 skb->pkt_type == PACKET_HOST ||
679 in_dev->arp_parms->proxy_delay == 0) {
680 arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);
681 } else {
682 pneigh_enqueue(&arp_tbl, in_dev->arp_parms, skb);
683 return 0;
684 }
685 goto out;
686 }
687 }
688 }
689
690
691
692 n = __neigh_lookup(&arp_tbl, &sip, dev, 0);
693
694#ifdef CONFIG_IP_ACCEPT_UNSOLICITED_ARP
695
696
697
698
699 if (n == NULL &&
700 arp->ar_op == __constant_htons(ARPOP_REPLY) &&
701 inet_addr_type(sip) == RTN_UNICAST)
702 n = __neigh_lookup(&arp_tbl, &sip, dev, -1);
703#endif
704
705 if (n) {
706 int state = NUD_REACHABLE;
707 int override = 0;
708
709
710
711
712
713
714 if (jiffies - n->updated >= n->parms->locktime)
715 override = 1;
716
717
718
719
720 if (arp->ar_op != __constant_htons(ARPOP_REPLY) ||
721 skb->pkt_type != PACKET_HOST)
722 state = NUD_STALE;
723 neigh_update(n, sha, state, override, 1);
724 neigh_release(n);
725 }
726
727out:
728 kfree_skb(skb);
729 return 0;
730}
731
732
733
734
735
736
737
738
739
740
741
742int arp_req_set(struct arpreq *r, struct device * dev)
743{
744 u32 ip = ((struct sockaddr_in *) &r->arp_pa)->sin_addr.s_addr;
745 struct neighbour *neigh;
746 int err;
747
748 if (r->arp_flags&ATF_PUBL) {
749 u32 mask = ((struct sockaddr_in *) &r->arp_netmask)->sin_addr.s_addr;
750 if (mask && mask != 0xFFFFFFFF)
751 return -EINVAL;
752 if (!dev && (r->arp_flags & ATF_COM)) {
753 dev = dev_getbyhwaddr(r->arp_ha.sa_family, r->arp_ha.sa_data);
754 if (!dev)
755 return -ENODEV;
756 }
757 if (mask) {
758 if (pneigh_lookup(&arp_tbl, &ip, dev, 1) == NULL)
759 return -ENOBUFS;
760 return 0;
761 }
762 if (dev == NULL) {
763 ipv4_devconf.proxy_arp = 1;
764 return 0;
765 }
766 if (dev->ip_ptr) {
767 ((struct in_device*)dev->ip_ptr)->cnf.proxy_arp = 1;
768 return 0;
769 }
770 return -ENXIO;
771 }
772
773 if (r->arp_flags & ATF_PERM)
774 r->arp_flags |= ATF_COM;
775 if (dev == NULL) {
776 struct rtable * rt;
777 if ((err = ip_route_output(&rt, ip, 0, RTO_ONLINK, 0)) != 0)
778 return err;
779 dev = rt->u.dst.dev;
780 ip_rt_put(rt);
781 if (!dev)
782 return -EINVAL;
783 }
784 if (r->arp_ha.sa_family != dev->type)
785 return -EINVAL;
786
787 err = -ENOBUFS;
788 start_bh_atomic();
789 neigh = __neigh_lookup(&arp_tbl, &ip, dev, 1);
790 if (neigh) {
791 unsigned state = NUD_STALE;
792 if (r->arp_flags & ATF_PERM)
793 state = NUD_PERMANENT;
794 err = neigh_update(neigh, (r->arp_flags&ATF_COM) ?
795 r->arp_ha.sa_data : NULL, state, 1, 0);
796 neigh_release(neigh);
797 }
798 end_bh_atomic();
799 return err;
800}
801
802static unsigned arp_state_to_flags(struct neighbour *neigh)
803{
804 unsigned flags = 0;
805 if (neigh->nud_state&NUD_PERMANENT)
806 flags = ATF_PERM|ATF_COM;
807 else if (neigh->nud_state&NUD_VALID)
808 flags = ATF_COM;
809 return flags;
810}
811
812
813
814
815
816static int arp_req_get(struct arpreq *r, struct device *dev)
817{
818 u32 ip = ((struct sockaddr_in *) &r->arp_pa)->sin_addr.s_addr;
819 struct neighbour *neigh;
820 int err = -ENXIO;
821
822 start_bh_atomic();
823 neigh = __neigh_lookup(&arp_tbl, &ip, dev, 0);
824 if (neigh) {
825 memcpy(r->arp_ha.sa_data, neigh->ha, dev->addr_len);
826 r->arp_ha.sa_family = dev->type;
827 strncpy(r->arp_dev, dev->name, sizeof(r->arp_dev));
828 r->arp_flags = arp_state_to_flags(neigh);
829 neigh_release(neigh);
830 err = 0;
831 }
832 end_bh_atomic();
833 return err;
834}
835
836int arp_req_delete(struct arpreq *r, struct device * dev)
837{
838 int err;
839 u32 ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr;
840 struct neighbour *neigh;
841
842 if (r->arp_flags & ATF_PUBL) {
843 u32 mask = ((struct sockaddr_in *) &r->arp_netmask)->sin_addr.s_addr;
844 if (mask == 0xFFFFFFFF)
845 return pneigh_delete(&arp_tbl, &ip, dev);
846 if (mask == 0) {
847 if (dev == NULL) {
848 ipv4_devconf.proxy_arp = 0;
849 return 0;
850 }
851 if (dev->ip_ptr) {
852 ((struct in_device*)dev->ip_ptr)->cnf.proxy_arp = 0;
853 return 0;
854 }
855 return -ENXIO;
856 }
857 return -EINVAL;
858 }
859
860 if (dev == NULL) {
861 struct rtable * rt;
862 if ((err = ip_route_output(&rt, ip, 0, RTO_ONLINK, 0)) != 0)
863 return err;
864 dev = rt->u.dst.dev;
865 ip_rt_put(rt);
866 if (!dev)
867 return -EINVAL;
868 }
869 err = -ENXIO;
870 start_bh_atomic();
871 neigh = __neigh_lookup(&arp_tbl, &ip, dev, 0);
872 if (neigh) {
873 if (neigh->nud_state&~NUD_NOARP)
874 err = neigh_update(neigh, NULL, NUD_FAILED, 1, 0);
875 neigh_release(neigh);
876 }
877 end_bh_atomic();
878 return err;
879}
880
881
882
883
884
885int arp_ioctl(unsigned int cmd, void *arg)
886{
887 int err;
888 struct arpreq r;
889 struct device * dev = NULL;
890
891 switch(cmd) {
892 case SIOCDARP:
893 case SIOCSARP:
894 if (!capable(CAP_NET_ADMIN))
895 return -EPERM;
896 case SIOCGARP:
897 err = copy_from_user(&r, arg, sizeof(struct arpreq));
898 if (err)
899 return -EFAULT;
900 break;
901 default:
902 return -EINVAL;
903 }
904
905 if (r.arp_pa.sa_family != AF_INET)
906 return -EPFNOSUPPORT;
907
908 if (!(r.arp_flags & ATF_PUBL) &&
909 (r.arp_flags & (ATF_NETMASK|ATF_DONTPUB)))
910 return -EINVAL;
911 if (!(r.arp_flags & ATF_NETMASK))
912 ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr=__constant_htonl(0xFFFFFFFFUL);
913
914 rtnl_lock();
915 if (r.arp_dev[0]) {
916 err = -ENODEV;
917 if ((dev = dev_get(r.arp_dev)) == NULL)
918 goto out;
919
920
921 if (!r.arp_ha.sa_family)
922 r.arp_ha.sa_family = dev->type;
923 err = -EINVAL;
924 if ((r.arp_flags & ATF_COM) && r.arp_ha.sa_family != dev->type)
925 goto out;
926 } else if (cmd == SIOCGARP) {
927 err = -ENODEV;
928 goto out;
929 }
930
931 switch(cmd) {
932 case SIOCDARP:
933 err = arp_req_delete(&r, dev);
934 break;
935 case SIOCSARP:
936 err = arp_req_set(&r, dev);
937 break;
938 case SIOCGARP:
939 err = arp_req_get(&r, dev);
940 if (!err && copy_to_user(arg, &r, sizeof(r)))
941 err = -EFAULT;
942 break;
943 }
944out:
945 rtnl_unlock();
946 return err;
947}
948
949
950
951
952#ifdef CONFIG_PROC_FS
953
954#define HBUFFERLEN 30
955
956int arp_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
957{
958 int len=0;
959 off_t pos=0;
960 int size;
961 char hbuffer[HBUFFERLEN];
962 int i,j,k;
963 const char hexbuf[] = "0123456789ABCDEF";
964
965 size = sprintf(buffer,"IP address HW type Flags HW address Mask Device\n");
966
967 pos+=size;
968 len+=size;
969
970 neigh_table_lock(&arp_tbl);
971
972 for(i=0; i<=NEIGH_HASHMASK; i++) {
973 struct neighbour *n;
974 for (n=arp_tbl.hash_buckets[i]; n; n=n->next) {
975 struct device *dev = n->dev;
976 int hatype = dev->type;
977
978
979 if (!(n->nud_state&~NUD_NOARP))
980 continue;
981
982
983
984
985
986#if 1
987
988
989
990#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
991 if (hatype == ARPHRD_AX25 || hatype == ARPHRD_NETROM)
992 strcpy(hbuffer,ax2asc((ax25_address *)n->ha));
993 else {
994#endif
995 for (k=0,j=0;k<HBUFFERLEN-3 && j<dev->addr_len;j++) {
996 hbuffer[k++]=hexbuf[(n->ha[j]>>4)&15 ];
997 hbuffer[k++]=hexbuf[n->ha[j]&15 ];
998 hbuffer[k++]=':';
999 }
1000 hbuffer[--k]=0;
1001
1002#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
1003 }
1004#endif
1005#else
1006 if ((neigh->nud_state&NUD_VALID) && dev->addr_len) {
1007 int j;
1008 for (j=0; j < dev->addr_len; j++)
1009 sprintf(hbuffer+2*j, "%02x", neigh->ha[j]);
1010 } else
1011 sprintf(hbuffer, "0");
1012#endif
1013
1014 size = sprintf(buffer+len,
1015 "%-17s0x%-10x0x%-10x%s",
1016 in_ntoa(*(u32*)n->primary_key),
1017 hatype,
1018 arp_state_to_flags(n),
1019 hbuffer);
1020 size += sprintf(buffer+len+size,
1021 " %-17s %s\n",
1022 "*", dev->name);
1023
1024 len += size;
1025 pos += size;
1026
1027 if (pos <= offset)
1028 len=0;
1029 if (pos >= offset+length)
1030 goto done;
1031 }
1032 }
1033
1034 for (i=0; i<=PNEIGH_HASHMASK; i++) {
1035 struct pneigh_entry *n;
1036 for (n=arp_tbl.phash_buckets[i]; n; n=n->next) {
1037 struct device *dev = n->dev;
1038 int hatype = dev ? dev->type : 0;
1039
1040 size = sprintf(buffer+len,
1041 "%-17s0x%-10x0x%-10x%s",
1042 in_ntoa(*(u32*)n->key),
1043 hatype,
1044 ATF_PUBL|ATF_PERM,
1045 "00:00:00:00:00:00");
1046 size += sprintf(buffer+len+size,
1047 " %-17s %s\n",
1048 "*", dev ? dev->name : "*");
1049
1050 len += size;
1051 pos += size;
1052
1053 if (pos <= offset)
1054 len=0;
1055 if (pos >= offset+length)
1056 goto done;
1057 }
1058 }
1059
1060done:
1061 neigh_table_unlock(&arp_tbl);
1062
1063 *start = buffer+len-(pos-offset);
1064 len = pos-offset;
1065 if (len>length)
1066 len = length;
1067 if (len<0)
1068 len = 0;
1069 return len;
1070}
1071#endif
1072
1073
1074
1075
1076
1077void arp_ifdown(struct device *dev)
1078{
1079 neigh_ifdown(&arp_tbl, dev);
1080}
1081
1082
1083
1084
1085
1086
1087static struct packet_type arp_packet_type =
1088{
1089 __constant_htons(ETH_P_ARP),
1090 NULL,
1091 arp_rcv,
1092 NULL,
1093 NULL
1094};
1095
1096#ifdef CONFIG_PROC_FS
1097static struct proc_dir_entry proc_net_arp = {
1098 PROC_NET_ARP, 3, "arp",
1099 S_IFREG | S_IRUGO, 1, 0, 0,
1100 0, &proc_net_inode_operations,
1101 arp_get_info
1102};
1103#endif
1104
1105__initfunc(void arp_init (void))
1106{
1107 neigh_table_init(&arp_tbl);
1108
1109 dev_add_pack(&arp_packet_type);
1110
1111#ifdef CONFIG_PROC_FS
1112 proc_net_register(&proc_net_arp);
1113#endif
1114#ifdef CONFIG_SYSCTL
1115 neigh_sysctl_register(NULL, &arp_tbl.parms, NET_IPV4, NET_IPV4_NEIGH, "ipv4");
1116#endif
1117}
1118
1119
1120#ifdef CONFIG_AX25_MODULE
1121
1122
1123
1124
1125char *ax2asc(ax25_address *a)
1126{
1127 static char buf[11];
1128 char c, *s;
1129 int n;
1130
1131 for (n = 0, s = buf; n < 6; n++) {
1132 c = (a->ax25_call[n] >> 1) & 0x7F;
1133
1134 if (c != ' ') *s++ = c;
1135 }
1136
1137 *s++ = '-';
1138
1139 if ((n = ((a->ax25_call[6] >> 1) & 0x0F)) > 9) {
1140 *s++ = '1';
1141 n -= 10;
1142 }
1143
1144 *s++ = n + '0';
1145 *s++ = '\0';
1146
1147 if (*buf == '\0' || *buf == '-')
1148 return "*";
1149
1150 return buf;
1151
1152}
1153
1154#endif
1155