This source file includes following definitions.
- arp_check_expire
- arp_release_entry
- arp_device_down
- arp_send
- arp_expire_request
- arp_send_q
- arp_destroy
- arp_rcv
- arp_find
- arp_get_info
- arp_lookup
- arp_req_set
- arp_req_get
- arp_ioctl
- arp_init
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 #include <linux/types.h>
39 #include <linux/string.h>
40 #include <linux/kernel.h>
41 #include <linux/sched.h>
42 #include <linux/config.h>
43 #include <linux/socket.h>
44 #include <linux/sockios.h>
45 #include <linux/errno.h>
46 #include <linux/if_arp.h>
47 #include <linux/in.h>
48 #include <asm/system.h>
49 #include <asm/segment.h>
50 #include <stdarg.h>
51 #include <linux/inet.h>
52 #include <linux/netdevice.h>
53 #include <linux/etherdevice.h>
54 #include "ip.h"
55 #include "route.h"
56 #include "protocol.h"
57 #include "tcp.h"
58 #include <linux/skbuff.h>
59 #include "sock.h"
60 #include "arp.h"
61 #ifdef CONFIG_AX25
62 #include "ax25.h"
63 #endif
64
65
66
67
68
69
70
71
72 struct arp_table
73 {
74 struct arp_table *next;
75 unsigned long last_used;
76 unsigned int flags;
77 unsigned long ip;
78 unsigned char ha[MAX_ADDR_LEN];
79 unsigned char hlen;
80 unsigned short htype;
81 struct device *dev;
82
83
84
85
86
87 struct timer_list timer;
88 int retries;
89 struct sk_buff_head skb;
90 };
91
92
93
94
95
96
97
98
99
100
101
102 #define ARP_RES_TIME (250*(HZ/10))
103
104
105
106
107
108
109 #define ARP_MAX_TRIES 3
110
111
112
113
114
115 #define ARP_TIMEOUT (600*HZ)
116
117
118
119
120
121
122
123 #define ARP_CHECK_INTERVAL (60 * HZ)
124
125
126 static void arp_check_expire (unsigned long);
127
128
129 static struct timer_list arp_timer =
130 { NULL, NULL, ARP_CHECK_INTERVAL, 0L, &arp_check_expire };
131
132
133
134
135
136
137
138 #define ARP_TABLE_SIZE 16
139
140 struct arp_table *arp_tables[ARP_TABLE_SIZE] =
141 {
142 NULL,
143 };
144
145
146
147
148
149 #define HASH(paddr) (htonl(paddr) & (ARP_TABLE_SIZE - 1))
150
151
152
153
154
155
156 static int proxies = 0;
157
158
159
160
161
162
163
164
165
166
167 static void arp_check_expire(unsigned long dummy)
168 {
169 int i;
170 unsigned long now = jiffies;
171 unsigned long flags;
172 save_flags(flags);
173 cli();
174
175 for (i = 0; i < ARP_TABLE_SIZE; i++)
176 {
177 struct arp_table *entry;
178 struct arp_table **pentry = &arp_tables[i];
179
180 while ((entry = *pentry) != NULL)
181 {
182 if ((now - entry->last_used) > ARP_TIMEOUT
183 && !(entry->flags & ATF_PERM))
184 {
185 *pentry = entry->next;
186 if (entry->flags & ATF_PUBL)
187 proxies--;
188 del_timer(&entry->timer);
189 kfree_s(entry, sizeof(struct arp_table));
190 }
191 else
192 pentry = &entry->next;
193 }
194 }
195 restore_flags(flags);
196
197
198
199
200
201 del_timer(&arp_timer);
202 arp_timer.expires = ARP_CHECK_INTERVAL;
203 add_timer(&arp_timer);
204 }
205
206
207
208
209
210
211 static void arp_release_entry(struct arp_table *entry)
212 {
213 struct sk_buff *skb;
214 unsigned long flags;
215
216 if (entry->flags & ATF_PUBL)
217 proxies--;
218
219 save_flags(flags);
220 cli();
221
222 while ((skb = skb_dequeue(&entry->skb)) != NULL)
223 {
224 skb_device_lock(skb);
225 restore_flags(flags);
226 dev_kfree_skb(skb, FREE_WRITE);
227 }
228 restore_flags(flags);
229 del_timer(&entry->timer);
230 kfree_s(entry, sizeof(struct arp_table));
231 return;
232 }
233
234
235
236
237
238 void arp_device_down(struct device *dev)
239 {
240 int i;
241 unsigned long flags;
242
243
244
245
246 save_flags(flags);
247 cli();
248 for (i = 0; i < ARP_TABLE_SIZE; i++)
249 {
250 struct arp_table *entry;
251 struct arp_table **pentry = &arp_tables[i];
252
253 while ((entry = *pentry) != NULL)
254 {
255 if(entry->dev==dev)
256 {
257 *pentry = entry->next;
258 if (entry->flags & ATF_PUBL)
259 proxies--;
260 del_timer(&entry->timer);
261 kfree_s(entry, sizeof(struct arp_table));
262 }
263 else
264 pentry = &entry->next;
265 }
266 }
267 restore_flags(flags);
268 }
269
270
271
272
273
274
275
276 void arp_send(int type, int ptype, unsigned long dest_ip,
277 struct device *dev, unsigned long src_ip,
278 unsigned char *dest_hw, unsigned char *src_hw)
279 {
280 struct sk_buff *skb;
281 struct arphdr *arp;
282 unsigned char *arp_ptr;
283
284
285
286
287
288 if(dev->flags&IFF_NOARP)
289 return;
290
291
292
293
294
295 skb = alloc_skb(sizeof(struct arphdr)+ 2*(dev->addr_len+4)
296 + dev->hard_header_len, GFP_ATOMIC);
297 if (skb == NULL)
298 {
299 printk("ARP: no memory to send an arp packet\n");
300 return;
301 }
302 skb->len = sizeof(struct arphdr) + dev->hard_header_len + 2*(dev->addr_len+4);
303 skb->arp = 1;
304 skb->dev = dev;
305 skb->free = 1;
306
307
308
309
310
311 dev->hard_header(skb->data,dev,ptype,dest_hw?dest_hw:dev->broadcast,src_hw?src_hw:NULL,skb->len,skb);
312
313
314 arp = (struct arphdr *) (skb->data + dev->hard_header_len);
315 arp->ar_hrd = htons(dev->type);
316 #ifdef CONFIG_AX25
317 arp->ar_pro = (dev->type != ARPHRD_AX25)? htons(ETH_P_IP) : htons(AX25_P_IP);
318 #else
319 arp->ar_pro = htons(ETH_P_IP);
320 #endif
321 arp->ar_hln = dev->addr_len;
322 arp->ar_pln = 4;
323 arp->ar_op = htons(type);
324
325 arp_ptr=(unsigned char *)(arp+1);
326
327 memcpy(arp_ptr, src_hw, dev->addr_len);
328 arp_ptr+=dev->addr_len;
329 memcpy(arp_ptr, &src_ip,4);
330 arp_ptr+=4;
331 if (dest_hw != NULL)
332 memcpy(arp_ptr, dest_hw, dev->addr_len);
333 else
334 memset(arp_ptr, 0, dev->addr_len);
335 arp_ptr+=dev->addr_len;
336 memcpy(arp_ptr, &dest_ip, 4);
337
338 dev_queue_xmit(skb, dev, 0);
339 }
340
341
342
343
344
345
346
347 static void arp_expire_request (unsigned long arg)
348 {
349 struct arp_table *entry = (struct arp_table *) arg;
350 struct arp_table **pentry;
351 unsigned long hash;
352 unsigned long flags;
353
354 save_flags(flags);
355 cli();
356
357
358
359
360
361
362
363 if (entry->flags & ATF_COM)
364 {
365 restore_flags(flags);
366 return;
367 }
368
369 if (--entry->retries > 0)
370 {
371 unsigned long ip = entry->ip;
372 struct device *dev = entry->dev;
373
374
375 del_timer(&entry->timer);
376 entry->timer.expires = ARP_RES_TIME;
377 add_timer(&entry->timer);
378 restore_flags(flags);
379 arp_send(ARPOP_REQUEST, ETH_P_ARP, ip, dev, dev->pa_addr,
380 NULL, dev->dev_addr);
381 return;
382 }
383
384
385
386
387
388
389
390
391 hash = HASH(entry->ip);
392 pentry = &arp_tables[hash];
393 while (*pentry != NULL)
394 {
395 if (*pentry == entry)
396 {
397 *pentry = entry->next;
398 del_timer(&entry->timer);
399 restore_flags(flags);
400 arp_release_entry(entry);
401 return;
402 }
403 pentry = &(*pentry)->next;
404 }
405 restore_flags(flags);
406 printk("Possible ARP queue corruption.\n");
407
408
409
410 }
411
412
413
414
415
416
417 static void arp_send_q(struct arp_table *entry, unsigned char *hw_dest)
418 {
419 struct sk_buff *skb;
420
421 unsigned long flags;
422
423
424
425
426
427 if(!(entry->flags&ATF_COM))
428 {
429 printk("arp_send_q: incomplete entry for %s\n",
430 in_ntoa(entry->ip));
431 return;
432 }
433
434 save_flags(flags);
435
436 cli();
437 while((skb = skb_dequeue(&entry->skb)) != NULL)
438 {
439 IS_SKB(skb);
440 skb_device_lock(skb);
441 restore_flags(flags);
442 if(!skb->dev->rebuild_header(skb->data,skb->dev,skb->raddr,skb))
443 {
444 skb->arp = 1;
445 if(skb->sk==NULL)
446 dev_queue_xmit(skb, skb->dev, 0);
447 else
448 dev_queue_xmit(skb,skb->dev,skb->sk->priority);
449 }
450 else
451 {
452
453
454 printk("arp_send_q: The impossible occurred. Please notify Alan.\n");
455 printk("arp_send_q: active entity %s\n",in_ntoa(entry->ip));
456 printk("arp_send_q: failed to find %s\n",in_ntoa(skb->raddr));
457 }
458 }
459 restore_flags(flags);
460 }
461
462
463
464
465
466
467 void arp_destroy(unsigned long ip_addr, int force)
468 {
469 struct arp_table *entry;
470 struct arp_table **pentry;
471 unsigned long hash = HASH(ip_addr);
472
473 cli();
474 pentry = &arp_tables[hash];
475 while ((entry = *pentry) != NULL)
476 {
477 if (entry->ip == ip_addr)
478 {
479 if ((entry->flags & ATF_PERM) && !force)
480 return;
481 *pentry = entry->next;
482 del_timer(&entry->timer);
483 sti();
484 arp_release_entry(entry);
485 return;
486 }
487 pentry = &entry->next;
488 }
489 sti();
490 }
491
492
493
494
495
496
497
498
499 int arp_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
500 {
501
502
503
504
505 struct arphdr *arp = (struct arphdr *)skb->h.raw;
506 unsigned char *arp_ptr= (unsigned char *)(arp+1);
507 struct arp_table *entry;
508 struct arp_table *proxy_entry;
509 int addr_hint,hlen,htype;
510 unsigned long hash,dest_hash;
511 unsigned char ha[MAX_ADDR_LEN];
512 long sip,tip;
513 unsigned char *sha,*tha;
514
515
516
517
518
519
520
521
522 if (arp->ar_hln != dev->addr_len ||
523 dev->type != ntohs(arp->ar_hrd) ||
524 dev->flags & IFF_NOARP ||
525 arp->ar_pln != 4)
526 {
527 kfree_skb(skb, FREE_READ);
528 return 0;
529 }
530
531
532
533
534
535
536
537 switch(dev->type)
538 {
539 #ifdef CONFIG_AX25
540 case ARPHRD_AX25:
541 if(arp->ar_pro != htons(AX25_P_IP))
542 {
543 kfree_skb(skb, FREE_READ);
544 return 0;
545 }
546 break;
547 #endif
548 case ARPHRD_ETHER:
549 if(arp->ar_pro != htons(ETH_P_IP))
550 {
551 kfree_skb(skb, FREE_READ);
552 return 0;
553 }
554 break;
555
556 default:
557 printk("ARP: dev->type mangled!\n");
558 kfree_skb(skb, FREE_READ);
559 return 0;
560 }
561
562
563
564
565
566 hlen = dev->addr_len;
567 htype = dev->type;
568
569 sha=arp_ptr;
570 arp_ptr+=hlen;
571 memcpy(&sip,arp_ptr,4);
572 arp_ptr+=4;
573 tha=arp_ptr;
574 arp_ptr+=hlen;
575 memcpy(&tip,arp_ptr,4);
576
577
578
579
580 if(tip == INADDR_LOOPBACK)
581 {
582 kfree_skb(skb, FREE_READ);
583 return 0;
584 }
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603 addr_hint = ip_chk_addr(tip);
604
605 if(arp->ar_op == htons(ARPOP_REPLY))
606 {
607 if(addr_hint!=IS_MYADDR)
608 {
609
610
611
612 kfree_skb(skb, FREE_READ);
613 return 0;
614 }
615
616
617
618 }
619 else
620 {
621
622
623
624 if(addr_hint != IS_MYADDR)
625 {
626
627
628
629
630
631 if (proxies == 0)
632 {
633 kfree_skb(skb, FREE_READ);
634 return 0;
635 }
636
637 dest_hash = HASH(tip);
638 cli();
639 for(proxy_entry=arp_tables[dest_hash];
640 proxy_entry;
641 proxy_entry = proxy_entry->next)
642 {
643 if(proxy_entry->ip == tip && proxy_entry->htype==htype)
644 break;
645 }
646 if (proxy_entry && (proxy_entry->flags & ATF_PUBL))
647 {
648 memcpy(ha, proxy_entry->ha, hlen);
649 sti();
650 arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,ha);
651 kfree_skb(skb, FREE_READ);
652 return 0;
653 }
654 else
655 {
656 sti();
657 kfree_skb(skb, FREE_READ);
658 return 0;
659 }
660 }
661 else
662 {
663
664
665
666 arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr);
667 }
668 }
669
670
671
672
673
674
675
676
677 hash = HASH(sip);
678 cli();
679 for(entry=arp_tables[hash];entry;entry=entry->next)
680 if(entry->ip==sip && entry->htype==htype)
681 break;
682
683 if(entry)
684 {
685
686
687
688 memcpy(entry->ha, sha, hlen);
689 entry->hlen = hlen;
690 entry->last_used = jiffies;
691 if (!(entry->flags & ATF_COM))
692 {
693
694
695
696
697 del_timer(&entry->timer);
698 entry->flags |= ATF_COM;
699 sti();
700
701
702
703
704
705 arp_send_q(entry, sha);
706 }
707 else
708 {
709 sti();
710 }
711 }
712 else
713 {
714
715
716
717 entry = (struct arp_table *)kmalloc(sizeof(struct arp_table),GFP_ATOMIC);
718 if(entry == NULL)
719 {
720 sti();
721 printk("ARP: no memory for new arp entry\n");
722
723 kfree_skb(skb, FREE_READ);
724 return 0;
725 }
726
727 entry->ip = sip;
728 entry->hlen = hlen;
729 entry->htype = htype;
730 entry->flags = ATF_COM;
731 init_timer(&entry->timer);
732 memcpy(entry->ha, sha, hlen);
733 entry->last_used = jiffies;
734 entry->dev = skb->dev;
735 skb_queue_head_init(&entry->skb);
736 entry->next = arp_tables[hash];
737 arp_tables[hash] = entry;
738 sti();
739 }
740
741
742
743
744 kfree_skb(skb, FREE_READ);
745 return 0;
746 }
747
748
749
750
751
752
753 int arp_find(unsigned char *haddr, unsigned long paddr, struct device *dev,
754 unsigned long saddr, struct sk_buff *skb)
755 {
756 struct arp_table *entry;
757 unsigned long hash;
758 switch (ip_chk_addr(paddr))
759 {
760 case IS_MYADDR:
761 printk("ARP: arp called for own IP address\n");
762 memcpy(haddr, dev->dev_addr, dev->addr_len);
763 skb->arp = 1;
764 return 0;
765 case IS_BROADCAST:
766 memcpy(haddr, dev->broadcast, dev->addr_len);
767 skb->arp = 1;
768 return 0;
769 }
770
771 hash = HASH(paddr);
772 cli();
773
774
775
776
777 for (entry = arp_tables[hash]; entry != NULL; entry = entry->next)
778 if (entry->ip == paddr)
779 break;
780
781
782 if (entry != NULL)
783 {
784 if (!(entry->flags & ATF_COM))
785 {
786
787
788
789
790
791 if (skb != NULL)
792 {
793 skb_queue_tail(&entry->skb, skb);
794 skb_device_unlock(skb);
795 }
796 sti();
797 return 1;
798 }
799
800
801
802
803
804 entry->last_used = jiffies;
805 memcpy(haddr, entry->ha, dev->addr_len);
806 if (skb)
807 skb->arp = 1;
808 sti();
809 return 0;
810 }
811
812
813
814
815
816 entry = (struct arp_table *) kmalloc(sizeof(struct arp_table),
817 GFP_ATOMIC);
818 if (entry != NULL)
819 {
820 entry->ip = paddr;
821 entry->hlen = dev->addr_len;
822 entry->htype = dev->type;
823 entry->flags = 0;
824 memset(entry->ha, 0, dev->addr_len);
825 entry->dev = dev;
826 entry->last_used = jiffies;
827 init_timer(&entry->timer);
828 entry->timer.function = arp_expire_request;
829 entry->timer.data = (unsigned long)entry;
830 entry->timer.expires = ARP_RES_TIME;
831 entry->next = arp_tables[hash];
832 arp_tables[hash] = entry;
833 add_timer(&entry->timer);
834 entry->retries = ARP_MAX_TRIES;
835 skb_queue_head_init(&entry->skb);
836 if (skb != NULL)
837 {
838 skb_queue_tail(&entry->skb, skb);
839 skb_device_unlock(skb);
840 }
841 }
842 else
843 {
844 if (skb != NULL && skb->free)
845 kfree_skb(skb, FREE_WRITE);
846 }
847 sti();
848
849
850
851
852
853 arp_send(ARPOP_REQUEST, ETH_P_ARP, paddr, dev, saddr, NULL,
854 dev->dev_addr);
855
856 return 1;
857 }
858
859
860
861
862
863
864 #define HBUFFERLEN 30
865
866 int arp_get_info(char *buffer, char **start, off_t offset, int length)
867 {
868 int len=0;
869 off_t begin=0;
870 off_t pos=0;
871 int size;
872 struct arp_table *entry;
873 char hbuffer[HBUFFERLEN];
874 int i,j,k;
875 const char hexbuf[] = "0123456789ABCDEF";
876
877 size = sprintf(buffer,"IP address HW type Flags HW address\n");
878 pos+=size;
879 len+=size;
880
881 cli();
882 for(i=0; i<ARP_TABLE_SIZE; i++)
883 {
884 for(entry=arp_tables[i]; entry!=NULL; entry=entry->next)
885 {
886
887
888
889 #ifdef CONFIG_AX25
890
891 if(entry->htype==ARPHRD_AX25)
892 strcpy(hbuffer,ax2asc((ax25_address *)entry->ha));
893 else {
894 #endif
895
896 for(k=0,j=0;k<HBUFFERLEN-3 && j<entry->hlen;j++)
897 {
898 hbuffer[k++]=hexbuf[ (entry->ha[j]>>4)&15 ];
899 hbuffer[k++]=hexbuf[ entry->ha[j]&15 ];
900 hbuffer[k++]=':';
901 }
902 hbuffer[--k]=0;
903
904 #ifdef CONFIG_AX25
905 }
906 #endif
907 size = sprintf(buffer+len,
908 "%-17s0x%-10x0x%-10x%s\n",
909 in_ntoa(entry->ip),
910 (unsigned int)entry->htype,
911 entry->flags,
912 hbuffer);
913
914 len+=size;
915 pos=begin+len;
916
917 if(pos<offset)
918 {
919 len=0;
920 begin=pos;
921 }
922 if(pos>offset+length)
923 break;
924 }
925 }
926 sti();
927
928 *start=buffer+(offset-begin);
929 len-=(offset-begin);
930 if(len>length)
931 len=length;
932 return len;
933 }
934
935
936
937
938
939
940
941 static struct arp_table *arp_lookup(unsigned long paddr)
942 {
943 struct arp_table *entry;
944 unsigned long hash = HASH(paddr);
945
946 cli();
947 for (entry = arp_tables[hash]; entry != NULL; entry = entry->next)
948 if (entry->ip == paddr) break;
949 return entry;
950 }
951
952
953
954
955
956
957 static int arp_req_set(struct arpreq *req)
958 {
959 struct arpreq r;
960 struct arp_table *entry;
961 struct sockaddr_in *si;
962 int htype, hlen;
963 unsigned long ip, hash;
964 struct rtable *rt;
965
966 memcpy_fromfs(&r, req, sizeof(r));
967
968
969 if (r.arp_pa.sa_family != AF_INET)
970 return -EPFNOSUPPORT;
971
972
973
974
975
976
977
978 switch (r.arp_ha.sa_family) {
979 case ARPHRD_ETHER:
980 htype = ARPHRD_ETHER;
981 hlen = ETH_ALEN;
982 break;
983 #ifdef CONFIG_AX25
984 case ARPHRD_AX25:
985 htype = ARPHRD_AX25;
986 hlen = 7;
987 break;
988 #endif
989 default:
990 return -EPFNOSUPPORT;
991 }
992
993 si = (struct sockaddr_in *) &r.arp_pa;
994 ip = si->sin_addr.s_addr;
995 if (ip == 0)
996 {
997 printk("ARP: SETARP: requested PA is 0.0.0.0 !\n");
998 return -EINVAL;
999 }
1000
1001
1002
1003
1004
1005 rt = ip_rt_route(ip, NULL, NULL);
1006 if (rt == NULL)
1007 return -ENETUNREACH;
1008
1009
1010
1011
1012
1013 hash = HASH(ip);
1014 cli();
1015
1016
1017
1018
1019 for (entry = arp_tables[hash]; entry != NULL; entry = entry->next)
1020 if (entry->ip == ip)
1021 break;
1022
1023
1024
1025
1026
1027 if (entry == NULL)
1028 {
1029 entry = (struct arp_table *) kmalloc(sizeof(struct arp_table),
1030 GFP_ATOMIC);
1031 if (entry == NULL)
1032 {
1033 sti();
1034 return -ENOMEM;
1035 }
1036 entry->ip = ip;
1037 entry->hlen = hlen;
1038 entry->htype = htype;
1039 init_timer(&entry->timer);
1040 entry->next = arp_tables[hash];
1041 arp_tables[hash] = entry;
1042 skb_queue_head_init(&entry->skb);
1043 }
1044 else
1045 if (entry->flags & ATF_PUBL)
1046 proxies--;
1047
1048
1049
1050
1051 memcpy(&entry->ha, &r.arp_ha.sa_data, hlen);
1052 entry->last_used = jiffies;
1053 entry->flags = r.arp_flags | ATF_COM;
1054 if (entry->flags & ATF_PUBL)
1055 proxies++;
1056 entry->dev = rt->rt_dev;
1057 sti();
1058
1059 return 0;
1060 }
1061
1062
1063
1064
1065
1066
1067 static int arp_req_get(struct arpreq *req)
1068 {
1069 struct arpreq r;
1070 struct arp_table *entry;
1071 struct sockaddr_in *si;
1072
1073
1074
1075
1076
1077 memcpy_fromfs(&r, req, sizeof(r));
1078
1079 if (r.arp_pa.sa_family != AF_INET)
1080 return -EPFNOSUPPORT;
1081
1082
1083
1084
1085
1086 si = (struct sockaddr_in *) &r.arp_pa;
1087 entry = arp_lookup(si->sin_addr.s_addr);
1088
1089 if (entry == NULL)
1090 {
1091 sti();
1092 return -ENXIO;
1093 }
1094
1095
1096
1097
1098
1099 memcpy(r.arp_ha.sa_data, &entry->ha, entry->hlen);
1100 r.arp_ha.sa_family = entry->htype;
1101 r.arp_flags = entry->flags;
1102 sti();
1103
1104
1105
1106
1107
1108 memcpy_tofs(req, &r, sizeof(r));
1109 return 0;
1110 }
1111
1112
1113
1114
1115
1116
1117 int arp_ioctl(unsigned int cmd, void *arg)
1118 {
1119 struct arpreq r;
1120 struct sockaddr_in *si;
1121 int err;
1122
1123 switch(cmd)
1124 {
1125 case SIOCDARP:
1126 if (!suser())
1127 return -EPERM;
1128 err = verify_area(VERIFY_READ, arg, sizeof(struct arpreq));
1129 if(err)
1130 return err;
1131 memcpy_fromfs(&r, arg, sizeof(r));
1132 if (r.arp_pa.sa_family != AF_INET)
1133 return -EPFNOSUPPORT;
1134 si = (struct sockaddr_in *) &r.arp_pa;
1135 arp_destroy(si->sin_addr.s_addr, 1);
1136 return 0;
1137 case SIOCGARP:
1138 err = verify_area(VERIFY_WRITE, arg, sizeof(struct arpreq));
1139 if(err)
1140 return err;
1141 return arp_req_get((struct arpreq *)arg);
1142 case SIOCSARP:
1143 if (!suser())
1144 return -EPERM;
1145 err = verify_area(VERIFY_READ, arg, sizeof(struct arpreq));
1146 if(err)
1147 return err;
1148 return arp_req_set((struct arpreq *)arg);
1149 default:
1150 return -EINVAL;
1151 }
1152
1153 return 0;
1154 }
1155
1156
1157
1158
1159
1160
1161 static struct packet_type arp_packet_type =
1162 {
1163 0,
1164 0,
1165 arp_rcv,
1166 NULL,
1167 NULL
1168 };
1169
1170 void arp_init (void)
1171 {
1172
1173 arp_packet_type.type=htons(ETH_P_ARP);
1174 dev_add_pack(&arp_packet_type);
1175
1176 add_timer(&arp_timer);
1177 }
1178