1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/capability.h>
17#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/sockios.h>
27#include <linux/net.h>
28#include <linux/slab.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>
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>
48#include <net/net_namespace.h>
49#include <net/tcp_states.h>
50#include <net/ip.h>
51#include <net/arp.h>
52
53
54
55HLIST_HEAD(ax25_list);
56DEFINE_SPINLOCK(ax25_list_lock);
57
58static const struct proto_ops ax25_proto_ops;
59
60static void ax25_free_sock(struct sock *sk)
61{
62 ax25_cb_put(ax25_sk(sk));
63}
64
65
66
67
68static void ax25_cb_del(ax25_cb *ax25)
69{
70 if (!hlist_unhashed(&ax25->ax25_node)) {
71 spin_lock_bh(&ax25_list_lock);
72 hlist_del_init(&ax25->ax25_node);
73 spin_unlock_bh(&ax25_list_lock);
74 ax25_cb_put(ax25);
75 }
76}
77
78
79
80
81static void ax25_kill_by_device(struct net_device *dev)
82{
83 ax25_dev *ax25_dev;
84 ax25_cb *s;
85 struct hlist_node *node;
86
87 if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
88 return;
89
90 spin_lock_bh(&ax25_list_lock);
91again:
92 ax25_for_each(s, node, &ax25_list) {
93 if (s->ax25_dev == ax25_dev) {
94 s->ax25_dev = NULL;
95 spin_unlock_bh(&ax25_list_lock);
96 ax25_disconnect(s, ENETUNREACH);
97 spin_lock_bh(&ax25_list_lock);
98
99
100
101
102
103
104
105
106 goto again;
107 }
108 }
109 spin_unlock_bh(&ax25_list_lock);
110}
111
112
113
114
115static int ax25_device_event(struct notifier_block *this, unsigned long event,
116 void *ptr)
117{
118 struct net_device *dev = (struct net_device *)ptr;
119
120 if (!net_eq(dev_net(dev), &init_net))
121 return NOTIFY_DONE;
122
123
124 if (dev->type != ARPHRD_AX25)
125 return NOTIFY_DONE;
126
127 switch (event) {
128 case NETDEV_UP:
129 ax25_dev_device_up(dev);
130 break;
131 case NETDEV_DOWN:
132 ax25_kill_by_device(dev);
133 ax25_rt_device_down(dev);
134 ax25_dev_device_down(dev);
135 break;
136 default:
137 break;
138 }
139
140 return NOTIFY_DONE;
141}
142
143
144
145
146void ax25_cb_add(ax25_cb *ax25)
147{
148 spin_lock_bh(&ax25_list_lock);
149 ax25_cb_hold(ax25);
150 hlist_add_head(&ax25->ax25_node, &ax25_list);
151 spin_unlock_bh(&ax25_list_lock);
152}
153
154
155
156
157
158struct sock *ax25_find_listener(ax25_address *addr, int digi,
159 struct net_device *dev, int type)
160{
161 ax25_cb *s;
162 struct hlist_node *node;
163
164 spin_lock(&ax25_list_lock);
165 ax25_for_each(s, node, &ax25_list) {
166 if ((s->iamdigi && !digi) || (!s->iamdigi && digi))
167 continue;
168 if (s->sk && !ax25cmp(&s->source_addr, addr) &&
169 s->sk->sk_type == type && s->sk->sk_state == TCP_LISTEN) {
170
171 if (s->ax25_dev == NULL || s->ax25_dev->dev == dev) {
172 sock_hold(s->sk);
173 spin_unlock(&ax25_list_lock);
174 return s->sk;
175 }
176 }
177 }
178 spin_unlock(&ax25_list_lock);
179
180 return NULL;
181}
182
183
184
185
186struct sock *ax25_get_socket(ax25_address *my_addr, ax25_address *dest_addr,
187 int type)
188{
189 struct sock *sk = NULL;
190 ax25_cb *s;
191 struct hlist_node *node;
192
193 spin_lock(&ax25_list_lock);
194 ax25_for_each(s, node, &ax25_list) {
195 if (s->sk && !ax25cmp(&s->source_addr, my_addr) &&
196 !ax25cmp(&s->dest_addr, dest_addr) &&
197 s->sk->sk_type == type) {
198 sk = s->sk;
199 sock_hold(sk);
200 break;
201 }
202 }
203
204 spin_unlock(&ax25_list_lock);
205
206 return sk;
207}
208
209
210
211
212
213ax25_cb *ax25_find_cb(ax25_address *src_addr, ax25_address *dest_addr,
214 ax25_digi *digi, struct net_device *dev)
215{
216 ax25_cb *s;
217 struct hlist_node *node;
218
219 spin_lock_bh(&ax25_list_lock);
220 ax25_for_each(s, node, &ax25_list) {
221 if (s->sk && s->sk->sk_type != SOCK_SEQPACKET)
222 continue;
223 if (s->ax25_dev == NULL)
224 continue;
225 if (ax25cmp(&s->source_addr, src_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->ax25_dev->dev == dev) {
226 if (digi != NULL && digi->ndigi != 0) {
227 if (s->digipeat == NULL)
228 continue;
229 if (ax25digicmp(s->digipeat, digi) != 0)
230 continue;
231 } else {
232 if (s->digipeat != NULL && s->digipeat->ndigi != 0)
233 continue;
234 }
235 ax25_cb_hold(s);
236 spin_unlock_bh(&ax25_list_lock);
237
238 return s;
239 }
240 }
241 spin_unlock_bh(&ax25_list_lock);
242
243 return NULL;
244}
245
246EXPORT_SYMBOL(ax25_find_cb);
247
248void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto)
249{
250 ax25_cb *s;
251 struct sk_buff *copy;
252 struct hlist_node *node;
253
254 spin_lock(&ax25_list_lock);
255 ax25_for_each(s, node, &ax25_list) {
256 if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 &&
257 s->sk->sk_type == SOCK_RAW &&
258 s->sk->sk_protocol == proto &&
259 s->ax25_dev->dev == skb->dev &&
260 atomic_read(&s->sk->sk_rmem_alloc) <= s->sk->sk_rcvbuf) {
261 if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
262 continue;
263 if (sock_queue_rcv_skb(s->sk, copy) != 0)
264 kfree_skb(copy);
265 }
266 }
267 spin_unlock(&ax25_list_lock);
268}
269
270
271
272
273void ax25_destroy_socket(ax25_cb *);
274
275
276
277
278static void ax25_destroy_timer(unsigned long data)
279{
280 ax25_cb *ax25=(ax25_cb *)data;
281 struct sock *sk;
282
283 sk=ax25->sk;
284
285 bh_lock_sock(sk);
286 sock_hold(sk);
287 ax25_destroy_socket(ax25);
288 bh_unlock_sock(sk);
289 sock_put(sk);
290}
291
292
293
294
295
296
297
298void ax25_destroy_socket(ax25_cb *ax25)
299{
300 struct sk_buff *skb;
301
302 ax25_cb_del(ax25);
303
304 ax25_stop_heartbeat(ax25);
305 ax25_stop_t1timer(ax25);
306 ax25_stop_t2timer(ax25);
307 ax25_stop_t3timer(ax25);
308 ax25_stop_idletimer(ax25);
309
310 ax25_clear_queues(ax25);
311
312 if (ax25->sk != NULL) {
313 while ((skb = skb_dequeue(&ax25->sk->sk_receive_queue)) != NULL) {
314 if (skb->sk != ax25->sk) {
315
316 ax25_cb *sax25 = ax25_sk(skb->sk);
317
318
319 sock_orphan(skb->sk);
320
321
322 skb->sk->sk_state = TCP_LISTEN;
323
324 ax25_start_heartbeat(sax25);
325 sax25->state = AX25_STATE_0;
326 }
327
328 kfree_skb(skb);
329 }
330 skb_queue_purge(&ax25->sk->sk_write_queue);
331 }
332
333 if (ax25->sk != NULL) {
334 if (sk_has_allocations(ax25->sk)) {
335
336 setup_timer(&ax25->dtimer, ax25_destroy_timer,
337 (unsigned long)ax25);
338 ax25->dtimer.expires = jiffies + 2 * HZ;
339 add_timer(&ax25->dtimer);
340 } else {
341 struct sock *sk=ax25->sk;
342 ax25->sk=NULL;
343 sock_put(sk);
344 }
345 } else {
346 ax25_cb_put(ax25);
347 }
348}
349
350
351
352
353
354
355static int ax25_ctl_ioctl(const unsigned int cmd, void __user *arg)
356{
357 struct ax25_ctl_struct ax25_ctl;
358 ax25_digi digi;
359 ax25_dev *ax25_dev;
360 ax25_cb *ax25;
361 unsigned int k;
362 int ret = 0;
363
364 if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
365 return -EFAULT;
366
367 if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
368 return -ENODEV;
369
370 if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
371 return -EINVAL;
372
373 if (ax25_ctl.arg > ULONG_MAX / HZ && ax25_ctl.cmd != AX25_KILL)
374 return -EINVAL;
375
376 digi.ndigi = ax25_ctl.digi_count;
377 for (k = 0; k < digi.ndigi; k++)
378 digi.calls[k] = ax25_ctl.digi_addr[k];
379
380 if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
381 return -ENOTCONN;
382
383 switch (ax25_ctl.cmd) {
384 case AX25_KILL:
385 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
386#ifdef CONFIG_AX25_DAMA_SLAVE
387 if (ax25_dev->dama.slave && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
388 ax25_dama_off(ax25);
389#endif
390 ax25_disconnect(ax25, ENETRESET);
391 break;
392
393 case AX25_WINDOW:
394 if (ax25->modulus == AX25_MODULUS) {
395 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
396 goto einval_put;
397 } else {
398 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
399 goto einval_put;
400 }
401 ax25->window = ax25_ctl.arg;
402 break;
403
404 case AX25_T1:
405 if (ax25_ctl.arg < 1)
406 goto einval_put;
407 ax25->rtt = (ax25_ctl.arg * HZ) / 2;
408 ax25->t1 = ax25_ctl.arg * HZ;
409 break;
410
411 case AX25_T2:
412 if (ax25_ctl.arg < 1)
413 goto einval_put;
414 ax25->t2 = ax25_ctl.arg * HZ;
415 break;
416
417 case AX25_N2:
418 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
419 goto einval_put;
420 ax25->n2count = 0;
421 ax25->n2 = ax25_ctl.arg;
422 break;
423
424 case AX25_T3:
425 ax25->t3 = ax25_ctl.arg * HZ;
426 break;
427
428 case AX25_IDLE:
429 ax25->idle = ax25_ctl.arg * 60 * HZ;
430 break;
431
432 case AX25_PACLEN:
433 if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
434 goto einval_put;
435 ax25->paclen = ax25_ctl.arg;
436 break;
437
438 default:
439 goto einval_put;
440 }
441
442out_put:
443 ax25_cb_put(ax25);
444 return ret;
445
446einval_put:
447 ret = -EINVAL;
448 goto out_put;
449}
450
451static void ax25_fillin_cb_from_dev(ax25_cb *ax25, ax25_dev *ax25_dev)
452{
453 ax25->rtt = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]) / 2;
454 ax25->t1 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]);
455 ax25->t2 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T2]);
456 ax25->t3 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T3]);
457 ax25->n2 = ax25_dev->values[AX25_VALUES_N2];
458 ax25->paclen = ax25_dev->values[AX25_VALUES_PACLEN];
459 ax25->idle = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_IDLE]);
460 ax25->backoff = ax25_dev->values[AX25_VALUES_BACKOFF];
461
462 if (ax25_dev->values[AX25_VALUES_AXDEFMODE]) {
463 ax25->modulus = AX25_EMODULUS;
464 ax25->window = ax25_dev->values[AX25_VALUES_EWINDOW];
465 } else {
466 ax25->modulus = AX25_MODULUS;
467 ax25->window = ax25_dev->values[AX25_VALUES_WINDOW];
468 }
469}
470
471
472
473
474
475void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
476{
477 ax25->ax25_dev = ax25_dev;
478
479 if (ax25->ax25_dev != NULL) {
480 ax25_fillin_cb_from_dev(ax25, ax25_dev);
481 return;
482 }
483
484
485
486
487 ax25->rtt = msecs_to_jiffies(AX25_DEF_T1) / 2;
488 ax25->t1 = msecs_to_jiffies(AX25_DEF_T1);
489 ax25->t2 = msecs_to_jiffies(AX25_DEF_T2);
490 ax25->t3 = msecs_to_jiffies(AX25_DEF_T3);
491 ax25->n2 = AX25_DEF_N2;
492 ax25->paclen = AX25_DEF_PACLEN;
493 ax25->idle = msecs_to_jiffies(AX25_DEF_IDLE);
494 ax25->backoff = AX25_DEF_BACKOFF;
495
496 if (AX25_DEF_AXDEFMODE) {
497 ax25->modulus = AX25_EMODULUS;
498 ax25->window = AX25_DEF_EWINDOW;
499 } else {
500 ax25->modulus = AX25_MODULUS;
501 ax25->window = AX25_DEF_WINDOW;
502 }
503}
504
505
506
507
508ax25_cb *ax25_create_cb(void)
509{
510 ax25_cb *ax25;
511
512 if ((ax25 = kzalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
513 return NULL;
514
515 atomic_set(&ax25->refcount, 1);
516
517 skb_queue_head_init(&ax25->write_queue);
518 skb_queue_head_init(&ax25->frag_queue);
519 skb_queue_head_init(&ax25->ack_queue);
520 skb_queue_head_init(&ax25->reseq_queue);
521
522 ax25_setup_timers(ax25);
523
524 ax25_fillin_cb(ax25, NULL);
525
526 ax25->state = AX25_STATE_0;
527
528 return ax25;
529}
530
531
532
533
534
535
536static int ax25_setsockopt(struct socket *sock, int level, int optname,
537 char __user *optval, unsigned int optlen)
538{
539 struct sock *sk = sock->sk;
540 ax25_cb *ax25;
541 struct net_device *dev;
542 char devname[IFNAMSIZ];
543 int opt, res = 0;
544
545 if (level != SOL_AX25)
546 return -ENOPROTOOPT;
547
548 if (optlen < sizeof(int))
549 return -EINVAL;
550
551 if (get_user(opt, (int __user *)optval))
552 return -EFAULT;
553
554 lock_sock(sk);
555 ax25 = ax25_sk(sk);
556
557 switch (optname) {
558 case AX25_WINDOW:
559 if (ax25->modulus == AX25_MODULUS) {
560 if (opt < 1 || opt > 7) {
561 res = -EINVAL;
562 break;
563 }
564 } else {
565 if (opt < 1 || opt > 63) {
566 res = -EINVAL;
567 break;
568 }
569 }
570 ax25->window = opt;
571 break;
572
573 case AX25_T1:
574 if (opt < 1) {
575 res = -EINVAL;
576 break;
577 }
578 ax25->rtt = (opt * HZ) >> 1;
579 ax25->t1 = opt * HZ;
580 break;
581
582 case AX25_T2:
583 if (opt < 1) {
584 res = -EINVAL;
585 break;
586 }
587 ax25->t2 = opt * HZ;
588 break;
589
590 case AX25_N2:
591 if (opt < 1 || opt > 31) {
592 res = -EINVAL;
593 break;
594 }
595 ax25->n2 = opt;
596 break;
597
598 case AX25_T3:
599 if (opt < 1) {
600 res = -EINVAL;
601 break;
602 }
603 ax25->t3 = opt * HZ;
604 break;
605
606 case AX25_IDLE:
607 if (opt < 0) {
608 res = -EINVAL;
609 break;
610 }
611 ax25->idle = opt * 60 * HZ;
612 break;
613
614 case AX25_BACKOFF:
615 if (opt < 0 || opt > 2) {
616 res = -EINVAL;
617 break;
618 }
619 ax25->backoff = opt;
620 break;
621
622 case AX25_EXTSEQ:
623 ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
624 break;
625
626 case AX25_PIDINCL:
627 ax25->pidincl = opt ? 1 : 0;
628 break;
629
630 case AX25_IAMDIGI:
631 ax25->iamdigi = opt ? 1 : 0;
632 break;
633
634 case AX25_PACLEN:
635 if (opt < 16 || opt > 65535) {
636 res = -EINVAL;
637 break;
638 }
639 ax25->paclen = opt;
640 break;
641
642 case SO_BINDTODEVICE:
643 if (optlen > IFNAMSIZ)
644 optlen = IFNAMSIZ;
645
646 if (copy_from_user(devname, optval, optlen)) {
647 res = -EFAULT;
648 break;
649 }
650
651 if (sk->sk_type == SOCK_SEQPACKET &&
652 (sock->state != SS_UNCONNECTED ||
653 sk->sk_state == TCP_LISTEN)) {
654 res = -EADDRNOTAVAIL;
655 break;
656 }
657
658 dev = dev_get_by_name(&init_net, devname);
659 if (!dev) {
660 res = -ENODEV;
661 break;
662 }
663
664 ax25->ax25_dev = ax25_dev_ax25dev(dev);
665 ax25_fillin_cb(ax25, ax25->ax25_dev);
666 dev_put(dev);
667 break;
668
669 default:
670 res = -ENOPROTOOPT;
671 }
672 release_sock(sk);
673
674 return res;
675}
676
677static int ax25_getsockopt(struct socket *sock, int level, int optname,
678 char __user *optval, int __user *optlen)
679{
680 struct sock *sk = sock->sk;
681 ax25_cb *ax25;
682 struct ax25_dev *ax25_dev;
683 char devname[IFNAMSIZ];
684 void *valptr;
685 int val = 0;
686 int maxlen, length;
687
688 if (level != SOL_AX25)
689 return -ENOPROTOOPT;
690
691 if (get_user(maxlen, optlen))
692 return -EFAULT;
693
694 if (maxlen < 1)
695 return -EFAULT;
696
697 valptr = (void *) &val;
698 length = min_t(unsigned int, maxlen, sizeof(int));
699
700 lock_sock(sk);
701 ax25 = ax25_sk(sk);
702
703 switch (optname) {
704 case AX25_WINDOW:
705 val = ax25->window;
706 break;
707
708 case AX25_T1:
709 val = ax25->t1 / HZ;
710 break;
711
712 case AX25_T2:
713 val = ax25->t2 / HZ;
714 break;
715
716 case AX25_N2:
717 val = ax25->n2;
718 break;
719
720 case AX25_T3:
721 val = ax25->t3 / HZ;
722 break;
723
724 case AX25_IDLE:
725 val = ax25->idle / (60 * HZ);
726 break;
727
728 case AX25_BACKOFF:
729 val = ax25->backoff;
730 break;
731
732 case AX25_EXTSEQ:
733 val = (ax25->modulus == AX25_EMODULUS);
734 break;
735
736 case AX25_PIDINCL:
737 val = ax25->pidincl;
738 break;
739
740 case AX25_IAMDIGI:
741 val = ax25->iamdigi;
742 break;
743
744 case AX25_PACLEN:
745 val = ax25->paclen;
746 break;
747
748 case SO_BINDTODEVICE:
749 ax25_dev = ax25->ax25_dev;
750
751 if (ax25_dev != NULL && ax25_dev->dev != NULL) {
752 strlcpy(devname, ax25_dev->dev->name, sizeof(devname));
753 length = strlen(devname) + 1;
754 } else {
755 *devname = '\0';
756 length = 1;
757 }
758
759 valptr = (void *) devname;
760 break;
761
762 default:
763 release_sock(sk);
764 return -ENOPROTOOPT;
765 }
766 release_sock(sk);
767
768 if (put_user(length, optlen))
769 return -EFAULT;
770
771 return copy_to_user(optval, valptr, length) ? -EFAULT : 0;
772}
773
774static int ax25_listen(struct socket *sock, int backlog)
775{
776 struct sock *sk = sock->sk;
777 int res = 0;
778
779 lock_sock(sk);
780 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_LISTEN) {
781 sk->sk_max_ack_backlog = backlog;
782 sk->sk_state = TCP_LISTEN;
783 goto out;
784 }
785 res = -EOPNOTSUPP;
786
787out:
788 release_sock(sk);
789
790 return res;
791}
792
793
794
795
796
797static struct proto ax25_proto = {
798 .name = "AX25",
799 .owner = THIS_MODULE,
800 .obj_size = sizeof(struct sock),
801};
802
803static int ax25_create(struct net *net, struct socket *sock, int protocol,
804 int kern)
805{
806 struct sock *sk;
807 ax25_cb *ax25;
808
809 if (!net_eq(net, &init_net))
810 return -EAFNOSUPPORT;
811
812 switch (sock->type) {
813 case SOCK_DGRAM:
814 if (protocol == 0 || protocol == PF_AX25)
815 protocol = AX25_P_TEXT;
816 break;
817
818 case SOCK_SEQPACKET:
819 switch (protocol) {
820 case 0:
821 case PF_AX25:
822 protocol = AX25_P_TEXT;
823 break;
824 case AX25_P_SEGMENT:
825#ifdef CONFIG_INET
826 case AX25_P_ARP:
827 case AX25_P_IP:
828#endif
829#ifdef CONFIG_NETROM
830 case AX25_P_NETROM:
831#endif
832#ifdef CONFIG_ROSE
833 case AX25_P_ROSE:
834#endif
835 return -ESOCKTNOSUPPORT;
836#ifdef CONFIG_NETROM_MODULE
837 case AX25_P_NETROM:
838 if (ax25_protocol_is_registered(AX25_P_NETROM))
839 return -ESOCKTNOSUPPORT;
840#endif
841#ifdef CONFIG_ROSE_MODULE
842 case AX25_P_ROSE:
843 if (ax25_protocol_is_registered(AX25_P_ROSE))
844 return -ESOCKTNOSUPPORT;
845#endif
846 default:
847 break;
848 }
849 break;
850
851 case SOCK_RAW:
852 break;
853 default:
854 return -ESOCKTNOSUPPORT;
855 }
856
857 sk = sk_alloc(net, PF_AX25, GFP_ATOMIC, &ax25_proto);
858 if (sk == NULL)
859 return -ENOMEM;
860
861 ax25 = sk->sk_protinfo = ax25_create_cb();
862 if (!ax25) {
863 sk_free(sk);
864 return -ENOMEM;
865 }
866
867 sock_init_data(sock, sk);
868
869 sk->sk_destruct = ax25_free_sock;
870 sock->ops = &ax25_proto_ops;
871 sk->sk_protocol = protocol;
872
873 ax25->sk = sk;
874
875 return 0;
876}
877
878struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
879{
880 struct sock *sk;
881 ax25_cb *ax25, *oax25;
882
883 sk = sk_alloc(sock_net(osk), PF_AX25, GFP_ATOMIC, osk->sk_prot);
884 if (sk == NULL)
885 return NULL;
886
887 if ((ax25 = ax25_create_cb()) == NULL) {
888 sk_free(sk);
889 return NULL;
890 }
891
892 switch (osk->sk_type) {
893 case SOCK_DGRAM:
894 break;
895 case SOCK_SEQPACKET:
896 break;
897 default:
898 sk_free(sk);
899 ax25_cb_put(ax25);
900 return NULL;
901 }
902
903 sock_init_data(NULL, sk);
904
905 sk->sk_type = osk->sk_type;
906 sk->sk_priority = osk->sk_priority;
907 sk->sk_protocol = osk->sk_protocol;
908 sk->sk_rcvbuf = osk->sk_rcvbuf;
909 sk->sk_sndbuf = osk->sk_sndbuf;
910 sk->sk_state = TCP_ESTABLISHED;
911 sock_copy_flags(sk, osk);
912
913 oax25 = ax25_sk(osk);
914
915 ax25->modulus = oax25->modulus;
916 ax25->backoff = oax25->backoff;
917 ax25->pidincl = oax25->pidincl;
918 ax25->iamdigi = oax25->iamdigi;
919 ax25->rtt = oax25->rtt;
920 ax25->t1 = oax25->t1;
921 ax25->t2 = oax25->t2;
922 ax25->t3 = oax25->t3;
923 ax25->n2 = oax25->n2;
924 ax25->idle = oax25->idle;
925 ax25->paclen = oax25->paclen;
926 ax25->window = oax25->window;
927
928 ax25->ax25_dev = ax25_dev;
929 ax25->source_addr = oax25->source_addr;
930
931 if (oax25->digipeat != NULL) {
932 ax25->digipeat = kmemdup(oax25->digipeat, sizeof(ax25_digi),
933 GFP_ATOMIC);
934 if (ax25->digipeat == NULL) {
935 sk_free(sk);
936 ax25_cb_put(ax25);
937 return NULL;
938 }
939 }
940
941 sk->sk_protinfo = ax25;
942 sk->sk_destruct = ax25_free_sock;
943 ax25->sk = sk;
944
945 return sk;
946}
947
948static int ax25_release(struct socket *sock)
949{
950 struct sock *sk = sock->sk;
951 ax25_cb *ax25;
952
953 if (sk == NULL)
954 return 0;
955
956 sock_hold(sk);
957 sock_orphan(sk);
958 lock_sock(sk);
959 ax25 = ax25_sk(sk);
960
961 if (sk->sk_type == SOCK_SEQPACKET) {
962 switch (ax25->state) {
963 case AX25_STATE_0:
964 release_sock(sk);
965 ax25_disconnect(ax25, 0);
966 lock_sock(sk);
967 ax25_destroy_socket(ax25);
968 break;
969
970 case AX25_STATE_1:
971 case AX25_STATE_2:
972 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
973 release_sock(sk);
974 ax25_disconnect(ax25, 0);
975 lock_sock(sk);
976 ax25_destroy_socket(ax25);
977 break;
978
979 case AX25_STATE_3:
980 case AX25_STATE_4:
981 ax25_clear_queues(ax25);
982 ax25->n2count = 0;
983
984 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
985 case AX25_PROTO_STD_SIMPLEX:
986 case AX25_PROTO_STD_DUPLEX:
987 ax25_send_control(ax25,
988 AX25_DISC,
989 AX25_POLLON,
990 AX25_COMMAND);
991 ax25_stop_t2timer(ax25);
992 ax25_stop_t3timer(ax25);
993 ax25_stop_idletimer(ax25);
994 break;
995#ifdef CONFIG_AX25_DAMA_SLAVE
996 case AX25_PROTO_DAMA_SLAVE:
997 ax25_stop_t3timer(ax25);
998 ax25_stop_idletimer(ax25);
999 break;
1000#endif
1001 }
1002 ax25_calculate_t1(ax25);
1003 ax25_start_t1timer(ax25);
1004 ax25->state = AX25_STATE_2;
1005 sk->sk_state = TCP_CLOSE;
1006 sk->sk_shutdown |= SEND_SHUTDOWN;
1007 sk->sk_state_change(sk);
1008 sock_set_flag(sk, SOCK_DESTROY);
1009 break;
1010
1011 default:
1012 break;
1013 }
1014 } else {
1015 sk->sk_state = TCP_CLOSE;
1016 sk->sk_shutdown |= SEND_SHUTDOWN;
1017 sk->sk_state_change(sk);
1018 ax25_destroy_socket(ax25);
1019 }
1020
1021 sock->sk = NULL;
1022 release_sock(sk);
1023 sock_put(sk);
1024
1025 return 0;
1026}
1027
1028
1029
1030
1031
1032
1033
1034static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1035{
1036 struct sock *sk = sock->sk;
1037 struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
1038 ax25_dev *ax25_dev = NULL;
1039 ax25_uid_assoc *user;
1040 ax25_address call;
1041 ax25_cb *ax25;
1042 int err = 0;
1043
1044 if (addr_len != sizeof(struct sockaddr_ax25) &&
1045 addr_len != sizeof(struct full_sockaddr_ax25))
1046
1047
1048
1049 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1050 (addr_len > sizeof(struct full_sockaddr_ax25)))
1051 return -EINVAL;
1052
1053 if (addr->fsa_ax25.sax25_family != AF_AX25)
1054 return -EINVAL;
1055
1056 user = ax25_findbyuid(current_euid());
1057 if (user) {
1058 call = user->call;
1059 ax25_uid_put(user);
1060 } else {
1061 if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
1062 return -EACCES;
1063
1064 call = addr->fsa_ax25.sax25_call;
1065 }
1066
1067 lock_sock(sk);
1068
1069 ax25 = ax25_sk(sk);
1070 if (!sock_flag(sk, SOCK_ZAPPED)) {
1071 err = -EINVAL;
1072 goto out;
1073 }
1074
1075 ax25->source_addr = call;
1076
1077
1078
1079
1080 if (ax25->ax25_dev != NULL)
1081 goto done;
1082
1083 if (addr_len > sizeof(struct sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
1084 if (ax25cmp(&addr->fsa_digipeater[0], &null_ax25_address) != 0 &&
1085 (ax25_dev = ax25_addr_ax25dev(&addr->fsa_digipeater[0])) == NULL) {
1086 err = -EADDRNOTAVAIL;
1087 goto out;
1088 }
1089 } else {
1090 if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL) {
1091 err = -EADDRNOTAVAIL;
1092 goto out;
1093 }
1094 }
1095
1096 if (ax25_dev != NULL)
1097 ax25_fillin_cb(ax25, ax25_dev);
1098
1099done:
1100 ax25_cb_add(ax25);
1101 sock_reset_flag(sk, SOCK_ZAPPED);
1102
1103out:
1104 release_sock(sk);
1105
1106 return err;
1107}
1108
1109
1110
1111
1112static int __must_check ax25_connect(struct socket *sock,
1113 struct sockaddr *uaddr, int addr_len, int flags)
1114{
1115 struct sock *sk = sock->sk;
1116 ax25_cb *ax25 = ax25_sk(sk), *ax25t;
1117 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1118 ax25_digi *digi = NULL;
1119 int ct = 0, err = 0;
1120
1121
1122
1123
1124
1125 if (addr_len == sizeof(struct sockaddr_ax25))
1126
1127
1128
1129 ;
1130 else if (addr_len != sizeof(struct full_sockaddr_ax25))
1131
1132
1133
1134 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1135 (addr_len > sizeof(struct full_sockaddr_ax25)))
1136 return -EINVAL;
1137
1138
1139 if (fsa->fsa_ax25.sax25_family != AF_AX25)
1140 return -EINVAL;
1141
1142 lock_sock(sk);
1143
1144
1145 if (sock->state == SS_CONNECTING) {
1146 switch (sk->sk_state) {
1147 case TCP_SYN_SENT:
1148 err = -EINPROGRESS;
1149 goto out_release;
1150
1151 case TCP_ESTABLISHED:
1152 sock->state = SS_CONNECTED;
1153 goto out_release;
1154
1155 case TCP_CLOSE:
1156 sock->state = SS_UNCONNECTED;
1157 err = -ECONNREFUSED;
1158 goto out_release;
1159 }
1160 }
1161
1162 if (sk->sk_state == TCP_ESTABLISHED && sk->sk_type == SOCK_SEQPACKET) {
1163 err = -EISCONN;
1164 goto out_release;
1165 }
1166
1167 sk->sk_state = TCP_CLOSE;
1168 sock->state = SS_UNCONNECTED;
1169
1170 kfree(ax25->digipeat);
1171 ax25->digipeat = NULL;
1172
1173
1174
1175
1176 if (addr_len > sizeof(struct sockaddr_ax25) &&
1177 fsa->fsa_ax25.sax25_ndigis != 0) {
1178
1179 if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS) {
1180 err = -EINVAL;
1181 goto out_release;
1182 }
1183
1184 if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
1185 err = -ENOBUFS;
1186 goto out_release;
1187 }
1188
1189 digi->ndigi = fsa->fsa_ax25.sax25_ndigis;
1190 digi->lastrepeat = -1;
1191
1192 while (ct < fsa->fsa_ax25.sax25_ndigis) {
1193 if ((fsa->fsa_digipeater[ct].ax25_call[6] &
1194 AX25_HBIT) && ax25->iamdigi) {
1195 digi->repeated[ct] = 1;
1196 digi->lastrepeat = ct;
1197 } else {
1198 digi->repeated[ct] = 0;
1199 }
1200 digi->calls[ct] = fsa->fsa_digipeater[ct];
1201 ct++;
1202 }
1203 }
1204
1205
1206
1207
1208
1209
1210 if (sock_flag(sk, SOCK_ZAPPED)) {
1211
1212 printk(KERN_WARNING "ax25_connect(): %s uses autobind, please contact jreuter@yaina.de\n",
1213 current->comm);
1214 if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) {
1215 kfree(digi);
1216 goto out_release;
1217 }
1218
1219 ax25_fillin_cb(ax25, ax25->ax25_dev);
1220 ax25_cb_add(ax25);
1221 } else {
1222 if (ax25->ax25_dev == NULL) {
1223 kfree(digi);
1224 err = -EHOSTUNREACH;
1225 goto out_release;
1226 }
1227 }
1228
1229 if (sk->sk_type == SOCK_SEQPACKET &&
1230 (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
1231 ax25->ax25_dev->dev))) {
1232 kfree(digi);
1233 err = -EADDRINUSE;
1234 ax25_cb_put(ax25t);
1235 goto out_release;
1236 }
1237
1238 ax25->dest_addr = fsa->fsa_ax25.sax25_call;
1239 ax25->digipeat = digi;
1240
1241
1242 if (sk->sk_type != SOCK_SEQPACKET) {
1243 sock->state = SS_CONNECTED;
1244 sk->sk_state = TCP_ESTABLISHED;
1245 goto out_release;
1246 }
1247
1248
1249 sock->state = SS_CONNECTING;
1250 sk->sk_state = TCP_SYN_SENT;
1251
1252 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1253 case AX25_PROTO_STD_SIMPLEX:
1254 case AX25_PROTO_STD_DUPLEX:
1255 ax25_std_establish_data_link(ax25);
1256 break;
1257
1258#ifdef CONFIG_AX25_DAMA_SLAVE
1259 case AX25_PROTO_DAMA_SLAVE:
1260 ax25->modulus = AX25_MODULUS;
1261 ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
1262 if (ax25->ax25_dev->dama.slave)
1263 ax25_ds_establish_data_link(ax25);
1264 else
1265 ax25_std_establish_data_link(ax25);
1266 break;
1267#endif
1268 }
1269
1270 ax25->state = AX25_STATE_1;
1271
1272 ax25_start_heartbeat(ax25);
1273
1274
1275 if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) {
1276 err = -EINPROGRESS;
1277 goto out_release;
1278 }
1279
1280 if (sk->sk_state == TCP_SYN_SENT) {
1281 DEFINE_WAIT(wait);
1282
1283 for (;;) {
1284 prepare_to_wait(sk_sleep(sk), &wait,
1285 TASK_INTERRUPTIBLE);
1286 if (sk->sk_state != TCP_SYN_SENT)
1287 break;
1288 if (!signal_pending(current)) {
1289 release_sock(sk);
1290 schedule();
1291 lock_sock(sk);
1292 continue;
1293 }
1294 err = -ERESTARTSYS;
1295 break;
1296 }
1297 finish_wait(sk_sleep(sk), &wait);
1298
1299 if (err)
1300 goto out_release;
1301 }
1302
1303 if (sk->sk_state != TCP_ESTABLISHED) {
1304
1305 sock->state = SS_UNCONNECTED;
1306 err = sock_error(sk);
1307 goto out_release;
1308 }
1309
1310 sock->state = SS_CONNECTED;
1311
1312 err = 0;
1313out_release:
1314 release_sock(sk);
1315
1316 return err;
1317}
1318
1319static int ax25_accept(struct socket *sock, struct socket *newsock, int flags)
1320{
1321 struct sk_buff *skb;
1322 struct sock *newsk;
1323 DEFINE_WAIT(wait);
1324 struct sock *sk;
1325 int err = 0;
1326
1327 if (sock->state != SS_UNCONNECTED)
1328 return -EINVAL;
1329
1330 if ((sk = sock->sk) == NULL)
1331 return -EINVAL;
1332
1333 lock_sock(sk);
1334 if (sk->sk_type != SOCK_SEQPACKET) {
1335 err = -EOPNOTSUPP;
1336 goto out;
1337 }
1338
1339 if (sk->sk_state != TCP_LISTEN) {
1340 err = -EINVAL;
1341 goto out;
1342 }
1343
1344
1345
1346
1347
1348 for (;;) {
1349 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
1350 skb = skb_dequeue(&sk->sk_receive_queue);
1351 if (skb)
1352 break;
1353
1354 if (flags & O_NONBLOCK) {
1355 err = -EWOULDBLOCK;
1356 break;
1357 }
1358 if (!signal_pending(current)) {
1359 release_sock(sk);
1360 schedule();
1361 lock_sock(sk);
1362 continue;
1363 }
1364 err = -ERESTARTSYS;
1365 break;
1366 }
1367 finish_wait(sk_sleep(sk), &wait);
1368
1369 if (err)
1370 goto out;
1371
1372 newsk = skb->sk;
1373 sock_graft(newsk, newsock);
1374
1375
1376 kfree_skb(skb);
1377 sk->sk_ack_backlog--;
1378 newsock->state = SS_CONNECTED;
1379
1380out:
1381 release_sock(sk);
1382
1383 return err;
1384}
1385
1386static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
1387 int *uaddr_len, int peer)
1388{
1389 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1390 struct sock *sk = sock->sk;
1391 unsigned char ndigi, i;
1392 ax25_cb *ax25;
1393 int err = 0;
1394
1395 memset(fsa, 0, sizeof(*fsa));
1396 lock_sock(sk);
1397 ax25 = ax25_sk(sk);
1398
1399 if (peer != 0) {
1400 if (sk->sk_state != TCP_ESTABLISHED) {
1401 err = -ENOTCONN;
1402 goto out;
1403 }
1404
1405 fsa->fsa_ax25.sax25_family = AF_AX25;
1406 fsa->fsa_ax25.sax25_call = ax25->dest_addr;
1407
1408 if (ax25->digipeat != NULL) {
1409 ndigi = ax25->digipeat->ndigi;
1410 fsa->fsa_ax25.sax25_ndigis = ndigi;
1411 for (i = 0; i < ndigi; i++)
1412 fsa->fsa_digipeater[i] =
1413 ax25->digipeat->calls[i];
1414 }
1415 } else {
1416 fsa->fsa_ax25.sax25_family = AF_AX25;
1417 fsa->fsa_ax25.sax25_call = ax25->source_addr;
1418 fsa->fsa_ax25.sax25_ndigis = 1;
1419 if (ax25->ax25_dev != NULL) {
1420 memcpy(&fsa->fsa_digipeater[0],
1421 ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
1422 } else {
1423 fsa->fsa_digipeater[0] = null_ax25_address;
1424 }
1425 }
1426 *uaddr_len = sizeof (struct full_sockaddr_ax25);
1427
1428out:
1429 release_sock(sk);
1430
1431 return err;
1432}
1433
1434static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
1435 struct msghdr *msg, size_t len)
1436{
1437 struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
1438 struct sock *sk = sock->sk;
1439 struct sockaddr_ax25 sax;
1440 struct sk_buff *skb;
1441 ax25_digi dtmp, *dp;
1442 ax25_cb *ax25;
1443 size_t size;
1444 int lv, err, addr_len = msg->msg_namelen;
1445
1446 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
1447 return -EINVAL;
1448
1449 lock_sock(sk);
1450 ax25 = ax25_sk(sk);
1451
1452 if (sock_flag(sk, SOCK_ZAPPED)) {
1453 err = -EADDRNOTAVAIL;
1454 goto out;
1455 }
1456
1457 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1458 send_sig(SIGPIPE, current, 0);
1459 err = -EPIPE;
1460 goto out;
1461 }
1462
1463 if (ax25->ax25_dev == NULL) {
1464 err = -ENETUNREACH;
1465 goto out;
1466 }
1467
1468 if (len > ax25->ax25_dev->dev->mtu) {
1469 err = -EMSGSIZE;
1470 goto out;
1471 }
1472
1473 if (usax != NULL) {
1474 if (usax->sax25_family != AF_AX25) {
1475 err = -EINVAL;
1476 goto out;
1477 }
1478
1479 if (addr_len == sizeof(struct sockaddr_ax25))
1480
1481 ;
1482 else if (addr_len != sizeof(struct full_sockaddr_ax25))
1483
1484
1485
1486
1487 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1488 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1489 err = -EINVAL;
1490 goto out;
1491 }
1492
1493
1494 if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
1495 int ct = 0;
1496 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
1497
1498
1499 if (usax->sax25_ndigis < 1 || usax->sax25_ndigis > AX25_MAX_DIGIS) {
1500 err = -EINVAL;
1501 goto out;
1502 }
1503
1504 dtmp.ndigi = usax->sax25_ndigis;
1505
1506 while (ct < usax->sax25_ndigis) {
1507 dtmp.repeated[ct] = 0;
1508 dtmp.calls[ct] = fsa->fsa_digipeater[ct];
1509 ct++;
1510 }
1511
1512 dtmp.lastrepeat = 0;
1513 }
1514
1515 sax = *usax;
1516 if (sk->sk_type == SOCK_SEQPACKET &&
1517 ax25cmp(&ax25->dest_addr, &sax.sax25_call)) {
1518 err = -EISCONN;
1519 goto out;
1520 }
1521 if (usax->sax25_ndigis == 0)
1522 dp = NULL;
1523 else
1524 dp = &dtmp;
1525 } else {
1526
1527
1528
1529
1530
1531 if (sk->sk_state != TCP_ESTABLISHED) {
1532 err = -ENOTCONN;
1533 goto out;
1534 }
1535 sax.sax25_family = AF_AX25;
1536 sax.sax25_call = ax25->dest_addr;
1537 dp = ax25->digipeat;
1538 }
1539
1540
1541 SOCK_DEBUG(sk, "AX.25: sendto: Addresses built. Building packet.\n");
1542
1543
1544 size = len + ax25->ax25_dev->dev->hard_header_len;
1545
1546 skb = sock_alloc_send_skb(sk, size, msg->msg_flags&MSG_DONTWAIT, &err);
1547 if (skb == NULL)
1548 goto out;
1549
1550 skb_reserve(skb, size - len);
1551
1552 SOCK_DEBUG(sk, "AX.25: Appending user data\n");
1553
1554
1555 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
1556 err = -EFAULT;
1557 kfree_skb(skb);
1558 goto out;
1559 }
1560
1561 skb_reset_network_header(skb);
1562
1563
1564 if (!ax25->pidincl)
1565 *skb_push(skb, 1) = sk->sk_protocol;
1566
1567 SOCK_DEBUG(sk, "AX.25: Transmitting buffer\n");
1568
1569 if (sk->sk_type == SOCK_SEQPACKET) {
1570
1571 if (sk->sk_state != TCP_ESTABLISHED) {
1572 kfree_skb(skb);
1573 err = -ENOTCONN;
1574 goto out;
1575 }
1576
1577
1578 ax25_output(ax25, ax25->paclen, skb);
1579
1580 err = len;
1581 goto out;
1582 }
1583
1584 skb_push(skb, 1 + ax25_addr_size(dp));
1585
1586 SOCK_DEBUG(sk, "Building AX.25 Header (dp=%p).\n", dp);
1587
1588 if (dp != NULL)
1589 SOCK_DEBUG(sk, "Num digipeaters=%d\n", dp->ndigi);
1590
1591
1592 lv = ax25_addr_build(skb->data, &ax25->source_addr, &sax.sax25_call,
1593 dp, AX25_COMMAND, AX25_MODULUS);
1594
1595 SOCK_DEBUG(sk, "Built header (%d bytes)\n",lv);
1596
1597 skb_set_transport_header(skb, lv);
1598
1599 SOCK_DEBUG(sk, "base=%p pos=%p\n",
1600 skb->data, skb_transport_header(skb));
1601
1602 *skb_transport_header(skb) = AX25_UI;
1603
1604
1605 ax25_queue_xmit(skb, ax25->ax25_dev->dev);
1606
1607 err = len;
1608
1609out:
1610 release_sock(sk);
1611
1612 return err;
1613}
1614
1615static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
1616 struct msghdr *msg, size_t size, int flags)
1617{
1618 struct sock *sk = sock->sk;
1619 struct sk_buff *skb;
1620 int copied;
1621 int err = 0;
1622
1623 lock_sock(sk);
1624
1625
1626
1627
1628 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) {
1629 err = -ENOTCONN;
1630 goto out;
1631 }
1632
1633
1634 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
1635 flags & MSG_DONTWAIT, &err);
1636 if (skb == NULL)
1637 goto out;
1638
1639 if (!ax25_sk(sk)->pidincl)
1640 skb_pull(skb, 1);
1641
1642 skb_reset_transport_header(skb);
1643 copied = skb->len;
1644
1645 if (copied > size) {
1646 copied = size;
1647 msg->msg_flags |= MSG_TRUNC;
1648 }
1649
1650 skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
1651
1652 if (msg->msg_namelen != 0) {
1653 struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
1654 ax25_digi digi;
1655 ax25_address src;
1656 const unsigned char *mac = skb_mac_header(skb);
1657
1658 ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL,
1659 &digi, NULL, NULL);
1660 sax->sax25_family = AF_AX25;
1661
1662
1663
1664 sax->sax25_ndigis = digi.ndigi;
1665 sax->sax25_call = src;
1666
1667 if (sax->sax25_ndigis != 0) {
1668 int ct;
1669 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
1670
1671 for (ct = 0; ct < digi.ndigi; ct++)
1672 fsa->fsa_digipeater[ct] = digi.calls[ct];
1673 }
1674 msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
1675 }
1676
1677 skb_free_datagram(sk, skb);
1678 err = copied;
1679
1680out:
1681 release_sock(sk);
1682
1683 return err;
1684}
1685
1686static int ax25_shutdown(struct socket *sk, int how)
1687{
1688
1689 return -EOPNOTSUPP;
1690}
1691
1692static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1693{
1694 struct sock *sk = sock->sk;
1695 void __user *argp = (void __user *)arg;
1696 int res = 0;
1697
1698 lock_sock(sk);
1699 switch (cmd) {
1700 case TIOCOUTQ: {
1701 long amount;
1702
1703 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
1704 if (amount < 0)
1705 amount = 0;
1706 res = put_user(amount, (int __user *)argp);
1707 break;
1708 }
1709
1710 case TIOCINQ: {
1711 struct sk_buff *skb;
1712 long amount = 0L;
1713
1714 if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1715 amount = skb->len;
1716 res = put_user(amount, (int __user *) argp);
1717 break;
1718 }
1719
1720 case SIOCGSTAMP:
1721 res = sock_get_timestamp(sk, argp);
1722 break;
1723
1724 case SIOCGSTAMPNS:
1725 res = sock_get_timestampns(sk, argp);
1726 break;
1727
1728 case SIOCAX25ADDUID:
1729 case SIOCAX25DELUID:
1730 case SIOCAX25GETUID: {
1731 struct sockaddr_ax25 sax25;
1732 if (copy_from_user(&sax25, argp, sizeof(sax25))) {
1733 res = -EFAULT;
1734 break;
1735 }
1736 res = ax25_uid_ioctl(cmd, &sax25);
1737 break;
1738 }
1739
1740 case SIOCAX25NOUID: {
1741 long amount;
1742 if (!capable(CAP_NET_ADMIN)) {
1743 res = -EPERM;
1744 break;
1745 }
1746 if (get_user(amount, (long __user *)argp)) {
1747 res = -EFAULT;
1748 break;
1749 }
1750 if (amount > AX25_NOUID_BLOCK) {
1751 res = -EINVAL;
1752 break;
1753 }
1754 ax25_uid_policy = amount;
1755 res = 0;
1756 break;
1757 }
1758
1759 case SIOCADDRT:
1760 case SIOCDELRT:
1761 case SIOCAX25OPTRT:
1762 if (!capable(CAP_NET_ADMIN)) {
1763 res = -EPERM;
1764 break;
1765 }
1766 res = ax25_rt_ioctl(cmd, argp);
1767 break;
1768
1769 case SIOCAX25CTLCON:
1770 if (!capable(CAP_NET_ADMIN)) {
1771 res = -EPERM;
1772 break;
1773 }
1774 res = ax25_ctl_ioctl(cmd, argp);
1775 break;
1776
1777 case SIOCAX25GETINFO:
1778 case SIOCAX25GETINFOOLD: {
1779 ax25_cb *ax25 = ax25_sk(sk);
1780 struct ax25_info_struct ax25_info;
1781
1782 ax25_info.t1 = ax25->t1 / HZ;
1783 ax25_info.t2 = ax25->t2 / HZ;
1784 ax25_info.t3 = ax25->t3 / HZ;
1785 ax25_info.idle = ax25->idle / (60 * HZ);
1786 ax25_info.n2 = ax25->n2;
1787 ax25_info.t1timer = ax25_display_timer(&ax25->t1timer) / HZ;
1788 ax25_info.t2timer = ax25_display_timer(&ax25->t2timer) / HZ;
1789 ax25_info.t3timer = ax25_display_timer(&ax25->t3timer) / HZ;
1790 ax25_info.idletimer = ax25_display_timer(&ax25->idletimer) / (60 * HZ);
1791 ax25_info.n2count = ax25->n2count;
1792 ax25_info.state = ax25->state;
1793 ax25_info.rcv_q = sk_rmem_alloc_get(sk);
1794 ax25_info.snd_q = sk_wmem_alloc_get(sk);
1795 ax25_info.vs = ax25->vs;
1796 ax25_info.vr = ax25->vr;
1797 ax25_info.va = ax25->va;
1798 ax25_info.vs_max = ax25->vs;
1799 ax25_info.paclen = ax25->paclen;
1800 ax25_info.window = ax25->window;
1801
1802
1803 if (cmd == SIOCAX25GETINFOOLD) {
1804 static int warned = 0;
1805 if (!warned) {
1806 printk(KERN_INFO "%s uses old SIOCAX25GETINFO\n",
1807 current->comm);
1808 warned=1;
1809 }
1810
1811 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct_deprecated))) {
1812 res = -EFAULT;
1813 break;
1814 }
1815 } else {
1816 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct))) {
1817 res = -EINVAL;
1818 break;
1819 }
1820 }
1821 res = 0;
1822 break;
1823 }
1824
1825 case SIOCAX25ADDFWD:
1826 case SIOCAX25DELFWD: {
1827 struct ax25_fwd_struct ax25_fwd;
1828 if (!capable(CAP_NET_ADMIN)) {
1829 res = -EPERM;
1830 break;
1831 }
1832 if (copy_from_user(&ax25_fwd, argp, sizeof(ax25_fwd))) {
1833 res = -EFAULT;
1834 break;
1835 }
1836 res = ax25_fwd_ioctl(cmd, &ax25_fwd);
1837 break;
1838 }
1839
1840 case SIOCGIFADDR:
1841 case SIOCSIFADDR:
1842 case SIOCGIFDSTADDR:
1843 case SIOCSIFDSTADDR:
1844 case SIOCGIFBRDADDR:
1845 case SIOCSIFBRDADDR:
1846 case SIOCGIFNETMASK:
1847 case SIOCSIFNETMASK:
1848 case SIOCGIFMETRIC:
1849 case SIOCSIFMETRIC:
1850 res = -EINVAL;
1851 break;
1852
1853 default:
1854 res = -ENOIOCTLCMD;
1855 break;
1856 }
1857 release_sock(sk);
1858
1859 return res;
1860}
1861
1862#ifdef CONFIG_PROC_FS
1863
1864static void *ax25_info_start(struct seq_file *seq, loff_t *pos)
1865 __acquires(ax25_list_lock)
1866{
1867 spin_lock_bh(&ax25_list_lock);
1868 return seq_hlist_start(&ax25_list, *pos);
1869}
1870
1871static void *ax25_info_next(struct seq_file *seq, void *v, loff_t *pos)
1872{
1873 return seq_hlist_next(v, &ax25_list, pos);
1874}
1875
1876static void ax25_info_stop(struct seq_file *seq, void *v)
1877 __releases(ax25_list_lock)
1878{
1879 spin_unlock_bh(&ax25_list_lock);
1880}
1881
1882static int ax25_info_show(struct seq_file *seq, void *v)
1883{
1884 ax25_cb *ax25 = hlist_entry(v, struct ax25_cb, ax25_node);
1885 char buf[11];
1886 int k;
1887
1888
1889
1890
1891
1892
1893
1894 seq_printf(seq, "%8.8lx %s %s%s ",
1895 (long) ax25,
1896 ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
1897 ax2asc(buf, &ax25->source_addr),
1898 ax25->iamdigi? "*":"");
1899 seq_printf(seq, "%s", ax2asc(buf, &ax25->dest_addr));
1900
1901 for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
1902 seq_printf(seq, ",%s%s",
1903 ax2asc(buf, &ax25->digipeat->calls[k]),
1904 ax25->digipeat->repeated[k]? "*":"");
1905 }
1906
1907 seq_printf(seq, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
1908 ax25->state,
1909 ax25->vs, ax25->vr, ax25->va,
1910 ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
1911 ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
1912 ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
1913 ax25_display_timer(&ax25->idletimer) / (60 * HZ),
1914 ax25->idle / (60 * HZ),
1915 ax25->n2count, ax25->n2,
1916 ax25->rtt / HZ,
1917 ax25->window,
1918 ax25->paclen);
1919
1920 if (ax25->sk != NULL) {
1921 seq_printf(seq, " %d %d %lu\n",
1922 sk_wmem_alloc_get(ax25->sk),
1923 sk_rmem_alloc_get(ax25->sk),
1924 sock_i_ino(ax25->sk));
1925 } else {
1926 seq_puts(seq, " * * *\n");
1927 }
1928 return 0;
1929}
1930
1931static const struct seq_operations ax25_info_seqops = {
1932 .start = ax25_info_start,
1933 .next = ax25_info_next,
1934 .stop = ax25_info_stop,
1935 .show = ax25_info_show,
1936};
1937
1938static int ax25_info_open(struct inode *inode, struct file *file)
1939{
1940 return seq_open(file, &ax25_info_seqops);
1941}
1942
1943static const struct file_operations ax25_info_fops = {
1944 .owner = THIS_MODULE,
1945 .open = ax25_info_open,
1946 .read = seq_read,
1947 .llseek = seq_lseek,
1948 .release = seq_release,
1949};
1950
1951#endif
1952
1953static const struct net_proto_family ax25_family_ops = {
1954 .family = PF_AX25,
1955 .create = ax25_create,
1956 .owner = THIS_MODULE,
1957};
1958
1959static const struct proto_ops ax25_proto_ops = {
1960 .family = PF_AX25,
1961 .owner = THIS_MODULE,
1962 .release = ax25_release,
1963 .bind = ax25_bind,
1964 .connect = ax25_connect,
1965 .socketpair = sock_no_socketpair,
1966 .accept = ax25_accept,
1967 .getname = ax25_getname,
1968 .poll = datagram_poll,
1969 .ioctl = ax25_ioctl,
1970 .listen = ax25_listen,
1971 .shutdown = ax25_shutdown,
1972 .setsockopt = ax25_setsockopt,
1973 .getsockopt = ax25_getsockopt,
1974 .sendmsg = ax25_sendmsg,
1975 .recvmsg = ax25_recvmsg,
1976 .mmap = sock_no_mmap,
1977 .sendpage = sock_no_sendpage,
1978};
1979
1980
1981
1982
1983static struct packet_type ax25_packet_type __read_mostly = {
1984 .type = cpu_to_be16(ETH_P_AX25),
1985 .func = ax25_kiss_rcv,
1986};
1987
1988static struct notifier_block ax25_dev_notifier = {
1989 .notifier_call =ax25_device_event,
1990};
1991
1992static 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(&init_net, "ax25_route", S_IRUGO, &ax25_route_fops);
2005 proc_net_fops_create(&init_net, "ax25", S_IRUGO, &ax25_info_fops);
2006 proc_net_fops_create(&init_net, "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(&init_net, "ax25_route");
2021 proc_net_remove(&init_net, "ax25");
2022 proc_net_remove(&init_net, "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);
2036