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

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [uclinux/] [uClinux-2.0.x/] [net/] [netrom/] [af_netrom.c] - Blame information for rev 1782

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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