blob: 02f43f3e2c5640791aa013b0afc902049e44e26d [file] [log] [blame]
Thomas Gleixner2874c5f2019-05-27 08:55:01 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 *
4 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
5 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
6 * Copyright (C) Darryl Miles G7LED (dlm@g7led.demon.co.uk)
7 * Copyright (C) Steven Whitehouse GW7RRM (stevew@acm.org)
8 * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
9 * Copyright (C) Hans-Joachim Hetscher DD8NE (dd8ne@bnv-bamberg.de)
10 * Copyright (C) Hans Alblas PE1AYX (hans@esrac.ele.tue.nl)
11 * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr)
12 */
Randy Dunlap4fc268d2006-01-11 12:17:47 -080013#include <linux/capability.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070014#include <linux/module.h>
15#include <linux/errno.h>
16#include <linux/types.h>
17#include <linux/socket.h>
18#include <linux/in.h>
19#include <linux/kernel.h>
Ingo Molnar3f07c012017-02-08 18:51:30 +010020#include <linux/sched/signal.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070021#include <linux/timer.h>
22#include <linux/string.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <linux/sockios.h>
24#include <linux/net.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090025#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070026#include <net/ax25.h>
27#include <linux/inet.h>
28#include <linux/netdevice.h>
29#include <linux/if_arp.h>
30#include <linux/skbuff.h>
31#include <net/sock.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080032#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/fcntl.h>
34#include <linux/termios.h> /* For TIOCINQ/OUTQ */
35#include <linux/mm.h>
36#include <linux/interrupt.h>
37#include <linux/notifier.h>
38#include <linux/proc_fs.h>
39#include <linux/stat.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070040#include <linux/sysctl.h>
41#include <linux/init.h>
42#include <linux/spinlock.h>
Eric W. Biederman457c4cb2007-09-12 12:01:34 +020043#include <net/net_namespace.h>
Arnaldo Carvalho de Meloc752f072005-08-09 20:08:28 -070044#include <net/tcp_states.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070045#include <net/ip.h>
46#include <net/arp.h>
47
48
49
50HLIST_HEAD(ax25_list);
51DEFINE_SPINLOCK(ax25_list_lock);
52
Eric Dumazet90ddc4f2005-12-22 12:49:22 -080053static const struct proto_ops ax25_proto_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -070054
55static void ax25_free_sock(struct sock *sk)
56{
David Miller32003922015-06-25 06:19:07 -070057 ax25_cb_put(sk_to_ax25(sk));
Linus Torvalds1da177e2005-04-16 15:20:36 -070058}
59
60/*
61 * Socket removal during an interrupt is now safe.
62 */
63static void ax25_cb_del(ax25_cb *ax25)
64{
65 if (!hlist_unhashed(&ax25->ax25_node)) {
66 spin_lock_bh(&ax25_list_lock);
67 hlist_del_init(&ax25->ax25_node);
68 spin_unlock_bh(&ax25_list_lock);
69 ax25_cb_put(ax25);
70 }
71}
72
73/*
74 * Kill all bound sockets on a dropped device.
75 */
76static void ax25_kill_by_device(struct net_device *dev)
77{
78 ax25_dev *ax25_dev;
79 ax25_cb *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -070080
81 if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
82 return;
83
84 spin_lock_bh(&ax25_list_lock);
Jarek Poplawskiecd2ebd2008-01-10 21:21:20 -080085again:
Sasha Levinb67bfe02013-02-27 17:06:00 -080086 ax25_for_each(s, &ax25_list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -070087 if (s->ax25_dev == ax25_dev) {
Jarek Poplawskiecd2ebd2008-01-10 21:21:20 -080088 spin_unlock_bh(&ax25_list_lock);
Lin Ma1ade48d2021-12-17 10:29:41 +080089 lock_sock(s->sk);
90 s->ax25_dev = NULL;
91 release_sock(s->sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -070092 ax25_disconnect(s, ENETUNREACH);
Jarek Poplawskiecd2ebd2008-01-10 21:21:20 -080093 spin_lock_bh(&ax25_list_lock);
94
95 /* The entry could have been deleted from the
96 * list meanwhile and thus the next pointer is
97 * no longer valid. Play it safe and restart
98 * the scan. Forward progress is ensured
99 * because we set s->ax25_dev to NULL and we
100 * are never passed a NULL 'dev' argument.
101 */
102 goto again;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103 }
104 }
105 spin_unlock_bh(&ax25_list_lock);
106}
107
108/*
109 * Handle device status changes.
110 */
111static int ax25_device_event(struct notifier_block *this, unsigned long event,
Jiri Pirko351638e2013-05-28 01:30:21 +0000112 void *ptr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113{
Jiri Pirko351638e2013-05-28 01:30:21 +0000114 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115
YOSHIFUJI Hideaki721499e2008-07-19 22:34:43 -0700116 if (!net_eq(dev_net(dev), &init_net))
Eric W. Biedermane9dc8652007-09-12 13:02:17 +0200117 return NOTIFY_DONE;
118
Linus Torvalds1da177e2005-04-16 15:20:36 -0700119 /* Reject non AX.25 devices */
120 if (dev->type != ARPHRD_AX25)
121 return NOTIFY_DONE;
122
123 switch (event) {
124 case NETDEV_UP:
125 ax25_dev_device_up(dev);
126 break;
127 case NETDEV_DOWN:
128 ax25_kill_by_device(dev);
129 ax25_rt_device_down(dev);
130 ax25_dev_device_down(dev);
131 break;
132 default:
133 break;
134 }
135
136 return NOTIFY_DONE;
137}
138
139/*
140 * Add a socket to the bound sockets list.
141 */
142void ax25_cb_add(ax25_cb *ax25)
143{
144 spin_lock_bh(&ax25_list_lock);
145 ax25_cb_hold(ax25);
146 hlist_add_head(&ax25->ax25_node, &ax25_list);
147 spin_unlock_bh(&ax25_list_lock);
148}
149
150/*
151 * Find a socket that wants to accept the SABM we have just
152 * received.
153 */
154struct sock *ax25_find_listener(ax25_address *addr, int digi,
155 struct net_device *dev, int type)
156{
157 ax25_cb *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700159 spin_lock(&ax25_list_lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -0800160 ax25_for_each(s, &ax25_list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700161 if ((s->iamdigi && !digi) || (!s->iamdigi && digi))
162 continue;
163 if (s->sk && !ax25cmp(&s->source_addr, addr) &&
164 s->sk->sk_type == type && s->sk->sk_state == TCP_LISTEN) {
165 /* If device is null we match any device */
166 if (s->ax25_dev == NULL || s->ax25_dev->dev == dev) {
167 sock_hold(s->sk);
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700168 spin_unlock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700169 return s->sk;
170 }
171 }
172 }
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700173 spin_unlock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174
175 return NULL;
176}
177
178/*
179 * Find an AX.25 socket given both ends.
180 */
181struct sock *ax25_get_socket(ax25_address *my_addr, ax25_address *dest_addr,
182 int type)
183{
184 struct sock *sk = NULL;
185 ax25_cb *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700186
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700187 spin_lock(&ax25_list_lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -0800188 ax25_for_each(s, &ax25_list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700189 if (s->sk && !ax25cmp(&s->source_addr, my_addr) &&
190 !ax25cmp(&s->dest_addr, dest_addr) &&
191 s->sk->sk_type == type) {
192 sk = s->sk;
193 sock_hold(sk);
194 break;
195 }
196 }
197
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700198 spin_unlock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700199
200 return sk;
201}
202
203/*
204 * Find an AX.25 control block given both ends. It will only pick up
205 * floating AX.25 control blocks or non Raw socket bound control blocks.
206 */
Jakub Kicinskic045ad22021-10-12 08:58:35 -0700207ax25_cb *ax25_find_cb(const ax25_address *src_addr, ax25_address *dest_addr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208 ax25_digi *digi, struct net_device *dev)
209{
210 ax25_cb *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211
212 spin_lock_bh(&ax25_list_lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -0800213 ax25_for_each(s, &ax25_list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214 if (s->sk && s->sk->sk_type != SOCK_SEQPACKET)
215 continue;
216 if (s->ax25_dev == NULL)
217 continue;
218 if (ax25cmp(&s->source_addr, src_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->ax25_dev->dev == dev) {
219 if (digi != NULL && digi->ndigi != 0) {
220 if (s->digipeat == NULL)
221 continue;
222 if (ax25digicmp(s->digipeat, digi) != 0)
223 continue;
224 } else {
225 if (s->digipeat != NULL && s->digipeat->ndigi != 0)
226 continue;
227 }
228 ax25_cb_hold(s);
229 spin_unlock_bh(&ax25_list_lock);
230
231 return s;
232 }
233 }
234 spin_unlock_bh(&ax25_list_lock);
235
236 return NULL;
237}
238
Ralf Baechle70868ea2006-05-03 23:25:17 -0700239EXPORT_SYMBOL(ax25_find_cb);
240
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto)
242{
243 ax25_cb *s;
244 struct sk_buff *copy;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700246 spin_lock(&ax25_list_lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -0800247 ax25_for_each(s, &ax25_list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248 if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 &&
249 s->sk->sk_type == SOCK_RAW &&
250 s->sk->sk_protocol == proto &&
251 s->ax25_dev->dev == skb->dev &&
252 atomic_read(&s->sk->sk_rmem_alloc) <= s->sk->sk_rcvbuf) {
253 if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
254 continue;
255 if (sock_queue_rcv_skb(s->sk, copy) != 0)
256 kfree_skb(copy);
257 }
258 }
Ralf Baechlec19c4b92006-07-12 13:25:23 -0700259 spin_unlock(&ax25_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260}
261
262/*
263 * Deferred destroy.
264 */
265void ax25_destroy_socket(ax25_cb *);
266
267/*
268 * Handler for deferred kills.
269 */
Kees Cook8dbd05f2017-10-24 01:45:39 -0700270static void ax25_destroy_timer(struct timer_list *t)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271{
Kees Cook8dbd05f2017-10-24 01:45:39 -0700272 ax25_cb *ax25 = from_timer(ax25, t, dtimer);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 struct sock *sk;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900274
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 sk=ax25->sk;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900276
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277 bh_lock_sock(sk);
278 sock_hold(sk);
279 ax25_destroy_socket(ax25);
280 bh_unlock_sock(sk);
281 sock_put(sk);
282}
283
284/*
285 * This is called from user mode and the timers. Thus it protects itself
286 * against interrupt users but doesn't worry about being called during
287 * work. Once it is removed from the queue no interrupt or bottom half
288 * will touch it and we are (fairly 8-) ) safe.
289 */
290void ax25_destroy_socket(ax25_cb *ax25)
291{
292 struct sk_buff *skb;
293
294 ax25_cb_del(ax25);
295
296 ax25_stop_heartbeat(ax25);
297 ax25_stop_t1timer(ax25);
298 ax25_stop_t2timer(ax25);
299 ax25_stop_t3timer(ax25);
300 ax25_stop_idletimer(ax25);
301
302 ax25_clear_queues(ax25); /* Flush the queues */
303
304 if (ax25->sk != NULL) {
305 while ((skb = skb_dequeue(&ax25->sk->sk_receive_queue)) != NULL) {
306 if (skb->sk != ax25->sk) {
307 /* A pending connection */
David Miller32003922015-06-25 06:19:07 -0700308 ax25_cb *sax25 = sk_to_ax25(skb->sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309
310 /* Queue the unaccepted socket for death */
311 sock_orphan(skb->sk);
312
David S. Miller33d1d2c2008-10-06 12:53:50 -0700313 /* 9A4GL: hack to release unaccepted sockets */
314 skb->sk->sk_state = TCP_LISTEN;
315
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316 ax25_start_heartbeat(sax25);
317 sax25->state = AX25_STATE_0;
318 }
319
320 kfree_skb(skb);
321 }
322 skb_queue_purge(&ax25->sk->sk_write_queue);
323 }
324
325 if (ax25->sk != NULL) {
Eric Dumazetc5640392009-06-16 10:12:03 +0000326 if (sk_has_allocations(ax25->sk)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327 /* Defer: outstanding buffers */
Kees Cook8dbd05f2017-10-24 01:45:39 -0700328 timer_setup(&ax25->dtimer, ax25_destroy_timer, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329 ax25->dtimer.expires = jiffies + 2 * HZ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330 add_timer(&ax25->dtimer);
331 } else {
332 struct sock *sk=ax25->sk;
333 ax25->sk=NULL;
334 sock_put(sk);
335 }
336 } else {
337 ax25_cb_put(ax25);
338 }
339}
340
341/*
342 * dl1bke 960311: set parameters for existing AX.25 connections,
343 * includes a KILL command to abort any connection.
344 * VERY useful for debugging ;-)
345 */
346static int ax25_ctl_ioctl(const unsigned int cmd, void __user *arg)
347{
348 struct ax25_ctl_struct ax25_ctl;
349 ax25_digi digi;
350 ax25_dev *ax25_dev;
351 ax25_cb *ax25;
352 unsigned int k;
Jarek Poplawskic0181d42009-09-25 03:10:38 +0000353 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354
355 if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
356 return -EFAULT;
357
358 if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
359 return -ENODEV;
360
361 if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
362 return -EINVAL;
363
roel kluin43ab8502009-10-14 05:26:30 +0000364 if (ax25_ctl.arg > ULONG_MAX / HZ && ax25_ctl.cmd != AX25_KILL)
365 return -EINVAL;
366
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367 digi.ndigi = ax25_ctl.digi_count;
368 for (k = 0; k < digi.ndigi; k++)
369 digi.calls[k] = ax25_ctl.digi_addr[k];
370
371 if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
372 return -ENOTCONN;
373
374 switch (ax25_ctl.cmd) {
375 case AX25_KILL:
376 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
377#ifdef CONFIG_AX25_DAMA_SLAVE
378 if (ax25_dev->dama.slave && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
379 ax25_dama_off(ax25);
380#endif
381 ax25_disconnect(ax25, ENETRESET);
382 break;
383
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900384 case AX25_WINDOW:
385 if (ax25->modulus == AX25_MODULUS) {
386 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
Jarek Poplawskic0181d42009-09-25 03:10:38 +0000387 goto einval_put;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900388 } else {
389 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
Jarek Poplawskic0181d42009-09-25 03:10:38 +0000390 goto einval_put;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900391 }
392 ax25->window = ax25_ctl.arg;
393 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900395 case AX25_T1:
Ralf Baechlebe639ac2011-11-24 06:12:59 +0000396 if (ax25_ctl.arg < 1 || ax25_ctl.arg > ULONG_MAX / HZ)
Jarek Poplawskic0181d42009-09-25 03:10:38 +0000397 goto einval_put;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900398 ax25->rtt = (ax25_ctl.arg * HZ) / 2;
399 ax25->t1 = ax25_ctl.arg * HZ;
400 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900402 case AX25_T2:
Ralf Baechlebe639ac2011-11-24 06:12:59 +0000403 if (ax25_ctl.arg < 1 || ax25_ctl.arg > ULONG_MAX / HZ)
Jarek Poplawskic0181d42009-09-25 03:10:38 +0000404 goto einval_put;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900405 ax25->t2 = ax25_ctl.arg * HZ;
406 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900408 case AX25_N2:
409 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
Jarek Poplawskic0181d42009-09-25 03:10:38 +0000410 goto einval_put;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900411 ax25->n2count = 0;
412 ax25->n2 = ax25_ctl.arg;
413 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700414
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900415 case AX25_T3:
Ralf Baechlebe639ac2011-11-24 06:12:59 +0000416 if (ax25_ctl.arg > ULONG_MAX / HZ)
417 goto einval_put;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900418 ax25->t3 = ax25_ctl.arg * HZ;
419 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900421 case AX25_IDLE:
Ralf Baechlebe639ac2011-11-24 06:12:59 +0000422 if (ax25_ctl.arg > ULONG_MAX / (60 * HZ))
423 goto einval_put;
424
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900425 ax25->idle = ax25_ctl.arg * 60 * HZ;
426 break;
427
428 case AX25_PACLEN:
429 if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
Jarek Poplawskic0181d42009-09-25 03:10:38 +0000430 goto einval_put;
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +0900431 ax25->paclen = ax25_ctl.arg;
432 break;
433
434 default:
Jarek Poplawskic0181d42009-09-25 03:10:38 +0000435 goto einval_put;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700436 }
437
Jarek Poplawskic0181d42009-09-25 03:10:38 +0000438out_put:
439 ax25_cb_put(ax25);
440 return ret;
441
442einval_put:
443 ret = -EINVAL;
444 goto out_put;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445}
446
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700447static void ax25_fillin_cb_from_dev(ax25_cb *ax25, ax25_dev *ax25_dev)
448{
449 ax25->rtt = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]) / 2;
450 ax25->t1 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]);
451 ax25->t2 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T2]);
452 ax25->t3 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T3]);
453 ax25->n2 = ax25_dev->values[AX25_VALUES_N2];
454 ax25->paclen = ax25_dev->values[AX25_VALUES_PACLEN];
455 ax25->idle = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_IDLE]);
456 ax25->backoff = ax25_dev->values[AX25_VALUES_BACKOFF];
457
458 if (ax25_dev->values[AX25_VALUES_AXDEFMODE]) {
459 ax25->modulus = AX25_EMODULUS;
460 ax25->window = ax25_dev->values[AX25_VALUES_EWINDOW];
461 } else {
462 ax25->modulus = AX25_MODULUS;
463 ax25->window = ax25_dev->values[AX25_VALUES_WINDOW];
464 }
465}
466
Linus Torvalds1da177e2005-04-16 15:20:36 -0700467/*
468 * Fill in a created AX.25 created control block with the default
469 * values for a particular device.
470 */
471void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
472{
473 ax25->ax25_dev = ax25_dev;
474
475 if (ax25->ax25_dev != NULL) {
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700476 ax25_fillin_cb_from_dev(ax25, ax25_dev);
477 return;
478 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700480 /*
481 * No device, use kernel / AX.25 spec default values
482 */
483 ax25->rtt = msecs_to_jiffies(AX25_DEF_T1) / 2;
484 ax25->t1 = msecs_to_jiffies(AX25_DEF_T1);
485 ax25->t2 = msecs_to_jiffies(AX25_DEF_T2);
486 ax25->t3 = msecs_to_jiffies(AX25_DEF_T3);
487 ax25->n2 = AX25_DEF_N2;
488 ax25->paclen = AX25_DEF_PACLEN;
489 ax25->idle = msecs_to_jiffies(AX25_DEF_IDLE);
490 ax25->backoff = AX25_DEF_BACKOFF;
491
492 if (AX25_DEF_AXDEFMODE) {
493 ax25->modulus = AX25_EMODULUS;
494 ax25->window = AX25_DEF_EWINDOW;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495 } else {
Ralf Baechlee1fdb5b2006-05-03 23:27:16 -0700496 ax25->modulus = AX25_MODULUS;
497 ax25->window = AX25_DEF_WINDOW;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498 }
499}
500
501/*
502 * Create an empty AX.25 control block.
503 */
504ax25_cb *ax25_create_cb(void)
505{
506 ax25_cb *ax25;
507
Ralf Baechle1b30dd32006-07-09 12:14:22 -0700508 if ((ax25 = kzalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509 return NULL;
510
Reshetova, Elenab6d52ed2017-07-04 15:53:31 +0300511 refcount_set(&ax25->refcount, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512
513 skb_queue_head_init(&ax25->write_queue);
514 skb_queue_head_init(&ax25->frag_queue);
515 skb_queue_head_init(&ax25->ack_queue);
516 skb_queue_head_init(&ax25->reseq_queue);
517
Jarek Poplawski21fab4a2008-02-11 21:36:39 -0800518 ax25_setup_timers(ax25);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700519
520 ax25_fillin_cb(ax25, NULL);
521
522 ax25->state = AX25_STATE_0;
523
524 return ax25;
525}
526
527/*
528 * Handling for system calls applied via the various interfaces to an
529 * AX25 socket object
530 */
531
532static int ax25_setsockopt(struct socket *sock, int level, int optname,
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200533 sockptr_t optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534{
535 struct sock *sk = sock->sk;
536 ax25_cb *ax25;
537 struct net_device *dev;
538 char devname[IFNAMSIZ];
Dan Carpenter93719372022-01-07 10:13:12 +0300539 unsigned int opt;
Xi Wangba1cffe2011-12-27 09:43:19 +0000540 int res = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541
542 if (level != SOL_AX25)
543 return -ENOPROTOOPT;
544
Xi Wangba1cffe2011-12-27 09:43:19 +0000545 if (optlen < sizeof(unsigned int))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700546 return -EINVAL;
547
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200548 if (copy_from_sockptr(&opt, optval, sizeof(unsigned int)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549 return -EFAULT;
550
551 lock_sock(sk);
David Miller32003922015-06-25 06:19:07 -0700552 ax25 = sk_to_ax25(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553
554 switch (optname) {
555 case AX25_WINDOW:
556 if (ax25->modulus == AX25_MODULUS) {
557 if (opt < 1 || opt > 7) {
558 res = -EINVAL;
559 break;
560 }
561 } else {
562 if (opt < 1 || opt > 63) {
563 res = -EINVAL;
564 break;
565 }
566 }
567 ax25->window = opt;
568 break;
569
570 case AX25_T1:
Dan Carpenter93719372022-01-07 10:13:12 +0300571 if (opt < 1 || opt > UINT_MAX / HZ) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572 res = -EINVAL;
573 break;
574 }
Eric Dumazetf16f3022008-01-13 22:29:41 -0800575 ax25->rtt = (opt * HZ) >> 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576 ax25->t1 = opt * HZ;
577 break;
578
579 case AX25_T2:
Dan Carpenter93719372022-01-07 10:13:12 +0300580 if (opt < 1 || opt > UINT_MAX / HZ) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581 res = -EINVAL;
582 break;
583 }
584 ax25->t2 = opt * HZ;
585 break;
586
587 case AX25_N2:
588 if (opt < 1 || opt > 31) {
589 res = -EINVAL;
590 break;
591 }
592 ax25->n2 = opt;
593 break;
594
595 case AX25_T3:
Dan Carpenter93719372022-01-07 10:13:12 +0300596 if (opt < 1 || opt > UINT_MAX / HZ) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700597 res = -EINVAL;
598 break;
599 }
600 ax25->t3 = opt * HZ;
601 break;
602
603 case AX25_IDLE:
Dan Carpenter93719372022-01-07 10:13:12 +0300604 if (opt > UINT_MAX / (60 * HZ)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605 res = -EINVAL;
606 break;
607 }
608 ax25->idle = opt * 60 * HZ;
609 break;
610
611 case AX25_BACKOFF:
Xi Wangba1cffe2011-12-27 09:43:19 +0000612 if (opt > 2) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700613 res = -EINVAL;
614 break;
615 }
616 ax25->backoff = opt;
617 break;
618
619 case AX25_EXTSEQ:
620 ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
621 break;
622
623 case AX25_PIDINCL:
624 ax25->pidincl = opt ? 1 : 0;
625 break;
626
627 case AX25_IAMDIGI:
628 ax25->iamdigi = opt ? 1 : 0;
629 break;
630
631 case AX25_PACLEN:
632 if (opt < 16 || opt > 65535) {
633 res = -EINVAL;
634 break;
635 }
636 ax25->paclen = opt;
637 break;
638
639 case SO_BINDTODEVICE:
Eric Dumazet687775c2020-05-19 18:24:43 -0700640 if (optlen > IFNAMSIZ - 1)
641 optlen = IFNAMSIZ - 1;
642
643 memset(devname, 0, sizeof(devname));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700644
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200645 if (copy_from_sockptr(devname, optval, optlen)) {
Ralf Baechle2f722912009-09-28 12:26:28 -0700646 res = -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700647 break;
648 }
649
650 if (sk->sk_type == SOCK_SEQPACKET &&
651 (sock->state != SS_UNCONNECTED ||
652 sk->sk_state == TCP_LISTEN)) {
653 res = -EADDRNOTAVAIL;
Ralf Baechle2f722912009-09-28 12:26:28 -0700654 break;
655 }
656
Cong Wangc4335702018-12-29 13:56:36 -0800657 rtnl_lock();
658 dev = __dev_get_by_name(&init_net, devname);
Ralf Baechle2f722912009-09-28 12:26:28 -0700659 if (!dev) {
Cong Wangc4335702018-12-29 13:56:36 -0800660 rtnl_unlock();
Ralf Baechle2f722912009-09-28 12:26:28 -0700661 res = -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662 break;
663 }
664
665 ax25->ax25_dev = ax25_dev_ax25dev(dev);
Cong Wangc4335702018-12-29 13:56:36 -0800666 if (!ax25->ax25_dev) {
667 rtnl_unlock();
668 res = -ENODEV;
669 break;
670 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671 ax25_fillin_cb(ax25, ax25->ax25_dev);
Cong Wangc4335702018-12-29 13:56:36 -0800672 rtnl_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673 break;
674
675 default:
676 res = -ENOPROTOOPT;
677 }
678 release_sock(sk);
679
680 return res;
681}
682
683static int ax25_getsockopt(struct socket *sock, int level, int optname,
684 char __user *optval, int __user *optlen)
685{
686 struct sock *sk = sock->sk;
687 ax25_cb *ax25;
688 struct ax25_dev *ax25_dev;
689 char devname[IFNAMSIZ];
690 void *valptr;
691 int val = 0;
692 int maxlen, length;
693
694 if (level != SOL_AX25)
695 return -ENOPROTOOPT;
696
697 if (get_user(maxlen, optlen))
698 return -EFAULT;
699
700 if (maxlen < 1)
701 return -EFAULT;
702
703 valptr = (void *) &val;
704 length = min_t(unsigned int, maxlen, sizeof(int));
705
706 lock_sock(sk);
David Miller32003922015-06-25 06:19:07 -0700707 ax25 = sk_to_ax25(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708
709 switch (optname) {
710 case AX25_WINDOW:
711 val = ax25->window;
712 break;
713
714 case AX25_T1:
715 val = ax25->t1 / HZ;
716 break;
717
718 case AX25_T2:
719 val = ax25->t2 / HZ;
720 break;
721
722 case AX25_N2:
723 val = ax25->n2;
724 break;
725
726 case AX25_T3:
727 val = ax25->t3 / HZ;
728 break;
729
730 case AX25_IDLE:
731 val = ax25->idle / (60 * HZ);
732 break;
733
734 case AX25_BACKOFF:
735 val = ax25->backoff;
736 break;
737
738 case AX25_EXTSEQ:
739 val = (ax25->modulus == AX25_EMODULUS);
740 break;
741
742 case AX25_PIDINCL:
743 val = ax25->pidincl;
744 break;
745
746 case AX25_IAMDIGI:
747 val = ax25->iamdigi;
748 break;
749
750 case AX25_PACLEN:
751 val = ax25->paclen;
752 break;
753
754 case SO_BINDTODEVICE:
755 ax25_dev = ax25->ax25_dev;
756
757 if (ax25_dev != NULL && ax25_dev->dev != NULL) {
758 strlcpy(devname, ax25_dev->dev->name, sizeof(devname));
759 length = strlen(devname) + 1;
760 } else {
761 *devname = '\0';
762 length = 1;
763 }
764
765 valptr = (void *) devname;
766 break;
767
768 default:
769 release_sock(sk);
770 return -ENOPROTOOPT;
771 }
772 release_sock(sk);
773
774 if (put_user(length, optlen))
775 return -EFAULT;
776
777 return copy_to_user(optval, valptr, length) ? -EFAULT : 0;
778}
779
780static int ax25_listen(struct socket *sock, int backlog)
781{
782 struct sock *sk = sock->sk;
783 int res = 0;
784
785 lock_sock(sk);
786 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_LISTEN) {
787 sk->sk_max_ack_backlog = backlog;
788 sk->sk_state = TCP_LISTEN;
789 goto out;
790 }
791 res = -EOPNOTSUPP;
792
793out:
794 release_sock(sk);
795
796 return res;
797}
798
799/*
800 * XXX: when creating ax25_sock we should update the .obj_size setting
801 * below.
802 */
803static struct proto ax25_proto = {
804 .name = "AX25",
805 .owner = THIS_MODULE,
David Miller32003922015-06-25 06:19:07 -0700806 .obj_size = sizeof(struct ax25_sock),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807};
808
Eric Paris3f378b62009-11-05 22:18:14 -0800809static int ax25_create(struct net *net, struct socket *sock, int protocol,
810 int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811{
812 struct sock *sk;
813 ax25_cb *ax25;
814
Mat Martineaue9cdced2020-01-09 07:59:14 -0800815 if (protocol < 0 || protocol > U8_MAX)
Hannes Frederic Sowa79462ad02015-12-14 22:03:39 +0100816 return -EINVAL;
817
Octavian Purdila09ad9bc2009-11-25 15:14:13 -0800818 if (!net_eq(net, &init_net))
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700819 return -EAFNOSUPPORT;
820
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821 switch (sock->type) {
822 case SOCK_DGRAM:
823 if (protocol == 0 || protocol == PF_AX25)
824 protocol = AX25_P_TEXT;
825 break;
826
827 case SOCK_SEQPACKET:
828 switch (protocol) {
829 case 0:
830 case PF_AX25: /* For CLX */
831 protocol = AX25_P_TEXT;
832 break;
833 case AX25_P_SEGMENT:
834#ifdef CONFIG_INET
835 case AX25_P_ARP:
836 case AX25_P_IP:
837#endif
838#ifdef CONFIG_NETROM
839 case AX25_P_NETROM:
840#endif
841#ifdef CONFIG_ROSE
842 case AX25_P_ROSE:
843#endif
844 return -ESOCKTNOSUPPORT;
845#ifdef CONFIG_NETROM_MODULE
846 case AX25_P_NETROM:
847 if (ax25_protocol_is_registered(AX25_P_NETROM))
848 return -ESOCKTNOSUPPORT;
Alan Coxef764a12012-07-13 06:33:08 +0000849 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850#endif
851#ifdef CONFIG_ROSE_MODULE
852 case AX25_P_ROSE:
853 if (ax25_protocol_is_registered(AX25_P_ROSE))
854 return -ESOCKTNOSUPPORT;
Gustavo A. R. Silva5646fba2021-03-09 23:39:41 -0600855 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856#endif
857 default:
858 break;
859 }
860 break;
861
862 case SOCK_RAW:
Ori Nimron0614e2b2019-09-20 09:35:47 +0200863 if (!capable(CAP_NET_RAW))
864 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865 break;
866 default:
867 return -ESOCKTNOSUPPORT;
868 }
869
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500870 sk = sk_alloc(net, PF_AX25, GFP_ATOMIC, &ax25_proto, kern);
Pavel Emelyanov6257ff22007-11-01 00:39:31 -0700871 if (sk == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700872 return -ENOMEM;
873
David Miller32003922015-06-25 06:19:07 -0700874 ax25 = ax25_sk(sk)->cb = ax25_create_cb();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875 if (!ax25) {
876 sk_free(sk);
877 return -ENOMEM;
878 }
879
880 sock_init_data(sock, sk);
881
882 sk->sk_destruct = ax25_free_sock;
883 sock->ops = &ax25_proto_ops;
884 sk->sk_protocol = protocol;
885
886 ax25->sk = sk;
887
888 return 0;
889}
890
891struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
892{
893 struct sock *sk;
894 ax25_cb *ax25, *oax25;
895
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500896 sk = sk_alloc(sock_net(osk), PF_AX25, GFP_ATOMIC, osk->sk_prot, 0);
Pavel Emelyanov6257ff22007-11-01 00:39:31 -0700897 if (sk == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 return NULL;
899
900 if ((ax25 = ax25_create_cb()) == NULL) {
901 sk_free(sk);
902 return NULL;
903 }
904
905 switch (osk->sk_type) {
906 case SOCK_DGRAM:
907 break;
908 case SOCK_SEQPACKET:
909 break;
910 default:
911 sk_free(sk);
912 ax25_cb_put(ax25);
913 return NULL;
914 }
915
916 sock_init_data(NULL, sk);
917
Linus Torvalds1da177e2005-04-16 15:20:36 -0700918 sk->sk_type = osk->sk_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 sk->sk_priority = osk->sk_priority;
920 sk->sk_protocol = osk->sk_protocol;
921 sk->sk_rcvbuf = osk->sk_rcvbuf;
922 sk->sk_sndbuf = osk->sk_sndbuf;
923 sk->sk_state = TCP_ESTABLISHED;
Ralf Baechle53b924b2005-08-23 10:11:30 -0700924 sock_copy_flags(sk, osk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700925
David Miller32003922015-06-25 06:19:07 -0700926 oax25 = sk_to_ax25(osk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927
928 ax25->modulus = oax25->modulus;
929 ax25->backoff = oax25->backoff;
930 ax25->pidincl = oax25->pidincl;
931 ax25->iamdigi = oax25->iamdigi;
932 ax25->rtt = oax25->rtt;
933 ax25->t1 = oax25->t1;
934 ax25->t2 = oax25->t2;
935 ax25->t3 = oax25->t3;
936 ax25->n2 = oax25->n2;
937 ax25->idle = oax25->idle;
938 ax25->paclen = oax25->paclen;
939 ax25->window = oax25->window;
940
941 ax25->ax25_dev = ax25_dev;
942 ax25->source_addr = oax25->source_addr;
943
944 if (oax25->digipeat != NULL) {
Arnaldo Carvalho de Melo0459d70a2006-11-17 12:43:07 -0200945 ax25->digipeat = kmemdup(oax25->digipeat, sizeof(ax25_digi),
946 GFP_ATOMIC);
947 if (ax25->digipeat == NULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700948 sk_free(sk);
949 ax25_cb_put(ax25);
950 return NULL;
951 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952 }
953
David Miller32003922015-06-25 06:19:07 -0700954 ax25_sk(sk)->cb = ax25;
Jarek Poplawski8c185ab2009-09-27 10:57:02 +0000955 sk->sk_destruct = ax25_free_sock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700956 ax25->sk = sk;
957
958 return sk;
959}
960
961static int ax25_release(struct socket *sock)
962{
963 struct sock *sk = sock->sk;
964 ax25_cb *ax25;
965
966 if (sk == NULL)
967 return 0;
968
969 sock_hold(sk);
970 sock_orphan(sk);
971 lock_sock(sk);
David Miller32003922015-06-25 06:19:07 -0700972 ax25 = sk_to_ax25(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973
974 if (sk->sk_type == SOCK_SEQPACKET) {
975 switch (ax25->state) {
976 case AX25_STATE_0:
977 release_sock(sk);
978 ax25_disconnect(ax25, 0);
979 lock_sock(sk);
980 ax25_destroy_socket(ax25);
981 break;
982
983 case AX25_STATE_1:
984 case AX25_STATE_2:
985 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
986 release_sock(sk);
987 ax25_disconnect(ax25, 0);
988 lock_sock(sk);
Basil Gunn4a7d99e2016-06-16 09:42:30 -0700989 if (!sock_flag(ax25->sk, SOCK_DESTROY))
990 ax25_destroy_socket(ax25);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700991 break;
992
993 case AX25_STATE_3:
994 case AX25_STATE_4:
995 ax25_clear_queues(ax25);
996 ax25->n2count = 0;
997
998 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
999 case AX25_PROTO_STD_SIMPLEX:
1000 case AX25_PROTO_STD_DUPLEX:
1001 ax25_send_control(ax25,
1002 AX25_DISC,
1003 AX25_POLLON,
1004 AX25_COMMAND);
1005 ax25_stop_t2timer(ax25);
1006 ax25_stop_t3timer(ax25);
1007 ax25_stop_idletimer(ax25);
1008 break;
1009#ifdef CONFIG_AX25_DAMA_SLAVE
1010 case AX25_PROTO_DAMA_SLAVE:
1011 ax25_stop_t3timer(ax25);
1012 ax25_stop_idletimer(ax25);
1013 break;
1014#endif
1015 }
1016 ax25_calculate_t1(ax25);
1017 ax25_start_t1timer(ax25);
1018 ax25->state = AX25_STATE_2;
1019 sk->sk_state = TCP_CLOSE;
1020 sk->sk_shutdown |= SEND_SHUTDOWN;
1021 sk->sk_state_change(sk);
1022 sock_set_flag(sk, SOCK_DESTROY);
1023 break;
1024
1025 default:
1026 break;
1027 }
1028 } else {
1029 sk->sk_state = TCP_CLOSE;
1030 sk->sk_shutdown |= SEND_SHUTDOWN;
1031 sk->sk_state_change(sk);
1032 ax25_destroy_socket(ax25);
1033 }
1034
1035 sock->sk = NULL;
1036 release_sock(sk);
1037 sock_put(sk);
1038
1039 return 0;
1040}
1041
1042/*
1043 * We support a funny extension here so you can (as root) give any callsign
1044 * digipeated via a local address as source. This hack is obsolete now
1045 * that we've implemented support for SO_BINDTODEVICE. It is however small
1046 * and trivially backward compatible.
1047 */
1048static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1049{
1050 struct sock *sk = sock->sk;
1051 struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
1052 ax25_dev *ax25_dev = NULL;
Ralf Baechle01d7dd02005-08-23 10:11:45 -07001053 ax25_uid_assoc *user;
1054 ax25_address call;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055 ax25_cb *ax25;
1056 int err = 0;
1057
1058 if (addr_len != sizeof(struct sockaddr_ax25) &&
maximilian attems1987e7b2008-01-28 20:44:11 -08001059 addr_len != sizeof(struct full_sockaddr_ax25))
1060 /* support for old structure may go away some time
1061 * ax25_bind(): uses old (6 digipeater) socket structure.
1062 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
maximilian attems1987e7b2008-01-28 20:44:11 -08001064 (addr_len > sizeof(struct full_sockaddr_ax25)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066
1067 if (addr->fsa_ax25.sax25_family != AF_AX25)
1068 return -EINVAL;
1069
David Howells73400402008-11-14 10:39:06 +11001070 user = ax25_findbyuid(current_euid());
Ralf Baechle01d7dd02005-08-23 10:11:45 -07001071 if (user) {
1072 call = user->call;
1073 ax25_uid_put(user);
1074 } else {
1075 if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
1076 return -EACCES;
1077
1078 call = addr->fsa_ax25.sax25_call;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 }
1080
1081 lock_sock(sk);
1082
David Miller32003922015-06-25 06:19:07 -07001083 ax25 = sk_to_ax25(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 if (!sock_flag(sk, SOCK_ZAPPED)) {
1085 err = -EINVAL;
1086 goto out;
1087 }
1088
Ralf Baechle01d7dd02005-08-23 10:11:45 -07001089 ax25->source_addr = call;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090
1091 /*
1092 * User already set interface with SO_BINDTODEVICE
1093 */
1094 if (ax25->ax25_dev != NULL)
1095 goto done;
1096
1097 if (addr_len > sizeof(struct sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
1098 if (ax25cmp(&addr->fsa_digipeater[0], &null_ax25_address) != 0 &&
1099 (ax25_dev = ax25_addr_ax25dev(&addr->fsa_digipeater[0])) == NULL) {
1100 err = -EADDRNOTAVAIL;
1101 goto out;
1102 }
1103 } else {
1104 if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL) {
1105 err = -EADDRNOTAVAIL;
1106 goto out;
1107 }
1108 }
1109
1110 if (ax25_dev != NULL)
1111 ax25_fillin_cb(ax25, ax25_dev);
1112
1113done:
1114 ax25_cb_add(ax25);
1115 sock_reset_flag(sk, SOCK_ZAPPED);
1116
1117out:
1118 release_sock(sk);
1119
Julia Lawall49339cc2010-08-16 06:28:19 +00001120 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121}
1122
1123/*
1124 * FIXME: nonblock behaviour looks like it may have a bug.
1125 */
Ralf Baechlec9266b92006-12-14 15:49:28 -08001126static int __must_check ax25_connect(struct socket *sock,
1127 struct sockaddr *uaddr, int addr_len, int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001128{
1129 struct sock *sk = sock->sk;
David Miller32003922015-06-25 06:19:07 -07001130 ax25_cb *ax25 = sk_to_ax25(sk), *ax25t;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1132 ax25_digi *digi = NULL;
1133 int ct = 0, err = 0;
1134
1135 /*
1136 * some sanity checks. code further down depends on this
1137 */
1138
maximilian attems27d1cba2008-01-10 03:57:29 -08001139 if (addr_len == sizeof(struct sockaddr_ax25))
1140 /* support for this will go away in early 2.5.x
1141 * ax25_connect(): uses obsolete socket structure
1142 */
1143 ;
1144 else if (addr_len != sizeof(struct full_sockaddr_ax25))
1145 /* support for old structure may go away some time
1146 * ax25_connect(): uses old (6 digipeater) socket structure.
1147 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001148 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
maximilian attems27d1cba2008-01-10 03:57:29 -08001149 (addr_len > sizeof(struct full_sockaddr_ax25)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152
1153 if (fsa->fsa_ax25.sax25_family != AF_AX25)
1154 return -EINVAL;
1155
1156 lock_sock(sk);
1157
1158 /* deal with restarts */
1159 if (sock->state == SS_CONNECTING) {
1160 switch (sk->sk_state) {
1161 case TCP_SYN_SENT: /* still trying */
1162 err = -EINPROGRESS;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001163 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001164
1165 case TCP_ESTABLISHED: /* connection established */
1166 sock->state = SS_CONNECTED;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001167 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168
1169 case TCP_CLOSE: /* connection refused */
1170 sock->state = SS_UNCONNECTED;
1171 err = -ECONNREFUSED;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001172 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173 }
1174 }
1175
1176 if (sk->sk_state == TCP_ESTABLISHED && sk->sk_type == SOCK_SEQPACKET) {
1177 err = -EISCONN; /* No reconnect on a seqpacket socket */
Ralf Baechle75606dc2007-04-20 16:06:45 -07001178 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179 }
1180
1181 sk->sk_state = TCP_CLOSE;
1182 sock->state = SS_UNCONNECTED;
1183
Jesper Juhla51482b2005-11-08 09:41:34 -08001184 kfree(ax25->digipeat);
1185 ax25->digipeat = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186
1187 /*
1188 * Handle digi-peaters to be used.
1189 */
1190 if (addr_len > sizeof(struct sockaddr_ax25) &&
1191 fsa->fsa_ax25.sax25_ndigis != 0) {
1192 /* Valid number of digipeaters ? */
Peilin Ye2f2a7ff2020-07-22 11:19:01 -04001193 if (fsa->fsa_ax25.sax25_ndigis < 1 ||
Dan Carpenter17ad73e2020-07-23 17:49:57 +03001194 fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS ||
Peilin Ye2f2a7ff2020-07-22 11:19:01 -04001195 addr_len < sizeof(struct sockaddr_ax25) +
1196 sizeof(ax25_address) * fsa->fsa_ax25.sax25_ndigis) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 err = -EINVAL;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001198 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199 }
1200
1201 if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
1202 err = -ENOBUFS;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001203 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001204 }
1205
1206 digi->ndigi = fsa->fsa_ax25.sax25_ndigis;
1207 digi->lastrepeat = -1;
1208
1209 while (ct < fsa->fsa_ax25.sax25_ndigis) {
1210 if ((fsa->fsa_digipeater[ct].ax25_call[6] &
1211 AX25_HBIT) && ax25->iamdigi) {
1212 digi->repeated[ct] = 1;
1213 digi->lastrepeat = ct;
1214 } else {
1215 digi->repeated[ct] = 0;
1216 }
1217 digi->calls[ct] = fsa->fsa_digipeater[ct];
1218 ct++;
1219 }
1220 }
1221
1222 /*
1223 * Must bind first - autobinding in this may or may not work. If
1224 * the socket is already bound, check to see if the device has
1225 * been filled in, error if it hasn't.
1226 */
1227 if (sock_flag(sk, SOCK_ZAPPED)) {
1228 /* check if we can remove this feature. It is broken. */
1229 printk(KERN_WARNING "ax25_connect(): %s uses autobind, please contact jreuter@yaina.de\n",
1230 current->comm);
1231 if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) {
1232 kfree(digi);
Ralf Baechle75606dc2007-04-20 16:06:45 -07001233 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001234 }
1235
1236 ax25_fillin_cb(ax25, ax25->ax25_dev);
1237 ax25_cb_add(ax25);
1238 } else {
1239 if (ax25->ax25_dev == NULL) {
1240 kfree(digi);
1241 err = -EHOSTUNREACH;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001242 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243 }
1244 }
1245
1246 if (sk->sk_type == SOCK_SEQPACKET &&
1247 (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +09001248 ax25->ax25_dev->dev))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001249 kfree(digi);
1250 err = -EADDRINUSE; /* Already such a connection */
1251 ax25_cb_put(ax25t);
Ralf Baechle75606dc2007-04-20 16:06:45 -07001252 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253 }
1254
1255 ax25->dest_addr = fsa->fsa_ax25.sax25_call;
1256 ax25->digipeat = digi;
1257
1258 /* First the easy one */
1259 if (sk->sk_type != SOCK_SEQPACKET) {
1260 sock->state = SS_CONNECTED;
1261 sk->sk_state = TCP_ESTABLISHED;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001262 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263 }
1264
1265 /* Move to connecting socket, ax.25 lapb WAIT_UA.. */
1266 sock->state = SS_CONNECTING;
1267 sk->sk_state = TCP_SYN_SENT;
1268
1269 switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1270 case AX25_PROTO_STD_SIMPLEX:
1271 case AX25_PROTO_STD_DUPLEX:
1272 ax25_std_establish_data_link(ax25);
1273 break;
1274
1275#ifdef CONFIG_AX25_DAMA_SLAVE
1276 case AX25_PROTO_DAMA_SLAVE:
1277 ax25->modulus = AX25_MODULUS;
1278 ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
1279 if (ax25->ax25_dev->dama.slave)
1280 ax25_ds_establish_data_link(ax25);
1281 else
1282 ax25_std_establish_data_link(ax25);
1283 break;
1284#endif
1285 }
1286
1287 ax25->state = AX25_STATE_1;
1288
1289 ax25_start_heartbeat(ax25);
1290
1291 /* Now the loop */
1292 if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) {
1293 err = -EINPROGRESS;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001294 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295 }
1296
1297 if (sk->sk_state == TCP_SYN_SENT) {
Ralf Baechle75606dc2007-04-20 16:06:45 -07001298 DEFINE_WAIT(wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001299
Linus Torvalds1da177e2005-04-16 15:20:36 -07001300 for (;;) {
Eric Dumazetaa395142010-04-20 13:03:51 +00001301 prepare_to_wait(sk_sleep(sk), &wait,
YOSHIFUJI Hideakibd3b0712007-07-19 10:43:13 +09001302 TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001303 if (sk->sk_state != TCP_SYN_SENT)
1304 break;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001305 if (!signal_pending(current)) {
1306 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 schedule();
1308 lock_sock(sk);
1309 continue;
1310 }
Ralf Baechle75606dc2007-04-20 16:06:45 -07001311 err = -ERESTARTSYS;
1312 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001313 }
Eric Dumazetaa395142010-04-20 13:03:51 +00001314 finish_wait(sk_sleep(sk), &wait);
Ralf Baechle75606dc2007-04-20 16:06:45 -07001315
1316 if (err)
1317 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001318 }
1319
1320 if (sk->sk_state != TCP_ESTABLISHED) {
1321 /* Not in ABM, not in WAIT_UA -> failed */
1322 sock->state = SS_UNCONNECTED;
1323 err = sock_error(sk); /* Always set at this point */
Ralf Baechle75606dc2007-04-20 16:06:45 -07001324 goto out_release;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001325 }
1326
1327 sock->state = SS_CONNECTED;
1328
Ralf Baechle75606dc2007-04-20 16:06:45 -07001329 err = 0;
1330out_release:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331 release_sock(sk);
1332
1333 return err;
1334}
1335
David Howellscdfbabf2017-03-09 08:09:05 +00001336static int ax25_accept(struct socket *sock, struct socket *newsock, int flags,
1337 bool kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339 struct sk_buff *skb;
1340 struct sock *newsk;
Ralf Baechle75606dc2007-04-20 16:06:45 -07001341 DEFINE_WAIT(wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001342 struct sock *sk;
1343 int err = 0;
1344
1345 if (sock->state != SS_UNCONNECTED)
1346 return -EINVAL;
1347
1348 if ((sk = sock->sk) == NULL)
1349 return -EINVAL;
1350
1351 lock_sock(sk);
1352 if (sk->sk_type != SOCK_SEQPACKET) {
1353 err = -EOPNOTSUPP;
1354 goto out;
1355 }
1356
1357 if (sk->sk_state != TCP_LISTEN) {
1358 err = -EINVAL;
1359 goto out;
1360 }
1361
1362 /*
1363 * The read queue this time is holding sockets ready to use
1364 * hooked into the SABM we saved
1365 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366 for (;;) {
Eric Dumazetaa395142010-04-20 13:03:51 +00001367 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368 skb = skb_dequeue(&sk->sk_receive_queue);
1369 if (skb)
1370 break;
1371
Linus Torvalds1da177e2005-04-16 15:20:36 -07001372 if (flags & O_NONBLOCK) {
Ralf Baechle75606dc2007-04-20 16:06:45 -07001373 err = -EWOULDBLOCK;
1374 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001375 }
Ralf Baechle75606dc2007-04-20 16:06:45 -07001376 if (!signal_pending(current)) {
1377 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378 schedule();
1379 lock_sock(sk);
1380 continue;
1381 }
Ralf Baechle75606dc2007-04-20 16:06:45 -07001382 err = -ERESTARTSYS;
1383 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001384 }
Eric Dumazetaa395142010-04-20 13:03:51 +00001385 finish_wait(sk_sleep(sk), &wait);
Ralf Baechle75606dc2007-04-20 16:06:45 -07001386
1387 if (err)
1388 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389
1390 newsk = skb->sk;
David S. Miller9375cb82008-06-17 02:20:54 -07001391 sock_graft(newsk, newsock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392
1393 /* Now attach up the new socket */
1394 kfree_skb(skb);
Eric Dumazet7976a112019-11-05 14:11:52 -08001395 sk_acceptq_removed(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396 newsock->state = SS_CONNECTED;
1397
1398out:
1399 release_sock(sk);
1400
1401 return err;
1402}
1403
1404static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +01001405 int peer)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001406{
1407 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1408 struct sock *sk = sock->sk;
1409 unsigned char ndigi, i;
1410 ax25_cb *ax25;
1411 int err = 0;
1412
Kees Cook5b919f82011-01-12 00:34:49 -08001413 memset(fsa, 0, sizeof(*fsa));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 lock_sock(sk);
David Miller32003922015-06-25 06:19:07 -07001415 ax25 = sk_to_ax25(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001416
1417 if (peer != 0) {
1418 if (sk->sk_state != TCP_ESTABLISHED) {
1419 err = -ENOTCONN;
1420 goto out;
1421 }
1422
1423 fsa->fsa_ax25.sax25_family = AF_AX25;
1424 fsa->fsa_ax25.sax25_call = ax25->dest_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425
1426 if (ax25->digipeat != NULL) {
1427 ndigi = ax25->digipeat->ndigi;
1428 fsa->fsa_ax25.sax25_ndigis = ndigi;
1429 for (i = 0; i < ndigi; i++)
1430 fsa->fsa_digipeater[i] =
1431 ax25->digipeat->calls[i];
1432 }
1433 } else {
1434 fsa->fsa_ax25.sax25_family = AF_AX25;
1435 fsa->fsa_ax25.sax25_call = ax25->source_addr;
1436 fsa->fsa_ax25.sax25_ndigis = 1;
1437 if (ax25->ax25_dev != NULL) {
1438 memcpy(&fsa->fsa_digipeater[0],
1439 ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
1440 } else {
1441 fsa->fsa_digipeater[0] = null_ax25_address;
1442 }
1443 }
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +01001444 err = sizeof (struct full_sockaddr_ax25);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445
1446out:
1447 release_sock(sk);
1448
1449 return err;
1450}
1451
Ying Xue1b784142015-03-02 15:37:48 +08001452static int ax25_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001454 DECLARE_SOCKADDR(struct sockaddr_ax25 *, usax, msg->msg_name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455 struct sock *sk = sock->sk;
1456 struct sockaddr_ax25 sax;
1457 struct sk_buff *skb;
1458 ax25_digi dtmp, *dp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459 ax25_cb *ax25;
1460 size_t size;
1461 int lv, err, addr_len = msg->msg_namelen;
1462
1463 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
1464 return -EINVAL;
1465
1466 lock_sock(sk);
David Miller32003922015-06-25 06:19:07 -07001467 ax25 = sk_to_ax25(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468
1469 if (sock_flag(sk, SOCK_ZAPPED)) {
1470 err = -EADDRNOTAVAIL;
1471 goto out;
1472 }
1473
1474 if (sk->sk_shutdown & SEND_SHUTDOWN) {
1475 send_sig(SIGPIPE, current, 0);
1476 err = -EPIPE;
1477 goto out;
1478 }
1479
1480 if (ax25->ax25_dev == NULL) {
1481 err = -ENETUNREACH;
1482 goto out;
1483 }
1484
1485 if (len > ax25->ax25_dev->dev->mtu) {
1486 err = -EMSGSIZE;
1487 goto out;
1488 }
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +09001489
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 if (usax != NULL) {
1491 if (usax->sax25_family != AF_AX25) {
1492 err = -EINVAL;
1493 goto out;
1494 }
1495
maximilian attems27d1cba2008-01-10 03:57:29 -08001496 if (addr_len == sizeof(struct sockaddr_ax25))
1497 /* ax25_sendmsg(): uses obsolete socket structure */
1498 ;
1499 else if (addr_len != sizeof(struct full_sockaddr_ax25))
1500 /* support for old structure may go away some time
1501 * ax25_sendmsg(): uses old (6 digipeater)
1502 * socket structure.
1503 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +09001505 (addr_len > sizeof(struct full_sockaddr_ax25))) {
1506 err = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001507 goto out;
1508 }
1509
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510
1511 if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
1512 int ct = 0;
1513 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
1514
1515 /* Valid number of digipeaters ? */
Dan Carpenter17ad73e2020-07-23 17:49:57 +03001516 if (usax->sax25_ndigis < 1 ||
1517 usax->sax25_ndigis > AX25_MAX_DIGIS ||
1518 addr_len < sizeof(struct sockaddr_ax25) +
Peilin Ye8885bb02020-07-22 12:05:12 -04001519 sizeof(ax25_address) * usax->sax25_ndigis) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520 err = -EINVAL;
1521 goto out;
1522 }
1523
1524 dtmp.ndigi = usax->sax25_ndigis;
1525
1526 while (ct < usax->sax25_ndigis) {
1527 dtmp.repeated[ct] = 0;
1528 dtmp.calls[ct] = fsa->fsa_digipeater[ct];
1529 ct++;
1530 }
1531
1532 dtmp.lastrepeat = 0;
1533 }
1534
1535 sax = *usax;
1536 if (sk->sk_type == SOCK_SEQPACKET &&
1537 ax25cmp(&ax25->dest_addr, &sax.sax25_call)) {
1538 err = -EISCONN;
1539 goto out;
1540 }
1541 if (usax->sax25_ndigis == 0)
1542 dp = NULL;
1543 else
1544 dp = &dtmp;
1545 } else {
1546 /*
1547 * FIXME: 1003.1g - if the socket is like this because
1548 * it has become closed (not started closed) and is VC
1549 * we ought to SIGPIPE, EPIPE
1550 */
1551 if (sk->sk_state != TCP_ESTABLISHED) {
1552 err = -ENOTCONN;
1553 goto out;
1554 }
1555 sax.sax25_family = AF_AX25;
1556 sax.sax25_call = ax25->dest_addr;
1557 dp = ax25->digipeat;
1558 }
1559
Linus Torvalds1da177e2005-04-16 15:20:36 -07001560 /* Build a packet */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001561 /* Assume the worst case */
1562 size = len + ax25->ax25_dev->dev->hard_header_len;
1563
1564 skb = sock_alloc_send_skb(sk, size, msg->msg_flags&MSG_DONTWAIT, &err);
1565 if (skb == NULL)
1566 goto out;
1567
1568 skb_reserve(skb, size - len);
1569
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570 /* User data follows immediately after the AX.25 data */
Al Viro6ce8e9c2014-04-06 21:25:44 -04001571 if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572 err = -EFAULT;
1573 kfree_skb(skb);
1574 goto out;
1575 }
1576
Arnaldo Carvalho de Meloc1d2bbe2007-04-10 20:45:18 -07001577 skb_reset_network_header(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001578
1579 /* Add the PID if one is not supplied by the user in the skb */
Arnaldo Carvalho de Melo967b05f2007-03-13 13:51:52 -03001580 if (!ax25->pidincl)
Johannes Bergd58ff352017-06-16 14:29:23 +02001581 *(u8 *)skb_push(skb, 1) = sk->sk_protocol;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582
Linus Torvalds1da177e2005-04-16 15:20:36 -07001583 if (sk->sk_type == SOCK_SEQPACKET) {
1584 /* Connected mode sockets go via the LAPB machine */
1585 if (sk->sk_state != TCP_ESTABLISHED) {
1586 kfree_skb(skb);
1587 err = -ENOTCONN;
1588 goto out;
1589 }
1590
1591 /* Shove it onto the queue and kick */
1592 ax25_output(ax25, ax25->paclen, skb);
1593
1594 err = len;
1595 goto out;
1596 }
1597
Arnaldo Carvalho de Melo967b05f2007-03-13 13:51:52 -03001598 skb_push(skb, 1 + ax25_addr_size(dp));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599
Ralf Baechle8849b722011-04-14 00:20:07 -07001600 /* Building AX.25 Header */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001601
1602 /* Build an AX.25 header */
Arnaldo Carvalho de Melo967b05f2007-03-13 13:51:52 -03001603 lv = ax25_addr_build(skb->data, &ax25->source_addr, &sax.sax25_call,
1604 dp, AX25_COMMAND, AX25_MODULUS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001605
Arnaldo Carvalho de Melo967b05f2007-03-13 13:51:52 -03001606 skb_set_transport_header(skb, lv);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001607
Arnaldo Carvalho de Melo9c702202007-04-25 18:04:18 -07001608 *skb_transport_header(skb) = AX25_UI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609
1610 /* Datagram frames go straight out of the door as UI */
Arnaldo Carvalho de Melo29c4be52005-04-21 16:46:56 -07001611 ax25_queue_xmit(skb, ax25->ax25_dev->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612
1613 err = len;
1614
1615out:
1616 release_sock(sk);
1617
1618 return err;
1619}
1620
Ying Xue1b784142015-03-02 15:37:48 +08001621static int ax25_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
1622 int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001623{
1624 struct sock *sk = sock->sk;
1625 struct sk_buff *skb;
1626 int copied;
1627 int err = 0;
1628
1629 lock_sock(sk);
1630 /*
1631 * This works for seqpacket too. The receiver has ordered the
1632 * queue for us! We do one quick check first though
1633 */
1634 if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) {
1635 err = -ENOTCONN;
1636 goto out;
1637 }
1638
1639 /* Now we can treat all alike */
1640 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +09001641 flags & MSG_DONTWAIT, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001642 if (skb == NULL)
1643 goto out;
1644
David Miller32003922015-06-25 06:19:07 -07001645 if (!sk_to_ax25(sk)->pidincl)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646 skb_pull(skb, 1); /* Remove PID */
1647
Arnaldo Carvalho de Melobadff6d2007-03-13 13:06:52 -03001648 skb_reset_transport_header(skb);
1649 copied = skb->len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001650
1651 if (copied > size) {
1652 copied = size;
1653 msg->msg_flags |= MSG_TRUNC;
1654 }
1655
David S. Miller51f3d022014-11-05 16:46:40 -05001656 skb_copy_datagram_msg(skb, 0, msg, copied);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001657
Hannes Frederic Sowaf3d33422013-11-21 03:14:22 +01001658 if (msg->msg_name) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659 ax25_digi digi;
1660 ax25_address src;
Arnaldo Carvalho de Melo98e399f2007-03-19 15:33:04 -07001661 const unsigned char *mac = skb_mac_header(skb);
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001662 DECLARE_SOCKADDR(struct sockaddr_ax25 *, sax, msg->msg_name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001663
Mathias Krauseef3313e2013-04-07 01:51:48 +00001664 memset(sax, 0, sizeof(struct full_sockaddr_ax25));
Arnaldo Carvalho de Melo98e399f2007-03-19 15:33:04 -07001665 ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL,
1666 &digi, NULL, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001667 sax->sax25_family = AF_AX25;
1668 /* We set this correctly, even though we may not let the
1669 application know the digi calls further down (because it
1670 did NOT ask to know them). This could get political... **/
1671 sax->sax25_ndigis = digi.ndigi;
1672 sax->sax25_call = src;
1673
1674 if (sax->sax25_ndigis != 0) {
1675 int ct;
1676 struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
1677
1678 for (ct = 0; ct < digi.ndigi; ct++)
1679 fsa->fsa_digipeater[ct] = digi.calls[ct];
1680 }
1681 msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
1682 }
1683
1684 skb_free_datagram(sk, skb);
1685 err = copied;
1686
1687out:
1688 release_sock(sk);
1689
1690 return err;
1691}
1692
1693static int ax25_shutdown(struct socket *sk, int how)
1694{
1695 /* FIXME - generate DM and RNR states */
1696 return -EOPNOTSUPP;
1697}
1698
1699static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1700{
1701 struct sock *sk = sock->sk;
1702 void __user *argp = (void __user *)arg;
1703 int res = 0;
1704
1705 lock_sock(sk);
1706 switch (cmd) {
1707 case TIOCOUTQ: {
1708 long amount;
Eric Dumazet31e6d362009-06-17 19:05:41 -07001709
1710 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001711 if (amount < 0)
1712 amount = 0;
1713 res = put_user(amount, (int __user *)argp);
1714 break;
1715 }
1716
1717 case TIOCINQ: {
1718 struct sk_buff *skb;
1719 long amount = 0L;
1720 /* These two are safe on a single CPU system as only user tasks fiddle here */
1721 if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1722 amount = skb->len;
Ralf Baechle20b7d102005-09-12 14:24:55 -07001723 res = put_user(amount, (int __user *) argp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724 break;
1725 }
1726
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727 case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */
1728 case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */
1729 case SIOCAX25GETUID: {
1730 struct sockaddr_ax25 sax25;
1731 if (copy_from_user(&sax25, argp, sizeof(sax25))) {
1732 res = -EFAULT;
1733 break;
1734 }
1735 res = ax25_uid_ioctl(cmd, &sax25);
1736 break;
1737 }
1738
1739 case SIOCAX25NOUID: { /* Set the default policy (default/bar) */
1740 long amount;
1741 if (!capable(CAP_NET_ADMIN)) {
1742 res = -EPERM;
1743 break;
1744 }
1745 if (get_user(amount, (long __user *)argp)) {
1746 res = -EFAULT;
1747 break;
1748 }
Dan Carpenter76887752013-10-18 12:06:56 +03001749 if (amount < 0 || amount > AX25_NOUID_BLOCK) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001750 res = -EINVAL;
1751 break;
1752 }
1753 ax25_uid_policy = amount;
1754 res = 0;
1755 break;
1756 }
1757
1758 case SIOCADDRT:
1759 case SIOCDELRT:
1760 case SIOCAX25OPTRT:
1761 if (!capable(CAP_NET_ADMIN)) {
1762 res = -EPERM;
1763 break;
1764 }
1765 res = ax25_rt_ioctl(cmd, argp);
1766 break;
1767
1768 case SIOCAX25CTLCON:
1769 if (!capable(CAP_NET_ADMIN)) {
1770 res = -EPERM;
1771 break;
1772 }
1773 res = ax25_ctl_ioctl(cmd, argp);
1774 break;
1775
1776 case SIOCAX25GETINFO:
1777 case SIOCAX25GETINFOOLD: {
David Miller32003922015-06-25 06:19:07 -07001778 ax25_cb *ax25 = sk_to_ax25(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779 struct ax25_info_struct ax25_info;
1780
1781 ax25_info.t1 = ax25->t1 / HZ;
1782 ax25_info.t2 = ax25->t2 / HZ;
1783 ax25_info.t3 = ax25->t3 / HZ;
1784 ax25_info.idle = ax25->idle / (60 * HZ);
1785 ax25_info.n2 = ax25->n2;
1786 ax25_info.t1timer = ax25_display_timer(&ax25->t1timer) / HZ;
1787 ax25_info.t2timer = ax25_display_timer(&ax25->t2timer) / HZ;
1788 ax25_info.t3timer = ax25_display_timer(&ax25->t3timer) / HZ;
1789 ax25_info.idletimer = ax25_display_timer(&ax25->idletimer) / (60 * HZ);
1790 ax25_info.n2count = ax25->n2count;
1791 ax25_info.state = ax25->state;
Eric Dumazet407fc5c2009-09-20 06:32:55 +00001792 ax25_info.rcv_q = sk_rmem_alloc_get(sk);
1793 ax25_info.snd_q = sk_wmem_alloc_get(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001794 ax25_info.vs = ax25->vs;
1795 ax25_info.vr = ax25->vr;
1796 ax25_info.va = ax25->va;
1797 ax25_info.vs_max = ax25->vs; /* reserved */
1798 ax25_info.paclen = ax25->paclen;
1799 ax25_info.window = ax25->window;
1800
1801 /* old structure? */
1802 if (cmd == SIOCAX25GETINFOOLD) {
1803 static int warned = 0;
1804 if (!warned) {
1805 printk(KERN_INFO "%s uses old SIOCAX25GETINFO\n",
1806 current->comm);
1807 warned=1;
1808 }
1809
1810 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct_deprecated))) {
1811 res = -EFAULT;
1812 break;
1813 }
1814 } else {
1815 if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct))) {
1816 res = -EINVAL;
1817 break;
1818 }
1819 }
1820 res = 0;
1821 break;
1822 }
1823
1824 case SIOCAX25ADDFWD:
1825 case SIOCAX25DELFWD: {
1826 struct ax25_fwd_struct ax25_fwd;
1827 if (!capable(CAP_NET_ADMIN)) {
1828 res = -EPERM;
1829 break;
1830 }
1831 if (copy_from_user(&ax25_fwd, argp, sizeof(ax25_fwd))) {
1832 res = -EFAULT;
1833 break;
1834 }
1835 res = ax25_fwd_ioctl(cmd, &ax25_fwd);
1836 break;
1837 }
1838
1839 case SIOCGIFADDR:
1840 case SIOCSIFADDR:
1841 case SIOCGIFDSTADDR:
1842 case SIOCSIFDSTADDR:
1843 case SIOCGIFBRDADDR:
1844 case SIOCSIFBRDADDR:
1845 case SIOCGIFNETMASK:
1846 case SIOCSIFNETMASK:
1847 case SIOCGIFMETRIC:
1848 case SIOCSIFMETRIC:
1849 res = -EINVAL;
1850 break;
1851
1852 default:
Christoph Hellwigb5e5fa52006-01-03 14:18:33 -08001853 res = -ENOIOCTLCMD;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001854 break;
1855 }
1856 release_sock(sk);
1857
1858 return res;
1859}
1860
1861#ifdef CONFIG_PROC_FS
1862
1863static void *ax25_info_start(struct seq_file *seq, loff_t *pos)
Eric Dumazetf16f3022008-01-13 22:29:41 -08001864 __acquires(ax25_list_lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001865{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001866 spin_lock_bh(&ax25_list_lock);
Li Zefanb512f3d2010-02-08 23:19:59 +00001867 return seq_hlist_start(&ax25_list, *pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001868}
1869
1870static void *ax25_info_next(struct seq_file *seq, void *v, loff_t *pos)
1871{
Li Zefanb512f3d2010-02-08 23:19:59 +00001872 return seq_hlist_next(v, &ax25_list, pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001873}
YOSHIFUJI Hideaki528930b2007-02-09 23:24:31 +09001874
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875static void ax25_info_stop(struct seq_file *seq, void *v)
Eric Dumazetf16f3022008-01-13 22:29:41 -08001876 __releases(ax25_list_lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001877{
1878 spin_unlock_bh(&ax25_list_lock);
1879}
1880
1881static int ax25_info_show(struct seq_file *seq, void *v)
1882{
Li Zefanb512f3d2010-02-08 23:19:59 +00001883 ax25_cb *ax25 = hlist_entry(v, struct ax25_cb, ax25_node);
Ralf Baechlef75268c2005-09-06 15:49:39 -07001884 char buf[11];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001885 int k;
1886
1887
1888 /*
1889 * New format:
1890 * 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
1891 */
1892
Fuqian Huang966cdde2019-04-21 19:48:06 +08001893 seq_printf(seq, "%p %s %s%s ",
1894 ax25,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001895 ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
Ralf Baechlef75268c2005-09-06 15:49:39 -07001896 ax2asc(buf, &ax25->source_addr),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897 ax25->iamdigi? "*":"");
Ralf Baechlef75268c2005-09-06 15:49:39 -07001898 seq_printf(seq, "%s", ax2asc(buf, &ax25->dest_addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001899
1900 for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
1901 seq_printf(seq, ",%s%s",
Ralf Baechlef75268c2005-09-06 15:49:39 -07001902 ax2asc(buf, &ax25->digipeat->calls[k]),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001903 ax25->digipeat->repeated[k]? "*":"");
1904 }
1905
1906 seq_printf(seq, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
1907 ax25->state,
1908 ax25->vs, ax25->vr, ax25->va,
1909 ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
1910 ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
1911 ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
1912 ax25_display_timer(&ax25->idletimer) / (60 * HZ),
1913 ax25->idle / (60 * HZ),
1914 ax25->n2count, ax25->n2,
1915 ax25->rtt / HZ,
1916 ax25->window,
1917 ax25->paclen);
1918
1919 if (ax25->sk != NULL) {
Jarek Poplawski1105b5d2008-02-11 21:24:56 -08001920 seq_printf(seq, " %d %d %lu\n",
Eric Dumazet31e6d362009-06-17 19:05:41 -07001921 sk_wmem_alloc_get(ax25->sk),
1922 sk_rmem_alloc_get(ax25->sk),
Jarek Poplawski1105b5d2008-02-11 21:24:56 -08001923 sock_i_ino(ax25->sk));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001924 } else {
1925 seq_puts(seq, " * * *\n");
1926 }
1927 return 0;
1928}
1929
Philippe De Muyter56b3d972007-07-10 23:07:31 -07001930static const struct seq_operations ax25_info_seqops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001931 .start = ax25_info_start,
1932 .next = ax25_info_next,
1933 .stop = ax25_info_stop,
1934 .show = ax25_info_show,
1935};
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936#endif
1937
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00001938static const struct net_proto_family ax25_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001939 .family = PF_AX25,
1940 .create = ax25_create,
1941 .owner = THIS_MODULE,
1942};
1943
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001944static const struct proto_ops ax25_proto_ops = {
Ralf Baechle46763562005-09-12 14:25:25 -07001945 .family = PF_AX25,
1946 .owner = THIS_MODULE,
1947 .release = ax25_release,
1948 .bind = ax25_bind,
1949 .connect = ax25_connect,
1950 .socketpair = sock_no_socketpair,
1951 .accept = ax25_accept,
1952 .getname = ax25_getname,
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07001953 .poll = datagram_poll,
Ralf Baechle46763562005-09-12 14:25:25 -07001954 .ioctl = ax25_ioctl,
Arnd Bergmannc7cbdbf2019-04-17 22:51:48 +02001955 .gettstamp = sock_gettstamp,
Ralf Baechle46763562005-09-12 14:25:25 -07001956 .listen = ax25_listen,
1957 .shutdown = ax25_shutdown,
1958 .setsockopt = ax25_setsockopt,
1959 .getsockopt = ax25_getsockopt,
1960 .sendmsg = ax25_sendmsg,
1961 .recvmsg = ax25_recvmsg,
1962 .mmap = sock_no_mmap,
1963 .sendpage = sock_no_sendpage,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964};
1965
1966/*
1967 * Called by socket.c on kernel start up
1968 */
Stephen Hemminger7546dd92009-03-09 08:18:29 +00001969static struct packet_type ax25_packet_type __read_mostly = {
Harvey Harrison09640e632009-02-01 00:45:17 -08001970 .type = cpu_to_be16(ETH_P_AX25),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001971 .func = ax25_kiss_rcv,
1972};
1973
1974static struct notifier_block ax25_dev_notifier = {
Jiri Pirko351638e2013-05-28 01:30:21 +00001975 .notifier_call = ax25_device_event,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001976};
1977
Linus Torvalds1da177e2005-04-16 15:20:36 -07001978static int __init ax25_init(void)
1979{
1980 int rc = proto_register(&ax25_proto, 0);
1981
1982 if (rc != 0)
1983 goto out;
1984
1985 sock_register(&ax25_family_ops);
1986 dev_add_pack(&ax25_packet_type);
1987 register_netdevice_notifier(&ax25_dev_notifier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001988
Christoph Hellwigfddda2b2018-04-13 19:44:18 +02001989 proc_create_seq("ax25_route", 0444, init_net.proc_net, &ax25_rt_seqops);
1990 proc_create_seq("ax25", 0444, init_net.proc_net, &ax25_info_seqops);
1991 proc_create_seq("ax25_calls", 0444, init_net.proc_net,
1992 &ax25_uid_seqops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001993out:
1994 return rc;
1995}
1996module_init(ax25_init);
1997
1998
1999MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
2000MODULE_DESCRIPTION("The amateur radio AX.25 link layer protocol");
2001MODULE_LICENSE("GPL");
2002MODULE_ALIAS_NETPROTO(PF_AX25);
2003
2004static void __exit ax25_exit(void)
2005{
Gao fengece31ff2013-02-18 01:34:56 +00002006 remove_proc_entry("ax25_route", init_net.proc_net);
2007 remove_proc_entry("ax25", init_net.proc_net);
2008 remove_proc_entry("ax25_calls", init_net.proc_net);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002009
Linus Torvalds1da177e2005-04-16 15:20:36 -07002010 unregister_netdevice_notifier(&ax25_dev_notifier);
2011
2012 dev_remove_pack(&ax25_packet_type);
2013
2014 sock_unregister(PF_AX25);
2015 proto_unregister(&ax25_proto);
Eric W. Biederman3adadc02012-04-18 16:11:23 +00002016
2017 ax25_rt_free();
2018 ax25_uid_free();
2019 ax25_dev_free();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002020}
2021module_exit(ax25_exit);