OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [net/] [appletalk/] [ddp.c] - Blame information for rev 17

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.