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/capability.h>
18 #include <linux/module.h>
19 #include <linux/errno.h>
20 #include <linux/types.h>
21 #include <linux/socket.h>
23 #include <linux/kernel.h>
24 #include <linux/sched.h>
25 #include <linux/timer.h>
26 #include <linux/string.h>
27 #include <linux/smp_lock.h>
28 #include <linux/sockios.h>
29 #include <linux/net.h>
31 #include <linux/inet.h>
32 #include <linux/netdevice.h>
33 #include <linux/if_arp.h>
34 #include <linux/skbuff.h>
36 #include <asm/uaccess.h>
37 #include <asm/system.h>
38 #include <linux/fcntl.h>
39 #include <linux/termios.h> /* For TIOCINQ/OUTQ */
41 #include <linux/interrupt.h>
42 #include <linux/notifier.h>
43 #include <linux/proc_fs.h>
44 #include <linux/stat.h>
45 #include <linux/netfilter.h>
46 #include <linux/sysctl.h>
47 #include <linux/init.h>
48 #include <linux/spinlock.h>
49 #include <net/tcp_states.h>
55 HLIST_HEAD(ax25_list
);
56 DEFINE_SPINLOCK(ax25_list_lock
);
58 static const struct proto_ops ax25_proto_ops
;
60 static void ax25_free_sock(struct sock
*sk
)
62 ax25_cb_put(ax25_sk(sk
));
66 * Socket removal during an interrupt is now safe.
68 static void ax25_cb_del(ax25_cb
*ax25
)
70 if (!hlist_unhashed(&ax25
->ax25_node
)) {
71 spin_lock_bh(&ax25_list_lock
);
72 hlist_del_init(&ax25
->ax25_node
);
73 spin_unlock_bh(&ax25_list_lock
);
79 * Kill all bound sockets on a dropped device.
81 static void ax25_kill_by_device(struct net_device
*dev
)
85 struct hlist_node
*node
;
87 if ((ax25_dev
= ax25_dev_ax25dev(dev
)) == NULL
)
90 spin_lock_bh(&ax25_list_lock
);
91 ax25_for_each(s
, node
, &ax25_list
) {
92 if (s
->ax25_dev
== ax25_dev
) {
94 ax25_disconnect(s
, ENETUNREACH
);
97 spin_unlock_bh(&ax25_list_lock
);
101 * Handle device status changes.
103 static int ax25_device_event(struct notifier_block
*this, unsigned long event
,
106 struct net_device
*dev
= (struct net_device
*)ptr
;
108 /* Reject non AX.25 devices */
109 if (dev
->type
!= ARPHRD_AX25
)
114 ax25_dev_device_up(dev
);
117 ax25_kill_by_device(dev
);
118 ax25_rt_device_down(dev
);
119 ax25_dev_device_down(dev
);
129 * Add a socket to the bound sockets list.
131 void ax25_cb_add(ax25_cb
*ax25
)
133 spin_lock_bh(&ax25_list_lock
);
135 hlist_add_head(&ax25
->ax25_node
, &ax25_list
);
136 spin_unlock_bh(&ax25_list_lock
);
140 * Find a socket that wants to accept the SABM we have just
143 struct sock
*ax25_find_listener(ax25_address
*addr
, int digi
,
144 struct net_device
*dev
, int type
)
147 struct hlist_node
*node
;
149 spin_lock_bh(&ax25_list_lock
);
150 ax25_for_each(s
, node
, &ax25_list
) {
151 if ((s
->iamdigi
&& !digi
) || (!s
->iamdigi
&& digi
))
153 if (s
->sk
&& !ax25cmp(&s
->source_addr
, addr
) &&
154 s
->sk
->sk_type
== type
&& s
->sk
->sk_state
== TCP_LISTEN
) {
155 /* If device is null we match any device */
156 if (s
->ax25_dev
== NULL
|| s
->ax25_dev
->dev
== dev
) {
158 spin_unlock_bh(&ax25_list_lock
);
163 spin_unlock_bh(&ax25_list_lock
);
169 * Find an AX.25 socket given both ends.
171 struct sock
*ax25_get_socket(ax25_address
*my_addr
, ax25_address
*dest_addr
,
174 struct sock
*sk
= NULL
;
176 struct hlist_node
*node
;
178 spin_lock_bh(&ax25_list_lock
);
179 ax25_for_each(s
, node
, &ax25_list
) {
180 if (s
->sk
&& !ax25cmp(&s
->source_addr
, my_addr
) &&
181 !ax25cmp(&s
->dest_addr
, dest_addr
) &&
182 s
->sk
->sk_type
== type
) {
189 spin_unlock_bh(&ax25_list_lock
);
195 * Find an AX.25 control block given both ends. It will only pick up
196 * floating AX.25 control blocks or non Raw socket bound control blocks.
198 ax25_cb
*ax25_find_cb(ax25_address
*src_addr
, ax25_address
*dest_addr
,
199 ax25_digi
*digi
, struct net_device
*dev
)
202 struct hlist_node
*node
;
204 spin_lock_bh(&ax25_list_lock
);
205 ax25_for_each(s
, node
, &ax25_list
) {
206 if (s
->sk
&& s
->sk
->sk_type
!= SOCK_SEQPACKET
)
208 if (s
->ax25_dev
== NULL
)
210 if (ax25cmp(&s
->source_addr
, src_addr
) == 0 && ax25cmp(&s
->dest_addr
, dest_addr
) == 0 && s
->ax25_dev
->dev
== dev
) {
211 if (digi
!= NULL
&& digi
->ndigi
!= 0) {
212 if (s
->digipeat
== NULL
)
214 if (ax25digicmp(s
->digipeat
, digi
) != 0)
217 if (s
->digipeat
!= NULL
&& s
->digipeat
->ndigi
!= 0)
221 spin_unlock_bh(&ax25_list_lock
);
226 spin_unlock_bh(&ax25_list_lock
);
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_bh(&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_bh(&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
;
428 * Fill in a created AX.25 created control block with the default
429 * values for a particular device.
431 void ax25_fillin_cb(ax25_cb
*ax25
, ax25_dev
*ax25_dev
)
433 ax25
->ax25_dev
= ax25_dev
;
435 if (ax25
->ax25_dev
!= NULL
) {
436 ax25
->rtt
= ax25_dev
->values
[AX25_VALUES_T1
] / 2;
437 ax25
->t1
= ax25_dev
->values
[AX25_VALUES_T1
];
438 ax25
->t2
= ax25_dev
->values
[AX25_VALUES_T2
];
439 ax25
->t3
= ax25_dev
->values
[AX25_VALUES_T3
];
440 ax25
->n2
= ax25_dev
->values
[AX25_VALUES_N2
];
441 ax25
->paclen
= ax25_dev
->values
[AX25_VALUES_PACLEN
];
442 ax25
->idle
= ax25_dev
->values
[AX25_VALUES_IDLE
];
443 ax25
->backoff
= ax25_dev
->values
[AX25_VALUES_BACKOFF
];
445 if (ax25_dev
->values
[AX25_VALUES_AXDEFMODE
]) {
446 ax25
->modulus
= AX25_EMODULUS
;
447 ax25
->window
= ax25_dev
->values
[AX25_VALUES_EWINDOW
];
449 ax25
->modulus
= AX25_MODULUS
;
450 ax25
->window
= ax25_dev
->values
[AX25_VALUES_WINDOW
];
453 ax25
->rtt
= AX25_DEF_T1
/ 2;
454 ax25
->t1
= AX25_DEF_T1
;
455 ax25
->t2
= AX25_DEF_T2
;
456 ax25
->t3
= AX25_DEF_T3
;
457 ax25
->n2
= AX25_DEF_N2
;
458 ax25
->paclen
= AX25_DEF_PACLEN
;
459 ax25
->idle
= AX25_DEF_IDLE
;
460 ax25
->backoff
= AX25_DEF_BACKOFF
;
462 if (AX25_DEF_AXDEFMODE
) {
463 ax25
->modulus
= AX25_EMODULUS
;
464 ax25
->window
= AX25_DEF_EWINDOW
;
466 ax25
->modulus
= AX25_MODULUS
;
467 ax25
->window
= AX25_DEF_WINDOW
;
473 * Create an empty AX.25 control block.
475 ax25_cb
*ax25_create_cb(void)
479 if ((ax25
= kmalloc(sizeof(*ax25
), GFP_ATOMIC
)) == NULL
)
482 memset(ax25
, 0x00, sizeof(*ax25
));
483 atomic_set(&ax25
->refcount
, 1);
485 skb_queue_head_init(&ax25
->write_queue
);
486 skb_queue_head_init(&ax25
->frag_queue
);
487 skb_queue_head_init(&ax25
->ack_queue
);
488 skb_queue_head_init(&ax25
->reseq_queue
);
490 init_timer(&ax25
->timer
);
491 init_timer(&ax25
->t1timer
);
492 init_timer(&ax25
->t2timer
);
493 init_timer(&ax25
->t3timer
);
494 init_timer(&ax25
->idletimer
);
496 ax25_fillin_cb(ax25
, NULL
);
498 ax25
->state
= AX25_STATE_0
;
504 * Handling for system calls applied via the various interfaces to an
508 static int ax25_setsockopt(struct socket
*sock
, int level
, int optname
,
509 char __user
*optval
, int optlen
)
511 struct sock
*sk
= sock
->sk
;
513 struct net_device
*dev
;
514 char devname
[IFNAMSIZ
];
517 if (level
!= SOL_AX25
)
520 if (optlen
< sizeof(int))
523 if (get_user(opt
, (int __user
*)optval
))
531 if (ax25
->modulus
== AX25_MODULUS
) {
532 if (opt
< 1 || opt
> 7) {
537 if (opt
< 1 || opt
> 63) {
550 ax25
->rtt
= (opt
* HZ
) / 2;
563 if (opt
< 1 || opt
> 31) {
583 ax25
->idle
= opt
* 60 * HZ
;
587 if (opt
< 0 || opt
> 2) {
595 ax25
->modulus
= opt
? AX25_EMODULUS
: AX25_MODULUS
;
599 ax25
->pidincl
= opt
? 1 : 0;
603 ax25
->iamdigi
= opt
? 1 : 0;
607 if (opt
< 16 || opt
> 65535) {
614 case SO_BINDTODEVICE
:
615 if (optlen
> IFNAMSIZ
)
617 if (copy_from_user(devname
, optval
, optlen
)) {
622 dev
= dev_get_by_name(devname
);
628 if (sk
->sk_type
== SOCK_SEQPACKET
&&
629 (sock
->state
!= SS_UNCONNECTED
||
630 sk
->sk_state
== TCP_LISTEN
)) {
631 res
= -EADDRNOTAVAIL
;
636 ax25
->ax25_dev
= ax25_dev_ax25dev(dev
);
637 ax25_fillin_cb(ax25
, ax25
->ax25_dev
);
648 static int ax25_getsockopt(struct socket
*sock
, int level
, int optname
,
649 char __user
*optval
, int __user
*optlen
)
651 struct sock
*sk
= sock
->sk
;
653 struct ax25_dev
*ax25_dev
;
654 char devname
[IFNAMSIZ
];
659 if (level
!= SOL_AX25
)
662 if (get_user(maxlen
, optlen
))
668 valptr
= (void *) &val
;
669 length
= min_t(unsigned int, maxlen
, sizeof(int));
696 val
= ax25
->idle
/ (60 * HZ
);
704 val
= (ax25
->modulus
== AX25_EMODULUS
);
719 case SO_BINDTODEVICE
:
720 ax25_dev
= ax25
->ax25_dev
;
722 if (ax25_dev
!= NULL
&& ax25_dev
->dev
!= NULL
) {
723 strlcpy(devname
, ax25_dev
->dev
->name
, sizeof(devname
));
724 length
= strlen(devname
) + 1;
730 valptr
= (void *) devname
;
739 if (put_user(length
, optlen
))
742 return copy_to_user(optval
, valptr
, length
) ? -EFAULT
: 0;
745 static int ax25_listen(struct socket
*sock
, int backlog
)
747 struct sock
*sk
= sock
->sk
;
751 if (sk
->sk_type
== SOCK_SEQPACKET
&& sk
->sk_state
!= TCP_LISTEN
) {
752 sk
->sk_max_ack_backlog
= backlog
;
753 sk
->sk_state
= TCP_LISTEN
;
765 * XXX: when creating ax25_sock we should update the .obj_size setting
768 static struct proto ax25_proto
= {
770 .owner
= THIS_MODULE
,
771 .obj_size
= sizeof(struct sock
),
774 static int ax25_create(struct socket
*sock
, int protocol
)
779 switch (sock
->type
) {
781 if (protocol
== 0 || protocol
== PF_AX25
)
782 protocol
= AX25_P_TEXT
;
788 case PF_AX25
: /* For CLX */
789 protocol
= AX25_P_TEXT
;
802 return -ESOCKTNOSUPPORT
;
803 #ifdef CONFIG_NETROM_MODULE
805 if (ax25_protocol_is_registered(AX25_P_NETROM
))
806 return -ESOCKTNOSUPPORT
;
808 #ifdef CONFIG_ROSE_MODULE
810 if (ax25_protocol_is_registered(AX25_P_ROSE
))
811 return -ESOCKTNOSUPPORT
;
821 return -ESOCKTNOSUPPORT
;
824 if ((sk
= sk_alloc(PF_AX25
, GFP_ATOMIC
, &ax25_proto
, 1)) == NULL
)
827 ax25
= sk
->sk_protinfo
= ax25_create_cb();
833 sock_init_data(sock
, sk
);
835 sk
->sk_destruct
= ax25_free_sock
;
836 sock
->ops
= &ax25_proto_ops
;
837 sk
->sk_protocol
= protocol
;
844 struct sock
*ax25_make_new(struct sock
*osk
, struct ax25_dev
*ax25_dev
)
847 ax25_cb
*ax25
, *oax25
;
849 if ((sk
= sk_alloc(PF_AX25
, GFP_ATOMIC
, osk
->sk_prot
, 1)) == NULL
)
852 if ((ax25
= ax25_create_cb()) == NULL
) {
857 switch (osk
->sk_type
) {
868 sock_init_data(NULL
, sk
);
870 sk
->sk_destruct
= ax25_free_sock
;
871 sk
->sk_type
= osk
->sk_type
;
872 sk
->sk_socket
= osk
->sk_socket
;
873 sk
->sk_priority
= osk
->sk_priority
;
874 sk
->sk_protocol
= osk
->sk_protocol
;
875 sk
->sk_rcvbuf
= osk
->sk_rcvbuf
;
876 sk
->sk_sndbuf
= osk
->sk_sndbuf
;
877 sk
->sk_state
= TCP_ESTABLISHED
;
878 sk
->sk_sleep
= osk
->sk_sleep
;
879 sock_copy_flags(sk
, osk
);
881 oax25
= ax25_sk(osk
);
883 ax25
->modulus
= oax25
->modulus
;
884 ax25
->backoff
= oax25
->backoff
;
885 ax25
->pidincl
= oax25
->pidincl
;
886 ax25
->iamdigi
= oax25
->iamdigi
;
887 ax25
->rtt
= oax25
->rtt
;
888 ax25
->t1
= oax25
->t1
;
889 ax25
->t2
= oax25
->t2
;
890 ax25
->t3
= oax25
->t3
;
891 ax25
->n2
= oax25
->n2
;
892 ax25
->idle
= oax25
->idle
;
893 ax25
->paclen
= oax25
->paclen
;
894 ax25
->window
= oax25
->window
;
896 ax25
->ax25_dev
= ax25_dev
;
897 ax25
->source_addr
= oax25
->source_addr
;
899 if (oax25
->digipeat
!= NULL
) {
900 if ((ax25
->digipeat
= kmalloc(sizeof(ax25_digi
), GFP_ATOMIC
)) == NULL
) {
906 memcpy(ax25
->digipeat
, oax25
->digipeat
, sizeof(ax25_digi
));
909 sk
->sk_protinfo
= ax25
;
915 static int ax25_release(struct socket
*sock
)
917 struct sock
*sk
= sock
->sk
;
928 if (sk
->sk_type
== SOCK_SEQPACKET
) {
929 switch (ax25
->state
) {
932 ax25_disconnect(ax25
, 0);
934 ax25_destroy_socket(ax25
);
939 ax25_send_control(ax25
, AX25_DISC
, AX25_POLLON
, AX25_COMMAND
);
941 ax25_disconnect(ax25
, 0);
943 ax25_destroy_socket(ax25
);
948 ax25_clear_queues(ax25
);
951 switch (ax25
->ax25_dev
->values
[AX25_VALUES_PROTOCOL
]) {
952 case AX25_PROTO_STD_SIMPLEX
:
953 case AX25_PROTO_STD_DUPLEX
:
954 ax25_send_control(ax25
,
958 ax25_stop_t2timer(ax25
);
959 ax25_stop_t3timer(ax25
);
960 ax25_stop_idletimer(ax25
);
962 #ifdef CONFIG_AX25_DAMA_SLAVE
963 case AX25_PROTO_DAMA_SLAVE
:
964 ax25_stop_t3timer(ax25
);
965 ax25_stop_idletimer(ax25
);
969 ax25_calculate_t1(ax25
);
970 ax25_start_t1timer(ax25
);
971 ax25
->state
= AX25_STATE_2
;
972 sk
->sk_state
= TCP_CLOSE
;
973 sk
->sk_shutdown
|= SEND_SHUTDOWN
;
974 sk
->sk_state_change(sk
);
975 sock_set_flag(sk
, SOCK_DESTROY
);
982 sk
->sk_state
= TCP_CLOSE
;
983 sk
->sk_shutdown
|= SEND_SHUTDOWN
;
984 sk
->sk_state_change(sk
);
985 ax25_destroy_socket(ax25
);
996 * We support a funny extension here so you can (as root) give any callsign
997 * digipeated via a local address as source. This hack is obsolete now
998 * that we've implemented support for SO_BINDTODEVICE. It is however small
999 * and trivially backward compatible.
1001 static int ax25_bind(struct socket
*sock
, struct sockaddr
*uaddr
, int addr_len
)
1003 struct sock
*sk
= sock
->sk
;
1004 struct full_sockaddr_ax25
*addr
= (struct full_sockaddr_ax25
*)uaddr
;
1005 ax25_dev
*ax25_dev
= NULL
;
1006 ax25_uid_assoc
*user
;
1011 if (addr_len
!= sizeof(struct sockaddr_ax25
) &&
1012 addr_len
!= sizeof(struct full_sockaddr_ax25
)) {
1013 /* support for old structure may go away some time */
1014 if ((addr_len
< sizeof(struct sockaddr_ax25
) + sizeof(ax25_address
) * 6) ||
1015 (addr_len
> sizeof(struct full_sockaddr_ax25
))) {
1019 printk(KERN_WARNING
"ax25_bind(): %s uses old (6 digipeater) socket structure.\n",
1023 if (addr
->fsa_ax25
.sax25_family
!= AF_AX25
)
1026 user
= ax25_findbyuid(current
->euid
);
1031 if (ax25_uid_policy
&& !capable(CAP_NET_ADMIN
))
1034 call
= addr
->fsa_ax25
.sax25_call
;
1040 if (!sock_flag(sk
, SOCK_ZAPPED
)) {
1045 ax25
->source_addr
= call
;
1048 * User already set interface with SO_BINDTODEVICE
1050 if (ax25
->ax25_dev
!= NULL
)
1053 if (addr_len
> sizeof(struct sockaddr_ax25
) && addr
->fsa_ax25
.sax25_ndigis
== 1) {
1054 if (ax25cmp(&addr
->fsa_digipeater
[0], &null_ax25_address
) != 0 &&
1055 (ax25_dev
= ax25_addr_ax25dev(&addr
->fsa_digipeater
[0])) == NULL
) {
1056 err
= -EADDRNOTAVAIL
;
1060 if ((ax25_dev
= ax25_addr_ax25dev(&addr
->fsa_ax25
.sax25_call
)) == NULL
) {
1061 err
= -EADDRNOTAVAIL
;
1066 if (ax25_dev
!= NULL
)
1067 ax25_fillin_cb(ax25
, ax25_dev
);
1071 sock_reset_flag(sk
, SOCK_ZAPPED
);
1080 * FIXME: nonblock behaviour looks like it may have a bug.
1082 static int ax25_connect(struct socket
*sock
, struct sockaddr
*uaddr
,
1083 int addr_len
, int flags
)
1085 struct sock
*sk
= sock
->sk
;
1086 ax25_cb
*ax25
= ax25_sk(sk
), *ax25t
;
1087 struct full_sockaddr_ax25
*fsa
= (struct full_sockaddr_ax25
*)uaddr
;
1088 ax25_digi
*digi
= NULL
;
1089 int ct
= 0, err
= 0;
1092 * some sanity checks. code further down depends on this
1095 if (addr_len
== sizeof(struct sockaddr_ax25
)) {
1096 /* support for this will go away in early 2.5.x */
1097 printk(KERN_WARNING
"ax25_connect(): %s uses obsolete socket structure\n",
1100 else if (addr_len
!= sizeof(struct full_sockaddr_ax25
)) {
1101 /* support for old structure may go away some time */
1102 if ((addr_len
< sizeof(struct sockaddr_ax25
) + sizeof(ax25_address
) * 6) ||
1103 (addr_len
> sizeof(struct full_sockaddr_ax25
))) {
1107 printk(KERN_WARNING
"ax25_connect(): %s uses old (6 digipeater) socket structure.\n",
1111 if (fsa
->fsa_ax25
.sax25_family
!= AF_AX25
)
1116 /* deal with restarts */
1117 if (sock
->state
== SS_CONNECTING
) {
1118 switch (sk
->sk_state
) {
1119 case TCP_SYN_SENT
: /* still trying */
1123 case TCP_ESTABLISHED
: /* connection established */
1124 sock
->state
= SS_CONNECTED
;
1127 case TCP_CLOSE
: /* connection refused */
1128 sock
->state
= SS_UNCONNECTED
;
1129 err
= -ECONNREFUSED
;
1134 if (sk
->sk_state
== TCP_ESTABLISHED
&& sk
->sk_type
== SOCK_SEQPACKET
) {
1135 err
= -EISCONN
; /* No reconnect on a seqpacket socket */
1139 sk
->sk_state
= TCP_CLOSE
;
1140 sock
->state
= SS_UNCONNECTED
;
1142 kfree(ax25
->digipeat
);
1143 ax25
->digipeat
= NULL
;
1146 * Handle digi-peaters to be used.
1148 if (addr_len
> sizeof(struct sockaddr_ax25
) &&
1149 fsa
->fsa_ax25
.sax25_ndigis
!= 0) {
1150 /* Valid number of digipeaters ? */
1151 if (fsa
->fsa_ax25
.sax25_ndigis
< 1 || fsa
->fsa_ax25
.sax25_ndigis
> AX25_MAX_DIGIS
) {
1156 if ((digi
= kmalloc(sizeof(ax25_digi
), GFP_KERNEL
)) == NULL
) {
1161 digi
->ndigi
= fsa
->fsa_ax25
.sax25_ndigis
;
1162 digi
->lastrepeat
= -1;
1164 while (ct
< fsa
->fsa_ax25
.sax25_ndigis
) {
1165 if ((fsa
->fsa_digipeater
[ct
].ax25_call
[6] &
1166 AX25_HBIT
) && ax25
->iamdigi
) {
1167 digi
->repeated
[ct
] = 1;
1168 digi
->lastrepeat
= ct
;
1170 digi
->repeated
[ct
] = 0;
1172 digi
->calls
[ct
] = fsa
->fsa_digipeater
[ct
];
1178 * Must bind first - autobinding in this may or may not work. If
1179 * the socket is already bound, check to see if the device has
1180 * been filled in, error if it hasn't.
1182 if (sock_flag(sk
, SOCK_ZAPPED
)) {
1183 /* check if we can remove this feature. It is broken. */
1184 printk(KERN_WARNING
"ax25_connect(): %s uses autobind, please contact jreuter@yaina.de\n",
1186 if ((err
= ax25_rt_autobind(ax25
, &fsa
->fsa_ax25
.sax25_call
)) < 0) {
1191 ax25_fillin_cb(ax25
, ax25
->ax25_dev
);
1194 if (ax25
->ax25_dev
== NULL
) {
1196 err
= -EHOSTUNREACH
;
1201 if (sk
->sk_type
== SOCK_SEQPACKET
&&
1202 (ax25t
=ax25_find_cb(&ax25
->source_addr
, &fsa
->fsa_ax25
.sax25_call
, digi
,
1203 ax25
->ax25_dev
->dev
))) {
1205 err
= -EADDRINUSE
; /* Already such a connection */
1210 ax25
->dest_addr
= fsa
->fsa_ax25
.sax25_call
;
1211 ax25
->digipeat
= digi
;
1213 /* First the easy one */
1214 if (sk
->sk_type
!= SOCK_SEQPACKET
) {
1215 sock
->state
= SS_CONNECTED
;
1216 sk
->sk_state
= TCP_ESTABLISHED
;
1220 /* Move to connecting socket, ax.25 lapb WAIT_UA.. */
1221 sock
->state
= SS_CONNECTING
;
1222 sk
->sk_state
= TCP_SYN_SENT
;
1224 switch (ax25
->ax25_dev
->values
[AX25_VALUES_PROTOCOL
]) {
1225 case AX25_PROTO_STD_SIMPLEX
:
1226 case AX25_PROTO_STD_DUPLEX
:
1227 ax25_std_establish_data_link(ax25
);
1230 #ifdef CONFIG_AX25_DAMA_SLAVE
1231 case AX25_PROTO_DAMA_SLAVE
:
1232 ax25
->modulus
= AX25_MODULUS
;
1233 ax25
->window
= ax25
->ax25_dev
->values
[AX25_VALUES_WINDOW
];
1234 if (ax25
->ax25_dev
->dama
.slave
)
1235 ax25_ds_establish_data_link(ax25
);
1237 ax25_std_establish_data_link(ax25
);
1242 ax25
->state
= AX25_STATE_1
;
1244 ax25_start_heartbeat(ax25
);
1247 if (sk
->sk_state
!= TCP_ESTABLISHED
&& (flags
& O_NONBLOCK
)) {
1252 if (sk
->sk_state
== TCP_SYN_SENT
) {
1253 struct task_struct
*tsk
= current
;
1254 DECLARE_WAITQUEUE(wait
, tsk
);
1256 add_wait_queue(sk
->sk_sleep
, &wait
);
1258 if (sk
->sk_state
!= TCP_SYN_SENT
)
1260 set_current_state(TASK_INTERRUPTIBLE
);
1262 if (!signal_pending(tsk
)) {
1267 current
->state
= TASK_RUNNING
;
1268 remove_wait_queue(sk
->sk_sleep
, &wait
);
1269 return -ERESTARTSYS
;
1271 current
->state
= TASK_RUNNING
;
1272 remove_wait_queue(sk
->sk_sleep
, &wait
);
1275 if (sk
->sk_state
!= TCP_ESTABLISHED
) {
1276 /* Not in ABM, not in WAIT_UA -> failed */
1277 sock
->state
= SS_UNCONNECTED
;
1278 err
= sock_error(sk
); /* Always set at this point */
1282 sock
->state
= SS_CONNECTED
;
1292 static int ax25_accept(struct socket
*sock
, struct socket
*newsock
, int flags
)
1294 struct task_struct
*tsk
= current
;
1295 DECLARE_WAITQUEUE(wait
, tsk
);
1296 struct sk_buff
*skb
;
1301 if (sock
->state
!= SS_UNCONNECTED
)
1304 if ((sk
= sock
->sk
) == NULL
)
1308 if (sk
->sk_type
!= SOCK_SEQPACKET
) {
1313 if (sk
->sk_state
!= TCP_LISTEN
) {
1319 * The read queue this time is holding sockets ready to use
1320 * hooked into the SABM we saved
1322 add_wait_queue(sk
->sk_sleep
, &wait
);
1324 skb
= skb_dequeue(&sk
->sk_receive_queue
);
1329 current
->state
= TASK_INTERRUPTIBLE
;
1330 if (flags
& O_NONBLOCK
) {
1331 current
->state
= TASK_RUNNING
;
1332 remove_wait_queue(sk
->sk_sleep
, &wait
);
1333 return -EWOULDBLOCK
;
1335 if (!signal_pending(tsk
)) {
1340 current
->state
= TASK_RUNNING
;
1341 remove_wait_queue(sk
->sk_sleep
, &wait
);
1342 return -ERESTARTSYS
;
1344 current
->state
= TASK_RUNNING
;
1345 remove_wait_queue(sk
->sk_sleep
, &wait
);
1348 newsk
->sk_socket
= newsock
;
1349 newsk
->sk_sleep
= &newsock
->wait
;
1351 /* Now attach up the new socket */
1353 sk
->sk_ack_backlog
--;
1354 newsock
->sk
= newsk
;
1355 newsock
->state
= SS_CONNECTED
;
1363 static int ax25_getname(struct socket
*sock
, struct sockaddr
*uaddr
,
1364 int *uaddr_len
, int peer
)
1366 struct full_sockaddr_ax25
*fsa
= (struct full_sockaddr_ax25
*)uaddr
;
1367 struct sock
*sk
= sock
->sk
;
1368 unsigned char ndigi
, i
;
1376 if (sk
->sk_state
!= TCP_ESTABLISHED
) {
1381 fsa
->fsa_ax25
.sax25_family
= AF_AX25
;
1382 fsa
->fsa_ax25
.sax25_call
= ax25
->dest_addr
;
1383 fsa
->fsa_ax25
.sax25_ndigis
= 0;
1385 if (ax25
->digipeat
!= NULL
) {
1386 ndigi
= ax25
->digipeat
->ndigi
;
1387 fsa
->fsa_ax25
.sax25_ndigis
= ndigi
;
1388 for (i
= 0; i
< ndigi
; i
++)
1389 fsa
->fsa_digipeater
[i
] =
1390 ax25
->digipeat
->calls
[i
];
1393 fsa
->fsa_ax25
.sax25_family
= AF_AX25
;
1394 fsa
->fsa_ax25
.sax25_call
= ax25
->source_addr
;
1395 fsa
->fsa_ax25
.sax25_ndigis
= 1;
1396 if (ax25
->ax25_dev
!= NULL
) {
1397 memcpy(&fsa
->fsa_digipeater
[0],
1398 ax25
->ax25_dev
->dev
->dev_addr
, AX25_ADDR_LEN
);
1400 fsa
->fsa_digipeater
[0] = null_ax25_address
;
1403 *uaddr_len
= sizeof (struct full_sockaddr_ax25
);
1411 static int ax25_sendmsg(struct kiocb
*iocb
, struct socket
*sock
,
1412 struct msghdr
*msg
, size_t len
)
1414 struct sockaddr_ax25
*usax
= (struct sockaddr_ax25
*)msg
->msg_name
;
1415 struct sock
*sk
= sock
->sk
;
1416 struct sockaddr_ax25 sax
;
1417 struct sk_buff
*skb
;
1418 ax25_digi dtmp
, *dp
;
1419 unsigned char *asmptr
;
1422 int lv
, err
, addr_len
= msg
->msg_namelen
;
1424 if (msg
->msg_flags
& ~(MSG_DONTWAIT
|MSG_EOR
|MSG_CMSG_COMPAT
))
1430 if (sock_flag(sk
, SOCK_ZAPPED
)) {
1431 err
= -EADDRNOTAVAIL
;
1435 if (sk
->sk_shutdown
& SEND_SHUTDOWN
) {
1436 send_sig(SIGPIPE
, current
, 0);
1441 if (ax25
->ax25_dev
== NULL
) {
1446 if (len
> ax25
->ax25_dev
->dev
->mtu
) {
1452 if (usax
->sax25_family
!= AF_AX25
) {
1457 if (addr_len
== sizeof(struct sockaddr_ax25
)) {
1458 printk(KERN_WARNING
"ax25_sendmsg(): %s uses obsolete socket structure\n",
1461 else if (addr_len
!= sizeof(struct full_sockaddr_ax25
)) {
1462 /* support for old structure may go away some time */
1463 if ((addr_len
< sizeof(struct sockaddr_ax25
) + sizeof(ax25_address
) * 6) ||
1464 (addr_len
> sizeof(struct full_sockaddr_ax25
))) {
1469 printk(KERN_WARNING
"ax25_sendmsg(): %s uses old (6 digipeater) socket structure.\n",
1473 if (addr_len
> sizeof(struct sockaddr_ax25
) && usax
->sax25_ndigis
!= 0) {
1475 struct full_sockaddr_ax25
*fsa
= (struct full_sockaddr_ax25
*)usax
;
1477 /* Valid number of digipeaters ? */
1478 if (usax
->sax25_ndigis
< 1 || usax
->sax25_ndigis
> AX25_MAX_DIGIS
) {
1483 dtmp
.ndigi
= usax
->sax25_ndigis
;
1485 while (ct
< usax
->sax25_ndigis
) {
1486 dtmp
.repeated
[ct
] = 0;
1487 dtmp
.calls
[ct
] = fsa
->fsa_digipeater
[ct
];
1491 dtmp
.lastrepeat
= 0;
1495 if (sk
->sk_type
== SOCK_SEQPACKET
&&
1496 ax25cmp(&ax25
->dest_addr
, &sax
.sax25_call
)) {
1500 if (usax
->sax25_ndigis
== 0)
1506 * FIXME: 1003.1g - if the socket is like this because
1507 * it has become closed (not started closed) and is VC
1508 * we ought to SIGPIPE, EPIPE
1510 if (sk
->sk_state
!= TCP_ESTABLISHED
) {
1514 sax
.sax25_family
= AF_AX25
;
1515 sax
.sax25_call
= ax25
->dest_addr
;
1516 dp
= ax25
->digipeat
;
1519 SOCK_DEBUG(sk
, "AX.25: sendto: Addresses built.\n");
1521 /* Build a packet */
1522 SOCK_DEBUG(sk
, "AX.25: sendto: building packet.\n");
1524 /* Assume the worst case */
1525 size
= len
+ ax25
->ax25_dev
->dev
->hard_header_len
;
1527 skb
= sock_alloc_send_skb(sk
, size
, msg
->msg_flags
&MSG_DONTWAIT
, &err
);
1531 skb_reserve(skb
, size
- len
);
1533 SOCK_DEBUG(sk
, "AX.25: Appending user data\n");
1535 /* User data follows immediately after the AX.25 data */
1536 if (memcpy_fromiovec(skb_put(skb
, len
), msg
->msg_iov
, len
)) {
1542 skb
->nh
.raw
= skb
->data
;
1544 /* Add the PID if one is not supplied by the user in the skb */
1545 if (!ax25
->pidincl
) {
1546 asmptr
= skb_push(skb
, 1);
1547 *asmptr
= sk
->sk_protocol
;
1550 SOCK_DEBUG(sk
, "AX.25: Transmitting buffer\n");
1552 if (sk
->sk_type
== SOCK_SEQPACKET
) {
1553 /* Connected mode sockets go via the LAPB machine */
1554 if (sk
->sk_state
!= TCP_ESTABLISHED
) {
1560 /* Shove it onto the queue and kick */
1561 ax25_output(ax25
, ax25
->paclen
, skb
);
1567 asmptr
= skb_push(skb
, 1 + ax25_addr_size(dp
));
1569 SOCK_DEBUG(sk
, "Building AX.25 Header (dp=%p).\n", dp
);
1572 SOCK_DEBUG(sk
, "Num digipeaters=%d\n", dp
->ndigi
);
1574 /* Build an AX.25 header */
1575 asmptr
+= (lv
= ax25_addr_build(asmptr
, &ax25
->source_addr
,
1576 &sax
.sax25_call
, dp
,
1577 AX25_COMMAND
, AX25_MODULUS
));
1579 SOCK_DEBUG(sk
, "Built header (%d bytes)\n",lv
);
1581 skb
->h
.raw
= asmptr
;
1583 SOCK_DEBUG(sk
, "base=%p pos=%p\n", skb
->data
, asmptr
);
1587 /* Datagram frames go straight out of the door as UI */
1588 ax25_queue_xmit(skb
, ax25
->ax25_dev
->dev
);
1598 static int ax25_recvmsg(struct kiocb
*iocb
, struct socket
*sock
,
1599 struct msghdr
*msg
, size_t size
, int flags
)
1601 struct sock
*sk
= sock
->sk
;
1602 struct sk_buff
*skb
;
1608 * This works for seqpacket too. The receiver has ordered the
1609 * queue for us! We do one quick check first though
1611 if (sk
->sk_type
== SOCK_SEQPACKET
&& sk
->sk_state
!= TCP_ESTABLISHED
) {
1616 /* Now we can treat all alike */
1617 skb
= skb_recv_datagram(sk
, flags
& ~MSG_DONTWAIT
,
1618 flags
& MSG_DONTWAIT
, &err
);
1622 if (!ax25_sk(sk
)->pidincl
)
1623 skb_pull(skb
, 1); /* Remove PID */
1625 skb
->h
.raw
= skb
->data
;
1628 if (copied
> size
) {
1630 msg
->msg_flags
|= MSG_TRUNC
;
1633 skb_copy_datagram_iovec(skb
, 0, msg
->msg_iov
, copied
);
1635 if (msg
->msg_namelen
!= 0) {
1636 struct sockaddr_ax25
*sax
= (struct sockaddr_ax25
*)msg
->msg_name
;
1640 ax25_addr_parse(skb
->mac
.raw
+1, skb
->data
-skb
->mac
.raw
-1, &src
, NULL
, &digi
, NULL
, NULL
);
1642 sax
->sax25_family
= AF_AX25
;
1643 /* We set this correctly, even though we may not let the
1644 application know the digi calls further down (because it
1645 did NOT ask to know them). This could get political... **/
1646 sax
->sax25_ndigis
= digi
.ndigi
;
1647 sax
->sax25_call
= src
;
1649 if (sax
->sax25_ndigis
!= 0) {
1651 struct full_sockaddr_ax25
*fsa
= (struct full_sockaddr_ax25
*)sax
;
1653 for (ct
= 0; ct
< digi
.ndigi
; ct
++)
1654 fsa
->fsa_digipeater
[ct
] = digi
.calls
[ct
];
1656 msg
->msg_namelen
= sizeof(struct full_sockaddr_ax25
);
1659 skb_free_datagram(sk
, skb
);
1668 static int ax25_shutdown(struct socket
*sk
, int how
)
1670 /* FIXME - generate DM and RNR states */
1674 static int ax25_ioctl(struct socket
*sock
, unsigned int cmd
, unsigned long arg
)
1676 struct sock
*sk
= sock
->sk
;
1677 void __user
*argp
= (void __user
*)arg
;
1684 amount
= sk
->sk_sndbuf
- atomic_read(&sk
->sk_wmem_alloc
);
1687 res
= put_user(amount
, (int __user
*)argp
);
1692 struct sk_buff
*skb
;
1694 /* These two are safe on a single CPU system as only user tasks fiddle here */
1695 if ((skb
= skb_peek(&sk
->sk_receive_queue
)) != NULL
)
1697 res
= put_user(amount
, (int __user
*) argp
);
1702 res
= sock_get_timestamp(sk
, argp
);
1705 case SIOCAX25ADDUID
: /* Add a uid to the uid/call map table */
1706 case SIOCAX25DELUID
: /* Delete a uid from the uid/call map table */
1707 case SIOCAX25GETUID
: {
1708 struct sockaddr_ax25 sax25
;
1709 if (copy_from_user(&sax25
, argp
, sizeof(sax25
))) {
1713 res
= ax25_uid_ioctl(cmd
, &sax25
);
1717 case SIOCAX25NOUID
: { /* Set the default policy (default/bar) */
1719 if (!capable(CAP_NET_ADMIN
)) {
1723 if (get_user(amount
, (long __user
*)argp
)) {
1727 if (amount
> AX25_NOUID_BLOCK
) {
1731 ax25_uid_policy
= amount
;
1739 if (!capable(CAP_NET_ADMIN
)) {
1743 res
= ax25_rt_ioctl(cmd
, argp
);
1746 case SIOCAX25CTLCON
:
1747 if (!capable(CAP_NET_ADMIN
)) {
1751 res
= ax25_ctl_ioctl(cmd
, argp
);
1754 case SIOCAX25GETINFO
:
1755 case SIOCAX25GETINFOOLD
: {
1756 ax25_cb
*ax25
= ax25_sk(sk
);
1757 struct ax25_info_struct ax25_info
;
1759 ax25_info
.t1
= ax25
->t1
/ HZ
;
1760 ax25_info
.t2
= ax25
->t2
/ HZ
;
1761 ax25_info
.t3
= ax25
->t3
/ HZ
;
1762 ax25_info
.idle
= ax25
->idle
/ (60 * HZ
);
1763 ax25_info
.n2
= ax25
->n2
;
1764 ax25_info
.t1timer
= ax25_display_timer(&ax25
->t1timer
) / HZ
;
1765 ax25_info
.t2timer
= ax25_display_timer(&ax25
->t2timer
) / HZ
;
1766 ax25_info
.t3timer
= ax25_display_timer(&ax25
->t3timer
) / HZ
;
1767 ax25_info
.idletimer
= ax25_display_timer(&ax25
->idletimer
) / (60 * HZ
);
1768 ax25_info
.n2count
= ax25
->n2count
;
1769 ax25_info
.state
= ax25
->state
;
1770 ax25_info
.rcv_q
= atomic_read(&sk
->sk_rmem_alloc
);
1771 ax25_info
.snd_q
= atomic_read(&sk
->sk_wmem_alloc
);
1772 ax25_info
.vs
= ax25
->vs
;
1773 ax25_info
.vr
= ax25
->vr
;
1774 ax25_info
.va
= ax25
->va
;
1775 ax25_info
.vs_max
= ax25
->vs
; /* reserved */
1776 ax25_info
.paclen
= ax25
->paclen
;
1777 ax25_info
.window
= ax25
->window
;
1779 /* old structure? */
1780 if (cmd
== SIOCAX25GETINFOOLD
) {
1781 static int warned
= 0;
1783 printk(KERN_INFO
"%s uses old SIOCAX25GETINFO\n",
1788 if (copy_to_user(argp
, &ax25_info
, sizeof(struct ax25_info_struct_deprecated
))) {
1793 if (copy_to_user(argp
, &ax25_info
, sizeof(struct ax25_info_struct
))) {
1802 case SIOCAX25ADDFWD
:
1803 case SIOCAX25DELFWD
: {
1804 struct ax25_fwd_struct ax25_fwd
;
1805 if (!capable(CAP_NET_ADMIN
)) {
1809 if (copy_from_user(&ax25_fwd
, argp
, sizeof(ax25_fwd
))) {
1813 res
= ax25_fwd_ioctl(cmd
, &ax25_fwd
);
1819 case SIOCGIFDSTADDR
:
1820 case SIOCSIFDSTADDR
:
1821 case SIOCGIFBRDADDR
:
1822 case SIOCSIFBRDADDR
:
1823 case SIOCGIFNETMASK
:
1824 case SIOCSIFNETMASK
:
1839 #ifdef CONFIG_PROC_FS
1841 static void *ax25_info_start(struct seq_file
*seq
, loff_t
*pos
)
1843 struct ax25_cb
*ax25
;
1844 struct hlist_node
*node
;
1847 spin_lock_bh(&ax25_list_lock
);
1848 ax25_for_each(ax25
, node
, &ax25_list
) {
1856 static void *ax25_info_next(struct seq_file
*seq
, void *v
, loff_t
*pos
)
1860 return hlist_entry( ((struct ax25_cb
*)v
)->ax25_node
.next
,
1861 struct ax25_cb
, ax25_node
);
1864 static void ax25_info_stop(struct seq_file
*seq
, void *v
)
1866 spin_unlock_bh(&ax25_list_lock
);
1869 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(buf
, &ax25
->source_addr
),
1885 ax25
->iamdigi
? "*":"");
1886 seq_printf(seq
, "%s", ax2asc(buf
, &ax25
->dest_addr
));
1888 for (k
=0; (ax25
->digipeat
!= NULL
) && (k
< ax25
->digipeat
->ndigi
); k
++) {
1889 seq_printf(seq
, ",%s%s",
1890 ax2asc(buf
, &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 const 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_hard_header
);
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
);