Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/appletalk/aarp.c
15109 views
1
/*
2
* AARP: An implementation of the AppleTalk AARP protocol for
3
* Ethernet 'ELAP'.
4
*
5
* Alan Cox <[email protected]>
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
}
1064
1065