blob: c83cf84329700219ed4d16710bebcc5a4cb9f2c6 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
6 *
7 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
8 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
9 * Copyright (C) Darryl Miles G7LED (dlm@g7led.demon.co.uk)
10 * Copyright (C) Steven Whitehouse GW7RRM (stevew@acm.org)
11 * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
12 * Copyright (C) Hans-Joachim Hetscher DD8NE (dd8ne@bnv-bamberg.de)
13 * Copyright (C) Hans Alblas PE1AYX (hans@esrac.ele.tue.nl)
14 * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr)
15 */
Randy Dunlap4fc268d2006-01-11 12:17:47 -080016#include <linux/capability.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070017#include <linux/module.h>
18#include <linux/errno.h>
19#include <linux/types.h>
20#include <linux/socket.h>
21#include <linux/in.h>
22#include <linux/kernel.h>
23#include <linux/sched.h>
24#include <linux/timer.h>
25#include <linux/string.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070026#include <linux/sockios.h>
27#include <linux/net.h>
28#include <net/ax25.h>
29#include <linux/inet.h>
30#include <linux/netdevice.h>
31#include <linux/if_arp.h>
32#include <linux/skbuff.h>
33#include <net/sock.h>
34#include <asm/uaccess.h>
35#include <asm/system.h>
36#include <linux/fcntl.h>
37#include <linux/termios.h> /* For TIOCINQ/OUTQ */
38#include <linux/mm.h>
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>
Arnaldo Carvalho de Meloc752f072005-08-09 20:08:28 -070047#include <net/tcp_states.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070048#include <net/ip.h>
49#include <net/arp.h>
50
51
52
53HLIST_HEAD(ax25_list);
54DEFINE_SPINLOCK(ax25_list_lock);
55
Eric Dumazet90ddc4f2005-12-22 12:49:22 -080056static const struct proto_ops ax25_proto_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -070057
58static void ax25_free_sock(struct sock *sk)
59{
60 ax25_cb_put(ax25_sk(sk));
61}
62
63/*
64 * Socket removal during an interrupt is now safe.
65 */
66static void ax25_cb_del(ax25_cb *ax25)
67{
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);
72 ax25_cb_put(ax25);
73 }
74}
75
76/*
77 * Kill all bound sockets on a dropped device.
78 */
79static void ax25_kill_by_device(struct net_device *dev)
80{
81 ax25_dev *ax25_dev;
82 ax25_cb *s;
83 struct hlist_node *node;
84
85 if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
86 return;
87
88 spin_lock_bh(&ax25_list_lock);
89 ax25_for_each(s, node, &ax25_list) {
90 if (s->ax25_dev == ax25_dev) {
91 s->ax25_dev = NULL;
92 ax25_disconnect(s, ENETUNREACH);
93 }
94 }
95 spin_unlock_bh(&ax25_list_lock);
96}
97
98/*
99 * Handle device status changes.
100 */
101static int ax25_device_event(struct notifier_block *this, unsigned long event,
102 void *ptr)
103{
104 struct net_device *dev = (struct net_device *)ptr;
105
106 /* Reject non AX.25 devices */
107 if (dev->type != ARPHRD_AX25)
108 return NOTIFY_DONE;
109
110 switch (event) {
111 case NETDEV_UP:
112 ax25_dev_device_up(dev);
113 break;
114 case NETDEV_DOWN:
115 ax25_kill_by_device(dev);
116 ax25_rt_device_down(dev);
117 ax25_dev_device_down(dev);
118 break;
119 default:
120 break;
121 }
122
123 return NOTIFY_DONE;
124}
125
126/*
127 * Add a socket to the bound sockets list.
128 */
129void ax25_cb_add(ax25_cb *ax25)
130{
131 spin_lock_bh(&ax25_list_lock);
132 ax25_cb_hold(ax25);
133 hlist_add_head(&ax25->ax25_node, &ax25_list);
134 spin_unlock_bh(&ax25_list_lock);
135}
136
137/*
138 * Find a socket that wants to accept the SABM we have just
139 * received.
140 */
141struct sock *ax25_find_listener(ax25_address *addr, int digi,
142 struct net_device *dev, int type)
143{
144 ax25_cb *s;
145 struct hlist_node *node;
146
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700147 spin_lock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148 ax25_for_each(s, node, &ax25_list) {
149 if ((s->iamdigi && !digi) || (!s->iamdigi && digi))
150 continue;
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) {
155 sock_hold(s->sk);
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700156 spin_unlock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700157 return s->sk;
158 }
159 }
160 }
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700161 spin_unlock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700162
163 return NULL;
164}
165
166/*
167 * Find an AX.25 socket given both ends.
168 */
169struct sock *ax25_get_socket(ax25_address *my_addr, ax25_address *dest_addr,
170 int type)
171{
172 struct sock *sk = NULL;
173 ax25_cb *s;
174 struct hlist_node *node;
175
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700176 spin_lock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 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) {
181 sk = s->sk;
182 sock_hold(sk);
183 break;
184 }
185 }
186
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700187 spin_unlock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188
189 return sk;
190}
191
192/*
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.
195 */
196ax25_cb *ax25_find_cb(ax25_address *src_addr, ax25_address *dest_addr,
197 ax25_digi *digi, struct net_device *dev)
198{
199 ax25_cb *s;
200 struct hlist_node *node;
201
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)
205 continue;
206 if (s->ax25_dev == NULL)
207 continue;
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)
211 continue;
212 if (ax25digicmp(s->digipeat, digi) != 0)
213 continue;
214 } else {
215 if (s->digipeat != NULL && s->digipeat->ndigi != 0)
216 continue;
217 }
218 ax25_cb_hold(s);
219 spin_unlock_bh(&ax25_list_lock);
220
221 return s;
222 }
223 }
224 spin_unlock_bh(&ax25_list_lock);
225
226 return NULL;
227}
228
Ralf Baechle70868ea2006-05-03 23:25:17 -0700229EXPORT_SYMBOL(ax25_find_cb);
230
Linus Torvalds1da177e2005-04-16 15:20:36 -0700231void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto)
232{
233 ax25_cb *s;
234 struct sk_buff *copy;
235 struct hlist_node *node;
236
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700237 spin_lock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238 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)
245 continue;
246 if (sock_queue_rcv_skb(s->sk, copy) != 0)
247 kfree_skb(copy);
248 }
249 }
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700250 spin_unlock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251}
252
253/*
254 * Deferred destroy.
255 */
256void ax25_destroy_socket(ax25_cb *);
257
258/*
259 * Handler for deferred kills.
260 */
261static void ax25_destroy_timer(unsigned long data)
262{
263 ax25_cb *ax25=(ax25_cb *)data;
264 struct sock *sk;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900265
Linus Torvalds1da177e2005-04-16 15:20:36 -0700266 sk=ax25->sk;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900267
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268 bh_lock_sock(sk);
269 sock_hold(sk);
270 ax25_destroy_socket(ax25);
271 bh_unlock_sock(sk);
272 sock_put(sk);
273}
274
275/*
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.
280 */
281void ax25_destroy_socket(ax25_cb *ax25)
282{
283 struct sk_buff *skb;
284
285 ax25_cb_del(ax25);
286
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);
292
293 ax25_clear_queues(ax25); /* Flush the queues */
294
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);
300
301 /* Queue the unaccepted socket for death */
302 sock_orphan(skb->sk);
303
304 ax25_start_heartbeat(sax25);
305 sax25->state = AX25_STATE_0;
306 }
307
308 kfree_skb(skb);
309 }
310 skb_queue_purge(&ax25->sk->sk_write_queue);
311 }
312
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);
322 } else {
323 struct sock *sk=ax25->sk;
324 ax25->sk=NULL;
325 sock_put(sk);
326 }
327 } else {
328 ax25_cb_put(ax25);
329 }
330}
331
332/*
333 * dl1bke 960311: set parameters for existing AX.25 connections,
334 * includes a KILL command to abort any connection.
335 * VERY useful for debugging ;-)
336 */
337static int ax25_ctl_ioctl(const unsigned int cmd, void __user *arg)
338{
339 struct ax25_ctl_struct ax25_ctl;
340 ax25_digi digi;
341 ax25_dev *ax25_dev;
342 ax25_cb *ax25;
343 unsigned int k;
344
345 if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
346 return -EFAULT;
347
348 if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
349 return -ENODEV;
350
351 if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
352 return -EINVAL;
353
354 digi.ndigi = ax25_ctl.digi_count;
355 for (k = 0; k < digi.ndigi; k++)
356 digi.calls[k] = ax25_ctl.digi_addr[k];
357
358 if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
359 return -ENOTCONN;
360
361 switch (ax25_ctl.cmd) {
362 case AX25_KILL:
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)
366 ax25_dama_off(ax25);
367#endif
368 ax25_disconnect(ax25, ENETRESET);
369 break;
370
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900371 case AX25_WINDOW:
372 if (ax25->modulus == AX25_MODULUS) {
373 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
374 return -EINVAL;
375 } else {
376 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
377 return -EINVAL;
378 }
379 ax25->window = ax25_ctl.arg;
380 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900382 case AX25_T1:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383 if (ax25_ctl.arg < 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384 return -EINVAL;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900385 ax25->rtt = (ax25_ctl.arg * HZ) / 2;
386 ax25->t1 = ax25_ctl.arg * HZ;
387 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900389 case AX25_T2:
390 if (ax25_ctl.arg < 1)
391 return -EINVAL;
392 ax25->t2 = ax25_ctl.arg * HZ;
393 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900395 case AX25_N2:
396 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
397 return -EINVAL;
398 ax25->n2count = 0;
399 ax25->n2 = ax25_ctl.arg;
400 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900402 case AX25_T3:
403 if (ax25_ctl.arg < 0)
404 return -EINVAL;
405 ax25->t3 = ax25_ctl.arg * HZ;
406 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900408 case AX25_IDLE:
409 if (ax25_ctl.arg < 0)
410 return -EINVAL;
411 ax25->idle = ax25_ctl.arg * 60 * HZ;
412 break;
413
414 case AX25_PACLEN:
415 if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
416 return -EINVAL;
417 ax25->paclen = ax25_ctl.arg;
418 break;
419
420 default:
421 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422 }
423
424 return 0;
425}
426
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700427static void ax25_fillin_cb_from_dev(ax25_cb *ax25, ax25_dev *ax25_dev)
428{
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];
437
438 if (ax25_dev->values[AX25_VALUES_AXDEFMODE]) {
439 ax25->modulus = AX25_EMODULUS;
440 ax25->window = ax25_dev->values[AX25_VALUES_EWINDOW];
441 } else {
442 ax25->modulus = AX25_MODULUS;
443 ax25->window = ax25_dev->values[AX25_VALUES_WINDOW];
444 }
445}
446
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447/*
448 * Fill in a created AX.25 created control block with the default
449 * values for a particular device.
450 */
451void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
452{
453 ax25->ax25_dev = ax25_dev;
454
455 if (ax25->ax25_dev != NULL) {
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700456 ax25_fillin_cb_from_dev(ax25, ax25_dev);
457 return;
458 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700460 /*
461 * No device, use kernel / AX.25 spec default values
462 */
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;
471
472 if (AX25_DEF_AXDEFMODE) {
473 ax25->modulus = AX25_EMODULUS;
474 ax25->window = AX25_DEF_EWINDOW;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475 } else {
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700476 ax25->modulus = AX25_MODULUS;
477 ax25->window = AX25_DEF_WINDOW;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700478 }
479}
480
481/*
482 * Create an empty AX.25 control block.
483 */
484ax25_cb *ax25_create_cb(void)
485{
486 ax25_cb *ax25;
487
Ralf Baechle1b30dd32006-07-09 12:14:22 -0700488 if ((ax25 = kzalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489 return NULL;
490
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491 atomic_set(&ax25->refcount, 1);
492
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);
497
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);
503
504 ax25_fillin_cb(ax25, NULL);
505
506 ax25->state = AX25_STATE_0;
507
508 return ax25;
509}
510
511/*
512 * Handling for system calls applied via the various interfaces to an
513 * AX25 socket object
514 */
515
516static int ax25_setsockopt(struct socket *sock, int level, int optname,
517 char __user *optval, int optlen)
518{
519 struct sock *sk = sock->sk;
520 ax25_cb *ax25;
521 struct net_device *dev;
522 char devname[IFNAMSIZ];
523 int opt, res = 0;
524
525 if (level != SOL_AX25)
526 return -ENOPROTOOPT;
527
528 if (optlen < sizeof(int))
529 return -EINVAL;
530
531 if (get_user(opt, (int __user *)optval))
532 return -EFAULT;
533
534 lock_sock(sk);
535 ax25 = ax25_sk(sk);
536
537 switch (optname) {
538 case AX25_WINDOW:
539 if (ax25->modulus == AX25_MODULUS) {
540 if (opt < 1 || opt > 7) {
541 res = -EINVAL;
542 break;
543 }
544 } else {
545 if (opt < 1 || opt > 63) {
546 res = -EINVAL;
547 break;
548 }
549 }
550 ax25->window = opt;
551 break;
552
553 case AX25_T1:
554 if (opt < 1) {
555 res = -EINVAL;
556 break;
557 }
558 ax25->rtt = (opt * HZ) / 2;
559 ax25->t1 = opt * HZ;
560 break;
561
562 case AX25_T2:
563 if (opt < 1) {
564 res = -EINVAL;
565 break;
566 }
567 ax25->t2 = opt * HZ;
568 break;
569
570 case AX25_N2:
571 if (opt < 1 || opt > 31) {
572 res = -EINVAL;
573 break;
574 }
575 ax25->n2 = opt;
576 break;
577
578 case AX25_T3:
579 if (opt < 1) {
580 res = -EINVAL;
581 break;
582 }
583 ax25->t3 = opt * HZ;
584 break;
585
586 case AX25_IDLE:
587 if (opt < 0) {
588 res = -EINVAL;
589 break;
590 }
591 ax25->idle = opt * 60 * HZ;
592 break;
593
594 case AX25_BACKOFF:
595 if (opt < 0 || opt > 2) {
596 res = -EINVAL;
597 break;
598 }
599 ax25->backoff = opt;
600 break;
601
602 case AX25_EXTSEQ:
603 ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
604 break;
605
606 case AX25_PIDINCL:
607 ax25->pidincl = opt ? 1 : 0;
608 break;
609
610 case AX25_IAMDIGI:
611 ax25->iamdigi = opt ? 1 : 0;
612 break;
613
614 case AX25_PACLEN:
615 if (opt < 16 || opt > 65535) {
616 res = -EINVAL;
617 break;
618 }
619 ax25->paclen = opt;
620 break;
621
622 case SO_BINDTODEVICE:
623 if (optlen > IFNAMSIZ)
624 optlen=IFNAMSIZ;
625 if (copy_from_user(devname, optval, optlen)) {
626 res = -EFAULT;
627 break;
628 }
629
630 dev = dev_get_by_name(devname);
631 if (dev == NULL) {
632 res = -ENODEV;
633 break;
634 }
635
636 if (sk->sk_type == SOCK_SEQPACKET &&
637 (sock->state != SS_UNCONNECTED ||
638 sk->sk_state == TCP_LISTEN)) {
639 res = -EADDRNOTAVAIL;
640 dev_put(dev);
641 break;
642 }
643
644 ax25->ax25_dev = ax25_dev_ax25dev(dev);
645 ax25_fillin_cb(ax25, ax25->ax25_dev);
646 break;
647
648 default:
649 res = -ENOPROTOOPT;
650 }
651 release_sock(sk);
652
653 return res;
654}
655
656static int ax25_getsockopt(struct socket *sock, int level, int optname,
657 char __user *optval, int __user *optlen)
658{
659 struct sock *sk = sock->sk;
660 ax25_cb *ax25;
661 struct ax25_dev *ax25_dev;
662 char devname[IFNAMSIZ];
663 void *valptr;
664 int val = 0;
665 int maxlen, length;
666
667 if (level != SOL_AX25)
668 return -ENOPROTOOPT;
669
670 if (get_user(maxlen, optlen))
671 return -EFAULT;
672
673 if (maxlen < 1)
674 return -EFAULT;
675
676 valptr = (void *) &val;
677 length = min_t(unsigned int, maxlen, sizeof(int));
678
679 lock_sock(sk);
680 ax25 = ax25_sk(sk);
681
682 switch (optname) {
683 case AX25_WINDOW:
684 val = ax25->window;
685 break;
686
687 case AX25_T1:
688 val = ax25->t1 / HZ;
689 break;
690
691 case AX25_T2:
692 val = ax25->t2 / HZ;
693 break;
694
695 case AX25_N2:
696 val = ax25->n2;
697 break;
698
699 case AX25_T3:
700 val = ax25->t3 / HZ;
701 break;
702
703 case AX25_IDLE:
704 val = ax25->idle / (60 * HZ);
705 break;
706
707 case AX25_BACKOFF:
708 val = ax25->backoff;
709 break;
710
711 case AX25_EXTSEQ:
712 val = (ax25->modulus == AX25_EMODULUS);
713 break;
714
715 case AX25_PIDINCL:
716 val = ax25->pidincl;
717 break;
718
719 case AX25_IAMDIGI:
720 val = ax25->iamdigi;
721 break;
722
723 case AX25_PACLEN:
724 val = ax25->paclen;
725 break;
726
727 case SO_BINDTODEVICE:
728 ax25_dev = ax25->ax25_dev;
729
730 if (ax25_dev != NULL && ax25_dev->dev != NULL) {
731 strlcpy(devname, ax25_dev->dev->name, sizeof(devname));
732 length = strlen(devname) + 1;
733 } else {
734 *devname = '\0';
735 length = 1;
736 }
737
738 valptr = (void *) devname;
739 break;
740
741 default:
742 release_sock(sk);
743 return -ENOPROTOOPT;
744 }
745 release_sock(sk);
746
747 if (put_user(length, optlen))
748 return -EFAULT;
749
750 return copy_to_user(optval, valptr, length) ? -EFAULT : 0;
751}
752
753static int ax25_listen(struct socket *sock, int backlog)
754{
755 struct sock *sk = sock->sk;
756 int res = 0;
757
758 lock_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;
762 goto out;
763 }
764 res = -EOPNOTSUPP;
765
766out:
767 release_sock(sk);
768
769 return res;
770}
771
772/*
773 * XXX: when creating ax25_sock we should update the .obj_size setting
774 * below.
775 */
776static struct proto ax25_proto = {
777 .name = "AX25",
778 .owner = THIS_MODULE,
779 .obj_size = sizeof(struct sock),
780};
781
782static int ax25_create(struct socket *sock, int protocol)
783{
784 struct sock *sk;
785 ax25_cb *ax25;
786
787 switch (sock->type) {
788 case SOCK_DGRAM:
789 if (protocol == 0 || protocol == PF_AX25)
790 protocol = AX25_P_TEXT;
791 break;
792
793 case SOCK_SEQPACKET:
794 switch (protocol) {
795 case 0:
796 case PF_AX25: /* For CLX */
797 protocol = AX25_P_TEXT;
798 break;
799 case AX25_P_SEGMENT:
800#ifdef CONFIG_INET
801 case AX25_P_ARP:
802 case AX25_P_IP:
803#endif
804#ifdef CONFIG_NETROM
805 case AX25_P_NETROM:
806#endif
807#ifdef CONFIG_ROSE
808 case AX25_P_ROSE:
809#endif
810 return -ESOCKTNOSUPPORT;
811#ifdef CONFIG_NETROM_MODULE
812 case AX25_P_NETROM:
813 if (ax25_protocol_is_registered(AX25_P_NETROM))
814 return -ESOCKTNOSUPPORT;
815#endif
816#ifdef CONFIG_ROSE_MODULE
817 case AX25_P_ROSE:
818 if (ax25_protocol_is_registered(AX25_P_ROSE))
819 return -ESOCKTNOSUPPORT;
820#endif
821 default:
822 break;
823 }
824 break;
825
826 case SOCK_RAW:
827 break;
828 default:
829 return -ESOCKTNOSUPPORT;
830 }
831
832 if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, &ax25_proto, 1)) == NULL)
833 return -ENOMEM;
834
835 ax25 = sk->sk_protinfo = ax25_create_cb();
836 if (!ax25) {
837 sk_free(sk);
838 return -ENOMEM;
839 }
840
841 sock_init_data(sock, sk);
842
843 sk->sk_destruct = ax25_free_sock;
844 sock->ops = &ax25_proto_ops;
845 sk->sk_protocol = protocol;
846
847 ax25->sk = sk;
848
849 return 0;
850}
851
852struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
853{
854 struct sock *sk;
855 ax25_cb *ax25, *oax25;
856
857 if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, osk->sk_prot, 1)) == NULL)
858 return NULL;
859
860 if ((ax25 = ax25_create_cb()) == NULL) {
861 sk_free(sk);
862 return NULL;
863 }
864
865 switch (osk->sk_type) {
866 case SOCK_DGRAM:
867 break;
868 case SOCK_SEQPACKET:
869 break;
870 default:
871 sk_free(sk);
872 ax25_cb_put(ax25);
873 return NULL;
874 }
875
876 sock_init_data(NULL, sk);
877
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;
Ralf Baechle53b924b2005-08-23 10:11:30 -0700887 sock_copy_flags(sk, osk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888
889 oax25 = ax25_sk(osk);
890
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;
903
904 ax25->ax25_dev = ax25_dev;
905 ax25->source_addr = oax25->source_addr;
906
907 if (oax25->digipeat != NULL) {
Arnaldo Carvalho de Melo0459d70a2006-11-17 12:43:07 -0200908 ax25->digipeat = kmemdup(oax25->digipeat, sizeof(ax25_digi),
909 GFP_ATOMIC);
910 if (ax25->digipeat == NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 sk_free(sk);
912 ax25_cb_put(ax25);
913 return NULL;
914 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915 }
916
917 sk->sk_protinfo = ax25;
918 ax25->sk = sk;
919
920 return sk;
921}
922
923static int ax25_release(struct socket *sock)
924{
925 struct sock *sk = sock->sk;
926 ax25_cb *ax25;
927
928 if (sk == NULL)
929 return 0;
930
931 sock_hold(sk);
932 sock_orphan(sk);
933 lock_sock(sk);
934 ax25 = ax25_sk(sk);
935
936 if (sk->sk_type == SOCK_SEQPACKET) {
937 switch (ax25->state) {
938 case AX25_STATE_0:
939 release_sock(sk);
940 ax25_disconnect(ax25, 0);
941 lock_sock(sk);
942 ax25_destroy_socket(ax25);
943 break;
944
945 case AX25_STATE_1:
946 case AX25_STATE_2:
947 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
948 release_sock(sk);
949 ax25_disconnect(ax25, 0);
950 lock_sock(sk);
951 ax25_destroy_socket(ax25);
952 break;
953
954 case AX25_STATE_3:
955 case AX25_STATE_4:
956 ax25_clear_queues(ax25);
957 ax25->n2count = 0;
958
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,
963 AX25_DISC,
964 AX25_POLLON,
965 AX25_COMMAND);
966 ax25_stop_t2timer(ax25);
967 ax25_stop_t3timer(ax25);
968 ax25_stop_idletimer(ax25);
969 break;
970#ifdef CONFIG_AX25_DAMA_SLAVE
971 case AX25_PROTO_DAMA_SLAVE:
972 ax25_stop_t3timer(ax25);
973 ax25_stop_idletimer(ax25);
974 break;
975#endif
976 }
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);
984 break;
985
986 default:
987 break;
988 }
989 } else {
990 sk->sk_state = TCP_CLOSE;
991 sk->sk_shutdown |= SEND_SHUTDOWN;
992 sk->sk_state_change(sk);
993 ax25_destroy_socket(ax25);
994 }
995
996 sock->sk = NULL;
997 release_sock(sk);
998 sock_put(sk);
999
1000 return 0;
1001}
1002
1003/*
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.
1008 */
1009static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1010{
1011 struct sock *sk = sock->sk;
1012 struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
1013 ax25_dev *ax25_dev = NULL;
Ralf Baechle01d7dd02005-08-23 10:11:45 -07001014 ax25_uid_assoc *user;
1015 ax25_address call;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016 ax25_cb *ax25;
1017 int err = 0;
1018
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))) {
1024 return -EINVAL;
1025 }
1026
1027 printk(KERN_WARNING "ax25_bind(): %s uses old (6 digipeater) socket structure.\n",
1028 current->comm);
1029 }
1030
1031 if (addr->fsa_ax25.sax25_family != AF_AX25)
1032 return -EINVAL;
1033
Ralf Baechle01d7dd02005-08-23 10:11:45 -07001034 user = ax25_findbyuid(current->euid);
1035 if (user) {
1036 call = user->call;
1037 ax25_uid_put(user);
1038 } else {
1039 if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
1040 return -EACCES;
1041
1042 call = addr->fsa_ax25.sax25_call;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001043 }
1044
1045 lock_sock(sk);
1046
1047 ax25 = ax25_sk(sk);
1048 if (!sock_flag(sk, SOCK_ZAPPED)) {
1049 err = -EINVAL;
1050 goto out;
1051 }
1052
Ralf Baechle01d7dd02005-08-23 10:11:45 -07001053 ax25->source_addr = call;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054
1055 /*
1056 * User already set interface with SO_BINDTODEVICE
1057 */
1058 if (ax25->ax25_dev != NULL)
1059 goto done;
1060
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;
1065 goto out;
1066 }
1067 } else {
1068 if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL) {
1069 err = -EADDRNOTAVAIL;
1070 goto out;
1071 }
1072 }
1073
1074 if (ax25_dev != NULL)
1075 ax25_fillin_cb(ax25, ax25_dev);
1076
1077done:
1078 ax25_cb_add(ax25);
1079 sock_reset_flag(sk, SOCK_ZAPPED);
1080
1081out:
1082 release_sock(sk);
1083
1084 return 0;
1085}
1086
1087/*
1088 * FIXME: nonblock behaviour looks like it may have a bug.
1089 */
Ralf Baechlec9266b92006-12-14 15:49:28 -08001090static int __must_check ax25_connect(struct socket *sock,
1091 struct sockaddr *uaddr, int addr_len, int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092{
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;
1098
1099 /*
1100 * some sanity checks. code further down depends on this
1101 */
1102
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",
1106 current->comm);
1107 }
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))) {
1112 return -EINVAL;
1113 }
1114
1115 printk(KERN_WARNING "ax25_connect(): %s uses old (6 digipeater) socket structure.\n",
1116 current->comm);
1117 }
1118
1119 if (fsa->fsa_ax25.sax25_family != AF_AX25)
1120 return -EINVAL;
1121
1122 lock_sock(sk);
1123
1124 /* deal with restarts */
1125 if (sock->state == SS_CONNECTING) {
1126 switch (sk->sk_state) {
1127 case TCP_SYN_SENT: /* still trying */
1128 err = -EINPROGRESS;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001129 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130
1131 case TCP_ESTABLISHED: /* connection established */
1132 sock->state = SS_CONNECTED;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001133 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134
1135 case TCP_CLOSE: /* connection refused */
1136 sock->state = SS_UNCONNECTED;
1137 err = -ECONNREFUSED;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001138 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139 }
1140 }
1141
1142 if (sk->sk_state == TCP_ESTABLISHED && sk->sk_type == SOCK_SEQPACKET) {
1143 err = -EISCONN; /* No reconnect on a seqpacket socket */
Ralf Baechle75606dc2007-04-20 16:06:45 -07001144 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145 }
1146
1147 sk->sk_state = TCP_CLOSE;
1148 sock->state = SS_UNCONNECTED;
1149
Jesper Juhla51482b2005-11-08 09:41:34 -08001150 kfree(ax25->digipeat);
1151 ax25->digipeat = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152
1153 /*
1154 * Handle digi-peaters to be used.
1155 */
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) {
1160 err = -EINVAL;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001161 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162 }
1163
1164 if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
1165 err = -ENOBUFS;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001166 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167 }
1168
1169 digi->ndigi = fsa->fsa_ax25.sax25_ndigis;
1170 digi->lastrepeat = -1;
1171
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;
1177 } else {
1178 digi->repeated[ct] = 0;
1179 }
1180 digi->calls[ct] = fsa->fsa_digipeater[ct];
1181 ct++;
1182 }
1183 }
1184
1185 /*
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.
1189 */
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",
1193 current->comm);
1194 if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) {
1195 kfree(digi);
Ralf Baechle75606dc2007-04-20 16:06:45 -07001196 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 }
1198
1199 ax25_fillin_cb(ax25, ax25->ax25_dev);
1200 ax25_cb_add(ax25);
1201 } else {
1202 if (ax25->ax25_dev == NULL) {
1203 kfree(digi);
1204 err = -EHOSTUNREACH;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001205 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206 }
1207 }
1208
1209 if (sk->sk_type == SOCK_SEQPACKET &&
1210 (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +09001211 ax25->ax25_dev->dev))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001212 kfree(digi);
1213 err = -EADDRINUSE; /* Already such a connection */
1214 ax25_cb_put(ax25t);
Ralf Baechle75606dc2007-04-20 16:06:45 -07001215 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001216 }
1217
1218 ax25->dest_addr = fsa->fsa_ax25.sax25_call;
1219 ax25->digipeat = digi;
1220
1221 /* First the easy one */
1222 if (sk->sk_type != SOCK_SEQPACKET) {
1223 sock->state = SS_CONNECTED;
1224 sk->sk_state = TCP_ESTABLISHED;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001225 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226 }
1227
1228 /* Move to connecting socket, ax.25 lapb WAIT_UA.. */
1229 sock->state = SS_CONNECTING;
1230 sk->sk_state = TCP_SYN_SENT;
1231
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);
1236 break;
1237
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);
1244 else
1245 ax25_std_establish_data_link(ax25);
1246 break;
1247#endif
1248 }
1249
1250 ax25->state = AX25_STATE_1;
1251
1252 ax25_start_heartbeat(ax25);
1253
1254 /* Now the loop */
1255 if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) {
1256 err = -EINPROGRESS;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001257 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 }
1259
1260 if (sk->sk_state == TCP_SYN_SENT) {
Ralf Baechle75606dc2007-04-20 16:06:45 -07001261 DEFINE_WAIT(wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263 for (;;) {
Ralf Baechle75606dc2007-04-20 16:06:45 -07001264 prepare_to_wait(sk->sk_sleep, &wait,
1265 TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001266 if (sk->sk_state != TCP_SYN_SENT)
1267 break;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001268 if (!signal_pending(current)) {
1269 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001270 schedule();
1271 lock_sock(sk);
1272 continue;
1273 }
Ralf Baechle75606dc2007-04-20 16:06:45 -07001274 err = -ERESTARTSYS;
1275 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276 }
Ralf Baechle75606dc2007-04-20 16:06:45 -07001277 finish_wait(sk->sk_sleep, &wait);
1278
1279 if (err)
1280 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281 }
1282
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 */
Ralf Baechle75606dc2007-04-20 16:06:45 -07001287 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288 }
1289
1290 sock->state = SS_CONNECTED;
1291
Ralf Baechle75606dc2007-04-20 16:06:45 -07001292 err = 0;
1293out_release:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 release_sock(sk);
1295
1296 return err;
1297}
1298
Linus Torvalds1da177e2005-04-16 15:20:36 -07001299static int ax25_accept(struct socket *sock, struct socket *newsock, int flags)
1300{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001301 struct sk_buff *skb;
1302 struct sock *newsk;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001303 DEFINE_WAIT(wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001304 struct sock *sk;
1305 int err = 0;
1306
1307 if (sock->state != SS_UNCONNECTED)
1308 return -EINVAL;
1309
1310 if ((sk = sock->sk) == NULL)
1311 return -EINVAL;
1312
1313 lock_sock(sk);
1314 if (sk->sk_type != SOCK_SEQPACKET) {
1315 err = -EOPNOTSUPP;
1316 goto out;
1317 }
1318
1319 if (sk->sk_state != TCP_LISTEN) {
1320 err = -EINVAL;
1321 goto out;
1322 }
1323
1324 /*
1325 * The read queue this time is holding sockets ready to use
1326 * hooked into the SABM we saved
1327 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328 for (;;) {
Ralf Baechle75606dc2007-04-20 16:06:45 -07001329 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001330 skb = skb_dequeue(&sk->sk_receive_queue);
1331 if (skb)
1332 break;
1333
Linus Torvalds1da177e2005-04-16 15:20:36 -07001334 if (flags & O_NONBLOCK) {
Ralf Baechle75606dc2007-04-20 16:06:45 -07001335 err = -EWOULDBLOCK;
1336 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337 }
Ralf Baechle75606dc2007-04-20 16:06:45 -07001338 if (!signal_pending(current)) {
1339 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340 schedule();
1341 lock_sock(sk);
1342 continue;
1343 }
Ralf Baechle75606dc2007-04-20 16:06:45 -07001344 err = -ERESTARTSYS;
1345 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346 }
Ralf Baechle75606dc2007-04-20 16:06:45 -07001347 finish_wait(sk->sk_sleep, &wait);
1348
1349 if (err)
1350 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351
1352 newsk = skb->sk;
1353 newsk->sk_socket = newsock;
1354 newsk->sk_sleep = &newsock->wait;
1355
1356 /* Now attach up the new socket */
1357 kfree_skb(skb);
1358 sk->sk_ack_backlog--;
1359 newsock->sk = newsk;
1360 newsock->state = SS_CONNECTED;
1361
1362out:
1363 release_sock(sk);
1364
1365 return err;
1366}
1367
1368static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
1369 int *uaddr_len, int peer)
1370{
1371 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1372 struct sock *sk = sock->sk;
1373 unsigned char ndigi, i;
1374 ax25_cb *ax25;
1375 int err = 0;
1376
1377 lock_sock(sk);
1378 ax25 = ax25_sk(sk);
1379
1380 if (peer != 0) {
1381 if (sk->sk_state != TCP_ESTABLISHED) {
1382 err = -ENOTCONN;
1383 goto out;
1384 }
1385
1386 fsa->fsa_ax25.sax25_family = AF_AX25;
1387 fsa->fsa_ax25.sax25_call = ax25->dest_addr;
1388 fsa->fsa_ax25.sax25_ndigis = 0;
1389
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];
1396 }
1397 } else {
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);
1404 } else {
1405 fsa->fsa_digipeater[0] = null_ax25_address;
1406 }
1407 }
1408 *uaddr_len = sizeof (struct full_sockaddr_ax25);
1409
1410out:
1411 release_sock(sk);
1412
1413 return err;
1414}
1415
1416static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
1417 struct msghdr *msg, size_t len)
1418{
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;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001424 ax25_cb *ax25;
1425 size_t size;
1426 int lv, err, addr_len = msg->msg_namelen;
1427
1428 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
1429 return -EINVAL;
1430
1431 lock_sock(sk);
1432 ax25 = ax25_sk(sk);
1433
1434 if (sock_flag(sk, SOCK_ZAPPED)) {
1435 err = -EADDRNOTAVAIL;
1436 goto out;
1437 }
1438
1439 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1440 send_sig(SIGPIPE, current, 0);
1441 err = -EPIPE;
1442 goto out;
1443 }
1444
1445 if (ax25->ax25_dev == NULL) {
1446 err = -ENETUNREACH;
1447 goto out;
1448 }
1449
1450 if (len > ax25->ax25_dev->dev->mtu) {
1451 err = -EMSGSIZE;
1452 goto out;
1453 }
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +09001454
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455 if (usax != NULL) {
1456 if (usax->sax25_family != AF_AX25) {
1457 err = -EINVAL;
1458 goto out;
1459 }
1460
1461 if (addr_len == sizeof(struct sockaddr_ax25)) {
1462 printk(KERN_WARNING "ax25_sendmsg(): %s uses obsolete socket structure\n",
1463 current->comm);
1464 }
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) ||
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +09001468 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1469 err = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001470 goto out;
1471 }
1472
1473 printk(KERN_WARNING "ax25_sendmsg(): %s uses old (6 digipeater) socket structure.\n",
1474 current->comm);
1475 }
1476
1477 if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
1478 int ct = 0;
1479 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
1480
1481 /* Valid number of digipeaters ? */
1482 if (usax->sax25_ndigis < 1 || usax->sax25_ndigis > AX25_MAX_DIGIS) {
1483 err = -EINVAL;
1484 goto out;
1485 }
1486
1487 dtmp.ndigi = usax->sax25_ndigis;
1488
1489 while (ct < usax->sax25_ndigis) {
1490 dtmp.repeated[ct] = 0;
1491 dtmp.calls[ct] = fsa->fsa_digipeater[ct];
1492 ct++;
1493 }
1494
1495 dtmp.lastrepeat = 0;
1496 }
1497
1498 sax = *usax;
1499 if (sk->sk_type == SOCK_SEQPACKET &&
1500 ax25cmp(&ax25->dest_addr, &sax.sax25_call)) {
1501 err = -EISCONN;
1502 goto out;
1503 }
1504 if (usax->sax25_ndigis == 0)
1505 dp = NULL;
1506 else
1507 dp = &dtmp;
1508 } else {
1509 /*
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
1513 */
1514 if (sk->sk_state != TCP_ESTABLISHED) {
1515 err = -ENOTCONN;
1516 goto out;
1517 }
1518 sax.sax25_family = AF_AX25;
1519 sax.sax25_call = ax25->dest_addr;
1520 dp = ax25->digipeat;
1521 }
1522
1523 SOCK_DEBUG(sk, "AX.25: sendto: Addresses built.\n");
1524
1525 /* Build a packet */
1526 SOCK_DEBUG(sk, "AX.25: sendto: building packet.\n");
1527
1528 /* Assume the worst case */
1529 size = len + ax25->ax25_dev->dev->hard_header_len;
1530
1531 skb = sock_alloc_send_skb(sk, size, msg->msg_flags&MSG_DONTWAIT, &err);
1532 if (skb == NULL)
1533 goto out;
1534
1535 skb_reserve(skb, size - len);
1536
1537 SOCK_DEBUG(sk, "AX.25: Appending user data\n");
1538
1539 /* User data follows immediately after the AX.25 data */
1540 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
1541 err = -EFAULT;
1542 kfree_skb(skb);
1543 goto out;
1544 }
1545
Arnaldo Carvalho de Meloc1d2bbe2007-04-10 20:45:18 -07001546 skb_reset_network_header(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001547
1548 /* Add the PID if one is not supplied by the user in the skb */
Arnaldo Carvalho de Melo967b05f2007-03-13 13:51:52 -03001549 if (!ax25->pidincl)
1550 *skb_push(skb, 1) = sk->sk_protocol;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001551
1552 SOCK_DEBUG(sk, "AX.25: Transmitting buffer\n");
1553
1554 if (sk->sk_type == SOCK_SEQPACKET) {
1555 /* Connected mode sockets go via the LAPB machine */
1556 if (sk->sk_state != TCP_ESTABLISHED) {
1557 kfree_skb(skb);
1558 err = -ENOTCONN;
1559 goto out;
1560 }
1561
1562 /* Shove it onto the queue and kick */
1563 ax25_output(ax25, ax25->paclen, skb);
1564
1565 err = len;
1566 goto out;
1567 }
1568
Arnaldo Carvalho de Melo967b05f2007-03-13 13:51:52 -03001569 skb_push(skb, 1 + ax25_addr_size(dp));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570
1571 SOCK_DEBUG(sk, "Building AX.25 Header (dp=%p).\n", dp);
1572
1573 if (dp != NULL)
1574 SOCK_DEBUG(sk, "Num digipeaters=%d\n", dp->ndigi);
1575
1576 /* Build an AX.25 header */
Arnaldo Carvalho de Melo967b05f2007-03-13 13:51:52 -03001577 lv = ax25_addr_build(skb->data, &ax25->source_addr, &sax.sax25_call,
1578 dp, AX25_COMMAND, AX25_MODULUS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001579
1580 SOCK_DEBUG(sk, "Built header (%d bytes)\n",lv);
1581
Arnaldo Carvalho de Melo967b05f2007-03-13 13:51:52 -03001582 skb_set_transport_header(skb, lv);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001583
Arnaldo Carvalho de Melo9c702202007-04-25 18:04:18 -07001584 SOCK_DEBUG(sk, "base=%p pos=%p\n",
1585 skb->data, skb_transport_header(skb));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586
Arnaldo Carvalho de Melo9c702202007-04-25 18:04:18 -07001587 *skb_transport_header(skb) = AX25_UI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588
1589 /* Datagram frames go straight out of the door as UI */
Arnaldo Carvalho de Melo29c4be52005-04-21 16:46:56 -07001590 ax25_queue_xmit(skb, ax25->ax25_dev->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001591
1592 err = len;
1593
1594out:
1595 release_sock(sk);
1596
1597 return err;
1598}
1599
1600static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
1601 struct msghdr *msg, size_t size, int flags)
1602{
1603 struct sock *sk = sock->sk;
1604 struct sk_buff *skb;
1605 int copied;
1606 int err = 0;
1607
1608 lock_sock(sk);
1609 /*
1610 * This works for seqpacket too. The receiver has ordered the
1611 * queue for us! We do one quick check first though
1612 */
1613 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) {
1614 err = -ENOTCONN;
1615 goto out;
1616 }
1617
1618 /* Now we can treat all alike */
1619 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +09001620 flags & MSG_DONTWAIT, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621 if (skb == NULL)
1622 goto out;
1623
1624 if (!ax25_sk(sk)->pidincl)
1625 skb_pull(skb, 1); /* Remove PID */
1626
Arnaldo Carvalho de Melobadff6d2007-03-13 13:06:52 -03001627 skb_reset_transport_header(skb);
1628 copied = skb->len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001629
1630 if (copied > size) {
1631 copied = size;
1632 msg->msg_flags |= MSG_TRUNC;
1633 }
1634
1635 skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
1636
1637 if (msg->msg_namelen != 0) {
1638 struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
1639 ax25_digi digi;
1640 ax25_address src;
Arnaldo Carvalho de Melo98e399f2007-03-19 15:33:04 -07001641 const unsigned char *mac = skb_mac_header(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001642
Arnaldo Carvalho de Melo98e399f2007-03-19 15:33:04 -07001643 ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL,
1644 &digi, NULL, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001645 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;
1651
1652 if (sax->sax25_ndigis != 0) {
1653 int ct;
1654 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
1655
1656 for (ct = 0; ct < digi.ndigi; ct++)
1657 fsa->fsa_digipeater[ct] = digi.calls[ct];
1658 }
1659 msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
1660 }
1661
1662 skb_free_datagram(sk, skb);
1663 err = copied;
1664
1665out:
1666 release_sock(sk);
1667
1668 return err;
1669}
1670
1671static int ax25_shutdown(struct socket *sk, int how)
1672{
1673 /* FIXME - generate DM and RNR states */
1674 return -EOPNOTSUPP;
1675}
1676
1677static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1678{
1679 struct sock *sk = sock->sk;
1680 void __user *argp = (void __user *)arg;
1681 int res = 0;
1682
1683 lock_sock(sk);
1684 switch (cmd) {
1685 case TIOCOUTQ: {
1686 long amount;
1687 amount = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
1688 if (amount < 0)
1689 amount = 0;
1690 res = put_user(amount, (int __user *)argp);
1691 break;
1692 }
1693
1694 case TIOCINQ: {
1695 struct sk_buff *skb;
1696 long amount = 0L;
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)
1699 amount = skb->len;
Ralf Baechle20b7d102005-09-12 14:24:55 -07001700 res = put_user(amount, (int __user *) argp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001701 break;
1702 }
1703
1704 case SIOCGSTAMP:
Ralf Baechle9b37ee72005-09-12 14:23:52 -07001705 res = sock_get_timestamp(sk, argp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001706 break;
1707
Eric Dumazetae40eb12007-03-18 17:33:16 -07001708 case SIOCGSTAMPNS:
1709 res = sock_get_timestampns(sk, argp);
1710 break;
1711
Linus Torvalds1da177e2005-04-16 15:20:36 -07001712 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))) {
1717 res = -EFAULT;
1718 break;
1719 }
1720 res = ax25_uid_ioctl(cmd, &sax25);
1721 break;
1722 }
1723
1724 case SIOCAX25NOUID: { /* Set the default policy (default/bar) */
1725 long amount;
1726 if (!capable(CAP_NET_ADMIN)) {
1727 res = -EPERM;
1728 break;
1729 }
1730 if (get_user(amount, (long __user *)argp)) {
1731 res = -EFAULT;
1732 break;
1733 }
1734 if (amount > AX25_NOUID_BLOCK) {
1735 res = -EINVAL;
1736 break;
1737 }
1738 ax25_uid_policy = amount;
1739 res = 0;
1740 break;
1741 }
1742
1743 case SIOCADDRT:
1744 case SIOCDELRT:
1745 case SIOCAX25OPTRT:
1746 if (!capable(CAP_NET_ADMIN)) {
1747 res = -EPERM;
1748 break;
1749 }
1750 res = ax25_rt_ioctl(cmd, argp);
1751 break;
1752
1753 case SIOCAX25CTLCON:
1754 if (!capable(CAP_NET_ADMIN)) {
1755 res = -EPERM;
1756 break;
1757 }
1758 res = ax25_ctl_ioctl(cmd, argp);
1759 break;
1760
1761 case SIOCAX25GETINFO:
1762 case SIOCAX25GETINFOOLD: {
1763 ax25_cb *ax25 = ax25_sk(sk);
1764 struct ax25_info_struct ax25_info;
1765
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;
1785
1786 /* old structure? */
1787 if (cmd == SIOCAX25GETINFOOLD) {
1788 static int warned = 0;
1789 if (!warned) {
1790 printk(KERN_INFO "%s uses old SIOCAX25GETINFO\n",
1791 current->comm);
1792 warned=1;
1793 }
1794
1795 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct_deprecated))) {
1796 res = -EFAULT;
1797 break;
1798 }
1799 } else {
1800 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct))) {
1801 res = -EINVAL;
1802 break;
1803 }
1804 }
1805 res = 0;
1806 break;
1807 }
1808
1809 case SIOCAX25ADDFWD:
1810 case SIOCAX25DELFWD: {
1811 struct ax25_fwd_struct ax25_fwd;
1812 if (!capable(CAP_NET_ADMIN)) {
1813 res = -EPERM;
1814 break;
1815 }
1816 if (copy_from_user(&ax25_fwd, argp, sizeof(ax25_fwd))) {
1817 res = -EFAULT;
1818 break;
1819 }
1820 res = ax25_fwd_ioctl(cmd, &ax25_fwd);
1821 break;
1822 }
1823
1824 case SIOCGIFADDR:
1825 case SIOCSIFADDR:
1826 case SIOCGIFDSTADDR:
1827 case SIOCSIFDSTADDR:
1828 case SIOCGIFBRDADDR:
1829 case SIOCSIFBRDADDR:
1830 case SIOCGIFNETMASK:
1831 case SIOCSIFNETMASK:
1832 case SIOCGIFMETRIC:
1833 case SIOCSIFMETRIC:
1834 res = -EINVAL;
1835 break;
1836
1837 default:
Christoph Hellwigb5e5fa52006-01-03 14:18:33 -08001838 res = -ENOIOCTLCMD;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001839 break;
1840 }
1841 release_sock(sk);
1842
1843 return res;
1844}
1845
1846#ifdef CONFIG_PROC_FS
1847
1848static void *ax25_info_start(struct seq_file *seq, loff_t *pos)
1849{
1850 struct ax25_cb *ax25;
1851 struct hlist_node *node;
1852 int i = 0;
1853
1854 spin_lock_bh(&ax25_list_lock);
1855 ax25_for_each(ax25, node, &ax25_list) {
1856 if (i == *pos)
1857 return ax25;
1858 ++i;
1859 }
1860 return NULL;
1861}
1862
1863static void *ax25_info_next(struct seq_file *seq, void *v, loff_t *pos)
1864{
1865 ++*pos;
1866
1867 return hlist_entry( ((struct ax25_cb *)v)->ax25_node.next,
1868 struct ax25_cb, ax25_node);
1869}
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +09001870
Linus Torvalds1da177e2005-04-16 15:20:36 -07001871static void ax25_info_stop(struct seq_file *seq, void *v)
1872{
1873 spin_unlock_bh(&ax25_list_lock);
1874}
1875
1876static int ax25_info_show(struct seq_file *seq, void *v)
1877{
1878 ax25_cb *ax25 = v;
Ralf Baechlef75268c2005-09-06 15:49:39 -07001879 char buf[11];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001880 int k;
1881
1882
1883 /*
1884 * New format:
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
1886 */
1887
1888 seq_printf(seq, "%8.8lx %s %s%s ",
1889 (long) ax25,
1890 ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
Ralf Baechlef75268c2005-09-06 15:49:39 -07001891 ax2asc(buf, &ax25->source_addr),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001892 ax25->iamdigi? "*":"");
Ralf Baechlef75268c2005-09-06 15:49:39 -07001893 seq_printf(seq, "%s", ax2asc(buf, &ax25->dest_addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001894
1895 for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
1896 seq_printf(seq, ",%s%s",
Ralf Baechlef75268c2005-09-06 15:49:39 -07001897 ax2asc(buf, &ax25->digipeat->calls[k]),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001898 ax25->digipeat->repeated[k]? "*":"");
1899 }
1900
1901 seq_printf(seq, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
1902 ax25->state,
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,
1910 ax25->rtt / HZ,
1911 ax25->window,
1912 ax25->paclen);
1913
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);
1921 } else {
1922 seq_puts(seq, " * * *\n");
1923 }
1924 return 0;
1925}
1926
Philippe De Muyter56b3d972007-07-10 23:07:31 -07001927static const struct seq_operations ax25_info_seqops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001928 .start = ax25_info_start,
1929 .next = ax25_info_next,
1930 .stop = ax25_info_stop,
1931 .show = ax25_info_show,
1932};
1933
1934static int ax25_info_open(struct inode *inode, struct file *file)
1935{
1936 return seq_open(file, &ax25_info_seqops);
1937}
1938
Arjan van de Ven9a321442007-02-12 00:55:35 -08001939static const struct file_operations ax25_info_fops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001940 .owner = THIS_MODULE,
1941 .open = ax25_info_open,
1942 .read = seq_read,
1943 .llseek = seq_lseek,
1944 .release = seq_release,
1945};
1946
1947#endif
1948
1949static struct net_proto_family ax25_family_ops = {
1950 .family = PF_AX25,
1951 .create = ax25_create,
1952 .owner = THIS_MODULE,
1953};
1954
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001955static const struct proto_ops ax25_proto_ops = {
Ralf Baechle46763562005-09-12 14:25:25 -07001956 .family = PF_AX25,
1957 .owner = THIS_MODULE,
1958 .release = ax25_release,
1959 .bind = ax25_bind,
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,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001974};
1975
1976/*
1977 * Called by socket.c on kernel start up
1978 */
1979static struct packet_type ax25_packet_type = {
1980 .type = __constant_htons(ETH_P_AX25),
1981 .dev = NULL, /* All devices */
1982 .func = ax25_kiss_rcv,
1983};
1984
1985static struct notifier_block ax25_dev_notifier = {
1986 .notifier_call =ax25_device_event,
1987};
1988
Linus Torvalds1da177e2005-04-16 15:20:36 -07001989static int __init ax25_init(void)
1990{
1991 int rc = proto_register(&ax25_proto, 0);
1992
1993 if (rc != 0)
1994 goto out;
1995
1996 sock_register(&ax25_family_ops);
1997 dev_add_pack(&ax25_packet_type);
1998 register_netdevice_notifier(&ax25_dev_notifier);
1999 ax25_register_sysctl();
2000
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);
2004out:
2005 return rc;
2006}
2007module_init(ax25_init);
2008
2009
2010MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
2011MODULE_DESCRIPTION("The amateur radio AX.25 link layer protocol");
2012MODULE_LICENSE("GPL");
2013MODULE_ALIAS_NETPROTO(PF_AX25);
2014
2015static void __exit ax25_exit(void)
2016{
2017 proc_net_remove("ax25_route");
2018 proc_net_remove("ax25");
2019 proc_net_remove("ax25_calls");
2020 ax25_rt_free();
2021 ax25_uid_free();
2022 ax25_dev_free();
2023
2024 ax25_unregister_sysctl();
2025 unregister_netdevice_notifier(&ax25_dev_notifier);
2026
2027 dev_remove_pack(&ax25_packet_type);
2028
2029 sock_unregister(PF_AX25);
2030 proto_unregister(&ax25_proto);
2031}
2032module_exit(ax25_exit);