xref: /linux/net/appletalk/aarp.c (revision 407c114c983f6eb87161853f0fdbe4a08e394b92)
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