ia64/linux-2.6.18-xen.hg

view net/ax25/af_ax25.c @ 673:3161879fdf22

[IA64] xencomm: support XENMEM_add_to_physmap and XENMEM_remove_from_phsymap

support XENMEM_add_to_physmap and XENMEM_remove_from_phsymap.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
author Isaku Yamahata <yamahata@valinux.co.jp>
date Tue Sep 16 21:26:15 2008 +0900 (2008-09-16)
parents 831230e53067
children
line source
1 /*
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 */
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/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>
48 #include <net/tcp_states.h>
49 #include <net/ip.h>
50 #include <net/arp.h>
54 HLIST_HEAD(ax25_list);
55 DEFINE_SPINLOCK(ax25_list_lock);
57 static const struct proto_ops ax25_proto_ops;
59 static void ax25_free_sock(struct sock *sk)
60 {
61 ax25_cb_put(ax25_sk(sk));
62 }
64 /*
65 * Socket removal during an interrupt is now safe.
66 */
67 static 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 }
77 /*
78 * Kill all bound sockets on a dropped device.
79 */
80 static void ax25_kill_by_device(struct net_device *dev)
81 {
82 ax25_dev *ax25_dev;
83 ax25_cb *s;
84 struct hlist_node *node;
86 if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
87 return;
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 }
99 /*
100 * Handle device status changes.
101 */
102 static int ax25_device_event(struct notifier_block *this, unsigned long event,
103 void *ptr)
104 {
105 struct net_device *dev = (struct net_device *)ptr;
107 /* Reject non AX.25 devices */
108 if (dev->type != ARPHRD_AX25)
109 return NOTIFY_DONE;
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 }
124 return NOTIFY_DONE;
125 }
127 /*
128 * Add a socket to the bound sockets list.
129 */
130 void 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 }
138 /*
139 * Find a socket that wants to accept the SABM we have just
140 * received.
141 */
142 struct 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;
148 spin_lock(&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(&ax25_list_lock);
158 return s->sk;
159 }
160 }
161 }
162 spin_unlock(&ax25_list_lock);
164 return NULL;
165 }
167 /*
168 * Find an AX.25 socket given both ends.
169 */
170 struct 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;
177 spin_lock(&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 }
188 spin_unlock(&ax25_list_lock);
190 return sk;
191 }
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 */
197 ax25_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;
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);
222 return s;
223 }
224 }
225 spin_unlock_bh(&ax25_list_lock);
227 return NULL;
228 }
230 EXPORT_SYMBOL(ax25_find_cb);
232 void 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;
238 spin_lock(&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(&ax25_list_lock);
252 }
254 /*
255 * Deferred destroy.
256 */
257 void ax25_destroy_socket(ax25_cb *);
259 /*
260 * Handler for deferred kills.
261 */
262 static void ax25_destroy_timer(unsigned long data)
263 {
264 ax25_cb *ax25=(ax25_cb *)data;
265 struct sock *sk;
267 sk=ax25->sk;
269 bh_lock_sock(sk);
270 sock_hold(sk);
271 ax25_destroy_socket(ax25);
272 bh_unlock_sock(sk);
273 sock_put(sk);
274 }
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 */
282 void ax25_destroy_socket(ax25_cb *ax25)
283 {
284 struct sk_buff *skb;
286 ax25_cb_del(ax25);
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);
294 ax25_clear_queues(ax25); /* Flush the queues */
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);
302 /* Queue the unaccepted socket for death */
303 sock_orphan(skb->sk);
305 ax25_start_heartbeat(sax25);
306 sax25->state = AX25_STATE_0;
307 }
309 kfree_skb(skb);
310 }
311 skb_queue_purge(&ax25->sk->sk_write_queue);
312 }
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 }
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 */
338 static 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;
346 if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
347 return -EFAULT;
349 if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
350 return -ENODEV;
352 if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
353 return -EINVAL;
355 digi.ndigi = ax25_ctl.digi_count;
356 for (k = 0; k < digi.ndigi; k++)
357 digi.calls[k] = ax25_ctl.digi_addr[k];
359 if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
360 return -ENOTCONN;
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;
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;
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;
390 case AX25_T2:
391 if (ax25_ctl.arg < 1)
392 return -EINVAL;
393 ax25->t2 = ax25_ctl.arg * HZ;
394 break;
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;
403 case AX25_T3:
404 if (ax25_ctl.arg < 0)
405 return -EINVAL;
406 ax25->t3 = ax25_ctl.arg * HZ;
407 break;
409 case AX25_IDLE:
410 if (ax25_ctl.arg < 0)
411 return -EINVAL;
412 ax25->idle = ax25_ctl.arg * 60 * HZ;
413 break;
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;
421 default:
422 return -EINVAL;
423 }
425 return 0;
426 }
428 static 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];
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 }
448 /*
449 * Fill in a created AX.25 created control block with the default
450 * values for a particular device.
451 */
452 void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
453 {
454 ax25->ax25_dev = ax25_dev;
456 if (ax25->ax25_dev != NULL) {
457 ax25_fillin_cb_from_dev(ax25, ax25_dev);
458 return;
459 }
461 /*
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;
473 if (AX25_DEF_AXDEFMODE) {
474 ax25->modulus = AX25_EMODULUS;
475 ax25->window = AX25_DEF_EWINDOW;
476 } else {
477 ax25->modulus = AX25_MODULUS;
478 ax25->window = AX25_DEF_WINDOW;
479 }
480 }
482 /*
483 * Create an empty AX.25 control block.
484 */
485 ax25_cb *ax25_create_cb(void)
486 {
487 ax25_cb *ax25;
489 if ((ax25 = kzalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
490 return NULL;
492 atomic_set(&ax25->refcount, 1);
494 skb_queue_head_init(&ax25->write_queue);
495 skb_queue_head_init(&ax25->frag_queue);
496 skb_queue_head_init(&ax25->ack_queue);
497 skb_queue_head_init(&ax25->reseq_queue);
499 init_timer(&ax25->timer);
500 init_timer(&ax25->t1timer);
501 init_timer(&ax25->t2timer);
502 init_timer(&ax25->t3timer);
503 init_timer(&ax25->idletimer);
505 ax25_fillin_cb(ax25, NULL);
507 ax25->state = AX25_STATE_0;
509 return ax25;
510 }
512 /*
513 * Handling for system calls applied via the various interfaces to an
514 * AX25 socket object
515 */
517 static int ax25_setsockopt(struct socket *sock, int level, int optname,
518 char __user *optval, int optlen)
519 {
520 struct sock *sk = sock->sk;
521 ax25_cb *ax25;
522 struct net_device *dev;
523 char devname[IFNAMSIZ];
524 int opt, res = 0;
526 if (level != SOL_AX25)
527 return -ENOPROTOOPT;
529 if (optlen < sizeof(int))
530 return -EINVAL;
532 if (get_user(opt, (int __user *)optval))
533 return -EFAULT;
535 lock_sock(sk);
536 ax25 = ax25_sk(sk);
538 switch (optname) {
539 case AX25_WINDOW:
540 if (ax25->modulus == AX25_MODULUS) {
541 if (opt < 1 || opt > 7) {
542 res = -EINVAL;
543 break;
544 }
545 } else {
546 if (opt < 1 || opt > 63) {
547 res = -EINVAL;
548 break;
549 }
550 }
551 ax25->window = opt;
552 break;
554 case AX25_T1:
555 if (opt < 1) {
556 res = -EINVAL;
557 break;
558 }
559 ax25->rtt = (opt * HZ) / 2;
560 ax25->t1 = opt * HZ;
561 break;
563 case AX25_T2:
564 if (opt < 1) {
565 res = -EINVAL;
566 break;
567 }
568 ax25->t2 = opt * HZ;
569 break;
571 case AX25_N2:
572 if (opt < 1 || opt > 31) {
573 res = -EINVAL;
574 break;
575 }
576 ax25->n2 = opt;
577 break;
579 case AX25_T3:
580 if (opt < 1) {
581 res = -EINVAL;
582 break;
583 }
584 ax25->t3 = opt * HZ;
585 break;
587 case AX25_IDLE:
588 if (opt < 0) {
589 res = -EINVAL;
590 break;
591 }
592 ax25->idle = opt * 60 * HZ;
593 break;
595 case AX25_BACKOFF:
596 if (opt < 0 || opt > 2) {
597 res = -EINVAL;
598 break;
599 }
600 ax25->backoff = opt;
601 break;
603 case AX25_EXTSEQ:
604 ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
605 break;
607 case AX25_PIDINCL:
608 ax25->pidincl = opt ? 1 : 0;
609 break;
611 case AX25_IAMDIGI:
612 ax25->iamdigi = opt ? 1 : 0;
613 break;
615 case AX25_PACLEN:
616 if (opt < 16 || opt > 65535) {
617 res = -EINVAL;
618 break;
619 }
620 ax25->paclen = opt;
621 break;
623 case SO_BINDTODEVICE:
624 if (optlen > IFNAMSIZ)
625 optlen=IFNAMSIZ;
626 if (copy_from_user(devname, optval, optlen)) {
627 res = -EFAULT;
628 break;
629 }
631 dev = dev_get_by_name(devname);
632 if (dev == NULL) {
633 res = -ENODEV;
634 break;
635 }
637 if (sk->sk_type == SOCK_SEQPACKET &&
638 (sock->state != SS_UNCONNECTED ||
639 sk->sk_state == TCP_LISTEN)) {
640 res = -EADDRNOTAVAIL;
641 dev_put(dev);
642 break;
643 }
645 ax25->ax25_dev = ax25_dev_ax25dev(dev);
646 ax25_fillin_cb(ax25, ax25->ax25_dev);
647 break;
649 default:
650 res = -ENOPROTOOPT;
651 }
652 release_sock(sk);
654 return res;
655 }
657 static int ax25_getsockopt(struct socket *sock, int level, int optname,
658 char __user *optval, int __user *optlen)
659 {
660 struct sock *sk = sock->sk;
661 ax25_cb *ax25;
662 struct ax25_dev *ax25_dev;
663 char devname[IFNAMSIZ];
664 void *valptr;
665 int val = 0;
666 int maxlen, length;
668 if (level != SOL_AX25)
669 return -ENOPROTOOPT;
671 if (get_user(maxlen, optlen))
672 return -EFAULT;
674 if (maxlen < 1)
675 return -EFAULT;
677 valptr = (void *) &val;
678 length = min_t(unsigned int, maxlen, sizeof(int));
680 lock_sock(sk);
681 ax25 = ax25_sk(sk);
683 switch (optname) {
684 case AX25_WINDOW:
685 val = ax25->window;
686 break;
688 case AX25_T1:
689 val = ax25->t1 / HZ;
690 break;
692 case AX25_T2:
693 val = ax25->t2 / HZ;
694 break;
696 case AX25_N2:
697 val = ax25->n2;
698 break;
700 case AX25_T3:
701 val = ax25->t3 / HZ;
702 break;
704 case AX25_IDLE:
705 val = ax25->idle / (60 * HZ);
706 break;
708 case AX25_BACKOFF:
709 val = ax25->backoff;
710 break;
712 case AX25_EXTSEQ:
713 val = (ax25->modulus == AX25_EMODULUS);
714 break;
716 case AX25_PIDINCL:
717 val = ax25->pidincl;
718 break;
720 case AX25_IAMDIGI:
721 val = ax25->iamdigi;
722 break;
724 case AX25_PACLEN:
725 val = ax25->paclen;
726 break;
728 case SO_BINDTODEVICE:
729 ax25_dev = ax25->ax25_dev;
731 if (ax25_dev != NULL && ax25_dev->dev != NULL) {
732 strlcpy(devname, ax25_dev->dev->name, sizeof(devname));
733 length = strlen(devname) + 1;
734 } else {
735 *devname = '\0';
736 length = 1;
737 }
739 valptr = (void *) devname;
740 break;
742 default:
743 release_sock(sk);
744 return -ENOPROTOOPT;
745 }
746 release_sock(sk);
748 if (put_user(length, optlen))
749 return -EFAULT;
751 return copy_to_user(optval, valptr, length) ? -EFAULT : 0;
752 }
754 static int ax25_listen(struct socket *sock, int backlog)
755 {
756 struct sock *sk = sock->sk;
757 int res = 0;
759 lock_sock(sk);
760 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_LISTEN) {
761 sk->sk_max_ack_backlog = backlog;
762 sk->sk_state = TCP_LISTEN;
763 goto out;
764 }
765 res = -EOPNOTSUPP;
767 out:
768 release_sock(sk);
770 return res;
771 }
773 /*
774 * XXX: when creating ax25_sock we should update the .obj_size setting
775 * below.
776 */
777 static struct proto ax25_proto = {
778 .name = "AX25",
779 .owner = THIS_MODULE,
780 .obj_size = sizeof(struct sock),
781 };
783 static int ax25_create(struct socket *sock, int protocol)
784 {
785 struct sock *sk;
786 ax25_cb *ax25;
788 switch (sock->type) {
789 case SOCK_DGRAM:
790 if (protocol == 0 || protocol == PF_AX25)
791 protocol = AX25_P_TEXT;
792 break;
794 case SOCK_SEQPACKET:
795 switch (protocol) {
796 case 0:
797 case PF_AX25: /* For CLX */
798 protocol = AX25_P_TEXT;
799 break;
800 case AX25_P_SEGMENT:
801 #ifdef CONFIG_INET
802 case AX25_P_ARP:
803 case AX25_P_IP:
804 #endif
805 #ifdef CONFIG_NETROM
806 case AX25_P_NETROM:
807 #endif
808 #ifdef CONFIG_ROSE
809 case AX25_P_ROSE:
810 #endif
811 return -ESOCKTNOSUPPORT;
812 #ifdef CONFIG_NETROM_MODULE
813 case AX25_P_NETROM:
814 if (ax25_protocol_is_registered(AX25_P_NETROM))
815 return -ESOCKTNOSUPPORT;
816 #endif
817 #ifdef CONFIG_ROSE_MODULE
818 case AX25_P_ROSE:
819 if (ax25_protocol_is_registered(AX25_P_ROSE))
820 return -ESOCKTNOSUPPORT;
821 #endif
822 default:
823 break;
824 }
825 break;
827 case SOCK_RAW:
828 break;
829 default:
830 return -ESOCKTNOSUPPORT;
831 }
833 if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, &ax25_proto, 1)) == NULL)
834 return -ENOMEM;
836 ax25 = sk->sk_protinfo = ax25_create_cb();
837 if (!ax25) {
838 sk_free(sk);
839 return -ENOMEM;
840 }
842 sock_init_data(sock, sk);
844 sk->sk_destruct = ax25_free_sock;
845 sock->ops = &ax25_proto_ops;
846 sk->sk_protocol = protocol;
848 ax25->sk = sk;
850 return 0;
851 }
853 struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
854 {
855 struct sock *sk;
856 ax25_cb *ax25, *oax25;
858 if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, osk->sk_prot, 1)) == NULL)
859 return NULL;
861 if ((ax25 = ax25_create_cb()) == NULL) {
862 sk_free(sk);
863 return NULL;
864 }
866 switch (osk->sk_type) {
867 case SOCK_DGRAM:
868 break;
869 case SOCK_SEQPACKET:
870 break;
871 default:
872 sk_free(sk);
873 ax25_cb_put(ax25);
874 return NULL;
875 }
877 sock_init_data(NULL, sk);
879 sk->sk_destruct = ax25_free_sock;
880 sk->sk_type = osk->sk_type;
881 sk->sk_socket = osk->sk_socket;
882 sk->sk_priority = osk->sk_priority;
883 sk->sk_protocol = osk->sk_protocol;
884 sk->sk_rcvbuf = osk->sk_rcvbuf;
885 sk->sk_sndbuf = osk->sk_sndbuf;
886 sk->sk_state = TCP_ESTABLISHED;
887 sk->sk_sleep = osk->sk_sleep;
888 sock_copy_flags(sk, osk);
890 oax25 = ax25_sk(osk);
892 ax25->modulus = oax25->modulus;
893 ax25->backoff = oax25->backoff;
894 ax25->pidincl = oax25->pidincl;
895 ax25->iamdigi = oax25->iamdigi;
896 ax25->rtt = oax25->rtt;
897 ax25->t1 = oax25->t1;
898 ax25->t2 = oax25->t2;
899 ax25->t3 = oax25->t3;
900 ax25->n2 = oax25->n2;
901 ax25->idle = oax25->idle;
902 ax25->paclen = oax25->paclen;
903 ax25->window = oax25->window;
905 ax25->ax25_dev = ax25_dev;
906 ax25->source_addr = oax25->source_addr;
908 if (oax25->digipeat != NULL) {
909 if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
910 sk_free(sk);
911 ax25_cb_put(ax25);
912 return NULL;
913 }
915 memcpy(ax25->digipeat, oax25->digipeat, sizeof(ax25_digi));
916 }
918 sk->sk_protinfo = ax25;
919 ax25->sk = sk;
921 return sk;
922 }
924 static int ax25_release(struct socket *sock)
925 {
926 struct sock *sk = sock->sk;
927 ax25_cb *ax25;
929 if (sk == NULL)
930 return 0;
932 sock_hold(sk);
933 sock_orphan(sk);
934 lock_sock(sk);
935 ax25 = ax25_sk(sk);
937 if (sk->sk_type == SOCK_SEQPACKET) {
938 switch (ax25->state) {
939 case AX25_STATE_0:
940 release_sock(sk);
941 ax25_disconnect(ax25, 0);
942 lock_sock(sk);
943 ax25_destroy_socket(ax25);
944 break;
946 case AX25_STATE_1:
947 case AX25_STATE_2:
948 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
949 release_sock(sk);
950 ax25_disconnect(ax25, 0);
951 lock_sock(sk);
952 ax25_destroy_socket(ax25);
953 break;
955 case AX25_STATE_3:
956 case AX25_STATE_4:
957 ax25_clear_queues(ax25);
958 ax25->n2count = 0;
960 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
961 case AX25_PROTO_STD_SIMPLEX:
962 case AX25_PROTO_STD_DUPLEX:
963 ax25_send_control(ax25,
964 AX25_DISC,
965 AX25_POLLON,
966 AX25_COMMAND);
967 ax25_stop_t2timer(ax25);
968 ax25_stop_t3timer(ax25);
969 ax25_stop_idletimer(ax25);
970 break;
971 #ifdef CONFIG_AX25_DAMA_SLAVE
972 case AX25_PROTO_DAMA_SLAVE:
973 ax25_stop_t3timer(ax25);
974 ax25_stop_idletimer(ax25);
975 break;
976 #endif
977 }
978 ax25_calculate_t1(ax25);
979 ax25_start_t1timer(ax25);
980 ax25->state = AX25_STATE_2;
981 sk->sk_state = TCP_CLOSE;
982 sk->sk_shutdown |= SEND_SHUTDOWN;
983 sk->sk_state_change(sk);
984 sock_set_flag(sk, SOCK_DESTROY);
985 break;
987 default:
988 break;
989 }
990 } else {
991 sk->sk_state = TCP_CLOSE;
992 sk->sk_shutdown |= SEND_SHUTDOWN;
993 sk->sk_state_change(sk);
994 ax25_destroy_socket(ax25);
995 }
997 sock->sk = NULL;
998 release_sock(sk);
999 sock_put(sk);
1001 return 0;
1004 /*
1005 * We support a funny extension here so you can (as root) give any callsign
1006 * digipeated via a local address as source. This hack is obsolete now
1007 * that we've implemented support for SO_BINDTODEVICE. It is however small
1008 * and trivially backward compatible.
1009 */
1010 static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1012 struct sock *sk = sock->sk;
1013 struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
1014 ax25_dev *ax25_dev = NULL;
1015 ax25_uid_assoc *user;
1016 ax25_address call;
1017 ax25_cb *ax25;
1018 int err = 0;
1020 if (addr_len != sizeof(struct sockaddr_ax25) &&
1021 addr_len != sizeof(struct full_sockaddr_ax25)) {
1022 /* support for old structure may go away some time */
1023 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1024 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1025 return -EINVAL;
1028 printk(KERN_WARNING "ax25_bind(): %s uses old (6 digipeater) socket structure.\n",
1029 current->comm);
1032 if (addr->fsa_ax25.sax25_family != AF_AX25)
1033 return -EINVAL;
1035 user = ax25_findbyuid(current->euid);
1036 if (user) {
1037 call = user->call;
1038 ax25_uid_put(user);
1039 } else {
1040 if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
1041 return -EACCES;
1043 call = addr->fsa_ax25.sax25_call;
1046 lock_sock(sk);
1048 ax25 = ax25_sk(sk);
1049 if (!sock_flag(sk, SOCK_ZAPPED)) {
1050 err = -EINVAL;
1051 goto out;
1054 ax25->source_addr = call;
1056 /*
1057 * User already set interface with SO_BINDTODEVICE
1058 */
1059 if (ax25->ax25_dev != NULL)
1060 goto done;
1062 if (addr_len > sizeof(struct sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
1063 if (ax25cmp(&addr->fsa_digipeater[0], &null_ax25_address) != 0 &&
1064 (ax25_dev = ax25_addr_ax25dev(&addr->fsa_digipeater[0])) == NULL) {
1065 err = -EADDRNOTAVAIL;
1066 goto out;
1068 } else {
1069 if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL) {
1070 err = -EADDRNOTAVAIL;
1071 goto out;
1075 if (ax25_dev != NULL)
1076 ax25_fillin_cb(ax25, ax25_dev);
1078 done:
1079 ax25_cb_add(ax25);
1080 sock_reset_flag(sk, SOCK_ZAPPED);
1082 out:
1083 release_sock(sk);
1085 return 0;
1088 /*
1089 * FIXME: nonblock behaviour looks like it may have a bug.
1090 */
1091 static int ax25_connect(struct socket *sock, struct sockaddr *uaddr,
1092 int addr_len, int flags)
1094 struct sock *sk = sock->sk;
1095 ax25_cb *ax25 = ax25_sk(sk), *ax25t;
1096 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1097 ax25_digi *digi = NULL;
1098 int ct = 0, err = 0;
1100 /*
1101 * some sanity checks. code further down depends on this
1102 */
1104 if (addr_len == sizeof(struct sockaddr_ax25)) {
1105 /* support for this will go away in early 2.5.x */
1106 printk(KERN_WARNING "ax25_connect(): %s uses obsolete socket structure\n",
1107 current->comm);
1109 else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
1110 /* support for old structure may go away some time */
1111 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1112 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1113 return -EINVAL;
1116 printk(KERN_WARNING "ax25_connect(): %s uses old (6 digipeater) socket structure.\n",
1117 current->comm);
1120 if (fsa->fsa_ax25.sax25_family != AF_AX25)
1121 return -EINVAL;
1123 lock_sock(sk);
1125 /* deal with restarts */
1126 if (sock->state == SS_CONNECTING) {
1127 switch (sk->sk_state) {
1128 case TCP_SYN_SENT: /* still trying */
1129 err = -EINPROGRESS;
1130 goto out;
1132 case TCP_ESTABLISHED: /* connection established */
1133 sock->state = SS_CONNECTED;
1134 goto out;
1136 case TCP_CLOSE: /* connection refused */
1137 sock->state = SS_UNCONNECTED;
1138 err = -ECONNREFUSED;
1139 goto out;
1143 if (sk->sk_state == TCP_ESTABLISHED && sk->sk_type == SOCK_SEQPACKET) {
1144 err = -EISCONN; /* No reconnect on a seqpacket socket */
1145 goto out;
1148 sk->sk_state = TCP_CLOSE;
1149 sock->state = SS_UNCONNECTED;
1151 kfree(ax25->digipeat);
1152 ax25->digipeat = NULL;
1154 /*
1155 * Handle digi-peaters to be used.
1156 */
1157 if (addr_len > sizeof(struct sockaddr_ax25) &&
1158 fsa->fsa_ax25.sax25_ndigis != 0) {
1159 /* Valid number of digipeaters ? */
1160 if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS) {
1161 err = -EINVAL;
1162 goto out;
1165 if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
1166 err = -ENOBUFS;
1167 goto out;
1170 digi->ndigi = fsa->fsa_ax25.sax25_ndigis;
1171 digi->lastrepeat = -1;
1173 while (ct < fsa->fsa_ax25.sax25_ndigis) {
1174 if ((fsa->fsa_digipeater[ct].ax25_call[6] &
1175 AX25_HBIT) && ax25->iamdigi) {
1176 digi->repeated[ct] = 1;
1177 digi->lastrepeat = ct;
1178 } else {
1179 digi->repeated[ct] = 0;
1181 digi->calls[ct] = fsa->fsa_digipeater[ct];
1182 ct++;
1186 /*
1187 * Must bind first - autobinding in this may or may not work. If
1188 * the socket is already bound, check to see if the device has
1189 * been filled in, error if it hasn't.
1190 */
1191 if (sock_flag(sk, SOCK_ZAPPED)) {
1192 /* check if we can remove this feature. It is broken. */
1193 printk(KERN_WARNING "ax25_connect(): %s uses autobind, please contact jreuter@yaina.de\n",
1194 current->comm);
1195 if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) {
1196 kfree(digi);
1197 goto out;
1200 ax25_fillin_cb(ax25, ax25->ax25_dev);
1201 ax25_cb_add(ax25);
1202 } else {
1203 if (ax25->ax25_dev == NULL) {
1204 kfree(digi);
1205 err = -EHOSTUNREACH;
1206 goto out;
1210 if (sk->sk_type == SOCK_SEQPACKET &&
1211 (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
1212 ax25->ax25_dev->dev))) {
1213 kfree(digi);
1214 err = -EADDRINUSE; /* Already such a connection */
1215 ax25_cb_put(ax25t);
1216 goto out;
1219 ax25->dest_addr = fsa->fsa_ax25.sax25_call;
1220 ax25->digipeat = digi;
1222 /* First the easy one */
1223 if (sk->sk_type != SOCK_SEQPACKET) {
1224 sock->state = SS_CONNECTED;
1225 sk->sk_state = TCP_ESTABLISHED;
1226 goto out;
1229 /* Move to connecting socket, ax.25 lapb WAIT_UA.. */
1230 sock->state = SS_CONNECTING;
1231 sk->sk_state = TCP_SYN_SENT;
1233 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1234 case AX25_PROTO_STD_SIMPLEX:
1235 case AX25_PROTO_STD_DUPLEX:
1236 ax25_std_establish_data_link(ax25);
1237 break;
1239 #ifdef CONFIG_AX25_DAMA_SLAVE
1240 case AX25_PROTO_DAMA_SLAVE:
1241 ax25->modulus = AX25_MODULUS;
1242 ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
1243 if (ax25->ax25_dev->dama.slave)
1244 ax25_ds_establish_data_link(ax25);
1245 else
1246 ax25_std_establish_data_link(ax25);
1247 break;
1248 #endif
1251 ax25->state = AX25_STATE_1;
1253 ax25_start_heartbeat(ax25);
1255 /* Now the loop */
1256 if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) {
1257 err = -EINPROGRESS;
1258 goto out;
1261 if (sk->sk_state == TCP_SYN_SENT) {
1262 struct task_struct *tsk = current;
1263 DECLARE_WAITQUEUE(wait, tsk);
1265 add_wait_queue(sk->sk_sleep, &wait);
1266 for (;;) {
1267 if (sk->sk_state != TCP_SYN_SENT)
1268 break;
1269 set_current_state(TASK_INTERRUPTIBLE);
1270 release_sock(sk);
1271 if (!signal_pending(tsk)) {
1272 schedule();
1273 lock_sock(sk);
1274 continue;
1276 current->state = TASK_RUNNING;
1277 remove_wait_queue(sk->sk_sleep, &wait);
1278 return -ERESTARTSYS;
1280 current->state = TASK_RUNNING;
1281 remove_wait_queue(sk->sk_sleep, &wait);
1284 if (sk->sk_state != TCP_ESTABLISHED) {
1285 /* Not in ABM, not in WAIT_UA -> failed */
1286 sock->state = SS_UNCONNECTED;
1287 err = sock_error(sk); /* Always set at this point */
1288 goto out;
1291 sock->state = SS_CONNECTED;
1293 err=0;
1294 out:
1295 release_sock(sk);
1297 return err;
1301 static int ax25_accept(struct socket *sock, struct socket *newsock, int flags)
1303 struct task_struct *tsk = current;
1304 DECLARE_WAITQUEUE(wait, tsk);
1305 struct sk_buff *skb;
1306 struct sock *newsk;
1307 struct sock *sk;
1308 int err = 0;
1310 if (sock->state != SS_UNCONNECTED)
1311 return -EINVAL;
1313 if ((sk = sock->sk) == NULL)
1314 return -EINVAL;
1316 lock_sock(sk);
1317 if (sk->sk_type != SOCK_SEQPACKET) {
1318 err = -EOPNOTSUPP;
1319 goto out;
1322 if (sk->sk_state != TCP_LISTEN) {
1323 err = -EINVAL;
1324 goto out;
1327 /*
1328 * The read queue this time is holding sockets ready to use
1329 * hooked into the SABM we saved
1330 */
1331 add_wait_queue(sk->sk_sleep, &wait);
1332 for (;;) {
1333 skb = skb_dequeue(&sk->sk_receive_queue);
1334 if (skb)
1335 break;
1337 release_sock(sk);
1338 current->state = TASK_INTERRUPTIBLE;
1339 if (flags & O_NONBLOCK) {
1340 current->state = TASK_RUNNING;
1341 remove_wait_queue(sk->sk_sleep, &wait);
1342 return -EWOULDBLOCK;
1344 if (!signal_pending(tsk)) {
1345 schedule();
1346 lock_sock(sk);
1347 continue;
1349 current->state = TASK_RUNNING;
1350 remove_wait_queue(sk->sk_sleep, &wait);
1351 return -ERESTARTSYS;
1353 current->state = TASK_RUNNING;
1354 remove_wait_queue(sk->sk_sleep, &wait);
1356 newsk = skb->sk;
1357 newsk->sk_socket = newsock;
1358 newsk->sk_sleep = &newsock->wait;
1360 /* Now attach up the new socket */
1361 kfree_skb(skb);
1362 sk->sk_ack_backlog--;
1363 newsock->sk = newsk;
1364 newsock->state = SS_CONNECTED;
1366 out:
1367 release_sock(sk);
1369 return err;
1372 static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
1373 int *uaddr_len, int peer)
1375 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1376 struct sock *sk = sock->sk;
1377 unsigned char ndigi, i;
1378 ax25_cb *ax25;
1379 int err = 0;
1381 lock_sock(sk);
1382 ax25 = ax25_sk(sk);
1384 if (peer != 0) {
1385 if (sk->sk_state != TCP_ESTABLISHED) {
1386 err = -ENOTCONN;
1387 goto out;
1390 fsa->fsa_ax25.sax25_family = AF_AX25;
1391 fsa->fsa_ax25.sax25_call = ax25->dest_addr;
1392 fsa->fsa_ax25.sax25_ndigis = 0;
1394 if (ax25->digipeat != NULL) {
1395 ndigi = ax25->digipeat->ndigi;
1396 fsa->fsa_ax25.sax25_ndigis = ndigi;
1397 for (i = 0; i < ndigi; i++)
1398 fsa->fsa_digipeater[i] =
1399 ax25->digipeat->calls[i];
1401 } else {
1402 fsa->fsa_ax25.sax25_family = AF_AX25;
1403 fsa->fsa_ax25.sax25_call = ax25->source_addr;
1404 fsa->fsa_ax25.sax25_ndigis = 1;
1405 if (ax25->ax25_dev != NULL) {
1406 memcpy(&fsa->fsa_digipeater[0],
1407 ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
1408 } else {
1409 fsa->fsa_digipeater[0] = null_ax25_address;
1412 *uaddr_len = sizeof (struct full_sockaddr_ax25);
1414 out:
1415 release_sock(sk);
1417 return err;
1420 static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
1421 struct msghdr *msg, size_t len)
1423 struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
1424 struct sock *sk = sock->sk;
1425 struct sockaddr_ax25 sax;
1426 struct sk_buff *skb;
1427 ax25_digi dtmp, *dp;
1428 unsigned char *asmptr;
1429 ax25_cb *ax25;
1430 size_t size;
1431 int lv, err, addr_len = msg->msg_namelen;
1433 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
1434 return -EINVAL;
1436 lock_sock(sk);
1437 ax25 = ax25_sk(sk);
1439 if (sock_flag(sk, SOCK_ZAPPED)) {
1440 err = -EADDRNOTAVAIL;
1441 goto out;
1444 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1445 send_sig(SIGPIPE, current, 0);
1446 err = -EPIPE;
1447 goto out;
1450 if (ax25->ax25_dev == NULL) {
1451 err = -ENETUNREACH;
1452 goto out;
1455 if (len > ax25->ax25_dev->dev->mtu) {
1456 err = -EMSGSIZE;
1457 goto out;
1460 if (usax != NULL) {
1461 if (usax->sax25_family != AF_AX25) {
1462 err = -EINVAL;
1463 goto out;
1466 if (addr_len == sizeof(struct sockaddr_ax25)) {
1467 printk(KERN_WARNING "ax25_sendmsg(): %s uses obsolete socket structure\n",
1468 current->comm);
1470 else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
1471 /* support for old structure may go away some time */
1472 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1473 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1474 err = -EINVAL;
1475 goto out;
1478 printk(KERN_WARNING "ax25_sendmsg(): %s uses old (6 digipeater) socket structure.\n",
1479 current->comm);
1482 if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
1483 int ct = 0;
1484 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
1486 /* Valid number of digipeaters ? */
1487 if (usax->sax25_ndigis < 1 || usax->sax25_ndigis > AX25_MAX_DIGIS) {
1488 err = -EINVAL;
1489 goto out;
1492 dtmp.ndigi = usax->sax25_ndigis;
1494 while (ct < usax->sax25_ndigis) {
1495 dtmp.repeated[ct] = 0;
1496 dtmp.calls[ct] = fsa->fsa_digipeater[ct];
1497 ct++;
1500 dtmp.lastrepeat = 0;
1503 sax = *usax;
1504 if (sk->sk_type == SOCK_SEQPACKET &&
1505 ax25cmp(&ax25->dest_addr, &sax.sax25_call)) {
1506 err = -EISCONN;
1507 goto out;
1509 if (usax->sax25_ndigis == 0)
1510 dp = NULL;
1511 else
1512 dp = &dtmp;
1513 } else {
1514 /*
1515 * FIXME: 1003.1g - if the socket is like this because
1516 * it has become closed (not started closed) and is VC
1517 * we ought to SIGPIPE, EPIPE
1518 */
1519 if (sk->sk_state != TCP_ESTABLISHED) {
1520 err = -ENOTCONN;
1521 goto out;
1523 sax.sax25_family = AF_AX25;
1524 sax.sax25_call = ax25->dest_addr;
1525 dp = ax25->digipeat;
1528 SOCK_DEBUG(sk, "AX.25: sendto: Addresses built.\n");
1530 /* Build a packet */
1531 SOCK_DEBUG(sk, "AX.25: sendto: building packet.\n");
1533 /* Assume the worst case */
1534 size = len + ax25->ax25_dev->dev->hard_header_len;
1536 skb = sock_alloc_send_skb(sk, size, msg->msg_flags&MSG_DONTWAIT, &err);
1537 if (skb == NULL)
1538 goto out;
1540 skb_reserve(skb, size - len);
1542 SOCK_DEBUG(sk, "AX.25: Appending user data\n");
1544 /* User data follows immediately after the AX.25 data */
1545 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
1546 err = -EFAULT;
1547 kfree_skb(skb);
1548 goto out;
1551 skb->nh.raw = skb->data;
1553 /* Add the PID if one is not supplied by the user in the skb */
1554 if (!ax25->pidincl) {
1555 asmptr = skb_push(skb, 1);
1556 *asmptr = sk->sk_protocol;
1559 SOCK_DEBUG(sk, "AX.25: Transmitting buffer\n");
1561 if (sk->sk_type == SOCK_SEQPACKET) {
1562 /* Connected mode sockets go via the LAPB machine */
1563 if (sk->sk_state != TCP_ESTABLISHED) {
1564 kfree_skb(skb);
1565 err = -ENOTCONN;
1566 goto out;
1569 /* Shove it onto the queue and kick */
1570 ax25_output(ax25, ax25->paclen, skb);
1572 err = len;
1573 goto out;
1576 asmptr = skb_push(skb, 1 + ax25_addr_size(dp));
1578 SOCK_DEBUG(sk, "Building AX.25 Header (dp=%p).\n", dp);
1580 if (dp != NULL)
1581 SOCK_DEBUG(sk, "Num digipeaters=%d\n", dp->ndigi);
1583 /* Build an AX.25 header */
1584 asmptr += (lv = ax25_addr_build(asmptr, &ax25->source_addr,
1585 &sax.sax25_call, dp,
1586 AX25_COMMAND, AX25_MODULUS));
1588 SOCK_DEBUG(sk, "Built header (%d bytes)\n",lv);
1590 skb->h.raw = asmptr;
1592 SOCK_DEBUG(sk, "base=%p pos=%p\n", skb->data, asmptr);
1594 *asmptr = AX25_UI;
1596 /* Datagram frames go straight out of the door as UI */
1597 ax25_queue_xmit(skb, ax25->ax25_dev->dev);
1599 err = len;
1601 out:
1602 release_sock(sk);
1604 return err;
1607 static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
1608 struct msghdr *msg, size_t size, int flags)
1610 struct sock *sk = sock->sk;
1611 struct sk_buff *skb;
1612 int copied;
1613 int err = 0;
1615 lock_sock(sk);
1616 /*
1617 * This works for seqpacket too. The receiver has ordered the
1618 * queue for us! We do one quick check first though
1619 */
1620 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) {
1621 err = -ENOTCONN;
1622 goto out;
1625 /* Now we can treat all alike */
1626 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
1627 flags & MSG_DONTWAIT, &err);
1628 if (skb == NULL)
1629 goto out;
1631 if (!ax25_sk(sk)->pidincl)
1632 skb_pull(skb, 1); /* Remove PID */
1634 skb->h.raw = skb->data;
1635 copied = skb->len;
1637 if (copied > size) {
1638 copied = size;
1639 msg->msg_flags |= MSG_TRUNC;
1642 skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
1644 if (msg->msg_namelen != 0) {
1645 struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
1646 ax25_digi digi;
1647 ax25_address src;
1649 ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, &src, NULL, &digi, NULL, NULL);
1651 sax->sax25_family = AF_AX25;
1652 /* We set this correctly, even though we may not let the
1653 application know the digi calls further down (because it
1654 did NOT ask to know them). This could get political... **/
1655 sax->sax25_ndigis = digi.ndigi;
1656 sax->sax25_call = src;
1658 if (sax->sax25_ndigis != 0) {
1659 int ct;
1660 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
1662 for (ct = 0; ct < digi.ndigi; ct++)
1663 fsa->fsa_digipeater[ct] = digi.calls[ct];
1665 msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
1668 skb_free_datagram(sk, skb);
1669 err = copied;
1671 out:
1672 release_sock(sk);
1674 return err;
1677 static int ax25_shutdown(struct socket *sk, int how)
1679 /* FIXME - generate DM and RNR states */
1680 return -EOPNOTSUPP;
1683 static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1685 struct sock *sk = sock->sk;
1686 void __user *argp = (void __user *)arg;
1687 int res = 0;
1689 lock_sock(sk);
1690 switch (cmd) {
1691 case TIOCOUTQ: {
1692 long amount;
1693 amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
1694 if (amount < 0)
1695 amount = 0;
1696 res = put_user(amount, (int __user *)argp);
1697 break;
1700 case TIOCINQ: {
1701 struct sk_buff *skb;
1702 long amount = 0L;
1703 /* These two are safe on a single CPU system as only user tasks fiddle here */
1704 if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1705 amount = skb->len;
1706 res = put_user(amount, (int __user *) argp);
1707 break;
1710 case SIOCGSTAMP:
1711 res = sock_get_timestamp(sk, argp);
1712 break;
1714 case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */
1715 case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */
1716 case SIOCAX25GETUID: {
1717 struct sockaddr_ax25 sax25;
1718 if (copy_from_user(&sax25, argp, sizeof(sax25))) {
1719 res = -EFAULT;
1720 break;
1722 res = ax25_uid_ioctl(cmd, &sax25);
1723 break;
1726 case SIOCAX25NOUID: { /* Set the default policy (default/bar) */
1727 long amount;
1728 if (!capable(CAP_NET_ADMIN)) {
1729 res = -EPERM;
1730 break;
1732 if (get_user(amount, (long __user *)argp)) {
1733 res = -EFAULT;
1734 break;
1736 if (amount > AX25_NOUID_BLOCK) {
1737 res = -EINVAL;
1738 break;
1740 ax25_uid_policy = amount;
1741 res = 0;
1742 break;
1745 case SIOCADDRT:
1746 case SIOCDELRT:
1747 case SIOCAX25OPTRT:
1748 if (!capable(CAP_NET_ADMIN)) {
1749 res = -EPERM;
1750 break;
1752 res = ax25_rt_ioctl(cmd, argp);
1753 break;
1755 case SIOCAX25CTLCON:
1756 if (!capable(CAP_NET_ADMIN)) {
1757 res = -EPERM;
1758 break;
1760 res = ax25_ctl_ioctl(cmd, argp);
1761 break;
1763 case SIOCAX25GETINFO:
1764 case SIOCAX25GETINFOOLD: {
1765 ax25_cb *ax25 = ax25_sk(sk);
1766 struct ax25_info_struct ax25_info;
1768 ax25_info.t1 = ax25->t1 / HZ;
1769 ax25_info.t2 = ax25->t2 / HZ;
1770 ax25_info.t3 = ax25->t3 / HZ;
1771 ax25_info.idle = ax25->idle / (60 * HZ);
1772 ax25_info.n2 = ax25->n2;
1773 ax25_info.t1timer = ax25_display_timer(&ax25->t1timer) / HZ;
1774 ax25_info.t2timer = ax25_display_timer(&ax25->t2timer) / HZ;
1775 ax25_info.t3timer = ax25_display_timer(&ax25->t3timer) / HZ;
1776 ax25_info.idletimer = ax25_display_timer(&ax25->idletimer) / (60 * HZ);
1777 ax25_info.n2count = ax25->n2count;
1778 ax25_info.state = ax25->state;
1779 ax25_info.rcv_q = atomic_read(&sk->sk_rmem_alloc);
1780 ax25_info.snd_q = atomic_read(&sk->sk_wmem_alloc);
1781 ax25_info.vs = ax25->vs;
1782 ax25_info.vr = ax25->vr;
1783 ax25_info.va = ax25->va;
1784 ax25_info.vs_max = ax25->vs; /* reserved */
1785 ax25_info.paclen = ax25->paclen;
1786 ax25_info.window = ax25->window;
1788 /* old structure? */
1789 if (cmd == SIOCAX25GETINFOOLD) {
1790 static int warned = 0;
1791 if (!warned) {
1792 printk(KERN_INFO "%s uses old SIOCAX25GETINFO\n",
1793 current->comm);
1794 warned=1;
1797 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct_deprecated))) {
1798 res = -EFAULT;
1799 break;
1801 } else {
1802 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct))) {
1803 res = -EINVAL;
1804 break;
1807 res = 0;
1808 break;
1811 case SIOCAX25ADDFWD:
1812 case SIOCAX25DELFWD: {
1813 struct ax25_fwd_struct ax25_fwd;
1814 if (!capable(CAP_NET_ADMIN)) {
1815 res = -EPERM;
1816 break;
1818 if (copy_from_user(&ax25_fwd, argp, sizeof(ax25_fwd))) {
1819 res = -EFAULT;
1820 break;
1822 res = ax25_fwd_ioctl(cmd, &ax25_fwd);
1823 break;
1826 case SIOCGIFADDR:
1827 case SIOCSIFADDR:
1828 case SIOCGIFDSTADDR:
1829 case SIOCSIFDSTADDR:
1830 case SIOCGIFBRDADDR:
1831 case SIOCSIFBRDADDR:
1832 case SIOCGIFNETMASK:
1833 case SIOCSIFNETMASK:
1834 case SIOCGIFMETRIC:
1835 case SIOCSIFMETRIC:
1836 res = -EINVAL;
1837 break;
1839 default:
1840 res = -ENOIOCTLCMD;
1841 break;
1843 release_sock(sk);
1845 return res;
1848 #ifdef CONFIG_PROC_FS
1850 static void *ax25_info_start(struct seq_file *seq, loff_t *pos)
1852 struct ax25_cb *ax25;
1853 struct hlist_node *node;
1854 int i = 0;
1856 spin_lock_bh(&ax25_list_lock);
1857 ax25_for_each(ax25, node, &ax25_list) {
1858 if (i == *pos)
1859 return ax25;
1860 ++i;
1862 return NULL;
1865 static void *ax25_info_next(struct seq_file *seq, void *v, loff_t *pos)
1867 ++*pos;
1869 return hlist_entry( ((struct ax25_cb *)v)->ax25_node.next,
1870 struct ax25_cb, ax25_node);
1873 static void ax25_info_stop(struct seq_file *seq, void *v)
1875 spin_unlock_bh(&ax25_list_lock);
1878 static int ax25_info_show(struct seq_file *seq, void *v)
1880 ax25_cb *ax25 = v;
1881 char buf[11];
1882 int k;
1885 /*
1886 * New format:
1887 * 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
1888 */
1890 seq_printf(seq, "%8.8lx %s %s%s ",
1891 (long) ax25,
1892 ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
1893 ax2asc(buf, &ax25->source_addr),
1894 ax25->iamdigi? "*":"");
1895 seq_printf(seq, "%s", ax2asc(buf, &ax25->dest_addr));
1897 for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
1898 seq_printf(seq, ",%s%s",
1899 ax2asc(buf, &ax25->digipeat->calls[k]),
1900 ax25->digipeat->repeated[k]? "*":"");
1903 seq_printf(seq, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
1904 ax25->state,
1905 ax25->vs, ax25->vr, ax25->va,
1906 ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
1907 ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
1908 ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
1909 ax25_display_timer(&ax25->idletimer) / (60 * HZ),
1910 ax25->idle / (60 * HZ),
1911 ax25->n2count, ax25->n2,
1912 ax25->rtt / HZ,
1913 ax25->window,
1914 ax25->paclen);
1916 if (ax25->sk != NULL) {
1917 bh_lock_sock(ax25->sk);
1918 seq_printf(seq," %d %d %ld\n",
1919 atomic_read(&ax25->sk->sk_wmem_alloc),
1920 atomic_read(&ax25->sk->sk_rmem_alloc),
1921 ax25->sk->sk_socket != NULL ? SOCK_INODE(ax25->sk->sk_socket)->i_ino : 0L);
1922 bh_unlock_sock(ax25->sk);
1923 } else {
1924 seq_puts(seq, " * * *\n");
1926 return 0;
1929 static struct seq_operations ax25_info_seqops = {
1930 .start = ax25_info_start,
1931 .next = ax25_info_next,
1932 .stop = ax25_info_stop,
1933 .show = ax25_info_show,
1934 };
1936 static int ax25_info_open(struct inode *inode, struct file *file)
1938 return seq_open(file, &ax25_info_seqops);
1941 static struct file_operations ax25_info_fops = {
1942 .owner = THIS_MODULE,
1943 .open = ax25_info_open,
1944 .read = seq_read,
1945 .llseek = seq_lseek,
1946 .release = seq_release,
1947 };
1949 #endif
1951 static struct net_proto_family ax25_family_ops = {
1952 .family = PF_AX25,
1953 .create = ax25_create,
1954 .owner = THIS_MODULE,
1955 };
1957 static const struct proto_ops ax25_proto_ops = {
1958 .family = PF_AX25,
1959 .owner = THIS_MODULE,
1960 .release = ax25_release,
1961 .bind = ax25_bind,
1962 .connect = ax25_connect,
1963 .socketpair = sock_no_socketpair,
1964 .accept = ax25_accept,
1965 .getname = ax25_getname,
1966 .poll = datagram_poll,
1967 .ioctl = ax25_ioctl,
1968 .listen = ax25_listen,
1969 .shutdown = ax25_shutdown,
1970 .setsockopt = ax25_setsockopt,
1971 .getsockopt = ax25_getsockopt,
1972 .sendmsg = ax25_sendmsg,
1973 .recvmsg = ax25_recvmsg,
1974 .mmap = sock_no_mmap,
1975 .sendpage = sock_no_sendpage,
1976 };
1978 /*
1979 * Called by socket.c on kernel start up
1980 */
1981 static struct packet_type ax25_packet_type = {
1982 .type = __constant_htons(ETH_P_AX25),
1983 .dev = NULL, /* All devices */
1984 .func = ax25_kiss_rcv,
1985 };
1987 static struct notifier_block ax25_dev_notifier = {
1988 .notifier_call =ax25_device_event,
1989 };
1991 static int __init ax25_init(void)
1993 int rc = proto_register(&ax25_proto, 0);
1995 if (rc != 0)
1996 goto out;
1998 sock_register(&ax25_family_ops);
1999 dev_add_pack(&ax25_packet_type);
2000 register_netdevice_notifier(&ax25_dev_notifier);
2001 ax25_register_sysctl();
2003 proc_net_fops_create("ax25_route", S_IRUGO, &ax25_route_fops);
2004 proc_net_fops_create("ax25", S_IRUGO, &ax25_info_fops);
2005 proc_net_fops_create("ax25_calls", S_IRUGO, &ax25_uid_fops);
2006 out:
2007 return rc;
2009 module_init(ax25_init);
2012 MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
2013 MODULE_DESCRIPTION("The amateur radio AX.25 link layer protocol");
2014 MODULE_LICENSE("GPL");
2015 MODULE_ALIAS_NETPROTO(PF_AX25);
2017 static void __exit ax25_exit(void)
2019 proc_net_remove("ax25_route");
2020 proc_net_remove("ax25");
2021 proc_net_remove("ax25_calls");
2022 ax25_rt_free();
2023 ax25_uid_free();
2024 ax25_dev_free();
2026 ax25_unregister_sysctl();
2027 unregister_netdevice_notifier(&ax25_dev_notifier);
2029 dev_remove_pack(&ax25_packet_type);
2031 sock_unregister(PF_AX25);
2032 proto_unregister(&ax25_proto);
2034 module_exit(ax25_exit);