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