blob: 10a3c0aa83987be6e563ed8439e7872f1a9419b4 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
6 *
7 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
8 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
9 * Copyright (C) Darryl Miles G7LED (dlm@g7led.demon.co.uk)
10 * Copyright (C) Steven Whitehouse GW7RRM (stevew@acm.org)
11 * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
12 * Copyright (C) Hans-Joachim Hetscher DD8NE (dd8ne@bnv-bamberg.de)
13 * Copyright (C) Hans Alblas PE1AYX (hans@esrac.ele.tue.nl)
14 * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr)
15 */
Randy Dunlap4fc268d2006-01-11 12:17:47 -080016#include <linux/capability.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070017#include <linux/module.h>
18#include <linux/errno.h>
19#include <linux/types.h>
20#include <linux/socket.h>
21#include <linux/in.h>
22#include <linux/kernel.h>
23#include <linux/sched.h>
24#include <linux/timer.h>
25#include <linux/string.h>
26#include <linux/smp_lock.h>
27#include <linux/sockios.h>
28#include <linux/net.h>
29#include <net/ax25.h>
30#include <linux/inet.h>
31#include <linux/netdevice.h>
32#include <linux/if_arp.h>
33#include <linux/skbuff.h>
34#include <net/sock.h>
35#include <asm/uaccess.h>
36#include <asm/system.h>
37#include <linux/fcntl.h>
38#include <linux/termios.h> /* For TIOCINQ/OUTQ */
39#include <linux/mm.h>
40#include <linux/interrupt.h>
41#include <linux/notifier.h>
42#include <linux/proc_fs.h>
43#include <linux/stat.h>
44#include <linux/netfilter.h>
45#include <linux/sysctl.h>
46#include <linux/init.h>
47#include <linux/spinlock.h>
Arnaldo Carvalho de Meloc752f072005-08-09 20:08:28 -070048#include <net/tcp_states.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070049#include <net/ip.h>
50#include <net/arp.h>
51
52
53
54HLIST_HEAD(ax25_list);
55DEFINE_SPINLOCK(ax25_list_lock);
56
Eric Dumazet90ddc4f2005-12-22 12:49:22 -080057static const struct proto_ops ax25_proto_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -070058
59static void ax25_free_sock(struct sock *sk)
60{
61 ax25_cb_put(ax25_sk(sk));
62}
63
64/*
65 * Socket removal during an interrupt is now safe.
66 */
67static void ax25_cb_del(ax25_cb *ax25)
68{
69 if (!hlist_unhashed(&ax25->ax25_node)) {
70 spin_lock_bh(&ax25_list_lock);
71 hlist_del_init(&ax25->ax25_node);
72 spin_unlock_bh(&ax25_list_lock);
73 ax25_cb_put(ax25);
74 }
75}
76
77/*
78 * Kill all bound sockets on a dropped device.
79 */
80static void ax25_kill_by_device(struct net_device *dev)
81{
82 ax25_dev *ax25_dev;
83 ax25_cb *s;
84 struct hlist_node *node;
85
86 if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
87 return;
88
89 spin_lock_bh(&ax25_list_lock);
90 ax25_for_each(s, node, &ax25_list) {
91 if (s->ax25_dev == ax25_dev) {
92 s->ax25_dev = NULL;
93 ax25_disconnect(s, ENETUNREACH);
94 }
95 }
96 spin_unlock_bh(&ax25_list_lock);
97}
98
99/*
100 * Handle device status changes.
101 */
102static int ax25_device_event(struct notifier_block *this, unsigned long event,
103 void *ptr)
104{
105 struct net_device *dev = (struct net_device *)ptr;
106
107 /* Reject non AX.25 devices */
108 if (dev->type != ARPHRD_AX25)
109 return NOTIFY_DONE;
110
111 switch (event) {
112 case NETDEV_UP:
113 ax25_dev_device_up(dev);
114 break;
115 case NETDEV_DOWN:
116 ax25_kill_by_device(dev);
117 ax25_rt_device_down(dev);
118 ax25_dev_device_down(dev);
119 break;
120 default:
121 break;
122 }
123
124 return NOTIFY_DONE;
125}
126
127/*
128 * Add a socket to the bound sockets list.
129 */
130void ax25_cb_add(ax25_cb *ax25)
131{
132 spin_lock_bh(&ax25_list_lock);
133 ax25_cb_hold(ax25);
134 hlist_add_head(&ax25->ax25_node, &ax25_list);
135 spin_unlock_bh(&ax25_list_lock);
136}
137
138/*
139 * Find a socket that wants to accept the SABM we have just
140 * received.
141 */
142struct sock *ax25_find_listener(ax25_address *addr, int digi,
143 struct net_device *dev, int type)
144{
145 ax25_cb *s;
146 struct hlist_node *node;
147
148 spin_lock_bh(&ax25_list_lock);
149 ax25_for_each(s, node, &ax25_list) {
150 if ((s->iamdigi && !digi) || (!s->iamdigi && digi))
151 continue;
152 if (s->sk && !ax25cmp(&s->source_addr, addr) &&
153 s->sk->sk_type == type && s->sk->sk_state == TCP_LISTEN) {
154 /* If device is null we match any device */
155 if (s->ax25_dev == NULL || s->ax25_dev->dev == dev) {
156 sock_hold(s->sk);
157 spin_unlock_bh(&ax25_list_lock);
158 return s->sk;
159 }
160 }
161 }
162 spin_unlock_bh(&ax25_list_lock);
163
164 return NULL;
165}
166
167/*
168 * Find an AX.25 socket given both ends.
169 */
170struct sock *ax25_get_socket(ax25_address *my_addr, ax25_address *dest_addr,
171 int type)
172{
173 struct sock *sk = NULL;
174 ax25_cb *s;
175 struct hlist_node *node;
176
177 spin_lock_bh(&ax25_list_lock);
178 ax25_for_each(s, node, &ax25_list) {
179 if (s->sk && !ax25cmp(&s->source_addr, my_addr) &&
180 !ax25cmp(&s->dest_addr, dest_addr) &&
181 s->sk->sk_type == type) {
182 sk = s->sk;
183 sock_hold(sk);
184 break;
185 }
186 }
187
188 spin_unlock_bh(&ax25_list_lock);
189
190 return sk;
191}
192
193/*
194 * Find an AX.25 control block given both ends. It will only pick up
195 * floating AX.25 control blocks or non Raw socket bound control blocks.
196 */
197ax25_cb *ax25_find_cb(ax25_address *src_addr, ax25_address *dest_addr,
198 ax25_digi *digi, struct net_device *dev)
199{
200 ax25_cb *s;
201 struct hlist_node *node;
202
203 spin_lock_bh(&ax25_list_lock);
204 ax25_for_each(s, node, &ax25_list) {
205 if (s->sk && s->sk->sk_type != SOCK_SEQPACKET)
206 continue;
207 if (s->ax25_dev == NULL)
208 continue;
209 if (ax25cmp(&s->source_addr, src_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->ax25_dev->dev == dev) {
210 if (digi != NULL && digi->ndigi != 0) {
211 if (s->digipeat == NULL)
212 continue;
213 if (ax25digicmp(s->digipeat, digi) != 0)
214 continue;
215 } else {
216 if (s->digipeat != NULL && s->digipeat->ndigi != 0)
217 continue;
218 }
219 ax25_cb_hold(s);
220 spin_unlock_bh(&ax25_list_lock);
221
222 return s;
223 }
224 }
225 spin_unlock_bh(&ax25_list_lock);
226
227 return NULL;
228}
229
Ralf Baechle70868ea2006-05-03 23:25:17 -0700230EXPORT_SYMBOL(ax25_find_cb);
231
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto)
233{
234 ax25_cb *s;
235 struct sk_buff *copy;
236 struct hlist_node *node;
237
238 spin_lock_bh(&ax25_list_lock);
239 ax25_for_each(s, node, &ax25_list) {
240 if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 &&
241 s->sk->sk_type == SOCK_RAW &&
242 s->sk->sk_protocol == proto &&
243 s->ax25_dev->dev == skb->dev &&
244 atomic_read(&s->sk->sk_rmem_alloc) <= s->sk->sk_rcvbuf) {
245 if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
246 continue;
247 if (sock_queue_rcv_skb(s->sk, copy) != 0)
248 kfree_skb(copy);
249 }
250 }
251 spin_unlock_bh(&ax25_list_lock);
252}
253
254/*
255 * Deferred destroy.
256 */
257void ax25_destroy_socket(ax25_cb *);
258
259/*
260 * Handler for deferred kills.
261 */
262static void ax25_destroy_timer(unsigned long data)
263{
264 ax25_cb *ax25=(ax25_cb *)data;
265 struct sock *sk;
266
267 sk=ax25->sk;
268
269 bh_lock_sock(sk);
270 sock_hold(sk);
271 ax25_destroy_socket(ax25);
272 bh_unlock_sock(sk);
273 sock_put(sk);
274}
275
276/*
277 * This is called from user mode and the timers. Thus it protects itself
278 * against interrupt users but doesn't worry about being called during
279 * work. Once it is removed from the queue no interrupt or bottom half
280 * will touch it and we are (fairly 8-) ) safe.
281 */
282void ax25_destroy_socket(ax25_cb *ax25)
283{
284 struct sk_buff *skb;
285
286 ax25_cb_del(ax25);
287
288 ax25_stop_heartbeat(ax25);
289 ax25_stop_t1timer(ax25);
290 ax25_stop_t2timer(ax25);
291 ax25_stop_t3timer(ax25);
292 ax25_stop_idletimer(ax25);
293
294 ax25_clear_queues(ax25); /* Flush the queues */
295
296 if (ax25->sk != NULL) {
297 while ((skb = skb_dequeue(&ax25->sk->sk_receive_queue)) != NULL) {
298 if (skb->sk != ax25->sk) {
299 /* A pending connection */
300 ax25_cb *sax25 = ax25_sk(skb->sk);
301
302 /* Queue the unaccepted socket for death */
303 sock_orphan(skb->sk);
304
305 ax25_start_heartbeat(sax25);
306 sax25->state = AX25_STATE_0;
307 }
308
309 kfree_skb(skb);
310 }
311 skb_queue_purge(&ax25->sk->sk_write_queue);
312 }
313
314 if (ax25->sk != NULL) {
315 if (atomic_read(&ax25->sk->sk_wmem_alloc) ||
316 atomic_read(&ax25->sk->sk_rmem_alloc)) {
317 /* Defer: outstanding buffers */
318 init_timer(&ax25->dtimer);
319 ax25->dtimer.expires = jiffies + 2 * HZ;
320 ax25->dtimer.function = ax25_destroy_timer;
321 ax25->dtimer.data = (unsigned long)ax25;
322 add_timer(&ax25->dtimer);
323 } else {
324 struct sock *sk=ax25->sk;
325 ax25->sk=NULL;
326 sock_put(sk);
327 }
328 } else {
329 ax25_cb_put(ax25);
330 }
331}
332
333/*
334 * dl1bke 960311: set parameters for existing AX.25 connections,
335 * includes a KILL command to abort any connection.
336 * VERY useful for debugging ;-)
337 */
338static int ax25_ctl_ioctl(const unsigned int cmd, void __user *arg)
339{
340 struct ax25_ctl_struct ax25_ctl;
341 ax25_digi digi;
342 ax25_dev *ax25_dev;
343 ax25_cb *ax25;
344 unsigned int k;
345
346 if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
347 return -EFAULT;
348
349 if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
350 return -ENODEV;
351
352 if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
353 return -EINVAL;
354
355 digi.ndigi = ax25_ctl.digi_count;
356 for (k = 0; k < digi.ndigi; k++)
357 digi.calls[k] = ax25_ctl.digi_addr[k];
358
359 if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
360 return -ENOTCONN;
361
362 switch (ax25_ctl.cmd) {
363 case AX25_KILL:
364 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
365#ifdef CONFIG_AX25_DAMA_SLAVE
366 if (ax25_dev->dama.slave && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
367 ax25_dama_off(ax25);
368#endif
369 ax25_disconnect(ax25, ENETRESET);
370 break;
371
372 case AX25_WINDOW:
373 if (ax25->modulus == AX25_MODULUS) {
374 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
375 return -EINVAL;
376 } else {
377 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
378 return -EINVAL;
379 }
380 ax25->window = ax25_ctl.arg;
381 break;
382
383 case AX25_T1:
384 if (ax25_ctl.arg < 1)
385 return -EINVAL;
386 ax25->rtt = (ax25_ctl.arg * HZ) / 2;
387 ax25->t1 = ax25_ctl.arg * HZ;
388 break;
389
390 case AX25_T2:
391 if (ax25_ctl.arg < 1)
392 return -EINVAL;
393 ax25->t2 = ax25_ctl.arg * HZ;
394 break;
395
396 case AX25_N2:
397 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
398 return -EINVAL;
399 ax25->n2count = 0;
400 ax25->n2 = ax25_ctl.arg;
401 break;
402
403 case AX25_T3:
404 if (ax25_ctl.arg < 0)
405 return -EINVAL;
406 ax25->t3 = ax25_ctl.arg * HZ;
407 break;
408
409 case AX25_IDLE:
410 if (ax25_ctl.arg < 0)
411 return -EINVAL;
412 ax25->idle = ax25_ctl.arg * 60 * HZ;
413 break;
414
415 case AX25_PACLEN:
416 if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
417 return -EINVAL;
418 ax25->paclen = ax25_ctl.arg;
419 break;
420
421 default:
422 return -EINVAL;
423 }
424
425 return 0;
426}
427
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700428static void ax25_fillin_cb_from_dev(ax25_cb *ax25, ax25_dev *ax25_dev)
429{
430 ax25->rtt = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]) / 2;
431 ax25->t1 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]);
432 ax25->t2 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T2]);
433 ax25->t3 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T3]);
434 ax25->n2 = ax25_dev->values[AX25_VALUES_N2];
435 ax25->paclen = ax25_dev->values[AX25_VALUES_PACLEN];
436 ax25->idle = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_IDLE]);
437 ax25->backoff = ax25_dev->values[AX25_VALUES_BACKOFF];
438
439 if (ax25_dev->values[AX25_VALUES_AXDEFMODE]) {
440 ax25->modulus = AX25_EMODULUS;
441 ax25->window = ax25_dev->values[AX25_VALUES_EWINDOW];
442 } else {
443 ax25->modulus = AX25_MODULUS;
444 ax25->window = ax25_dev->values[AX25_VALUES_WINDOW];
445 }
446}
447
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448/*
449 * Fill in a created AX.25 created control block with the default
450 * values for a particular device.
451 */
452void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
453{
454 ax25->ax25_dev = ax25_dev;
455
456 if (ax25->ax25_dev != NULL) {
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700457 ax25_fillin_cb_from_dev(ax25, ax25_dev);
458 return;
459 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700461 /*
462 * No device, use kernel / AX.25 spec default values
463 */
464 ax25->rtt = msecs_to_jiffies(AX25_DEF_T1) / 2;
465 ax25->t1 = msecs_to_jiffies(AX25_DEF_T1);
466 ax25->t2 = msecs_to_jiffies(AX25_DEF_T2);
467 ax25->t3 = msecs_to_jiffies(AX25_DEF_T3);
468 ax25->n2 = AX25_DEF_N2;
469 ax25->paclen = AX25_DEF_PACLEN;
470 ax25->idle = msecs_to_jiffies(AX25_DEF_IDLE);
471 ax25->backoff = AX25_DEF_BACKOFF;
472
473 if (AX25_DEF_AXDEFMODE) {
474 ax25->modulus = AX25_EMODULUS;
475 ax25->window = AX25_DEF_EWINDOW;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476 } else {
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700477 ax25->modulus = AX25_MODULUS;
478 ax25->window = AX25_DEF_WINDOW;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479 }
480}
481
482/*
483 * Create an empty AX.25 control block.
484 */
485ax25_cb *ax25_create_cb(void)
486{
487 ax25_cb *ax25;
488
489 if ((ax25 = kmalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
490 return NULL;
491
492 memset(ax25, 0x00, sizeof(*ax25));
493 atomic_set(&ax25->refcount, 1);
494
495 skb_queue_head_init(&ax25->write_queue);
496 skb_queue_head_init(&ax25->frag_queue);
497 skb_queue_head_init(&ax25->ack_queue);
498 skb_queue_head_init(&ax25->reseq_queue);
499
500 init_timer(&ax25->timer);
501 init_timer(&ax25->t1timer);
502 init_timer(&ax25->t2timer);
503 init_timer(&ax25->t3timer);
504 init_timer(&ax25->idletimer);
505
506 ax25_fillin_cb(ax25, NULL);
507
508 ax25->state = AX25_STATE_0;
509
510 return ax25;
511}
512
513/*
514 * Handling for system calls applied via the various interfaces to an
515 * AX25 socket object
516 */
517
518static int ax25_setsockopt(struct socket *sock, int level, int optname,
519 char __user *optval, int optlen)
520{
521 struct sock *sk = sock->sk;
522 ax25_cb *ax25;
523 struct net_device *dev;
524 char devname[IFNAMSIZ];
525 int opt, res = 0;
526
527 if (level != SOL_AX25)
528 return -ENOPROTOOPT;
529
530 if (optlen < sizeof(int))
531 return -EINVAL;
532
533 if (get_user(opt, (int __user *)optval))
534 return -EFAULT;
535
536 lock_sock(sk);
537 ax25 = ax25_sk(sk);
538
539 switch (optname) {
540 case AX25_WINDOW:
541 if (ax25->modulus == AX25_MODULUS) {
542 if (opt < 1 || opt > 7) {
543 res = -EINVAL;
544 break;
545 }
546 } else {
547 if (opt < 1 || opt > 63) {
548 res = -EINVAL;
549 break;
550 }
551 }
552 ax25->window = opt;
553 break;
554
555 case AX25_T1:
556 if (opt < 1) {
557 res = -EINVAL;
558 break;
559 }
560 ax25->rtt = (opt * HZ) / 2;
561 ax25->t1 = opt * HZ;
562 break;
563
564 case AX25_T2:
565 if (opt < 1) {
566 res = -EINVAL;
567 break;
568 }
569 ax25->t2 = opt * HZ;
570 break;
571
572 case AX25_N2:
573 if (opt < 1 || opt > 31) {
574 res = -EINVAL;
575 break;
576 }
577 ax25->n2 = opt;
578 break;
579
580 case AX25_T3:
581 if (opt < 1) {
582 res = -EINVAL;
583 break;
584 }
585 ax25->t3 = opt * HZ;
586 break;
587
588 case AX25_IDLE:
589 if (opt < 0) {
590 res = -EINVAL;
591 break;
592 }
593 ax25->idle = opt * 60 * HZ;
594 break;
595
596 case AX25_BACKOFF:
597 if (opt < 0 || opt > 2) {
598 res = -EINVAL;
599 break;
600 }
601 ax25->backoff = opt;
602 break;
603
604 case AX25_EXTSEQ:
605 ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
606 break;
607
608 case AX25_PIDINCL:
609 ax25->pidincl = opt ? 1 : 0;
610 break;
611
612 case AX25_IAMDIGI:
613 ax25->iamdigi = opt ? 1 : 0;
614 break;
615
616 case AX25_PACLEN:
617 if (opt < 16 || opt > 65535) {
618 res = -EINVAL;
619 break;
620 }
621 ax25->paclen = opt;
622 break;
623
624 case SO_BINDTODEVICE:
625 if (optlen > IFNAMSIZ)
626 optlen=IFNAMSIZ;
627 if (copy_from_user(devname, optval, optlen)) {
628 res = -EFAULT;
629 break;
630 }
631
632 dev = dev_get_by_name(devname);
633 if (dev == NULL) {
634 res = -ENODEV;
635 break;
636 }
637
638 if (sk->sk_type == SOCK_SEQPACKET &&
639 (sock->state != SS_UNCONNECTED ||
640 sk->sk_state == TCP_LISTEN)) {
641 res = -EADDRNOTAVAIL;
642 dev_put(dev);
643 break;
644 }
645
646 ax25->ax25_dev = ax25_dev_ax25dev(dev);
647 ax25_fillin_cb(ax25, ax25->ax25_dev);
648 break;
649
650 default:
651 res = -ENOPROTOOPT;
652 }
653 release_sock(sk);
654
655 return res;
656}
657
658static int ax25_getsockopt(struct socket *sock, int level, int optname,
659 char __user *optval, int __user *optlen)
660{
661 struct sock *sk = sock->sk;
662 ax25_cb *ax25;
663 struct ax25_dev *ax25_dev;
664 char devname[IFNAMSIZ];
665 void *valptr;
666 int val = 0;
667 int maxlen, length;
668
669 if (level != SOL_AX25)
670 return -ENOPROTOOPT;
671
672 if (get_user(maxlen, optlen))
673 return -EFAULT;
674
675 if (maxlen < 1)
676 return -EFAULT;
677
678 valptr = (void *) &val;
679 length = min_t(unsigned int, maxlen, sizeof(int));
680
681 lock_sock(sk);
682 ax25 = ax25_sk(sk);
683
684 switch (optname) {
685 case AX25_WINDOW:
686 val = ax25->window;
687 break;
688
689 case AX25_T1:
690 val = ax25->t1 / HZ;
691 break;
692
693 case AX25_T2:
694 val = ax25->t2 / HZ;
695 break;
696
697 case AX25_N2:
698 val = ax25->n2;
699 break;
700
701 case AX25_T3:
702 val = ax25->t3 / HZ;
703 break;
704
705 case AX25_IDLE:
706 val = ax25->idle / (60 * HZ);
707 break;
708
709 case AX25_BACKOFF:
710 val = ax25->backoff;
711 break;
712
713 case AX25_EXTSEQ:
714 val = (ax25->modulus == AX25_EMODULUS);
715 break;
716
717 case AX25_PIDINCL:
718 val = ax25->pidincl;
719 break;
720
721 case AX25_IAMDIGI:
722 val = ax25->iamdigi;
723 break;
724
725 case AX25_PACLEN:
726 val = ax25->paclen;
727 break;
728
729 case SO_BINDTODEVICE:
730 ax25_dev = ax25->ax25_dev;
731
732 if (ax25_dev != NULL && ax25_dev->dev != NULL) {
733 strlcpy(devname, ax25_dev->dev->name, sizeof(devname));
734 length = strlen(devname) + 1;
735 } else {
736 *devname = '\0';
737 length = 1;
738 }
739
740 valptr = (void *) devname;
741 break;
742
743 default:
744 release_sock(sk);
745 return -ENOPROTOOPT;
746 }
747 release_sock(sk);
748
749 if (put_user(length, optlen))
750 return -EFAULT;
751
752 return copy_to_user(optval, valptr, length) ? -EFAULT : 0;
753}
754
755static int ax25_listen(struct socket *sock, int backlog)
756{
757 struct sock *sk = sock->sk;
758 int res = 0;
759
760 lock_sock(sk);
761 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_LISTEN) {
762 sk->sk_max_ack_backlog = backlog;
763 sk->sk_state = TCP_LISTEN;
764 goto out;
765 }
766 res = -EOPNOTSUPP;
767
768out:
769 release_sock(sk);
770
771 return res;
772}
773
774/*
775 * XXX: when creating ax25_sock we should update the .obj_size setting
776 * below.
777 */
778static struct proto ax25_proto = {
779 .name = "AX25",
780 .owner = THIS_MODULE,
781 .obj_size = sizeof(struct sock),
782};
783
784static int ax25_create(struct socket *sock, int protocol)
785{
786 struct sock *sk;
787 ax25_cb *ax25;
788
789 switch (sock->type) {
790 case SOCK_DGRAM:
791 if (protocol == 0 || protocol == PF_AX25)
792 protocol = AX25_P_TEXT;
793 break;
794
795 case SOCK_SEQPACKET:
796 switch (protocol) {
797 case 0:
798 case PF_AX25: /* For CLX */
799 protocol = AX25_P_TEXT;
800 break;
801 case AX25_P_SEGMENT:
802#ifdef CONFIG_INET
803 case AX25_P_ARP:
804 case AX25_P_IP:
805#endif
806#ifdef CONFIG_NETROM
807 case AX25_P_NETROM:
808#endif
809#ifdef CONFIG_ROSE
810 case AX25_P_ROSE:
811#endif
812 return -ESOCKTNOSUPPORT;
813#ifdef CONFIG_NETROM_MODULE
814 case AX25_P_NETROM:
815 if (ax25_protocol_is_registered(AX25_P_NETROM))
816 return -ESOCKTNOSUPPORT;
817#endif
818#ifdef CONFIG_ROSE_MODULE
819 case AX25_P_ROSE:
820 if (ax25_protocol_is_registered(AX25_P_ROSE))
821 return -ESOCKTNOSUPPORT;
822#endif
823 default:
824 break;
825 }
826 break;
827
828 case SOCK_RAW:
829 break;
830 default:
831 return -ESOCKTNOSUPPORT;
832 }
833
834 if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, &ax25_proto, 1)) == NULL)
835 return -ENOMEM;
836
837 ax25 = sk->sk_protinfo = ax25_create_cb();
838 if (!ax25) {
839 sk_free(sk);
840 return -ENOMEM;
841 }
842
843 sock_init_data(sock, sk);
844
845 sk->sk_destruct = ax25_free_sock;
846 sock->ops = &ax25_proto_ops;
847 sk->sk_protocol = protocol;
848
849 ax25->sk = sk;
850
851 return 0;
852}
853
854struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
855{
856 struct sock *sk;
857 ax25_cb *ax25, *oax25;
858
859 if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, osk->sk_prot, 1)) == NULL)
860 return NULL;
861
862 if ((ax25 = ax25_create_cb()) == NULL) {
863 sk_free(sk);
864 return NULL;
865 }
866
867 switch (osk->sk_type) {
868 case SOCK_DGRAM:
869 break;
870 case SOCK_SEQPACKET:
871 break;
872 default:
873 sk_free(sk);
874 ax25_cb_put(ax25);
875 return NULL;
876 }
877
878 sock_init_data(NULL, sk);
879
880 sk->sk_destruct = ax25_free_sock;
881 sk->sk_type = osk->sk_type;
882 sk->sk_socket = osk->sk_socket;
883 sk->sk_priority = osk->sk_priority;
884 sk->sk_protocol = osk->sk_protocol;
885 sk->sk_rcvbuf = osk->sk_rcvbuf;
886 sk->sk_sndbuf = osk->sk_sndbuf;
887 sk->sk_state = TCP_ESTABLISHED;
888 sk->sk_sleep = osk->sk_sleep;
Ralf Baechle53b924b2005-08-23 10:11:30 -0700889 sock_copy_flags(sk, osk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890
891 oax25 = ax25_sk(osk);
892
893 ax25->modulus = oax25->modulus;
894 ax25->backoff = oax25->backoff;
895 ax25->pidincl = oax25->pidincl;
896 ax25->iamdigi = oax25->iamdigi;
897 ax25->rtt = oax25->rtt;
898 ax25->t1 = oax25->t1;
899 ax25->t2 = oax25->t2;
900 ax25->t3 = oax25->t3;
901 ax25->n2 = oax25->n2;
902 ax25->idle = oax25->idle;
903 ax25->paclen = oax25->paclen;
904 ax25->window = oax25->window;
905
906 ax25->ax25_dev = ax25_dev;
907 ax25->source_addr = oax25->source_addr;
908
909 if (oax25->digipeat != NULL) {
910 if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
911 sk_free(sk);
912 ax25_cb_put(ax25);
913 return NULL;
914 }
915
916 memcpy(ax25->digipeat, oax25->digipeat, sizeof(ax25_digi));
917 }
918
919 sk->sk_protinfo = ax25;
920 ax25->sk = sk;
921
922 return sk;
923}
924
925static int ax25_release(struct socket *sock)
926{
927 struct sock *sk = sock->sk;
928 ax25_cb *ax25;
929
930 if (sk == NULL)
931 return 0;
932
933 sock_hold(sk);
934 sock_orphan(sk);
935 lock_sock(sk);
936 ax25 = ax25_sk(sk);
937
938 if (sk->sk_type == SOCK_SEQPACKET) {
939 switch (ax25->state) {
940 case AX25_STATE_0:
941 release_sock(sk);
942 ax25_disconnect(ax25, 0);
943 lock_sock(sk);
944 ax25_destroy_socket(ax25);
945 break;
946
947 case AX25_STATE_1:
948 case AX25_STATE_2:
949 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
950 release_sock(sk);
951 ax25_disconnect(ax25, 0);
952 lock_sock(sk);
953 ax25_destroy_socket(ax25);
954 break;
955
956 case AX25_STATE_3:
957 case AX25_STATE_4:
958 ax25_clear_queues(ax25);
959 ax25->n2count = 0;
960
961 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
962 case AX25_PROTO_STD_SIMPLEX:
963 case AX25_PROTO_STD_DUPLEX:
964 ax25_send_control(ax25,
965 AX25_DISC,
966 AX25_POLLON,
967 AX25_COMMAND);
968 ax25_stop_t2timer(ax25);
969 ax25_stop_t3timer(ax25);
970 ax25_stop_idletimer(ax25);
971 break;
972#ifdef CONFIG_AX25_DAMA_SLAVE
973 case AX25_PROTO_DAMA_SLAVE:
974 ax25_stop_t3timer(ax25);
975 ax25_stop_idletimer(ax25);
976 break;
977#endif
978 }
979 ax25_calculate_t1(ax25);
980 ax25_start_t1timer(ax25);
981 ax25->state = AX25_STATE_2;
982 sk->sk_state = TCP_CLOSE;
983 sk->sk_shutdown |= SEND_SHUTDOWN;
984 sk->sk_state_change(sk);
985 sock_set_flag(sk, SOCK_DESTROY);
986 break;
987
988 default:
989 break;
990 }
991 } else {
992 sk->sk_state = TCP_CLOSE;
993 sk->sk_shutdown |= SEND_SHUTDOWN;
994 sk->sk_state_change(sk);
995 ax25_destroy_socket(ax25);
996 }
997
998 sock->sk = NULL;
999 release_sock(sk);
1000 sock_put(sk);
1001
1002 return 0;
1003}
1004
1005/*
1006 * We support a funny extension here so you can (as root) give any callsign
1007 * digipeated via a local address as source. This hack is obsolete now
1008 * that we've implemented support for SO_BINDTODEVICE. It is however small
1009 * and trivially backward compatible.
1010 */
1011static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1012{
1013 struct sock *sk = sock->sk;
1014 struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
1015 ax25_dev *ax25_dev = NULL;
Ralf Baechle01d7dd02005-08-23 10:11:45 -07001016 ax25_uid_assoc *user;
1017 ax25_address call;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018 ax25_cb *ax25;
1019 int err = 0;
1020
1021 if (addr_len != sizeof(struct sockaddr_ax25) &&
1022 addr_len != sizeof(struct full_sockaddr_ax25)) {
1023 /* support for old structure may go away some time */
1024 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1025 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1026 return -EINVAL;
1027 }
1028
1029 printk(KERN_WARNING "ax25_bind(): %s uses old (6 digipeater) socket structure.\n",
1030 current->comm);
1031 }
1032
1033 if (addr->fsa_ax25.sax25_family != AF_AX25)
1034 return -EINVAL;
1035
Ralf Baechle01d7dd02005-08-23 10:11:45 -07001036 user = ax25_findbyuid(current->euid);
1037 if (user) {
1038 call = user->call;
1039 ax25_uid_put(user);
1040 } else {
1041 if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
1042 return -EACCES;
1043
1044 call = addr->fsa_ax25.sax25_call;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001045 }
1046
1047 lock_sock(sk);
1048
1049 ax25 = ax25_sk(sk);
1050 if (!sock_flag(sk, SOCK_ZAPPED)) {
1051 err = -EINVAL;
1052 goto out;
1053 }
1054
Ralf Baechle01d7dd02005-08-23 10:11:45 -07001055 ax25->source_addr = call;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056
1057 /*
1058 * User already set interface with SO_BINDTODEVICE
1059 */
1060 if (ax25->ax25_dev != NULL)
1061 goto done;
1062
1063 if (addr_len > sizeof(struct sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
1064 if (ax25cmp(&addr->fsa_digipeater[0], &null_ax25_address) != 0 &&
1065 (ax25_dev = ax25_addr_ax25dev(&addr->fsa_digipeater[0])) == NULL) {
1066 err = -EADDRNOTAVAIL;
1067 goto out;
1068 }
1069 } else {
1070 if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL) {
1071 err = -EADDRNOTAVAIL;
1072 goto out;
1073 }
1074 }
1075
1076 if (ax25_dev != NULL)
1077 ax25_fillin_cb(ax25, ax25_dev);
1078
1079done:
1080 ax25_cb_add(ax25);
1081 sock_reset_flag(sk, SOCK_ZAPPED);
1082
1083out:
1084 release_sock(sk);
1085
1086 return 0;
1087}
1088
1089/*
1090 * FIXME: nonblock behaviour looks like it may have a bug.
1091 */
1092static int ax25_connect(struct socket *sock, struct sockaddr *uaddr,
1093 int addr_len, int flags)
1094{
1095 struct sock *sk = sock->sk;
1096 ax25_cb *ax25 = ax25_sk(sk), *ax25t;
1097 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1098 ax25_digi *digi = NULL;
1099 int ct = 0, err = 0;
1100
1101 /*
1102 * some sanity checks. code further down depends on this
1103 */
1104
1105 if (addr_len == sizeof(struct sockaddr_ax25)) {
1106 /* support for this will go away in early 2.5.x */
1107 printk(KERN_WARNING "ax25_connect(): %s uses obsolete socket structure\n",
1108 current->comm);
1109 }
1110 else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
1111 /* support for old structure may go away some time */
1112 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1113 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1114 return -EINVAL;
1115 }
1116
1117 printk(KERN_WARNING "ax25_connect(): %s uses old (6 digipeater) socket structure.\n",
1118 current->comm);
1119 }
1120
1121 if (fsa->fsa_ax25.sax25_family != AF_AX25)
1122 return -EINVAL;
1123
1124 lock_sock(sk);
1125
1126 /* deal with restarts */
1127 if (sock->state == SS_CONNECTING) {
1128 switch (sk->sk_state) {
1129 case TCP_SYN_SENT: /* still trying */
1130 err = -EINPROGRESS;
1131 goto out;
1132
1133 case TCP_ESTABLISHED: /* connection established */
1134 sock->state = SS_CONNECTED;
1135 goto out;
1136
1137 case TCP_CLOSE: /* connection refused */
1138 sock->state = SS_UNCONNECTED;
1139 err = -ECONNREFUSED;
1140 goto out;
1141 }
1142 }
1143
1144 if (sk->sk_state == TCP_ESTABLISHED && sk->sk_type == SOCK_SEQPACKET) {
1145 err = -EISCONN; /* No reconnect on a seqpacket socket */
1146 goto out;
1147 }
1148
1149 sk->sk_state = TCP_CLOSE;
1150 sock->state = SS_UNCONNECTED;
1151
Jesper Juhla51482b2005-11-08 09:41:34 -08001152 kfree(ax25->digipeat);
1153 ax25->digipeat = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154
1155 /*
1156 * Handle digi-peaters to be used.
1157 */
1158 if (addr_len > sizeof(struct sockaddr_ax25) &&
1159 fsa->fsa_ax25.sax25_ndigis != 0) {
1160 /* Valid number of digipeaters ? */
1161 if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS) {
1162 err = -EINVAL;
1163 goto out;
1164 }
1165
1166 if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
1167 err = -ENOBUFS;
1168 goto out;
1169 }
1170
1171 digi->ndigi = fsa->fsa_ax25.sax25_ndigis;
1172 digi->lastrepeat = -1;
1173
1174 while (ct < fsa->fsa_ax25.sax25_ndigis) {
1175 if ((fsa->fsa_digipeater[ct].ax25_call[6] &
1176 AX25_HBIT) && ax25->iamdigi) {
1177 digi->repeated[ct] = 1;
1178 digi->lastrepeat = ct;
1179 } else {
1180 digi->repeated[ct] = 0;
1181 }
1182 digi->calls[ct] = fsa->fsa_digipeater[ct];
1183 ct++;
1184 }
1185 }
1186
1187 /*
1188 * Must bind first - autobinding in this may or may not work. If
1189 * the socket is already bound, check to see if the device has
1190 * been filled in, error if it hasn't.
1191 */
1192 if (sock_flag(sk, SOCK_ZAPPED)) {
1193 /* check if we can remove this feature. It is broken. */
1194 printk(KERN_WARNING "ax25_connect(): %s uses autobind, please contact jreuter@yaina.de\n",
1195 current->comm);
1196 if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) {
1197 kfree(digi);
1198 goto out;
1199 }
1200
1201 ax25_fillin_cb(ax25, ax25->ax25_dev);
1202 ax25_cb_add(ax25);
1203 } else {
1204 if (ax25->ax25_dev == NULL) {
1205 kfree(digi);
1206 err = -EHOSTUNREACH;
1207 goto out;
1208 }
1209 }
1210
1211 if (sk->sk_type == SOCK_SEQPACKET &&
1212 (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
1213 ax25->ax25_dev->dev))) {
1214 kfree(digi);
1215 err = -EADDRINUSE; /* Already such a connection */
1216 ax25_cb_put(ax25t);
1217 goto out;
1218 }
1219
1220 ax25->dest_addr = fsa->fsa_ax25.sax25_call;
1221 ax25->digipeat = digi;
1222
1223 /* First the easy one */
1224 if (sk->sk_type != SOCK_SEQPACKET) {
1225 sock->state = SS_CONNECTED;
1226 sk->sk_state = TCP_ESTABLISHED;
1227 goto out;
1228 }
1229
1230 /* Move to connecting socket, ax.25 lapb WAIT_UA.. */
1231 sock->state = SS_CONNECTING;
1232 sk->sk_state = TCP_SYN_SENT;
1233
1234 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1235 case AX25_PROTO_STD_SIMPLEX:
1236 case AX25_PROTO_STD_DUPLEX:
1237 ax25_std_establish_data_link(ax25);
1238 break;
1239
1240#ifdef CONFIG_AX25_DAMA_SLAVE
1241 case AX25_PROTO_DAMA_SLAVE:
1242 ax25->modulus = AX25_MODULUS;
1243 ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
1244 if (ax25->ax25_dev->dama.slave)
1245 ax25_ds_establish_data_link(ax25);
1246 else
1247 ax25_std_establish_data_link(ax25);
1248 break;
1249#endif
1250 }
1251
1252 ax25->state = AX25_STATE_1;
1253
1254 ax25_start_heartbeat(ax25);
1255
1256 /* Now the loop */
1257 if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) {
1258 err = -EINPROGRESS;
1259 goto out;
1260 }
1261
1262 if (sk->sk_state == TCP_SYN_SENT) {
1263 struct task_struct *tsk = current;
1264 DECLARE_WAITQUEUE(wait, tsk);
1265
1266 add_wait_queue(sk->sk_sleep, &wait);
1267 for (;;) {
1268 if (sk->sk_state != TCP_SYN_SENT)
1269 break;
1270 set_current_state(TASK_INTERRUPTIBLE);
1271 release_sock(sk);
1272 if (!signal_pending(tsk)) {
1273 schedule();
1274 lock_sock(sk);
1275 continue;
1276 }
1277 current->state = TASK_RUNNING;
1278 remove_wait_queue(sk->sk_sleep, &wait);
1279 return -ERESTARTSYS;
1280 }
1281 current->state = TASK_RUNNING;
1282 remove_wait_queue(sk->sk_sleep, &wait);
1283 }
1284
1285 if (sk->sk_state != TCP_ESTABLISHED) {
1286 /* Not in ABM, not in WAIT_UA -> failed */
1287 sock->state = SS_UNCONNECTED;
1288 err = sock_error(sk); /* Always set at this point */
1289 goto out;
1290 }
1291
1292 sock->state = SS_CONNECTED;
1293
1294 err=0;
1295out:
1296 release_sock(sk);
1297
1298 return err;
1299}
1300
1301
1302static int ax25_accept(struct socket *sock, struct socket *newsock, int flags)
1303{
1304 struct task_struct *tsk = current;
1305 DECLARE_WAITQUEUE(wait, tsk);
1306 struct sk_buff *skb;
1307 struct sock *newsk;
1308 struct sock *sk;
1309 int err = 0;
1310
1311 if (sock->state != SS_UNCONNECTED)
1312 return -EINVAL;
1313
1314 if ((sk = sock->sk) == NULL)
1315 return -EINVAL;
1316
1317 lock_sock(sk);
1318 if (sk->sk_type != SOCK_SEQPACKET) {
1319 err = -EOPNOTSUPP;
1320 goto out;
1321 }
1322
1323 if (sk->sk_state != TCP_LISTEN) {
1324 err = -EINVAL;
1325 goto out;
1326 }
1327
1328 /*
1329 * The read queue this time is holding sockets ready to use
1330 * hooked into the SABM we saved
1331 */
1332 add_wait_queue(sk->sk_sleep, &wait);
1333 for (;;) {
1334 skb = skb_dequeue(&sk->sk_receive_queue);
1335 if (skb)
1336 break;
1337
1338 release_sock(sk);
1339 current->state = TASK_INTERRUPTIBLE;
1340 if (flags & O_NONBLOCK) {
1341 current->state = TASK_RUNNING;
1342 remove_wait_queue(sk->sk_sleep, &wait);
1343 return -EWOULDBLOCK;
1344 }
1345 if (!signal_pending(tsk)) {
1346 schedule();
1347 lock_sock(sk);
1348 continue;
1349 }
1350 current->state = TASK_RUNNING;
1351 remove_wait_queue(sk->sk_sleep, &wait);
1352 return -ERESTARTSYS;
1353 }
1354 current->state = TASK_RUNNING;
1355 remove_wait_queue(sk->sk_sleep, &wait);
1356
1357 newsk = skb->sk;
1358 newsk->sk_socket = newsock;
1359 newsk->sk_sleep = &newsock->wait;
1360
1361 /* Now attach up the new socket */
1362 kfree_skb(skb);
1363 sk->sk_ack_backlog--;
1364 newsock->sk = newsk;
1365 newsock->state = SS_CONNECTED;
1366
1367out:
1368 release_sock(sk);
1369
1370 return err;
1371}
1372
1373static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
1374 int *uaddr_len, int peer)
1375{
1376 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1377 struct sock *sk = sock->sk;
1378 unsigned char ndigi, i;
1379 ax25_cb *ax25;
1380 int err = 0;
1381
1382 lock_sock(sk);
1383 ax25 = ax25_sk(sk);
1384
1385 if (peer != 0) {
1386 if (sk->sk_state != TCP_ESTABLISHED) {
1387 err = -ENOTCONN;
1388 goto out;
1389 }
1390
1391 fsa->fsa_ax25.sax25_family = AF_AX25;
1392 fsa->fsa_ax25.sax25_call = ax25->dest_addr;
1393 fsa->fsa_ax25.sax25_ndigis = 0;
1394
1395 if (ax25->digipeat != NULL) {
1396 ndigi = ax25->digipeat->ndigi;
1397 fsa->fsa_ax25.sax25_ndigis = ndigi;
1398 for (i = 0; i < ndigi; i++)
1399 fsa->fsa_digipeater[i] =
1400 ax25->digipeat->calls[i];
1401 }
1402 } else {
1403 fsa->fsa_ax25.sax25_family = AF_AX25;
1404 fsa->fsa_ax25.sax25_call = ax25->source_addr;
1405 fsa->fsa_ax25.sax25_ndigis = 1;
1406 if (ax25->ax25_dev != NULL) {
1407 memcpy(&fsa->fsa_digipeater[0],
1408 ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
1409 } else {
1410 fsa->fsa_digipeater[0] = null_ax25_address;
1411 }
1412 }
1413 *uaddr_len = sizeof (struct full_sockaddr_ax25);
1414
1415out:
1416 release_sock(sk);
1417
1418 return err;
1419}
1420
1421static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
1422 struct msghdr *msg, size_t len)
1423{
1424 struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
1425 struct sock *sk = sock->sk;
1426 struct sockaddr_ax25 sax;
1427 struct sk_buff *skb;
1428 ax25_digi dtmp, *dp;
1429 unsigned char *asmptr;
1430 ax25_cb *ax25;
1431 size_t size;
1432 int lv, err, addr_len = msg->msg_namelen;
1433
1434 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
1435 return -EINVAL;
1436
1437 lock_sock(sk);
1438 ax25 = ax25_sk(sk);
1439
1440 if (sock_flag(sk, SOCK_ZAPPED)) {
1441 err = -EADDRNOTAVAIL;
1442 goto out;
1443 }
1444
1445 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1446 send_sig(SIGPIPE, current, 0);
1447 err = -EPIPE;
1448 goto out;
1449 }
1450
1451 if (ax25->ax25_dev == NULL) {
1452 err = -ENETUNREACH;
1453 goto out;
1454 }
1455
1456 if (len > ax25->ax25_dev->dev->mtu) {
1457 err = -EMSGSIZE;
1458 goto out;
1459 }
1460
1461 if (usax != NULL) {
1462 if (usax->sax25_family != AF_AX25) {
1463 err = -EINVAL;
1464 goto out;
1465 }
1466
1467 if (addr_len == sizeof(struct sockaddr_ax25)) {
1468 printk(KERN_WARNING "ax25_sendmsg(): %s uses obsolete socket structure\n",
1469 current->comm);
1470 }
1471 else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
1472 /* support for old structure may go away some time */
1473 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1474 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1475 err = -EINVAL;
1476 goto out;
1477 }
1478
1479 printk(KERN_WARNING "ax25_sendmsg(): %s uses old (6 digipeater) socket structure.\n",
1480 current->comm);
1481 }
1482
1483 if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
1484 int ct = 0;
1485 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
1486
1487 /* Valid number of digipeaters ? */
1488 if (usax->sax25_ndigis < 1 || usax->sax25_ndigis > AX25_MAX_DIGIS) {
1489 err = -EINVAL;
1490 goto out;
1491 }
1492
1493 dtmp.ndigi = usax->sax25_ndigis;
1494
1495 while (ct < usax->sax25_ndigis) {
1496 dtmp.repeated[ct] = 0;
1497 dtmp.calls[ct] = fsa->fsa_digipeater[ct];
1498 ct++;
1499 }
1500
1501 dtmp.lastrepeat = 0;
1502 }
1503
1504 sax = *usax;
1505 if (sk->sk_type == SOCK_SEQPACKET &&
1506 ax25cmp(&ax25->dest_addr, &sax.sax25_call)) {
1507 err = -EISCONN;
1508 goto out;
1509 }
1510 if (usax->sax25_ndigis == 0)
1511 dp = NULL;
1512 else
1513 dp = &dtmp;
1514 } else {
1515 /*
1516 * FIXME: 1003.1g - if the socket is like this because
1517 * it has become closed (not started closed) and is VC
1518 * we ought to SIGPIPE, EPIPE
1519 */
1520 if (sk->sk_state != TCP_ESTABLISHED) {
1521 err = -ENOTCONN;
1522 goto out;
1523 }
1524 sax.sax25_family = AF_AX25;
1525 sax.sax25_call = ax25->dest_addr;
1526 dp = ax25->digipeat;
1527 }
1528
1529 SOCK_DEBUG(sk, "AX.25: sendto: Addresses built.\n");
1530
1531 /* Build a packet */
1532 SOCK_DEBUG(sk, "AX.25: sendto: building packet.\n");
1533
1534 /* Assume the worst case */
1535 size = len + ax25->ax25_dev->dev->hard_header_len;
1536
1537 skb = sock_alloc_send_skb(sk, size, msg->msg_flags&MSG_DONTWAIT, &err);
1538 if (skb == NULL)
1539 goto out;
1540
1541 skb_reserve(skb, size - len);
1542
1543 SOCK_DEBUG(sk, "AX.25: Appending user data\n");
1544
1545 /* User data follows immediately after the AX.25 data */
1546 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
1547 err = -EFAULT;
1548 kfree_skb(skb);
1549 goto out;
1550 }
1551
1552 skb->nh.raw = skb->data;
1553
1554 /* Add the PID if one is not supplied by the user in the skb */
1555 if (!ax25->pidincl) {
1556 asmptr = skb_push(skb, 1);
1557 *asmptr = sk->sk_protocol;
1558 }
1559
1560 SOCK_DEBUG(sk, "AX.25: Transmitting buffer\n");
1561
1562 if (sk->sk_type == SOCK_SEQPACKET) {
1563 /* Connected mode sockets go via the LAPB machine */
1564 if (sk->sk_state != TCP_ESTABLISHED) {
1565 kfree_skb(skb);
1566 err = -ENOTCONN;
1567 goto out;
1568 }
1569
1570 /* Shove it onto the queue and kick */
1571 ax25_output(ax25, ax25->paclen, skb);
1572
1573 err = len;
1574 goto out;
1575 }
1576
1577 asmptr = skb_push(skb, 1 + ax25_addr_size(dp));
1578
1579 SOCK_DEBUG(sk, "Building AX.25 Header (dp=%p).\n", dp);
1580
1581 if (dp != NULL)
1582 SOCK_DEBUG(sk, "Num digipeaters=%d\n", dp->ndigi);
1583
1584 /* Build an AX.25 header */
1585 asmptr += (lv = ax25_addr_build(asmptr, &ax25->source_addr,
1586 &sax.sax25_call, dp,
1587 AX25_COMMAND, AX25_MODULUS));
1588
1589 SOCK_DEBUG(sk, "Built header (%d bytes)\n",lv);
1590
1591 skb->h.raw = asmptr;
1592
1593 SOCK_DEBUG(sk, "base=%p pos=%p\n", skb->data, asmptr);
1594
1595 *asmptr = AX25_UI;
1596
1597 /* Datagram frames go straight out of the door as UI */
Arnaldo Carvalho de Melo29c4be52005-04-21 16:46:56 -07001598 ax25_queue_xmit(skb, ax25->ax25_dev->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599
1600 err = len;
1601
1602out:
1603 release_sock(sk);
1604
1605 return err;
1606}
1607
1608static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
1609 struct msghdr *msg, size_t size, int flags)
1610{
1611 struct sock *sk = sock->sk;
1612 struct sk_buff *skb;
1613 int copied;
1614 int err = 0;
1615
1616 lock_sock(sk);
1617 /*
1618 * This works for seqpacket too. The receiver has ordered the
1619 * queue for us! We do one quick check first though
1620 */
1621 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) {
1622 err = -ENOTCONN;
1623 goto out;
1624 }
1625
1626 /* Now we can treat all alike */
1627 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
1628 flags & MSG_DONTWAIT, &err);
1629 if (skb == NULL)
1630 goto out;
1631
1632 if (!ax25_sk(sk)->pidincl)
1633 skb_pull(skb, 1); /* Remove PID */
1634
1635 skb->h.raw = skb->data;
1636 copied = skb->len;
1637
1638 if (copied > size) {
1639 copied = size;
1640 msg->msg_flags |= MSG_TRUNC;
1641 }
1642
1643 skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
1644
1645 if (msg->msg_namelen != 0) {
1646 struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
1647 ax25_digi digi;
1648 ax25_address src;
1649
1650 ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, &src, NULL, &digi, NULL, NULL);
1651
1652 sax->sax25_family = AF_AX25;
1653 /* We set this correctly, even though we may not let the
1654 application know the digi calls further down (because it
1655 did NOT ask to know them). This could get political... **/
1656 sax->sax25_ndigis = digi.ndigi;
1657 sax->sax25_call = src;
1658
1659 if (sax->sax25_ndigis != 0) {
1660 int ct;
1661 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
1662
1663 for (ct = 0; ct < digi.ndigi; ct++)
1664 fsa->fsa_digipeater[ct] = digi.calls[ct];
1665 }
1666 msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
1667 }
1668
1669 skb_free_datagram(sk, skb);
1670 err = copied;
1671
1672out:
1673 release_sock(sk);
1674
1675 return err;
1676}
1677
1678static int ax25_shutdown(struct socket *sk, int how)
1679{
1680 /* FIXME - generate DM and RNR states */
1681 return -EOPNOTSUPP;
1682}
1683
1684static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1685{
1686 struct sock *sk = sock->sk;
1687 void __user *argp = (void __user *)arg;
1688 int res = 0;
1689
1690 lock_sock(sk);
1691 switch (cmd) {
1692 case TIOCOUTQ: {
1693 long amount;
1694 amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
1695 if (amount < 0)
1696 amount = 0;
1697 res = put_user(amount, (int __user *)argp);
1698 break;
1699 }
1700
1701 case TIOCINQ: {
1702 struct sk_buff *skb;
1703 long amount = 0L;
1704 /* These two are safe on a single CPU system as only user tasks fiddle here */
1705 if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1706 amount = skb->len;
Ralf Baechle20b7d102005-09-12 14:24:55 -07001707 res = put_user(amount, (int __user *) argp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001708 break;
1709 }
1710
1711 case SIOCGSTAMP:
Ralf Baechle9b37ee72005-09-12 14:23:52 -07001712 res = sock_get_timestamp(sk, argp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001713 break;
1714
1715 case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */
1716 case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */
1717 case SIOCAX25GETUID: {
1718 struct sockaddr_ax25 sax25;
1719 if (copy_from_user(&sax25, argp, sizeof(sax25))) {
1720 res = -EFAULT;
1721 break;
1722 }
1723 res = ax25_uid_ioctl(cmd, &sax25);
1724 break;
1725 }
1726
1727 case SIOCAX25NOUID: { /* Set the default policy (default/bar) */
1728 long amount;
1729 if (!capable(CAP_NET_ADMIN)) {
1730 res = -EPERM;
1731 break;
1732 }
1733 if (get_user(amount, (long __user *)argp)) {
1734 res = -EFAULT;
1735 break;
1736 }
1737 if (amount > AX25_NOUID_BLOCK) {
1738 res = -EINVAL;
1739 break;
1740 }
1741 ax25_uid_policy = amount;
1742 res = 0;
1743 break;
1744 }
1745
1746 case SIOCADDRT:
1747 case SIOCDELRT:
1748 case SIOCAX25OPTRT:
1749 if (!capable(CAP_NET_ADMIN)) {
1750 res = -EPERM;
1751 break;
1752 }
1753 res = ax25_rt_ioctl(cmd, argp);
1754 break;
1755
1756 case SIOCAX25CTLCON:
1757 if (!capable(CAP_NET_ADMIN)) {
1758 res = -EPERM;
1759 break;
1760 }
1761 res = ax25_ctl_ioctl(cmd, argp);
1762 break;
1763
1764 case SIOCAX25GETINFO:
1765 case SIOCAX25GETINFOOLD: {
1766 ax25_cb *ax25 = ax25_sk(sk);
1767 struct ax25_info_struct ax25_info;
1768
1769 ax25_info.t1 = ax25->t1 / HZ;
1770 ax25_info.t2 = ax25->t2 / HZ;
1771 ax25_info.t3 = ax25->t3 / HZ;
1772 ax25_info.idle = ax25->idle / (60 * HZ);
1773 ax25_info.n2 = ax25->n2;
1774 ax25_info.t1timer = ax25_display_timer(&ax25->t1timer) / HZ;
1775 ax25_info.t2timer = ax25_display_timer(&ax25->t2timer) / HZ;
1776 ax25_info.t3timer = ax25_display_timer(&ax25->t3timer) / HZ;
1777 ax25_info.idletimer = ax25_display_timer(&ax25->idletimer) / (60 * HZ);
1778 ax25_info.n2count = ax25->n2count;
1779 ax25_info.state = ax25->state;
1780 ax25_info.rcv_q = atomic_read(&sk->sk_rmem_alloc);
1781 ax25_info.snd_q = atomic_read(&sk->sk_wmem_alloc);
1782 ax25_info.vs = ax25->vs;
1783 ax25_info.vr = ax25->vr;
1784 ax25_info.va = ax25->va;
1785 ax25_info.vs_max = ax25->vs; /* reserved */
1786 ax25_info.paclen = ax25->paclen;
1787 ax25_info.window = ax25->window;
1788
1789 /* old structure? */
1790 if (cmd == SIOCAX25GETINFOOLD) {
1791 static int warned = 0;
1792 if (!warned) {
1793 printk(KERN_INFO "%s uses old SIOCAX25GETINFO\n",
1794 current->comm);
1795 warned=1;
1796 }
1797
1798 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct_deprecated))) {
1799 res = -EFAULT;
1800 break;
1801 }
1802 } else {
1803 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct))) {
1804 res = -EINVAL;
1805 break;
1806 }
1807 }
1808 res = 0;
1809 break;
1810 }
1811
1812 case SIOCAX25ADDFWD:
1813 case SIOCAX25DELFWD: {
1814 struct ax25_fwd_struct ax25_fwd;
1815 if (!capable(CAP_NET_ADMIN)) {
1816 res = -EPERM;
1817 break;
1818 }
1819 if (copy_from_user(&ax25_fwd, argp, sizeof(ax25_fwd))) {
1820 res = -EFAULT;
1821 break;
1822 }
1823 res = ax25_fwd_ioctl(cmd, &ax25_fwd);
1824 break;
1825 }
1826
1827 case SIOCGIFADDR:
1828 case SIOCSIFADDR:
1829 case SIOCGIFDSTADDR:
1830 case SIOCSIFDSTADDR:
1831 case SIOCGIFBRDADDR:
1832 case SIOCSIFBRDADDR:
1833 case SIOCGIFNETMASK:
1834 case SIOCSIFNETMASK:
1835 case SIOCGIFMETRIC:
1836 case SIOCSIFMETRIC:
1837 res = -EINVAL;
1838 break;
1839
1840 default:
Christoph Hellwigb5e5fa52006-01-03 14:18:33 -08001841 res = -ENOIOCTLCMD;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842 break;
1843 }
1844 release_sock(sk);
1845
1846 return res;
1847}
1848
1849#ifdef CONFIG_PROC_FS
1850
1851static void *ax25_info_start(struct seq_file *seq, loff_t *pos)
1852{
1853 struct ax25_cb *ax25;
1854 struct hlist_node *node;
1855 int i = 0;
1856
1857 spin_lock_bh(&ax25_list_lock);
1858 ax25_for_each(ax25, node, &ax25_list) {
1859 if (i == *pos)
1860 return ax25;
1861 ++i;
1862 }
1863 return NULL;
1864}
1865
1866static void *ax25_info_next(struct seq_file *seq, void *v, loff_t *pos)
1867{
1868 ++*pos;
1869
1870 return hlist_entry( ((struct ax25_cb *)v)->ax25_node.next,
1871 struct ax25_cb, ax25_node);
1872}
1873
1874static void ax25_info_stop(struct seq_file *seq, void *v)
1875{
1876 spin_unlock_bh(&ax25_list_lock);
1877}
1878
1879static int ax25_info_show(struct seq_file *seq, void *v)
1880{
1881 ax25_cb *ax25 = v;
Ralf Baechlef75268c2005-09-06 15:49:39 -07001882 char buf[11];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001883 int k;
1884
1885
1886 /*
1887 * New format:
1888 * 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
1889 */
1890
1891 seq_printf(seq, "%8.8lx %s %s%s ",
1892 (long) ax25,
1893 ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
Ralf Baechlef75268c2005-09-06 15:49:39 -07001894 ax2asc(buf, &ax25->source_addr),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001895 ax25->iamdigi? "*":"");
Ralf Baechlef75268c2005-09-06 15:49:39 -07001896 seq_printf(seq, "%s", ax2asc(buf, &ax25->dest_addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897
1898 for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
1899 seq_printf(seq, ",%s%s",
Ralf Baechlef75268c2005-09-06 15:49:39 -07001900 ax2asc(buf, &ax25->digipeat->calls[k]),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001901 ax25->digipeat->repeated[k]? "*":"");
1902 }
1903
1904 seq_printf(seq, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
1905 ax25->state,
1906 ax25->vs, ax25->vr, ax25->va,
1907 ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
1908 ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
1909 ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
1910 ax25_display_timer(&ax25->idletimer) / (60 * HZ),
1911 ax25->idle / (60 * HZ),
1912 ax25->n2count, ax25->n2,
1913 ax25->rtt / HZ,
1914 ax25->window,
1915 ax25->paclen);
1916
1917 if (ax25->sk != NULL) {
1918 bh_lock_sock(ax25->sk);
1919 seq_printf(seq," %d %d %ld\n",
1920 atomic_read(&ax25->sk->sk_wmem_alloc),
1921 atomic_read(&ax25->sk->sk_rmem_alloc),
1922 ax25->sk->sk_socket != NULL ? SOCK_INODE(ax25->sk->sk_socket)->i_ino : 0L);
1923 bh_unlock_sock(ax25->sk);
1924 } else {
1925 seq_puts(seq, " * * *\n");
1926 }
1927 return 0;
1928}
1929
1930static struct seq_operations ax25_info_seqops = {
1931 .start = ax25_info_start,
1932 .next = ax25_info_next,
1933 .stop = ax25_info_stop,
1934 .show = ax25_info_show,
1935};
1936
1937static int ax25_info_open(struct inode *inode, struct file *file)
1938{
1939 return seq_open(file, &ax25_info_seqops);
1940}
1941
1942static struct file_operations ax25_info_fops = {
1943 .owner = THIS_MODULE,
1944 .open = ax25_info_open,
1945 .read = seq_read,
1946 .llseek = seq_lseek,
1947 .release = seq_release,
1948};
1949
1950#endif
1951
1952static struct net_proto_family ax25_family_ops = {
1953 .family = PF_AX25,
1954 .create = ax25_create,
1955 .owner = THIS_MODULE,
1956};
1957
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001958static const struct proto_ops ax25_proto_ops = {
Ralf Baechle46763562005-09-12 14:25:25 -07001959 .family = PF_AX25,
1960 .owner = THIS_MODULE,
1961 .release = ax25_release,
1962 .bind = ax25_bind,
1963 .connect = ax25_connect,
1964 .socketpair = sock_no_socketpair,
1965 .accept = ax25_accept,
1966 .getname = ax25_getname,
1967 .poll = datagram_poll,
1968 .ioctl = ax25_ioctl,
1969 .listen = ax25_listen,
1970 .shutdown = ax25_shutdown,
1971 .setsockopt = ax25_setsockopt,
1972 .getsockopt = ax25_getsockopt,
1973 .sendmsg = ax25_sendmsg,
1974 .recvmsg = ax25_recvmsg,
1975 .mmap = sock_no_mmap,
1976 .sendpage = sock_no_sendpage,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001977};
1978
1979/*
1980 * Called by socket.c on kernel start up
1981 */
1982static struct packet_type ax25_packet_type = {
1983 .type = __constant_htons(ETH_P_AX25),
1984 .dev = NULL, /* All devices */
1985 .func = ax25_kiss_rcv,
1986};
1987
1988static struct notifier_block ax25_dev_notifier = {
1989 .notifier_call =ax25_device_event,
1990};
1991
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992static int __init ax25_init(void)
1993{
1994 int rc = proto_register(&ax25_proto, 0);
1995
1996 if (rc != 0)
1997 goto out;
1998
1999 sock_register(&ax25_family_ops);
2000 dev_add_pack(&ax25_packet_type);
2001 register_netdevice_notifier(&ax25_dev_notifier);
2002 ax25_register_sysctl();
2003
2004 proc_net_fops_create("ax25_route", S_IRUGO, &ax25_route_fops);
2005 proc_net_fops_create("ax25", S_IRUGO, &ax25_info_fops);
2006 proc_net_fops_create("ax25_calls", S_IRUGO, &ax25_uid_fops);
2007out:
2008 return rc;
2009}
2010module_init(ax25_init);
2011
2012
2013MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
2014MODULE_DESCRIPTION("The amateur radio AX.25 link layer protocol");
2015MODULE_LICENSE("GPL");
2016MODULE_ALIAS_NETPROTO(PF_AX25);
2017
2018static void __exit ax25_exit(void)
2019{
2020 proc_net_remove("ax25_route");
2021 proc_net_remove("ax25");
2022 proc_net_remove("ax25_calls");
2023 ax25_rt_free();
2024 ax25_uid_free();
2025 ax25_dev_free();
2026
2027 ax25_unregister_sysctl();
2028 unregister_netdevice_notifier(&ax25_dev_notifier);
2029
2030 dev_remove_pack(&ax25_packet_type);
2031
2032 sock_unregister(PF_AX25);
2033 proto_unregister(&ax25_proto);
2034}
2035module_exit(ax25_exit);