Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / net / appletalk / aarp.c
1 /*
2  *      AARP:           An implementation of the AppleTalk AARP protocol for
3  *                      Ethernet 'ELAP'.
4  *
5  *              Alan Cox  <Alan.Cox@linux.org>
6  *
7  *      This doesn't fit cleanly with the IP arp. Potentially we can use
8  *      the generic neighbour discovery code to clean this up.
9  *
10  *      FIXME:
11  *              We ought to handle the retransmits with a single list and a
12  *      separate fast timer for when it is needed.
13  *              Use neighbour discovery code.
14  *              Token Ring Support.
15  *
16  *              This program is free software; you can redistribute it and/or
17  *              modify it under the terms of the GNU General Public License
18  *              as published by the Free Software Foundation; either version
19  *              2 of the License, or (at your option) any later version.
20  *
21  *
22  *      References:
23  *              Inside AppleTalk (2nd Ed).
24  *      Fixes:
25  *              Jaume Grau      -       flush caches on AARP_PROBE
26  *              Rob Newberry    -       Added proxy AARP and AARP proc fs,
27  *                                      moved probing from DDP module.
28  *              Arnaldo C. Melo -       don't mangle rx packets
29  *
30  */
31
32 #include <linux/if_arp.h>
33 #include <linux/slab.h>
34 #include <net/sock.h>
35 #include <net/datalink.h>
36 #include <net/psnap.h>
37 #include <linux/atalk.h>
38 #include <linux/delay.h>
39 #include <linux/init.h>
40 #include <linux/proc_fs.h>
41 #include <linux/seq_file.h>
42
43 int sysctl_aarp_expiry_time = AARP_EXPIRY_TIME;
44 int sysctl_aarp_tick_time = AARP_TICK_TIME;
45 int sysctl_aarp_retransmit_limit = AARP_RETRANSMIT_LIMIT;
46 int sysctl_aarp_resolve_time = AARP_RESOLVE_TIME;
47
48 /* Lists of aarp entries */
49 /**
50  *      struct aarp_entry - AARP entry
51  *      @last_sent - Last time we xmitted the aarp request
52  *      @packet_queue - Queue of frames wait for resolution
53  *      @status - Used for proxy AARP
54  *      expires_at - Entry expiry time
55  *      target_addr - DDP Address
56  *      dev - Device to use
57  *      hwaddr - Physical i/f address of target/router
58  *      xmit_count - When this hits 10 we give up
59  *      next - Next entry in chain
60  */
61 struct aarp_entry {
62         /* These first two are only used for unresolved entries */
63         unsigned long           last_sent;
64         struct sk_buff_head     packet_queue;
65         int                     status;
66         unsigned long           expires_at;
67         struct atalk_addr       target_addr;
68         struct net_device       *dev;
69         char                    hwaddr[6];
70         unsigned short          xmit_count;
71         struct aarp_entry       *next;
72 };
73
74 /* Hashed list of resolved, unresolved and proxy entries */
75 static struct aarp_entry *resolved[AARP_HASH_SIZE];
76 static struct aarp_entry *unresolved[AARP_HASH_SIZE];
77 static struct aarp_entry *proxies[AARP_HASH_SIZE];
78 static int unresolved_count;
79
80 /* One lock protects it all. */
81 static DEFINE_RWLOCK(aarp_lock);
82
83 /* Used to walk the list and purge/kick entries.  */
84 static struct timer_list aarp_timer;
85
86 /*
87  *      Delete an aarp queue
88  *
89  *      Must run under aarp_lock.
90  */
91 static void __aarp_expire(struct aarp_entry *a)
92 {
93         skb_queue_purge(&a->packet_queue);
94         kfree(a);
95 }
96
97 /*
98  *      Send an aarp queue entry request
99  *
100  *      Must run under aarp_lock.
101  */
102 static void __aarp_send_query(struct aarp_entry *a)
103 {
104         static unsigned char aarp_eth_multicast[ETH_ALEN] =
105                                         { 0x09, 0x00, 0x07, 0xFF, 0xFF, 0xFF };
106         struct net_device *dev = a->dev;
107         struct elapaarp *eah;
108         int len = dev->hard_header_len + sizeof(*eah) + aarp_dl->header_length;
109         struct sk_buff *skb = alloc_skb(len, GFP_ATOMIC);
110         struct atalk_addr *sat = atalk_find_dev_addr(dev);
111
112         if (!skb)
113                 return;
114
115         if (!sat) {
116                 kfree_skb(skb);
117                 return;
118         }
119
120         /* Set up the buffer */
121         skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
122         skb_reset_network_header(skb);
123         skb_reset_transport_header(skb);
124         skb_put(skb, sizeof(*eah));
125         skb->protocol    = htons(ETH_P_ATALK);
126         skb->dev         = dev;
127         eah              = aarp_hdr(skb);
128
129         /* Set up the ARP */
130         eah->hw_type     = htons(AARP_HW_TYPE_ETHERNET);
131         eah->pa_type     = htons(ETH_P_ATALK);
132         eah->hw_len      = ETH_ALEN;
133         eah->pa_len      = AARP_PA_ALEN;
134         eah->function    = htons(AARP_REQUEST);
135
136         memcpy(eah->hw_src, dev->dev_addr, ETH_ALEN);
137
138         eah->pa_src_zero = 0;
139         eah->pa_src_net  = sat->s_net;
140         eah->pa_src_node = sat->s_node;
141
142         memset(eah->hw_dst, '\0', ETH_ALEN);
143
144         eah->pa_dst_zero = 0;
145         eah->pa_dst_net  = a->target_addr.s_net;
146         eah->pa_dst_node = a->target_addr.s_node;
147
148         /* Send it */
149         aarp_dl->request(aarp_dl, skb, aarp_eth_multicast);
150         /* Update the sending count */
151         a->xmit_count++;
152         a->last_sent = jiffies;
153 }
154
155 /* This runs under aarp_lock and in softint context, so only atomic memory
156  * allocations can be used. */
157 static void aarp_send_reply(struct net_device *dev, struct atalk_addr *us,
158                             struct atalk_addr *them, unsigned char *sha)
159 {
160         struct elapaarp *eah;
161         int len = dev->hard_header_len + sizeof(*eah) + aarp_dl->header_length;
162         struct sk_buff *skb = alloc_skb(len, GFP_ATOMIC);
163
164         if (!skb)
165                 return;
166
167         /* Set up the buffer */
168         skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
169         skb_reset_network_header(skb);
170         skb_reset_transport_header(skb);
171         skb_put(skb, sizeof(*eah));
172         skb->protocol    = htons(ETH_P_ATALK);
173         skb->dev         = dev;
174         eah              = aarp_hdr(skb);
175
176         /* Set up the ARP */
177         eah->hw_type     = htons(AARP_HW_TYPE_ETHERNET);
178         eah->pa_type     = htons(ETH_P_ATALK);
179         eah->hw_len      = ETH_ALEN;
180         eah->pa_len      = AARP_PA_ALEN;
181         eah->function    = htons(AARP_REPLY);
182
183         memcpy(eah->hw_src, dev->dev_addr, ETH_ALEN);
184
185         eah->pa_src_zero = 0;
186         eah->pa_src_net  = us->s_net;
187         eah->pa_src_node = us->s_node;
188
189         if (!sha)
190                 memset(eah->hw_dst, '\0', ETH_ALEN);
191         else
192                 memcpy(eah->hw_dst, sha, ETH_ALEN);
193
194         eah->pa_dst_zero = 0;
195         eah->pa_dst_net  = them->s_net;
196         eah->pa_dst_node = them->s_node;
197
198         /* Send it */
199         aarp_dl->request(aarp_dl, skb, sha);
200 }
201
202 /*
203  *      Send probe frames. Called from aarp_probe_network and
204  *      aarp_proxy_probe_network.
205  */
206
207 static void aarp_send_probe(struct net_device *dev, struct atalk_addr *us)
208 {
209         struct elapaarp *eah;
210         int len = dev->hard_header_len + sizeof(*eah) + aarp_dl->header_length;
211         struct sk_buff *skb = alloc_skb(len, GFP_ATOMIC);
212         static unsigned char aarp_eth_multicast[ETH_ALEN] =
213                                         { 0x09, 0x00, 0x07, 0xFF, 0xFF, 0xFF };
214
215         if (!skb)
216                 return;
217
218         /* Set up the buffer */
219         skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
220         skb_reset_network_header(skb);
221         skb_reset_transport_header(skb);
222         skb_put(skb, sizeof(*eah));
223         skb->protocol    = htons(ETH_P_ATALK);
224         skb->dev         = dev;
225         eah              = aarp_hdr(skb);
226
227         /* Set up the ARP */
228         eah->hw_type     = htons(AARP_HW_TYPE_ETHERNET);
229         eah->pa_type     = htons(ETH_P_ATALK);
230         eah->hw_len      = ETH_ALEN;
231         eah->pa_len      = AARP_PA_ALEN;
232         eah->function    = htons(AARP_PROBE);
233
234         memcpy(eah->hw_src, dev->dev_addr, ETH_ALEN);
235
236         eah->pa_src_zero = 0;
237         eah->pa_src_net  = us->s_net;
238         eah->pa_src_node = us->s_node;
239
240         memset(eah->hw_dst, '\0', ETH_ALEN);
241
242         eah->pa_dst_zero = 0;
243         eah->pa_dst_net  = us->s_net;
244         eah->pa_dst_node = us->s_node;
245
246         /* Send it */
247         aarp_dl->request(aarp_dl, skb, aarp_eth_multicast);
248 }
249
250 /*
251  *      Handle an aarp timer expire
252  *
253  *      Must run under the aarp_lock.
254  */
255
256 static void __aarp_expire_timer(struct aarp_entry **n)
257 {
258         struct aarp_entry *t;
259
260         while (*n)
261                 /* Expired ? */
262                 if (time_after(jiffies, (*n)->expires_at)) {
263                         t = *n;
264                         *n = (*n)->next;
265                         __aarp_expire(t);
266                 } else
267                         n = &((*n)->next);
268 }
269
270 /*
271  *      Kick all pending requests 5 times a second.
272  *
273  *      Must run under the aarp_lock.
274  */
275 static void __aarp_kick(struct aarp_entry **n)
276 {
277         struct aarp_entry *t;
278
279         while (*n)
280                 /* Expired: if this will be the 11th tx, we delete instead. */
281                 if ((*n)->xmit_count >= sysctl_aarp_retransmit_limit) {
282                         t = *n;
283                         *n = (*n)->next;
284                         __aarp_expire(t);
285                 } else {
286                         __aarp_send_query(*n);
287                         n = &((*n)->next);
288                 }
289 }
290
291 /*
292  *      A device has gone down. Take all entries referring to the device
293  *      and remove them.
294  *
295  *      Must run under the aarp_lock.
296  */
297 static void __aarp_expire_device(struct aarp_entry **n, struct net_device *dev)
298 {
299         struct aarp_entry *t;
300
301         while (*n)
302                 if ((*n)->dev == dev) {
303                         t = *n;
304                         *n = (*n)->next;
305                         __aarp_expire(t);
306                 } else
307                         n = &((*n)->next);
308 }
309
310 /* Handle the timer event */
311 static void aarp_expire_timeout(unsigned long unused)
312 {
313         int ct;
314
315         write_lock_bh(&aarp_lock);
316
317         for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
318                 __aarp_expire_timer(&resolved[ct]);
319                 __aarp_kick(&unresolved[ct]);
320                 __aarp_expire_timer(&unresolved[ct]);
321                 __aarp_expire_timer(&proxies[ct]);
322         }
323
324         write_unlock_bh(&aarp_lock);
325         mod_timer(&aarp_timer, jiffies +
326                                (unresolved_count ? sysctl_aarp_tick_time :
327                                 sysctl_aarp_expiry_time));
328 }
329
330 /* Network device notifier chain handler. */
331 static int aarp_device_event(struct notifier_block *this, unsigned long event,
332                              void *ptr)
333 {
334         struct net_device *dev = ptr;
335         int ct;
336
337         if (!net_eq(dev_net(dev), &init_net))
338                 return NOTIFY_DONE;
339
340         if (event == NETDEV_DOWN) {
341                 write_lock_bh(&aarp_lock);
342
343                 for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
344                         __aarp_expire_device(&resolved[ct], dev);
345                         __aarp_expire_device(&unresolved[ct], dev);
346                         __aarp_expire_device(&proxies[ct], dev);
347                 }
348
349                 write_unlock_bh(&aarp_lock);
350         }
351         return NOTIFY_DONE;
352 }
353
354 /* Expire all entries in a hash chain */
355 static void __aarp_expire_all(struct aarp_entry **n)
356 {
357         struct aarp_entry *t;
358
359         while (*n) {
360                 t = *n;
361                 *n = (*n)->next;
362                 __aarp_expire(t);
363         }
364 }
365
366 /* Cleanup all hash chains -- module unloading */
367 static void aarp_purge(void)
368 {
369         int ct;
370
371         write_lock_bh(&aarp_lock);
372         for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
373                 __aarp_expire_all(&resolved[ct]);
374                 __aarp_expire_all(&unresolved[ct]);
375                 __aarp_expire_all(&proxies[ct]);
376         }
377         write_unlock_bh(&aarp_lock);
378 }
379
380 /*
381  *      Create a new aarp entry.  This must use GFP_ATOMIC because it
382  *      runs while holding spinlocks.
383  */
384 static struct aarp_entry *aarp_alloc(void)
385 {
386         struct aarp_entry *a = kmalloc(sizeof(*a), GFP_ATOMIC);
387
388         if (a)
389                 skb_queue_head_init(&a->packet_queue);
390         return a;
391 }
392
393 /*
394  * Find an entry. We might return an expired but not yet purged entry. We
395  * don't care as it will do no harm.
396  *
397  * This must run under the aarp_lock.
398  */
399 static struct aarp_entry *__aarp_find_entry(struct aarp_entry *list,
400                                             struct net_device *dev,
401                                             struct atalk_addr *sat)
402 {
403         while (list) {
404                 if (list->target_addr.s_net == sat->s_net &&
405                     list->target_addr.s_node == sat->s_node &&
406                     list->dev == dev)
407                         break;
408                 list = list->next;
409         }
410
411         return list;
412 }
413
414 /* Called from the DDP code, and thus must be exported. */
415 void aarp_proxy_remove(struct net_device *dev, struct atalk_addr *sa)
416 {
417         int hash = sa->s_node % (AARP_HASH_SIZE - 1);
418         struct aarp_entry *a;
419
420         write_lock_bh(&aarp_lock);
421
422         a = __aarp_find_entry(proxies[hash], dev, sa);
423         if (a)
424                 a->expires_at = jiffies - 1;
425
426         write_unlock_bh(&aarp_lock);
427 }
428
429 /* This must run under aarp_lock. */
430 static struct atalk_addr *__aarp_proxy_find(struct net_device *dev,
431                                             struct atalk_addr *sa)
432 {
433         int hash = sa->s_node % (AARP_HASH_SIZE - 1);
434         struct aarp_entry *a = __aarp_find_entry(proxies[hash], dev, sa);
435
436         return a ? sa : NULL;
437 }
438
439 /*
440  * Probe a Phase 1 device or a device that requires its Net:Node to
441  * be set via an ioctl.
442  */
443 static void aarp_send_probe_phase1(struct atalk_iface *iface)
444 {
445         struct ifreq atreq;
446         struct sockaddr_at *sa = (struct sockaddr_at *)&atreq.ifr_addr;
447         const struct net_device_ops *ops = iface->dev->netdev_ops;
448
449         sa->sat_addr.s_node = iface->address.s_node;
450         sa->sat_addr.s_net = ntohs(iface->address.s_net);
451
452         /* We pass the Net:Node to the drivers/cards by a Device ioctl. */
453         if (!(ops->ndo_do_ioctl(iface->dev, &atreq, SIOCSIFADDR))) {
454                 ops->ndo_do_ioctl(iface->dev, &atreq, SIOCGIFADDR);
455                 if (iface->address.s_net != htons(sa->sat_addr.s_net) ||
456                     iface->address.s_node != sa->sat_addr.s_node)
457                         iface->status |= ATIF_PROBE_FAIL;
458
459                 iface->address.s_net  = htons(sa->sat_addr.s_net);
460                 iface->address.s_node = sa->sat_addr.s_node;
461         }
462 }
463
464
465 void aarp_probe_network(struct atalk_iface *atif)
466 {
467         if (atif->dev->type == ARPHRD_LOCALTLK ||
468             atif->dev->type == ARPHRD_PPP)
469                 aarp_send_probe_phase1(atif);
470         else {
471                 unsigned int count;
472
473                 for (count = 0; count < AARP_RETRANSMIT_LIMIT; count++) {
474                         aarp_send_probe(atif->dev, &atif->address);
475
476                         /* Defer 1/10th */
477                         msleep(100);
478
479                         if (atif->status & ATIF_PROBE_FAIL)
480                                 break;
481                 }
482         }
483 }
484
485 int aarp_proxy_probe_network(struct atalk_iface *atif, struct atalk_addr *sa)
486 {
487         int hash, retval = -EPROTONOSUPPORT;
488         struct aarp_entry *entry;
489         unsigned int count;
490
491         /*
492          * we don't currently support LocalTalk or PPP for proxy AARP;
493          * if someone wants to try and add it, have fun
494          */
495         if (atif->dev->type == ARPHRD_LOCALTLK ||
496             atif->dev->type == ARPHRD_PPP)
497                 goto out;
498
499         /*
500          * create a new AARP entry with the flags set to be published --
501          * we need this one to hang around even if it's in use
502          */
503         entry = aarp_alloc();
504         retval = -ENOMEM;
505         if (!entry)
506                 goto out;
507
508         entry->expires_at = -1;
509         entry->status = ATIF_PROBE;
510         entry->target_addr.s_node = sa->s_node;
511         entry->target_addr.s_net = sa->s_net;
512         entry->dev = atif->dev;
513
514         write_lock_bh(&aarp_lock);
515
516         hash = sa->s_node % (AARP_HASH_SIZE - 1);
517         entry->next = proxies[hash];
518         proxies[hash] = entry;
519
520         for (count = 0; count < AARP_RETRANSMIT_LIMIT; count++) {
521                 aarp_send_probe(atif->dev, sa);
522
523                 /* Defer 1/10th */
524                 write_unlock_bh(&aarp_lock);
525                 msleep(100);
526                 write_lock_bh(&aarp_lock);
527
528                 if (entry->status & ATIF_PROBE_FAIL)
529                         break;
530         }
531
532         if (entry->status & ATIF_PROBE_FAIL) {
533                 entry->expires_at = jiffies - 1; /* free the entry */
534                 retval = -EADDRINUSE; /* return network full */
535         } else { /* clear the probing flag */
536                 entry->status &= ~ATIF_PROBE;
537                 retval = 1;
538         }
539
540         write_unlock_bh(&aarp_lock);
541 out:
542         return retval;
543 }
544
545 /* Send a DDP frame */
546 int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb,
547                   struct atalk_addr *sa, void *hwaddr)
548 {
549         static char ddp_eth_multicast[ETH_ALEN] =
550                 { 0x09, 0x00, 0x07, 0xFF, 0xFF, 0xFF };
551         int hash;
552         struct aarp_entry *a;
553
554         skb_reset_network_header(skb);
555
556         /* Check for LocalTalk first */
557         if (dev->type == ARPHRD_LOCALTLK) {
558                 struct atalk_addr *at = atalk_find_dev_addr(dev);
559                 struct ddpehdr *ddp = (struct ddpehdr *)skb->data;
560                 int ft = 2;
561
562                 /*
563                  * Compressible ?
564                  *
565                  * IFF: src_net == dest_net == device_net
566                  * (zero matches anything)
567                  */
568
569                 if ((!ddp->deh_snet || at->s_net == ddp->deh_snet) &&
570                     (!ddp->deh_dnet || at->s_net == ddp->deh_dnet)) {
571                         skb_pull(skb, sizeof(*ddp) - 4);
572
573                         /*
574                          *      The upper two remaining bytes are the port
575                          *      numbers we just happen to need. Now put the
576                          *      length in the lower two.
577                          */
578                         *((__be16 *)skb->data) = htons(skb->len);
579                         ft = 1;
580                 }
581                 /*
582                  * Nice and easy. No AARP type protocols occur here so we can
583                  * just shovel it out with a 3 byte LLAP header
584                  */
585
586                 skb_push(skb, 3);
587                 skb->data[0] = sa->s_node;
588                 skb->data[1] = at->s_node;
589                 skb->data[2] = ft;
590                 skb->dev     = dev;
591                 goto sendit;
592         }
593
594         /* On a PPP link we neither compress nor aarp.  */
595         if (dev->type == ARPHRD_PPP) {
596                 skb->protocol = htons(ETH_P_PPPTALK);
597                 skb->dev = dev;
598                 goto sendit;
599         }
600
601         /* Non ELAP we cannot do. */
602         if (dev->type != ARPHRD_ETHER)
603                 goto free_it;
604
605         skb->dev = dev;
606         skb->protocol = htons(ETH_P_ATALK);
607         hash = sa->s_node % (AARP_HASH_SIZE - 1);
608
609         /* Do we have a resolved entry? */
610         if (sa->s_node == ATADDR_BCAST) {
611                 /* Send it */
612                 ddp_dl->request(ddp_dl, skb, ddp_eth_multicast);
613                 goto sent;
614         }
615
616         write_lock_bh(&aarp_lock);
617         a = __aarp_find_entry(resolved[hash], dev, sa);
618
619         if (a) { /* Return 1 and fill in the address */
620                 a->expires_at = jiffies + (sysctl_aarp_expiry_time * 10);
621                 ddp_dl->request(ddp_dl, skb, a->hwaddr);
622                 write_unlock_bh(&aarp_lock);
623                 goto sent;
624         }
625
626         /* Do we have an unresolved entry: This is the less common path */
627         a = __aarp_find_entry(unresolved[hash], dev, sa);
628         if (a) { /* Queue onto the unresolved queue */
629                 skb_queue_tail(&a->packet_queue, skb);
630                 goto out_unlock;
631         }
632
633         /* Allocate a new entry */
634         a = aarp_alloc();
635         if (!a) {
636                 /* Whoops slipped... good job it's an unreliable protocol 8) */
637                 write_unlock_bh(&aarp_lock);
638                 goto free_it;
639         }
640
641         /* Set up the queue */
642         skb_queue_tail(&a->packet_queue, skb);
643         a->expires_at    = jiffies + sysctl_aarp_resolve_time;
644         a->dev           = dev;
645         a->next          = unresolved[hash];
646         a->target_addr   = *sa;
647         a->xmit_count    = 0;
648         unresolved[hash] = a;
649         unresolved_count++;
650
651         /* Send an initial request for the address */
652         __aarp_send_query(a);
653
654         /*
655          * Switch to fast timer if needed (That is if this is the first
656          * unresolved entry to get added)
657          */
658
659         if (unresolved_count == 1)
660                 mod_timer(&aarp_timer, jiffies + sysctl_aarp_tick_time);
661
662         /* Now finally, it is safe to drop the lock. */
663 out_unlock:
664         write_unlock_bh(&aarp_lock);
665
666         /* Tell the ddp layer we have taken over for this frame. */
667         goto sent;
668
669 sendit:
670         if (skb->sk)
671                 skb->priority = skb->sk->sk_priority;
672         if (dev_queue_xmit(skb))
673                 goto drop;
674 sent:
675         return NET_XMIT_SUCCESS;
676 free_it:
677         kfree_skb(skb);
678 drop:
679         return NET_XMIT_DROP;
680 }
681 EXPORT_SYMBOL(aarp_send_ddp);
682
683 /*
684  *      An entry in the aarp unresolved queue has become resolved. Send
685  *      all the frames queued under it.
686  *
687  *      Must run under aarp_lock.
688  */
689 static void __aarp_resolved(struct aarp_entry **list, struct aarp_entry *a,
690                             int hash)
691 {
692         struct sk_buff *skb;
693
694         while (*list)
695                 if (*list == a) {
696                         unresolved_count--;
697                         *list = a->next;
698
699                         /* Move into the resolved list */
700                         a->next = resolved[hash];
701                         resolved[hash] = a;
702
703                         /* Kick frames off */
704                         while ((skb = skb_dequeue(&a->packet_queue)) != NULL) {
705                                 a->expires_at = jiffies +
706                                                 sysctl_aarp_expiry_time * 10;
707                                 ddp_dl->request(ddp_dl, skb, a->hwaddr);
708                         }
709                 } else
710                         list = &((*list)->next);
711 }
712
713 /*
714  *      This is called by the SNAP driver whenever we see an AARP SNAP
715  *      frame. We currently only support Ethernet.
716  */
717 static int aarp_rcv(struct sk_buff *skb, struct net_device *dev,
718                     struct packet_type *pt, struct net_device *orig_dev)
719 {
720         struct elapaarp *ea = aarp_hdr(skb);
721         int hash, ret = 0;
722         __u16 function;
723         struct aarp_entry *a;
724         struct atalk_addr sa, *ma, da;
725         struct atalk_iface *ifa;
726
727         if (!net_eq(dev_net(dev), &init_net))
728                 goto out0;
729
730         /* We only do Ethernet SNAP AARP. */
731         if (dev->type != ARPHRD_ETHER)
732                 goto out0;
733
734         /* Frame size ok? */
735         if (!skb_pull(skb, sizeof(*ea)))
736                 goto out0;
737
738         function = ntohs(ea->function);
739
740         /* Sanity check fields. */
741         if (function < AARP_REQUEST || function > AARP_PROBE ||
742             ea->hw_len != ETH_ALEN || ea->pa_len != AARP_PA_ALEN ||
743             ea->pa_src_zero || ea->pa_dst_zero)
744                 goto out0;
745
746         /* Looks good. */
747         hash = ea->pa_src_node % (AARP_HASH_SIZE - 1);
748
749         /* Build an address. */
750         sa.s_node = ea->pa_src_node;
751         sa.s_net = ea->pa_src_net;
752
753         /* Process the packet. Check for replies of me. */
754         ifa = atalk_find_dev(dev);
755         if (!ifa)
756                 goto out1;
757
758         if (ifa->status & ATIF_PROBE &&
759             ifa->address.s_node == ea->pa_dst_node &&
760             ifa->address.s_net == ea->pa_dst_net) {
761                 ifa->status |= ATIF_PROBE_FAIL; /* Fail the probe (in use) */
762                 goto out1;
763         }
764
765         /* Check for replies of proxy AARP entries */
766         da.s_node = ea->pa_dst_node;
767         da.s_net  = ea->pa_dst_net;
768
769         write_lock_bh(&aarp_lock);
770         a = __aarp_find_entry(proxies[hash], dev, &da);
771
772         if (a && a->status & ATIF_PROBE) {
773                 a->status |= ATIF_PROBE_FAIL;
774                 /*
775                  * we do not respond to probe or request packets for
776                  * this address while we are probing this address
777                  */
778                 goto unlock;
779         }
780
781         switch (function) {
782         case AARP_REPLY:
783                 if (!unresolved_count)  /* Speed up */
784                         break;
785
786                 /* Find the entry.  */
787                 a = __aarp_find_entry(unresolved[hash], dev, &sa);
788                 if (!a || dev != a->dev)
789                         break;
790
791                 /* We can fill one in - this is good. */
792                 memcpy(a->hwaddr, ea->hw_src, ETH_ALEN);
793                 __aarp_resolved(&unresolved[hash], a, hash);
794                 if (!unresolved_count)
795                         mod_timer(&aarp_timer,
796                                   jiffies + sysctl_aarp_expiry_time);
797                 break;
798
799         case AARP_REQUEST:
800         case AARP_PROBE:
801
802                 /*
803                  * If it is my address set ma to my address and reply.
804                  * We can treat probe and request the same.  Probe
805                  * simply means we shouldn't cache the querying host,
806                  * as in a probe they are proposing an address not
807                  * using one.
808                  *
809                  * Support for proxy-AARP added. We check if the
810                  * address is one of our proxies before we toss the
811                  * packet out.
812                  */
813
814                 sa.s_node = ea->pa_dst_node;
815                 sa.s_net  = ea->pa_dst_net;
816
817                 /* See if we have a matching proxy. */
818                 ma = __aarp_proxy_find(dev, &sa);
819                 if (!ma)
820                         ma = &ifa->address;
821                 else { /* We need to make a copy of the entry. */
822                         da.s_node = sa.s_node;
823                         da.s_net = sa.s_net;
824                         ma = &da;
825                 }
826
827                 if (function == AARP_PROBE) {
828                         /*
829                          * A probe implies someone trying to get an
830                          * address. So as a precaution flush any
831                          * entries we have for this address.
832                          */
833                         a = __aarp_find_entry(resolved[sa.s_node %
834                                                        (AARP_HASH_SIZE - 1)],
835                                               skb->dev, &sa);
836
837                         /*
838                          * Make it expire next tick - that avoids us
839                          * getting into a probe/flush/learn/probe/
840                          * flush/learn cycle during probing of a slow
841                          * to respond host addr.
842                          */
843                         if (a) {
844                                 a->expires_at = jiffies - 1;
845                                 mod_timer(&aarp_timer, jiffies +
846                                           sysctl_aarp_tick_time);
847                         }
848                 }
849
850                 if (sa.s_node != ma->s_node)
851                         break;
852
853                 if (sa.s_net && ma->s_net && sa.s_net != ma->s_net)
854                         break;
855
856                 sa.s_node = ea->pa_src_node;
857                 sa.s_net = ea->pa_src_net;
858
859                 /* aarp_my_address has found the address to use for us.
860                  */
861                 aarp_send_reply(dev, ma, &sa, ea->hw_src);
862                 break;
863         }
864
865 unlock:
866         write_unlock_bh(&aarp_lock);
867 out1:
868         ret = 1;
869 out0:
870         kfree_skb(skb);
871         return ret;
872 }
873
874 static struct notifier_block aarp_notifier = {
875         .notifier_call = aarp_device_event,
876 };
877
878 static unsigned char aarp_snap_id[] = { 0x00, 0x00, 0x00, 0x80, 0xF3 };
879
880 void __init aarp_proto_init(void)
881 {
882         aarp_dl = register_snap_client(aarp_snap_id, aarp_rcv);
883         if (!aarp_dl)
884                 printk(KERN_CRIT "Unable to register AARP with SNAP.\n");
885         setup_timer(&aarp_timer, aarp_expire_timeout, 0);
886         aarp_timer.expires  = jiffies + sysctl_aarp_expiry_time;
887         add_timer(&aarp_timer);
888         register_netdevice_notifier(&aarp_notifier);
889 }
890
891 /* Remove the AARP entries associated with a device. */
892 void aarp_device_down(struct net_device *dev)
893 {
894         int ct;
895
896         write_lock_bh(&aarp_lock);
897
898         for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
899                 __aarp_expire_device(&resolved[ct], dev);
900                 __aarp_expire_device(&unresolved[ct], dev);
901                 __aarp_expire_device(&proxies[ct], dev);
902         }
903
904         write_unlock_bh(&aarp_lock);
905 }
906
907 #ifdef CONFIG_PROC_FS
908 struct aarp_iter_state {
909         int bucket;
910         struct aarp_entry **table;
911 };
912
913 /*
914  * Get the aarp entry that is in the chain described
915  * by the iterator.
916  * If pos is set then skip till that index.
917  * pos = 1 is the first entry
918  */
919 static struct aarp_entry *iter_next(struct aarp_iter_state *iter, loff_t *pos)
920 {
921         int ct = iter->bucket;
922         struct aarp_entry **table = iter->table;
923         loff_t off = 0;
924         struct aarp_entry *entry;
925
926  rescan:
927         while(ct < AARP_HASH_SIZE) {
928                 for (entry = table[ct]; entry; entry = entry->next) {
929                         if (!pos || ++off == *pos) {
930                                 iter->table = table;
931                                 iter->bucket = ct;
932                                 return entry;
933                         }
934                 }
935                 ++ct;
936         }
937
938         if (table == resolved) {
939                 ct = 0;
940                 table = unresolved;
941                 goto rescan;
942         }
943         if (table == unresolved) {
944                 ct = 0;
945                 table = proxies;
946                 goto rescan;
947         }
948         return NULL;
949 }
950
951 static void *aarp_seq_start(struct seq_file *seq, loff_t *pos)
952         __acquires(aarp_lock)
953 {
954         struct aarp_iter_state *iter = seq->private;
955
956         read_lock_bh(&aarp_lock);
957         iter->table     = resolved;
958         iter->bucket    = 0;
959
960         return *pos ? iter_next(iter, pos) : SEQ_START_TOKEN;
961 }
962
963 static void *aarp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
964 {
965         struct aarp_entry *entry = v;
966         struct aarp_iter_state *iter = seq->private;
967
968         ++*pos;
969
970         /* first line after header */
971         if (v == SEQ_START_TOKEN)
972                 entry = iter_next(iter, NULL);
973
974         /* next entry in current bucket */
975         else if (entry->next)
976                 entry = entry->next;
977
978         /* next bucket or table */
979         else {
980                 ++iter->bucket;
981                 entry = iter_next(iter, NULL);
982         }
983         return entry;
984 }
985
986 static void aarp_seq_stop(struct seq_file *seq, void *v)
987         __releases(aarp_lock)
988 {
989         read_unlock_bh(&aarp_lock);
990 }
991
992 static const char *dt2str(unsigned long ticks)
993 {
994         static char buf[32];
995
996         sprintf(buf, "%ld.%02ld", ticks / HZ, ((ticks % HZ) * 100 ) / HZ);
997
998         return buf;
999 }
1000
1001 static int aarp_seq_show(struct seq_file *seq, void *v)
1002 {
1003         struct aarp_iter_state *iter = seq->private;
1004         struct aarp_entry *entry = v;
1005         unsigned long now = jiffies;
1006
1007         if (v == SEQ_START_TOKEN)
1008                 seq_puts(seq,
1009                          "Address  Interface   Hardware Address"
1010                          "   Expires LastSend  Retry Status\n");
1011         else {
1012                 seq_printf(seq, "%04X:%02X  %-12s",
1013                            ntohs(entry->target_addr.s_net),
1014                            (unsigned int) entry->target_addr.s_node,
1015                            entry->dev ? entry->dev->name : "????");
1016                 seq_printf(seq, "%pM", entry->hwaddr);
1017                 seq_printf(seq, " %8s",
1018                            dt2str((long)entry->expires_at - (long)now));
1019                 if (iter->table == unresolved)
1020                         seq_printf(seq, " %8s %6hu",
1021                                    dt2str(now - entry->last_sent),
1022                                    entry->xmit_count);
1023                 else
1024                         seq_puts(seq, "                ");
1025                 seq_printf(seq, " %s\n",
1026                            (iter->table == resolved) ? "resolved"
1027                            : (iter->table == unresolved) ? "unresolved"
1028                            : (iter->table == proxies) ? "proxies"
1029                            : "unknown");
1030         }
1031         return 0;
1032 }
1033
1034 static const struct seq_operations aarp_seq_ops = {
1035         .start  = aarp_seq_start,
1036         .next   = aarp_seq_next,
1037         .stop   = aarp_seq_stop,
1038         .show   = aarp_seq_show,
1039 };
1040
1041 static int aarp_seq_open(struct inode *inode, struct file *file)
1042 {
1043         return seq_open_private(file, &aarp_seq_ops,
1044                         sizeof(struct aarp_iter_state));
1045 }
1046
1047 const struct file_operations atalk_seq_arp_fops = {
1048         .owner          = THIS_MODULE,
1049         .open           = aarp_seq_open,
1050         .read           = seq_read,
1051         .llseek         = seq_lseek,
1052         .release        = seq_release_private,
1053 };
1054 #endif
1055
1056 /* General module cleanup. Called from cleanup_module() in ddp.c. */
1057 void aarp_cleanup_module(void)
1058 {
1059         del_timer_sync(&aarp_timer);
1060         unregister_netdevice_notifier(&aarp_notifier);
1061         unregister_snap_client(aarp_dl);
1062         aarp_purge();
1063 }