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

Subversion Repositories or1k

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 *      AX.25 release 038
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
 *      AX.25 006       Alan(GW4PTS)            Nearly died of shock - it's working 8-)
14
 *      AX.25 007       Alan(GW4PTS)            Removed the silliest bugs
15
 *      AX.25 008       Alan(GW4PTS)            Cleaned up, fixed a few state machine problems, added callbacks
16
 *      AX.25 009       Alan(GW4PTS)            Emergency patch kit to fix memory corruption
17
 *      AX.25 010       Alan(GW4PTS)            Added RAW sockets/Digipeat.
18
 *      AX.25 011       Alan(GW4PTS)            RAW socket and datagram fixes (thanks) - Raw sendto now gets PID right
19
 *                                              datagram sendto uses correct target address.
20
 *      AX.25 012       Alan(GW4PTS)            Correct incoming connection handling, send DM to failed connects.
21
 *                                              Use skb->data not skb+1. Support sk->priority correctly.
22
 *                                              Correct receive on SOCK_DGRAM.
23
 *      AX.25 013       Alan(GW4PTS)            Send DM to all unknown frames, missing initialiser fixed
24
 *                                              Leave spare SSID bits set (DAMA etc) - thanks for bug report,
25
 *                                              removed device registration (it's not used or needed). Clean up for
26
 *                                              gcc 2.5.8. PID to AX25_P_
27
 *      AX.25 014       Alan(GW4PTS)            Cleanup and NET3 merge
28
 *      AX.25 015       Alan(GW4PTS)            Internal test version.
29
 *      AX.25 016       Alan(GW4PTS)            Semi Internal version for PI card
30
 *                                              work.
31
 *      AX.25 017       Alan(GW4PTS)            Fixed some small bugs reported by
32
 *                                              G4KLX
33
 *      AX.25 018       Alan(GW4PTS)            Fixed a small error in SOCK_DGRAM
34
 *      AX.25 019       Alan(GW4PTS)            Clean ups for the non INET kernel and device ioctls in AX.25
35
 *      AX.25 020       Jonathan(G4KLX)         /proc support and other changes.
36
 *      AX.25 021       Alan(GW4PTS)            Added AX25_T1, AX25_N2, AX25_T3 as requested.
37
 *      AX.25 022       Jonathan(G4KLX)         More work on the ax25 auto router and /proc improved (again)!
38
 *                      Alan(GW4PTS)            Added TIOCINQ/OUTQ
39
 *      AX.25 023       Alan(GW4PTS)            Fixed shutdown bug
40
 *      AX.25 023       Alan(GW4PTS)            Linus changed timers
41
 *      AX.25 024       Alan(GW4PTS)            Small bug fixes
42
 *      AX.25 025       Alan(GW4PTS)            More fixes, Linux 1.1.51 compatibility stuff, timers again!
43
 *      AX.25 026       Alan(GW4PTS)            Small state fix.
44
 *      AX.25 027       Alan(GW4PTS)            Socket close crash fixes.
45
 *      AX.25 028       Alan(GW4PTS)            Callsign control including settings per uid.
46
 *                                              Small bug fixes.
47
 *                                              Protocol set by sockets only.
48
 *                                              Small changes to allow for start of NET/ROM layer.
49
 *      AX.25 028a      Jonathan(G4KLX)         Changes to state machine.
50
 *      AX.25 028b      Jonathan(G4KLX)         Extracted ax25 control block
51
 *                                              from sock structure.
52
 *      AX.25 029       Alan(GW4PTS)            Combined 028b and some KA9Q code
53
 *                      Jonathan(G4KLX)         and removed all the old Berkeley, added IP mode registration.
54
 *                      Darryl(G7LED)           stuff. Cross-port digipeating. Minor fixes and enhancements.
55
 *                      Alan(GW4PTS)            Missed suser() on axassociate checks
56
 *      AX.25 030       Alan(GW4PTS)            Added variable length headers.
57
 *                      Jonathan(G4KLX)         Added BPQ Ethernet interface.
58
 *                      Steven(GW7RRM)          Added digi-peating control ioctl.
59
 *                                              Added extended AX.25 support.
60
 *                                              Added AX.25 frame segmentation.
61
 *                      Darryl(G7LED)           Changed connect(), recvfrom(), sendto() sockaddr/addrlen to
62
 *                                              fall inline with bind() and new policy.
63
 *                                              Moved digipeating ctl to new ax25_dev structs.
64
 *                                              Fixed ax25_release(), set TCP_CLOSE, wakeup app
65
 *                                              context, THEN make the sock dead.
66
 *                      Alan(GW4PTS)            Cleaned up for single recvmsg methods.
67
 *                      Alan(GW4PTS)            Fixed not clearing error on connect failure.
68
 *      AX.25 031       Jonathan(G4KLX)         Added binding to any device.
69
 *                      Joerg(DL1BKE)           Added DAMA support, fixed (?) digipeating, fixed buffer locking
70
 *                                              for "virtual connect" mode... Result: Probably the
71
 *                                              "Most Buggiest Code You've Ever Seen" (TM)
72
 *                      HaJo(DD8NE)             Implementation of a T5 (idle) timer
73
 *                      Joerg(DL1BKE)           Renamed T5 to IDLE and changed behaviour:
74
 *                                              the timer gets reloaded on every received or transmitted
75
 *                                              I frame for IP or NETROM. The idle timer is not active
76
 *                                              on "vanilla AX.25" connections. Furthermore added PACLEN
77
 *                                              to provide AX.25-layer based fragmentation (like WAMPES)
78
 *      AX.25 032       Joerg(DL1BKE)           Fixed DAMA timeout error.
79
 *                                              ax25_send_frame() limits the number of enqueued
80
 *                                              datagrams per socket.
81
 *      AX.25 033       Jonathan(G4KLX)         Removed auto-router.
82
 *                      Hans(PE1AYX)            Converted to Module.
83
 *                      Joerg(DL1BKE)           Moved BPQ Ethernet to separate driver.
84
 *      AX.25 034       Jonathan(G4KLX)         2.1 changes
85
 *                      Alan(GW4PTS)            Small POSIXisations
86
 *      AX.25 035       Alan(GW4PTS)            Started fixing to the new
87
 *                                              format.
88
 *                      Hans(PE1AYX)            Fixed interface to IP layer.
89
 *                      Alan(GW4PTS)            Added asynchronous support.
90
 *                      Frederic(F1OAT)         Support for pseudo-digipeating.
91
 *                      Jonathan(G4KLX)         Support for packet forwarding.
92
 *      AX.25 036       Jonathan(G4KLX)         Major restructuring.
93
 *                      Joerg(DL1BKE)           Fixed DAMA Slave.
94
 *                      Jonathan(G4KLX)         Fix wildcard listen parameter setting.
95
 *      AX.25 037       Jonathan(G4KLX)         New timer architecture.
96
 *      AX.25 038       Matthias(DG2FEF)        Small fixes to the syscall interface to make kernel
97
 *                                              independent of AX25_MAX_DIGIS used by applications.
98
 *                      Tomi(OH2BNS)            Fixed ax25_getname().
99
 *                      Joerg(DL1BKE)           Starting to phase out the support for full_sockaddr_ax25
100
 *                                              with only 6 digipeaters and sockaddr_ax25 in ax25_bind(),
101
 *                                              ax25_connect() and ax25_sendmsg()
102
 *                      Joerg(DL1BKE)           Added support for SO_BINDTODEVICE
103
 *                      Arnaldo C. Melo         s/suser/capable(CAP_NET_ADMIN)/, some more cleanups
104
 *                      Michal Ostrowski        Module initialization cleanup.
105
 *                      Jeroen(PE1RXQ)          Use sock_orphan() on release.
106
 */
107
 
108
#include <linux/config.h>
109
#include <linux/module.h>
110
#include <linux/errno.h>
111
#include <linux/types.h>
112
#include <linux/socket.h>
113
#include <linux/in.h>
114
#include <linux/kernel.h>
115
#include <linux/sched.h>
116
#include <linux/timer.h>
117
#include <linux/string.h>
118
#include <linux/sockios.h>
119
#include <linux/net.h>
120
#include <net/ax25.h>
121
#include <linux/inet.h>
122
#include <linux/netdevice.h>
123
#include <linux/if_arp.h>
124
#include <linux/skbuff.h>
125
#include <net/sock.h>
126
#include <asm/uaccess.h>
127
#include <asm/system.h>
128
#include <linux/fcntl.h>
129
#include <linux/termios.h>      /* For TIOCINQ/OUTQ */
130
#include <linux/mm.h>
131
#include <linux/interrupt.h>
132
#include <linux/notifier.h>
133
#include <linux/proc_fs.h>
134
#include <linux/stat.h>
135
#include <linux/netfilter.h>
136
#include <linux/sysctl.h>
137
#include <linux/init.h>
138
#include <net/ip.h>
139
#include <net/arp.h>
140
 
141
 
142
 
143
ax25_cb *volatile ax25_list;
144
 
145
static struct proto_ops ax25_proto_ops;
146
 
147
/*
148
 *      Free an allocated ax25 control block. This is done to centralise
149
 *      the MOD count code.
150
 */
151
void ax25_free_cb(ax25_cb *ax25)
152
{
153
        if (ax25->digipeat != NULL) {
154
                kfree(ax25->digipeat);
155
                ax25->digipeat = NULL;
156
        }
157
 
158
        kfree(ax25);
159
 
160
        MOD_DEC_USE_COUNT;
161
}
162
 
163
static void ax25_free_sock(struct sock *sk)
164
{
165
        ax25_free_cb(sk->protinfo.ax25);
166
}
167
 
168
/*
169
 *      Socket removal during an interrupt is now safe.
170
 */
171
static void ax25_remove_socket(ax25_cb *ax25)
172
{
173
        ax25_cb *s;
174
        unsigned long flags;
175
 
176
        save_flags(flags); cli();
177
 
178
        if ((s = ax25_list) == ax25) {
179
                ax25_list = s->next;
180
                restore_flags(flags);
181
                return;
182
        }
183
 
184
        while (s != NULL && s->next != NULL) {
185
                if (s->next == ax25) {
186
                        s->next = ax25->next;
187
                        restore_flags(flags);
188
                        return;
189
                }
190
 
191
                s = s->next;
192
        }
193
 
194
        restore_flags(flags);
195
}
196
 
197
/*
198
 *      Kill all bound sockets on a dropped device.
199
 */
200
static void ax25_kill_by_device(struct net_device *dev)
201
{
202
        ax25_dev *ax25_dev;
203
        ax25_cb *s;
204
 
205
        if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
206
                return;
207
 
208
        for (s = ax25_list; s != NULL; s = s->next) {
209
                if (s->ax25_dev == ax25_dev) {
210
                        s->ax25_dev = NULL;
211
                        ax25_disconnect(s, ENETUNREACH);
212
                }
213
        }
214
}
215
 
216
/*
217
 *      Handle device status changes.
218
 */
219
static int ax25_device_event(struct notifier_block *this,unsigned long event, void *ptr)
220
{
221
        struct net_device *dev = (struct net_device *)ptr;
222
 
223
        /* Reject non AX.25 devices */
224
        if (dev->type != ARPHRD_AX25)
225
                return NOTIFY_DONE;
226
 
227
        switch (event) {
228
                case NETDEV_UP:
229
                        ax25_dev_device_up(dev);
230
                        break;
231
                case NETDEV_DOWN:
232
                        ax25_kill_by_device(dev);
233
                        ax25_rt_device_down(dev);
234
                        ax25_dev_device_down(dev);
235
                        break;
236
                default:
237
                        break;
238
        }
239
 
240
        return NOTIFY_DONE;
241
}
242
 
243
/*
244
 *      Add a socket to the bound sockets list.
245
 */
246
void ax25_insert_socket(ax25_cb *ax25)
247
{
248
        unsigned long flags;
249
 
250
        save_flags(flags);
251
        cli();
252
 
253
        ax25->next = ax25_list;
254
        ax25_list  = ax25;
255
 
256
        restore_flags(flags);
257
}
258
 
259
/*
260
 *      Find a socket that wants to accept the SABM we have just
261
 *      received.
262
 */
263
struct sock *ax25_find_listener(ax25_address *addr, int digi, struct net_device *dev, int type)
264
{
265
        unsigned long flags;
266
        ax25_cb *s;
267
 
268
        save_flags(flags);
269
        cli();
270
 
271
        for (s = ax25_list; s != NULL; s = s->next) {
272
                if ((s->iamdigi && !digi) || (!s->iamdigi && digi))
273
                        continue;
274
                if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 && s->sk->type == type && s->sk->state == TCP_LISTEN) {
275
                        /* If device is null we match any device */
276
                        if (s->ax25_dev == NULL || s->ax25_dev->dev == dev) {
277
                                restore_flags(flags);
278
                                return s->sk;
279
                        }
280
                }
281
        }
282
 
283
        restore_flags(flags);
284
        return NULL;
285
}
286
 
287
/*
288
 *      Find an AX.25 socket given both ends.
289
 */
290
struct sock *ax25_find_socket(ax25_address *my_addr, ax25_address *dest_addr, int type)
291
{
292
        ax25_cb *s;
293
        unsigned long flags;
294
 
295
        save_flags(flags);
296
        cli();
297
 
298
        for (s = ax25_list; s != NULL; s = s->next) {
299
                if (s->sk != NULL && ax25cmp(&s->source_addr, my_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->sk->type == type) {
300
                        restore_flags(flags);
301
                        return s->sk;
302
                }
303
        }
304
 
305
        restore_flags(flags);
306
 
307
        return NULL;
308
}
309
 
310
/*
311
 *      Find an AX.25 control block given both ends. It will only pick up
312
 *      floating AX.25 control blocks or non Raw socket bound control blocks.
313
 */
314
ax25_cb *ax25_find_cb(ax25_address *src_addr, ax25_address *dest_addr, ax25_digi *digi, struct net_device *dev)
315
{
316
        ax25_cb *s;
317
        unsigned long flags;
318
 
319
        save_flags(flags);
320
        cli();
321
 
322
        for (s = ax25_list; s != NULL; s = s->next) {
323
                if (s->sk != NULL && s->sk->type != SOCK_SEQPACKET)
324
                        continue;
325
                if (s->ax25_dev == NULL)
326
                        continue;
327
                if (ax25cmp(&s->source_addr, src_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->ax25_dev->dev == dev) {
328
                        if (digi != NULL && digi->ndigi != 0) {
329
                                if (s->digipeat == NULL)
330
                                        continue;
331
                                if (ax25digicmp(s->digipeat, digi) != 0)
332
                                        continue;
333
                        } else {
334
                                if (s->digipeat != NULL && s->digipeat->ndigi != 0)
335
                                        continue;
336
                        }
337
                        restore_flags(flags);
338
                        return s;
339
                }
340
        }
341
 
342
        restore_flags(flags);
343
 
344
        return NULL;
345
}
346
 
347
/*
348
 *      Look for any matching address - RAW sockets can bind to arbitrary names
349
 */
350
struct sock *ax25_addr_match(ax25_address *addr)
351
{
352
        unsigned long flags;
353
        ax25_cb *s;
354
 
355
        save_flags(flags);
356
        cli();
357
 
358
        for (s = ax25_list; s != NULL; s = s->next) {
359
                if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 && s->sk->type == SOCK_RAW) {
360
                        restore_flags(flags);
361
                        return s->sk;
362
                }
363
        }
364
 
365
        restore_flags(flags);
366
 
367
        return NULL;
368
}
369
 
370
void ax25_send_to_raw(struct sock *sk, struct sk_buff *skb, int proto)
371
{
372
        struct sk_buff *copy;
373
 
374
        while (sk != NULL) {
375
                if (sk->type == SOCK_RAW &&
376
                    sk->protocol == proto &&
377
                    atomic_read(&sk->rmem_alloc) <= sk->rcvbuf) {
378
                        if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
379
                                return;
380
 
381
                        if (sock_queue_rcv_skb(sk, copy) != 0)
382
                                kfree_skb(copy);
383
                }
384
 
385
                sk = sk->next;
386
        }
387
}
388
 
389
/*
390
 *      Deferred destroy.
391
 */
392
void ax25_destroy_socket(ax25_cb *);
393
 
394
/*
395
 *      Handler for deferred kills.
396
 */
397
static void ax25_destroy_timer(unsigned long data)
398
{
399
        ax25_destroy_socket((ax25_cb *)data);
400
}
401
 
402
/*
403
 *      This is called from user mode and the timers. Thus it protects itself against
404
 *      interrupt users but doesn't worry about being called during work.
405
 *      Once it is removed from the queue no interrupt or bottom half will
406
 *      touch it and we are (fairly 8-) ) safe.
407
 */
408
void ax25_destroy_socket(ax25_cb *ax25) /* Not static as it's used by the timer */
409
{
410
        struct sk_buff *skb;
411
        unsigned long flags;
412
 
413
        save_flags(flags); cli();
414
 
415
        ax25_stop_heartbeat(ax25);
416
        ax25_stop_t1timer(ax25);
417
        ax25_stop_t2timer(ax25);
418
        ax25_stop_t3timer(ax25);
419
        ax25_stop_idletimer(ax25);
420
 
421
        ax25_remove_socket(ax25);
422
        ax25_clear_queues(ax25);        /* Flush the queues */
423
 
424
        if (ax25->sk != NULL) {
425
                while ((skb = skb_dequeue(&ax25->sk->receive_queue)) != NULL) {
426
                        if (skb->sk != ax25->sk) {                      /* A pending connection */
427
                                skb->sk->dead = 1;      /* Queue the unaccepted socket for death */
428
                                ax25_start_heartbeat(skb->sk->protinfo.ax25);
429
                                skb->sk->protinfo.ax25->state = AX25_STATE_0;
430
                        }
431
 
432
                        kfree_skb(skb);
433
                }
434
        }
435
 
436
        if (ax25->sk != NULL) {
437
                if (atomic_read(&ax25->sk->wmem_alloc) != 0 ||
438
                    atomic_read(&ax25->sk->rmem_alloc) != 0) {
439
                        /* Defer: outstanding buffers */
440
                        init_timer(&ax25->timer);
441
                        ax25->timer.expires  = jiffies + 10 * HZ;
442
                        ax25->timer.function = ax25_destroy_timer;
443
                        ax25->timer.data     = (unsigned long)ax25;
444
                        add_timer(&ax25->timer);
445
                } else {
446
                        sk_free(ax25->sk);
447
                }
448
        } else {
449
                ax25_free_cb(ax25);
450
        }
451
 
452
        restore_flags(flags);
453
}
454
 
455
/*
456
 * dl1bke 960311: set parameters for existing AX.25 connections,
457
 *                includes a KILL command to abort any connection.
458
 *                VERY useful for debugging ;-)
459
 */
460
static int ax25_ctl_ioctl(const unsigned int cmd, void *arg)
461
{
462
        struct ax25_ctl_struct ax25_ctl;
463
        ax25_digi digi;
464
        ax25_dev *ax25_dev;
465
        ax25_cb *ax25;
466
        unsigned int k;
467
 
468
        if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
469
                return -EFAULT;
470
 
471
        if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
472
                return -ENODEV;
473
 
474
        if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
475
                return -EINVAL;
476
 
477
        digi.ndigi = ax25_ctl.digi_count;
478
        for (k = 0; k < digi.ndigi; k++)
479
                digi.calls[k] = ax25_ctl.digi_addr[k];
480
 
481
        if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
482
                return -ENOTCONN;
483
 
484
        switch (ax25_ctl.cmd) {
485
                case AX25_KILL:
486
                        ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
487
#ifdef CONFIG_AX25_DAMA_SLAVE
488
                        if (ax25_dev->dama.slave && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
489
                                ax25_dama_off(ax25);
490
#endif
491
                        ax25_disconnect(ax25, ENETRESET);
492
                        break;
493
 
494
                case AX25_WINDOW:
495
                        if (ax25->modulus == AX25_MODULUS) {
496
                                if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
497
                                        return -EINVAL;
498
                        } else {
499
                                if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
500
                                        return -EINVAL;
501
                        }
502
                        ax25->window = ax25_ctl.arg;
503
                        break;
504
 
505
                case AX25_T1:
506
                        if (ax25_ctl.arg < 1)
507
                                return -EINVAL;
508
                        ax25->rtt = (ax25_ctl.arg * HZ) / 2;
509
                        ax25->t1  = ax25_ctl.arg * HZ;
510
                        break;
511
 
512
                case AX25_T2:
513
                        if (ax25_ctl.arg < 1)
514
                                return -EINVAL;
515
                        ax25->t2 = ax25_ctl.arg * HZ;
516
                        break;
517
 
518
                case AX25_N2:
519
                        if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
520
                                return -EINVAL;
521
                        ax25->n2count = 0;
522
                        ax25->n2 = ax25_ctl.arg;
523
                        break;
524
 
525
                case AX25_T3:
526
                        if (ax25_ctl.arg < 0)
527
                                return -EINVAL;
528
                        ax25->t3 = ax25_ctl.arg * HZ;
529
                        break;
530
 
531
                case AX25_IDLE:
532
                        if (ax25_ctl.arg < 0)
533
                                return -EINVAL;
534
                        ax25->idle = ax25_ctl.arg * 60 * HZ;
535
                        break;
536
 
537
                case AX25_PACLEN:
538
                        if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
539
                                return -EINVAL;
540
                        ax25->paclen = ax25_ctl.arg;
541
                        break;
542
 
543
                default:
544
                        return -EINVAL;
545
          }
546
 
547
          return 0;
548
}
549
 
550
/*
551
 *      Fill in a created AX.25 created control block with the default
552
 *      values for a particular device.
553
 */
554
void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
555
{
556
        ax25->ax25_dev = ax25_dev;
557
 
558
        if (ax25->ax25_dev != NULL) {
559
                ax25->rtt     = ax25_dev->values[AX25_VALUES_T1] / 2;
560
                ax25->t1      = ax25_dev->values[AX25_VALUES_T1];
561
                ax25->t2      = ax25_dev->values[AX25_VALUES_T2];
562
                ax25->t3      = ax25_dev->values[AX25_VALUES_T3];
563
                ax25->n2      = ax25_dev->values[AX25_VALUES_N2];
564
                ax25->paclen  = ax25_dev->values[AX25_VALUES_PACLEN];
565
                ax25->idle    = ax25_dev->values[AX25_VALUES_IDLE];
566
                ax25->backoff = ax25_dev->values[AX25_VALUES_BACKOFF];
567
 
568
                if (ax25_dev->values[AX25_VALUES_AXDEFMODE]) {
569
                        ax25->modulus = AX25_EMODULUS;
570
                        ax25->window  = ax25_dev->values[AX25_VALUES_EWINDOW];
571
                } else {
572
                        ax25->modulus = AX25_MODULUS;
573
                        ax25->window  = ax25_dev->values[AX25_VALUES_WINDOW];
574
                }
575
        } else {
576
                ax25->rtt     = AX25_DEF_T1 / 2;
577
                ax25->t1      = AX25_DEF_T1;
578
                ax25->t2      = AX25_DEF_T2;
579
                ax25->t3      = AX25_DEF_T3;
580
                ax25->n2      = AX25_DEF_N2;
581
                ax25->paclen  = AX25_DEF_PACLEN;
582
                ax25->idle    = AX25_DEF_IDLE;
583
                ax25->backoff = AX25_DEF_BACKOFF;
584
 
585
                if (AX25_DEF_AXDEFMODE) {
586
                        ax25->modulus = AX25_EMODULUS;
587
                        ax25->window  = AX25_DEF_EWINDOW;
588
                } else {
589
                        ax25->modulus = AX25_MODULUS;
590
                        ax25->window  = AX25_DEF_WINDOW;
591
                }
592
        }
593
}
594
 
595
/*
596
 * Create an empty AX.25 control block.
597
 */
598
ax25_cb *ax25_create_cb(void)
599
{
600
        ax25_cb *ax25;
601
 
602
        if ((ax25 = kmalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
603
                return NULL;
604
 
605
        MOD_INC_USE_COUNT;
606
 
607
        memset(ax25, 0x00, sizeof(*ax25));
608
 
609
        skb_queue_head_init(&ax25->write_queue);
610
        skb_queue_head_init(&ax25->frag_queue);
611
        skb_queue_head_init(&ax25->ack_queue);
612
        skb_queue_head_init(&ax25->reseq_queue);
613
 
614
        init_timer(&ax25->timer);
615
        init_timer(&ax25->t1timer);
616
        init_timer(&ax25->t2timer);
617
        init_timer(&ax25->t3timer);
618
        init_timer(&ax25->idletimer);
619
 
620
        ax25_fillin_cb(ax25, NULL);
621
 
622
        ax25->state = AX25_STATE_0;
623
 
624
        return ax25;
625
}
626
 
627
/*
628
 *      Handling for system calls applied via the various interfaces to an
629
 *      AX25 socket object
630
 */
631
 
632
static int ax25_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen)
633
{
634
        struct sock *sk = sock->sk;
635
        struct net_device *dev;
636
        char devname[IFNAMSIZ];
637
        int opt;
638
 
639
        if (level != SOL_AX25)
640
                return -ENOPROTOOPT;
641
 
642
        if (optlen < sizeof(int))
643
                return -EINVAL;
644
 
645
        if (get_user(opt, (int *)optval))
646
                return -EFAULT;
647
 
648
        switch (optname) {
649
                case AX25_WINDOW:
650
                        if (sk->protinfo.ax25->modulus == AX25_MODULUS) {
651
                                if (opt < 1 || opt > 7)
652
                                        return -EINVAL;
653
                        } else {
654
                                if (opt < 1 || opt > 63)
655
                                        return -EINVAL;
656
                        }
657
                        sk->protinfo.ax25->window = opt;
658
                        return 0;
659
 
660
                case AX25_T1:
661
                        if (opt < 1)
662
                                return -EINVAL;
663
                        sk->protinfo.ax25->rtt = (opt * HZ) / 2;
664
                        sk->protinfo.ax25->t1  = opt * HZ;
665
                        return 0;
666
 
667
                case AX25_T2:
668
                        if (opt < 1)
669
                                return -EINVAL;
670
                        sk->protinfo.ax25->t2 = opt * HZ;
671
                        return 0;
672
 
673
                case AX25_N2:
674
                        if (opt < 1 || opt > 31)
675
                                return -EINVAL;
676
                        sk->protinfo.ax25->n2 = opt;
677
                        return 0;
678
 
679
                case AX25_T3:
680
                        if (opt < 1)
681
                                return -EINVAL;
682
                        sk->protinfo.ax25->t3 = opt * HZ;
683
                        return 0;
684
 
685
                case AX25_IDLE:
686
                        if (opt < 0)
687
                                return -EINVAL;
688
                        sk->protinfo.ax25->idle = opt * 60 * HZ;
689
                        return 0;
690
 
691
                case AX25_BACKOFF:
692
                        if (opt < 0 || opt > 2)
693
                                return -EINVAL;
694
                        sk->protinfo.ax25->backoff = opt;
695
                        return 0;
696
 
697
                case AX25_EXTSEQ:
698
                        sk->protinfo.ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
699
                        return 0;
700
 
701
                case AX25_PIDINCL:
702
                        sk->protinfo.ax25->pidincl = opt ? 1 : 0;
703
                        return 0;
704
 
705
                case AX25_IAMDIGI:
706
                        sk->protinfo.ax25->iamdigi = opt ? 1 : 0;
707
                        return 0;
708
 
709
                case AX25_PACLEN:
710
                        if (opt < 16 || opt > 65535)
711
                                return -EINVAL;
712
                        sk->protinfo.ax25->paclen = opt;
713
                        return 0;
714
 
715
                case SO_BINDTODEVICE:
716
                        if (optlen > IFNAMSIZ) optlen=IFNAMSIZ;
717
                        if (copy_from_user(devname, optval, optlen))
718
                                return -EFAULT;
719
 
720
                        dev = dev_get_by_name(devname);
721
                        if (dev == NULL) return -ENODEV;
722
 
723
                        if (sk->type == SOCK_SEQPACKET &&
724
                           (sock->state != SS_UNCONNECTED || sk->state == TCP_LISTEN))
725
                                return -EADDRNOTAVAIL;
726
 
727
                        sk->protinfo.ax25->ax25_dev = ax25_dev_ax25dev(dev);
728
                        ax25_fillin_cb(sk->protinfo.ax25, sk->protinfo.ax25->ax25_dev);
729
                        return 0;
730
 
731
                default:
732
                        return -ENOPROTOOPT;
733
        }
734
}
735
 
736
static int ax25_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen)
737
{
738
        struct sock *sk = sock->sk;
739
        struct ax25_dev *ax25_dev;
740
        char devname[IFNAMSIZ];
741
        void *valptr;
742
        int val = 0;
743
        int maxlen, length;
744
 
745
        if (level != SOL_AX25)
746
                return -ENOPROTOOPT;
747
 
748
        if (get_user(maxlen, optlen))
749
                return -EFAULT;
750
 
751
        if (maxlen < 1)
752
                return -EFAULT;
753
 
754
        valptr = (void *) &val;
755
        length = min_t(unsigned int, maxlen, sizeof(int));
756
 
757
        switch (optname) {
758
                case AX25_WINDOW:
759
                        val = sk->protinfo.ax25->window;
760
                        break;
761
 
762
                case AX25_T1:
763
                        val = sk->protinfo.ax25->t1 / HZ;
764
                        break;
765
 
766
                case AX25_T2:
767
                        val = sk->protinfo.ax25->t2 / HZ;
768
                        break;
769
 
770
                case AX25_N2:
771
                        val = sk->protinfo.ax25->n2;
772
                        break;
773
 
774
                case AX25_T3:
775
                        val = sk->protinfo.ax25->t3 / HZ;
776
                        break;
777
 
778
                case AX25_IDLE:
779
                        val = sk->protinfo.ax25->idle / (60 * HZ);
780
                        break;
781
 
782
                case AX25_BACKOFF:
783
                        val = sk->protinfo.ax25->backoff;
784
                        break;
785
 
786
                case AX25_EXTSEQ:
787
                        val = (sk->protinfo.ax25->modulus == AX25_EMODULUS);
788
                        break;
789
 
790
                case AX25_PIDINCL:
791
                        val = sk->protinfo.ax25->pidincl;
792
                        break;
793
 
794
                case AX25_IAMDIGI:
795
                        val = sk->protinfo.ax25->iamdigi;
796
                        break;
797
 
798
                case AX25_PACLEN:
799
                        val = sk->protinfo.ax25->paclen;
800
                        break;
801
 
802
                case SO_BINDTODEVICE:
803
                        ax25_dev = sk->protinfo.ax25->ax25_dev;
804
 
805
                        if (ax25_dev != NULL && ax25_dev->dev != NULL) {
806
                                strncpy(devname, ax25_dev->dev->name, IFNAMSIZ);
807
                                length = min_t(unsigned int, strlen(ax25_dev->dev->name)+1, maxlen);
808
                                devname[length-1] = '\0';
809
                        } else {
810
                                *devname = '\0';
811
                                length = 1;
812
                        }
813
 
814
                        valptr = (void *) devname;
815
                        break;
816
 
817
                default:
818
                        return -ENOPROTOOPT;
819
        }
820
 
821
        if (put_user(length, optlen))
822
                return -EFAULT;
823
 
824
        return copy_to_user(optval, valptr, length) ? -EFAULT : 0;
825
}
826
 
827
static int ax25_listen(struct socket *sock, int backlog)
828
{
829
        struct sock *sk = sock->sk;
830
 
831
        if (sk->type == SOCK_SEQPACKET && sk->state != TCP_LISTEN) {
832
                sk->max_ack_backlog = backlog;
833
                sk->state           = TCP_LISTEN;
834
                return 0;
835
        }
836
 
837
        return -EOPNOTSUPP;
838
}
839
 
840
int ax25_create(struct socket *sock, int protocol)
841
{
842
        struct sock *sk;
843
        ax25_cb *ax25;
844
 
845
        switch (sock->type) {
846
                case SOCK_DGRAM:
847
                        if (protocol == 0 || protocol == PF_AX25)
848
                                protocol = AX25_P_TEXT;
849
                        break;
850
                case SOCK_SEQPACKET:
851
                        switch (protocol) {
852
                                case 0:
853
                                case PF_AX25:   /* For CLX */
854
                                        protocol = AX25_P_TEXT;
855
                                        break;
856
                                case AX25_P_SEGMENT:
857
#ifdef CONFIG_INET
858
                                case AX25_P_ARP:
859
                                case AX25_P_IP:
860
#endif
861
#ifdef CONFIG_NETROM
862
                                case AX25_P_NETROM:
863
#endif
864
#ifdef CONFIG_ROSE
865
                                case AX25_P_ROSE:
866
#endif
867
                                        return -ESOCKTNOSUPPORT;
868
#ifdef CONFIG_NETROM_MODULE
869
                                case AX25_P_NETROM:
870
                                        if (ax25_protocol_is_registered(AX25_P_NETROM))
871
                                                return -ESOCKTNOSUPPORT;
872
#endif
873
#ifdef CONFIG_ROSE_MODULE
874
                                case AX25_P_ROSE:
875
                                        if (ax25_protocol_is_registered(AX25_P_ROSE))
876
                                                return -ESOCKTNOSUPPORT;
877
#endif
878
                                default:
879
                                        break;
880
                        }
881
                        break;
882
                case SOCK_RAW:
883
                        break;
884
                default:
885
                        return -ESOCKTNOSUPPORT;
886
        }
887
 
888
        if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, 1)) == NULL)
889
                return -ENOMEM;
890
 
891
        if ((ax25 = ax25_create_cb()) == NULL) {
892
                sk_free(sk);
893
                return -ENOMEM;
894
        }
895
 
896
        sock_init_data(sock, sk);
897
 
898
        sk->destruct = ax25_free_sock;
899
        sock->ops    = &ax25_proto_ops;
900
        sk->protocol = protocol;
901
 
902
        ax25->sk          = sk;
903
        sk->protinfo.ax25 = ax25;
904
 
905
        return 0;
906
}
907
 
908
struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
909
{
910
        struct sock *sk;
911
        ax25_cb *ax25;
912
 
913
        if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, 1)) == NULL)
914
                return NULL;
915
 
916
        if ((ax25 = ax25_create_cb()) == NULL) {
917
                sk_free(sk);
918
                return NULL;
919
        }
920
 
921
        switch (osk->type) {
922
                case SOCK_DGRAM:
923
                        break;
924
                case SOCK_SEQPACKET:
925
                        break;
926
                default:
927
                        sk_free(sk);
928
                        ax25_free_cb(ax25);
929
                        return NULL;
930
        }
931
 
932
        sock_init_data(NULL, sk);
933
 
934
        sk->destruct = ax25_free_sock;
935
        sk->type     = osk->type;
936
        sk->socket   = osk->socket;
937
        sk->priority = osk->priority;
938
        sk->protocol = osk->protocol;
939
        sk->rcvbuf   = osk->rcvbuf;
940
        sk->sndbuf   = osk->sndbuf;
941
        sk->debug    = osk->debug;
942
        sk->state    = TCP_ESTABLISHED;
943
        sk->sleep    = osk->sleep;
944
        sk->zapped   = osk->zapped;
945
 
946
        ax25->modulus = osk->protinfo.ax25->modulus;
947
        ax25->backoff = osk->protinfo.ax25->backoff;
948
        ax25->pidincl = osk->protinfo.ax25->pidincl;
949
        ax25->iamdigi = osk->protinfo.ax25->iamdigi;
950
        ax25->rtt     = osk->protinfo.ax25->rtt;
951
        ax25->t1      = osk->protinfo.ax25->t1;
952
        ax25->t2      = osk->protinfo.ax25->t2;
953
        ax25->t3      = osk->protinfo.ax25->t3;
954
        ax25->n2      = osk->protinfo.ax25->n2;
955
        ax25->idle    = osk->protinfo.ax25->idle;
956
        ax25->paclen  = osk->protinfo.ax25->paclen;
957
        ax25->window  = osk->protinfo.ax25->window;
958
 
959
        ax25->ax25_dev    = ax25_dev;
960
        ax25->source_addr = osk->protinfo.ax25->source_addr;
961
 
962
        if (osk->protinfo.ax25->digipeat != NULL) {
963
                if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
964
                        sk_free(sk);
965
                        return NULL;
966
                }
967
 
968
                memcpy(ax25->digipeat, osk->protinfo.ax25->digipeat, sizeof(ax25_digi));
969
        }
970
 
971
        sk->protinfo.ax25 = ax25;
972
        ax25->sk          = sk;
973
 
974
        return sk;
975
}
976
 
977
static int ax25_release(struct socket *sock)
978
{
979
        struct sock *sk = sock->sk;
980
 
981
        if (sk == NULL) return 0;
982
 
983
        if (sk->type == SOCK_SEQPACKET) {
984
                switch (sk->protinfo.ax25->state) {
985
                        case AX25_STATE_0:
986
                                ax25_disconnect(sk->protinfo.ax25, 0);
987
                                ax25_destroy_socket(sk->protinfo.ax25);
988
                                break;
989
 
990
                        case AX25_STATE_1:
991
                        case AX25_STATE_2:
992
                                ax25_send_control(sk->protinfo.ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
993
                                ax25_disconnect(sk->protinfo.ax25, 0);
994
                                ax25_destroy_socket(sk->protinfo.ax25);
995
                                break;
996
 
997
                        case AX25_STATE_3:
998
                        case AX25_STATE_4:
999
                                ax25_clear_queues(sk->protinfo.ax25);
1000
                                sk->protinfo.ax25->n2count = 0;
1001
                                switch (sk->protinfo.ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1002
                                        case AX25_PROTO_STD_SIMPLEX:
1003
                                        case AX25_PROTO_STD_DUPLEX:
1004
                                                ax25_send_control(sk->protinfo.ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
1005
                                                ax25_stop_t2timer(sk->protinfo.ax25);
1006
                                                ax25_stop_t3timer(sk->protinfo.ax25);
1007
                                                ax25_stop_idletimer(sk->protinfo.ax25);
1008
                                                break;
1009
#ifdef CONFIG_AX25_DAMA_SLAVE
1010
                                        case AX25_PROTO_DAMA_SLAVE:
1011
                                                ax25_stop_t3timer(sk->protinfo.ax25);
1012
                                                ax25_stop_idletimer(sk->protinfo.ax25);
1013
                                                break;
1014
#endif
1015
                                }
1016
                                ax25_calculate_t1(sk->protinfo.ax25);
1017
                                ax25_start_t1timer(sk->protinfo.ax25);
1018
                                sk->protinfo.ax25->state = AX25_STATE_2;
1019
                                sk->state                = TCP_CLOSE;
1020
                                sk->shutdown            |= SEND_SHUTDOWN;
1021
                                sk->state_change(sk);
1022
                                sock_orphan(sk);
1023
                                sk->destroy              = 1;
1024
                                break;
1025
 
1026
                        default:
1027
                                break;
1028
                }
1029
        } else {
1030
                sk->state     = TCP_CLOSE;
1031
                sk->shutdown |= SEND_SHUTDOWN;
1032
                sk->state_change(sk);
1033
                sock_orphan(sk);
1034
                ax25_destroy_socket(sk->protinfo.ax25);
1035
        }
1036
 
1037
        sock->sk   = NULL;
1038
        sk->socket = NULL;      /* Not used, but we should do this */
1039
 
1040
        return 0;
1041
}
1042
 
1043
/*
1044
 *      We support a funny extension here so you can (as root) give any callsign
1045
 *      digipeated via a local address as source. This hack is obsolete now
1046
 *      that we've implemented support for SO_BINDTODEVICE. It is however small
1047
 *      and trivially backward compatible.
1048
 */
1049
static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1050
{
1051
        struct sock *sk = sock->sk;
1052
        struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
1053
        ax25_address *call;
1054
        ax25_dev *ax25_dev = NULL;
1055
 
1056
        if (sk->zapped == 0)
1057
                return -EINVAL;
1058
 
1059
        if (addr_len != sizeof(struct sockaddr_ax25) &&
1060
            addr_len != sizeof(struct full_sockaddr_ax25)) {
1061
                /* support for old structure may go away some time */
1062
                if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1063
                    (addr_len > sizeof(struct full_sockaddr_ax25)))
1064
                        return -EINVAL;
1065
 
1066
                printk(KERN_WARNING "ax25_bind(): %s uses old (6 digipeater) socket structure.\n",
1067
                        current->comm);
1068
        }
1069
 
1070
        if (addr->fsa_ax25.sax25_family != AF_AX25)
1071
                return -EINVAL;
1072
 
1073
        call = ax25_findbyuid(current->euid);
1074
        if (call == NULL && ax25_uid_policy && !capable(CAP_NET_ADMIN))
1075
                return -EACCES;
1076
 
1077
        if (call == NULL)
1078
                sk->protinfo.ax25->source_addr = addr->fsa_ax25.sax25_call;
1079
        else
1080
                sk->protinfo.ax25->source_addr = *call;
1081
 
1082
        /*
1083
         * User already set interface with SO_BINDTODEVICE
1084
         */
1085
 
1086
        if (sk->protinfo.ax25->ax25_dev != NULL)
1087
                goto done;
1088
 
1089
        if (addr_len > sizeof(struct sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
1090
                if (ax25cmp(&addr->fsa_digipeater[0], &null_ax25_address) != 0 &&
1091
                    (ax25_dev = ax25_addr_ax25dev(&addr->fsa_digipeater[0])) == NULL)
1092
                        return -EADDRNOTAVAIL;
1093
        }  else {
1094
                if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL)
1095
                        return -EADDRNOTAVAIL;
1096
        }
1097
 
1098
        if (ax25_dev != NULL)
1099
                ax25_fillin_cb(sk->protinfo.ax25, ax25_dev);
1100
 
1101
done:
1102
        ax25_insert_socket(sk->protinfo.ax25);
1103
        sk->zapped = 0;
1104
        return 0;
1105
}
1106
 
1107
/*
1108
 *      FIXME: nonblock behaviour looks like it may have a bug.
1109
 */
1110
static int ax25_connect(struct socket *sock, struct sockaddr *uaddr, int addr_len, int flags)
1111
{
1112
        struct sock *sk = sock->sk;
1113
        struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1114
        ax25_digi *digi = NULL;
1115
        int ct = 0, err;
1116
 
1117
        /* deal with restarts */
1118
        if (sock->state == SS_CONNECTING) {
1119
                switch (sk->state) {
1120
                case TCP_SYN_SENT: /* still trying */
1121
                        return -EINPROGRESS;
1122
 
1123
                case TCP_ESTABLISHED: /* connection established */
1124
                        sock->state = SS_CONNECTED;
1125
                        return 0;
1126
 
1127
                case TCP_CLOSE: /* connection refused */
1128
                        sock->state = SS_UNCONNECTED;
1129
                        return -ECONNREFUSED;
1130
                }
1131
        }
1132
 
1133
        if (sk->state == TCP_ESTABLISHED && sk->type == SOCK_SEQPACKET)
1134
                return -EISCONN;        /* No reconnect on a seqpacket socket */
1135
 
1136
        sk->state   = TCP_CLOSE;
1137
        sock->state = SS_UNCONNECTED;
1138
 
1139
        /*
1140
         * some sanity checks. code further down depends on this
1141
         */
1142
 
1143
        if (addr_len == sizeof(struct sockaddr_ax25)) {
1144
                /* support for this will go away in early 2.5.x */
1145
                printk(KERN_WARNING "ax25_connect(): %s uses obsolete socket structure\n",
1146
                        current->comm);
1147
        }
1148
        else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
1149
                /* support for old structure may go away some time */
1150
                if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1151
                    (addr_len > sizeof(struct full_sockaddr_ax25)))
1152
                        return -EINVAL;
1153
 
1154
                printk(KERN_WARNING "ax25_connect(): %s uses old (6 digipeater) socket structure.\n",
1155
                        current->comm);
1156
        }
1157
 
1158
        if (fsa->fsa_ax25.sax25_family != AF_AX25)
1159
                return -EINVAL;
1160
 
1161
        if (sk->protinfo.ax25->digipeat != NULL) {
1162
                kfree(sk->protinfo.ax25->digipeat);
1163
                sk->protinfo.ax25->digipeat = NULL;
1164
        }
1165
 
1166
        /*
1167
         *      Handle digi-peaters to be used.
1168
         */
1169
        if (addr_len > sizeof(struct sockaddr_ax25) && fsa->fsa_ax25.sax25_ndigis != 0) {
1170
                /* Valid number of digipeaters ? */
1171
                if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS)
1172
                        return -EINVAL;
1173
 
1174
                if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL)
1175
                        return -ENOBUFS;
1176
 
1177
                digi->ndigi      = fsa->fsa_ax25.sax25_ndigis;
1178
                digi->lastrepeat = -1;
1179
 
1180
                while (ct < fsa->fsa_ax25.sax25_ndigis) {
1181
                        if ((fsa->fsa_digipeater[ct].ax25_call[6] & AX25_HBIT) && sk->protinfo.ax25->iamdigi) {
1182
                                digi->repeated[ct] = 1;
1183
                                digi->lastrepeat   = ct;
1184
                        } else {
1185
                                digi->repeated[ct] = 0;
1186
                        }
1187
                        digi->calls[ct] = fsa->fsa_digipeater[ct];
1188
                        ct++;
1189
                }
1190
        }
1191
 
1192
        /*
1193
         *      Must bind first - autobinding in this may or may not work. If
1194
         *      the socket is already bound, check to see if the device has
1195
         *      been filled in, error if it hasn't.
1196
         */
1197
        if (sk->zapped) {
1198
                /* check if we can remove this feature. It is broken. */
1199
                printk(KERN_WARNING "ax25_connect(): %s uses autobind, please contact jreuter@yaina.de\n",
1200
                        current->comm);
1201
                if ((err = ax25_rt_autobind(sk->protinfo.ax25, &fsa->fsa_ax25.sax25_call)) < 0)
1202
                        return err;
1203
                ax25_fillin_cb(sk->protinfo.ax25, sk->protinfo.ax25->ax25_dev);
1204
                ax25_insert_socket(sk->protinfo.ax25);
1205
        } else {
1206
                if (sk->protinfo.ax25->ax25_dev == NULL)
1207
                        return -EHOSTUNREACH;
1208
        }
1209
 
1210
        if (sk->type == SOCK_SEQPACKET && ax25_find_cb(&sk->protinfo.ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi, sk->protinfo.ax25->ax25_dev->dev) != NULL) {
1211
                if (digi != NULL) kfree(digi);
1212
                return -EADDRINUSE;                     /* Already such a connection */
1213
        }
1214
 
1215
        sk->protinfo.ax25->dest_addr = fsa->fsa_ax25.sax25_call;
1216
        sk->protinfo.ax25->digipeat  = digi;
1217
 
1218
        /* First the easy one */
1219
        if (sk->type != SOCK_SEQPACKET) {
1220
                sock->state = SS_CONNECTED;
1221
                sk->state   = TCP_ESTABLISHED;
1222
                return 0;
1223
        }
1224
 
1225
        /* Move to connecting socket, ax.25 lapb WAIT_UA.. */
1226
        sock->state        = SS_CONNECTING;
1227
        sk->state          = TCP_SYN_SENT;
1228
 
1229
        switch (sk->protinfo.ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1230
                case AX25_PROTO_STD_SIMPLEX:
1231
                case AX25_PROTO_STD_DUPLEX:
1232
                        ax25_std_establish_data_link(sk->protinfo.ax25);
1233
                        break;
1234
 
1235
#ifdef CONFIG_AX25_DAMA_SLAVE
1236
                case AX25_PROTO_DAMA_SLAVE:
1237
                        sk->protinfo.ax25->modulus = AX25_MODULUS;
1238
                        sk->protinfo.ax25->window  = sk->protinfo.ax25->ax25_dev->values[AX25_VALUES_WINDOW];
1239
                        if (sk->protinfo.ax25->ax25_dev->dama.slave)
1240
                                ax25_ds_establish_data_link(sk->protinfo.ax25);
1241
                        else
1242
                                ax25_std_establish_data_link(sk->protinfo.ax25);
1243
                        break;
1244
#endif
1245
        }
1246
 
1247
        sk->protinfo.ax25->state = AX25_STATE_1;
1248
 
1249
        ax25_start_heartbeat(sk->protinfo.ax25);
1250
 
1251
        /* Now the loop */
1252
        if (sk->state != TCP_ESTABLISHED && (flags & O_NONBLOCK))
1253
                return -EINPROGRESS;
1254
 
1255
        cli();  /* To avoid races on the sleep */
1256
 
1257
        /* A DM or timeout will go to closed, a UA will go to ABM */
1258
        while (sk->state == TCP_SYN_SENT) {
1259
                interruptible_sleep_on(sk->sleep);
1260
                if (signal_pending(current)) {
1261
                        sti();
1262
                        return -ERESTARTSYS;
1263
                }
1264
        }
1265
 
1266
        if (sk->state != TCP_ESTABLISHED) {
1267
                /* Not in ABM, not in WAIT_UA -> failed */
1268
                sti();
1269
                sock->state = SS_UNCONNECTED;
1270
                return sock_error(sk);  /* Always set at this point */
1271
        }
1272
 
1273
        sock->state = SS_CONNECTED;
1274
 
1275
        sti();
1276
 
1277
        return 0;
1278
}
1279
 
1280
 
1281
static int ax25_accept(struct socket *sock, struct socket *newsock, int flags)
1282
{
1283
        struct sock *sk;
1284
        struct sock *newsk;
1285
        struct sk_buff *skb;
1286
 
1287
        if (sock->state != SS_UNCONNECTED)
1288
                return -EINVAL;
1289
 
1290
        if ((sk = sock->sk) == NULL)
1291
                return -EINVAL;
1292
 
1293
        if (sk->type != SOCK_SEQPACKET)
1294
                return -EOPNOTSUPP;
1295
 
1296
        if (sk->state != TCP_LISTEN)
1297
                return -EINVAL;
1298
 
1299
        /*
1300
         *      The read queue this time is holding sockets ready to use
1301
         *      hooked into the SABM we saved
1302
         */
1303
        do {
1304
                if ((skb = skb_dequeue(&sk->receive_queue)) == NULL) {
1305
                        if (flags & O_NONBLOCK)
1306
                                return -EWOULDBLOCK;
1307
 
1308
                        interruptible_sleep_on(sk->sleep);
1309
                        if (signal_pending(current))
1310
                                return -ERESTARTSYS;
1311
                }
1312
        } while (skb == NULL);
1313
 
1314
        newsk = skb->sk;
1315
        newsk->pair = NULL;
1316
        newsk->socket = newsock;
1317
        newsk->sleep = &newsock->wait;
1318
 
1319
        /* Now attach up the new socket */
1320
        kfree_skb(skb);
1321
        sk->ack_backlog--;
1322
        newsock->sk    = newsk;
1323
        newsock->state = SS_CONNECTED;
1324
 
1325
        return 0;
1326
}
1327
 
1328
static int ax25_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer)
1329
{
1330
        struct sock *sk = sock->sk;
1331
        struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1332
        unsigned char ndigi, i;
1333
 
1334
        if (peer != 0) {
1335
                if (sk->state != TCP_ESTABLISHED)
1336
                        return -ENOTCONN;
1337
 
1338
                fsa->fsa_ax25.sax25_family = AF_AX25;
1339
                fsa->fsa_ax25.sax25_call   = sk->protinfo.ax25->dest_addr;
1340
                fsa->fsa_ax25.sax25_ndigis = 0;
1341
 
1342
                if (sk->protinfo.ax25->digipeat != NULL) {
1343
                        ndigi = sk->protinfo.ax25->digipeat->ndigi;
1344
                        fsa->fsa_ax25.sax25_ndigis = ndigi;
1345
                        for (i = 0; i < ndigi; i++)
1346
                                fsa->fsa_digipeater[i] = sk->protinfo.ax25->digipeat->calls[i];
1347
                }
1348
        } else {
1349
                fsa->fsa_ax25.sax25_family = AF_AX25;
1350
                fsa->fsa_ax25.sax25_call   = sk->protinfo.ax25->source_addr;
1351
                fsa->fsa_ax25.sax25_ndigis = 1;
1352
                if (sk->protinfo.ax25->ax25_dev != NULL) {
1353
                        memcpy(&fsa->fsa_digipeater[0], sk->protinfo.ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
1354
                } else {
1355
                        fsa->fsa_digipeater[0] = null_ax25_address;
1356
                }
1357
        }
1358
        *uaddr_len = sizeof (struct full_sockaddr_ax25);
1359
        return 0;
1360
}
1361
 
1362
static int ax25_sendmsg(struct socket *sock, struct msghdr *msg, int len, struct scm_cookie *scm)
1363
{
1364
        struct sock *sk = sock->sk;
1365
        struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
1366
        int err;
1367
        struct sockaddr_ax25 sax;
1368
        struct sk_buff *skb;
1369
        unsigned char *asmptr;
1370
        int size;
1371
        ax25_digi *dp;
1372
        ax25_digi dtmp;
1373
        int lv;
1374
        int addr_len = msg->msg_namelen;
1375
 
1376
        if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR))
1377
                return -EINVAL;
1378
 
1379
        if (sk->zapped)
1380
                return -EADDRNOTAVAIL;
1381
 
1382
        if (sk->shutdown & SEND_SHUTDOWN) {
1383
                send_sig(SIGPIPE, current, 0);
1384
                return -EPIPE;
1385
        }
1386
 
1387
        if (sk->protinfo.ax25->ax25_dev == NULL)
1388
                return -ENETUNREACH;
1389
 
1390
        if (usax != NULL) {
1391
                if (usax->sax25_family != AF_AX25)
1392
                        return -EINVAL;
1393
 
1394
                if (addr_len == sizeof(struct sockaddr_ax25)) {
1395
                        printk(KERN_WARNING "ax25_sendmsg(): %s uses obsolete socket structure\n",
1396
                                current->comm);
1397
                }
1398
                else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
1399
                        /* support for old structure may go away some time */
1400
                        if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1401
                            (addr_len > sizeof(struct full_sockaddr_ax25)))
1402
                                return -EINVAL;
1403
 
1404
                        printk(KERN_WARNING "ax25_sendmsg(): %s uses old (6 digipeater) socket structure.\n",
1405
                                current->comm);
1406
                }
1407
 
1408
                if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
1409
                        int ct           = 0;
1410
                        struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
1411
 
1412
                        /* Valid number of digipeaters ? */
1413
                        if (usax->sax25_ndigis < 1 || usax->sax25_ndigis > AX25_MAX_DIGIS)
1414
                                return -EINVAL;
1415
 
1416
                        dtmp.ndigi      = usax->sax25_ndigis;
1417
 
1418
                        while (ct < usax->sax25_ndigis) {
1419
                                dtmp.repeated[ct] = 0;
1420
                                dtmp.calls[ct]    = fsa->fsa_digipeater[ct];
1421
                                ct++;
1422
                        }
1423
 
1424
                        dtmp.lastrepeat = 0;
1425
                }
1426
 
1427
                sax = *usax;
1428
                if (sk->type == SOCK_SEQPACKET && ax25cmp(&sk->protinfo.ax25->dest_addr, &sax.sax25_call) != 0)
1429
                        return -EISCONN;
1430
                if (usax->sax25_ndigis == 0)
1431
                        dp = NULL;
1432
                else
1433
                        dp = &dtmp;
1434
        } else {
1435
                /*
1436
                 *      FIXME: 1003.1g - if the socket is like this because
1437
                 *      it has become closed (not started closed) and is VC
1438
                 *      we ought to SIGPIPE, EPIPE
1439
                 */
1440
                if (sk->state != TCP_ESTABLISHED)
1441
                        return -ENOTCONN;
1442
                sax.sax25_family = AF_AX25;
1443
                sax.sax25_call   = sk->protinfo.ax25->dest_addr;
1444
                dp = sk->protinfo.ax25->digipeat;
1445
        }
1446
 
1447
        SOCK_DEBUG(sk, "AX.25: sendto: Addresses built.\n");
1448
 
1449
        /* Build a packet */
1450
        SOCK_DEBUG(sk, "AX.25: sendto: building packet.\n");
1451
 
1452
        /* Assume the worst case */
1453
        size = len + 3 + ax25_addr_size(dp) + AX25_BPQ_HEADER_LEN;
1454
 
1455
        if ((skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err)) == NULL)
1456
                return err;
1457
 
1458
        skb_reserve(skb, size - len);
1459
 
1460
        SOCK_DEBUG(sk, "AX.25: Appending user data\n");
1461
 
1462
        /* User data follows immediately after the AX.25 data */
1463
        memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);
1464
        skb->nh.raw = skb->data;
1465
 
1466
        /* Add the PID if one is not supplied by the user in the skb */
1467
        if (!sk->protinfo.ax25->pidincl) {
1468
                asmptr  = skb_push(skb, 1);
1469
                *asmptr = sk->protocol;
1470
        }
1471
 
1472
        SOCK_DEBUG(sk, "AX.25: Transmitting buffer\n");
1473
 
1474
        if (sk->type == SOCK_SEQPACKET) {
1475
                /* Connected mode sockets go via the LAPB machine */
1476
                if (sk->state != TCP_ESTABLISHED) {
1477
                        kfree_skb(skb);
1478
                        return -ENOTCONN;
1479
                }
1480
 
1481
                ax25_output(sk->protinfo.ax25, sk->protinfo.ax25->paclen, skb); /* Shove it onto the queue and kick */
1482
 
1483
                return len;
1484
        } else {
1485
                asmptr = skb_push(skb, 1 + ax25_addr_size(dp));
1486
 
1487
                SOCK_DEBUG(sk, "Building AX.25 Header (dp=%p).\n", dp);
1488
 
1489
                if (dp != NULL)
1490
                        SOCK_DEBUG(sk, "Num digipeaters=%d\n", dp->ndigi);
1491
 
1492
                /* Build an AX.25 header */
1493
                asmptr += (lv = ax25_addr_build(asmptr, &sk->protinfo.ax25->source_addr, &sax.sax25_call, dp, AX25_COMMAND, AX25_MODULUS));
1494
 
1495
                SOCK_DEBUG(sk, "Built header (%d bytes)\n",lv);
1496
 
1497
                skb->h.raw = asmptr;
1498
 
1499
                SOCK_DEBUG(sk, "base=%p pos=%p\n", skb->data, asmptr);
1500
 
1501
                *asmptr = AX25_UI;
1502
 
1503
                /* Datagram frames go straight out of the door as UI */
1504
                skb->dev      = sk->protinfo.ax25->ax25_dev->dev;
1505
 
1506
                ax25_queue_xmit(skb);
1507
 
1508
                return len;
1509
        }
1510
}
1511
 
1512
static int ax25_recvmsg(struct socket *sock, struct msghdr *msg, int size, int flags, struct scm_cookie *scm)
1513
{
1514
        struct sock *sk = sock->sk;
1515
        int copied;
1516
        struct sk_buff *skb;
1517
        int er;
1518
 
1519
        /*
1520
         *      This works for seqpacket too. The receiver has ordered the
1521
         *      queue for us! We do one quick check first though
1522
         */
1523
        if (sk->type == SOCK_SEQPACKET && sk->state != TCP_ESTABLISHED)
1524
                return -ENOTCONN;
1525
 
1526
        /* Now we can treat all alike */
1527
        if ((skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, flags & MSG_DONTWAIT, &er)) == NULL)
1528
                return er;
1529
 
1530
        if (!sk->protinfo.ax25->pidincl)
1531
                skb_pull(skb, 1);               /* Remove PID */
1532
 
1533
        skb->h.raw = skb->data;
1534
        copied     = skb->len;
1535
 
1536
        if (copied > size) {
1537
                copied = size;
1538
                msg->msg_flags |= MSG_TRUNC;
1539
        }
1540
 
1541
        skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
1542
 
1543
        if (msg->msg_namelen != 0) {
1544
                struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
1545
                ax25_digi digi;
1546
                ax25_address dest;
1547
 
1548
                ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, NULL, &dest, &digi, NULL, NULL);
1549
 
1550
                sax->sax25_family = AF_AX25;
1551
                /* We set this correctly, even though we may not let the
1552
                   application know the digi calls further down (because it
1553
                   did NOT ask to know them).  This could get political... **/
1554
                sax->sax25_ndigis = digi.ndigi;
1555
                sax->sax25_call   = dest;
1556
 
1557
                if (sax->sax25_ndigis != 0) {
1558
                        int ct;
1559
                        struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
1560
 
1561
                        for (ct = 0; ct < digi.ndigi; ct++)
1562
                                fsa->fsa_digipeater[ct] = digi.calls[ct];
1563
                }
1564
                msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
1565
        }
1566
 
1567
        skb_free_datagram(sk, skb);
1568
 
1569
        return copied;
1570
}
1571
 
1572
static int ax25_shutdown(struct socket *sk, int how)
1573
{
1574
        /* FIXME - generate DM and RNR states */
1575
        return -EOPNOTSUPP;
1576
}
1577
 
1578
static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1579
{
1580
        struct sock *sk = sock->sk;
1581
 
1582
        switch (cmd) {
1583
                case TIOCOUTQ: {
1584
                        long amount;
1585
                        amount = sk->sndbuf - atomic_read(&sk->wmem_alloc);
1586
                        if (amount < 0)
1587
                                amount = 0;
1588
                        return put_user(amount, (int *)arg);
1589
                }
1590
 
1591
                case TIOCINQ: {
1592
                        struct sk_buff *skb;
1593
                        long amount = 0L;
1594
                        /* These two are safe on a single CPU system as only user tasks fiddle here */
1595
                        if ((skb = skb_peek(&sk->receive_queue)) != NULL)
1596
                                amount = skb->len;
1597
                        return put_user(amount, (int *)arg);
1598
                }
1599
 
1600
                case SIOCGSTAMP:
1601
                        if (sk != NULL) {
1602
                                if (sk->stamp.tv_sec == 0)
1603
                                        return -ENOENT;
1604
                                return copy_to_user((void *)arg, &sk->stamp, sizeof(struct timeval)) ? -EFAULT : 0;
1605
                        }
1606
                        return -EINVAL;
1607
 
1608
                case SIOCAX25ADDUID:    /* Add a uid to the uid/call map table */
1609
                case SIOCAX25DELUID:    /* Delete a uid from the uid/call map table */
1610
                case SIOCAX25GETUID: {
1611
                        struct sockaddr_ax25 sax25;
1612
                        if (copy_from_user(&sax25, (void *)arg, sizeof(sax25)))
1613
                                return -EFAULT;
1614
                        return ax25_uid_ioctl(cmd, &sax25);
1615
                }
1616
 
1617
                case SIOCAX25NOUID: {   /* Set the default policy (default/bar) */
1618
                        long amount;
1619
                        if (!capable(CAP_NET_ADMIN))
1620
                                return -EPERM;
1621
                        if (get_user(amount, (long *)arg))
1622
                                return -EFAULT;
1623
                        if (amount > AX25_NOUID_BLOCK)
1624
                                return -EINVAL;
1625
                        ax25_uid_policy = amount;
1626
                        return 0;
1627
                }
1628
 
1629
                case SIOCADDRT:
1630
                case SIOCDELRT:
1631
                case SIOCAX25OPTRT:
1632
                        if (!capable(CAP_NET_ADMIN))
1633
                                return -EPERM;
1634
                        return ax25_rt_ioctl(cmd, (void *)arg);
1635
 
1636
                case SIOCAX25CTLCON:
1637
                        if (!capable(CAP_NET_ADMIN))
1638
                                return -EPERM;
1639
                        return ax25_ctl_ioctl(cmd, (void *)arg);
1640
 
1641
                case SIOCAX25GETINFO:
1642
                case SIOCAX25GETINFOOLD: {
1643
                        struct ax25_info_struct ax25_info;
1644
 
1645
                        ax25_info.t1        = sk->protinfo.ax25->t1   / HZ;
1646
                        ax25_info.t2        = sk->protinfo.ax25->t2   / HZ;
1647
                        ax25_info.t3        = sk->protinfo.ax25->t3   / HZ;
1648
                        ax25_info.idle      = sk->protinfo.ax25->idle / (60 * HZ);
1649
                        ax25_info.n2        = sk->protinfo.ax25->n2;
1650
                        ax25_info.t1timer   = ax25_display_timer(&sk->protinfo.ax25->t1timer)   / HZ;
1651
                        ax25_info.t2timer   = ax25_display_timer(&sk->protinfo.ax25->t2timer)   / HZ;
1652
                        ax25_info.t3timer   = ax25_display_timer(&sk->protinfo.ax25->t3timer)   / HZ;
1653
                        ax25_info.idletimer = ax25_display_timer(&sk->protinfo.ax25->idletimer) / (60 * HZ);
1654
                        ax25_info.n2count   = sk->protinfo.ax25->n2count;
1655
                        ax25_info.state     = sk->protinfo.ax25->state;
1656
                        ax25_info.rcv_q     = atomic_read(&sk->rmem_alloc);
1657
                        ax25_info.snd_q     = atomic_read(&sk->wmem_alloc);
1658
                        ax25_info.vs        = sk->protinfo.ax25->vs;
1659
                        ax25_info.vr        = sk->protinfo.ax25->vr;
1660
                        ax25_info.va        = sk->protinfo.ax25->va;
1661
                        ax25_info.vs_max    = sk->protinfo.ax25->vs; /* reserved */
1662
                        ax25_info.paclen    = sk->protinfo.ax25->paclen;
1663
                        ax25_info.window    = sk->protinfo.ax25->window;
1664
 
1665
                        /* old structure? */
1666
                        if (cmd == SIOCAX25GETINFOOLD) {
1667
                                static int warned = 0;
1668
                                if (!warned) {
1669
                                        printk(KERN_INFO "%s uses old SIOCAX25GETINFO\n",
1670
                                                current->comm);
1671
                                        warned=1;
1672
                                }
1673
 
1674
                                if (copy_to_user((void *)arg, &ax25_info, sizeof(struct ax25_info_struct_depreciated)))
1675
                                        return -EFAULT;
1676
                        } else {
1677
                                if (copy_to_user((void *)arg, &ax25_info, sizeof(struct ax25_info_struct)))
1678
                                        return -EINVAL;
1679
                        }
1680
                        return 0;
1681
                }
1682
 
1683
                case SIOCAX25ADDFWD:
1684
                case SIOCAX25DELFWD: {
1685
                        struct ax25_fwd_struct ax25_fwd;
1686
                        if (!capable(CAP_NET_ADMIN))
1687
                                return -EPERM;
1688
                        if (copy_from_user(&ax25_fwd, (void *)arg, sizeof(ax25_fwd)))
1689
                                return -EFAULT;
1690
                        return ax25_fwd_ioctl(cmd, &ax25_fwd);
1691
                }
1692
 
1693
                case SIOCGIFADDR:
1694
                case SIOCSIFADDR:
1695
                case SIOCGIFDSTADDR:
1696
                case SIOCSIFDSTADDR:
1697
                case SIOCGIFBRDADDR:
1698
                case SIOCSIFBRDADDR:
1699
                case SIOCGIFNETMASK:
1700
                case SIOCSIFNETMASK:
1701
                case SIOCGIFMETRIC:
1702
                case SIOCSIFMETRIC:
1703
                        return -EINVAL;
1704
 
1705
                default:
1706
                        return dev_ioctl(cmd, (void *)arg);
1707
        }
1708
 
1709
        /*NOTREACHED*/
1710
        return 0;
1711
}
1712
 
1713
static int ax25_get_info(char *buffer, char **start, off_t offset, int length)
1714
{
1715
        ax25_cb *ax25;
1716
        int k;
1717
        int len = 0;
1718
        off_t pos = 0;
1719
        off_t begin = 0;
1720
 
1721
        cli();
1722
 
1723
        /*
1724
         * New format:
1725
         * magic dev src_addr dest_addr,digi1,digi2,.. st vs vr va t1 t1 t2 t2 t3 t3 idle idle n2 n2 rtt window paclen Snd-Q Rcv-Q inode
1726
         */
1727
 
1728
        for (ax25 = ax25_list; ax25 != NULL; ax25 = ax25->next) {
1729
                len += sprintf(buffer+len, "%8.8lx %s %s%s ",
1730
                                (long) ax25,
1731
                                ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
1732
                                ax2asc(&ax25->source_addr),
1733
                                ax25->iamdigi? "*":"");
1734
 
1735
                len += sprintf(buffer+len, "%s", ax2asc(&ax25->dest_addr));
1736
 
1737
                for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
1738
                        len += sprintf(buffer+len, ",%s%s",
1739
                                        ax2asc(&ax25->digipeat->calls[k]),
1740
                                        ax25->digipeat->repeated[k]? "*":"");
1741
                }
1742
 
1743
                len += sprintf(buffer+len, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
1744
                        ax25->state,
1745
                        ax25->vs, ax25->vr, ax25->va,
1746
                        ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
1747
                        ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
1748
                        ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
1749
                        ax25_display_timer(&ax25->idletimer) / (60 * HZ),
1750
                        ax25->idle / (60 * HZ),
1751
                        ax25->n2count, ax25->n2,
1752
                        ax25->rtt / HZ,
1753
                        ax25->window,
1754
                        ax25->paclen);
1755
 
1756
                if (ax25->sk != NULL) {
1757
                        len += sprintf(buffer + len, " %d %d %ld\n",
1758
                                atomic_read(&ax25->sk->wmem_alloc),
1759
                                atomic_read(&ax25->sk->rmem_alloc),
1760
                                ax25->sk->socket != NULL ? ax25->sk->socket->inode->i_ino : 0L);
1761
                } else {
1762
                        len += sprintf(buffer + len, " * * *\n");
1763
                }
1764
 
1765
                pos = begin + len;
1766
 
1767
                if (pos < offset) {
1768
                        len   = 0;
1769
                        begin = pos;
1770
                }
1771
 
1772
                if (pos > offset + length)
1773
                        break;
1774
        }
1775
 
1776
        sti();
1777
 
1778
        *start = buffer + (offset - begin);
1779
        len   -= (offset - begin);
1780
 
1781
        if (len > length) len = length;
1782
 
1783
        return(len);
1784
}
1785
 
1786
static struct net_proto_family ax25_family_ops = {
1787
        family:         PF_AX25,
1788
        create:         ax25_create,
1789
};
1790
 
1791
static struct proto_ops SOCKOPS_WRAPPED(ax25_proto_ops) = {
1792
        family:         PF_AX25,
1793
 
1794
        release:        ax25_release,
1795
        bind:           ax25_bind,
1796
        connect:        ax25_connect,
1797
        socketpair:     sock_no_socketpair,
1798
        accept:         ax25_accept,
1799
        getname:        ax25_getname,
1800
        poll:           datagram_poll,
1801
        ioctl:          ax25_ioctl,
1802
        listen:         ax25_listen,
1803
        shutdown:       ax25_shutdown,
1804
        setsockopt:     ax25_setsockopt,
1805
        getsockopt:     ax25_getsockopt,
1806
        sendmsg:        ax25_sendmsg,
1807
        recvmsg:        ax25_recvmsg,
1808
        mmap:           sock_no_mmap,
1809
        sendpage:       sock_no_sendpage,
1810
};
1811
 
1812
#include <linux/smp_lock.h>
1813
SOCKOPS_WRAP(ax25_proto, PF_AX25);
1814
 
1815
/*
1816
 *      Called by socket.c on kernel start up
1817
 */
1818
static struct packet_type ax25_packet_type = {
1819
        type:           __constant_htons(ETH_P_AX25),
1820
        func:           ax25_kiss_rcv,
1821
};
1822
 
1823
static struct notifier_block ax25_dev_notifier = {
1824
        notifier_call:  ax25_device_event,
1825
};
1826
 
1827
EXPORT_SYMBOL(ax25_encapsulate);
1828
EXPORT_SYMBOL(ax25_rebuild_header);
1829
EXPORT_SYMBOL(ax25_findbyuid);
1830
EXPORT_SYMBOL(ax25_find_cb);
1831
EXPORT_SYMBOL(ax25_linkfail_register);
1832
EXPORT_SYMBOL(ax25_linkfail_release);
1833
EXPORT_SYMBOL(ax25_listen_register);
1834
EXPORT_SYMBOL(ax25_listen_release);
1835
EXPORT_SYMBOL(ax25_protocol_register);
1836
EXPORT_SYMBOL(ax25_protocol_release);
1837
EXPORT_SYMBOL(ax25_send_frame);
1838
EXPORT_SYMBOL(ax25_uid_policy);
1839
EXPORT_SYMBOL(ax25cmp);
1840
EXPORT_SYMBOL(ax2asc);
1841
EXPORT_SYMBOL(asc2ax);
1842
EXPORT_SYMBOL(null_ax25_address);
1843
EXPORT_SYMBOL(ax25_display_timer);
1844
 
1845
static char banner[] __initdata = KERN_INFO "NET4: G4KLX/GW4PTS AX.25 for Linux. Version 0.37 for Linux NET4.0\n";
1846
 
1847
static int __init ax25_init(void)
1848
{
1849
        sock_register(&ax25_family_ops);
1850
        dev_add_pack(&ax25_packet_type);
1851
        register_netdevice_notifier(&ax25_dev_notifier);
1852
        ax25_register_sysctl();
1853
 
1854
        proc_net_create("ax25_route", 0, ax25_rt_get_info);
1855
        proc_net_create("ax25", 0, ax25_get_info);
1856
        proc_net_create("ax25_calls", 0, ax25_uid_get_info);
1857
 
1858
        printk(banner);
1859
        return 0;
1860
}
1861
module_init(ax25_init);
1862
 
1863
 
1864
MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
1865
MODULE_DESCRIPTION("The amateur radio AX.25 link layer protocol");
1866
MODULE_LICENSE("GPL");
1867
 
1868
static void __exit ax25_exit(void)
1869
{
1870
        proc_net_remove("ax25_route");
1871
        proc_net_remove("ax25");
1872
        proc_net_remove("ax25_calls");
1873
        ax25_rt_free();
1874
        ax25_uid_free();
1875
        ax25_dev_free();
1876
 
1877
        ax25_unregister_sysctl();
1878
        unregister_netdevice_notifier(&ax25_dev_notifier);
1879
 
1880
        dev_remove_pack(&ax25_packet_type);
1881
 
1882
        sock_unregister(PF_AX25);
1883
}
1884
module_exit(ax25_exit);

powered by: WebSVN 2.1.0

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