Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/net/appletalk/ddp.c
26282 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* DDP: An implementation of the AppleTalk DDP protocol for
4
* Ethernet 'ELAP'.
5
*
6
* Alan Cox <[email protected]>
7
*
8
* With more than a little assistance from
9
*
10
* Wesley Craig <[email protected]>
11
*
12
* Fixes:
13
* Neil Horman : Added missing device ioctls
14
* Michael Callahan : Made routing work
15
* Wesley Craig : Fix probing to listen to a
16
* passed node id.
17
* Alan Cox : Added send/recvmsg support
18
* Alan Cox : Moved at. to protinfo in
19
* socket.
20
* Alan Cox : Added firewall hooks.
21
* Alan Cox : Supports new ARPHRD_LOOPBACK
22
* Christer Weinigel : Routing and /proc fixes.
23
* Bradford Johnson : LocalTalk.
24
* Tom Dyas : Module support.
25
* Alan Cox : Hooks for PPP (based on the
26
* LocalTalk hook).
27
* Alan Cox : Posix bits
28
* Alan Cox/Mike Freeman : Possible fix to NBP problems
29
* Bradford Johnson : IP-over-DDP (experimental)
30
* Jay Schulist : Moved IP-over-DDP to its own
31
* driver file. (ipddp.c & ipddp.h)
32
* Jay Schulist : Made work as module with
33
* AppleTalk drivers, cleaned it.
34
* Rob Newberry : Added proxy AARP and AARP
35
* procfs, moved probing to AARP
36
* module.
37
* Adrian Sun/
38
* Michael Zuelsdorff : fix for net.0 packets. don't
39
* allow illegal ether/tokentalk
40
* port assignment. we lose a
41
* valid localtalk port as a
42
* result.
43
* Arnaldo C. de Melo : Cleanup, in preparation for
44
* shared skb support 8)
45
* Arnaldo C. de Melo : Move proc stuff to atalk_proc.c,
46
* use seq_file
47
*/
48
49
#include <linux/capability.h>
50
#include <linux/module.h>
51
#include <linux/if_arp.h>
52
#include <linux/termios.h> /* For TIOCOUTQ/INQ */
53
#include <linux/compat.h>
54
#include <linux/slab.h>
55
#include <net/datalink.h>
56
#include <net/psnap.h>
57
#include <net/sock.h>
58
#include <net/tcp_states.h>
59
#include <net/route.h>
60
#include <net/compat.h>
61
#include <linux/atalk.h>
62
#include <linux/highmem.h>
63
64
struct datalink_proto *ddp_dl, *aarp_dl;
65
static const struct proto_ops atalk_dgram_ops;
66
67
/**************************************************************************\
68
* *
69
* Handlers for the socket list. *
70
* *
71
\**************************************************************************/
72
73
HLIST_HEAD(atalk_sockets);
74
DEFINE_RWLOCK(atalk_sockets_lock);
75
76
static inline void __atalk_insert_socket(struct sock *sk)
77
{
78
sk_add_node(sk, &atalk_sockets);
79
}
80
81
static inline void atalk_remove_socket(struct sock *sk)
82
{
83
write_lock_bh(&atalk_sockets_lock);
84
sk_del_node_init(sk);
85
write_unlock_bh(&atalk_sockets_lock);
86
}
87
88
static struct sock *atalk_search_socket(struct sockaddr_at *to,
89
struct atalk_iface *atif)
90
{
91
struct sock *def_socket = NULL;
92
struct sock *s;
93
94
read_lock_bh(&atalk_sockets_lock);
95
sk_for_each(s, &atalk_sockets) {
96
struct atalk_sock *at = at_sk(s);
97
98
if (to->sat_port != at->src_port)
99
continue;
100
101
if (to->sat_addr.s_net == ATADDR_ANYNET &&
102
to->sat_addr.s_node == ATADDR_BCAST) {
103
if (atif->address.s_node == at->src_node &&
104
atif->address.s_net == at->src_net) {
105
/* This socket's address matches the address of the interface
106
* that received the packet -- use it
107
*/
108
goto found;
109
}
110
111
/* Continue searching for a socket matching the interface address,
112
* but use this socket by default if no other one is found
113
*/
114
def_socket = s;
115
}
116
117
if (to->sat_addr.s_net == at->src_net &&
118
(to->sat_addr.s_node == at->src_node ||
119
to->sat_addr.s_node == ATADDR_BCAST ||
120
to->sat_addr.s_node == ATADDR_ANYNODE))
121
goto found;
122
123
/* XXXX.0 -- we got a request for this router. make sure
124
* that the node is appropriately set. */
125
if (to->sat_addr.s_node == ATADDR_ANYNODE &&
126
to->sat_addr.s_net != ATADDR_ANYNET &&
127
atif->address.s_node == at->src_node) {
128
to->sat_addr.s_node = atif->address.s_node;
129
goto found;
130
}
131
}
132
s = def_socket;
133
found:
134
read_unlock_bh(&atalk_sockets_lock);
135
return s;
136
}
137
138
/**
139
* atalk_find_or_insert_socket - Try to find a socket matching ADDR
140
* @sk: socket to insert in the list if it is not there already
141
* @sat: address to search for
142
*
143
* Try to find a socket matching ADDR in the socket list, if found then return
144
* it. If not, insert SK into the socket list.
145
*
146
* This entire operation must execute atomically.
147
*/
148
static struct sock *atalk_find_or_insert_socket(struct sock *sk,
149
struct sockaddr_at *sat)
150
{
151
struct sock *s;
152
struct atalk_sock *at;
153
154
write_lock_bh(&atalk_sockets_lock);
155
sk_for_each(s, &atalk_sockets) {
156
at = at_sk(s);
157
158
if (at->src_net == sat->sat_addr.s_net &&
159
at->src_node == sat->sat_addr.s_node &&
160
at->src_port == sat->sat_port)
161
goto found;
162
}
163
s = NULL;
164
__atalk_insert_socket(sk); /* Wheee, it's free, assign and insert. */
165
found:
166
write_unlock_bh(&atalk_sockets_lock);
167
return s;
168
}
169
170
static void atalk_destroy_timer(struct timer_list *t)
171
{
172
struct sock *sk = timer_container_of(sk, t, sk_timer);
173
174
if (sk_has_allocations(sk)) {
175
sk->sk_timer.expires = jiffies + SOCK_DESTROY_TIME;
176
add_timer(&sk->sk_timer);
177
} else
178
sock_put(sk);
179
}
180
181
static inline void atalk_destroy_socket(struct sock *sk)
182
{
183
atalk_remove_socket(sk);
184
skb_queue_purge(&sk->sk_receive_queue);
185
186
if (sk_has_allocations(sk)) {
187
timer_setup(&sk->sk_timer, atalk_destroy_timer, 0);
188
sk->sk_timer.expires = jiffies + SOCK_DESTROY_TIME;
189
add_timer(&sk->sk_timer);
190
} else
191
sock_put(sk);
192
}
193
194
/**************************************************************************\
195
* *
196
* Routing tables for the AppleTalk socket layer. *
197
* *
198
\**************************************************************************/
199
200
/* Anti-deadlock ordering is atalk_routes_lock --> iface_lock -DaveM */
201
struct atalk_route *atalk_routes;
202
DEFINE_RWLOCK(atalk_routes_lock);
203
204
struct atalk_iface *atalk_interfaces;
205
DEFINE_RWLOCK(atalk_interfaces_lock);
206
207
/* For probing devices or in a routerless network */
208
struct atalk_route atrtr_default;
209
210
/* AppleTalk interface control */
211
/*
212
* Drop a device. Doesn't drop any of its routes - that is the caller's
213
* problem. Called when we down the interface or delete the address.
214
*/
215
static void atif_drop_device(struct net_device *dev)
216
{
217
struct atalk_iface **iface = &atalk_interfaces;
218
struct atalk_iface *tmp;
219
220
write_lock_bh(&atalk_interfaces_lock);
221
while ((tmp = *iface) != NULL) {
222
if (tmp->dev == dev) {
223
*iface = tmp->next;
224
dev_put(dev);
225
kfree(tmp);
226
dev->atalk_ptr = NULL;
227
} else
228
iface = &tmp->next;
229
}
230
write_unlock_bh(&atalk_interfaces_lock);
231
}
232
233
static struct atalk_iface *atif_add_device(struct net_device *dev,
234
struct atalk_addr *sa)
235
{
236
struct atalk_iface *iface = kzalloc(sizeof(*iface), GFP_KERNEL);
237
238
if (!iface)
239
goto out;
240
241
dev_hold(dev);
242
iface->dev = dev;
243
dev->atalk_ptr = iface;
244
iface->address = *sa;
245
iface->status = 0;
246
247
write_lock_bh(&atalk_interfaces_lock);
248
iface->next = atalk_interfaces;
249
atalk_interfaces = iface;
250
write_unlock_bh(&atalk_interfaces_lock);
251
out:
252
return iface;
253
}
254
255
/* Perform phase 2 AARP probing on our tentative address */
256
static int atif_probe_device(struct atalk_iface *atif)
257
{
258
int netrange = ntohs(atif->nets.nr_lastnet) -
259
ntohs(atif->nets.nr_firstnet) + 1;
260
int probe_net = ntohs(atif->address.s_net);
261
int probe_node = atif->address.s_node;
262
int netct, nodect;
263
264
/* Offset the network we start probing with */
265
if (probe_net == ATADDR_ANYNET) {
266
probe_net = ntohs(atif->nets.nr_firstnet);
267
if (netrange)
268
probe_net += jiffies % netrange;
269
}
270
if (probe_node == ATADDR_ANYNODE)
271
probe_node = jiffies & 0xFF;
272
273
/* Scan the networks */
274
atif->status |= ATIF_PROBE;
275
for (netct = 0; netct <= netrange; netct++) {
276
/* Sweep the available nodes from a given start */
277
atif->address.s_net = htons(probe_net);
278
for (nodect = 0; nodect < 256; nodect++) {
279
atif->address.s_node = (nodect + probe_node) & 0xFF;
280
if (atif->address.s_node > 0 &&
281
atif->address.s_node < 254) {
282
/* Probe a proposed address */
283
aarp_probe_network(atif);
284
285
if (!(atif->status & ATIF_PROBE_FAIL)) {
286
atif->status &= ~ATIF_PROBE;
287
return 0;
288
}
289
}
290
atif->status &= ~ATIF_PROBE_FAIL;
291
}
292
probe_net++;
293
if (probe_net > ntohs(atif->nets.nr_lastnet))
294
probe_net = ntohs(atif->nets.nr_firstnet);
295
}
296
atif->status &= ~ATIF_PROBE;
297
298
return -EADDRINUSE; /* Network is full... */
299
}
300
301
302
/* Perform AARP probing for a proxy address */
303
static int atif_proxy_probe_device(struct atalk_iface *atif,
304
struct atalk_addr *proxy_addr)
305
{
306
int netrange = ntohs(atif->nets.nr_lastnet) -
307
ntohs(atif->nets.nr_firstnet) + 1;
308
/* we probe the interface's network */
309
int probe_net = ntohs(atif->address.s_net);
310
int probe_node = ATADDR_ANYNODE; /* we'll take anything */
311
int netct, nodect;
312
313
/* Offset the network we start probing with */
314
if (probe_net == ATADDR_ANYNET) {
315
probe_net = ntohs(atif->nets.nr_firstnet);
316
if (netrange)
317
probe_net += jiffies % netrange;
318
}
319
320
if (probe_node == ATADDR_ANYNODE)
321
probe_node = jiffies & 0xFF;
322
323
/* Scan the networks */
324
for (netct = 0; netct <= netrange; netct++) {
325
/* Sweep the available nodes from a given start */
326
proxy_addr->s_net = htons(probe_net);
327
for (nodect = 0; nodect < 256; nodect++) {
328
proxy_addr->s_node = (nodect + probe_node) & 0xFF;
329
if (proxy_addr->s_node > 0 &&
330
proxy_addr->s_node < 254) {
331
/* Tell AARP to probe a proposed address */
332
int ret = aarp_proxy_probe_network(atif,
333
proxy_addr);
334
335
if (ret != -EADDRINUSE)
336
return ret;
337
}
338
}
339
probe_net++;
340
if (probe_net > ntohs(atif->nets.nr_lastnet))
341
probe_net = ntohs(atif->nets.nr_firstnet);
342
}
343
344
return -EADDRINUSE; /* Network is full... */
345
}
346
347
348
struct atalk_addr *atalk_find_dev_addr(struct net_device *dev)
349
{
350
struct atalk_iface *iface = dev->atalk_ptr;
351
return iface ? &iface->address : NULL;
352
}
353
354
static struct atalk_addr *atalk_find_primary(void)
355
{
356
struct atalk_iface *fiface = NULL;
357
struct atalk_addr *retval;
358
struct atalk_iface *iface;
359
360
/*
361
* Return a point-to-point interface only if
362
* there is no non-ptp interface available.
363
*/
364
read_lock_bh(&atalk_interfaces_lock);
365
for (iface = atalk_interfaces; iface; iface = iface->next) {
366
if (!fiface && !(iface->dev->flags & IFF_LOOPBACK))
367
fiface = iface;
368
if (!(iface->dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))) {
369
retval = &iface->address;
370
goto out;
371
}
372
}
373
374
if (fiface)
375
retval = &fiface->address;
376
else if (atalk_interfaces)
377
retval = &atalk_interfaces->address;
378
else
379
retval = NULL;
380
out:
381
read_unlock_bh(&atalk_interfaces_lock);
382
return retval;
383
}
384
385
/*
386
* Find a match for 'any network' - ie any of our interfaces with that
387
* node number will do just nicely.
388
*/
389
static struct atalk_iface *atalk_find_anynet(int node, struct net_device *dev)
390
{
391
struct atalk_iface *iface = dev->atalk_ptr;
392
393
if (!iface || iface->status & ATIF_PROBE)
394
goto out_err;
395
396
if (node != ATADDR_BCAST &&
397
iface->address.s_node != node &&
398
node != ATADDR_ANYNODE)
399
goto out_err;
400
out:
401
return iface;
402
out_err:
403
iface = NULL;
404
goto out;
405
}
406
407
/* Find a match for a specific network:node pair */
408
static struct atalk_iface *atalk_find_interface(__be16 net, int node)
409
{
410
struct atalk_iface *iface;
411
412
read_lock_bh(&atalk_interfaces_lock);
413
for (iface = atalk_interfaces; iface; iface = iface->next) {
414
if ((node == ATADDR_BCAST ||
415
node == ATADDR_ANYNODE ||
416
iface->address.s_node == node) &&
417
iface->address.s_net == net &&
418
!(iface->status & ATIF_PROBE))
419
break;
420
421
/* XXXX.0 -- net.0 returns the iface associated with net */
422
if (node == ATADDR_ANYNODE && net != ATADDR_ANYNET &&
423
ntohs(iface->nets.nr_firstnet) <= ntohs(net) &&
424
ntohs(net) <= ntohs(iface->nets.nr_lastnet))
425
break;
426
}
427
read_unlock_bh(&atalk_interfaces_lock);
428
return iface;
429
}
430
431
432
/*
433
* Find a route for an AppleTalk packet. This ought to get cached in
434
* the socket (later on...). We know about host routes and the fact
435
* that a route must be direct to broadcast.
436
*/
437
static struct atalk_route *atrtr_find(struct atalk_addr *target)
438
{
439
/*
440
* we must search through all routes unless we find a
441
* host route, because some host routes might overlap
442
* network routes
443
*/
444
struct atalk_route *net_route = NULL;
445
struct atalk_route *r;
446
447
read_lock_bh(&atalk_routes_lock);
448
for (r = atalk_routes; r; r = r->next) {
449
if (!(r->flags & RTF_UP))
450
continue;
451
452
if (r->target.s_net == target->s_net) {
453
if (r->flags & RTF_HOST) {
454
/*
455
* if this host route is for the target,
456
* the we're done
457
*/
458
if (r->target.s_node == target->s_node)
459
goto out;
460
} else
461
/*
462
* this route will work if there isn't a
463
* direct host route, so cache it
464
*/
465
net_route = r;
466
}
467
}
468
469
/*
470
* if we found a network route but not a direct host
471
* route, then return it
472
*/
473
if (net_route)
474
r = net_route;
475
else if (atrtr_default.dev)
476
r = &atrtr_default;
477
else /* No route can be found */
478
r = NULL;
479
out:
480
read_unlock_bh(&atalk_routes_lock);
481
return r;
482
}
483
484
485
/*
486
* Given an AppleTalk network, find the device to use. This can be
487
* a simple lookup.
488
*/
489
struct net_device *atrtr_get_dev(struct atalk_addr *sa)
490
{
491
struct atalk_route *atr = atrtr_find(sa);
492
return atr ? atr->dev : NULL;
493
}
494
495
/* Set up a default router */
496
static void atrtr_set_default(struct net_device *dev)
497
{
498
atrtr_default.dev = dev;
499
atrtr_default.flags = RTF_UP;
500
atrtr_default.gateway.s_net = htons(0);
501
atrtr_default.gateway.s_node = 0;
502
}
503
504
/*
505
* Add a router. Basically make sure it looks valid and stuff the
506
* entry in the list. While it uses netranges we always set them to one
507
* entry to work like netatalk.
508
*/
509
static int atrtr_create(struct rtentry *r, struct net_device *devhint)
510
{
511
struct sockaddr_at *ta = (struct sockaddr_at *)&r->rt_dst;
512
struct sockaddr_at *ga = (struct sockaddr_at *)&r->rt_gateway;
513
struct atalk_route *rt;
514
struct atalk_iface *iface, *riface;
515
int retval = -EINVAL;
516
517
/*
518
* Fixme: Raise/Lower a routing change semaphore for these
519
* operations.
520
*/
521
522
/* Validate the request */
523
if (ta->sat_family != AF_APPLETALK ||
524
(!devhint && ga->sat_family != AF_APPLETALK))
525
goto out;
526
527
/* Now walk the routing table and make our decisions */
528
write_lock_bh(&atalk_routes_lock);
529
for (rt = atalk_routes; rt; rt = rt->next) {
530
if (r->rt_flags != rt->flags)
531
continue;
532
533
if (ta->sat_addr.s_net == rt->target.s_net) {
534
if (!(rt->flags & RTF_HOST))
535
break;
536
if (ta->sat_addr.s_node == rt->target.s_node)
537
break;
538
}
539
}
540
541
if (!devhint) {
542
riface = NULL;
543
544
read_lock_bh(&atalk_interfaces_lock);
545
for (iface = atalk_interfaces; iface; iface = iface->next) {
546
if (!riface &&
547
ntohs(ga->sat_addr.s_net) >=
548
ntohs(iface->nets.nr_firstnet) &&
549
ntohs(ga->sat_addr.s_net) <=
550
ntohs(iface->nets.nr_lastnet))
551
riface = iface;
552
553
if (ga->sat_addr.s_net == iface->address.s_net &&
554
ga->sat_addr.s_node == iface->address.s_node)
555
riface = iface;
556
}
557
read_unlock_bh(&atalk_interfaces_lock);
558
559
retval = -ENETUNREACH;
560
if (!riface)
561
goto out_unlock;
562
563
devhint = riface->dev;
564
}
565
566
if (!rt) {
567
rt = kzalloc(sizeof(*rt), GFP_ATOMIC);
568
569
retval = -ENOBUFS;
570
if (!rt)
571
goto out_unlock;
572
573
rt->next = atalk_routes;
574
atalk_routes = rt;
575
}
576
577
/* Fill in the routing entry */
578
rt->target = ta->sat_addr;
579
dev_put(rt->dev); /* Release old device */
580
dev_hold(devhint);
581
rt->dev = devhint;
582
rt->flags = r->rt_flags;
583
rt->gateway = ga->sat_addr;
584
585
retval = 0;
586
out_unlock:
587
write_unlock_bh(&atalk_routes_lock);
588
out:
589
return retval;
590
}
591
592
/* Delete a route. Find it and discard it */
593
static int atrtr_delete(struct atalk_addr *addr)
594
{
595
struct atalk_route **r = &atalk_routes;
596
int retval = 0;
597
struct atalk_route *tmp;
598
599
write_lock_bh(&atalk_routes_lock);
600
while ((tmp = *r) != NULL) {
601
if (tmp->target.s_net == addr->s_net &&
602
(!(tmp->flags&RTF_GATEWAY) ||
603
tmp->target.s_node == addr->s_node)) {
604
*r = tmp->next;
605
dev_put(tmp->dev);
606
kfree(tmp);
607
goto out;
608
}
609
r = &tmp->next;
610
}
611
retval = -ENOENT;
612
out:
613
write_unlock_bh(&atalk_routes_lock);
614
return retval;
615
}
616
617
/*
618
* Called when a device is downed. Just throw away any routes
619
* via it.
620
*/
621
static void atrtr_device_down(struct net_device *dev)
622
{
623
struct atalk_route **r = &atalk_routes;
624
struct atalk_route *tmp;
625
626
write_lock_bh(&atalk_routes_lock);
627
while ((tmp = *r) != NULL) {
628
if (tmp->dev == dev) {
629
*r = tmp->next;
630
dev_put(dev);
631
kfree(tmp);
632
} else
633
r = &tmp->next;
634
}
635
write_unlock_bh(&atalk_routes_lock);
636
637
if (atrtr_default.dev == dev)
638
atrtr_set_default(NULL);
639
}
640
641
/* Actually down the interface */
642
static inline void atalk_dev_down(struct net_device *dev)
643
{
644
atrtr_device_down(dev); /* Remove all routes for the device */
645
aarp_device_down(dev); /* Remove AARP entries for the device */
646
atif_drop_device(dev); /* Remove the device */
647
}
648
649
/*
650
* A device event has occurred. Watch for devices going down and
651
* delete our use of them (iface and route).
652
*/
653
static int ddp_device_event(struct notifier_block *this, unsigned long event,
654
void *ptr)
655
{
656
struct net_device *dev = netdev_notifier_info_to_dev(ptr);
657
658
if (!net_eq(dev_net(dev), &init_net))
659
return NOTIFY_DONE;
660
661
if (event == NETDEV_DOWN)
662
/* Discard any use of this */
663
atalk_dev_down(dev);
664
665
return NOTIFY_DONE;
666
}
667
668
/* ioctl calls. Shouldn't even need touching */
669
/* Device configuration ioctl calls */
670
static int atif_ioctl(int cmd, void __user *arg)
671
{
672
static char aarp_mcast[6] = { 0x09, 0x00, 0x00, 0xFF, 0xFF, 0xFF };
673
struct ifreq atreq;
674
struct atalk_netrange *nr;
675
struct sockaddr_at *sa;
676
struct net_device *dev;
677
struct atalk_iface *atif;
678
int ct;
679
int limit;
680
struct rtentry rtdef;
681
int add_route;
682
683
if (get_user_ifreq(&atreq, NULL, arg))
684
return -EFAULT;
685
686
dev = __dev_get_by_name(&init_net, atreq.ifr_name);
687
if (!dev)
688
return -ENODEV;
689
690
sa = (struct sockaddr_at *)&atreq.ifr_addr;
691
atif = atalk_find_dev(dev);
692
693
switch (cmd) {
694
case SIOCSIFADDR:
695
if (!capable(CAP_NET_ADMIN))
696
return -EPERM;
697
if (sa->sat_family != AF_APPLETALK)
698
return -EINVAL;
699
if (dev->type != ARPHRD_ETHER &&
700
dev->type != ARPHRD_LOOPBACK &&
701
dev->type != ARPHRD_LOCALTLK &&
702
dev->type != ARPHRD_PPP)
703
return -EPROTONOSUPPORT;
704
705
nr = (struct atalk_netrange *)&sa->sat_zero[0];
706
add_route = 1;
707
708
/*
709
* if this is a point-to-point iface, and we already
710
* have an iface for this AppleTalk address, then we
711
* should not add a route
712
*/
713
if ((dev->flags & IFF_POINTOPOINT) &&
714
atalk_find_interface(sa->sat_addr.s_net,
715
sa->sat_addr.s_node)) {
716
printk(KERN_DEBUG "AppleTalk: point-to-point "
717
"interface added with "
718
"existing address\n");
719
add_route = 0;
720
}
721
722
/*
723
* Phase 1 is fine on LocalTalk but we don't do
724
* EtherTalk phase 1. Anyone wanting to add it, go ahead.
725
*/
726
if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2)
727
return -EPROTONOSUPPORT;
728
if (sa->sat_addr.s_node == ATADDR_BCAST ||
729
sa->sat_addr.s_node == 254)
730
return -EINVAL;
731
if (atif) {
732
/* Already setting address */
733
if (atif->status & ATIF_PROBE)
734
return -EBUSY;
735
736
atif->address.s_net = sa->sat_addr.s_net;
737
atif->address.s_node = sa->sat_addr.s_node;
738
atrtr_device_down(dev); /* Flush old routes */
739
} else {
740
atif = atif_add_device(dev, &sa->sat_addr);
741
if (!atif)
742
return -ENOMEM;
743
}
744
atif->nets = *nr;
745
746
/*
747
* Check if the chosen address is used. If so we
748
* error and atalkd will try another.
749
*/
750
751
if (!(dev->flags & IFF_LOOPBACK) &&
752
!(dev->flags & IFF_POINTOPOINT) &&
753
atif_probe_device(atif) < 0) {
754
atif_drop_device(dev);
755
return -EADDRINUSE;
756
}
757
758
/* Hey it worked - add the direct routes */
759
sa = (struct sockaddr_at *)&rtdef.rt_gateway;
760
sa->sat_family = AF_APPLETALK;
761
sa->sat_addr.s_net = atif->address.s_net;
762
sa->sat_addr.s_node = atif->address.s_node;
763
sa = (struct sockaddr_at *)&rtdef.rt_dst;
764
rtdef.rt_flags = RTF_UP;
765
sa->sat_family = AF_APPLETALK;
766
sa->sat_addr.s_node = ATADDR_ANYNODE;
767
if (dev->flags & IFF_LOOPBACK ||
768
dev->flags & IFF_POINTOPOINT)
769
rtdef.rt_flags |= RTF_HOST;
770
771
/* Routerless initial state */
772
if (nr->nr_firstnet == htons(0) &&
773
nr->nr_lastnet == htons(0xFFFE)) {
774
sa->sat_addr.s_net = atif->address.s_net;
775
atrtr_create(&rtdef, dev);
776
atrtr_set_default(dev);
777
} else {
778
limit = ntohs(nr->nr_lastnet);
779
if (limit - ntohs(nr->nr_firstnet) > 4096) {
780
printk(KERN_WARNING "Too many routes/"
781
"iface.\n");
782
return -EINVAL;
783
}
784
if (add_route)
785
for (ct = ntohs(nr->nr_firstnet);
786
ct <= limit; ct++) {
787
sa->sat_addr.s_net = htons(ct);
788
atrtr_create(&rtdef, dev);
789
}
790
}
791
dev_mc_add_global(dev, aarp_mcast);
792
return 0;
793
794
case SIOCGIFADDR:
795
if (!atif)
796
return -EADDRNOTAVAIL;
797
798
sa->sat_family = AF_APPLETALK;
799
sa->sat_addr = atif->address;
800
break;
801
802
case SIOCGIFBRDADDR:
803
if (!atif)
804
return -EADDRNOTAVAIL;
805
806
sa->sat_family = AF_APPLETALK;
807
sa->sat_addr.s_net = atif->address.s_net;
808
sa->sat_addr.s_node = ATADDR_BCAST;
809
break;
810
811
case SIOCATALKDIFADDR:
812
case SIOCDIFADDR:
813
if (!capable(CAP_NET_ADMIN))
814
return -EPERM;
815
if (sa->sat_family != AF_APPLETALK)
816
return -EINVAL;
817
atalk_dev_down(dev);
818
break;
819
820
case SIOCSARP:
821
if (!capable(CAP_NET_ADMIN))
822
return -EPERM;
823
if (sa->sat_family != AF_APPLETALK)
824
return -EINVAL;
825
/*
826
* for now, we only support proxy AARP on ELAP;
827
* we should be able to do it for LocalTalk, too.
828
*/
829
if (dev->type != ARPHRD_ETHER)
830
return -EPROTONOSUPPORT;
831
832
/*
833
* atif points to the current interface on this network;
834
* we aren't concerned about its current status (at
835
* least for now), but it has all the settings about
836
* the network we're going to probe. Consequently, it
837
* must exist.
838
*/
839
if (!atif)
840
return -EADDRNOTAVAIL;
841
842
nr = (struct atalk_netrange *)&(atif->nets);
843
/*
844
* Phase 1 is fine on Localtalk but we don't do
845
* Ethertalk phase 1. Anyone wanting to add it, go ahead.
846
*/
847
if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2)
848
return -EPROTONOSUPPORT;
849
850
if (sa->sat_addr.s_node == ATADDR_BCAST ||
851
sa->sat_addr.s_node == 254)
852
return -EINVAL;
853
854
/*
855
* Check if the chosen address is used. If so we
856
* error and ATCP will try another.
857
*/
858
if (atif_proxy_probe_device(atif, &(sa->sat_addr)) < 0)
859
return -EADDRINUSE;
860
861
/*
862
* We now have an address on the local network, and
863
* the AARP code will defend it for us until we take it
864
* down. We don't set up any routes right now, because
865
* ATCP will install them manually via SIOCADDRT.
866
*/
867
break;
868
869
case SIOCDARP:
870
if (!capable(CAP_NET_ADMIN))
871
return -EPERM;
872
if (sa->sat_family != AF_APPLETALK)
873
return -EINVAL;
874
if (!atif)
875
return -EADDRNOTAVAIL;
876
877
/* give to aarp module to remove proxy entry */
878
aarp_proxy_remove(atif->dev, &(sa->sat_addr));
879
return 0;
880
}
881
882
return put_user_ifreq(&atreq, arg);
883
}
884
885
static int atrtr_ioctl_addrt(struct rtentry *rt)
886
{
887
struct net_device *dev = NULL;
888
889
if (rt->rt_dev) {
890
char name[IFNAMSIZ];
891
892
if (copy_from_user(name, rt->rt_dev, IFNAMSIZ-1))
893
return -EFAULT;
894
name[IFNAMSIZ-1] = '\0';
895
896
dev = __dev_get_by_name(&init_net, name);
897
if (!dev)
898
return -ENODEV;
899
}
900
return atrtr_create(rt, dev);
901
}
902
903
/* Routing ioctl() calls */
904
static int atrtr_ioctl(unsigned int cmd, void __user *arg)
905
{
906
struct rtentry rt;
907
908
if (copy_from_user(&rt, arg, sizeof(rt)))
909
return -EFAULT;
910
911
switch (cmd) {
912
case SIOCDELRT:
913
if (rt.rt_dst.sa_family != AF_APPLETALK)
914
return -EINVAL;
915
return atrtr_delete(&((struct sockaddr_at *)
916
&rt.rt_dst)->sat_addr);
917
918
case SIOCADDRT:
919
return atrtr_ioctl_addrt(&rt);
920
}
921
return -EINVAL;
922
}
923
924
/**************************************************************************\
925
* *
926
* Handling for system calls applied via the various interfaces to an *
927
* AppleTalk socket object. *
928
* *
929
\**************************************************************************/
930
931
/*
932
* Checksum: This is 'optional'. It's quite likely also a good
933
* candidate for assembler hackery 8)
934
*/
935
static unsigned long atalk_sum_partial(const unsigned char *data,
936
int len, unsigned long sum)
937
{
938
/* This ought to be unwrapped neatly. I'll trust gcc for now */
939
while (len--) {
940
sum += *data++;
941
sum = rol16(sum, 1);
942
}
943
return sum;
944
}
945
946
/* Checksum skb data -- similar to skb_checksum */
947
static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset,
948
int len, unsigned long sum)
949
{
950
int start = skb_headlen(skb);
951
struct sk_buff *frag_iter;
952
int i, copy;
953
954
/* checksum stuff in header space */
955
if ((copy = start - offset) > 0) {
956
if (copy > len)
957
copy = len;
958
sum = atalk_sum_partial(skb->data + offset, copy, sum);
959
if ((len -= copy) == 0)
960
return sum;
961
962
offset += copy;
963
}
964
965
/* checksum stuff in frags */
966
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
967
int end;
968
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
969
WARN_ON(start > offset + len);
970
971
end = start + skb_frag_size(frag);
972
if ((copy = end - offset) > 0) {
973
u8 *vaddr;
974
975
if (copy > len)
976
copy = len;
977
vaddr = kmap_atomic(skb_frag_page(frag));
978
sum = atalk_sum_partial(vaddr + skb_frag_off(frag) +
979
offset - start, copy, sum);
980
kunmap_atomic(vaddr);
981
982
if (!(len -= copy))
983
return sum;
984
offset += copy;
985
}
986
start = end;
987
}
988
989
skb_walk_frags(skb, frag_iter) {
990
int end;
991
992
WARN_ON(start > offset + len);
993
994
end = start + frag_iter->len;
995
if ((copy = end - offset) > 0) {
996
if (copy > len)
997
copy = len;
998
sum = atalk_sum_skb(frag_iter, offset - start,
999
copy, sum);
1000
if ((len -= copy) == 0)
1001
return sum;
1002
offset += copy;
1003
}
1004
start = end;
1005
}
1006
1007
BUG_ON(len > 0);
1008
1009
return sum;
1010
}
1011
1012
static __be16 atalk_checksum(const struct sk_buff *skb, int len)
1013
{
1014
unsigned long sum;
1015
1016
/* skip header 4 bytes */
1017
sum = atalk_sum_skb(skb, 4, len-4, 0);
1018
1019
/* Use 0xFFFF for 0. 0 itself means none */
1020
return sum ? htons((unsigned short)sum) : htons(0xFFFF);
1021
}
1022
1023
static struct proto ddp_proto = {
1024
.name = "DDP",
1025
.owner = THIS_MODULE,
1026
.obj_size = sizeof(struct atalk_sock),
1027
};
1028
1029
/*
1030
* Create a socket. Initialise the socket, blank the addresses
1031
* set the state.
1032
*/
1033
static int atalk_create(struct net *net, struct socket *sock, int protocol,
1034
int kern)
1035
{
1036
struct sock *sk;
1037
int rc = -ESOCKTNOSUPPORT;
1038
1039
if (!net_eq(net, &init_net))
1040
return -EAFNOSUPPORT;
1041
1042
/*
1043
* We permit SOCK_DGRAM and RAW is an extension. It is trivial to do
1044
* and gives you the full ELAP frame. Should be handy for CAP 8)
1045
*/
1046
if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
1047
goto out;
1048
1049
rc = -EPERM;
1050
if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1051
goto out;
1052
1053
rc = -ENOMEM;
1054
sk = sk_alloc(net, PF_APPLETALK, GFP_KERNEL, &ddp_proto, kern);
1055
if (!sk)
1056
goto out;
1057
rc = 0;
1058
sock->ops = &atalk_dgram_ops;
1059
sock_init_data(sock, sk);
1060
1061
/* Checksums on by default */
1062
sock_set_flag(sk, SOCK_ZAPPED);
1063
out:
1064
return rc;
1065
}
1066
1067
/* Free a socket. No work needed */
1068
static int atalk_release(struct socket *sock)
1069
{
1070
struct sock *sk = sock->sk;
1071
1072
if (sk) {
1073
sock_hold(sk);
1074
lock_sock(sk);
1075
1076
sock_orphan(sk);
1077
sock->sk = NULL;
1078
atalk_destroy_socket(sk);
1079
1080
release_sock(sk);
1081
sock_put(sk);
1082
}
1083
return 0;
1084
}
1085
1086
/**
1087
* atalk_pick_and_bind_port - Pick a source port when one is not given
1088
* @sk: socket to insert into the tables
1089
* @sat: address to search for
1090
*
1091
* Pick a source port when one is not given. If we can find a suitable free
1092
* one, we insert the socket into the tables using it.
1093
*
1094
* This whole operation must be atomic.
1095
*/
1096
static int atalk_pick_and_bind_port(struct sock *sk, struct sockaddr_at *sat)
1097
{
1098
int retval;
1099
1100
write_lock_bh(&atalk_sockets_lock);
1101
1102
for (sat->sat_port = ATPORT_RESERVED;
1103
sat->sat_port < ATPORT_LAST;
1104
sat->sat_port++) {
1105
struct sock *s;
1106
1107
sk_for_each(s, &atalk_sockets) {
1108
struct atalk_sock *at = at_sk(s);
1109
1110
if (at->src_net == sat->sat_addr.s_net &&
1111
at->src_node == sat->sat_addr.s_node &&
1112
at->src_port == sat->sat_port)
1113
goto try_next_port;
1114
}
1115
1116
/* Wheee, it's free, assign and insert. */
1117
__atalk_insert_socket(sk);
1118
at_sk(sk)->src_port = sat->sat_port;
1119
retval = 0;
1120
goto out;
1121
1122
try_next_port:;
1123
}
1124
1125
retval = -EBUSY;
1126
out:
1127
write_unlock_bh(&atalk_sockets_lock);
1128
return retval;
1129
}
1130
1131
static int atalk_autobind(struct sock *sk)
1132
{
1133
struct atalk_sock *at = at_sk(sk);
1134
struct sockaddr_at sat;
1135
struct atalk_addr *ap = atalk_find_primary();
1136
int n = -EADDRNOTAVAIL;
1137
1138
if (!ap || ap->s_net == htons(ATADDR_ANYNET))
1139
goto out;
1140
1141
at->src_net = sat.sat_addr.s_net = ap->s_net;
1142
at->src_node = sat.sat_addr.s_node = ap->s_node;
1143
1144
n = atalk_pick_and_bind_port(sk, &sat);
1145
if (!n)
1146
sock_reset_flag(sk, SOCK_ZAPPED);
1147
out:
1148
return n;
1149
}
1150
1151
/* Set the address 'our end' of the connection */
1152
static int atalk_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1153
{
1154
struct sockaddr_at *addr = (struct sockaddr_at *)uaddr;
1155
struct sock *sk = sock->sk;
1156
struct atalk_sock *at = at_sk(sk);
1157
int err;
1158
1159
if (!sock_flag(sk, SOCK_ZAPPED) ||
1160
addr_len != sizeof(struct sockaddr_at))
1161
return -EINVAL;
1162
1163
if (addr->sat_family != AF_APPLETALK)
1164
return -EAFNOSUPPORT;
1165
1166
lock_sock(sk);
1167
if (addr->sat_addr.s_net == htons(ATADDR_ANYNET)) {
1168
struct atalk_addr *ap = atalk_find_primary();
1169
1170
err = -EADDRNOTAVAIL;
1171
if (!ap)
1172
goto out;
1173
1174
at->src_net = addr->sat_addr.s_net = ap->s_net;
1175
at->src_node = addr->sat_addr.s_node = ap->s_node;
1176
} else {
1177
err = -EADDRNOTAVAIL;
1178
if (!atalk_find_interface(addr->sat_addr.s_net,
1179
addr->sat_addr.s_node))
1180
goto out;
1181
1182
at->src_net = addr->sat_addr.s_net;
1183
at->src_node = addr->sat_addr.s_node;
1184
}
1185
1186
if (addr->sat_port == ATADDR_ANYPORT) {
1187
err = atalk_pick_and_bind_port(sk, addr);
1188
1189
if (err < 0)
1190
goto out;
1191
} else {
1192
at->src_port = addr->sat_port;
1193
1194
err = -EADDRINUSE;
1195
if (atalk_find_or_insert_socket(sk, addr))
1196
goto out;
1197
}
1198
1199
sock_reset_flag(sk, SOCK_ZAPPED);
1200
err = 0;
1201
out:
1202
release_sock(sk);
1203
return err;
1204
}
1205
1206
/* Set the address we talk to */
1207
static int atalk_connect(struct socket *sock, struct sockaddr *uaddr,
1208
int addr_len, int flags)
1209
{
1210
struct sock *sk = sock->sk;
1211
struct atalk_sock *at = at_sk(sk);
1212
struct sockaddr_at *addr;
1213
int err;
1214
1215
sk->sk_state = TCP_CLOSE;
1216
sock->state = SS_UNCONNECTED;
1217
1218
if (addr_len != sizeof(*addr))
1219
return -EINVAL;
1220
1221
addr = (struct sockaddr_at *)uaddr;
1222
1223
if (addr->sat_family != AF_APPLETALK)
1224
return -EAFNOSUPPORT;
1225
1226
if (addr->sat_addr.s_node == ATADDR_BCAST &&
1227
!sock_flag(sk, SOCK_BROADCAST)) {
1228
#if 1
1229
pr_warn("atalk_connect: %s is broken and did not set SO_BROADCAST.\n",
1230
current->comm);
1231
#else
1232
return -EACCES;
1233
#endif
1234
}
1235
1236
lock_sock(sk);
1237
err = -EBUSY;
1238
if (sock_flag(sk, SOCK_ZAPPED))
1239
if (atalk_autobind(sk) < 0)
1240
goto out;
1241
1242
err = -ENETUNREACH;
1243
if (!atrtr_get_dev(&addr->sat_addr))
1244
goto out;
1245
1246
at->dest_port = addr->sat_port;
1247
at->dest_net = addr->sat_addr.s_net;
1248
at->dest_node = addr->sat_addr.s_node;
1249
1250
sock->state = SS_CONNECTED;
1251
sk->sk_state = TCP_ESTABLISHED;
1252
err = 0;
1253
out:
1254
release_sock(sk);
1255
return err;
1256
}
1257
1258
/*
1259
* Find the name of an AppleTalk socket. Just copy the right
1260
* fields into the sockaddr.
1261
*/
1262
static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
1263
int peer)
1264
{
1265
struct sockaddr_at sat;
1266
struct sock *sk = sock->sk;
1267
struct atalk_sock *at = at_sk(sk);
1268
int err;
1269
1270
lock_sock(sk);
1271
err = -ENOBUFS;
1272
if (sock_flag(sk, SOCK_ZAPPED))
1273
if (atalk_autobind(sk) < 0)
1274
goto out;
1275
1276
memset(&sat, 0, sizeof(sat));
1277
1278
if (peer) {
1279
err = -ENOTCONN;
1280
if (sk->sk_state != TCP_ESTABLISHED)
1281
goto out;
1282
1283
sat.sat_addr.s_net = at->dest_net;
1284
sat.sat_addr.s_node = at->dest_node;
1285
sat.sat_port = at->dest_port;
1286
} else {
1287
sat.sat_addr.s_net = at->src_net;
1288
sat.sat_addr.s_node = at->src_node;
1289
sat.sat_port = at->src_port;
1290
}
1291
1292
sat.sat_family = AF_APPLETALK;
1293
memcpy(uaddr, &sat, sizeof(sat));
1294
err = sizeof(struct sockaddr_at);
1295
1296
out:
1297
release_sock(sk);
1298
return err;
1299
}
1300
1301
static int atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
1302
struct ddpehdr *ddp, __u16 len_hops, int origlen)
1303
{
1304
struct atalk_route *rt;
1305
struct atalk_addr ta;
1306
1307
/*
1308
* Don't route multicast, etc., packets, or packets sent to "this
1309
* network"
1310
*/
1311
if (skb->pkt_type != PACKET_HOST || !ddp->deh_dnet) {
1312
/*
1313
* FIXME:
1314
*
1315
* Can it ever happen that a packet is from a PPP iface and
1316
* needs to be broadcast onto the default network?
1317
*/
1318
if (dev->type == ARPHRD_PPP)
1319
printk(KERN_DEBUG "AppleTalk: didn't forward broadcast "
1320
"packet received from PPP iface\n");
1321
goto free_it;
1322
}
1323
1324
ta.s_net = ddp->deh_dnet;
1325
ta.s_node = ddp->deh_dnode;
1326
1327
/* Route the packet */
1328
rt = atrtr_find(&ta);
1329
/* increment hops count */
1330
len_hops += 1 << 10;
1331
if (!rt || !(len_hops & (15 << 10)))
1332
goto free_it;
1333
1334
/* FIXME: use skb->cb to be able to use shared skbs */
1335
1336
/*
1337
* Route goes through another gateway, so set the target to the
1338
* gateway instead.
1339
*/
1340
1341
if (rt->flags & RTF_GATEWAY) {
1342
ta.s_net = rt->gateway.s_net;
1343
ta.s_node = rt->gateway.s_node;
1344
}
1345
1346
/* Fix up skb->len field */
1347
skb_trim(skb, min_t(unsigned int, origlen,
1348
(rt->dev->hard_header_len +
1349
ddp_dl->header_length + (len_hops & 1023))));
1350
1351
/* FIXME: use skb->cb to be able to use shared skbs */
1352
ddp->deh_len_hops = htons(len_hops);
1353
1354
/*
1355
* Send the buffer onwards
1356
*
1357
* Now we must always be careful. If it's come from LocalTalk to
1358
* EtherTalk it might not fit
1359
*
1360
* Order matters here: If a packet has to be copied to make a new
1361
* headroom (rare hopefully) then it won't need unsharing.
1362
*
1363
* Note. ddp-> becomes invalid at the realloc.
1364
*/
1365
if (skb_headroom(skb) < 22) {
1366
/* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */
1367
struct sk_buff *nskb = skb_realloc_headroom(skb, 32);
1368
kfree_skb(skb);
1369
skb = nskb;
1370
} else
1371
skb = skb_unshare(skb, GFP_ATOMIC);
1372
1373
/*
1374
* If the buffer didn't vanish into the lack of space bitbucket we can
1375
* send it.
1376
*/
1377
if (skb == NULL)
1378
goto drop;
1379
1380
if (aarp_send_ddp(rt->dev, skb, &ta, NULL) == NET_XMIT_DROP)
1381
return NET_RX_DROP;
1382
return NET_RX_SUCCESS;
1383
free_it:
1384
kfree_skb(skb);
1385
drop:
1386
return NET_RX_DROP;
1387
}
1388
1389
/**
1390
* atalk_rcv - Receive a packet (in skb) from device dev
1391
* @skb: packet received
1392
* @dev: network device where the packet comes from
1393
* @pt: packet type
1394
* @orig_dev: the original receive net device
1395
*
1396
* Receive a packet (in skb) from device dev. This has come from the SNAP
1397
* decoder, and on entry skb->transport_header is the DDP header, skb->len
1398
* is the DDP header, skb->len is the DDP length. The physical headers
1399
* have been extracted. PPP should probably pass frames marked as for this
1400
* layer. [ie ARPHRD_ETHERTALK]
1401
*/
1402
static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
1403
struct packet_type *pt, struct net_device *orig_dev)
1404
{
1405
struct ddpehdr *ddp;
1406
struct sock *sock;
1407
struct atalk_iface *atif;
1408
struct sockaddr_at tosat;
1409
int origlen;
1410
__u16 len_hops;
1411
1412
if (!net_eq(dev_net(dev), &init_net))
1413
goto drop;
1414
1415
/* Don't mangle buffer if shared */
1416
if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
1417
goto out;
1418
1419
/* Size check and make sure header is contiguous */
1420
if (!pskb_may_pull(skb, sizeof(*ddp)))
1421
goto drop;
1422
1423
ddp = ddp_hdr(skb);
1424
1425
len_hops = ntohs(ddp->deh_len_hops);
1426
1427
/* Trim buffer in case of stray trailing data */
1428
origlen = skb->len;
1429
skb_trim(skb, min_t(unsigned int, skb->len, len_hops & 1023));
1430
1431
/*
1432
* Size check to see if ddp->deh_len was crap
1433
* (Otherwise we'll detonate most spectacularly
1434
* in the middle of atalk_checksum() or recvmsg()).
1435
*/
1436
if (skb->len < sizeof(*ddp) || skb->len < (len_hops & 1023)) {
1437
pr_debug("AppleTalk: dropping corrupted frame (deh_len=%u, "
1438
"skb->len=%u)\n", len_hops & 1023, skb->len);
1439
goto drop;
1440
}
1441
1442
/*
1443
* Any checksums. Note we don't do htons() on this == is assumed to be
1444
* valid for net byte orders all over the networking code...
1445
*/
1446
if (ddp->deh_sum &&
1447
atalk_checksum(skb, len_hops & 1023) != ddp->deh_sum)
1448
/* Not a valid AppleTalk frame - dustbin time */
1449
goto drop;
1450
1451
/* Check the packet is aimed at us */
1452
if (!ddp->deh_dnet) /* Net 0 is 'this network' */
1453
atif = atalk_find_anynet(ddp->deh_dnode, dev);
1454
else
1455
atif = atalk_find_interface(ddp->deh_dnet, ddp->deh_dnode);
1456
1457
if (!atif) {
1458
/* Not ours, so we route the packet via the correct
1459
* AppleTalk iface
1460
*/
1461
return atalk_route_packet(skb, dev, ddp, len_hops, origlen);
1462
}
1463
1464
/*
1465
* Which socket - atalk_search_socket() looks for a *full match*
1466
* of the <net, node, port> tuple.
1467
*/
1468
tosat.sat_addr.s_net = ddp->deh_dnet;
1469
tosat.sat_addr.s_node = ddp->deh_dnode;
1470
tosat.sat_port = ddp->deh_dport;
1471
1472
sock = atalk_search_socket(&tosat, atif);
1473
if (!sock) /* But not one of our sockets */
1474
goto drop;
1475
1476
/* Queue packet (standard) */
1477
if (sock_queue_rcv_skb(sock, skb) < 0)
1478
goto drop;
1479
1480
return NET_RX_SUCCESS;
1481
1482
drop:
1483
kfree_skb(skb);
1484
out:
1485
return NET_RX_DROP;
1486
1487
}
1488
1489
/*
1490
* Receive a LocalTalk frame. We make some demands on the caller here.
1491
* Caller must provide enough headroom on the packet to pull the short
1492
* header and append a long one.
1493
*/
1494
static int ltalk_rcv(struct sk_buff *skb, struct net_device *dev,
1495
struct packet_type *pt, struct net_device *orig_dev)
1496
{
1497
if (!net_eq(dev_net(dev), &init_net))
1498
goto freeit;
1499
1500
/* Expand any short form frames */
1501
if (skb_mac_header(skb)[2] == 1) {
1502
struct ddpehdr *ddp;
1503
/* Find our address */
1504
struct atalk_addr *ap = atalk_find_dev_addr(dev);
1505
1506
if (!ap || skb->len < sizeof(__be16) || skb->len > 1023)
1507
goto freeit;
1508
1509
/* Don't mangle buffer if shared */
1510
if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
1511
return 0;
1512
1513
/*
1514
* The push leaves us with a ddephdr not an shdr, and
1515
* handily the port bytes in the right place preset.
1516
*/
1517
ddp = skb_push(skb, sizeof(*ddp) - 4);
1518
1519
/* Now fill in the long header */
1520
1521
/*
1522
* These two first. The mac overlays the new source/dest
1523
* network information so we MUST copy these before
1524
* we write the network numbers !
1525
*/
1526
1527
ddp->deh_dnode = skb_mac_header(skb)[0]; /* From physical header */
1528
ddp->deh_snode = skb_mac_header(skb)[1]; /* From physical header */
1529
1530
ddp->deh_dnet = ap->s_net; /* Network number */
1531
ddp->deh_snet = ap->s_net;
1532
ddp->deh_sum = 0; /* No checksum */
1533
/*
1534
* Not sure about this bit...
1535
*/
1536
/* Non routable, so force a drop if we slip up later */
1537
ddp->deh_len_hops = htons(skb->len + (DDP_MAXHOPS << 10));
1538
}
1539
skb_reset_transport_header(skb);
1540
1541
return atalk_rcv(skb, dev, pt, orig_dev);
1542
freeit:
1543
kfree_skb(skb);
1544
return 0;
1545
}
1546
1547
static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
1548
{
1549
struct sock *sk = sock->sk;
1550
struct atalk_sock *at = at_sk(sk);
1551
DECLARE_SOCKADDR(struct sockaddr_at *, usat, msg->msg_name);
1552
int flags = msg->msg_flags;
1553
int loopback = 0;
1554
struct sockaddr_at local_satalk, gsat;
1555
struct sk_buff *skb;
1556
struct net_device *dev;
1557
struct ddpehdr *ddp;
1558
int size, hard_header_len;
1559
struct atalk_route *rt, *rt_lo = NULL;
1560
int err;
1561
1562
if (flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT))
1563
return -EINVAL;
1564
1565
if (len > DDP_MAXSZ)
1566
return -EMSGSIZE;
1567
1568
lock_sock(sk);
1569
if (usat) {
1570
err = -EBUSY;
1571
if (sock_flag(sk, SOCK_ZAPPED))
1572
if (atalk_autobind(sk) < 0)
1573
goto out;
1574
1575
err = -EINVAL;
1576
if (msg->msg_namelen < sizeof(*usat) ||
1577
usat->sat_family != AF_APPLETALK)
1578
goto out;
1579
1580
err = -EPERM;
1581
/* netatalk didn't implement this check */
1582
if (usat->sat_addr.s_node == ATADDR_BCAST &&
1583
!sock_flag(sk, SOCK_BROADCAST)) {
1584
goto out;
1585
}
1586
} else {
1587
err = -ENOTCONN;
1588
if (sk->sk_state != TCP_ESTABLISHED)
1589
goto out;
1590
usat = &local_satalk;
1591
usat->sat_family = AF_APPLETALK;
1592
usat->sat_port = at->dest_port;
1593
usat->sat_addr.s_node = at->dest_node;
1594
usat->sat_addr.s_net = at->dest_net;
1595
}
1596
1597
/* Build a packet */
1598
net_dbg_ratelimited("SK %p: Got address.\n", sk);
1599
1600
/* For headers */
1601
size = sizeof(struct ddpehdr) + len + ddp_dl->header_length;
1602
1603
if (usat->sat_addr.s_net || usat->sat_addr.s_node == ATADDR_ANYNODE) {
1604
rt = atrtr_find(&usat->sat_addr);
1605
} else {
1606
struct atalk_addr at_hint;
1607
1608
at_hint.s_node = 0;
1609
at_hint.s_net = at->src_net;
1610
1611
rt = atrtr_find(&at_hint);
1612
}
1613
err = -ENETUNREACH;
1614
if (!rt)
1615
goto out;
1616
1617
dev = rt->dev;
1618
1619
net_dbg_ratelimited("SK %p: Size needed %d, device %s\n",
1620
sk, size, dev->name);
1621
1622
hard_header_len = dev->hard_header_len;
1623
/* Leave room for loopback hardware header if necessary */
1624
if (usat->sat_addr.s_node == ATADDR_BCAST &&
1625
(dev->flags & IFF_LOOPBACK || !(rt->flags & RTF_GATEWAY))) {
1626
struct atalk_addr at_lo;
1627
1628
at_lo.s_node = 0;
1629
at_lo.s_net = 0;
1630
1631
rt_lo = atrtr_find(&at_lo);
1632
1633
if (rt_lo && rt_lo->dev->hard_header_len > hard_header_len)
1634
hard_header_len = rt_lo->dev->hard_header_len;
1635
}
1636
1637
size += hard_header_len;
1638
release_sock(sk);
1639
skb = sock_alloc_send_skb(sk, size, (flags & MSG_DONTWAIT), &err);
1640
lock_sock(sk);
1641
if (!skb)
1642
goto out;
1643
1644
skb_reserve(skb, ddp_dl->header_length);
1645
skb_reserve(skb, hard_header_len);
1646
skb->dev = dev;
1647
1648
net_dbg_ratelimited("SK %p: Begin build.\n", sk);
1649
1650
ddp = skb_put(skb, sizeof(struct ddpehdr));
1651
ddp->deh_len_hops = htons(len + sizeof(*ddp));
1652
ddp->deh_dnet = usat->sat_addr.s_net;
1653
ddp->deh_snet = at->src_net;
1654
ddp->deh_dnode = usat->sat_addr.s_node;
1655
ddp->deh_snode = at->src_node;
1656
ddp->deh_dport = usat->sat_port;
1657
ddp->deh_sport = at->src_port;
1658
1659
net_dbg_ratelimited("SK %p: Copy user data (%zd bytes).\n", sk, len);
1660
1661
err = memcpy_from_msg(skb_put(skb, len), msg, len);
1662
if (err) {
1663
kfree_skb(skb);
1664
err = -EFAULT;
1665
goto out;
1666
}
1667
1668
if (sk->sk_no_check_tx)
1669
ddp->deh_sum = 0;
1670
else
1671
ddp->deh_sum = atalk_checksum(skb, len + sizeof(*ddp));
1672
1673
/*
1674
* Loopback broadcast packets to non gateway targets (ie routes
1675
* to group we are in)
1676
*/
1677
if (ddp->deh_dnode == ATADDR_BCAST &&
1678
!(rt->flags & RTF_GATEWAY) && !(dev->flags & IFF_LOOPBACK)) {
1679
struct sk_buff *skb2 = skb_copy(skb, GFP_KERNEL);
1680
1681
if (skb2) {
1682
loopback = 1;
1683
net_dbg_ratelimited("SK %p: send out(copy).\n", sk);
1684
/*
1685
* If it fails it is queued/sent above in the aarp queue
1686
*/
1687
aarp_send_ddp(dev, skb2, &usat->sat_addr, NULL);
1688
}
1689
}
1690
1691
if (dev->flags & IFF_LOOPBACK || loopback) {
1692
net_dbg_ratelimited("SK %p: Loop back.\n", sk);
1693
/* loop back */
1694
skb_orphan(skb);
1695
if (ddp->deh_dnode == ATADDR_BCAST) {
1696
if (!rt_lo) {
1697
kfree_skb(skb);
1698
err = -ENETUNREACH;
1699
goto out;
1700
}
1701
dev = rt_lo->dev;
1702
skb->dev = dev;
1703
}
1704
ddp_dl->request(ddp_dl, skb, dev->dev_addr);
1705
} else {
1706
net_dbg_ratelimited("SK %p: send out.\n", sk);
1707
if (rt->flags & RTF_GATEWAY) {
1708
gsat.sat_addr = rt->gateway;
1709
usat = &gsat;
1710
}
1711
1712
/*
1713
* If it fails it is queued/sent above in the aarp queue
1714
*/
1715
aarp_send_ddp(dev, skb, &usat->sat_addr, NULL);
1716
}
1717
net_dbg_ratelimited("SK %p: Done write (%zd).\n", sk, len);
1718
1719
out:
1720
release_sock(sk);
1721
return err ? : len;
1722
}
1723
1724
static int atalk_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
1725
int flags)
1726
{
1727
struct sock *sk = sock->sk;
1728
struct ddpehdr *ddp;
1729
int copied = 0;
1730
int offset = 0;
1731
int err = 0;
1732
struct sk_buff *skb;
1733
1734
skb = skb_recv_datagram(sk, flags, &err);
1735
lock_sock(sk);
1736
1737
if (!skb)
1738
goto out;
1739
1740
/* FIXME: use skb->cb to be able to use shared skbs */
1741
ddp = ddp_hdr(skb);
1742
copied = ntohs(ddp->deh_len_hops) & 1023;
1743
1744
if (sk->sk_type != SOCK_RAW) {
1745
offset = sizeof(*ddp);
1746
copied -= offset;
1747
}
1748
1749
if (copied > size) {
1750
copied = size;
1751
msg->msg_flags |= MSG_TRUNC;
1752
}
1753
err = skb_copy_datagram_msg(skb, offset, msg, copied);
1754
1755
if (!err && msg->msg_name) {
1756
DECLARE_SOCKADDR(struct sockaddr_at *, sat, msg->msg_name);
1757
sat->sat_family = AF_APPLETALK;
1758
sat->sat_port = ddp->deh_sport;
1759
sat->sat_addr.s_node = ddp->deh_snode;
1760
sat->sat_addr.s_net = ddp->deh_snet;
1761
msg->msg_namelen = sizeof(*sat);
1762
}
1763
1764
skb_free_datagram(sk, skb); /* Free the datagram. */
1765
1766
out:
1767
release_sock(sk);
1768
return err ? : copied;
1769
}
1770
1771
1772
/*
1773
* AppleTalk ioctl calls.
1774
*/
1775
static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1776
{
1777
int rc = -ENOIOCTLCMD;
1778
struct sock *sk = sock->sk;
1779
void __user *argp = (void __user *)arg;
1780
1781
switch (cmd) {
1782
/* Protocol layer */
1783
case TIOCOUTQ: {
1784
long amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
1785
1786
if (amount < 0)
1787
amount = 0;
1788
rc = put_user(amount, (int __user *)argp);
1789
break;
1790
}
1791
case TIOCINQ: {
1792
struct sk_buff *skb;
1793
long amount = 0;
1794
1795
spin_lock_irq(&sk->sk_receive_queue.lock);
1796
skb = skb_peek(&sk->sk_receive_queue);
1797
if (skb)
1798
amount = skb->len - sizeof(struct ddpehdr);
1799
spin_unlock_irq(&sk->sk_receive_queue.lock);
1800
rc = put_user(amount, (int __user *)argp);
1801
break;
1802
}
1803
/* Routing */
1804
case SIOCADDRT:
1805
case SIOCDELRT:
1806
rc = -EPERM;
1807
if (capable(CAP_NET_ADMIN))
1808
rc = atrtr_ioctl(cmd, argp);
1809
break;
1810
/* Interface */
1811
case SIOCGIFADDR:
1812
case SIOCSIFADDR:
1813
case SIOCGIFBRDADDR:
1814
case SIOCATALKDIFADDR:
1815
case SIOCDIFADDR:
1816
case SIOCSARP: /* proxy AARP */
1817
case SIOCDARP: /* proxy AARP */
1818
rtnl_lock();
1819
rc = atif_ioctl(cmd, argp);
1820
rtnl_unlock();
1821
break;
1822
}
1823
1824
return rc;
1825
}
1826
1827
1828
#ifdef CONFIG_COMPAT
1829
static int atalk_compat_routing_ioctl(struct sock *sk, unsigned int cmd,
1830
struct compat_rtentry __user *ur)
1831
{
1832
compat_uptr_t rtdev;
1833
struct rtentry rt;
1834
1835
if (copy_from_user(&rt.rt_dst, &ur->rt_dst,
1836
3 * sizeof(struct sockaddr)) ||
1837
get_user(rt.rt_flags, &ur->rt_flags) ||
1838
get_user(rt.rt_metric, &ur->rt_metric) ||
1839
get_user(rt.rt_mtu, &ur->rt_mtu) ||
1840
get_user(rt.rt_window, &ur->rt_window) ||
1841
get_user(rt.rt_irtt, &ur->rt_irtt) ||
1842
get_user(rtdev, &ur->rt_dev))
1843
return -EFAULT;
1844
1845
switch (cmd) {
1846
case SIOCDELRT:
1847
if (rt.rt_dst.sa_family != AF_APPLETALK)
1848
return -EINVAL;
1849
return atrtr_delete(&((struct sockaddr_at *)
1850
&rt.rt_dst)->sat_addr);
1851
1852
case SIOCADDRT:
1853
rt.rt_dev = compat_ptr(rtdev);
1854
return atrtr_ioctl_addrt(&rt);
1855
default:
1856
return -EINVAL;
1857
}
1858
}
1859
static int atalk_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1860
{
1861
void __user *argp = compat_ptr(arg);
1862
struct sock *sk = sock->sk;
1863
1864
switch (cmd) {
1865
case SIOCADDRT:
1866
case SIOCDELRT:
1867
return atalk_compat_routing_ioctl(sk, cmd, argp);
1868
/*
1869
* SIOCATALKDIFADDR is a SIOCPROTOPRIVATE ioctl number, so we
1870
* cannot handle it in common code. The data we access if ifreq
1871
* here is compatible, so we can simply call the native
1872
* handler.
1873
*/
1874
case SIOCATALKDIFADDR:
1875
return atalk_ioctl(sock, cmd, (unsigned long)argp);
1876
default:
1877
return -ENOIOCTLCMD;
1878
}
1879
}
1880
#endif /* CONFIG_COMPAT */
1881
1882
1883
static const struct net_proto_family atalk_family_ops = {
1884
.family = PF_APPLETALK,
1885
.create = atalk_create,
1886
.owner = THIS_MODULE,
1887
};
1888
1889
static const struct proto_ops atalk_dgram_ops = {
1890
.family = PF_APPLETALK,
1891
.owner = THIS_MODULE,
1892
.release = atalk_release,
1893
.bind = atalk_bind,
1894
.connect = atalk_connect,
1895
.socketpair = sock_no_socketpair,
1896
.accept = sock_no_accept,
1897
.getname = atalk_getname,
1898
.poll = datagram_poll,
1899
.ioctl = atalk_ioctl,
1900
.gettstamp = sock_gettstamp,
1901
#ifdef CONFIG_COMPAT
1902
.compat_ioctl = atalk_compat_ioctl,
1903
#endif
1904
.listen = sock_no_listen,
1905
.shutdown = sock_no_shutdown,
1906
.sendmsg = atalk_sendmsg,
1907
.recvmsg = atalk_recvmsg,
1908
.mmap = sock_no_mmap,
1909
};
1910
1911
static struct notifier_block ddp_notifier = {
1912
.notifier_call = ddp_device_event,
1913
};
1914
1915
static struct packet_type ltalk_packet_type __read_mostly = {
1916
.type = cpu_to_be16(ETH_P_LOCALTALK),
1917
.func = ltalk_rcv,
1918
};
1919
1920
static struct packet_type ppptalk_packet_type __read_mostly = {
1921
.type = cpu_to_be16(ETH_P_PPPTALK),
1922
.func = atalk_rcv,
1923
};
1924
1925
static unsigned char ddp_snap_id[] = { 0x08, 0x00, 0x07, 0x80, 0x9B };
1926
1927
/* Export symbols for use by drivers when AppleTalk is a module */
1928
EXPORT_SYMBOL(atrtr_get_dev);
1929
EXPORT_SYMBOL(atalk_find_dev_addr);
1930
1931
/* Called by proto.c on kernel start up */
1932
static int __init atalk_init(void)
1933
{
1934
int rc;
1935
1936
rc = proto_register(&ddp_proto, 0);
1937
if (rc)
1938
goto out;
1939
1940
rc = sock_register(&atalk_family_ops);
1941
if (rc)
1942
goto out_proto;
1943
1944
ddp_dl = register_snap_client(ddp_snap_id, atalk_rcv);
1945
if (!ddp_dl) {
1946
pr_crit("Unable to register DDP with SNAP.\n");
1947
rc = -ENOMEM;
1948
goto out_sock;
1949
}
1950
1951
dev_add_pack(&ltalk_packet_type);
1952
dev_add_pack(&ppptalk_packet_type);
1953
1954
rc = register_netdevice_notifier(&ddp_notifier);
1955
if (rc)
1956
goto out_snap;
1957
1958
rc = aarp_proto_init();
1959
if (rc)
1960
goto out_dev;
1961
1962
rc = atalk_proc_init();
1963
if (rc)
1964
goto out_aarp;
1965
1966
rc = atalk_register_sysctl();
1967
if (rc)
1968
goto out_proc;
1969
out:
1970
return rc;
1971
out_proc:
1972
atalk_proc_exit();
1973
out_aarp:
1974
aarp_cleanup_module();
1975
out_dev:
1976
unregister_netdevice_notifier(&ddp_notifier);
1977
out_snap:
1978
dev_remove_pack(&ppptalk_packet_type);
1979
dev_remove_pack(&ltalk_packet_type);
1980
unregister_snap_client(ddp_dl);
1981
out_sock:
1982
sock_unregister(PF_APPLETALK);
1983
out_proto:
1984
proto_unregister(&ddp_proto);
1985
goto out;
1986
}
1987
module_init(atalk_init);
1988
1989
/*
1990
* No explicit module reference count manipulation is needed in the
1991
* protocol. Socket layer sets module reference count for us
1992
* and interfaces reference counting is done
1993
* by the network device layer.
1994
*
1995
* Ergo, before the AppleTalk module can be removed, all AppleTalk
1996
* sockets should be closed from user space.
1997
*/
1998
static void __exit atalk_exit(void)
1999
{
2000
#ifdef CONFIG_SYSCTL
2001
atalk_unregister_sysctl();
2002
#endif /* CONFIG_SYSCTL */
2003
atalk_proc_exit();
2004
aarp_cleanup_module(); /* General aarp clean-up. */
2005
unregister_netdevice_notifier(&ddp_notifier);
2006
dev_remove_pack(&ltalk_packet_type);
2007
dev_remove_pack(&ppptalk_packet_type);
2008
unregister_snap_client(ddp_dl);
2009
sock_unregister(PF_APPLETALK);
2010
proto_unregister(&ddp_proto);
2011
}
2012
module_exit(atalk_exit);
2013
2014
MODULE_LICENSE("GPL");
2015
MODULE_AUTHOR("Alan Cox <[email protected]>");
2016
MODULE_DESCRIPTION("AppleTalk 0.20\n");
2017
MODULE_ALIAS_NETPROTO(PF_APPLETALK);
2018
2019