~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/ax25/af_ax25.c

Version: ~ [ linux-5.13-rc5 ] ~ [ linux-5.12.9 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.42 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.124 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.193 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.235 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.271 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.271 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  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  */
 16 #include <linux/capability.h>
 17 #include <linux/module.h>
 18 #include <linux/errno.h>
 19 #include <linux/types.h>
 20 #include <linux/socket.h>
 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>
 26 #include <linux/sockios.h>
 27 #include <linux/net.h>
 28 #include <linux/slab.h>
 29 #include <net/ax25.h>
 30 #include <linux/inet.h>
 31 #include <linux/netdevice.h>
 32 #include <linux/if_arp.h>
 33 #include <linux/skbuff.h>
 34 #include <net/sock.h>
 35 #include <asm/uaccess.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/sysctl.h>
 44 #include <linux/init.h>
 45 #include <linux/spinlock.h>
 46 #include <net/net_namespace.h>
 47 #include <net/tcp_states.h>
 48 #include <net/ip.h>
 49 #include <net/arp.h>
 50 
 51 
 52 
 53 HLIST_HEAD(ax25_list);
 54 DEFINE_SPINLOCK(ax25_list_lock);
 55 
 56 static const struct proto_ops ax25_proto_ops;
 57 
 58 static void ax25_free_sock(struct sock *sk)
 59 {
 60         ax25_cb_put(sk_to_ax25(sk));
 61 }
 62 
 63 /*
 64  *      Socket removal during an interrupt is now safe.
 65  */
 66 static 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  */
 79 static void ax25_kill_by_device(struct net_device *dev)
 80 {
 81         ax25_dev *ax25_dev;
 82         ax25_cb *s;
 83 
 84         if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
 85                 return;
 86 
 87         spin_lock_bh(&ax25_list_lock);
 88 again:
 89         ax25_for_each(s, &ax25_list) {
 90                 if (s->ax25_dev == ax25_dev) {
 91                         s->ax25_dev = NULL;
 92                         spin_unlock_bh(&ax25_list_lock);
 93                         ax25_disconnect(s, ENETUNREACH);
 94                         spin_lock_bh(&ax25_list_lock);
 95 
 96                         /* The entry could have been deleted from the
 97                          * list meanwhile and thus the next pointer is
 98                          * no longer valid.  Play it safe and restart
 99                          * the scan.  Forward progress is ensured
100                          * because we set s->ax25_dev to NULL and we
101                          * are never passed a NULL 'dev' argument.
102                          */
103                         goto again;
104                 }
105         }
106         spin_unlock_bh(&ax25_list_lock);
107 }
108 
109 /*
110  *      Handle device status changes.
111  */
112 static int ax25_device_event(struct notifier_block *this, unsigned long event,
113                              void *ptr)
114 {
115         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
116 
117         if (!net_eq(dev_net(dev), &init_net))
118                 return NOTIFY_DONE;
119 
120         /* Reject non AX.25 devices */
121         if (dev->type != ARPHRD_AX25)
122                 return NOTIFY_DONE;
123 
124         switch (event) {
125         case NETDEV_UP:
126                 ax25_dev_device_up(dev);
127                 break;
128         case NETDEV_DOWN:
129                 ax25_kill_by_device(dev);
130                 ax25_rt_device_down(dev);
131                 ax25_dev_device_down(dev);
132                 break;
133         default:
134                 break;
135         }
136 
137         return NOTIFY_DONE;
138 }
139 
140 /*
141  *      Add a socket to the bound sockets list.
142  */
143 void ax25_cb_add(ax25_cb *ax25)
144 {
145         spin_lock_bh(&ax25_list_lock);
146         ax25_cb_hold(ax25);
147         hlist_add_head(&ax25->ax25_node, &ax25_list);
148         spin_unlock_bh(&ax25_list_lock);
149 }
150 
151 /*
152  *      Find a socket that wants to accept the SABM we have just
153  *      received.
154  */
155 struct sock *ax25_find_listener(ax25_address *addr, int digi,
156         struct net_device *dev, int type)
157 {
158         ax25_cb *s;
159 
160         spin_lock(&ax25_list_lock);
161         ax25_for_each(s, &ax25_list) {
162                 if ((s->iamdigi && !digi) || (!s->iamdigi && digi))
163                         continue;
164                 if (s->sk && !ax25cmp(&s->source_addr, addr) &&
165                     s->sk->sk_type == type && s->sk->sk_state == TCP_LISTEN) {
166                         /* If device is null we match any device */
167                         if (s->ax25_dev == NULL || s->ax25_dev->dev == dev) {
168                                 sock_hold(s->sk);
169                                 spin_unlock(&ax25_list_lock);
170                                 return s->sk;
171                         }
172                 }
173         }
174         spin_unlock(&ax25_list_lock);
175 
176         return NULL;
177 }
178 
179 /*
180  *      Find an AX.25 socket given both ends.
181  */
182 struct sock *ax25_get_socket(ax25_address *my_addr, ax25_address *dest_addr,
183         int type)
184 {
185         struct sock *sk = NULL;
186         ax25_cb *s;
187 
188         spin_lock(&ax25_list_lock);
189         ax25_for_each(s, &ax25_list) {
190                 if (s->sk && !ax25cmp(&s->source_addr, my_addr) &&
191                     !ax25cmp(&s->dest_addr, dest_addr) &&
192                     s->sk->sk_type == type) {
193                         sk = s->sk;
194                         sock_hold(sk);
195                         break;
196                 }
197         }
198 
199         spin_unlock(&ax25_list_lock);
200 
201         return sk;
202 }
203 
204 /*
205  *      Find an AX.25 control block given both ends. It will only pick up
206  *      floating AX.25 control blocks or non Raw socket bound control blocks.
207  */
208 ax25_cb *ax25_find_cb(ax25_address *src_addr, ax25_address *dest_addr,
209         ax25_digi *digi, struct net_device *dev)
210 {
211         ax25_cb *s;
212 
213         spin_lock_bh(&ax25_list_lock);
214         ax25_for_each(s, &ax25_list) {
215                 if (s->sk && s->sk->sk_type != SOCK_SEQPACKET)
216                         continue;
217                 if (s->ax25_dev == NULL)
218                         continue;
219                 if (ax25cmp(&s->source_addr, src_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->ax25_dev->dev == dev) {
220                         if (digi != NULL && digi->ndigi != 0) {
221                                 if (s->digipeat == NULL)
222                                         continue;
223                                 if (ax25digicmp(s->digipeat, digi) != 0)
224                                         continue;
225                         } else {
226                                 if (s->digipeat != NULL && s->digipeat->ndigi != 0)
227                                         continue;
228                         }
229                         ax25_cb_hold(s);
230                         spin_unlock_bh(&ax25_list_lock);
231 
232                         return s;
233                 }
234         }
235         spin_unlock_bh(&ax25_list_lock);
236 
237         return NULL;
238 }
239 
240 EXPORT_SYMBOL(ax25_find_cb);
241 
242 void ax25_send_to_raw(ax25_address *addr, struct sk_buff *skb, int proto)
243 {
244         ax25_cb *s;
245         struct sk_buff *copy;
246 
247         spin_lock(&ax25_list_lock);
248         ax25_for_each(s, &ax25_list) {
249                 if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 &&
250                     s->sk->sk_type == SOCK_RAW &&
251                     s->sk->sk_protocol == proto &&
252                     s->ax25_dev->dev == skb->dev &&
253                     atomic_read(&s->sk->sk_rmem_alloc) <= s->sk->sk_rcvbuf) {
254                         if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
255                                 continue;
256                         if (sock_queue_rcv_skb(s->sk, copy) != 0)
257                                 kfree_skb(copy);
258                 }
259         }
260         spin_unlock(&ax25_list_lock);
261 }
262 
263 /*
264  *      Deferred destroy.
265  */
266 void ax25_destroy_socket(ax25_cb *);
267 
268 /*
269  *      Handler for deferred kills.
270  */
271 static void ax25_destroy_timer(unsigned long data)
272 {
273         ax25_cb *ax25=(ax25_cb *)data;
274         struct sock *sk;
275 
276         sk=ax25->sk;
277 
278         bh_lock_sock(sk);
279         sock_hold(sk);
280         ax25_destroy_socket(ax25);
281         bh_unlock_sock(sk);
282         sock_put(sk);
283 }
284 
285 /*
286  *      This is called from user mode and the timers. Thus it protects itself
287  *      against interrupt users but doesn't worry about being called during
288  *      work. Once it is removed from the queue no interrupt or bottom half
289  *      will touch it and we are (fairly 8-) ) safe.
290  */
291 void ax25_destroy_socket(ax25_cb *ax25)
292 {
293         struct sk_buff *skb;
294 
295         ax25_cb_del(ax25);
296 
297         ax25_stop_heartbeat(ax25);
298         ax25_stop_t1timer(ax25);
299         ax25_stop_t2timer(ax25);
300         ax25_stop_t3timer(ax25);
301         ax25_stop_idletimer(ax25);
302 
303         ax25_clear_queues(ax25);        /* Flush the queues */
304 
305         if (ax25->sk != NULL) {
306                 while ((skb = skb_dequeue(&ax25->sk->sk_receive_queue)) != NULL) {
307                         if (skb->sk != ax25->sk) {
308                                 /* A pending connection */
309                                 ax25_cb *sax25 = sk_to_ax25(skb->sk);
310 
311                                 /* Queue the unaccepted socket for death */
312                                 sock_orphan(skb->sk);
313 
314                                 /* 9A4GL: hack to release unaccepted sockets */
315                                 skb->sk->sk_state = TCP_LISTEN;
316 
317                                 ax25_start_heartbeat(sax25);
318                                 sax25->state = AX25_STATE_0;
319                         }
320 
321                         kfree_skb(skb);
322                 }
323                 skb_queue_purge(&ax25->sk->sk_write_queue);
324         }
325 
326         if (ax25->sk != NULL) {
327                 if (sk_has_allocations(ax25->sk)) {
328                         /* Defer: outstanding buffers */
329                         setup_timer(&ax25->dtimer, ax25_destroy_timer,
330                                         (unsigned long)ax25);
331                         ax25->dtimer.expires  = jiffies + 2 * HZ;
332                         add_timer(&ax25->dtimer);
333                 } else {
334                         struct sock *sk=ax25->sk;
335                         ax25->sk=NULL;
336                         sock_put(sk);
337                 }
338         } else {
339                 ax25_cb_put(ax25);
340         }
341 }
342 
343 /*
344  * dl1bke 960311: set parameters for existing AX.25 connections,
345  *                includes a KILL command to abort any connection.
346  *                VERY useful for debugging ;-)
347  */
348 static int ax25_ctl_ioctl(const unsigned int cmd, void __user *arg)
349 {
350         struct ax25_ctl_struct ax25_ctl;
351         ax25_digi digi;
352         ax25_dev *ax25_dev;
353         ax25_cb *ax25;
354         unsigned int k;
355         int ret = 0;
356 
357         if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
358                 return -EFAULT;
359 
360         if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
361                 return -ENODEV;
362 
363         if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
364                 return -EINVAL;
365 
366         if (ax25_ctl.arg > ULONG_MAX / HZ && ax25_ctl.cmd != AX25_KILL)
367                 return -EINVAL;
368 
369         digi.ndigi = ax25_ctl.digi_count;
370         for (k = 0; k < digi.ndigi; k++)
371                 digi.calls[k] = ax25_ctl.digi_addr[k];
372 
373         if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
374                 return -ENOTCONN;
375 
376         switch (ax25_ctl.cmd) {
377         case AX25_KILL:
378                 ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
379 #ifdef CONFIG_AX25_DAMA_SLAVE
380                 if (ax25_dev->dama.slave && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
381                         ax25_dama_off(ax25);
382 #endif
383                 ax25_disconnect(ax25, ENETRESET);
384                 break;
385 
386         case AX25_WINDOW:
387                 if (ax25->modulus == AX25_MODULUS) {
388                         if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
389                                 goto einval_put;
390                 } else {
391                         if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
392                                 goto einval_put;
393                 }
394                 ax25->window = ax25_ctl.arg;
395                 break;
396 
397         case AX25_T1:
398                 if (ax25_ctl.arg < 1 || ax25_ctl.arg > ULONG_MAX / HZ)
399                         goto einval_put;
400                 ax25->rtt = (ax25_ctl.arg * HZ) / 2;
401                 ax25->t1  = ax25_ctl.arg * HZ;
402                 break;
403 
404         case AX25_T2:
405                 if (ax25_ctl.arg < 1 || ax25_ctl.arg > ULONG_MAX / HZ)
406                         goto einval_put;
407                 ax25->t2 = ax25_ctl.arg * HZ;
408                 break;
409 
410         case AX25_N2:
411                 if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
412                         goto einval_put;
413                 ax25->n2count = 0;
414                 ax25->n2 = ax25_ctl.arg;
415                 break;
416 
417         case AX25_T3:
418                 if (ax25_ctl.arg > ULONG_MAX / HZ)
419                         goto einval_put;
420                 ax25->t3 = ax25_ctl.arg * HZ;
421                 break;
422 
423         case AX25_IDLE:
424                 if (ax25_ctl.arg > ULONG_MAX / (60 * HZ))
425                         goto einval_put;
426 
427                 ax25->idle = ax25_ctl.arg * 60 * HZ;
428                 break;
429 
430         case AX25_PACLEN:
431                 if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
432                         goto einval_put;
433                 ax25->paclen = ax25_ctl.arg;
434                 break;
435 
436         default:
437                 goto einval_put;
438           }
439 
440 out_put:
441         ax25_cb_put(ax25);
442         return ret;
443 
444 einval_put:
445         ret = -EINVAL;
446         goto out_put;
447 }
448 
449 static void ax25_fillin_cb_from_dev(ax25_cb *ax25, ax25_dev *ax25_dev)
450 {
451         ax25->rtt     = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]) / 2;
452         ax25->t1      = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]);
453         ax25->t2      = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T2]);
454         ax25->t3      = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T3]);
455         ax25->n2      = ax25_dev->values[AX25_VALUES_N2];
456         ax25->paclen  = ax25_dev->values[AX25_VALUES_PACLEN];
457         ax25->idle    = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_IDLE]);
458         ax25->backoff = ax25_dev->values[AX25_VALUES_BACKOFF];
459 
460         if (ax25_dev->values[AX25_VALUES_AXDEFMODE]) {
461                 ax25->modulus = AX25_EMODULUS;
462                 ax25->window  = ax25_dev->values[AX25_VALUES_EWINDOW];
463         } else {
464                 ax25->modulus = AX25_MODULUS;
465                 ax25->window  = ax25_dev->values[AX25_VALUES_WINDOW];
466         }
467 }
468 
469 /*
470  *      Fill in a created AX.25 created control block with the default
471  *      values for a particular device.
472  */
473 void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
474 {
475         ax25->ax25_dev = ax25_dev;
476 
477         if (ax25->ax25_dev != NULL) {
478                 ax25_fillin_cb_from_dev(ax25, ax25_dev);
479                 return;
480         }
481 
482         /*
483          * No device, use kernel / AX.25 spec default values
484          */
485         ax25->rtt     = msecs_to_jiffies(AX25_DEF_T1) / 2;
486         ax25->t1      = msecs_to_jiffies(AX25_DEF_T1);
487         ax25->t2      = msecs_to_jiffies(AX25_DEF_T2);
488         ax25->t3      = msecs_to_jiffies(AX25_DEF_T3);
489         ax25->n2      = AX25_DEF_N2;
490         ax25->paclen  = AX25_DEF_PACLEN;
491         ax25->idle    = msecs_to_jiffies(AX25_DEF_IDLE);
492         ax25->backoff = AX25_DEF_BACKOFF;
493 
494         if (AX25_DEF_AXDEFMODE) {
495                 ax25->modulus = AX25_EMODULUS;
496                 ax25->window  = AX25_DEF_EWINDOW;
497         } else {
498                 ax25->modulus = AX25_MODULUS;
499                 ax25->window  = AX25_DEF_WINDOW;
500         }
501 }
502 
503 /*
504  * Create an empty AX.25 control block.
505  */
506 ax25_cb *ax25_create_cb(void)
507 {
508         ax25_cb *ax25;
509 
510         if ((ax25 = kzalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
511                 return NULL;
512 
513         atomic_set(&ax25->refcount, 1);
514 
515         skb_queue_head_init(&ax25->write_queue);
516         skb_queue_head_init(&ax25->frag_queue);
517         skb_queue_head_init(&ax25->ack_queue);
518         skb_queue_head_init(&ax25->reseq_queue);
519 
520         ax25_setup_timers(ax25);
521 
522         ax25_fillin_cb(ax25, NULL);
523 
524         ax25->state = AX25_STATE_0;
525 
526         return ax25;
527 }
528 
529 /*
530  *      Handling for system calls applied via the various interfaces to an
531  *      AX25 socket object
532  */
533 
534 static int ax25_setsockopt(struct socket *sock, int level, int optname,
535         char __user *optval, unsigned int optlen)
536 {
537         struct sock *sk = sock->sk;
538         ax25_cb *ax25;
539         struct net_device *dev;
540         char devname[IFNAMSIZ];
541         unsigned long opt;
542         int res = 0;
543 
544         if (level != SOL_AX25)
545                 return -ENOPROTOOPT;
546 
547         if (optlen < sizeof(unsigned int))
548                 return -EINVAL;
549 
550         if (get_user(opt, (unsigned int __user *)optval))
551                 return -EFAULT;
552 
553         lock_sock(sk);
554         ax25 = sk_to_ax25(sk);
555 
556         switch (optname) {
557         case AX25_WINDOW:
558                 if (ax25->modulus == AX25_MODULUS) {
559                         if (opt < 1 || opt > 7) {
560                                 res = -EINVAL;
561                                 break;
562                         }
563                 } else {
564                         if (opt < 1 || opt > 63) {
565                                 res = -EINVAL;
566                                 break;
567                         }
568                 }
569                 ax25->window = opt;
570                 break;
571 
572         case AX25_T1:
573                 if (opt < 1 || opt > ULONG_MAX / HZ) {
574                         res = -EINVAL;
575                         break;
576                 }
577                 ax25->rtt = (opt * HZ) >> 1;
578                 ax25->t1  = opt * HZ;
579                 break;
580 
581         case AX25_T2:
582                 if (opt < 1 || opt > ULONG_MAX / HZ) {
583                         res = -EINVAL;
584                         break;
585                 }
586                 ax25->t2 = opt * HZ;
587                 break;
588 
589         case AX25_N2:
590                 if (opt < 1 || opt > 31) {
591                         res = -EINVAL;
592                         break;
593                 }
594                 ax25->n2 = opt;
595                 break;
596 
597         case AX25_T3:
598                 if (opt < 1 || opt > ULONG_MAX / HZ) {
599                         res = -EINVAL;
600                         break;
601                 }
602                 ax25->t3 = opt * HZ;
603                 break;
604 
605         case AX25_IDLE:
606                 if (opt > ULONG_MAX / (60 * HZ)) {
607                         res = -EINVAL;
608                         break;
609                 }
610                 ax25->idle = opt * 60 * HZ;
611                 break;
612 
613         case AX25_BACKOFF:
614                 if (opt > 2) {
615                         res = -EINVAL;
616                         break;
617                 }
618                 ax25->backoff = opt;
619                 break;
620 
621         case AX25_EXTSEQ:
622                 ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
623                 break;
624 
625         case AX25_PIDINCL:
626                 ax25->pidincl = opt ? 1 : 0;
627                 break;
628 
629         case AX25_IAMDIGI:
630                 ax25->iamdigi = opt ? 1 : 0;
631                 break;
632 
633         case AX25_PACLEN:
634                 if (opt < 16 || opt > 65535) {
635                         res = -EINVAL;
636                         break;
637                 }
638                 ax25->paclen = opt;
639                 break;
640 
641         case SO_BINDTODEVICE:
642                 if (optlen > IFNAMSIZ)
643                         optlen = IFNAMSIZ;
644 
645                 if (copy_from_user(devname, optval, optlen)) {
646                         res = -EFAULT;
647                         break;
648                 }
649 
650                 if (sk->sk_type == SOCK_SEQPACKET &&
651                    (sock->state != SS_UNCONNECTED ||
652                     sk->sk_state == TCP_LISTEN)) {
653                         res = -EADDRNOTAVAIL;
654                         break;
655                 }
656 
657                 dev = dev_get_by_name(&init_net, devname);
658                 if (!dev) {
659                         res = -ENODEV;
660                         break;
661                 }
662 
663                 ax25->ax25_dev = ax25_dev_ax25dev(dev);
664                 ax25_fillin_cb(ax25, ax25->ax25_dev);
665                 dev_put(dev);
666                 break;
667 
668         default:
669                 res = -ENOPROTOOPT;
670         }
671         release_sock(sk);
672 
673         return res;
674 }
675 
676 static int ax25_getsockopt(struct socket *sock, int level, int optname,
677         char __user *optval, int __user *optlen)
678 {
679         struct sock *sk = sock->sk;
680         ax25_cb *ax25;
681         struct ax25_dev *ax25_dev;
682         char devname[IFNAMSIZ];
683         void *valptr;
684         int val = 0;
685         int maxlen, length;
686 
687         if (level != SOL_AX25)
688                 return -ENOPROTOOPT;
689 
690         if (get_user(maxlen, optlen))
691                 return -EFAULT;
692 
693         if (maxlen < 1)
694                 return -EFAULT;
695 
696         valptr = (void *) &val;
697         length = min_t(unsigned int, maxlen, sizeof(int));
698 
699         lock_sock(sk);
700         ax25 = sk_to_ax25(sk);
701 
702         switch (optname) {
703         case AX25_WINDOW:
704                 val = ax25->window;
705                 break;
706 
707         case AX25_T1:
708                 val = ax25->t1 / HZ;
709                 break;
710 
711         case AX25_T2:
712                 val = ax25->t2 / HZ;
713                 break;
714 
715         case AX25_N2:
716                 val = ax25->n2;
717                 break;
718 
719         case AX25_T3:
720                 val = ax25->t3 / HZ;
721                 break;
722 
723         case AX25_IDLE:
724                 val = ax25->idle / (60 * HZ);
725                 break;
726 
727         case AX25_BACKOFF:
728                 val = ax25->backoff;
729                 break;
730 
731         case AX25_EXTSEQ:
732                 val = (ax25->modulus == AX25_EMODULUS);
733                 break;
734 
735         case AX25_PIDINCL:
736                 val = ax25->pidincl;
737                 break;
738 
739         case AX25_IAMDIGI:
740                 val = ax25->iamdigi;
741                 break;
742 
743         case AX25_PACLEN:
744                 val = ax25->paclen;
745                 break;
746 
747         case SO_BINDTODEVICE:
748                 ax25_dev = ax25->ax25_dev;
749 
750                 if (ax25_dev != NULL && ax25_dev->dev != NULL) {
751                         strlcpy(devname, ax25_dev->dev->name, sizeof(devname));
752                         length = strlen(devname) + 1;
753                 } else {
754                         *devname = '\0';
755                         length = 1;
756                 }
757 
758                 valptr = (void *) devname;
759                 break;
760 
761         default:
762                 release_sock(sk);
763                 return -ENOPROTOOPT;
764         }
765         release_sock(sk);
766 
767         if (put_user(length, optlen))
768                 return -EFAULT;
769 
770         return copy_to_user(optval, valptr, length) ? -EFAULT : 0;
771 }
772 
773 static int ax25_listen(struct socket *sock, int backlog)
774 {
775         struct sock *sk = sock->sk;
776         int res = 0;
777 
778         lock_sock(sk);
779         if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_LISTEN) {
780                 sk->sk_max_ack_backlog = backlog;
781                 sk->sk_state           = TCP_LISTEN;
782                 goto out;
783         }
784         res = -EOPNOTSUPP;
785 
786 out:
787         release_sock(sk);
788 
789         return res;
790 }
791 
792 /*
793  * XXX: when creating ax25_sock we should update the .obj_size setting
794  * below.
795  */
796 static struct proto ax25_proto = {
797         .name     = "AX25",
798         .owner    = THIS_MODULE,
799         .obj_size = sizeof(struct ax25_sock),
800 };
801 
802 static int ax25_create(struct net *net, struct socket *sock, int protocol,
803                        int kern)
804 {
805         struct sock *sk;
806         ax25_cb *ax25;
807 
808         if (protocol < 0 || protocol > SK_PROTOCOL_MAX)
809                 return -EINVAL;
810 
811         if (!net_eq(net, &init_net))
812                 return -EAFNOSUPPORT;
813 
814         switch (sock->type) {
815         case SOCK_DGRAM:
816                 if (protocol == 0 || protocol == PF_AX25)
817                         protocol = AX25_P_TEXT;
818                 break;
819 
820         case SOCK_SEQPACKET:
821                 switch (protocol) {
822                 case 0:
823                 case PF_AX25:   /* For CLX */
824                         protocol = AX25_P_TEXT;
825                         break;
826                 case AX25_P_SEGMENT:
827 #ifdef CONFIG_INET
828                 case AX25_P_ARP:
829                 case AX25_P_IP:
830 #endif
831 #ifdef CONFIG_NETROM
832                 case AX25_P_NETROM:
833 #endif
834 #ifdef CONFIG_ROSE
835                 case AX25_P_ROSE:
836 #endif
837                         return -ESOCKTNOSUPPORT;
838 #ifdef CONFIG_NETROM_MODULE
839                 case AX25_P_NETROM:
840                         if (ax25_protocol_is_registered(AX25_P_NETROM))
841                                 return -ESOCKTNOSUPPORT;
842                         break;
843 #endif
844 #ifdef CONFIG_ROSE_MODULE
845                 case AX25_P_ROSE:
846                         if (ax25_protocol_is_registered(AX25_P_ROSE))
847                                 return -ESOCKTNOSUPPORT;
848 #endif
849                 default:
850                         break;
851                 }
852                 break;
853 
854         case SOCK_RAW:
855                 break;
856         default:
857                 return -ESOCKTNOSUPPORT;
858         }
859 
860         sk = sk_alloc(net, PF_AX25, GFP_ATOMIC, &ax25_proto, kern);
861         if (sk == NULL)
862                 return -ENOMEM;
863 
864         ax25 = ax25_sk(sk)->cb = ax25_create_cb();
865         if (!ax25) {
866                 sk_free(sk);
867                 return -ENOMEM;
868         }
869 
870         sock_init_data(sock, sk);
871 
872         sk->sk_destruct = ax25_free_sock;
873         sock->ops    = &ax25_proto_ops;
874         sk->sk_protocol = protocol;
875 
876         ax25->sk    = sk;
877 
878         return 0;
879 }
880 
881 struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
882 {
883         struct sock *sk;
884         ax25_cb *ax25, *oax25;
885 
886         sk = sk_alloc(sock_net(osk), PF_AX25, GFP_ATOMIC, osk->sk_prot, 0);
887         if (sk == NULL)
888                 return NULL;
889 
890         if ((ax25 = ax25_create_cb()) == NULL) {
891                 sk_free(sk);
892                 return NULL;
893         }
894 
895         switch (osk->sk_type) {
896         case SOCK_DGRAM:
897                 break;
898         case SOCK_SEQPACKET:
899                 break;
900         default:
901                 sk_free(sk);
902                 ax25_cb_put(ax25);
903                 return NULL;
904         }
905 
906         sock_init_data(NULL, sk);
907 
908         sk->sk_type     = osk->sk_type;
909         sk->sk_priority = osk->sk_priority;
910         sk->sk_protocol = osk->sk_protocol;
911         sk->sk_rcvbuf   = osk->sk_rcvbuf;
912         sk->sk_sndbuf   = osk->sk_sndbuf;
913         sk->sk_state    = TCP_ESTABLISHED;
914         sock_copy_flags(sk, osk);
915 
916         oax25 = sk_to_ax25(osk);
917 
918         ax25->modulus = oax25->modulus;
919         ax25->backoff = oax25->backoff;
920         ax25->pidincl = oax25->pidincl;
921         ax25->iamdigi = oax25->iamdigi;
922         ax25->rtt     = oax25->rtt;
923         ax25->t1      = oax25->t1;
924         ax25->t2      = oax25->t2;
925         ax25->t3      = oax25->t3;
926         ax25->n2      = oax25->n2;
927         ax25->idle    = oax25->idle;
928         ax25->paclen  = oax25->paclen;
929         ax25->window  = oax25->window;
930 
931         ax25->ax25_dev    = ax25_dev;
932         ax25->source_addr = oax25->source_addr;
933 
934         if (oax25->digipeat != NULL) {
935                 ax25->digipeat = kmemdup(oax25->digipeat, sizeof(ax25_digi),
936                                          GFP_ATOMIC);
937                 if (ax25->digipeat == NULL) {
938                         sk_free(sk);
939                         ax25_cb_put(ax25);
940                         return NULL;
941                 }
942         }
943 
944         ax25_sk(sk)->cb = ax25;
945         sk->sk_destruct = ax25_free_sock;
946         ax25->sk    = sk;
947 
948         return sk;
949 }
950 
951 static int ax25_release(struct socket *sock)
952 {
953         struct sock *sk = sock->sk;
954         ax25_cb *ax25;
955 
956         if (sk == NULL)
957                 return 0;
958 
959         sock_hold(sk);
960         sock_orphan(sk);
961         lock_sock(sk);
962         ax25 = sk_to_ax25(sk);
963 
964         if (sk->sk_type == SOCK_SEQPACKET) {
965                 switch (ax25->state) {
966                 case AX25_STATE_0:
967                         release_sock(sk);
968                         ax25_disconnect(ax25, 0);
969                         lock_sock(sk);
970                         ax25_destroy_socket(ax25);
971                         break;
972 
973                 case AX25_STATE_1:
974                 case AX25_STATE_2:
975                         ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
976                         release_sock(sk);
977                         ax25_disconnect(ax25, 0);
978                         lock_sock(sk);
979                         ax25_destroy_socket(ax25);
980                         break;
981 
982                 case AX25_STATE_3:
983                 case AX25_STATE_4:
984                         ax25_clear_queues(ax25);
985                         ax25->n2count = 0;
986 
987                         switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
988                         case AX25_PROTO_STD_SIMPLEX:
989                         case AX25_PROTO_STD_DUPLEX:
990                                 ax25_send_control(ax25,
991                                                   AX25_DISC,
992                                                   AX25_POLLON,
993                                                   AX25_COMMAND);
994                                 ax25_stop_t2timer(ax25);
995                                 ax25_stop_t3timer(ax25);
996                                 ax25_stop_idletimer(ax25);
997                                 break;
998 #ifdef CONFIG_AX25_DAMA_SLAVE
999                         case AX25_PROTO_DAMA_SLAVE:
1000                                 ax25_stop_t3timer(ax25);
1001                                 ax25_stop_idletimer(ax25);
1002                                 break;
1003 #endif
1004                         }
1005                         ax25_calculate_t1(ax25);
1006                         ax25_start_t1timer(ax25);
1007                         ax25->state = AX25_STATE_2;
1008                         sk->sk_state                = TCP_CLOSE;
1009                         sk->sk_shutdown            |= SEND_SHUTDOWN;
1010                         sk->sk_state_change(sk);
1011                         sock_set_flag(sk, SOCK_DESTROY);
1012                         break;
1013 
1014                 default:
1015                         break;
1016                 }
1017         } else {
1018                 sk->sk_state     = TCP_CLOSE;
1019                 sk->sk_shutdown |= SEND_SHUTDOWN;
1020                 sk->sk_state_change(sk);
1021                 ax25_destroy_socket(ax25);
1022         }
1023 
1024         sock->sk   = NULL;
1025         release_sock(sk);
1026         sock_put(sk);
1027 
1028         return 0;
1029 }
1030 
1031 /*
1032  *      We support a funny extension here so you can (as root) give any callsign
1033  *      digipeated via a local address as source. This hack is obsolete now
1034  *      that we've implemented support for SO_BINDTODEVICE. It is however small
1035  *      and trivially backward compatible.
1036  */
1037 static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1038 {
1039         struct sock *sk = sock->sk;
1040         struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
1041         ax25_dev *ax25_dev = NULL;
1042         ax25_uid_assoc *user;
1043         ax25_address call;
1044         ax25_cb *ax25;
1045         int err = 0;
1046 
1047         if (addr_len != sizeof(struct sockaddr_ax25) &&
1048             addr_len != sizeof(struct full_sockaddr_ax25))
1049                 /* support for old structure may go away some time
1050                  * ax25_bind(): uses old (6 digipeater) socket structure.
1051                  */
1052                 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1053                     (addr_len > sizeof(struct full_sockaddr_ax25)))
1054                         return -EINVAL;
1055 
1056         if (addr->fsa_ax25.sax25_family != AF_AX25)
1057                 return -EINVAL;
1058 
1059         user = ax25_findbyuid(current_euid());
1060         if (user) {
1061                 call = user->call;
1062                 ax25_uid_put(user);
1063         } else {
1064                 if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
1065                         return -EACCES;
1066 
1067                 call = addr->fsa_ax25.sax25_call;
1068         }
1069 
1070         lock_sock(sk);
1071 
1072         ax25 = sk_to_ax25(sk);
1073         if (!sock_flag(sk, SOCK_ZAPPED)) {
1074                 err = -EINVAL;
1075                 goto out;
1076         }
1077 
1078         ax25->source_addr = call;
1079 
1080         /*
1081          * User already set interface with SO_BINDTODEVICE
1082          */
1083         if (ax25->ax25_dev != NULL)
1084                 goto done;
1085 
1086         if (addr_len > sizeof(struct sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
1087                 if (ax25cmp(&addr->fsa_digipeater[0], &null_ax25_address) != 0 &&
1088                     (ax25_dev = ax25_addr_ax25dev(&addr->fsa_digipeater[0])) == NULL) {
1089                         err = -EADDRNOTAVAIL;
1090                         goto out;
1091                 }
1092         } else {
1093                 if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL) {
1094                         err = -EADDRNOTAVAIL;
1095                         goto out;
1096                 }
1097         }
1098 
1099         if (ax25_dev != NULL)
1100                 ax25_fillin_cb(ax25, ax25_dev);
1101 
1102 done:
1103         ax25_cb_add(ax25);
1104         sock_reset_flag(sk, SOCK_ZAPPED);
1105 
1106 out:
1107         release_sock(sk);
1108 
1109         return err;
1110 }
1111 
1112 /*
1113  *      FIXME: nonblock behaviour looks like it may have a bug.
1114  */
1115 static int __must_check ax25_connect(struct socket *sock,
1116         struct sockaddr *uaddr, int addr_len, int flags)
1117 {
1118         struct sock *sk = sock->sk;
1119         ax25_cb *ax25 = sk_to_ax25(sk), *ax25t;
1120         struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1121         ax25_digi *digi = NULL;
1122         int ct = 0, err = 0;
1123 
1124         /*
1125          * some sanity checks. code further down depends on this
1126          */
1127 
1128         if (addr_len == sizeof(struct sockaddr_ax25))
1129                 /* support for this will go away in early 2.5.x
1130                  * ax25_connect(): uses obsolete socket structure
1131                  */
1132                 ;
1133         else if (addr_len != sizeof(struct full_sockaddr_ax25))
1134                 /* support for old structure may go away some time
1135                  * ax25_connect(): uses old (6 digipeater) socket structure.
1136                  */
1137                 if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1138                     (addr_len > sizeof(struct full_sockaddr_ax25)))
1139                         return -EINVAL;
1140 
1141 
1142         if (fsa->fsa_ax25.sax25_family != AF_AX25)
1143                 return -EINVAL;
1144 
1145         lock_sock(sk);
1146 
1147         /* deal with restarts */
1148         if (sock->state == SS_CONNECTING) {
1149                 switch (sk->sk_state) {
1150                 case TCP_SYN_SENT: /* still trying */
1151                         err = -EINPROGRESS;
1152                         goto out_release;
1153 
1154                 case TCP_ESTABLISHED: /* connection established */
1155                         sock->state = SS_CONNECTED;
1156                         goto out_release;
1157 
1158                 case TCP_CLOSE: /* connection refused */
1159                         sock->state = SS_UNCONNECTED;
1160                         err = -ECONNREFUSED;
1161                         goto out_release;
1162                 }
1163         }
1164 
1165         if (sk->sk_state == TCP_ESTABLISHED && sk->sk_type == SOCK_SEQPACKET) {
1166                 err = -EISCONN; /* No reconnect on a seqpacket socket */
1167                 goto out_release;
1168         }
1169 
1170         sk->sk_state   = TCP_CLOSE;
1171         sock->state = SS_UNCONNECTED;
1172 
1173         kfree(ax25->digipeat);
1174         ax25->digipeat = NULL;
1175 
1176         /*
1177          *      Handle digi-peaters to be used.
1178          */
1179         if (addr_len > sizeof(struct sockaddr_ax25) &&
1180             fsa->fsa_ax25.sax25_ndigis != 0) {
1181                 /* Valid number of digipeaters ? */
1182                 if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS) {
1183                         err = -EINVAL;
1184                         goto out_release;
1185                 }
1186 
1187                 if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
1188                         err = -ENOBUFS;
1189                         goto out_release;
1190                 }
1191 
1192                 digi->ndigi      = fsa->fsa_ax25.sax25_ndigis;
1193                 digi->lastrepeat = -1;
1194 
1195                 while (ct < fsa->fsa_ax25.sax25_ndigis) {
1196                         if ((fsa->fsa_digipeater[ct].ax25_call[6] &
1197                              AX25_HBIT) && ax25->iamdigi) {
1198                                 digi->repeated[ct] = 1;
1199                                 digi->lastrepeat   = ct;
1200                         } else {
1201                                 digi->repeated[ct] = 0;
1202                         }
1203                         digi->calls[ct] = fsa->fsa_digipeater[ct];
1204                         ct++;
1205                 }
1206         }
1207 
1208         /*
1209          *      Must bind first - autobinding in this may or may not work. If
1210          *      the socket is already bound, check to see if the device has
1211          *      been filled in, error if it hasn't.
1212          */
1213         if (sock_flag(sk, SOCK_ZAPPED)) {
1214                 /* check if we can remove this feature. It is broken. */
1215                 printk(KERN_WARNING "ax25_connect(): %s uses autobind, please contact jreuter@yaina.de\n",
1216                         current->comm);
1217                 if ((err = ax25_rt_autobind(ax25, &fsa->fsa_ax25.sax25_call)) < 0) {
1218                         kfree(digi);
1219                         goto out_release;
1220                 }
1221 
1222                 ax25_fillin_cb(ax25, ax25->ax25_dev);
1223                 ax25_cb_add(ax25);
1224         } else {
1225                 if (ax25->ax25_dev == NULL) {
1226                         kfree(digi);
1227                         err = -EHOSTUNREACH;
1228                         goto out_release;
1229                 }
1230         }
1231 
1232         if (sk->sk_type == SOCK_SEQPACKET &&
1233             (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
1234                          ax25->ax25_dev->dev))) {
1235                 kfree(digi);
1236                 err = -EADDRINUSE;              /* Already such a connection */
1237                 ax25_cb_put(ax25t);
1238                 goto out_release;
1239         }
1240 
1241         ax25->dest_addr = fsa->fsa_ax25.sax25_call;
1242         ax25->digipeat  = digi;
1243 
1244         /* First the easy one */
1245         if (sk->sk_type != SOCK_SEQPACKET) {
1246                 sock->state = SS_CONNECTED;
1247                 sk->sk_state   = TCP_ESTABLISHED;
1248                 goto out_release;
1249         }
1250 
1251         /* Move to connecting socket, ax.25 lapb WAIT_UA.. */
1252         sock->state        = SS_CONNECTING;
1253         sk->sk_state          = TCP_SYN_SENT;
1254 
1255         switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
1256         case AX25_PROTO_STD_SIMPLEX:
1257         case AX25_PROTO_STD_DUPLEX:
1258                 ax25_std_establish_data_link(ax25);
1259                 break;
1260 
1261 #ifdef CONFIG_AX25_DAMA_SLAVE
1262         case AX25_PROTO_DAMA_SLAVE:
1263                 ax25->modulus = AX25_MODULUS;
1264                 ax25->window  = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
1265                 if (ax25->ax25_dev->dama.slave)
1266                         ax25_ds_establish_data_link(ax25);
1267                 else
1268                         ax25_std_establish_data_link(ax25);
1269                 break;
1270 #endif
1271         }
1272 
1273         ax25->state = AX25_STATE_1;
1274 
1275         ax25_start_heartbeat(ax25);
1276 
1277         /* Now the loop */
1278         if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) {
1279                 err = -EINPROGRESS;
1280                 goto out_release;
1281         }
1282 
1283         if (sk->sk_state == TCP_SYN_SENT) {
1284                 DEFINE_WAIT(wait);
1285 
1286                 for (;;) {
1287                         prepare_to_wait(sk_sleep(sk), &wait,
1288                                         TASK_INTERRUPTIBLE);
1289                         if (sk->sk_state != TCP_SYN_SENT)
1290                                 break;
1291                         if (!signal_pending(current)) {
1292                                 release_sock(sk);
1293                                 schedule();
1294                                 lock_sock(sk);
1295                                 continue;
1296                         }
1297                         err = -ERESTARTSYS;
1298                         break;
1299                 }
1300                 finish_wait(sk_sleep(sk), &wait);
1301 
1302                 if (err)
1303                         goto out_release;
1304         }
1305 
1306         if (sk->sk_state != TCP_ESTABLISHED) {
1307                 /* Not in ABM, not in WAIT_UA -> failed */
1308                 sock->state = SS_UNCONNECTED;
1309                 err = sock_error(sk);   /* Always set at this point */
1310                 goto out_release;
1311         }
1312 
1313         sock->state = SS_CONNECTED;
1314 
1315         err = 0;
1316 out_release:
1317         release_sock(sk);
1318 
1319         return err;
1320 }
1321 
1322 static int ax25_accept(struct socket *sock, struct socket *newsock, int flags)
1323 {
1324         struct sk_buff *skb;
1325         struct sock *newsk;
1326         DEFINE_WAIT(wait);
1327         struct sock *sk;
1328         int err = 0;
1329 
1330         if (sock->state != SS_UNCONNECTED)
1331                 return -EINVAL;
1332 
1333         if ((sk = sock->sk) == NULL)
1334                 return -EINVAL;
1335 
1336         lock_sock(sk);
1337         if (sk->sk_type != SOCK_SEQPACKET) {
1338                 err = -EOPNOTSUPP;
1339                 goto out;
1340         }
1341 
1342         if (sk->sk_state != TCP_LISTEN) {
1343                 err = -EINVAL;
1344                 goto out;
1345         }
1346 
1347         /*
1348          *      The read queue this time is holding sockets ready to use
1349          *      hooked into the SABM we saved
1350          */
1351         for (;;) {
1352                 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
1353                 skb = skb_dequeue(&sk->sk_receive_queue);
1354                 if (skb)
1355                         break;
1356 
1357                 if (flags & O_NONBLOCK) {
1358                         err = -EWOULDBLOCK;
1359                         break;
1360                 }
1361                 if (!signal_pending(current)) {
1362                         release_sock(sk);
1363                         schedule();
1364                         lock_sock(sk);
1365                         continue;
1366                 }
1367                 err = -ERESTARTSYS;
1368                 break;
1369         }
1370         finish_wait(sk_sleep(sk), &wait);
1371 
1372         if (err)
1373                 goto out;
1374 
1375         newsk            = skb->sk;
1376         sock_graft(newsk, newsock);
1377 
1378         /* Now attach up the new socket */
1379         kfree_skb(skb);
1380         sk->sk_ack_backlog--;
1381         newsock->state = SS_CONNECTED;
1382 
1383 out:
1384         release_sock(sk);
1385 
1386         return err;
1387 }
1388 
1389 static int ax25_getname(struct socket *sock, struct sockaddr *uaddr,
1390         int *uaddr_len, int peer)
1391 {
1392         struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
1393         struct sock *sk = sock->sk;
1394         unsigned char ndigi, i;
1395         ax25_cb *ax25;
1396         int err = 0;
1397 
1398         memset(fsa, 0, sizeof(*fsa));
1399         lock_sock(sk);
1400         ax25 = sk_to_ax25(sk);
1401 
1402         if (peer != 0) {
1403                 if (sk->sk_state != TCP_ESTABLISHED) {
1404                         err = -ENOTCONN;
1405                         goto out;
1406                 }
1407 
1408                 fsa->fsa_ax25.sax25_family = AF_AX25;
1409                 fsa->fsa_ax25.sax25_call   = ax25->dest_addr;
1410 
1411                 if (ax25->digipeat != NULL) {
1412                         ndigi = ax25->digipeat->ndigi;
1413                         fsa->fsa_ax25.sax25_ndigis = ndigi;
1414                         for (i = 0; i < ndigi; i++)
1415                                 fsa->fsa_digipeater[i] =
1416                                                 ax25->digipeat->calls[i];
1417                 }
1418         } else {
1419                 fsa->fsa_ax25.sax25_family = AF_AX25;
1420                 fsa->fsa_ax25.sax25_call   = ax25->source_addr;
1421                 fsa->fsa_ax25.sax25_ndigis = 1;
1422                 if (ax25->ax25_dev != NULL) {
1423                         memcpy(&fsa->fsa_digipeater[0],
1424                                ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
1425                 } else {
1426                         fsa->fsa_digipeater[0] = null_ax25_address;
1427                 }
1428         }
1429         *uaddr_len = sizeof (struct full_sockaddr_ax25);
1430 
1431 out:
1432         release_sock(sk);
1433 
1434         return err;
1435 }
1436 
1437 static int ax25_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
1438 {
1439         DECLARE_SOCKADDR(struct sockaddr_ax25 *, usax, msg->msg_name);
1440         struct sock *sk = sock->sk;
1441         struct sockaddr_ax25 sax;
1442         struct sk_buff *skb;
1443         ax25_digi dtmp, *dp;
1444         ax25_cb *ax25;
1445         size_t size;
1446         int lv, err, addr_len = msg->msg_namelen;
1447 
1448         if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
1449                 return -EINVAL;
1450 
1451         lock_sock(sk);
1452         ax25 = sk_to_ax25(sk);
1453 
1454         if (sock_flag(sk, SOCK_ZAPPED)) {
1455                 err = -EADDRNOTAVAIL;
1456                 goto out;
1457         }
1458 
1459         if (sk->sk_shutdown & SEND_SHUTDOWN) {
1460                 send_sig(SIGPIPE, current, 0);
1461                 err = -EPIPE;
1462                 goto out;
1463         }
1464 
1465         if (ax25->ax25_dev == NULL) {
1466                 err = -ENETUNREACH;
1467                 goto out;
1468         }
1469 
1470         if (len > ax25->ax25_dev->dev->mtu) {
1471                 err = -EMSGSIZE;
1472                 goto out;
1473         }
1474 
1475         if (usax != NULL) {
1476                 if (usax->sax25_family != AF_AX25) {
1477                         err = -EINVAL;
1478                         goto out;
1479                 }
1480 
1481                 if (addr_len == sizeof(struct sockaddr_ax25))
1482                         /* ax25_sendmsg(): uses obsolete socket structure */
1483                         ;
1484                 else if (addr_len != sizeof(struct full_sockaddr_ax25))
1485                         /* support for old structure may go away some time
1486                          * ax25_sendmsg(): uses old (6 digipeater)
1487                          * socket structure.
1488                          */
1489                         if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
1490                             (addr_len > sizeof(struct full_sockaddr_ax25))) {
1491                                 err = -EINVAL;
1492                                 goto out;
1493                         }
1494 
1495 
1496                 if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
1497                         int ct           = 0;
1498                         struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
1499 
1500                         /* Valid number of digipeaters ? */
1501                         if (usax->sax25_ndigis < 1 || usax->sax25_ndigis > AX25_MAX_DIGIS) {
1502                                 err = -EINVAL;
1503                                 goto out;
1504                         }
1505 
1506                         dtmp.ndigi      = usax->sax25_ndigis;
1507 
1508                         while (ct < usax->sax25_ndigis) {
1509                                 dtmp.repeated[ct] = 0;
1510                                 dtmp.calls[ct]    = fsa->fsa_digipeater[ct];
1511                                 ct++;
1512                         }
1513 
1514                         dtmp.lastrepeat = 0;
1515                 }
1516 
1517                 sax = *usax;
1518                 if (sk->sk_type == SOCK_SEQPACKET &&
1519                     ax25cmp(&ax25->dest_addr, &sax.sax25_call)) {
1520                         err = -EISCONN;
1521                         goto out;
1522                 }
1523                 if (usax->sax25_ndigis == 0)
1524                         dp = NULL;
1525                 else
1526                         dp = &dtmp;
1527         } else {
1528                 /*
1529                  *      FIXME: 1003.1g - if the socket is like this because
1530                  *      it has become closed (not started closed) and is VC
1531                  *      we ought to SIGPIPE, EPIPE
1532                  */
1533                 if (sk->sk_state != TCP_ESTABLISHED) {
1534                         err = -ENOTCONN;
1535                         goto out;
1536                 }
1537                 sax.sax25_family = AF_AX25;
1538                 sax.sax25_call   = ax25->dest_addr;
1539                 dp = ax25->digipeat;
1540         }
1541 
1542         /* Build a packet */
1543         /* Assume the worst case */
1544         size = len + ax25->ax25_dev->dev->hard_header_len;
1545 
1546         skb = sock_alloc_send_skb(sk, size, msg->msg_flags&MSG_DONTWAIT, &err);
1547         if (skb == NULL)
1548                 goto out;
1549 
1550         skb_reserve(skb, size - len);
1551 
1552         /* User data follows immediately after the AX.25 data */
1553         if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
1554                 err = -EFAULT;
1555                 kfree_skb(skb);
1556                 goto out;
1557         }
1558 
1559         skb_reset_network_header(skb);
1560 
1561         /* Add the PID if one is not supplied by the user in the skb */
1562         if (!ax25->pidincl)
1563                 *skb_push(skb, 1) = sk->sk_protocol;
1564 
1565         if (sk->sk_type == SOCK_SEQPACKET) {
1566                 /* Connected mode sockets go via the LAPB machine */
1567                 if (sk->sk_state != TCP_ESTABLISHED) {
1568                         kfree_skb(skb);
1569                         err = -ENOTCONN;
1570                         goto out;
1571                 }
1572 
1573                 /* Shove it onto the queue and kick */
1574                 ax25_output(ax25, ax25->paclen, skb);
1575 
1576                 err = len;
1577                 goto out;
1578         }
1579 
1580         skb_push(skb, 1 + ax25_addr_size(dp));
1581 
1582         /* Building AX.25 Header */
1583 
1584         /* Build an AX.25 header */
1585         lv = ax25_addr_build(skb->data, &ax25->source_addr, &sax.sax25_call,
1586                              dp, AX25_COMMAND, AX25_MODULUS);
1587 
1588         skb_set_transport_header(skb, lv);
1589 
1590         *skb_transport_header(skb) = AX25_UI;
1591 
1592         /* Datagram frames go straight out of the door as UI */
1593         ax25_queue_xmit(skb, ax25->ax25_dev->dev);
1594 
1595         err = len;
1596 
1597 out:
1598         release_sock(sk);
1599 
1600         return err;
1601 }
1602 
1603 static int ax25_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
1604                         int flags)
1605 {
1606         struct sock *sk = sock->sk;
1607         struct sk_buff *skb;
1608         int copied;
1609         int err = 0;
1610 
1611         lock_sock(sk);
1612         /*
1613          *      This works for seqpacket too. The receiver has ordered the
1614          *      queue for us! We do one quick check first though
1615          */
1616         if (sk->sk_type == SOCK_SEQPACKET && sk->sk_state != TCP_ESTABLISHED) {
1617                 err =  -ENOTCONN;
1618                 goto out;
1619         }
1620 
1621         /* Now we can treat all alike */
1622         skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
1623                                 flags & MSG_DONTWAIT, &err);
1624         if (skb == NULL)
1625                 goto out;
1626 
1627         if (!sk_to_ax25(sk)->pidincl)
1628                 skb_pull(skb, 1);               /* Remove PID */
1629 
1630         skb_reset_transport_header(skb);
1631         copied = skb->len;
1632 
1633         if (copied > size) {
1634                 copied = size;
1635                 msg->msg_flags |= MSG_TRUNC;
1636         }
1637 
1638         skb_copy_datagram_msg(skb, 0, msg, copied);
1639 
1640         if (msg->msg_name) {
1641                 ax25_digi digi;
1642                 ax25_address src;
1643                 const unsigned char *mac = skb_mac_header(skb);
1644                 DECLARE_SOCKADDR(struct sockaddr_ax25 *, sax, msg->msg_name);
1645 
1646                 memset(sax, 0, sizeof(struct full_sockaddr_ax25));
1647                 ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL,
1648                                 &digi, NULL, NULL);
1649                 sax->sax25_family = AF_AX25;
1650                 /* We set this correctly, even though we may not let the
1651                    application know the digi calls further down (because it
1652                    did NOT ask to know them).  This could get political... **/
1653                 sax->sax25_ndigis = digi.ndigi;
1654                 sax->sax25_call   = src;
1655 
1656                 if (sax->sax25_ndigis != 0) {
1657                         int ct;
1658                         struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
1659 
1660                         for (ct = 0; ct < digi.ndigi; ct++)
1661                                 fsa->fsa_digipeater[ct] = digi.calls[ct];
1662                 }
1663                 msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
1664         }
1665 
1666         skb_free_datagram(sk, skb);
1667         err = copied;
1668 
1669 out:
1670         release_sock(sk);
1671 
1672         return err;
1673 }
1674 
1675 static int ax25_shutdown(struct socket *sk, int how)
1676 {
1677         /* FIXME - generate DM and RNR states */
1678         return -EOPNOTSUPP;
1679 }
1680 
1681 static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1682 {
1683         struct sock *sk = sock->sk;
1684         void __user *argp = (void __user *)arg;
1685         int res = 0;
1686 
1687         lock_sock(sk);
1688         switch (cmd) {
1689         case TIOCOUTQ: {
1690                 long amount;
1691 
1692                 amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
1693                 if (amount < 0)
1694                         amount = 0;
1695                 res = put_user(amount, (int __user *)argp);
1696                 break;
1697         }
1698 
1699         case TIOCINQ: {
1700                 struct sk_buff *skb;
1701                 long amount = 0L;
1702                 /* These two are safe on a single CPU system as only user tasks fiddle here */
1703                 if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1704                         amount = skb->len;
1705                 res = put_user(amount, (int __user *) argp);
1706                 break;
1707         }
1708 
1709         case SIOCGSTAMP:
1710                 res = sock_get_timestamp(sk, argp);
1711                 break;
1712 
1713         case SIOCGSTAMPNS:
1714                 res = sock_get_timestampns(sk, argp);
1715                 break;
1716 
1717         case SIOCAX25ADDUID:    /* Add a uid to the uid/call map table */
1718         case SIOCAX25DELUID:    /* Delete a uid from the uid/call map table */
1719         case SIOCAX25GETUID: {
1720                 struct sockaddr_ax25 sax25;
1721                 if (copy_from_user(&sax25, argp, sizeof(sax25))) {
1722                         res = -EFAULT;
1723                         break;
1724                 }
1725                 res = ax25_uid_ioctl(cmd, &sax25);
1726                 break;
1727         }
1728 
1729         case SIOCAX25NOUID: {   /* Set the default policy (default/bar) */
1730                 long amount;
1731                 if (!capable(CAP_NET_ADMIN)) {
1732                         res = -EPERM;
1733                         break;
1734                 }
1735                 if (get_user(amount, (long __user *)argp)) {
1736                         res = -EFAULT;
1737                         break;
1738                 }
1739                 if (amount < 0 || amount > AX25_NOUID_BLOCK) {
1740                         res = -EINVAL;
1741                         break;
1742                 }
1743                 ax25_uid_policy = amount;
1744                 res = 0;
1745                 break;
1746         }
1747 
1748         case SIOCADDRT:
1749         case SIOCDELRT:
1750         case SIOCAX25OPTRT:
1751                 if (!capable(CAP_NET_ADMIN)) {
1752                         res = -EPERM;
1753                         break;
1754                 }
1755                 res = ax25_rt_ioctl(cmd, argp);
1756                 break;
1757 
1758         case SIOCAX25CTLCON:
1759                 if (!capable(CAP_NET_ADMIN)) {
1760                         res = -EPERM;
1761                         break;
1762                 }
1763                 res = ax25_ctl_ioctl(cmd, argp);
1764                 break;
1765 
1766         case SIOCAX25GETINFO:
1767         case SIOCAX25GETINFOOLD: {
1768                 ax25_cb *ax25 = sk_to_ax25(sk);
1769                 struct ax25_info_struct ax25_info;
1770 
1771                 ax25_info.t1        = ax25->t1   / HZ;
1772                 ax25_info.t2        = ax25->t2   / HZ;
1773                 ax25_info.t3        = ax25->t3   / HZ;
1774                 ax25_info.idle      = ax25->idle / (60 * HZ);
1775                 ax25_info.n2        = ax25->n2;
1776                 ax25_info.t1timer   = ax25_display_timer(&ax25->t1timer)   / HZ;
1777                 ax25_info.t2timer   = ax25_display_timer(&ax25->t2timer)   / HZ;
1778                 ax25_info.t3timer   = ax25_display_timer(&ax25->t3timer)   / HZ;
1779                 ax25_info.idletimer = ax25_display_timer(&ax25->idletimer) / (60 * HZ);
1780                 ax25_info.n2count   = ax25->n2count;
1781                 ax25_info.state     = ax25->state;
1782                 ax25_info.rcv_q     = sk_rmem_alloc_get(sk);
1783                 ax25_info.snd_q     = sk_wmem_alloc_get(sk);
1784                 ax25_info.vs        = ax25->vs;
1785                 ax25_info.vr        = ax25->vr;
1786                 ax25_info.va        = ax25->va;
1787                 ax25_info.vs_max    = ax25->vs; /* reserved */
1788                 ax25_info.paclen    = ax25->paclen;
1789                 ax25_info.window    = ax25->window;
1790 
1791                 /* old structure? */
1792                 if (cmd == SIOCAX25GETINFOOLD) {
1793                         static int warned = 0;
1794                         if (!warned) {
1795                                 printk(KERN_INFO "%s uses old SIOCAX25GETINFO\n",
1796                                         current->comm);
1797                                 warned=1;
1798                         }
1799 
1800                         if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct_deprecated))) {
1801                                 res = -EFAULT;
1802                                 break;
1803                         }
1804                 } else {
1805                         if (copy_to_user(argp, &ax25_info, sizeof(struct ax25_info_struct))) {
1806                                 res = -EINVAL;
1807                                 break;
1808                         }
1809                 }
1810                 res = 0;
1811                 break;
1812         }
1813 
1814         case SIOCAX25ADDFWD:
1815         case SIOCAX25DELFWD: {
1816                 struct ax25_fwd_struct ax25_fwd;
1817                 if (!capable(CAP_NET_ADMIN)) {
1818                         res = -EPERM;
1819                         break;
1820                 }
1821                 if (copy_from_user(&ax25_fwd, argp, sizeof(ax25_fwd))) {
1822                         res = -EFAULT;
1823                         break;
1824                 }
1825                 res = ax25_fwd_ioctl(cmd, &ax25_fwd);
1826                 break;
1827         }
1828 
1829         case SIOCGIFADDR:
1830         case SIOCSIFADDR:
1831         case SIOCGIFDSTADDR:
1832         case SIOCSIFDSTADDR:
1833         case SIOCGIFBRDADDR:
1834         case SIOCSIFBRDADDR:
1835         case SIOCGIFNETMASK:
1836         case SIOCSIFNETMASK:
1837         case SIOCGIFMETRIC:
1838         case SIOCSIFMETRIC:
1839                 res = -EINVAL;
1840                 break;
1841 
1842         default:
1843                 res = -ENOIOCTLCMD;
1844                 break;
1845         }
1846         release_sock(sk);
1847 
1848         return res;
1849 }
1850 
1851 #ifdef CONFIG_PROC_FS
1852 
1853 static void *ax25_info_start(struct seq_file *seq, loff_t *pos)
1854         __acquires(ax25_list_lock)
1855 {
1856         spin_lock_bh(&ax25_list_lock);
1857         return seq_hlist_start(&ax25_list, *pos);
1858 }
1859 
1860 static void *ax25_info_next(struct seq_file *seq, void *v, loff_t *pos)
1861 {
1862         return seq_hlist_next(v, &ax25_list, pos);
1863 }
1864 
1865 static void ax25_info_stop(struct seq_file *seq, void *v)
1866         __releases(ax25_list_lock)
1867 {
1868         spin_unlock_bh(&ax25_list_lock);
1869 }
1870 
1871 static int ax25_info_show(struct seq_file *seq, void *v)
1872 {
1873         ax25_cb *ax25 = hlist_entry(v, struct ax25_cb, ax25_node);
1874         char buf[11];
1875         int k;
1876 
1877 
1878         /*
1879          * New format:
1880          * magic dev src_addr dest_addr,digi1,digi2,.. st vs vr va t1 t1 t2 t2 t3 t3 idle idle n2 n2 rtt window paclen Snd-Q Rcv-Q inode
1881          */
1882 
1883         seq_printf(seq, "%8.8lx %s %s%s ",
1884                    (long) ax25,
1885                    ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
1886                    ax2asc(buf, &ax25->source_addr),
1887                    ax25->iamdigi? "*":"");
1888         seq_printf(seq, "%s", ax2asc(buf, &ax25->dest_addr));
1889 
1890         for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
1891                 seq_printf(seq, ",%s%s",
1892                            ax2asc(buf, &ax25->digipeat->calls[k]),
1893                            ax25->digipeat->repeated[k]? "*":"");
1894         }
1895 
1896         seq_printf(seq, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
1897                    ax25->state,
1898                    ax25->vs, ax25->vr, ax25->va,
1899                    ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
1900                    ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
1901                    ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
1902                    ax25_display_timer(&ax25->idletimer) / (60 * HZ),
1903                    ax25->idle / (60 * HZ),
1904                    ax25->n2count, ax25->n2,
1905                    ax25->rtt / HZ,
1906                    ax25->window,
1907                    ax25->paclen);
1908 
1909         if (ax25->sk != NULL) {
1910                 seq_printf(seq, " %d %d %lu\n",
1911                            sk_wmem_alloc_get(ax25->sk),
1912                            sk_rmem_alloc_get(ax25->sk),
1913                            sock_i_ino(ax25->sk));
1914         } else {
1915                 seq_puts(seq, " * * *\n");
1916         }
1917         return 0;
1918 }
1919 
1920 static const struct seq_operations ax25_info_seqops = {
1921         .start = ax25_info_start,
1922         .next = ax25_info_next,
1923         .stop = ax25_info_stop,
1924         .show = ax25_info_show,
1925 };
1926 
1927 static int ax25_info_open(struct inode *inode, struct file *file)
1928 {
1929         return seq_open(file, &ax25_info_seqops);
1930 }
1931 
1932 static const struct file_operations ax25_info_fops = {
1933         .owner = THIS_MODULE,
1934         .open = ax25_info_open,
1935         .read = seq_read,
1936         .llseek = seq_lseek,
1937         .release = seq_release,
1938 };
1939 
1940 #endif
1941 
1942 static const struct net_proto_family ax25_family_ops = {
1943         .family =       PF_AX25,
1944         .create =       ax25_create,
1945         .owner  =       THIS_MODULE,
1946 };
1947 
1948 static const struct proto_ops ax25_proto_ops = {
1949         .family         = PF_AX25,
1950         .owner          = THIS_MODULE,
1951         .release        = ax25_release,
1952         .bind           = ax25_bind,
1953         .connect        = ax25_connect,
1954         .socketpair     = sock_no_socketpair,
1955         .accept         = ax25_accept,
1956         .getname        = ax25_getname,
1957         .poll           = datagram_poll,
1958         .ioctl          = ax25_ioctl,
1959         .listen         = ax25_listen,
1960         .shutdown       = ax25_shutdown,
1961         .setsockopt     = ax25_setsockopt,
1962         .getsockopt     = ax25_getsockopt,
1963         .sendmsg        = ax25_sendmsg,
1964         .recvmsg        = ax25_recvmsg,
1965         .mmap           = sock_no_mmap,
1966         .sendpage       = sock_no_sendpage,
1967 };
1968 
1969 /*
1970  *      Called by socket.c on kernel start up
1971  */
1972 static struct packet_type ax25_packet_type __read_mostly = {
1973         .type   =       cpu_to_be16(ETH_P_AX25),
1974         .func   =       ax25_kiss_rcv,
1975 };
1976 
1977 static struct notifier_block ax25_dev_notifier = {
1978         .notifier_call = ax25_device_event,
1979 };
1980 
1981 static int __init ax25_init(void)
1982 {
1983         int rc = proto_register(&ax25_proto, 0);
1984 
1985         if (rc != 0)
1986                 goto out;
1987 
1988         sock_register(&ax25_family_ops);
1989         dev_add_pack(&ax25_packet_type);
1990         register_netdevice_notifier(&ax25_dev_notifier);
1991 
1992         proc_create("ax25_route", S_IRUGO, init_net.proc_net,
1993                     &ax25_route_fops);
1994         proc_create("ax25", S_IRUGO, init_net.proc_net, &ax25_info_fops);
1995         proc_create("ax25_calls", S_IRUGO, init_net.proc_net, &ax25_uid_fops);
1996 out:
1997         return rc;
1998 }
1999 module_init(ax25_init);
2000 
2001 
2002 MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
2003 MODULE_DESCRIPTION("The amateur radio AX.25 link layer protocol");
2004 MODULE_LICENSE("GPL");
2005 MODULE_ALIAS_NETPROTO(PF_AX25);
2006 
2007 static void __exit ax25_exit(void)
2008 {
2009         remove_proc_entry("ax25_route", init_net.proc_net);
2010         remove_proc_entry("ax25", init_net.proc_net);
2011         remove_proc_entry("ax25_calls", init_net.proc_net);
2012 
2013         unregister_netdevice_notifier(&ax25_dev_notifier);
2014 
2015         dev_remove_pack(&ax25_packet_type);
2016 
2017         sock_unregister(PF_AX25);
2018         proto_unregister(&ax25_proto);
2019 
2020         ax25_rt_free();
2021         ax25_uid_free();
2022         ax25_dev_free();
2023 }
2024 module_exit(ax25_exit);
2025 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp