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/capability.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/sockios.h>
27 #include <linux/net.h>
29 #include <linux/inet.h>
30 #include <linux/netdevice.h>
31 #include <linux/if_arp.h>
32 #include <linux/skbuff.h>
34 #include <asm/uaccess.h>
35 #include <asm/system.h>
36 #include <linux/fcntl.h>
37 #include <linux/termios.h> /* For TIOCINQ/OUTQ */
39 #include <linux/interrupt.h>
40 #include <linux/notifier.h>
41 #include <linux/proc_fs.h>
42 #include <linux/stat.h>
43 #include <linux/netfilter.h>
44 #include <linux/sysctl.h>
45 #include <linux/init.h>
46 #include <linux/spinlock.h>
47 #include <net/tcp_states.h>
53 HLIST_HEAD(ax25_list);
54 DEFINE_SPINLOCK(ax25_list_lock);
56 static const struct proto_ops ax25_proto_ops;
58 static void ax25_free_sock(struct sock *sk)
60 ax25_cb_put(ax25_sk(sk));
64 * Socket removal during an interrupt is now safe.
66 static void ax25_cb_del(ax25_cb *ax25)
68 if (!hlist_unhashed(&ax25->ax25_node)) {
69 spin_lock_bh(&ax25_list_lock);
70 hlist_del_init(&ax25->ax25_node);
71 spin_unlock_bh(&ax25_list_lock);
77 * Kill all bound sockets on a dropped device.
79 static void ax25_kill_by_device(struct net_device *dev)
83 struct hlist_node *node;
85 if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
88 spin_lock_bh(&ax25_list_lock);
89 ax25_for_each(s, node, &ax25_list) {
90 if (s->ax25_dev == ax25_dev) {
92 ax25_disconnect(s, ENETUNREACH);
95 spin_unlock_bh(&ax25_list_lock);
99 * Handle device status changes.
101 static int ax25_device_event(struct notifier_block *this, unsigned long event,
104 struct net_device *dev = (struct net_device *)ptr;
106 /* Reject non AX.25 devices */
107 if (dev->type != ARPHRD_AX25)
112 ax25_dev_device_up(dev);
115 ax25_kill_by_device(dev);
116 ax25_rt_device_down(dev);
117 ax25_dev_device_down(dev);
127 * Add a socket to the bound sockets list.
129 void ax25_cb_add(ax25_cb *ax25)
131 spin_lock_bh(&ax25_list_lock);
133 hlist_add_head(&ax25->ax25_node, &ax25_list);
134 spin_unlock_bh(&ax25_list_lock);
138 * Find a socket that wants to accept the SABM we have just
141 struct sock *ax25_find_listener(ax25_address *addr, int digi,
142 struct net_device *dev, int type)
145 struct hlist_node *node;
147 spin_lock(&ax25_list_lock);
148 ax25_for_each(s, node, &ax25_list) {
149 if ((s->iamdigi && !digi) || (!s->iamdigi && digi))
151 if (s->sk && !ax25cmp(&s->source_addr, addr) &&
152 s->sk->sk_type == type && s->sk->sk_state == TCP_LISTEN) {
153 /* If device is null we match any device */
154 if (s->ax25_dev == NULL || s->ax25_dev->dev == dev) {
156 spin_unlock(&ax25_list_lock);
161 spin_unlock(&ax25_list_lock);
167 * Find an AX.25 socket given both ends.
169 struct sock *ax25_get_socket(ax25_address *my_addr, ax25_address *dest_addr,
172 struct sock *sk = NULL;
174 struct hlist_node *node;
176 spin_lock(&ax25_list_lock);
177 ax25_for_each(s, node, &ax25_list) {
178 if (s->sk && !ax25cmp(&s->source_addr, my_addr) &&
179 !ax25cmp(&s->dest_addr, dest_addr) &&
180 s->sk->sk_type == type) {
187 spin_unlock(&ax25_list_lock);
193 * Find an AX.25 control block given both ends. It will only pick up
194 * floating AX.25 control blocks or non Raw socket bound control blocks.
196 ax25_cb *ax25_find_cb(ax25_address *src_addr, ax25_address *dest_addr,
197 ax25_digi *digi, struct net_device *dev)
200 struct hlist_node *node;
202 spin_lock_bh(&ax25_list_lock);
203 ax25_for_each(s, node, &ax25_list) {
204 if (s->sk && s->sk->sk_type != SOCK_SEQPACKET)
206 if (s->ax25_dev == NULL)
208 if (ax25cmp(&s->source_addr, src_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->ax25_dev->dev == dev) {
209 if (digi != NULL && digi->ndigi != 0) {
210 if (s->digipeat == NULL)
212 if (ax25digicmp(s->digipeat, digi) != 0)
215 if (s->digipeat != NULL && s->digipeat->ndigi != 0)
219 spin_unlock_bh(&ax25_list_lock);
224 spin_unlock_bh(&ax25_list_lock);
229 EXPORT_SYMBOL(ax25_find_cb);
231 void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto)
234 struct sk_buff *copy;
235 struct hlist_node *node;
237 spin_lock(&ax25_list_lock);
238 ax25_for_each(s, node, &ax25_list) {
239 if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 &&
240 s->sk->sk_type == SOCK_RAW &&
241 s->sk->sk_protocol == proto &&
242 s->ax25_dev->dev == skb->dev &&
243 atomic_read(&s->sk->sk_rmem_alloc) <= s->sk->sk_rcvbuf) {
244 if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
246 if (sock_queue_rcv_skb(s->sk, copy) != 0)
250 spin_unlock(&ax25_list_lock);
256 void ax25_destroy_socket(ax25_cb *);
259 * Handler for deferred kills.
261 static void ax25_destroy_timer(unsigned long data)
263 ax25_cb *ax25=(ax25_cb *)data;
270 ax25_destroy_socket(ax25);
276 * This is called from user mode and the timers. Thus it protects itself
277 * against interrupt users but doesn't worry about being called during
278 * work. Once it is removed from the queue no interrupt or bottom half
279 * will touch it and we are (fairly 8-) ) safe.
281 void ax25_destroy_socket(ax25_cb *ax25)
287 ax25_stop_heartbeat(ax25);
288 ax25_stop_t1timer(ax25);
289 ax25_stop_t2timer(ax25);
290 ax25_stop_t3timer(ax25);
291 ax25_stop_idletimer(ax25);
293 ax25_clear_queues(ax25); /* Flush the queues */
295 if (ax25->sk != NULL) {
296 while ((skb = skb_dequeue(&ax25->sk->sk_receive_queue)) != NULL) {
297 if (skb->sk != ax25->sk) {
298 /* A pending connection */
299 ax25_cb *sax25 = ax25_sk(skb->sk);
301 /* Queue the unaccepted socket for death */
302 sock_orphan(skb->sk);
304 ax25_start_heartbeat(sax25);
305 sax25->state = AX25_STATE_0;
310 skb_queue_purge(&ax25->sk->sk_write_queue);
313 if (ax25->sk != NULL) {
314 if (atomic_read(&ax25->sk->sk_wmem_alloc) ||
315 atomic_read(&ax25->sk->sk_rmem_alloc)) {
316 /* Defer: outstanding buffers */
317 init_timer(&ax25->dtimer);
318 ax25->dtimer.expires = jiffies + 2 * HZ;
319 ax25->dtimer.function = ax25_destroy_timer;
320 ax25->dtimer.data = (unsigned long)ax25;
321 add_timer(&ax25->dtimer);
323 struct sock *sk=ax25->sk;
333 * dl1bke 960311: set parameters for existing AX.25 connections,
334 * includes a KILL command to abort any connection.
335 * VERY useful for debugging ;-)
337 static int ax25_ctl_ioctl(const unsigned int cmd, void __user *arg)
339 struct ax25_ctl_struct ax25_ctl;
345 if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
348 if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
351 if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
354 digi.ndigi = ax25_ctl.digi_count;
355 for (k = 0; k < digi.ndigi; k++)
356 digi.calls[k] = ax25_ctl.digi_addr[k];
358 if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
361 switch (ax25_ctl.cmd) {
363 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
364 #ifdef CONFIG_AX25_DAMA_SLAVE
365 if (ax25_dev->dama.slave && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
368 ax25_disconnect(ax25, ENETRESET);
372 if (ax25->modulus == AX25_MODULUS) {
373 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
376 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
379 ax25->window = ax25_ctl.arg;
383 if (ax25_ctl.arg < 1)
385 ax25->rtt = (ax25_ctl.arg * HZ) / 2;
386 ax25->t1 = ax25_ctl.arg * HZ;
390 if (ax25_ctl.arg < 1)
392 ax25->t2 = ax25_ctl.arg * HZ;
396 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
399 ax25->n2 = ax25_ctl.arg;
403 if (ax25_ctl.arg < 0)
405 ax25->t3 = ax25_ctl.arg * HZ;
409 if (ax25_ctl.arg < 0)
411 ax25->idle = ax25_ctl.arg * 60 * HZ;
415 if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
417 ax25->paclen = ax25_ctl.arg;
427 static void ax25_fillin_cb_from_dev(ax25_cb *ax25, ax25_dev *ax25_dev)
429 ax25->rtt = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]) / 2;
430 ax25->t1 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]);
431 ax25->t2 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T2]);
432 ax25->t3 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T3]);
433 ax25->n2 = ax25_dev->values[AX25_VALUES_N2];
434 ax25->paclen = ax25_dev->values[AX25_VALUES_PACLEN];
435 ax25->idle = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_IDLE]);
436 ax25->backoff = ax25_dev->values[AX25_VALUES_BACKOFF];
438 if (ax25_dev->values[AX25_VALUES_AXDEFMODE]) {
439 ax25->modulus = AX25_EMODULUS;
440 ax25->window = ax25_dev->values[AX25_VALUES_EWINDOW];
442 ax25->modulus = AX25_MODULUS;
443 ax25->window = ax25_dev->values[AX25_VALUES_WINDOW];
448 * Fill in a created AX.25 created control block with the default
449 * values for a particular device.
451 void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
453 ax25->ax25_dev = ax25_dev;
455 if (ax25->ax25_dev != NULL) {
456 ax25_fillin_cb_from_dev(ax25, ax25_dev);
461 * No device, use kernel / AX.25 spec default values
463 ax25->rtt = msecs_to_jiffies(AX25_DEF_T1) / 2;
464 ax25->t1 = msecs_to_jiffies(AX25_DEF_T1);
465 ax25->t2 = msecs_to_jiffies(AX25_DEF_T2);
466 ax25->t3 = msecs_to_jiffies(AX25_DEF_T3);
467 ax25->n2 = AX25_DEF_N2;
468 ax25->paclen = AX25_DEF_PACLEN;
469 ax25->idle = msecs_to_jiffies(AX25_DEF_IDLE);
470 ax25->backoff = AX25_DEF_BACKOFF;
472 if (AX25_DEF_AXDEFMODE) {
473 ax25->modulus = AX25_EMODULUS;
474 ax25->window = AX25_DEF_EWINDOW;
476 ax25->modulus = AX25_MODULUS;
477 ax25->window = AX25_DEF_WINDOW;
482 * Create an empty AX.25 control block.
484 ax25_cb *ax25_create_cb(void)
488 if ((ax25 = kzalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
491 atomic_set(&ax25->refcount, 1);
493 skb_queue_head_init(&ax25->write_queue);
494 skb_queue_head_init(&ax25->frag_queue);
495 skb_queue_head_init(&ax25->ack_queue);
496 skb_queue_head_init(&ax25->reseq_queue);
498 init_timer(&ax25->timer);
499 init_timer(&ax25->t1timer);
500 init_timer(&ax25->t2timer);
501 init_timer(&ax25->t3timer);
502 init_timer(&ax25->idletimer);
504 ax25_fillin_cb(ax25, NULL);
506 ax25->state = AX25_STATE_0;
512 * Handling for system calls applied via the various interfaces to an
516 static int ax25_setsockopt(struct socket *sock, int level, int optname,
517 char __user *optval, int optlen)
519 struct sock *sk = sock->sk;
521 struct net_device *dev;
522 char devname[IFNAMSIZ];
525 if (level != SOL_AX25)
528 if (optlen < sizeof(int))
531 if (get_user(opt, (int __user *)optval))
539 if (ax25->modulus == AX25_MODULUS) {
540 if (opt < 1 || opt > 7) {
545 if (opt < 1 || opt > 63) {
558 ax25->rtt = (opt * HZ) / 2;
571 if (opt < 1 || opt > 31) {
591 ax25->idle = opt * 60 * HZ;
595 if (opt < 0 || opt > 2) {
603 ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
607 ax25->pidincl = opt ? 1 : 0;
611 ax25->iamdigi = opt ? 1 : 0;
615 if (opt < 16 || opt > 65535) {
622 case SO_BINDTODEVICE:
623 if (optlen > IFNAMSIZ)
625 if (copy_from_user(devname, optval, optlen)) {
630 dev = dev_get_by_name(devname);
636 if (sk->sk_type == SOCK_SEQPACKET &&
637 (sock->state != SS_UNCONNECTED ||
638 sk->sk_state == TCP_LISTEN)) {
639 res = -EADDRNOTAVAIL;
644 ax25->ax25_dev = ax25_dev_ax25dev(dev);
645 ax25_fillin_cb(ax25, ax25->ax25_dev);
656 static int ax25_getsockopt(struct socket *sock, int level, int optname,
657 char __user *optval, int __user *optlen)
659 struct sock *sk = sock->sk;
661 struct ax25_dev *ax25_dev;
662 char devname[IFNAMSIZ];
667 if (level != SOL_AX25)
670 if (get_user(maxlen, optlen))
676 valptr = (void *) &val;
677 length = min_t(unsigned int, maxlen, sizeof(int));
704 val = ax25->idle / (60 * HZ);
712 val = (ax25->modulus == AX25_EMODULUS);
727 case SO_BINDTODEVICE:
728 ax25_dev = ax25->ax25_dev;
730 if (ax25_dev != NULL && ax25_dev->dev != NULL) {
731 strlcpy(devname, ax25_dev->dev->name, sizeof(devname));
732 length = strlen(devname) + 1;
738 valptr = (void *) devname;
747 if (put_user(length, optlen))
750 return copy_to_user(optval, valptr, length) ? -EFAULT : 0;
753 static int ax25_listen(struct socket *sock, int backlog)
755 struct sock *sk = sock->sk;
759 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_LISTEN) {
760 sk->sk_max_ack_backlog = backlog;
761 sk->sk_state = TCP_LISTEN;
773 * XXX: when creating ax25_sock we should update the .obj_size setting
776 static struct proto ax25_proto = {
778 .owner = THIS_MODULE,
779 .obj_size = sizeof(struct sock),
782 static int ax25_create(struct socket *sock, int protocol)
787 switch (sock->type) {
789 if (protocol == 0 || protocol == PF_AX25)
790 protocol = AX25_P_TEXT;
796 case PF_AX25: /* For CLX */
797 protocol = AX25_P_TEXT;
810 return -ESOCKTNOSUPPORT;
811 #ifdef CONFIG_NETROM_MODULE
813 if (ax25_protocol_is_registered(AX25_P_NETROM))
814 return -ESOCKTNOSUPPORT;
816 #ifdef CONFIG_ROSE_MODULE
818 if (ax25_protocol_is_registered(AX25_P_ROSE))
819 return -ESOCKTNOSUPPORT;
829 return -ESOCKTNOSUPPORT;
832 if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, &ax25_proto, 1)) == NULL)
835 ax25 = sk->sk_protinfo = ax25_create_cb();
841 sock_init_data(sock, sk);
843 sk->sk_destruct = ax25_free_sock;
844 sock->ops = &ax25_proto_ops;
845 sk->sk_protocol = protocol;
852 struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
855 ax25_cb *ax25, *oax25;
857 if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, osk->sk_prot, 1)) == NULL)
860 if ((ax25 = ax25_create_cb()) == NULL) {
865 switch (osk->sk_type) {
876 sock_init_data(NULL, sk);
878 sk->sk_destruct = ax25_free_sock;
879 sk->sk_type = osk->sk_type;
880 sk->sk_socket = osk->sk_socket;
881 sk->sk_priority = osk->sk_priority;
882 sk->sk_protocol = osk->sk_protocol;
883 sk->sk_rcvbuf = osk->sk_rcvbuf;
884 sk->sk_sndbuf = osk->sk_sndbuf;
885 sk->sk_state = TCP_ESTABLISHED;
886 sk->sk_sleep = osk->sk_sleep;
887 sock_copy_flags(sk, osk);
889 oax25 = ax25_sk(osk);
891 ax25->modulus = oax25->modulus;
892 ax25->backoff = oax25->backoff;
893 ax25->pidincl = oax25->pidincl;
894 ax25->iamdigi = oax25->iamdigi;
895 ax25->rtt = oax25->rtt;
896 ax25->t1 = oax25->t1;
897 ax25->t2 = oax25->t2;
898 ax25->t3 = oax25->t3;
899 ax25->n2 = oax25->n2;
900 ax25->idle = oax25->idle;
901 ax25->paclen = oax25->paclen;
902 ax25->window = oax25->window;
904 ax25->ax25_dev = ax25_dev;
905 ax25->source_addr = oax25->source_addr;
907 if (oax25->digipeat != NULL) {
908 ax25->digipeat = kmemdup(oax25->digipeat, sizeof(ax25_digi),
910 if (ax25->digipeat == NULL) {
917 sk->sk_protinfo = ax25;
923 static int ax25_release(struct socket *sock)
925 struct sock *sk = sock->sk;
936 if (sk->sk_type == SOCK_SEQPACKET) {
937 switch (ax25->state) {
940 ax25_disconnect(ax25, 0);
942 ax25_destroy_socket(ax25);
947 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
949 ax25_disconnect(ax25, 0);
951 ax25_destroy_socket(ax25);
956 ax25_clear_queues(ax25);
959 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
960 case AX25_PROTO_STD_SIMPLEX:
961 case AX25_PROTO_STD_DUPLEX:
962 ax25_send_control(ax25,
966 ax25_stop_t2timer(ax25);
967 ax25_stop_t3timer(ax25);
968 ax25_stop_idletimer(ax25);
970 #ifdef CONFIG_AX25_DAMA_SLAVE
971 case AX25_PROTO_DAMA_SLAVE:
972 ax25_stop_t3timer(ax25);
973 ax25_stop_idletimer(ax25);
977 ax25_calculate_t1(ax25);
978 ax25_start_t1timer(ax25);
979 ax25->state = AX25_STATE_2;
980 sk->sk_state = TCP_CLOSE;
981 sk->sk_shutdown |= SEND_SHUTDOWN;
982 sk->sk_state_change(sk);
983 sock_set_flag(sk, SOCK_DESTROY);
990 sk->sk_state = TCP_CLOSE;
991 sk->sk_shutdown |= SEND_SHUTDOWN;
992 sk->sk_state_change(sk);
993 ax25_destroy_socket(ax25);
1004 * We support a funny extension here so you can (as root) give any callsign
1005 * digipeated via a local address as source. This hack is obsolete now
1006 * that we've implemented support for SO_BINDTODEVICE. It is however small
1007 * and trivially backward compatible.
1009 static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1011 struct sock *sk = sock->sk;
1012 struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
1013 ax25_dev *ax25_dev = NULL;
1014 ax25_uid_assoc *user;
1019 if (addr_len != sizeof(struct sockaddr_ax25) &&
1020 addr_len != sizeof(struct full_sockaddr_ax25)) {
1021 /* support for old structure may go away some time */
1022 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1023 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1027 printk(KERN_WARNING "ax25_bind(): %s uses old (6 digipeater) socket structure.\n",
1031 if (addr->fsa_ax25.sax25_family != AF_AX25)
1034 user = ax25_findbyuid(current->euid);
1039 if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
1042 call = addr->fsa_ax25.sax25_call;
1048 if (!sock_flag(sk, SOCK_ZAPPED)) {
1053 ax25->source_addr = call;
1056 * User already set interface with SO_BINDTODEVICE
1058 if (ax25->ax25_dev != NULL)
1061 if (addr_len > sizeof(struct sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
1062 if (ax25cmp(&addr->fsa_digipeater[0], &null_ax25_address) != 0 &&
1063 (ax25_dev = ax25_addr_ax25dev(&addr->fsa_digipeater[0])) == NULL) {
1064 err = -EADDRNOTAVAIL;
1068 if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL) {
1069 err = -EADDRNOTAVAIL;
1074 if (ax25_dev != NULL)
1075 ax25_fillin_cb(ax25, ax25_dev);
1079 sock_reset_flag(sk, SOCK_ZAPPED);
1088 * FIXME: nonblock behaviour looks like it may have a bug.
1090 static int __must_check ax25_connect(struct socket *sock,
1091 struct sockaddr *uaddr, int addr_len, int flags)
1093 struct sock *sk = sock->sk;
1094 ax25_cb *ax25 = ax25_sk(sk), *ax25t;
1095 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1096 ax25_digi *digi = NULL;
1097 int ct = 0, err = 0;
1100 * some sanity checks. code further down depends on this
1103 if (addr_len == sizeof(struct sockaddr_ax25)) {
1104 /* support for this will go away in early 2.5.x */
1105 printk(KERN_WARNING "ax25_connect(): %s uses obsolete socket structure\n",
1108 else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
1109 /* support for old structure may go away some time */
1110 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1111 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1115 printk(KERN_WARNING "ax25_connect(): %s uses old (6 digipeater) socket structure.\n",
1119 if (fsa->fsa_ax25.sax25_family != AF_AX25)
1124 /* deal with restarts */
1125 if (sock->state == SS_CONNECTING) {
1126 switch (sk->sk_state) {
1127 case TCP_SYN_SENT: /* still trying */
1131 case TCP_ESTABLISHED: /* connection established */
1132 sock->state = SS_CONNECTED;
1135 case TCP_CLOSE: /* connection refused */
1136 sock->state = SS_UNCONNECTED;
1137 err = -ECONNREFUSED;
1142 if (sk->sk_state == TCP_ESTABLISHED && sk->sk_type == SOCK_SEQPACKET) {
1143 err = -EISCONN; /* No reconnect on a seqpacket socket */
1147 sk->sk_state = TCP_CLOSE;
1148 sock->state = SS_UNCONNECTED;
1150 kfree(ax25->digipeat);
1151 ax25->digipeat = NULL;
1154 * Handle digi-peaters to be used.
1156 if (addr_len > sizeof(struct sockaddr_ax25) &&
1157 fsa->fsa_ax25.sax25_ndigis != 0) {
1158 /* Valid number of digipeaters ? */
1159 if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS) {
1164 if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
1169 digi->ndigi = fsa->fsa_ax25.sax25_ndigis;
1170 digi->lastrepeat = -1;
1172 while (ct < fsa->fsa_ax25.sax25_ndigis) {
1173 if ((fsa->fsa_digipeater[ct].ax25_call[6] &
1174 AX25_HBIT) && ax25->iamdigi) {
1175 digi->repeated[ct] = 1;
1176 digi->lastrepeat = ct;
1178 digi->repeated[ct] = 0;
1180 digi->calls[ct] = fsa->fsa_digipeater[ct];
1186 * Must bind first - autobinding in this may or may not work. If
1187 * the socket is already bound, check to see if the device has
1188 * been filled in, error if it hasn't.
1190 if (sock_flag(sk, SOCK_ZAPPED)) {
1191 /* check if we can remove this feature. It is broken. */
1192 printk(KERN_WARNING "ax25_connect(): %s uses autobind, please contact jreuter@yaina.de\n",
1194 if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) {
1199 ax25_fillin_cb(ax25, ax25->ax25_dev);
1202 if (ax25->ax25_dev == NULL) {
1204 err = -EHOSTUNREACH;
1209 if (sk->sk_type == SOCK_SEQPACKET &&
1210 (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
1211 ax25->ax25_dev->dev))) {
1213 err = -EADDRINUSE; /* Already such a connection */
1218 ax25->dest_addr = fsa->fsa_ax25.sax25_call;
1219 ax25->digipeat = digi;
1221 /* First the easy one */
1222 if (sk->sk_type != SOCK_SEQPACKET) {
1223 sock->state = SS_CONNECTED;
1224 sk->sk_state = TCP_ESTABLISHED;
1228 /* Move to connecting socket, ax.25 lapb WAIT_UA.. */
1229 sock->state = SS_CONNECTING;
1230 sk->sk_state = TCP_SYN_SENT;
1232 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1233 case AX25_PROTO_STD_SIMPLEX:
1234 case AX25_PROTO_STD_DUPLEX:
1235 ax25_std_establish_data_link(ax25);
1238 #ifdef CONFIG_AX25_DAMA_SLAVE
1239 case AX25_PROTO_DAMA_SLAVE:
1240 ax25->modulus = AX25_MODULUS;
1241 ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
1242 if (ax25->ax25_dev->dama.slave)
1243 ax25_ds_establish_data_link(ax25);
1245 ax25_std_establish_data_link(ax25);
1250 ax25->state = AX25_STATE_1;
1252 ax25_start_heartbeat(ax25);
1255 if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) {
1260 if (sk->sk_state == TCP_SYN_SENT) {
1264 prepare_to_wait(sk->sk_sleep, &wait,
1265 TASK_INTERRUPTIBLE);
1266 if (sk->sk_state != TCP_SYN_SENT)
1268 if (!signal_pending(current)) {
1277 finish_wait(sk->sk_sleep, &wait);
1283 if (sk->sk_state != TCP_ESTABLISHED) {
1284 /* Not in ABM, not in WAIT_UA -> failed */
1285 sock->state = SS_UNCONNECTED;
1286 err = sock_error(sk); /* Always set at this point */
1290 sock->state = SS_CONNECTED;
1299 static int ax25_accept(struct socket *sock, struct socket *newsock, int flags)
1301 struct sk_buff *skb;
1307 if (sock->state != SS_UNCONNECTED)
1310 if ((sk = sock->sk) == NULL)
1314 if (sk->sk_type != SOCK_SEQPACKET) {
1319 if (sk->sk_state != TCP_LISTEN) {
1325 * The read queue this time is holding sockets ready to use
1326 * hooked into the SABM we saved
1329 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
1330 skb = skb_dequeue(&sk->sk_receive_queue);
1334 if (flags & O_NONBLOCK) {
1338 if (!signal_pending(current)) {
1347 finish_wait(sk->sk_sleep, &wait);
1353 newsk->sk_socket = newsock;
1354 newsk->sk_sleep = &newsock->wait;
1356 /* Now attach up the new socket */
1358 sk->sk_ack_backlog--;
1359 newsock->sk = newsk;
1360 newsock->state = SS_CONNECTED;
1368 static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
1369 int *uaddr_len, int peer)
1371 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1372 struct sock *sk = sock->sk;
1373 unsigned char ndigi, i;
1381 if (sk->sk_state != TCP_ESTABLISHED) {
1386 fsa->fsa_ax25.sax25_family = AF_AX25;
1387 fsa->fsa_ax25.sax25_call = ax25->dest_addr;
1388 fsa->fsa_ax25.sax25_ndigis = 0;
1390 if (ax25->digipeat != NULL) {
1391 ndigi = ax25->digipeat->ndigi;
1392 fsa->fsa_ax25.sax25_ndigis = ndigi;
1393 for (i = 0; i < ndigi; i++)
1394 fsa->fsa_digipeater[i] =
1395 ax25->digipeat->calls[i];
1398 fsa->fsa_ax25.sax25_family = AF_AX25;
1399 fsa->fsa_ax25.sax25_call = ax25->source_addr;
1400 fsa->fsa_ax25.sax25_ndigis = 1;
1401 if (ax25->ax25_dev != NULL) {
1402 memcpy(&fsa->fsa_digipeater[0],
1403 ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
1405 fsa->fsa_digipeater[0] = null_ax25_address;
1408 *uaddr_len = sizeof (struct full_sockaddr_ax25);
1416 static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
1417 struct msghdr *msg, size_t len)
1419 struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
1420 struct sock *sk = sock->sk;
1421 struct sockaddr_ax25 sax;
1422 struct sk_buff *skb;
1423 ax25_digi dtmp, *dp;
1426 int lv, err, addr_len = msg->msg_namelen;
1428 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
1434 if (sock_flag(sk, SOCK_ZAPPED)) {
1435 err = -EADDRNOTAVAIL;
1439 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1440 send_sig(SIGPIPE, current, 0);
1445 if (ax25->ax25_dev == NULL) {
1450 if (len > ax25->ax25_dev->dev->mtu) {
1456 if (usax->sax25_family != AF_AX25) {
1461 if (addr_len == sizeof(struct sockaddr_ax25)) {
1462 printk(KERN_WARNING "ax25_sendmsg(): %s uses obsolete socket structure\n",
1465 else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
1466 /* support for old structure may go away some time */
1467 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1468 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1473 printk(KERN_WARNING "ax25_sendmsg(): %s uses old (6 digipeater) socket structure.\n",
1477 if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
1479 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
1481 /* Valid number of digipeaters ? */
1482 if (usax->sax25_ndigis < 1 || usax->sax25_ndigis > AX25_MAX_DIGIS) {
1487 dtmp.ndigi = usax->sax25_ndigis;
1489 while (ct < usax->sax25_ndigis) {
1490 dtmp.repeated[ct] = 0;
1491 dtmp.calls[ct] = fsa->fsa_digipeater[ct];
1495 dtmp.lastrepeat = 0;
1499 if (sk->sk_type == SOCK_SEQPACKET &&
1500 ax25cmp(&ax25->dest_addr, &sax.sax25_call)) {
1504 if (usax->sax25_ndigis == 0)
1510 * FIXME: 1003.1g - if the socket is like this because
1511 * it has become closed (not started closed) and is VC
1512 * we ought to SIGPIPE, EPIPE
1514 if (sk->sk_state != TCP_ESTABLISHED) {
1518 sax.sax25_family = AF_AX25;
1519 sax.sax25_call = ax25->dest_addr;
1520 dp = ax25->digipeat;
1523 SOCK_DEBUG(sk, "AX.25: sendto: Addresses built.\n");
1525 /* Build a packet */
1526 SOCK_DEBUG(sk, "AX.25: sendto: building packet.\n");
1528 /* Assume the worst case */
1529 size = len + ax25->ax25_dev->dev->hard_header_len;
1531 skb = sock_alloc_send_skb(sk, size, msg->msg_flags&MSG_DONTWAIT, &err);
1535 skb_reserve(skb, size - len);
1537 SOCK_DEBUG(sk, "AX.25: Appending user data\n");
1539 /* User data follows immediately after the AX.25 data */
1540 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
1546 skb_reset_network_header(skb);
1548 /* Add the PID if one is not supplied by the user in the skb */
1550 *skb_push(skb, 1) = sk->sk_protocol;
1552 SOCK_DEBUG(sk, "AX.25: Transmitting buffer\n");
1554 if (sk->sk_type == SOCK_SEQPACKET) {
1555 /* Connected mode sockets go via the LAPB machine */
1556 if (sk->sk_state != TCP_ESTABLISHED) {
1562 /* Shove it onto the queue and kick */
1563 ax25_output(ax25, ax25->paclen, skb);
1569 skb_push(skb, 1 + ax25_addr_size(dp));
1571 SOCK_DEBUG(sk, "Building AX.25 Header (dp=%p).\n", dp);
1574 SOCK_DEBUG(sk, "Num digipeaters=%d\n", dp->ndigi);
1576 /* Build an AX.25 header */
1577 lv = ax25_addr_build(skb->data, &ax25->source_addr, &sax.sax25_call,
1578 dp, AX25_COMMAND, AX25_MODULUS);
1580 SOCK_DEBUG(sk, "Built header (%d bytes)\n",lv);
1582 skb_set_transport_header(skb, lv);
1584 SOCK_DEBUG(sk, "base=%p pos=%p\n",
1585 skb->data, skb_transport_header(skb));
1587 *skb_transport_header(skb) = AX25_UI;
1589 /* Datagram frames go straight out of the door as UI */
1590 ax25_queue_xmit(skb, ax25->ax25_dev->dev);
1600 static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
1601 struct msghdr *msg, size_t size, int flags)
1603 struct sock *sk = sock->sk;
1604 struct sk_buff *skb;
1610 * This works for seqpacket too. The receiver has ordered the
1611 * queue for us! We do one quick check first though
1613 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) {
1618 /* Now we can treat all alike */
1619 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
1620 flags & MSG_DONTWAIT, &err);
1624 if (!ax25_sk(sk)->pidincl)
1625 skb_pull(skb, 1); /* Remove PID */
1627 skb_reset_transport_header(skb);
1630 if (copied > size) {
1632 msg->msg_flags |= MSG_TRUNC;
1635 skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
1637 if (msg->msg_namelen != 0) {
1638 struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
1641 const unsigned char *mac = skb_mac_header(skb);
1643 ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL,
1645 sax->sax25_family = AF_AX25;
1646 /* We set this correctly, even though we may not let the
1647 application know the digi calls further down (because it
1648 did NOT ask to know them). This could get political... **/
1649 sax->sax25_ndigis = digi.ndigi;
1650 sax->sax25_call = src;
1652 if (sax->sax25_ndigis != 0) {
1654 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
1656 for (ct = 0; ct < digi.ndigi; ct++)
1657 fsa->fsa_digipeater[ct] = digi.calls[ct];
1659 msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
1662 skb_free_datagram(sk, skb);
1671 static int ax25_shutdown(struct socket *sk, int how)
1673 /* FIXME - generate DM and RNR states */
1677 static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1679 struct sock *sk = sock->sk;
1680 void __user *argp = (void __user *)arg;
1687 amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
1690 res = put_user(amount, (int __user *)argp);
1695 struct sk_buff *skb;
1697 /* These two are safe on a single CPU system as only user tasks fiddle here */
1698 if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1700 res = put_user(amount, (int __user *) argp);
1705 res = sock_get_timestamp(sk, argp);
1709 res = sock_get_timestampns(sk, argp);
1712 case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */
1713 case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */
1714 case SIOCAX25GETUID: {
1715 struct sockaddr_ax25 sax25;
1716 if (copy_from_user(&sax25, argp, sizeof(sax25))) {
1720 res = ax25_uid_ioctl(cmd, &sax25);
1724 case SIOCAX25NOUID: { /* Set the default policy (default/bar) */
1726 if (!capable(CAP_NET_ADMIN)) {
1730 if (get_user(amount, (long __user *)argp)) {
1734 if (amount > AX25_NOUID_BLOCK) {
1738 ax25_uid_policy = amount;
1746 if (!capable(CAP_NET_ADMIN)) {
1750 res = ax25_rt_ioctl(cmd, argp);
1753 case SIOCAX25CTLCON:
1754 if (!capable(CAP_NET_ADMIN)) {
1758 res = ax25_ctl_ioctl(cmd, argp);
1761 case SIOCAX25GETINFO:
1762 case SIOCAX25GETINFOOLD: {
1763 ax25_cb *ax25 = ax25_sk(sk);
1764 struct ax25_info_struct ax25_info;
1766 ax25_info.t1 = ax25->t1 / HZ;
1767 ax25_info.t2 = ax25->t2 / HZ;
1768 ax25_info.t3 = ax25->t3 / HZ;
1769 ax25_info.idle = ax25->idle / (60 * HZ);
1770 ax25_info.n2 = ax25->n2;
1771 ax25_info.t1timer = ax25_display_timer(&ax25->t1timer) / HZ;
1772 ax25_info.t2timer = ax25_display_timer(&ax25->t2timer) / HZ;
1773 ax25_info.t3timer = ax25_display_timer(&ax25->t3timer) / HZ;
1774 ax25_info.idletimer = ax25_display_timer(&ax25->idletimer) / (60 * HZ);
1775 ax25_info.n2count = ax25->n2count;
1776 ax25_info.state = ax25->state;
1777 ax25_info.rcv_q = atomic_read(&sk->sk_rmem_alloc);
1778 ax25_info.snd_q = atomic_read(&sk->sk_wmem_alloc);
1779 ax25_info.vs = ax25->vs;
1780 ax25_info.vr = ax25->vr;
1781 ax25_info.va = ax25->va;
1782 ax25_info.vs_max = ax25->vs; /* reserved */
1783 ax25_info.paclen = ax25->paclen;
1784 ax25_info.window = ax25->window;
1786 /* old structure? */
1787 if (cmd == SIOCAX25GETINFOOLD) {
1788 static int warned = 0;
1790 printk(KERN_INFO "%s uses old SIOCAX25GETINFO\n",
1795 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct_deprecated))) {
1800 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct))) {
1809 case SIOCAX25ADDFWD:
1810 case SIOCAX25DELFWD: {
1811 struct ax25_fwd_struct ax25_fwd;
1812 if (!capable(CAP_NET_ADMIN)) {
1816 if (copy_from_user(&ax25_fwd, argp, sizeof(ax25_fwd))) {
1820 res = ax25_fwd_ioctl(cmd, &ax25_fwd);
1826 case SIOCGIFDSTADDR:
1827 case SIOCSIFDSTADDR:
1828 case SIOCGIFBRDADDR:
1829 case SIOCSIFBRDADDR:
1830 case SIOCGIFNETMASK:
1831 case SIOCSIFNETMASK:
1846 #ifdef CONFIG_PROC_FS
1848 static void *ax25_info_start(struct seq_file *seq, loff_t *pos)
1850 struct ax25_cb *ax25;
1851 struct hlist_node *node;
1854 spin_lock_bh(&ax25_list_lock);
1855 ax25_for_each(ax25, node, &ax25_list) {
1863 static void *ax25_info_next(struct seq_file *seq, void *v, loff_t *pos)
1867 return hlist_entry( ((struct ax25_cb *)v)->ax25_node.next,
1868 struct ax25_cb, ax25_node);
1871 static void ax25_info_stop(struct seq_file *seq, void *v)
1873 spin_unlock_bh(&ax25_list_lock);
1876 static int ax25_info_show(struct seq_file *seq, void *v)
1885 * 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 seq_printf(seq, "%8.8lx %s %s%s ",
1890 ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
1891 ax2asc(buf, &ax25->source_addr),
1892 ax25->iamdigi? "*":"");
1893 seq_printf(seq, "%s", ax2asc(buf, &ax25->dest_addr));
1895 for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
1896 seq_printf(seq, ",%s%s",
1897 ax2asc(buf, &ax25->digipeat->calls[k]),
1898 ax25->digipeat->repeated[k]? "*":"");
1901 seq_printf(seq, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
1903 ax25->vs, ax25->vr, ax25->va,
1904 ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
1905 ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
1906 ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
1907 ax25_display_timer(&ax25->idletimer) / (60 * HZ),
1908 ax25->idle / (60 * HZ),
1909 ax25->n2count, ax25->n2,
1914 if (ax25->sk != NULL) {
1915 bh_lock_sock(ax25->sk);
1916 seq_printf(seq," %d %d %ld\n",
1917 atomic_read(&ax25->sk->sk_wmem_alloc),
1918 atomic_read(&ax25->sk->sk_rmem_alloc),
1919 ax25->sk->sk_socket != NULL ? SOCK_INODE(ax25->sk->sk_socket)->i_ino : 0L);
1920 bh_unlock_sock(ax25->sk);
1922 seq_puts(seq, " * * *\n");
1927 static const struct seq_operations ax25_info_seqops = {
1928 .start = ax25_info_start,
1929 .next = ax25_info_next,
1930 .stop = ax25_info_stop,
1931 .show = ax25_info_show,
1934 static int ax25_info_open(struct inode *inode, struct file *file)
1936 return seq_open(file, &ax25_info_seqops);
1939 static const struct file_operations ax25_info_fops = {
1940 .owner = THIS_MODULE,
1941 .open = ax25_info_open,
1943 .llseek = seq_lseek,
1944 .release = seq_release,
1949 static struct net_proto_family ax25_family_ops = {
1951 .create = ax25_create,
1952 .owner = THIS_MODULE,
1955 static const struct proto_ops ax25_proto_ops = {
1957 .owner = THIS_MODULE,
1958 .release = ax25_release,
1960 .connect = ax25_connect,
1961 .socketpair = sock_no_socketpair,
1962 .accept = ax25_accept,
1963 .getname = ax25_getname,
1964 .poll = datagram_poll,
1965 .ioctl = ax25_ioctl,
1966 .listen = ax25_listen,
1967 .shutdown = ax25_shutdown,
1968 .setsockopt = ax25_setsockopt,
1969 .getsockopt = ax25_getsockopt,
1970 .sendmsg = ax25_sendmsg,
1971 .recvmsg = ax25_recvmsg,
1972 .mmap = sock_no_mmap,
1973 .sendpage = sock_no_sendpage,
1977 * Called by socket.c on kernel start up
1979 static struct packet_type ax25_packet_type = {
1980 .type = __constant_htons(ETH_P_AX25),
1981 .dev = NULL, /* All devices */
1982 .func = ax25_kiss_rcv,
1985 static struct notifier_block ax25_dev_notifier = {
1986 .notifier_call =ax25_device_event,
1989 static int __init ax25_init(void)
1991 int rc = proto_register(&ax25_proto, 0);
1996 sock_register(&ax25_family_ops);
1997 dev_add_pack(&ax25_packet_type);
1998 register_netdevice_notifier(&ax25_dev_notifier);
1999 ax25_register_sysctl();
2001 proc_net_fops_create("ax25_route", S_IRUGO, &ax25_route_fops);
2002 proc_net_fops_create("ax25", S_IRUGO, &ax25_info_fops);
2003 proc_net_fops_create("ax25_calls", S_IRUGO, &ax25_uid_fops);
2007 module_init(ax25_init);
2010 MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
2011 MODULE_DESCRIPTION("The amateur radio AX.25 link layer protocol");
2012 MODULE_LICENSE("GPL");
2013 MODULE_ALIAS_NETPROTO(PF_AX25);
2015 static void __exit ax25_exit(void)
2017 proc_net_remove("ax25_route");
2018 proc_net_remove("ax25");
2019 proc_net_remove("ax25_calls");
2024 ax25_unregister_sysctl();
2025 unregister_netdevice_notifier(&ax25_dev_notifier);
2027 dev_remove_pack(&ax25_packet_type);
2029 sock_unregister(PF_AX25);
2030 proto_unregister(&ax25_proto);
2032 module_exit(ax25_exit);