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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [net/] [netrom/] [af_netrom.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 *      NET/ROM release 007
3
 *
4
 *      This code REQUIRES 2.1.15 or higher/ NET3.038
5
 *
6
 *      This module:
7
 *              This module is free software; you can redistribute it and/or
8
 *              modify it under the terms of the GNU General Public License
9
 *              as published by the Free Software Foundation; either version
10
 *              2 of the License, or (at your option) any later version.
11
 *
12
 *      History
13
 *      NET/ROM 001     Jonathan(G4KLX) Cloned from the AX25 code.
14
 *      NET/ROM 002     Darryl(G7LED)   Fixes and address enhancement.
15
 *                      Jonathan(G4KLX) Complete bind re-think.
16
 *                      Alan(GW4PTS)    Trivial tweaks into new format.
17
 *      NET/ROM 003     Jonathan(G4KLX) Added G8BPQ extensions.
18
 *                                      Added NET/ROM routing ioctl.
19
 *                      Darryl(G7LED)   Fix autobinding (on connect).
20
 *                                      Fixed nr_release(), set TCP_CLOSE, wakeup app
21
 *                                      context, THEN make the sock dead.
22
 *                                      Circuit ID check before allocating it on
23
 *                                      a connection.
24
 *                      Alan(GW4PTS)    sendmsg/recvmsg only. Fixed connect clear bug
25
 *                                      inherited from AX.25
26
 *      NET/ROM 004     Jonathan(G4KLX) Converted to module.
27
 *      NET/ROM 005     Jonathan(G4KLX) Linux 2.1
28
 *                      Alan(GW4PTS)    Started POSIXisms
29
 *      NET/ROM 006     Alan(GW4PTS)    Brought in line with the ANK changes
30
 *                      Jonathan(G4KLX) Removed hdrincl.
31
 *      NET/ROM 007     Jonathan(G4KLX) New timer architecture.
32
 *                                      Impmented Idle timer.
33
 *                      Arnaldo C. Melo s/suser/capable/, micro cleanups
34
 *                      Jeroen(PE1RXQ)  Use sock_orphan() on release.
35
 *                      Tomi(OH2BNS)    Better frame type checking.
36
 *                                      Device refcnt fixes.
37
 */
38
 
39
#include <linux/config.h>
40
#include <linux/module.h>
41
#include <linux/errno.h>
42
#include <linux/types.h>
43
#include <linux/socket.h>
44
#include <linux/in.h>
45
#include <linux/kernel.h>
46
#include <linux/sched.h>
47
#include <linux/timer.h>
48
#include <linux/string.h>
49
#include <linux/sockios.h>
50
#include <linux/net.h>
51
#include <linux/stat.h>
52
#include <net/ax25.h>
53
#include <linux/inet.h>
54
#include <linux/netdevice.h>
55
#include <linux/if_arp.h>
56
#include <linux/skbuff.h>
57
#include <net/sock.h>
58
#include <asm/uaccess.h>
59
#include <asm/system.h>
60
#include <linux/fcntl.h>
61
#include <linux/termios.h>      /* For TIOCINQ/OUTQ */
62
#include <linux/mm.h>
63
#include <linux/interrupt.h>
64
#include <linux/notifier.h>
65
#include <net/netrom.h>
66
#include <linux/proc_fs.h>
67
#include <net/ip.h>
68
#include <net/arp.h>
69
#include <linux/init.h>
70
 
71
int nr_ndevs = 4;
72
 
73
int sysctl_netrom_default_path_quality            = NR_DEFAULT_QUAL;
74
int sysctl_netrom_obsolescence_count_initialiser  = NR_DEFAULT_OBS;
75
int sysctl_netrom_network_ttl_initialiser         = NR_DEFAULT_TTL;
76
int sysctl_netrom_transport_timeout               = NR_DEFAULT_T1;
77
int sysctl_netrom_transport_maximum_tries         = NR_DEFAULT_N2;
78
int sysctl_netrom_transport_acknowledge_delay     = NR_DEFAULT_T2;
79
int sysctl_netrom_transport_busy_delay            = NR_DEFAULT_T4;
80
int sysctl_netrom_transport_requested_window_size = NR_DEFAULT_WINDOW;
81
int sysctl_netrom_transport_no_activity_timeout   = NR_DEFAULT_IDLE;
82
int sysctl_netrom_routing_control                 = NR_DEFAULT_ROUTING;
83
int sysctl_netrom_link_fails_count                = NR_DEFAULT_FAILS;
84
 
85
static unsigned short circuit = 0x101;
86
 
87
static struct sock *volatile nr_list;
88
 
89
static struct proto_ops nr_proto_ops;
90
 
91
static void nr_free_sock(struct sock *sk)
92
{
93
        sk_free(sk);
94
 
95
        MOD_DEC_USE_COUNT;
96
}
97
 
98
static struct sock *nr_alloc_sock(void)
99
{
100
        struct sock *sk;
101
        nr_cb *nr;
102
 
103
        if ((sk = sk_alloc(PF_NETROM, GFP_ATOMIC, 1)) == NULL)
104
                return NULL;
105
 
106
        if ((nr = kmalloc(sizeof(*nr), GFP_ATOMIC)) == NULL) {
107
                sk_free(sk);
108
                return NULL;
109
        }
110
 
111
        MOD_INC_USE_COUNT;
112
 
113
        memset(nr, 0x00, sizeof(*nr));
114
 
115
        sk->protinfo.nr = nr;
116
        nr->sk = sk;
117
 
118
        return sk;
119
}
120
 
121
/*
122
 *      Socket removal during an interrupt is now safe.
123
 */
124
static void nr_remove_socket(struct sock *sk)
125
{
126
        struct sock *s;
127
        unsigned long flags;
128
 
129
        save_flags(flags); cli();
130
 
131
        if ((s = nr_list) == sk) {
132
                nr_list = s->next;
133
                dev_put(sk->protinfo.nr->device);
134
                restore_flags(flags);
135
                return;
136
        }
137
 
138
        while (s != NULL && s->next != NULL) {
139
                if (s->next == sk) {
140
                        s->next = sk->next;
141
                        dev_put(sk->protinfo.nr->device);
142
                        restore_flags(flags);
143
                        return;
144
                }
145
 
146
                s = s->next;
147
        }
148
 
149
        restore_flags(flags);
150
}
151
 
152
/*
153
 *      Kill all bound sockets on a dropped device.
154
 */
155
static void nr_kill_by_device(struct net_device *dev)
156
{
157
        struct sock *s;
158
 
159
        for (s = nr_list; s != NULL; s = s->next) {
160
                if (s->protinfo.nr->device == dev)
161
                        nr_disconnect(s, ENETUNREACH);
162
        }
163
}
164
 
165
/*
166
 *      Handle device status changes.
167
 */
168
static int nr_device_event(struct notifier_block *this, unsigned long event, void *ptr)
169
{
170
        struct net_device *dev = (struct net_device *)ptr;
171
 
172
        if (event != NETDEV_DOWN)
173
                return NOTIFY_DONE;
174
 
175
        nr_kill_by_device(dev);
176
        nr_rt_device_down(dev);
177
 
178
        return NOTIFY_DONE;
179
}
180
 
181
/*
182
 *      Add a socket to the bound sockets list.
183
 */
184
static void nr_insert_socket(struct sock *sk)
185
{
186
        unsigned long flags;
187
 
188
        save_flags(flags); cli();
189
 
190
        sk->next = nr_list;
191
        nr_list  = sk;
192
 
193
        restore_flags(flags);
194
}
195
 
196
/*
197
 *      Find a socket that wants to accept the Connect Request we just
198
 *      received.
199
 */
200
static struct sock *nr_find_listener(ax25_address *addr)
201
{
202
        unsigned long flags;
203
        struct sock *s;
204
 
205
        save_flags(flags);
206
        cli();
207
 
208
        for (s = nr_list; s != NULL; s = s->next) {
209
                if (ax25cmp(&s->protinfo.nr->source_addr, addr) == 0 && s->state == TCP_LISTEN) {
210
                        restore_flags(flags);
211
                        return s;
212
                }
213
        }
214
 
215
        restore_flags(flags);
216
        return NULL;
217
}
218
 
219
/*
220
 *      Find a connected NET/ROM socket given my circuit IDs.
221
 */
222
static struct sock *nr_find_socket(unsigned char index, unsigned char id)
223
{
224
        struct sock *s;
225
        unsigned long flags;
226
 
227
        save_flags(flags);
228
        cli();
229
 
230
        for (s = nr_list; s != NULL; s = s->next) {
231
                if (s->protinfo.nr->my_index == index && s->protinfo.nr->my_id == id) {
232
                        restore_flags(flags);
233
                        return s;
234
                }
235
        }
236
 
237
        restore_flags(flags);
238
 
239
        return NULL;
240
}
241
 
242
/*
243
 *      Find a connected NET/ROM socket given their circuit IDs.
244
 */
245
static struct sock *nr_find_peer(unsigned char index, unsigned char id, ax25_address *dest)
246
{
247
        struct sock *s;
248
        unsigned long flags;
249
 
250
        save_flags(flags);
251
        cli();
252
 
253
        for (s = nr_list; s != NULL; s = s->next) {
254
                if (s->protinfo.nr->your_index == index && s->protinfo.nr->your_id == id && ax25cmp(&s->protinfo.nr->dest_addr, dest) == 0) {
255
                        restore_flags(flags);
256
                        return s;
257
                }
258
        }
259
 
260
        restore_flags(flags);
261
 
262
        return NULL;
263
}
264
 
265
/*
266
 *      Find next free circuit ID.
267
 */
268
static unsigned short nr_find_next_circuit(void)
269
{
270
        unsigned short id = circuit;
271
        unsigned char i, j;
272
 
273
        for (;;) {
274
                i = id / 256;
275
                j = id % 256;
276
 
277
                if (i != 0 && j != 0)
278
                        if (nr_find_socket(i, j) == NULL)
279
                                break;
280
 
281
                id++;
282
        }
283
 
284
        return id;
285
}
286
 
287
/*
288
 *      Deferred destroy.
289
 */
290
void nr_destroy_socket(struct sock *);
291
 
292
/*
293
 *      Handler for deferred kills.
294
 */
295
static void nr_destroy_timer(unsigned long data)
296
{
297
        nr_destroy_socket((struct sock *)data);
298
}
299
 
300
/*
301
 *      This is called from user mode and the timers. Thus it protects itself against
302
 *      interrupt users but doesn't worry about being called during work.
303
 *      Once it is removed from the queue no interrupt or bottom half will
304
 *      touch it and we are (fairly 8-) ) safe.
305
 */
306
void nr_destroy_socket(struct sock *sk) /* Not static as it's used by the timer */
307
{
308
        struct sk_buff *skb;
309
        unsigned long flags;
310
 
311
        save_flags(flags); cli();
312
 
313
        nr_stop_heartbeat(sk);
314
        nr_stop_t1timer(sk);
315
        nr_stop_t2timer(sk);
316
        nr_stop_t4timer(sk);
317
        nr_stop_idletimer(sk);
318
 
319
        nr_remove_socket(sk);
320
        nr_clear_queues(sk);            /* Flush the queues */
321
 
322
        while ((skb = skb_dequeue(&sk->receive_queue)) != NULL) {
323
                if (skb->sk != sk) {                    /* A pending connection */
324
                        skb->sk->dead = 1;      /* Queue the unaccepted socket for death */
325
                        nr_start_heartbeat(skb->sk);
326
                        skb->sk->protinfo.nr->state = NR_STATE_0;
327
                }
328
 
329
                kfree_skb(skb);
330
        }
331
 
332
        if (atomic_read(&sk->wmem_alloc) != 0 || atomic_read(&sk->rmem_alloc) != 0) {
333
                /* Defer: outstanding buffers */
334
                init_timer(&sk->timer);
335
                sk->timer.expires  = jiffies + 10 * HZ;
336
                sk->timer.function = nr_destroy_timer;
337
                sk->timer.data     = (unsigned long)sk;
338
                add_timer(&sk->timer);
339
        } else {
340
                nr_free_sock(sk);
341
        }
342
 
343
        restore_flags(flags);
344
}
345
 
346
/*
347
 *      Handling for system calls applied via the various interfaces to a
348
 *      NET/ROM socket object.
349
 */
350
 
351
static int nr_setsockopt(struct socket *sock, int level, int optname,
352
        char *optval, int optlen)
353
{
354
        struct sock *sk = sock->sk;
355
        int opt;
356
 
357
        if (level != SOL_NETROM)
358
                return -ENOPROTOOPT;
359
 
360
        if (optlen < sizeof(int))
361
                return -EINVAL;
362
 
363
        if (get_user(opt, (int *)optval))
364
                return -EFAULT;
365
 
366
        switch (optname) {
367
                case NETROM_T1:
368
                        if (opt < 1)
369
                                return -EINVAL;
370
                        sk->protinfo.nr->t1 = opt * HZ;
371
                        return 0;
372
 
373
                case NETROM_T2:
374
                        if (opt < 1)
375
                                return -EINVAL;
376
                        sk->protinfo.nr->t2 = opt * HZ;
377
                        return 0;
378
 
379
                case NETROM_N2:
380
                        if (opt < 1 || opt > 31)
381
                                return -EINVAL;
382
                        sk->protinfo.nr->n2 = opt;
383
                        return 0;
384
 
385
                case NETROM_T4:
386
                        if (opt < 1)
387
                                return -EINVAL;
388
                        sk->protinfo.nr->t4 = opt * HZ;
389
                        return 0;
390
 
391
                case NETROM_IDLE:
392
                        if (opt < 0)
393
                                return -EINVAL;
394
                        sk->protinfo.nr->idle = opt * 60 * HZ;
395
                        return 0;
396
 
397
                default:
398
                        return -ENOPROTOOPT;
399
        }
400
}
401
 
402
static int nr_getsockopt(struct socket *sock, int level, int optname,
403
        char *optval, int *optlen)
404
{
405
        struct sock *sk = sock->sk;
406
        int val = 0;
407
        int len;
408
 
409
        if (level != SOL_NETROM)
410
                return -ENOPROTOOPT;
411
 
412
        if (get_user(len, optlen))
413
                return -EFAULT;
414
 
415
        if (len < 0)
416
                return -EINVAL;
417
 
418
        switch (optname) {
419
                case NETROM_T1:
420
                        val = sk->protinfo.nr->t1 / HZ;
421
                        break;
422
 
423
                case NETROM_T2:
424
                        val = sk->protinfo.nr->t2 / HZ;
425
                        break;
426
 
427
                case NETROM_N2:
428
                        val = sk->protinfo.nr->n2;
429
                        break;
430
 
431
                case NETROM_T4:
432
                        val = sk->protinfo.nr->t4 / HZ;
433
                        break;
434
 
435
                case NETROM_IDLE:
436
                        val = sk->protinfo.nr->idle / (60 * HZ);
437
                        break;
438
 
439
                default:
440
                        return -ENOPROTOOPT;
441
        }
442
 
443
        len = min_t(unsigned int, len, sizeof(int));
444
 
445
        if (put_user(len, optlen))
446
                return -EFAULT;
447
 
448
        return copy_to_user(optval, &val, len) ? -EFAULT : 0;
449
}
450
 
451
static int nr_listen(struct socket *sock, int backlog)
452
{
453
        struct sock *sk = sock->sk;
454
 
455
        if (sk->state != TCP_LISTEN) {
456
                memset(&sk->protinfo.nr->user_addr, '\0', AX25_ADDR_LEN);
457
                sk->max_ack_backlog = backlog;
458
                sk->state           = TCP_LISTEN;
459
                return 0;
460
        }
461
 
462
        return -EOPNOTSUPP;
463
}
464
 
465
static int nr_create(struct socket *sock, int protocol)
466
{
467
        struct sock *sk;
468
        nr_cb *nr;
469
 
470
        if (sock->type != SOCK_SEQPACKET || protocol != 0)
471
                return -ESOCKTNOSUPPORT;
472
 
473
        if ((sk = nr_alloc_sock()) == NULL)
474
                return -ENOMEM;
475
 
476
        nr = sk->protinfo.nr;
477
 
478
        sock_init_data(sock, sk);
479
 
480
        sock->ops    = &nr_proto_ops;
481
        sk->protocol = protocol;
482
 
483
        skb_queue_head_init(&nr->ack_queue);
484
        skb_queue_head_init(&nr->reseq_queue);
485
        skb_queue_head_init(&nr->frag_queue);
486
 
487
        init_timer(&nr->t1timer);
488
        init_timer(&nr->t2timer);
489
        init_timer(&nr->t4timer);
490
        init_timer(&nr->idletimer);
491
 
492
        nr->t1     = sysctl_netrom_transport_timeout;
493
        nr->t2     = sysctl_netrom_transport_acknowledge_delay;
494
        nr->n2     = sysctl_netrom_transport_maximum_tries;
495
        nr->t4     = sysctl_netrom_transport_busy_delay;
496
        nr->idle   = sysctl_netrom_transport_no_activity_timeout;
497
        nr->window = sysctl_netrom_transport_requested_window_size;
498
 
499
        nr->bpqext = 1;
500
        nr->state  = NR_STATE_0;
501
 
502
        return 0;
503
}
504
 
505
static struct sock *nr_make_new(struct sock *osk)
506
{
507
        struct sock *sk;
508
        nr_cb *nr;
509
 
510
        if (osk->type != SOCK_SEQPACKET)
511
                return NULL;
512
 
513
        if ((sk = nr_alloc_sock()) == NULL)
514
                return NULL;
515
 
516
        nr = sk->protinfo.nr;
517
 
518
        sock_init_data(NULL, sk);
519
 
520
        sk->type     = osk->type;
521
        sk->socket   = osk->socket;
522
        sk->priority = osk->priority;
523
        sk->protocol = osk->protocol;
524
        sk->rcvbuf   = osk->rcvbuf;
525
        sk->sndbuf   = osk->sndbuf;
526
        sk->debug    = osk->debug;
527
        sk->state    = TCP_ESTABLISHED;
528
        sk->sleep    = osk->sleep;
529
        sk->zapped   = osk->zapped;
530
 
531
        skb_queue_head_init(&nr->ack_queue);
532
        skb_queue_head_init(&nr->reseq_queue);
533
        skb_queue_head_init(&nr->frag_queue);
534
 
535
        init_timer(&nr->t1timer);
536
        init_timer(&nr->t2timer);
537
        init_timer(&nr->t4timer);
538
        init_timer(&nr->idletimer);
539
 
540
        nr->t1      = osk->protinfo.nr->t1;
541
        nr->t2      = osk->protinfo.nr->t2;
542
        nr->n2      = osk->protinfo.nr->n2;
543
        nr->t4      = osk->protinfo.nr->t4;
544
        nr->idle    = osk->protinfo.nr->idle;
545
        nr->window  = osk->protinfo.nr->window;
546
 
547
        nr->device  = osk->protinfo.nr->device;
548
        nr->bpqext  = osk->protinfo.nr->bpqext;
549
 
550
        return sk;
551
}
552
 
553
static int nr_release(struct socket *sock)
554
{
555
        struct sock *sk = sock->sk;
556
 
557
        if (sk == NULL) return 0;
558
 
559
        switch (sk->protinfo.nr->state) {
560
 
561
                case NR_STATE_0:
562
                case NR_STATE_1:
563
                case NR_STATE_2:
564
                        nr_disconnect(sk, 0);
565
                        nr_destroy_socket(sk);
566
                        break;
567
 
568
                case NR_STATE_3:
569
                        nr_clear_queues(sk);
570
                        sk->protinfo.nr->n2count = 0;
571
                        nr_write_internal(sk, NR_DISCREQ);
572
                        nr_start_t1timer(sk);
573
                        nr_stop_t2timer(sk);
574
                        nr_stop_t4timer(sk);
575
                        nr_stop_idletimer(sk);
576
                        sk->protinfo.nr->state   = NR_STATE_2;
577
                        sk->state                = TCP_CLOSE;
578
                        sk->shutdown            |= SEND_SHUTDOWN;
579
                        sk->state_change(sk);
580
                        sock_orphan(sk);
581
                        sk->destroy              = 1;
582
                        break;
583
 
584
                default:
585
                        sk->socket = NULL;
586
                        break;
587
        }
588
 
589
        sock->sk   = NULL;
590
 
591
        return 0;
592
}
593
 
594
static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
595
{
596
        struct sock *sk = sock->sk;
597
        struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
598
        struct net_device *dev;
599
        ax25_address *user, *source;
600
 
601
        if (sk->zapped == 0)
602
                return -EINVAL;
603
 
604
        if (addr_len < sizeof(struct sockaddr_ax25) || addr_len > sizeof(struct
605
full_sockaddr_ax25))
606
                return -EINVAL;
607
 
608
        if (addr_len < (addr->fsa_ax25.sax25_ndigis * sizeof(ax25_address) + sizeof(struct sockaddr_ax25)))
609
                return -EINVAL;
610
 
611
        if (addr->fsa_ax25.sax25_family != AF_NETROM)
612
                return -EINVAL;
613
 
614
        if ((dev = nr_dev_get(&addr->fsa_ax25.sax25_call)) == NULL) {
615
                SOCK_DEBUG(sk, "NET/ROM: bind failed: invalid node callsign\n");
616
                return -EADDRNOTAVAIL;
617
        }
618
 
619
        /*
620
         * Only the super user can set an arbitrary user callsign.
621
         */
622
        if (addr->fsa_ax25.sax25_ndigis == 1) {
623
                if (!capable(CAP_NET_BIND_SERVICE)) {
624
                        dev_put(dev);
625
                        return -EACCES;
626
                }
627
                sk->protinfo.nr->user_addr   = addr->fsa_digipeater[0];
628
                sk->protinfo.nr->source_addr = addr->fsa_ax25.sax25_call;
629
        } else {
630
                source = &addr->fsa_ax25.sax25_call;
631
 
632
                if ((user = ax25_findbyuid(current->euid)) == NULL) {
633
                        if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
634
                                dev_put(dev);
635
                                return -EPERM;
636
                        }
637
                        user = source;
638
                }
639
 
640
                sk->protinfo.nr->user_addr   = *user;
641
                sk->protinfo.nr->source_addr = *source;
642
        }
643
 
644
        sk->protinfo.nr->device = dev;
645
        nr_insert_socket(sk);
646
 
647
        sk->zapped = 0;
648
        SOCK_DEBUG(sk, "NET/ROM: socket is bound\n");
649
        return 0;
650
}
651
 
652
static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
653
        int addr_len, int flags)
654
{
655
        struct sock *sk = sock->sk;
656
        struct sockaddr_ax25 *addr = (struct sockaddr_ax25 *)uaddr;
657
        ax25_address *user, *source = NULL;
658
        struct net_device *dev;
659
 
660
        if (sk->state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) {
661
                sock->state = SS_CONNECTED;
662
                return 0;        /* Connect completed during a ERESTARTSYS event */
663
        }
664
 
665
        if (sk->state == TCP_CLOSE && sock->state == SS_CONNECTING) {
666
                sock->state = SS_UNCONNECTED;
667
                return -ECONNREFUSED;
668
        }
669
 
670
        if (sk->state == TCP_ESTABLISHED)
671
                return -EISCONN;        /* No reconnect on a seqpacket socket */
672
 
673
        sk->state   = TCP_CLOSE;
674
        sock->state = SS_UNCONNECTED;
675
 
676
        if (addr_len != sizeof(struct sockaddr_ax25) && addr_len != sizeof(struct full_sockaddr_ax25))
677
                return -EINVAL;
678
 
679
        if (addr->sax25_family != AF_NETROM)
680
                return -EINVAL;
681
 
682
        if (sk->zapped) {       /* Must bind first - autobinding in this may or may not work */
683
                sk->zapped = 0;
684
 
685
                if ((dev = nr_dev_first()) == NULL)
686
                        return -ENETUNREACH;
687
 
688
                source = (ax25_address *)dev->dev_addr;
689
 
690
                if ((user = ax25_findbyuid(current->euid)) == NULL) {
691
                        if (ax25_uid_policy && !capable(CAP_NET_ADMIN)) {
692
                                dev_put(dev);
693
                                return -EPERM;
694
                        }
695
                        user = source;
696
                }
697
 
698
                sk->protinfo.nr->user_addr   = *user;
699
                sk->protinfo.nr->source_addr = *source;
700
                sk->protinfo.nr->device      = dev;
701
 
702
                nr_insert_socket(sk);           /* Finish the bind */
703
        }
704
 
705
        sk->protinfo.nr->dest_addr = addr->sax25_call;
706
 
707
        circuit = nr_find_next_circuit();
708
 
709
        sk->protinfo.nr->my_index = circuit / 256;
710
        sk->protinfo.nr->my_id    = circuit % 256;
711
 
712
        circuit++;
713
 
714
        /* Move to connecting socket, start sending Connect Requests */
715
        sock->state            = SS_CONNECTING;
716
        sk->state              = TCP_SYN_SENT;
717
 
718
        nr_establish_data_link(sk);
719
 
720
        sk->protinfo.nr->state = NR_STATE_1;
721
 
722
        nr_start_heartbeat(sk);
723
 
724
        /* Now the loop */
725
        if (sk->state != TCP_ESTABLISHED && (flags & O_NONBLOCK))
726
                return -EINPROGRESS;
727
 
728
        cli();  /* To avoid races on the sleep */
729
 
730
        /*
731
         * A Connect Ack with Choke or timeout or failed routing will go to closed.
732
         */
733
        while (sk->state == TCP_SYN_SENT) {
734
                interruptible_sleep_on(sk->sleep);
735
                if (signal_pending(current)) {
736
                        sti();
737
                        return -ERESTARTSYS;
738
                }
739
        }
740
 
741
        if (sk->state != TCP_ESTABLISHED) {
742
                sti();
743
                sock->state = SS_UNCONNECTED;
744
                return sock_error(sk);  /* Always set at this point */
745
        }
746
 
747
        sock->state = SS_CONNECTED;
748
 
749
        sti();
750
 
751
        return 0;
752
}
753
 
754
static int nr_accept(struct socket *sock, struct socket *newsock, int flags)
755
{
756
        struct sock *sk;
757
        struct sock *newsk;
758
        struct sk_buff *skb;
759
 
760
        if ((sk = sock->sk) == NULL)
761
                return -EINVAL;
762
 
763
        if (sk->type != SOCK_SEQPACKET)
764
                return -EOPNOTSUPP;
765
 
766
        if (sk->state != TCP_LISTEN)
767
                return -EINVAL;
768
 
769
        /*
770
         *      The write queue this time is holding sockets ready to use
771
         *      hooked into the SABM we saved
772
         */
773
        do {
774
                cli();
775
                if ((skb = skb_dequeue(&sk->receive_queue)) == NULL) {
776
                        if (flags & O_NONBLOCK) {
777
                                sti();
778
                                return -EWOULDBLOCK;
779
                        }
780
                        interruptible_sleep_on(sk->sleep);
781
                        if (signal_pending(current)) {
782
                                sti();
783
                                return -ERESTARTSYS;
784
                        }
785
                }
786
        } while (skb == NULL);
787
 
788
        newsk = skb->sk;
789
        newsk->pair = NULL;
790
        newsk->socket = newsock;
791
        newsk->sleep = &newsock->wait;
792
        sti();
793
 
794
        /* Now attach up the new socket */
795
        kfree_skb(skb);
796
        sk->ack_backlog--;
797
        newsock->sk = newsk;
798
 
799
        return 0;
800
}
801
 
802
static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
803
        int *uaddr_len, int peer)
804
{
805
        struct full_sockaddr_ax25 *sax = (struct full_sockaddr_ax25 *)uaddr;
806
        struct sock *sk = sock->sk;
807
 
808
        if (peer != 0) {
809
                if (sk->state != TCP_ESTABLISHED)
810
                        return -ENOTCONN;
811
                sax->fsa_ax25.sax25_family = AF_NETROM;
812
                sax->fsa_ax25.sax25_ndigis = 1;
813
                sax->fsa_ax25.sax25_call   = sk->protinfo.nr->user_addr;
814
                sax->fsa_digipeater[0]     = sk->protinfo.nr->dest_addr;
815
                *uaddr_len = sizeof(struct full_sockaddr_ax25);
816
        } else {
817
                sax->fsa_ax25.sax25_family = AF_NETROM;
818
                sax->fsa_ax25.sax25_ndigis = 0;
819
                sax->fsa_ax25.sax25_call   = sk->protinfo.nr->source_addr;
820
                *uaddr_len = sizeof(struct sockaddr_ax25);
821
        }
822
 
823
        return 0;
824
}
825
 
826
int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
827
{
828
        struct sock *sk;
829
        struct sock *make;
830
        ax25_address *src, *dest, *user;
831
        unsigned short circuit_index, circuit_id;
832
        unsigned short peer_circuit_index, peer_circuit_id;
833
        unsigned short frametype, flags, window, timeout;
834
 
835
        skb->sk = NULL;         /* Initially we don't know who it's for */
836
 
837
        /*
838
         *      skb->data points to the netrom frame start
839
         */
840
 
841
        src  = (ax25_address *)(skb->data + 0);
842
        dest = (ax25_address *)(skb->data + 7);
843
 
844
        circuit_index      = skb->data[15];
845
        circuit_id         = skb->data[16];
846
        peer_circuit_index = skb->data[17];
847
        peer_circuit_id    = skb->data[18];
848
        frametype          = skb->data[19] & 0x0F;
849
        flags              = skb->data[19] & 0xF0;
850
 
851
        switch (frametype) {
852
        case NR_PROTOEXT:
853
#ifdef CONFIG_INET
854
                /*
855
                 * Check for an incoming IP over NET/ROM frame.
856
                 */
857
                if (circuit_index == NR_PROTO_IP && circuit_id == NR_PROTO_IP) {
858
                        skb_pull(skb, NR_NETWORK_LEN + NR_TRANSPORT_LEN);
859
                        skb->h.raw = skb->data;
860
 
861
                        return nr_rx_ip(skb, dev);
862
                }
863
#endif
864
                return 0;
865
 
866
        case NR_CONNREQ:
867
        case NR_CONNACK:
868
        case NR_DISCREQ:
869
        case NR_DISCACK:
870
        case NR_INFO:
871
        case NR_INFOACK:
872
                /*
873
                 * These frame types we understand.
874
                 */
875
                break;
876
 
877
        default:
878
                /*
879
                 * Everything else is ignored.
880
                 */
881
                return 0;
882
        }
883
 
884
        /*
885
         * Find an existing socket connection, based on circuit ID, if it's
886
         * a Connect Request base it on their circuit ID.
887
         *
888
         * Circuit ID 0/0 is not valid but it could still be a "reset" for a
889
         * circuit that no longer exists at the other end ...
890
         */
891
 
892
        sk = NULL;
893
 
894
        if (circuit_index == 0 && circuit_id == 0) {
895
                if (frametype == NR_CONNACK && flags == NR_CHOKE_FLAG)
896
                        sk = nr_find_peer(peer_circuit_index, peer_circuit_id, src);
897
        } else {
898
                if (frametype == NR_CONNREQ)
899
                        sk = nr_find_peer(circuit_index, circuit_id, src);
900
                else
901
                        sk = nr_find_socket(circuit_index, circuit_id);
902
        }
903
 
904
        if (sk != NULL) {
905
                skb->h.raw = skb->data;
906
 
907
                if (frametype == NR_CONNACK && skb->len == 22)
908
                        sk->protinfo.nr->bpqext = 1;
909
                else
910
                        sk->protinfo.nr->bpqext = 0;
911
 
912
                return nr_process_rx_frame(sk, skb);
913
        }
914
 
915
        /*
916
         * Now it should be a CONNREQ.
917
         */
918
        if (frametype != NR_CONNREQ) {
919
                /*
920
                 * Here it would be nice to be able to send a reset but
921
                 * NET/ROM doesn't have one. The following hack would
922
                 * have been a way to extend the protocol but apparently
923
                 * it kills BPQ boxes... :-(
924
                 */
925
#if 0
926
                /*
927
                 * Never reply to a CONNACK/CHOKE.
928
                 */
929
                if (frametype != NR_CONNACK || flags != NR_CHOKE_FLAG)
930
                        nr_transmit_refusal(skb, 1);
931
#endif
932
                return 0;
933
        }
934
 
935
        sk = nr_find_listener(dest);
936
 
937
        user = (ax25_address *)(skb->data + 21);
938
 
939
        if (sk == NULL || sk->ack_backlog == sk->max_ack_backlog || (make = nr_make_new(sk)) == NULL) {
940
                nr_transmit_refusal(skb, 0);
941
                return 0;
942
        }
943
 
944
        window = skb->data[20];
945
 
946
        skb->sk             = make;
947
        make->state         = TCP_ESTABLISHED;
948
 
949
        /* Fill in his circuit details */
950
        make->protinfo.nr->source_addr = *dest;
951
        make->protinfo.nr->dest_addr   = *src;
952
        make->protinfo.nr->user_addr   = *user;
953
 
954
        make->protinfo.nr->your_index  = circuit_index;
955
        make->protinfo.nr->your_id     = circuit_id;
956
 
957
        circuit = nr_find_next_circuit();
958
 
959
        make->protinfo.nr->my_index    = circuit / 256;
960
        make->protinfo.nr->my_id       = circuit % 256;
961
 
962
        circuit++;
963
 
964
        /* Window negotiation */
965
        if (window < make->protinfo.nr->window)
966
                make->protinfo.nr->window = window;
967
 
968
        /* L4 timeout negotiation */
969
        if (skb->len == 37) {
970
                timeout = skb->data[36] * 256 + skb->data[35];
971
                if (timeout * HZ < make->protinfo.nr->t1)
972
                        make->protinfo.nr->t1 = timeout * HZ;
973
                make->protinfo.nr->bpqext = 1;
974
        } else {
975
                make->protinfo.nr->bpqext = 0;
976
        }
977
 
978
        nr_write_internal(make, NR_CONNACK);
979
 
980
        make->protinfo.nr->condition = 0x00;
981
        make->protinfo.nr->vs        = 0;
982
        make->protinfo.nr->va        = 0;
983
        make->protinfo.nr->vr        = 0;
984
        make->protinfo.nr->vl        = 0;
985
        make->protinfo.nr->state     = NR_STATE_3;
986
        sk->ack_backlog++;
987
        make->pair = sk;
988
 
989
        dev_hold(make->protinfo.nr->device);
990
 
991
        nr_insert_socket(make);
992
 
993
        skb_queue_head(&sk->receive_queue, skb);
994
 
995
        nr_start_heartbeat(make);
996
        nr_start_idletimer(make);
997
 
998
        if (!sk->dead)
999
                sk->data_ready(sk, skb->len);
1000
 
1001
        return 1;
1002
}
1003
 
1004
static int nr_sendmsg(struct socket *sock, struct msghdr *msg, int len, struct scm_cookie *scm)
1005
{
1006
        struct sock *sk = sock->sk;
1007
        struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
1008
        int err;
1009
        struct sockaddr_ax25 sax;
1010
        struct sk_buff *skb;
1011
        unsigned char *asmptr;
1012
        int size;
1013
 
1014
        if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR))
1015
                return -EINVAL;
1016
 
1017
        if (sk->zapped)
1018
                return -EADDRNOTAVAIL;
1019
 
1020
        if (sk->shutdown & SEND_SHUTDOWN) {
1021
                send_sig(SIGPIPE, current, 0);
1022
                return -EPIPE;
1023
        }
1024
 
1025
        if (sk->protinfo.nr->device == NULL)
1026
                return -ENETUNREACH;
1027
 
1028
        if (usax) {
1029
                if (msg->msg_namelen < sizeof(sax))
1030
                        return -EINVAL;
1031
                sax = *usax;
1032
                if (ax25cmp(&sk->protinfo.nr->dest_addr, &sax.sax25_call) != 0)
1033
                        return -EISCONN;
1034
                if (sax.sax25_family != AF_NETROM)
1035
                        return -EINVAL;
1036
        } else {
1037
                if (sk->state != TCP_ESTABLISHED)
1038
                        return -ENOTCONN;
1039
                sax.sax25_family = AF_NETROM;
1040
                sax.sax25_call   = sk->protinfo.nr->dest_addr;
1041
        }
1042
 
1043
        SOCK_DEBUG(sk, "NET/ROM: sendto: Addresses built.\n");
1044
 
1045
        /* Build a packet */
1046
        SOCK_DEBUG(sk, "NET/ROM: sendto: building packet.\n");
1047
        size = len + AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + NR_NETWORK_LEN + NR_TRANSPORT_LEN;
1048
 
1049
        if ((skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err)) == NULL)
1050
                return err;
1051
 
1052
        skb_reserve(skb, size - len);
1053
 
1054
        /*
1055
         *      Push down the NET/ROM header
1056
         */
1057
 
1058
        asmptr = skb_push(skb, NR_TRANSPORT_LEN);
1059
        SOCK_DEBUG(sk, "Building NET/ROM Header.\n");
1060
 
1061
        /* Build a NET/ROM Transport header */
1062
 
1063
        *asmptr++ = sk->protinfo.nr->your_index;
1064
        *asmptr++ = sk->protinfo.nr->your_id;
1065
        *asmptr++ = 0;           /* To be filled in later */
1066
        *asmptr++ = 0;           /*      Ditto            */
1067
        *asmptr++ = NR_INFO;
1068
        SOCK_DEBUG(sk, "Built header.\n");
1069
 
1070
        /*
1071
         *      Put the data on the end
1072
         */
1073
 
1074
        skb->h.raw = skb_put(skb, len);
1075
 
1076
        asmptr = skb->h.raw;
1077
        SOCK_DEBUG(sk, "NET/ROM: Appending user data\n");
1078
 
1079
        /* User data follows immediately after the NET/ROM transport header */
1080
        memcpy_fromiovec(asmptr, msg->msg_iov, len);
1081
        SOCK_DEBUG(sk, "NET/ROM: Transmitting buffer\n");
1082
 
1083
        if (sk->state != TCP_ESTABLISHED) {
1084
                kfree_skb(skb);
1085
                return -ENOTCONN;
1086
        }
1087
 
1088
        nr_output(sk, skb);     /* Shove it onto the queue */
1089
 
1090
        return len;
1091
}
1092
 
1093
static int nr_recvmsg(struct socket *sock, struct msghdr *msg, int size,
1094
        int flags, struct scm_cookie *scm)
1095
{
1096
        struct sock *sk = sock->sk;
1097
        struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
1098
        int copied;
1099
        struct sk_buff *skb;
1100
        int er;
1101
 
1102
        /*
1103
         * This works for seqpacket too. The receiver has ordered the queue for
1104
         * us! We do one quick check first though
1105
         */
1106
 
1107
        if (sk->state != TCP_ESTABLISHED)
1108
                return -ENOTCONN;
1109
 
1110
        /* Now we can treat all alike */
1111
        if ((skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, flags & MSG_DONTWAIT, &er)) == NULL)
1112
                return er;
1113
 
1114
        skb->h.raw = skb->data;
1115
        copied     = skb->len;
1116
 
1117
        if (copied > size) {
1118
                copied = size;
1119
                msg->msg_flags |= MSG_TRUNC;
1120
        }
1121
 
1122
        skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
1123
 
1124
        if (sax != NULL) {
1125
                sax->sax25_family = AF_NETROM;
1126
                memcpy(sax->sax25_call.ax25_call, skb->data + 7, AX25_ADDR_LEN);
1127
        }
1128
 
1129
        msg->msg_namelen = sizeof(*sax);
1130
 
1131
        skb_free_datagram(sk, skb);
1132
 
1133
        return copied;
1134
}
1135
 
1136
 
1137
static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1138
{
1139
        struct sock *sk = sock->sk;
1140
 
1141
        switch (cmd) {
1142
                case TIOCOUTQ: {
1143
                        long amount;
1144
                        amount = sk->sndbuf - atomic_read(&sk->wmem_alloc);
1145
                        if (amount < 0)
1146
                                amount = 0;
1147
                        return put_user(amount, (int *)arg);
1148
                }
1149
 
1150
                case TIOCINQ: {
1151
                        struct sk_buff *skb;
1152
                        long amount = 0L;
1153
                        /* These two are safe on a single CPU system as only user tasks fiddle here */
1154
                        if ((skb = skb_peek(&sk->receive_queue)) != NULL)
1155
                                amount = skb->len;
1156
                        return put_user(amount, (int *)arg);
1157
                }
1158
 
1159
                case SIOCGSTAMP:
1160
                        if (sk != NULL) {
1161
                                if (sk->stamp.tv_sec == 0)
1162
                                        return -ENOENT;
1163
                                return copy_to_user((void *)arg, &sk->stamp, sizeof(struct timeval)) ? -EFAULT : 0;
1164
                        }
1165
                        return -EINVAL;
1166
 
1167
                case SIOCGIFADDR:
1168
                case SIOCSIFADDR:
1169
                case SIOCGIFDSTADDR:
1170
                case SIOCSIFDSTADDR:
1171
                case SIOCGIFBRDADDR:
1172
                case SIOCSIFBRDADDR:
1173
                case SIOCGIFNETMASK:
1174
                case SIOCSIFNETMASK:
1175
                case SIOCGIFMETRIC:
1176
                case SIOCSIFMETRIC:
1177
                        return -EINVAL;
1178
 
1179
                case SIOCADDRT:
1180
                case SIOCDELRT:
1181
                case SIOCNRDECOBS:
1182
                        if (!capable(CAP_NET_ADMIN)) return -EPERM;
1183
                        return nr_rt_ioctl(cmd, (void *)arg);
1184
 
1185
                default:
1186
                        return dev_ioctl(cmd, (void *)arg);
1187
        }
1188
 
1189
        /*NOTREACHED*/
1190
        return 0;
1191
}
1192
 
1193
static int nr_get_info(char *buffer, char **start, off_t offset, int length)
1194
{
1195
        struct sock *s;
1196
        struct net_device *dev;
1197
        const char *devname;
1198
        int len = 0;
1199
        off_t pos = 0;
1200
        off_t begin = 0;
1201
 
1202
        cli();
1203
 
1204
        len += sprintf(buffer, "user_addr dest_node src_node  dev    my  your  st  vs  vr  va    t1     t2     t4      idle   n2  wnd Snd-Q Rcv-Q inode\n");
1205
 
1206
        for (s = nr_list; s != NULL; s = s->next) {
1207
                if ((dev = s->protinfo.nr->device) == NULL)
1208
                        devname = "???";
1209
                else
1210
                        devname = dev->name;
1211
 
1212
                len += sprintf(buffer + len, "%-9s ",
1213
                        ax2asc(&s->protinfo.nr->user_addr));
1214
                len += sprintf(buffer + len, "%-9s ",
1215
                        ax2asc(&s->protinfo.nr->dest_addr));
1216
                len += sprintf(buffer + len, "%-9s %-3s  %02X/%02X %02X/%02X %2d %3d %3d %3d %3lu/%03lu %2lu/%02lu %3lu/%03lu %3lu/%03lu %2d/%02d %3d %5d %5d %ld\n",
1217
                        ax2asc(&s->protinfo.nr->source_addr),
1218
                        devname,
1219
                        s->protinfo.nr->my_index,
1220
                        s->protinfo.nr->my_id,
1221
                        s->protinfo.nr->your_index,
1222
                        s->protinfo.nr->your_id,
1223
                        s->protinfo.nr->state,
1224
                        s->protinfo.nr->vs,
1225
                        s->protinfo.nr->vr,
1226
                        s->protinfo.nr->va,
1227
                        ax25_display_timer(&s->protinfo.nr->t1timer) / HZ,
1228
                        s->protinfo.nr->t1 / HZ,
1229
                        ax25_display_timer(&s->protinfo.nr->t2timer) / HZ,
1230
                        s->protinfo.nr->t2 / HZ,
1231
                        ax25_display_timer(&s->protinfo.nr->t4timer) / HZ,
1232
                        s->protinfo.nr->t4 / HZ,
1233
                        ax25_display_timer(&s->protinfo.nr->idletimer) / (60 * HZ),
1234
                        s->protinfo.nr->idle / (60 * HZ),
1235
                        s->protinfo.nr->n2count,
1236
                        s->protinfo.nr->n2,
1237
                        s->protinfo.nr->window,
1238
                        atomic_read(&s->wmem_alloc),
1239
                        atomic_read(&s->rmem_alloc),
1240
                        s->socket != NULL ? s->socket->inode->i_ino : 0L);
1241
 
1242
                pos = begin + len;
1243
 
1244
                if (pos < offset) {
1245
                        len   = 0;
1246
                        begin = pos;
1247
                }
1248
 
1249
                if (pos > offset + length)
1250
                        break;
1251
        }
1252
 
1253
        sti();
1254
 
1255
        *start = buffer + (offset - begin);
1256
        len   -= (offset - begin);
1257
 
1258
        if (len > length) len = length;
1259
 
1260
        return(len);
1261
}
1262
 
1263
static struct net_proto_family nr_family_ops = {
1264
        family:         PF_NETROM,
1265
        create:         nr_create,
1266
};
1267
 
1268
static struct proto_ops SOCKOPS_WRAPPED(nr_proto_ops) = {
1269
        family:         PF_NETROM,
1270
 
1271
        release:        nr_release,
1272
        bind:           nr_bind,
1273
        connect:        nr_connect,
1274
        socketpair:     sock_no_socketpair,
1275
        accept:         nr_accept,
1276
        getname:        nr_getname,
1277
        poll:           datagram_poll,
1278
        ioctl:          nr_ioctl,
1279
        listen:         nr_listen,
1280
        shutdown:       sock_no_shutdown,
1281
        setsockopt:     nr_setsockopt,
1282
        getsockopt:     nr_getsockopt,
1283
        sendmsg:        nr_sendmsg,
1284
        recvmsg:        nr_recvmsg,
1285
        mmap:           sock_no_mmap,
1286
        sendpage:       sock_no_sendpage,
1287
};
1288
 
1289
#include <linux/smp_lock.h>
1290
SOCKOPS_WRAP(nr_proto, PF_NETROM);
1291
 
1292
static struct notifier_block nr_dev_notifier = {
1293
        notifier_call:  nr_device_event,
1294
};
1295
 
1296
static struct net_device *dev_nr;
1297
 
1298
static char banner[] __initdata = KERN_INFO "G4KLX NET/ROM for Linux. Version 0.7 for AX25.037 Linux 2.4\n";
1299
 
1300
static int __init nr_proto_init(void)
1301
{
1302
        int i;
1303
 
1304
        if (nr_ndevs > 0x7fffffff/sizeof(struct net_device)) {
1305
                printk(KERN_ERR "NET/ROM: nr_proto_init - nr_ndevs parameter to large\n");
1306
                return -1;
1307
        }
1308
 
1309
        if ((dev_nr = kmalloc(nr_ndevs * sizeof(struct net_device), GFP_KERNEL)) == NULL) {
1310
                printk(KERN_ERR "NET/ROM: nr_proto_init - unable to allocate device structure\n");
1311
                return -1;
1312
        }
1313
 
1314
        memset(dev_nr, 0x00, nr_ndevs * sizeof(struct net_device));
1315
 
1316
        for (i = 0; i < nr_ndevs; i++) {
1317
                sprintf(dev_nr[i].name, "nr%d", i);
1318
                dev_nr[i].init = nr_init;
1319
                register_netdev(&dev_nr[i]);
1320
        }
1321
 
1322
        sock_register(&nr_family_ops);
1323
        register_netdevice_notifier(&nr_dev_notifier);
1324
        printk(banner);
1325
 
1326
        ax25_protocol_register(AX25_P_NETROM, nr_route_frame);
1327
        ax25_linkfail_register(nr_link_failed);
1328
 
1329
#ifdef CONFIG_SYSCTL
1330
        nr_register_sysctl();
1331
#endif
1332
 
1333
        nr_loopback_init();
1334
 
1335
        proc_net_create("nr", 0, nr_get_info);
1336
        proc_net_create("nr_neigh", 0, nr_neigh_get_info);
1337
        proc_net_create("nr_nodes", 0, nr_nodes_get_info);
1338
        return 0;
1339
}
1340
 
1341
module_init(nr_proto_init);
1342
 
1343
 
1344
EXPORT_NO_SYMBOLS;
1345
 
1346
MODULE_PARM(nr_ndevs, "i");
1347
MODULE_PARM_DESC(nr_ndevs, "number of NET/ROM devices");
1348
 
1349
MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
1350
MODULE_DESCRIPTION("The amateur radio NET/ROM network and transport layer protocol");
1351
MODULE_LICENSE("GPL");
1352
 
1353
static void __exit nr_exit(void)
1354
{
1355
        int i;
1356
 
1357
        proc_net_remove("nr");
1358
        proc_net_remove("nr_neigh");
1359
        proc_net_remove("nr_nodes");
1360
        nr_loopback_clear();
1361
 
1362
        nr_rt_free();
1363
 
1364
        ax25_protocol_release(AX25_P_NETROM);
1365
        ax25_linkfail_release(nr_link_failed);
1366
 
1367
        unregister_netdevice_notifier(&nr_dev_notifier);
1368
 
1369
#ifdef CONFIG_SYSCTL
1370
        nr_unregister_sysctl();
1371
#endif
1372
        sock_unregister(PF_NETROM);
1373
 
1374
        for (i = 0; i < nr_ndevs; i++) {
1375
                if (dev_nr[i].priv != NULL) {
1376
                        kfree(dev_nr[i].priv);
1377
                        dev_nr[i].priv = NULL;
1378
                        unregister_netdev(&dev_nr[i]);
1379
                }
1380
        }
1381
 
1382
        kfree(dev_nr);
1383
}
1384
module_exit(nr_exit);

powered by: WebSVN 2.1.0

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