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.
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)
16 #include <linux/config.h>
17 #include <linux/module.h>
18 #include <linux/errno.h>
19 #include <linux/types.h>
20 #include <linux/socket.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>
30 #include <linux/inet.h>
31 #include <linux/netdevice.h>
32 #include <linux/if_arp.h>
33 #include <linux/skbuff.h>
35 #include <asm/uaccess.h>
36 #include <asm/system.h>
37 #include <linux/fcntl.h>
38 #include <linux/termios.h> /* For TIOCINQ/OUTQ */
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>
54 HLIST_HEAD(ax25_list);
55 DEFINE_SPINLOCK(ax25_list_lock);
57 static struct proto_ops ax25_proto_ops;
59 static void ax25_free_sock(struct sock *sk)
61 ax25_cb_put(ax25_sk(sk));
65 * Socket removal during an interrupt is now safe.
67 static void ax25_cb_del(ax25_cb *ax25)
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);
78 * Kill all bound sockets on a dropped device.
80 static void ax25_kill_by_device(struct net_device *dev)
84 struct hlist_node *node;
86 if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
89 spin_lock_bh(&ax25_list_lock);
90 ax25_for_each(s, node, &ax25_list) {
91 if (s->ax25_dev == ax25_dev) {
93 ax25_disconnect(s, ENETUNREACH);
96 spin_unlock_bh(&ax25_list_lock);
100 * Handle device status changes.
102 static int ax25_device_event(struct notifier_block *this, unsigned long event,
105 struct net_device *dev = (struct net_device *)ptr;
107 /* Reject non AX.25 devices */
108 if (dev->type != ARPHRD_AX25)
113 ax25_dev_device_up(dev);
116 ax25_kill_by_device(dev);
117 ax25_rt_device_down(dev);
118 ax25_dev_device_down(dev);
128 * Add a socket to the bound sockets list.
130 void ax25_cb_add(ax25_cb *ax25)
132 spin_lock_bh(&ax25_list_lock);
134 hlist_add_head(&ax25->ax25_node, &ax25_list);
135 spin_unlock_bh(&ax25_list_lock);
139 * Find a socket that wants to accept the SABM we have just
142 struct sock *ax25_find_listener(ax25_address *addr, int digi,
143 struct net_device *dev, int type)
146 struct hlist_node *node;
148 spin_lock_bh(&ax25_list_lock);
149 ax25_for_each(s, node, &ax25_list) {
150 if ((s->iamdigi && !digi) || (!s->iamdigi && digi))
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) {
157 spin_unlock_bh(&ax25_list_lock);
162 spin_unlock_bh(&ax25_list_lock);
168 * Find an AX.25 socket given both ends.
170 struct sock *ax25_get_socket(ax25_address *my_addr, ax25_address *dest_addr,
173 struct sock *sk = NULL;
175 struct hlist_node *node;
177 spin_lock_bh(&ax25_list_lock);
178 ax25_for_each(s, node, &ax25_list) {
179 if (s->sk && !ax25cmp(&s->source_addr, my_addr) &&
180 !ax25cmp(&s->dest_addr, dest_addr) &&
181 s->sk->sk_type == type) {
188 spin_unlock_bh(&ax25_list_lock);
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.
197 ax25_cb *ax25_find_cb(ax25_address *src_addr, ax25_address *dest_addr,
198 ax25_digi *digi, struct net_device *dev)
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)
207 if (s->ax25_dev == NULL)
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)
213 if (ax25digicmp(s->digipeat, digi) != 0)
216 if (s->digipeat != NULL && s->digipeat->ndigi != 0)
220 spin_unlock_bh(&ax25_list_lock);
225 spin_unlock_bh(&ax25_list_lock);
230 void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto)
233 struct sk_buff *copy;
234 struct hlist_node *node;
236 spin_lock_bh(&ax25_list_lock);
237 ax25_for_each(s, node, &ax25_list) {
238 if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 &&
239 s->sk->sk_type == SOCK_RAW &&
240 s->sk->sk_protocol == proto &&
241 s->ax25_dev->dev == skb->dev &&
242 atomic_read(&s->sk->sk_rmem_alloc) <= s->sk->sk_rcvbuf) {
243 if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
245 if (sock_queue_rcv_skb(s->sk, copy) != 0)
249 spin_unlock_bh(&ax25_list_lock);
255 void ax25_destroy_socket(ax25_cb *);
258 * Handler for deferred kills.
260 static void ax25_destroy_timer(unsigned long data)
262 ax25_cb *ax25=(ax25_cb *)data;
269 ax25_destroy_socket(ax25);
275 * This is called from user mode and the timers. Thus it protects itself
276 * against interrupt users but doesn't worry about being called during
277 * work. Once it is removed from the queue no interrupt or bottom half
278 * will touch it and we are (fairly 8-) ) safe.
280 void ax25_destroy_socket(ax25_cb *ax25)
286 ax25_stop_heartbeat(ax25);
287 ax25_stop_t1timer(ax25);
288 ax25_stop_t2timer(ax25);
289 ax25_stop_t3timer(ax25);
290 ax25_stop_idletimer(ax25);
292 ax25_clear_queues(ax25); /* Flush the queues */
294 if (ax25->sk != NULL) {
295 while ((skb = skb_dequeue(&ax25->sk->sk_receive_queue)) != NULL) {
296 if (skb->sk != ax25->sk) {
297 /* A pending connection */
298 ax25_cb *sax25 = ax25_sk(skb->sk);
300 /* Queue the unaccepted socket for death */
301 sock_orphan(skb->sk);
303 ax25_start_heartbeat(sax25);
304 sax25->state = AX25_STATE_0;
309 skb_queue_purge(&ax25->sk->sk_write_queue);
312 if (ax25->sk != NULL) {
313 if (atomic_read(&ax25->sk->sk_wmem_alloc) ||
314 atomic_read(&ax25->sk->sk_rmem_alloc)) {
315 /* Defer: outstanding buffers */
316 init_timer(&ax25->dtimer);
317 ax25->dtimer.expires = jiffies + 2 * HZ;
318 ax25->dtimer.function = ax25_destroy_timer;
319 ax25->dtimer.data = (unsigned long)ax25;
320 add_timer(&ax25->dtimer);
322 struct sock *sk=ax25->sk;
332 * dl1bke 960311: set parameters for existing AX.25 connections,
333 * includes a KILL command to abort any connection.
334 * VERY useful for debugging ;-)
336 static int ax25_ctl_ioctl(const unsigned int cmd, void __user *arg)
338 struct ax25_ctl_struct ax25_ctl;
344 if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
347 if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
350 if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
353 digi.ndigi = ax25_ctl.digi_count;
354 for (k = 0; k < digi.ndigi; k++)
355 digi.calls[k] = ax25_ctl.digi_addr[k];
357 if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
360 switch (ax25_ctl.cmd) {
362 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
363 #ifdef CONFIG_AX25_DAMA_SLAVE
364 if (ax25_dev->dama.slave && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
367 ax25_disconnect(ax25, ENETRESET);
371 if (ax25->modulus == AX25_MODULUS) {
372 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
375 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
378 ax25->window = ax25_ctl.arg;
382 if (ax25_ctl.arg < 1)
384 ax25->rtt = (ax25_ctl.arg * HZ) / 2;
385 ax25->t1 = ax25_ctl.arg * HZ;
389 if (ax25_ctl.arg < 1)
391 ax25->t2 = ax25_ctl.arg * HZ;
395 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
398 ax25->n2 = ax25_ctl.arg;
402 if (ax25_ctl.arg < 0)
404 ax25->t3 = ax25_ctl.arg * HZ;
408 if (ax25_ctl.arg < 0)
410 ax25->idle = ax25_ctl.arg * 60 * HZ;
414 if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
416 ax25->paclen = ax25_ctl.arg;
427 * Fill in a created AX.25 created control block with the default
428 * values for a particular device.
430 void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
432 ax25->ax25_dev = ax25_dev;
434 if (ax25->ax25_dev != NULL) {
435 ax25->rtt = ax25_dev->values[AX25_VALUES_T1] / 2;
436 ax25->t1 = ax25_dev->values[AX25_VALUES_T1];
437 ax25->t2 = ax25_dev->values[AX25_VALUES_T2];
438 ax25->t3 = ax25_dev->values[AX25_VALUES_T3];
439 ax25->n2 = ax25_dev->values[AX25_VALUES_N2];
440 ax25->paclen = ax25_dev->values[AX25_VALUES_PACLEN];
441 ax25->idle = ax25_dev->values[AX25_VALUES_IDLE];
442 ax25->backoff = ax25_dev->values[AX25_VALUES_BACKOFF];
444 if (ax25_dev->values[AX25_VALUES_AXDEFMODE]) {
445 ax25->modulus = AX25_EMODULUS;
446 ax25->window = ax25_dev->values[AX25_VALUES_EWINDOW];
448 ax25->modulus = AX25_MODULUS;
449 ax25->window = ax25_dev->values[AX25_VALUES_WINDOW];
452 ax25->rtt = AX25_DEF_T1 / 2;
453 ax25->t1 = AX25_DEF_T1;
454 ax25->t2 = AX25_DEF_T2;
455 ax25->t3 = AX25_DEF_T3;
456 ax25->n2 = AX25_DEF_N2;
457 ax25->paclen = AX25_DEF_PACLEN;
458 ax25->idle = AX25_DEF_IDLE;
459 ax25->backoff = AX25_DEF_BACKOFF;
461 if (AX25_DEF_AXDEFMODE) {
462 ax25->modulus = AX25_EMODULUS;
463 ax25->window = AX25_DEF_EWINDOW;
465 ax25->modulus = AX25_MODULUS;
466 ax25->window = AX25_DEF_WINDOW;
472 * Create an empty AX.25 control block.
474 ax25_cb *ax25_create_cb(void)
478 if ((ax25 = kmalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
481 memset(ax25, 0x00, sizeof(*ax25));
482 atomic_set(&ax25->refcount, 1);
484 skb_queue_head_init(&ax25->write_queue);
485 skb_queue_head_init(&ax25->frag_queue);
486 skb_queue_head_init(&ax25->ack_queue);
487 skb_queue_head_init(&ax25->reseq_queue);
489 init_timer(&ax25->timer);
490 init_timer(&ax25->t1timer);
491 init_timer(&ax25->t2timer);
492 init_timer(&ax25->t3timer);
493 init_timer(&ax25->idletimer);
495 ax25_fillin_cb(ax25, NULL);
497 ax25->state = AX25_STATE_0;
503 * Handling for system calls applied via the various interfaces to an
507 static int ax25_setsockopt(struct socket *sock, int level, int optname,
508 char __user *optval, int optlen)
510 struct sock *sk = sock->sk;
512 struct net_device *dev;
513 char devname[IFNAMSIZ];
516 if (level != SOL_AX25)
519 if (optlen < sizeof(int))
522 if (get_user(opt, (int __user *)optval))
530 if (ax25->modulus == AX25_MODULUS) {
531 if (opt < 1 || opt > 7) {
536 if (opt < 1 || opt > 63) {
549 ax25->rtt = (opt * HZ) / 2;
562 if (opt < 1 || opt > 31) {
582 ax25->idle = opt * 60 * HZ;
586 if (opt < 0 || opt > 2) {
594 ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
598 ax25->pidincl = opt ? 1 : 0;
602 ax25->iamdigi = opt ? 1 : 0;
606 if (opt < 16 || opt > 65535) {
613 case SO_BINDTODEVICE:
614 if (optlen > IFNAMSIZ)
616 if (copy_from_user(devname, optval, optlen)) {
621 dev = dev_get_by_name(devname);
627 if (sk->sk_type == SOCK_SEQPACKET &&
628 (sock->state != SS_UNCONNECTED ||
629 sk->sk_state == TCP_LISTEN)) {
630 res = -EADDRNOTAVAIL;
635 ax25->ax25_dev = ax25_dev_ax25dev(dev);
636 ax25_fillin_cb(ax25, ax25->ax25_dev);
647 static int ax25_getsockopt(struct socket *sock, int level, int optname,
648 char __user *optval, int __user *optlen)
650 struct sock *sk = sock->sk;
652 struct ax25_dev *ax25_dev;
653 char devname[IFNAMSIZ];
658 if (level != SOL_AX25)
661 if (get_user(maxlen, optlen))
667 valptr = (void *) &val;
668 length = min_t(unsigned int, maxlen, sizeof(int));
695 val = ax25->idle / (60 * HZ);
703 val = (ax25->modulus == AX25_EMODULUS);
718 case SO_BINDTODEVICE:
719 ax25_dev = ax25->ax25_dev;
721 if (ax25_dev != NULL && ax25_dev->dev != NULL) {
722 strlcpy(devname, ax25_dev->dev->name, sizeof(devname));
723 length = strlen(devname) + 1;
729 valptr = (void *) devname;
738 if (put_user(length, optlen))
741 return copy_to_user(optval, valptr, length) ? -EFAULT : 0;
744 static int ax25_listen(struct socket *sock, int backlog)
746 struct sock *sk = sock->sk;
750 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_LISTEN) {
751 sk->sk_max_ack_backlog = backlog;
752 sk->sk_state = TCP_LISTEN;
764 * XXX: when creating ax25_sock we should update the .obj_size setting
767 static struct proto ax25_proto = {
769 .owner = THIS_MODULE,
770 .obj_size = sizeof(struct sock),
773 static int ax25_create(struct socket *sock, int protocol)
778 switch (sock->type) {
780 if (protocol == 0 || protocol == PF_AX25)
781 protocol = AX25_P_TEXT;
787 case PF_AX25: /* For CLX */
788 protocol = AX25_P_TEXT;
801 return -ESOCKTNOSUPPORT;
802 #ifdef CONFIG_NETROM_MODULE
804 if (ax25_protocol_is_registered(AX25_P_NETROM))
805 return -ESOCKTNOSUPPORT;
807 #ifdef CONFIG_ROSE_MODULE
809 if (ax25_protocol_is_registered(AX25_P_ROSE))
810 return -ESOCKTNOSUPPORT;
820 return -ESOCKTNOSUPPORT;
823 if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, &ax25_proto, 1)) == NULL)
826 ax25 = sk->sk_protinfo = ax25_create_cb();
832 sock_init_data(sock, sk);
834 sk->sk_destruct = ax25_free_sock;
835 sock->ops = &ax25_proto_ops;
836 sk->sk_protocol = protocol;
843 struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
846 ax25_cb *ax25, *oax25;
848 if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, osk->sk_prot, 1)) == NULL)
851 if ((ax25 = ax25_create_cb()) == NULL) {
856 switch (osk->sk_type) {
867 sock_init_data(NULL, sk);
869 sk->sk_destruct = ax25_free_sock;
870 sk->sk_type = osk->sk_type;
871 sk->sk_socket = osk->sk_socket;
872 sk->sk_priority = osk->sk_priority;
873 sk->sk_protocol = osk->sk_protocol;
874 sk->sk_rcvbuf = osk->sk_rcvbuf;
875 sk->sk_sndbuf = osk->sk_sndbuf;
876 sk->sk_state = TCP_ESTABLISHED;
877 sk->sk_sleep = osk->sk_sleep;
878 sock_copy_flags(sk, osk);
880 oax25 = ax25_sk(osk);
882 ax25->modulus = oax25->modulus;
883 ax25->backoff = oax25->backoff;
884 ax25->pidincl = oax25->pidincl;
885 ax25->iamdigi = oax25->iamdigi;
886 ax25->rtt = oax25->rtt;
887 ax25->t1 = oax25->t1;
888 ax25->t2 = oax25->t2;
889 ax25->t3 = oax25->t3;
890 ax25->n2 = oax25->n2;
891 ax25->idle = oax25->idle;
892 ax25->paclen = oax25->paclen;
893 ax25->window = oax25->window;
895 ax25->ax25_dev = ax25_dev;
896 ax25->source_addr = oax25->source_addr;
898 if (oax25->digipeat != NULL) {
899 if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
905 memcpy(ax25->digipeat, oax25->digipeat, sizeof(ax25_digi));
908 sk->sk_protinfo = ax25;
914 static int ax25_release(struct socket *sock)
916 struct sock *sk = sock->sk;
927 if (sk->sk_type == SOCK_SEQPACKET) {
928 switch (ax25->state) {
931 ax25_disconnect(ax25, 0);
933 ax25_destroy_socket(ax25);
938 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
940 ax25_disconnect(ax25, 0);
942 ax25_destroy_socket(ax25);
947 ax25_clear_queues(ax25);
950 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
951 case AX25_PROTO_STD_SIMPLEX:
952 case AX25_PROTO_STD_DUPLEX:
953 ax25_send_control(ax25,
957 ax25_stop_t2timer(ax25);
958 ax25_stop_t3timer(ax25);
959 ax25_stop_idletimer(ax25);
961 #ifdef CONFIG_AX25_DAMA_SLAVE
962 case AX25_PROTO_DAMA_SLAVE:
963 ax25_stop_t3timer(ax25);
964 ax25_stop_idletimer(ax25);
968 ax25_calculate_t1(ax25);
969 ax25_start_t1timer(ax25);
970 ax25->state = AX25_STATE_2;
971 sk->sk_state = TCP_CLOSE;
972 sk->sk_shutdown |= SEND_SHUTDOWN;
973 sk->sk_state_change(sk);
974 sock_set_flag(sk, SOCK_DESTROY);
981 sk->sk_state = TCP_CLOSE;
982 sk->sk_shutdown |= SEND_SHUTDOWN;
983 sk->sk_state_change(sk);
984 ax25_destroy_socket(ax25);
995 * We support a funny extension here so you can (as root) give any callsign
996 * digipeated via a local address as source. This hack is obsolete now
997 * that we've implemented support for SO_BINDTODEVICE. It is however small
998 * and trivially backward compatible.
1000 static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1002 struct sock *sk = sock->sk;
1003 struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
1004 ax25_dev *ax25_dev = NULL;
1009 if (addr_len != sizeof(struct sockaddr_ax25) &&
1010 addr_len != sizeof(struct full_sockaddr_ax25)) {
1011 /* support for old structure may go away some time */
1012 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1013 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1017 printk(KERN_WARNING "ax25_bind(): %s uses old (6 digipeater) socket structure.\n",
1021 if (addr->fsa_ax25.sax25_family != AF_AX25)
1024 call = ax25_findbyuid(current->euid);
1025 if (call == NULL && ax25_uid_policy && !capable(CAP_NET_ADMIN)) {
1032 if (!sock_flag(sk, SOCK_ZAPPED)) {
1038 ax25->source_addr = addr->fsa_ax25.sax25_call;
1040 ax25->source_addr = *call;
1043 * User already set interface with SO_BINDTODEVICE
1045 if (ax25->ax25_dev != NULL)
1048 if (addr_len > sizeof(struct sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
1049 if (ax25cmp(&addr->fsa_digipeater[0], &null_ax25_address) != 0 &&
1050 (ax25_dev = ax25_addr_ax25dev(&addr->fsa_digipeater[0])) == NULL) {
1051 err = -EADDRNOTAVAIL;
1055 if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL) {
1056 err = -EADDRNOTAVAIL;
1061 if (ax25_dev != NULL)
1062 ax25_fillin_cb(ax25, ax25_dev);
1066 sock_reset_flag(sk, SOCK_ZAPPED);
1075 * FIXME: nonblock behaviour looks like it may have a bug.
1077 static int ax25_connect(struct socket *sock, struct sockaddr *uaddr,
1078 int addr_len, int flags)
1080 struct sock *sk = sock->sk;
1081 ax25_cb *ax25 = ax25_sk(sk), *ax25t;
1082 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1083 ax25_digi *digi = NULL;
1084 int ct = 0, err = 0;
1087 * some sanity checks. code further down depends on this
1090 if (addr_len == sizeof(struct sockaddr_ax25)) {
1091 /* support for this will go away in early 2.5.x */
1092 printk(KERN_WARNING "ax25_connect(): %s uses obsolete socket structure\n",
1095 else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
1096 /* support for old structure may go away some time */
1097 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1098 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1102 printk(KERN_WARNING "ax25_connect(): %s uses old (6 digipeater) socket structure.\n",
1106 if (fsa->fsa_ax25.sax25_family != AF_AX25)
1111 /* deal with restarts */
1112 if (sock->state == SS_CONNECTING) {
1113 switch (sk->sk_state) {
1114 case TCP_SYN_SENT: /* still trying */
1118 case TCP_ESTABLISHED: /* connection established */
1119 sock->state = SS_CONNECTED;
1122 case TCP_CLOSE: /* connection refused */
1123 sock->state = SS_UNCONNECTED;
1124 err = -ECONNREFUSED;
1129 if (sk->sk_state == TCP_ESTABLISHED && sk->sk_type == SOCK_SEQPACKET) {
1130 err = -EISCONN; /* No reconnect on a seqpacket socket */
1134 sk->sk_state = TCP_CLOSE;
1135 sock->state = SS_UNCONNECTED;
1137 if (ax25->digipeat != NULL) {
1138 kfree(ax25->digipeat);
1139 ax25->digipeat = NULL;
1143 * Handle digi-peaters to be used.
1145 if (addr_len > sizeof(struct sockaddr_ax25) &&
1146 fsa->fsa_ax25.sax25_ndigis != 0) {
1147 /* Valid number of digipeaters ? */
1148 if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS) {
1153 if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
1158 digi->ndigi = fsa->fsa_ax25.sax25_ndigis;
1159 digi->lastrepeat = -1;
1161 while (ct < fsa->fsa_ax25.sax25_ndigis) {
1162 if ((fsa->fsa_digipeater[ct].ax25_call[6] &
1163 AX25_HBIT) && ax25->iamdigi) {
1164 digi->repeated[ct] = 1;
1165 digi->lastrepeat = ct;
1167 digi->repeated[ct] = 0;
1169 digi->calls[ct] = fsa->fsa_digipeater[ct];
1175 * Must bind first - autobinding in this may or may not work. If
1176 * the socket is already bound, check to see if the device has
1177 * been filled in, error if it hasn't.
1179 if (sock_flag(sk, SOCK_ZAPPED)) {
1180 /* check if we can remove this feature. It is broken. */
1181 printk(KERN_WARNING "ax25_connect(): %s uses autobind, please contact jreuter@yaina.de\n",
1183 if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) {
1188 ax25_fillin_cb(ax25, ax25->ax25_dev);
1191 if (ax25->ax25_dev == NULL) {
1193 err = -EHOSTUNREACH;
1198 if (sk->sk_type == SOCK_SEQPACKET &&
1199 (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
1200 ax25->ax25_dev->dev))) {
1202 err = -EADDRINUSE; /* Already such a connection */
1207 ax25->dest_addr = fsa->fsa_ax25.sax25_call;
1208 ax25->digipeat = digi;
1210 /* First the easy one */
1211 if (sk->sk_type != SOCK_SEQPACKET) {
1212 sock->state = SS_CONNECTED;
1213 sk->sk_state = TCP_ESTABLISHED;
1217 /* Move to connecting socket, ax.25 lapb WAIT_UA.. */
1218 sock->state = SS_CONNECTING;
1219 sk->sk_state = TCP_SYN_SENT;
1221 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1222 case AX25_PROTO_STD_SIMPLEX:
1223 case AX25_PROTO_STD_DUPLEX:
1224 ax25_std_establish_data_link(ax25);
1227 #ifdef CONFIG_AX25_DAMA_SLAVE
1228 case AX25_PROTO_DAMA_SLAVE:
1229 ax25->modulus = AX25_MODULUS;
1230 ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
1231 if (ax25->ax25_dev->dama.slave)
1232 ax25_ds_establish_data_link(ax25);
1234 ax25_std_establish_data_link(ax25);
1239 ax25->state = AX25_STATE_1;
1241 ax25_start_heartbeat(ax25);
1244 if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) {
1249 if (sk->sk_state == TCP_SYN_SENT) {
1250 struct task_struct *tsk = current;
1251 DECLARE_WAITQUEUE(wait, tsk);
1253 add_wait_queue(sk->sk_sleep, &wait);
1255 if (sk->sk_state != TCP_SYN_SENT)
1257 set_current_state(TASK_INTERRUPTIBLE);
1259 if (!signal_pending(tsk)) {
1264 current->state = TASK_RUNNING;
1265 remove_wait_queue(sk->sk_sleep, &wait);
1266 return -ERESTARTSYS;
1268 current->state = TASK_RUNNING;
1269 remove_wait_queue(sk->sk_sleep, &wait);
1272 if (sk->sk_state != TCP_ESTABLISHED) {
1273 /* Not in ABM, not in WAIT_UA -> failed */
1274 sock->state = SS_UNCONNECTED;
1275 err = sock_error(sk); /* Always set at this point */
1279 sock->state = SS_CONNECTED;
1289 static int ax25_accept(struct socket *sock, struct socket *newsock, int flags)
1291 struct task_struct *tsk = current;
1292 DECLARE_WAITQUEUE(wait, tsk);
1293 struct sk_buff *skb;
1298 if (sock->state != SS_UNCONNECTED)
1301 if ((sk = sock->sk) == NULL)
1305 if (sk->sk_type != SOCK_SEQPACKET) {
1310 if (sk->sk_state != TCP_LISTEN) {
1316 * The read queue this time is holding sockets ready to use
1317 * hooked into the SABM we saved
1319 add_wait_queue(sk->sk_sleep, &wait);
1321 skb = skb_dequeue(&sk->sk_receive_queue);
1326 current->state = TASK_INTERRUPTIBLE;
1327 if (flags & O_NONBLOCK) {
1328 current->state = TASK_RUNNING;
1329 remove_wait_queue(sk->sk_sleep, &wait);
1330 return -EWOULDBLOCK;
1332 if (!signal_pending(tsk)) {
1337 current->state = TASK_RUNNING;
1338 remove_wait_queue(sk->sk_sleep, &wait);
1339 return -ERESTARTSYS;
1341 current->state = TASK_RUNNING;
1342 remove_wait_queue(sk->sk_sleep, &wait);
1345 newsk->sk_socket = newsock;
1346 newsk->sk_sleep = &newsock->wait;
1348 /* Now attach up the new socket */
1350 sk->sk_ack_backlog--;
1351 newsock->sk = newsk;
1352 newsock->state = SS_CONNECTED;
1360 static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
1361 int *uaddr_len, int peer)
1363 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1364 struct sock *sk = sock->sk;
1365 unsigned char ndigi, i;
1373 if (sk->sk_state != TCP_ESTABLISHED) {
1378 fsa->fsa_ax25.sax25_family = AF_AX25;
1379 fsa->fsa_ax25.sax25_call = ax25->dest_addr;
1380 fsa->fsa_ax25.sax25_ndigis = 0;
1382 if (ax25->digipeat != NULL) {
1383 ndigi = ax25->digipeat->ndigi;
1384 fsa->fsa_ax25.sax25_ndigis = ndigi;
1385 for (i = 0; i < ndigi; i++)
1386 fsa->fsa_digipeater[i] =
1387 ax25->digipeat->calls[i];
1390 fsa->fsa_ax25.sax25_family = AF_AX25;
1391 fsa->fsa_ax25.sax25_call = ax25->source_addr;
1392 fsa->fsa_ax25.sax25_ndigis = 1;
1393 if (ax25->ax25_dev != NULL) {
1394 memcpy(&fsa->fsa_digipeater[0],
1395 ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
1397 fsa->fsa_digipeater[0] = null_ax25_address;
1400 *uaddr_len = sizeof (struct full_sockaddr_ax25);
1408 static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
1409 struct msghdr *msg, size_t len)
1411 struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
1412 struct sock *sk = sock->sk;
1413 struct sockaddr_ax25 sax;
1414 struct sk_buff *skb;
1415 ax25_digi dtmp, *dp;
1416 unsigned char *asmptr;
1419 int lv, err, addr_len = msg->msg_namelen;
1421 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
1427 if (sock_flag(sk, SOCK_ZAPPED)) {
1428 err = -EADDRNOTAVAIL;
1432 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1433 send_sig(SIGPIPE, current, 0);
1438 if (ax25->ax25_dev == NULL) {
1443 if (len > ax25->ax25_dev->dev->mtu) {
1449 if (usax->sax25_family != AF_AX25) {
1454 if (addr_len == sizeof(struct sockaddr_ax25)) {
1455 printk(KERN_WARNING "ax25_sendmsg(): %s uses obsolete socket structure\n",
1458 else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
1459 /* support for old structure may go away some time */
1460 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1461 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1466 printk(KERN_WARNING "ax25_sendmsg(): %s uses old (6 digipeater) socket structure.\n",
1470 if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
1472 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
1474 /* Valid number of digipeaters ? */
1475 if (usax->sax25_ndigis < 1 || usax->sax25_ndigis > AX25_MAX_DIGIS) {
1480 dtmp.ndigi = usax->sax25_ndigis;
1482 while (ct < usax->sax25_ndigis) {
1483 dtmp.repeated[ct] = 0;
1484 dtmp.calls[ct] = fsa->fsa_digipeater[ct];
1488 dtmp.lastrepeat = 0;
1492 if (sk->sk_type == SOCK_SEQPACKET &&
1493 ax25cmp(&ax25->dest_addr, &sax.sax25_call)) {
1497 if (usax->sax25_ndigis == 0)
1503 * FIXME: 1003.1g - if the socket is like this because
1504 * it has become closed (not started closed) and is VC
1505 * we ought to SIGPIPE, EPIPE
1507 if (sk->sk_state != TCP_ESTABLISHED) {
1511 sax.sax25_family = AF_AX25;
1512 sax.sax25_call = ax25->dest_addr;
1513 dp = ax25->digipeat;
1516 SOCK_DEBUG(sk, "AX.25: sendto: Addresses built.\n");
1518 /* Build a packet */
1519 SOCK_DEBUG(sk, "AX.25: sendto: building packet.\n");
1521 /* Assume the worst case */
1522 size = len + ax25->ax25_dev->dev->hard_header_len;
1524 skb = sock_alloc_send_skb(sk, size, msg->msg_flags&MSG_DONTWAIT, &err);
1528 skb_reserve(skb, size - len);
1530 SOCK_DEBUG(sk, "AX.25: Appending user data\n");
1532 /* User data follows immediately after the AX.25 data */
1533 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
1539 skb->nh.raw = skb->data;
1541 /* Add the PID if one is not supplied by the user in the skb */
1542 if (!ax25->pidincl) {
1543 asmptr = skb_push(skb, 1);
1544 *asmptr = sk->sk_protocol;
1547 SOCK_DEBUG(sk, "AX.25: Transmitting buffer\n");
1549 if (sk->sk_type == SOCK_SEQPACKET) {
1550 /* Connected mode sockets go via the LAPB machine */
1551 if (sk->sk_state != TCP_ESTABLISHED) {
1557 /* Shove it onto the queue and kick */
1558 ax25_output(ax25, ax25->paclen, skb);
1564 asmptr = skb_push(skb, 1 + ax25_addr_size(dp));
1566 SOCK_DEBUG(sk, "Building AX.25 Header (dp=%p).\n", dp);
1569 SOCK_DEBUG(sk, "Num digipeaters=%d\n", dp->ndigi);
1571 /* Build an AX.25 header */
1572 asmptr += (lv = ax25_addr_build(asmptr, &ax25->source_addr,
1573 &sax.sax25_call, dp,
1574 AX25_COMMAND, AX25_MODULUS));
1576 SOCK_DEBUG(sk, "Built header (%d bytes)\n",lv);
1578 skb->h.raw = asmptr;
1580 SOCK_DEBUG(sk, "base=%p pos=%p\n", skb->data, asmptr);
1584 /* Datagram frames go straight out of the door as UI */
1585 ax25_queue_xmit(skb, ax25->ax25_dev->dev);
1595 static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
1596 struct msghdr *msg, size_t size, int flags)
1598 struct sock *sk = sock->sk;
1599 struct sk_buff *skb;
1605 * This works for seqpacket too. The receiver has ordered the
1606 * queue for us! We do one quick check first though
1608 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) {
1613 /* Now we can treat all alike */
1614 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
1615 flags & MSG_DONTWAIT, &err);
1619 if (!ax25_sk(sk)->pidincl)
1620 skb_pull(skb, 1); /* Remove PID */
1622 skb->h.raw = skb->data;
1625 if (copied > size) {
1627 msg->msg_flags |= MSG_TRUNC;
1630 skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
1632 if (msg->msg_namelen != 0) {
1633 struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
1637 ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, &src, NULL, &digi, NULL, NULL);
1639 sax->sax25_family = AF_AX25;
1640 /* We set this correctly, even though we may not let the
1641 application know the digi calls further down (because it
1642 did NOT ask to know them). This could get political... **/
1643 sax->sax25_ndigis = digi.ndigi;
1644 sax->sax25_call = src;
1646 if (sax->sax25_ndigis != 0) {
1648 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
1650 for (ct = 0; ct < digi.ndigi; ct++)
1651 fsa->fsa_digipeater[ct] = digi.calls[ct];
1653 msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
1656 skb_free_datagram(sk, skb);
1665 static int ax25_shutdown(struct socket *sk, int how)
1667 /* FIXME - generate DM and RNR states */
1671 static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1673 struct sock *sk = sock->sk;
1674 void __user *argp = (void __user *)arg;
1681 amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
1684 res = put_user(amount, (int __user *)argp);
1689 struct sk_buff *skb;
1691 /* These two are safe on a single CPU system as only user tasks fiddle here */
1692 if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1694 res = put_user(amount, (int __user *)argp);
1700 res = sock_get_timestamp(sk, argp);
1706 case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */
1707 case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */
1708 case SIOCAX25GETUID: {
1709 struct sockaddr_ax25 sax25;
1710 if (copy_from_user(&sax25, argp, sizeof(sax25))) {
1714 res = ax25_uid_ioctl(cmd, &sax25);
1718 case SIOCAX25NOUID: { /* Set the default policy (default/bar) */
1720 if (!capable(CAP_NET_ADMIN)) {
1724 if (get_user(amount, (long __user *)argp)) {
1728 if (amount > AX25_NOUID_BLOCK) {
1732 ax25_uid_policy = amount;
1740 if (!capable(CAP_NET_ADMIN)) {
1744 res = ax25_rt_ioctl(cmd, argp);
1747 case SIOCAX25CTLCON:
1748 if (!capable(CAP_NET_ADMIN)) {
1752 res = ax25_ctl_ioctl(cmd, argp);
1755 case SIOCAX25GETINFO:
1756 case SIOCAX25GETINFOOLD: {
1757 ax25_cb *ax25 = ax25_sk(sk);
1758 struct ax25_info_struct ax25_info;
1760 ax25_info.t1 = ax25->t1 / HZ;
1761 ax25_info.t2 = ax25->t2 / HZ;
1762 ax25_info.t3 = ax25->t3 / HZ;
1763 ax25_info.idle = ax25->idle / (60 * HZ);
1764 ax25_info.n2 = ax25->n2;
1765 ax25_info.t1timer = ax25_display_timer(&ax25->t1timer) / HZ;
1766 ax25_info.t2timer = ax25_display_timer(&ax25->t2timer) / HZ;
1767 ax25_info.t3timer = ax25_display_timer(&ax25->t3timer) / HZ;
1768 ax25_info.idletimer = ax25_display_timer(&ax25->idletimer) / (60 * HZ);
1769 ax25_info.n2count = ax25->n2count;
1770 ax25_info.state = ax25->state;
1771 ax25_info.rcv_q = atomic_read(&sk->sk_rmem_alloc);
1772 ax25_info.snd_q = atomic_read(&sk->sk_wmem_alloc);
1773 ax25_info.vs = ax25->vs;
1774 ax25_info.vr = ax25->vr;
1775 ax25_info.va = ax25->va;
1776 ax25_info.vs_max = ax25->vs; /* reserved */
1777 ax25_info.paclen = ax25->paclen;
1778 ax25_info.window = ax25->window;
1780 /* old structure? */
1781 if (cmd == SIOCAX25GETINFOOLD) {
1782 static int warned = 0;
1784 printk(KERN_INFO "%s uses old SIOCAX25GETINFO\n",
1789 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct_deprecated))) {
1794 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct))) {
1803 case SIOCAX25ADDFWD:
1804 case SIOCAX25DELFWD: {
1805 struct ax25_fwd_struct ax25_fwd;
1806 if (!capable(CAP_NET_ADMIN)) {
1810 if (copy_from_user(&ax25_fwd, argp, sizeof(ax25_fwd))) {
1814 res = ax25_fwd_ioctl(cmd, &ax25_fwd);
1820 case SIOCGIFDSTADDR:
1821 case SIOCSIFDSTADDR:
1822 case SIOCGIFBRDADDR:
1823 case SIOCSIFBRDADDR:
1824 case SIOCGIFNETMASK:
1825 case SIOCSIFNETMASK:
1832 res = dev_ioctl(cmd, argp);
1840 #ifdef CONFIG_PROC_FS
1842 static void *ax25_info_start(struct seq_file *seq, loff_t *pos)
1844 struct ax25_cb *ax25;
1845 struct hlist_node *node;
1848 spin_lock_bh(&ax25_list_lock);
1849 ax25_for_each(ax25, node, &ax25_list) {
1857 static void *ax25_info_next(struct seq_file *seq, void *v, loff_t *pos)
1861 return hlist_entry( ((struct ax25_cb *)v)->ax25_node.next,
1862 struct ax25_cb, ax25_node);
1865 static void ax25_info_stop(struct seq_file *seq, void *v)
1867 spin_unlock_bh(&ax25_list_lock);
1870 static int ax25_info_show(struct seq_file *seq, void *v)
1878 * 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
1881 seq_printf(seq, "%8.8lx %s %s%s ",
1883 ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
1884 ax2asc(&ax25->source_addr),
1885 ax25->iamdigi? "*":"");
1886 seq_printf(seq, "%s", ax2asc(&ax25->dest_addr));
1888 for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
1889 seq_printf(seq, ",%s%s",
1890 ax2asc(&ax25->digipeat->calls[k]),
1891 ax25->digipeat->repeated[k]? "*":"");
1894 seq_printf(seq, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
1896 ax25->vs, ax25->vr, ax25->va,
1897 ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
1898 ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
1899 ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
1900 ax25_display_timer(&ax25->idletimer) / (60 * HZ),
1901 ax25->idle / (60 * HZ),
1902 ax25->n2count, ax25->n2,
1907 if (ax25->sk != NULL) {
1908 bh_lock_sock(ax25->sk);
1909 seq_printf(seq," %d %d %ld\n",
1910 atomic_read(&ax25->sk->sk_wmem_alloc),
1911 atomic_read(&ax25->sk->sk_rmem_alloc),
1912 ax25->sk->sk_socket != NULL ? SOCK_INODE(ax25->sk->sk_socket)->i_ino : 0L);
1913 bh_unlock_sock(ax25->sk);
1915 seq_puts(seq, " * * *\n");
1920 static struct seq_operations ax25_info_seqops = {
1921 .start = ax25_info_start,
1922 .next = ax25_info_next,
1923 .stop = ax25_info_stop,
1924 .show = ax25_info_show,
1927 static int ax25_info_open(struct inode *inode, struct file *file)
1929 return seq_open(file, &ax25_info_seqops);
1932 static struct file_operations ax25_info_fops = {
1933 .owner = THIS_MODULE,
1934 .open = ax25_info_open,
1936 .llseek = seq_lseek,
1937 .release = seq_release,
1942 static struct net_proto_family ax25_family_ops = {
1944 .create = ax25_create,
1945 .owner = THIS_MODULE,
1948 static struct proto_ops ax25_proto_ops = {
1950 .owner = THIS_MODULE,
1951 .release = ax25_release,
1953 .connect = ax25_connect,
1954 .socketpair = sock_no_socketpair,
1955 .accept = ax25_accept,
1956 .getname = ax25_getname,
1957 .poll = datagram_poll,
1958 .ioctl = ax25_ioctl,
1959 .listen = ax25_listen,
1960 .shutdown = ax25_shutdown,
1961 .setsockopt = ax25_setsockopt,
1962 .getsockopt = ax25_getsockopt,
1963 .sendmsg = ax25_sendmsg,
1964 .recvmsg = ax25_recvmsg,
1965 .mmap = sock_no_mmap,
1966 .sendpage = sock_no_sendpage,
1970 * Called by socket.c on kernel start up
1972 static struct packet_type ax25_packet_type = {
1973 .type = __constant_htons(ETH_P_AX25),
1974 .dev = NULL, /* All devices */
1975 .func = ax25_kiss_rcv,
1978 static struct notifier_block ax25_dev_notifier = {
1979 .notifier_call =ax25_device_event,
1982 EXPORT_SYMBOL(ax25_encapsulate);
1983 EXPORT_SYMBOL(ax25_rebuild_header);
1984 EXPORT_SYMBOL(ax25_findbyuid);
1985 EXPORT_SYMBOL(ax25_find_cb);
1986 EXPORT_SYMBOL(ax25_linkfail_register);
1987 EXPORT_SYMBOL(ax25_linkfail_release);
1988 EXPORT_SYMBOL(ax25_listen_register);
1989 EXPORT_SYMBOL(ax25_listen_release);
1990 EXPORT_SYMBOL(ax25_protocol_register);
1991 EXPORT_SYMBOL(ax25_protocol_release);
1992 EXPORT_SYMBOL(ax25_send_frame);
1993 EXPORT_SYMBOL(ax25_uid_policy);
1994 EXPORT_SYMBOL(ax25cmp);
1995 EXPORT_SYMBOL(ax2asc);
1996 EXPORT_SYMBOL(asc2ax);
1997 EXPORT_SYMBOL(null_ax25_address);
1998 EXPORT_SYMBOL(ax25_display_timer);
2000 static int __init ax25_init(void)
2002 int rc = proto_register(&ax25_proto, 0);
2007 sock_register(&ax25_family_ops);
2008 dev_add_pack(&ax25_packet_type);
2009 register_netdevice_notifier(&ax25_dev_notifier);
2010 ax25_register_sysctl();
2012 proc_net_fops_create("ax25_route", S_IRUGO, &ax25_route_fops);
2013 proc_net_fops_create("ax25", S_IRUGO, &ax25_info_fops);
2014 proc_net_fops_create("ax25_calls", S_IRUGO, &ax25_uid_fops);
2018 module_init(ax25_init);
2021 MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
2022 MODULE_DESCRIPTION("The amateur radio AX.25 link layer protocol");
2023 MODULE_LICENSE("GPL");
2024 MODULE_ALIAS_NETPROTO(PF_AX25);
2026 static void __exit ax25_exit(void)
2028 proc_net_remove("ax25_route");
2029 proc_net_remove("ax25");
2030 proc_net_remove("ax25_calls");
2035 ax25_unregister_sysctl();
2036 unregister_netdevice_notifier(&ax25_dev_notifier);
2038 dev_remove_pack(&ax25_packet_type);
2040 sock_unregister(PF_AX25);
2041 proto_unregister(&ax25_proto);
2043 module_exit(ax25_exit);