af_ax25.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:48k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * AX.25 release 038
  3.  *
  4.  * This code REQUIRES 2.1.15 or higher/ NET3.038
  5.  *
  6.  * This module:
  7.  * This module is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License
  9.  * as published by the Free Software Foundation; either version
  10.  * 2 of the License, or (at your option) any later version.
  11.  *
  12.  * History
  13.  * AX.25 006 Alan(GW4PTS) Nearly died of shock - it's working 8-)
  14.  * AX.25 007 Alan(GW4PTS) Removed the silliest bugs
  15.  * AX.25 008 Alan(GW4PTS) Cleaned up, fixed a few state machine problems, added callbacks
  16.  * AX.25 009 Alan(GW4PTS) Emergency patch kit to fix memory corruption
  17.  *  AX.25 010 Alan(GW4PTS) Added RAW sockets/Digipeat.
  18.  * AX.25 011 Alan(GW4PTS) RAW socket and datagram fixes (thanks) - Raw sendto now gets PID right
  19.  * datagram sendto uses correct target address.
  20.  * AX.25 012 Alan(GW4PTS) Correct incoming connection handling, send DM to failed connects.
  21.  * Use skb->data not skb+1. Support sk->priority correctly.
  22.  * Correct receive on SOCK_DGRAM.
  23.  * AX.25 013 Alan(GW4PTS) Send DM to all unknown frames, missing initialiser fixed
  24.  * Leave spare SSID bits set (DAMA etc) - thanks for bug report,
  25.  * removed device registration (it's not used or needed). Clean up for
  26.  * gcc 2.5.8. PID to AX25_P_
  27.  * AX.25 014 Alan(GW4PTS) Cleanup and NET3 merge
  28.  * AX.25 015 Alan(GW4PTS) Internal test version.
  29.  * AX.25 016 Alan(GW4PTS) Semi Internal version for PI card
  30.  * work.
  31.  * AX.25 017 Alan(GW4PTS) Fixed some small bugs reported by
  32.  * G4KLX
  33.  * AX.25 018 Alan(GW4PTS) Fixed a small error in SOCK_DGRAM
  34.  * AX.25 019 Alan(GW4PTS) Clean ups for the non INET kernel and device ioctls in AX.25
  35.  * AX.25 020 Jonathan(G4KLX) /proc support and other changes.
  36.  * AX.25 021 Alan(GW4PTS) Added AX25_T1, AX25_N2, AX25_T3 as requested.
  37.  * AX.25 022 Jonathan(G4KLX) More work on the ax25 auto router and /proc improved (again)!
  38.  * Alan(GW4PTS) Added TIOCINQ/OUTQ
  39.  * AX.25 023 Alan(GW4PTS) Fixed shutdown bug
  40.  * AX.25 023 Alan(GW4PTS) Linus changed timers
  41.  * AX.25 024 Alan(GW4PTS) Small bug fixes
  42.  * AX.25 025 Alan(GW4PTS) More fixes, Linux 1.1.51 compatibility stuff, timers again!
  43.  * AX.25 026 Alan(GW4PTS) Small state fix.
  44.  * AX.25 027 Alan(GW4PTS) Socket close crash fixes.
  45.  * AX.25 028 Alan(GW4PTS) Callsign control including settings per uid.
  46.  * Small bug fixes.
  47.  * Protocol set by sockets only.
  48.  * Small changes to allow for start of NET/ROM layer.
  49.  * AX.25 028a Jonathan(G4KLX) Changes to state machine.
  50.  * AX.25 028b Jonathan(G4KLX) Extracted ax25 control block
  51.  * from sock structure.
  52.  * AX.25 029 Alan(GW4PTS) Combined 028b and some KA9Q code
  53.  * Jonathan(G4KLX) and removed all the old Berkeley, added IP mode registration.
  54.  * Darryl(G7LED) stuff. Cross-port digipeating. Minor fixes and enhancements.
  55.  * Alan(GW4PTS) Missed suser() on axassociate checks
  56.  * AX.25 030 Alan(GW4PTS) Added variable length headers.
  57.  * Jonathan(G4KLX) Added BPQ Ethernet interface.
  58.  * Steven(GW7RRM) Added digi-peating control ioctl.
  59.  * Added extended AX.25 support.
  60.  * Added AX.25 frame segmentation.
  61.  * Darryl(G7LED) Changed connect(), recvfrom(), sendto() sockaddr/addrlen to
  62.  * fall inline with bind() and new policy.
  63.  * Moved digipeating ctl to new ax25_dev structs.
  64.  * Fixed ax25_release(), set TCP_CLOSE, wakeup app
  65.  * context, THEN make the sock dead.
  66.  * Alan(GW4PTS) Cleaned up for single recvmsg methods.
  67.  * Alan(GW4PTS) Fixed not clearing error on connect failure.
  68.  * AX.25 031 Jonathan(G4KLX) Added binding to any device.
  69.  * Joerg(DL1BKE) Added DAMA support, fixed (?) digipeating, fixed buffer locking
  70.  * for "virtual connect" mode... Result: Probably the
  71.  * "Most Buggiest Code You've Ever Seen" (TM)
  72.  * HaJo(DD8NE) Implementation of a T5 (idle) timer
  73.  * Joerg(DL1BKE) Renamed T5 to IDLE and changed behaviour:
  74.  * the timer gets reloaded on every received or transmitted
  75.  * I frame for IP or NETROM. The idle timer is not active
  76.  * on "vanilla AX.25" connections. Furthermore added PACLEN
  77.  * to provide AX.25-layer based fragmentation (like WAMPES)
  78.  *      AX.25 032 Joerg(DL1BKE) Fixed DAMA timeout error.
  79.  * ax25_send_frame() limits the number of enqueued
  80.  * datagrams per socket.
  81.  * AX.25 033 Jonathan(G4KLX) Removed auto-router.
  82.  * Hans(PE1AYX) Converted to Module.
  83.  * Joerg(DL1BKE) Moved BPQ Ethernet to separate driver.
  84.  * AX.25 034 Jonathan(G4KLX) 2.1 changes
  85.  * Alan(GW4PTS) Small POSIXisations
  86.  * AX.25 035 Alan(GW4PTS) Started fixing to the new
  87.  * format.
  88.  * Hans(PE1AYX) Fixed interface to IP layer.
  89.  * Alan(GW4PTS) Added asynchronous support.
  90.  * Frederic(F1OAT) Support for pseudo-digipeating.
  91.  * Jonathan(G4KLX) Support for packet forwarding.
  92.  * AX.25 036 Jonathan(G4KLX) Major restructuring.
  93.  * Joerg(DL1BKE) Fixed DAMA Slave.
  94.  * Jonathan(G4KLX) Fix wildcard listen parameter setting.
  95.  * AX.25 037 Jonathan(G4KLX) New timer architecture.
  96.  *      AX.25 038       Matthias(DG2FEF)        Small fixes to the syscall interface to make kernel
  97.  *                                              independent of AX25_MAX_DIGIS used by applications.
  98.  *                      Tomi(OH2BNS)            Fixed ax25_getname().
  99.  * Joerg(DL1BKE) Starting to phase out the support for full_sockaddr_ax25
  100.  * with only 6 digipeaters and sockaddr_ax25 in ax25_bind(),
  101.  * ax25_connect() and ax25_sendmsg()
  102.  * Joerg(DL1BKE) Added support for SO_BINDTODEVICE
  103.  * Arnaldo C. Melo s/suser/capable(CAP_NET_ADMIN)/, some more cleanups
  104.  * Michal Ostrowski Module initialization cleanup.
  105.  * Jeroen(PE1RXQ) Use sock_orphan() on release.
  106.  */
  107. #include <linux/config.h>
  108. #include <linux/module.h>
  109. #include <linux/errno.h>
  110. #include <linux/types.h>
  111. #include <linux/socket.h>
  112. #include <linux/in.h>
  113. #include <linux/kernel.h>
  114. #include <linux/sched.h>
  115. #include <linux/timer.h>
  116. #include <linux/string.h>
  117. #include <linux/sockios.h>
  118. #include <linux/net.h>
  119. #include <net/ax25.h>
  120. #include <linux/inet.h>
  121. #include <linux/netdevice.h>
  122. #include <linux/if_arp.h>
  123. #include <linux/skbuff.h>
  124. #include <net/sock.h>
  125. #include <asm/uaccess.h>
  126. #include <asm/system.h>
  127. #include <linux/fcntl.h>
  128. #include <linux/termios.h> /* For TIOCINQ/OUTQ */
  129. #include <linux/mm.h>
  130. #include <linux/interrupt.h>
  131. #include <linux/notifier.h>
  132. #include <linux/proc_fs.h>
  133. #include <linux/stat.h>
  134. #include <linux/netfilter.h>
  135. #include <linux/sysctl.h>
  136. #include <linux/init.h>
  137. #include <net/ip.h>
  138. #include <net/arp.h>
  139. ax25_cb *volatile ax25_list;
  140. static struct proto_ops ax25_proto_ops;
  141. /*
  142.  * Free an allocated ax25 control block. This is done to centralise
  143.  * the MOD count code.
  144.  */
  145. void ax25_free_cb(ax25_cb *ax25)
  146. {
  147. if (ax25->digipeat != NULL) {
  148. kfree(ax25->digipeat);
  149. ax25->digipeat = NULL;
  150. }
  151. kfree(ax25);
  152. MOD_DEC_USE_COUNT;
  153. }
  154. static void ax25_free_sock(struct sock *sk)
  155. {
  156. ax25_free_cb(sk->protinfo.ax25);
  157. }
  158. /*
  159.  * Socket removal during an interrupt is now safe.
  160.  */
  161. static void ax25_remove_socket(ax25_cb *ax25)
  162. {
  163. ax25_cb *s;
  164. unsigned long flags;
  165. save_flags(flags); cli();
  166. if ((s = ax25_list) == ax25) {
  167. ax25_list = s->next;
  168. restore_flags(flags);
  169. return;
  170. }
  171. while (s != NULL && s->next != NULL) {
  172. if (s->next == ax25) {
  173. s->next = ax25->next;
  174. restore_flags(flags);
  175. return;
  176. }
  177. s = s->next;
  178. }
  179. restore_flags(flags);
  180. }
  181. /*
  182.  * Kill all bound sockets on a dropped device.
  183.  */
  184. static void ax25_kill_by_device(struct net_device *dev)
  185. {
  186. ax25_dev *ax25_dev;
  187. ax25_cb *s;
  188. if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
  189. return;
  190. for (s = ax25_list; s != NULL; s = s->next) {
  191. if (s->ax25_dev == ax25_dev) {
  192. s->ax25_dev = NULL;
  193. ax25_disconnect(s, ENETUNREACH);
  194. }
  195. }
  196. }
  197. /*
  198.  * Handle device status changes.
  199.  */
  200. static int ax25_device_event(struct notifier_block *this,unsigned long event, void *ptr)
  201. {
  202. struct net_device *dev = (struct net_device *)ptr;
  203. /* Reject non AX.25 devices */
  204. if (dev->type != ARPHRD_AX25)
  205. return NOTIFY_DONE;
  206. switch (event) {
  207. case NETDEV_UP:
  208. ax25_dev_device_up(dev);
  209. break;
  210. case NETDEV_DOWN:
  211. ax25_kill_by_device(dev);
  212. ax25_rt_device_down(dev);
  213. ax25_dev_device_down(dev);
  214. break;
  215. default:
  216. break;
  217. }
  218. return NOTIFY_DONE;
  219. }
  220. /*
  221.  * Add a socket to the bound sockets list.
  222.  */
  223. void ax25_insert_socket(ax25_cb *ax25)
  224. {
  225. unsigned long flags;
  226. save_flags(flags);
  227. cli();
  228. ax25->next = ax25_list;
  229. ax25_list  = ax25;
  230. restore_flags(flags);
  231. }
  232. /*
  233.  * Find a socket that wants to accept the SABM we have just
  234.  * received.
  235.  */
  236. struct sock *ax25_find_listener(ax25_address *addr, int digi, struct net_device *dev, int type)
  237. {
  238. unsigned long flags;
  239. ax25_cb *s;
  240. save_flags(flags);
  241. cli();
  242. for (s = ax25_list; s != NULL; s = s->next) {
  243. if ((s->iamdigi && !digi) || (!s->iamdigi && digi))
  244. continue;
  245. if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 && s->sk->type == type && s->sk->state == TCP_LISTEN) {
  246. /* If device is null we match any device */
  247. if (s->ax25_dev == NULL || s->ax25_dev->dev == dev) {
  248. restore_flags(flags);
  249. return s->sk;
  250. }
  251. }
  252. }
  253. restore_flags(flags);
  254. return NULL;
  255. }
  256. /*
  257.  * Find an AX.25 socket given both ends.
  258.  */
  259. struct sock *ax25_find_socket(ax25_address *my_addr, ax25_address *dest_addr, int type)
  260. {
  261. ax25_cb *s;
  262. unsigned long flags;
  263. save_flags(flags);
  264. cli();
  265. for (s = ax25_list; s != NULL; s = s->next) {
  266. if (s->sk != NULL && ax25cmp(&s->source_addr, my_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->sk->type == type) {
  267. restore_flags(flags);
  268. return s->sk;
  269. }
  270. }
  271. restore_flags(flags);
  272. return NULL;
  273. }
  274. /*
  275.  * Find an AX.25 control block given both ends. It will only pick up
  276.  * floating AX.25 control blocks or non Raw socket bound control blocks.
  277.  */
  278. ax25_cb *ax25_find_cb(ax25_address *src_addr, ax25_address *dest_addr, ax25_digi *digi, struct net_device *dev)
  279. {
  280. ax25_cb *s;
  281. unsigned long flags;
  282. save_flags(flags);
  283. cli();
  284. for (s = ax25_list; s != NULL; s = s->next) {
  285. if (s->sk != NULL && s->sk->type != SOCK_SEQPACKET)
  286. continue;
  287. if (s->ax25_dev == NULL)
  288. continue;
  289. if (ax25cmp(&s->source_addr, src_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->ax25_dev->dev == dev) {
  290. if (digi != NULL && digi->ndigi != 0) {
  291. if (s->digipeat == NULL)
  292. continue;
  293. if (ax25digicmp(s->digipeat, digi) != 0)
  294. continue;
  295. } else {
  296. if (s->digipeat != NULL && s->digipeat->ndigi != 0)
  297. continue;
  298. }
  299. restore_flags(flags);
  300. return s;
  301. }
  302. }
  303. restore_flags(flags);
  304. return NULL;
  305. }
  306. /*
  307.  * Look for any matching address - RAW sockets can bind to arbitrary names
  308.  */
  309. struct sock *ax25_addr_match(ax25_address *addr)
  310. {
  311. unsigned long flags;
  312. ax25_cb *s;
  313. save_flags(flags);
  314. cli();
  315. for (s = ax25_list; s != NULL; s = s->next) {
  316. if (s->sk != NULL && ax25cmp(&s->source_addr, addr) == 0 && s->sk->type == SOCK_RAW) {
  317. restore_flags(flags);
  318. return s->sk;
  319. }
  320. }
  321. restore_flags(flags);
  322. return NULL;
  323. }
  324. void ax25_send_to_raw(struct sock *sk, struct sk_buff *skb, int proto)
  325. {
  326. struct sk_buff *copy;
  327. while (sk != NULL) {
  328. if (sk->type == SOCK_RAW &&
  329.     sk->protocol == proto &&
  330.     atomic_read(&sk->rmem_alloc) <= sk->rcvbuf) {
  331. if ((copy = skb_clone(skb, GFP_ATOMIC)) == NULL)
  332. return;
  333. if (sock_queue_rcv_skb(sk, copy) != 0)
  334. kfree_skb(copy);
  335. }
  336. sk = sk->next;
  337. }
  338. }
  339. /*
  340.  * Deferred destroy.
  341.  */
  342. void ax25_destroy_socket(ax25_cb *);
  343. /*
  344.  * Handler for deferred kills.
  345.  */
  346. static void ax25_destroy_timer(unsigned long data)
  347. {
  348. ax25_destroy_socket((ax25_cb *)data);
  349. }
  350. /*
  351.  * This is called from user mode and the timers. Thus it protects itself against
  352.  * interrupt users but doesn't worry about being called during work.
  353.  * Once it is removed from the queue no interrupt or bottom half will
  354.  * touch it and we are (fairly 8-) ) safe.
  355.  */
  356. void ax25_destroy_socket(ax25_cb *ax25) /* Not static as it's used by the timer */
  357. {
  358. struct sk_buff *skb;
  359. unsigned long flags;
  360. save_flags(flags); cli();
  361. ax25_stop_heartbeat(ax25);
  362. ax25_stop_t1timer(ax25);
  363. ax25_stop_t2timer(ax25);
  364. ax25_stop_t3timer(ax25);
  365. ax25_stop_idletimer(ax25);
  366. ax25_remove_socket(ax25);
  367. ax25_clear_queues(ax25); /* Flush the queues */
  368. if (ax25->sk != NULL) {
  369. while ((skb = skb_dequeue(&ax25->sk->receive_queue)) != NULL) {
  370. if (skb->sk != ax25->sk) { /* A pending connection */
  371. skb->sk->dead = 1; /* Queue the unaccepted socket for death */
  372. ax25_start_heartbeat(skb->sk->protinfo.ax25);
  373. skb->sk->protinfo.ax25->state = AX25_STATE_0;
  374. }
  375. kfree_skb(skb);
  376. }
  377. }
  378. if (ax25->sk != NULL) {
  379. if (atomic_read(&ax25->sk->wmem_alloc) != 0 ||
  380.     atomic_read(&ax25->sk->rmem_alloc) != 0) {
  381. /* Defer: outstanding buffers */
  382. init_timer(&ax25->timer);
  383. ax25->timer.expires  = jiffies + 10 * HZ;
  384. ax25->timer.function = ax25_destroy_timer;
  385. ax25->timer.data     = (unsigned long)ax25;
  386. add_timer(&ax25->timer);
  387. } else {
  388. sk_free(ax25->sk);
  389. }
  390. } else {
  391. ax25_free_cb(ax25);
  392. }
  393. restore_flags(flags);
  394. }
  395. /*
  396.  * dl1bke 960311: set parameters for existing AX.25 connections,
  397.  *   includes a KILL command to abort any connection.
  398.  *   VERY useful for debugging ;-)
  399.  */
  400. static int ax25_ctl_ioctl(const unsigned int cmd, void *arg)
  401. {
  402. struct ax25_ctl_struct ax25_ctl;
  403. ax25_digi digi;
  404. ax25_dev *ax25_dev;
  405. ax25_cb *ax25;
  406. unsigned int k;
  407. if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
  408. return -EFAULT;
  409. if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
  410. return -ENODEV;
  411. if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
  412. return -EINVAL;
  413. digi.ndigi = ax25_ctl.digi_count;
  414. for (k = 0; k < digi.ndigi; k++)
  415. digi.calls[k] = ax25_ctl.digi_addr[k];
  416. if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
  417. return -ENOTCONN;
  418. switch (ax25_ctl.cmd) {
  419. case AX25_KILL:
  420. ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
  421. #ifdef CONFIG_AX25_DAMA_SLAVE
  422. if (ax25_dev->dama.slave && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
  423. ax25_dama_off(ax25);
  424. #endif
  425. ax25_disconnect(ax25, ENETRESET);
  426. break;
  427.    case AX25_WINDOW:
  428.    if (ax25->modulus == AX25_MODULUS) {
  429.    if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
  430.    return -EINVAL;
  431.    } else {
  432.    if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
  433.    return -EINVAL;
  434.    }
  435.    ax25->window = ax25_ctl.arg;
  436.    break;
  437.    case AX25_T1:
  438.    if (ax25_ctl.arg < 1)
  439.    return -EINVAL;
  440.    ax25->rtt = (ax25_ctl.arg * HZ) / 2;
  441.    ax25->t1  = ax25_ctl.arg * HZ;
  442.    break;
  443.    case AX25_T2:
  444.    if (ax25_ctl.arg < 1)
  445.    return -EINVAL;
  446.    ax25->t2 = ax25_ctl.arg * HZ;
  447.    break;
  448.    case AX25_N2:
  449.    if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
  450.    return -EINVAL;
  451.    ax25->n2count = 0;
  452.    ax25->n2 = ax25_ctl.arg;
  453.    break;
  454.    case AX25_T3:
  455.    if (ax25_ctl.arg < 0)
  456.    return -EINVAL;
  457.    ax25->t3 = ax25_ctl.arg * HZ;
  458.    break;
  459.    case AX25_IDLE:
  460.    if (ax25_ctl.arg < 0)
  461.    return -EINVAL;
  462.    ax25->idle = ax25_ctl.arg * 60 * HZ;
  463.    break;
  464.    case AX25_PACLEN:
  465.    if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
  466.    return -EINVAL;
  467.    ax25->paclen = ax25_ctl.arg;
  468.    break;
  469.    default:
  470.    return -EINVAL;
  471.   }
  472.   return 0;
  473. }
  474. /*
  475.  * Fill in a created AX.25 created control block with the default
  476.  * values for a particular device.
  477.  */
  478. void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
  479. {
  480. ax25->ax25_dev = ax25_dev;
  481. if (ax25->ax25_dev != NULL) {
  482. ax25->rtt     = ax25_dev->values[AX25_VALUES_T1] / 2;
  483. ax25->t1      = ax25_dev->values[AX25_VALUES_T1];
  484. ax25->t2      = ax25_dev->values[AX25_VALUES_T2];
  485. ax25->t3      = ax25_dev->values[AX25_VALUES_T3];
  486. ax25->n2      = ax25_dev->values[AX25_VALUES_N2];
  487. ax25->paclen  = ax25_dev->values[AX25_VALUES_PACLEN];
  488. ax25->idle    = ax25_dev->values[AX25_VALUES_IDLE];
  489. ax25->backoff = ax25_dev->values[AX25_VALUES_BACKOFF];
  490. if (ax25_dev->values[AX25_VALUES_AXDEFMODE]) {
  491. ax25->modulus = AX25_EMODULUS;
  492. ax25->window  = ax25_dev->values[AX25_VALUES_EWINDOW];
  493. } else {
  494. ax25->modulus = AX25_MODULUS;
  495. ax25->window  = ax25_dev->values[AX25_VALUES_WINDOW];
  496. }
  497. } else {
  498. ax25->rtt     = AX25_DEF_T1 / 2;
  499. ax25->t1      = AX25_DEF_T1;
  500. ax25->t2      = AX25_DEF_T2;
  501. ax25->t3      = AX25_DEF_T3;
  502. ax25->n2      = AX25_DEF_N2;
  503. ax25->paclen  = AX25_DEF_PACLEN;
  504. ax25->idle    = AX25_DEF_IDLE;
  505. ax25->backoff = AX25_DEF_BACKOFF;
  506. if (AX25_DEF_AXDEFMODE) {
  507. ax25->modulus = AX25_EMODULUS;
  508. ax25->window  = AX25_DEF_EWINDOW;
  509. } else {
  510. ax25->modulus = AX25_MODULUS;
  511. ax25->window  = AX25_DEF_WINDOW;
  512. }
  513. }
  514. }
  515. /*
  516.  * Create an empty AX.25 control block.
  517.  */
  518. ax25_cb *ax25_create_cb(void)
  519. {
  520. ax25_cb *ax25;
  521. if ((ax25 = kmalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL)
  522. return NULL;
  523. MOD_INC_USE_COUNT;
  524. memset(ax25, 0x00, sizeof(*ax25));
  525. skb_queue_head_init(&ax25->write_queue);
  526. skb_queue_head_init(&ax25->frag_queue);
  527. skb_queue_head_init(&ax25->ack_queue);
  528. skb_queue_head_init(&ax25->reseq_queue);
  529. init_timer(&ax25->timer);
  530. init_timer(&ax25->t1timer);
  531. init_timer(&ax25->t2timer);
  532. init_timer(&ax25->t3timer);
  533. init_timer(&ax25->idletimer);
  534. ax25_fillin_cb(ax25, NULL);
  535. ax25->state = AX25_STATE_0;
  536. return ax25;
  537. }
  538. /*
  539.  * Handling for system calls applied via the various interfaces to an
  540.  * AX25 socket object
  541.  */
  542. static int ax25_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen)
  543. {
  544. struct sock *sk = sock->sk;
  545. struct net_device *dev;
  546. char devname[IFNAMSIZ];
  547. int opt;
  548. if (level != SOL_AX25)
  549. return -ENOPROTOOPT;
  550. if (optlen < sizeof(int))
  551. return -EINVAL;
  552. if (get_user(opt, (int *)optval))
  553. return -EFAULT;
  554. switch (optname) {
  555. case AX25_WINDOW:
  556. if (sk->protinfo.ax25->modulus == AX25_MODULUS) {
  557. if (opt < 1 || opt > 7)
  558. return -EINVAL;
  559. } else {
  560. if (opt < 1 || opt > 63)
  561. return -EINVAL;
  562. }
  563. sk->protinfo.ax25->window = opt;
  564. return 0;
  565. case AX25_T1:
  566. if (opt < 1)
  567. return -EINVAL;
  568. sk->protinfo.ax25->rtt = (opt * HZ) / 2;
  569. sk->protinfo.ax25->t1  = opt * HZ;
  570. return 0;
  571. case AX25_T2:
  572. if (opt < 1)
  573. return -EINVAL;
  574. sk->protinfo.ax25->t2 = opt * HZ;
  575. return 0;
  576. case AX25_N2:
  577. if (opt < 1 || opt > 31)
  578. return -EINVAL;
  579. sk->protinfo.ax25->n2 = opt;
  580. return 0;
  581. case AX25_T3:
  582. if (opt < 1)
  583. return -EINVAL;
  584. sk->protinfo.ax25->t3 = opt * HZ;
  585. return 0;
  586. case AX25_IDLE:
  587. if (opt < 0)
  588. return -EINVAL;
  589. sk->protinfo.ax25->idle = opt * 60 * HZ;
  590. return 0;
  591. case AX25_BACKOFF:
  592. if (opt < 0 || opt > 2)
  593. return -EINVAL;
  594. sk->protinfo.ax25->backoff = opt;
  595. return 0;
  596. case AX25_EXTSEQ:
  597. sk->protinfo.ax25->modulus = opt ? AX25_EMODULUS : AX25_MODULUS;
  598. return 0;
  599. case AX25_PIDINCL:
  600. sk->protinfo.ax25->pidincl = opt ? 1 : 0;
  601. return 0;
  602. case AX25_IAMDIGI:
  603. sk->protinfo.ax25->iamdigi = opt ? 1 : 0;
  604. return 0;
  605. case AX25_PACLEN:
  606. if (opt < 16 || opt > 65535)
  607. return -EINVAL;
  608. sk->protinfo.ax25->paclen = opt;
  609. return 0;
  610. case SO_BINDTODEVICE:
  611. if (optlen > IFNAMSIZ) optlen=IFNAMSIZ;
  612. if (copy_from_user(devname, optval, optlen))
  613. return -EFAULT;
  614. dev = dev_get_by_name(devname);
  615. if (dev == NULL) return -ENODEV;
  616. if (sk->type == SOCK_SEQPACKET && 
  617.    (sock->state != SS_UNCONNECTED || sk->state == TCP_LISTEN))
  618. return -EADDRNOTAVAIL;
  619. sk->protinfo.ax25->ax25_dev = ax25_dev_ax25dev(dev);
  620. ax25_fillin_cb(sk->protinfo.ax25, sk->protinfo.ax25->ax25_dev);
  621. return 0;
  622. default:
  623. return -ENOPROTOOPT;
  624. }
  625. }
  626. static int ax25_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen)
  627. {
  628. struct sock *sk = sock->sk;
  629. struct ax25_dev *ax25_dev;
  630. char devname[IFNAMSIZ];
  631. void *valptr;
  632. int val = 0;
  633. int maxlen, length;
  634. if (level != SOL_AX25)
  635. return -ENOPROTOOPT;
  636. if (get_user(maxlen, optlen))
  637. return -EFAULT;
  638. if (maxlen < 1)
  639. return -EFAULT;
  640. valptr = (void *) &val;
  641. length = min_t(unsigned int, maxlen, sizeof(int));
  642. switch (optname) {
  643. case AX25_WINDOW:
  644. val = sk->protinfo.ax25->window;
  645. break;
  646. case AX25_T1:
  647. val = sk->protinfo.ax25->t1 / HZ;
  648. break;
  649. case AX25_T2:
  650. val = sk->protinfo.ax25->t2 / HZ;
  651. break;
  652. case AX25_N2:
  653. val = sk->protinfo.ax25->n2;
  654. break;
  655. case AX25_T3:
  656. val = sk->protinfo.ax25->t3 / HZ;
  657. break;
  658. case AX25_IDLE:
  659. val = sk->protinfo.ax25->idle / (60 * HZ);
  660. break;
  661. case AX25_BACKOFF:
  662. val = sk->protinfo.ax25->backoff;
  663. break;
  664. case AX25_EXTSEQ:
  665. val = (sk->protinfo.ax25->modulus == AX25_EMODULUS);
  666. break;
  667. case AX25_PIDINCL:
  668. val = sk->protinfo.ax25->pidincl;
  669. break;
  670. case AX25_IAMDIGI:
  671. val = sk->protinfo.ax25->iamdigi;
  672. break;
  673. case AX25_PACLEN:
  674. val = sk->protinfo.ax25->paclen;
  675. break;
  676. case SO_BINDTODEVICE:
  677. ax25_dev = sk->protinfo.ax25->ax25_dev;
  678. if (ax25_dev != NULL && ax25_dev->dev != NULL) {
  679. strncpy(devname, ax25_dev->dev->name, IFNAMSIZ);
  680. length = min_t(unsigned int, strlen(ax25_dev->dev->name)+1, maxlen);
  681. devname[length-1] = '';
  682. } else {
  683. *devname = '';
  684. length = 1;
  685. }
  686. valptr = (void *) devname;
  687. break;
  688. default:
  689. return -ENOPROTOOPT;
  690. }
  691. if (put_user(length, optlen))
  692. return -EFAULT;
  693. return copy_to_user(optval, valptr, length) ? -EFAULT : 0;
  694. }
  695. static int ax25_listen(struct socket *sock, int backlog)
  696. {
  697. struct sock *sk = sock->sk;
  698. if (sk->type == SOCK_SEQPACKET && sk->state != TCP_LISTEN) {
  699. sk->max_ack_backlog = backlog;
  700. sk->state           = TCP_LISTEN;
  701. return 0;
  702. }
  703. return -EOPNOTSUPP;
  704. }
  705. int ax25_create(struct socket *sock, int protocol)
  706. {
  707. struct sock *sk;
  708. ax25_cb *ax25;
  709. switch (sock->type) {
  710. case SOCK_DGRAM:
  711. if (protocol == 0 || protocol == PF_AX25)
  712. protocol = AX25_P_TEXT;
  713. break;
  714. case SOCK_SEQPACKET:
  715. switch (protocol) {
  716. case 0:
  717. case PF_AX25: /* For CLX */
  718. protocol = AX25_P_TEXT;
  719. break;
  720. case AX25_P_SEGMENT:
  721. #ifdef CONFIG_INET
  722. case AX25_P_ARP:
  723. case AX25_P_IP:
  724. #endif
  725. #ifdef CONFIG_NETROM
  726. case AX25_P_NETROM:
  727. #endif
  728. #ifdef CONFIG_ROSE
  729. case AX25_P_ROSE:
  730. #endif
  731. return -ESOCKTNOSUPPORT;
  732. #ifdef CONFIG_NETROM_MODULE
  733. case AX25_P_NETROM:
  734. if (ax25_protocol_is_registered(AX25_P_NETROM))
  735. return -ESOCKTNOSUPPORT;
  736. #endif
  737. #ifdef CONFIG_ROSE_MODULE
  738. case AX25_P_ROSE:
  739. if (ax25_protocol_is_registered(AX25_P_ROSE))
  740. return -ESOCKTNOSUPPORT;
  741. #endif
  742. default:
  743. break;
  744. }
  745. break;
  746. case SOCK_RAW:
  747. break;
  748. default:
  749. return -ESOCKTNOSUPPORT;
  750. }
  751. if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, 1)) == NULL)
  752. return -ENOMEM;
  753. if ((ax25 = ax25_create_cb()) == NULL) {
  754. sk_free(sk);
  755. return -ENOMEM;
  756. }
  757. sock_init_data(sock, sk);
  758. sk->destruct = ax25_free_sock;
  759. sock->ops    = &ax25_proto_ops;
  760. sk->protocol = protocol;
  761. ax25->sk          = sk;
  762. sk->protinfo.ax25 = ax25;
  763. return 0;
  764. }
  765. struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
  766. {
  767. struct sock *sk;
  768. ax25_cb *ax25;
  769. if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, 1)) == NULL)
  770. return NULL;
  771. if ((ax25 = ax25_create_cb()) == NULL) {
  772. sk_free(sk);
  773. return NULL;
  774. }
  775. switch (osk->type) {
  776. case SOCK_DGRAM:
  777. break;
  778. case SOCK_SEQPACKET:
  779. break;
  780. default:
  781. sk_free(sk);
  782. ax25_free_cb(ax25);
  783. return NULL;
  784. }
  785. sock_init_data(NULL, sk);
  786. sk->destruct = ax25_free_sock;
  787. sk->type     = osk->type;
  788. sk->socket   = osk->socket;
  789. sk->priority = osk->priority;
  790. sk->protocol = osk->protocol;
  791. sk->rcvbuf   = osk->rcvbuf;
  792. sk->sndbuf   = osk->sndbuf;
  793. sk->debug    = osk->debug;
  794. sk->state    = TCP_ESTABLISHED;
  795. sk->sleep    = osk->sleep;
  796. sk->zapped   = osk->zapped;
  797. ax25->modulus = osk->protinfo.ax25->modulus;
  798. ax25->backoff = osk->protinfo.ax25->backoff;
  799. ax25->pidincl = osk->protinfo.ax25->pidincl;
  800. ax25->iamdigi = osk->protinfo.ax25->iamdigi;
  801. ax25->rtt     = osk->protinfo.ax25->rtt;
  802. ax25->t1      = osk->protinfo.ax25->t1;
  803. ax25->t2      = osk->protinfo.ax25->t2;
  804. ax25->t3      = osk->protinfo.ax25->t3;
  805. ax25->n2      = osk->protinfo.ax25->n2;
  806. ax25->idle    = osk->protinfo.ax25->idle;
  807. ax25->paclen  = osk->protinfo.ax25->paclen;
  808. ax25->window  = osk->protinfo.ax25->window;
  809. ax25->ax25_dev    = ax25_dev;
  810. ax25->source_addr = osk->protinfo.ax25->source_addr;
  811. if (osk->protinfo.ax25->digipeat != NULL) {
  812. if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
  813. sk_free(sk);
  814. return NULL;
  815. }
  816. memcpy(ax25->digipeat, osk->protinfo.ax25->digipeat, sizeof(ax25_digi));
  817. }
  818. sk->protinfo.ax25 = ax25;
  819. ax25->sk          = sk;
  820. return sk;
  821. }
  822. static int ax25_release(struct socket *sock)
  823. {
  824. struct sock *sk = sock->sk;
  825. if (sk == NULL) return 0;
  826. if (sk->type == SOCK_SEQPACKET) {
  827. switch (sk->protinfo.ax25->state) {
  828. case AX25_STATE_0:
  829. ax25_disconnect(sk->protinfo.ax25, 0);
  830. ax25_destroy_socket(sk->protinfo.ax25);
  831. break;
  832. case AX25_STATE_1:
  833. case AX25_STATE_2:
  834. ax25_send_control(sk->protinfo.ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
  835. ax25_disconnect(sk->protinfo.ax25, 0);
  836. ax25_destroy_socket(sk->protinfo.ax25);
  837. break;
  838. case AX25_STATE_3:
  839. case AX25_STATE_4:
  840. ax25_clear_queues(sk->protinfo.ax25);
  841. sk->protinfo.ax25->n2count = 0;
  842. switch (sk->protinfo.ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
  843. case AX25_PROTO_STD_SIMPLEX:
  844. case AX25_PROTO_STD_DUPLEX:
  845. ax25_send_control(sk->protinfo.ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND);
  846. ax25_stop_t2timer(sk->protinfo.ax25);
  847. ax25_stop_t3timer(sk->protinfo.ax25);
  848. ax25_stop_idletimer(sk->protinfo.ax25);
  849. break;
  850. #ifdef CONFIG_AX25_DAMA_SLAVE
  851. case AX25_PROTO_DAMA_SLAVE:
  852. ax25_stop_t3timer(sk->protinfo.ax25);
  853. ax25_stop_idletimer(sk->protinfo.ax25);
  854. break;
  855. #endif
  856. }
  857. ax25_calculate_t1(sk->protinfo.ax25);
  858. ax25_start_t1timer(sk->protinfo.ax25);
  859. sk->protinfo.ax25->state = AX25_STATE_2;
  860. sk->state                = TCP_CLOSE;
  861. sk->shutdown            |= SEND_SHUTDOWN;
  862. sk->state_change(sk);
  863. sock_orphan(sk);
  864. sk->destroy              = 1;
  865. break;
  866. default:
  867. break;
  868. }
  869. } else {
  870. sk->state     = TCP_CLOSE;
  871. sk->shutdown |= SEND_SHUTDOWN;
  872. sk->state_change(sk);
  873. sock_orphan(sk);
  874. ax25_destroy_socket(sk->protinfo.ax25);
  875. }
  876. sock->sk   = NULL;
  877. sk->socket = NULL; /* Not used, but we should do this */
  878. return 0;
  879. }
  880. /*
  881.  * We support a funny extension here so you can (as root) give any callsign
  882.  * digipeated via a local address as source. This hack is obsolete now
  883.  * that we've implemented support for SO_BINDTODEVICE. It is however small 
  884.  * and trivially backward compatible.
  885.  */
  886. static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
  887. {
  888. struct sock *sk = sock->sk;
  889. struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
  890. ax25_address *call;
  891. ax25_dev *ax25_dev = NULL;
  892. if (sk->zapped == 0)
  893. return -EINVAL;
  894. if (addr_len != sizeof(struct sockaddr_ax25) && 
  895.     addr_len != sizeof(struct full_sockaddr_ax25)) {
  896. /* support for old structure may go away some time */
  897. if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
  898.     (addr_len > sizeof(struct full_sockaddr_ax25)))
  899. return -EINVAL;
  900. printk(KERN_WARNING "ax25_bind(): %s uses old (6 digipeater) socket structure.n",
  901. current->comm);
  902. }
  903. if (addr->fsa_ax25.sax25_family != AF_AX25)
  904. return -EINVAL;
  905. call = ax25_findbyuid(current->euid);
  906. if (call == NULL && ax25_uid_policy && !capable(CAP_NET_ADMIN))
  907. return -EACCES;
  908. if (call == NULL)
  909. sk->protinfo.ax25->source_addr = addr->fsa_ax25.sax25_call;
  910. else
  911. sk->protinfo.ax25->source_addr = *call;
  912. /*
  913.  * User already set interface with SO_BINDTODEVICE
  914.  */
  915. if (sk->protinfo.ax25->ax25_dev != NULL)
  916. goto done;
  917. if (addr_len > sizeof(struct sockaddr_ax25) && addr->fsa_ax25.sax25_ndigis == 1) {
  918. if (ax25cmp(&addr->fsa_digipeater[0], &null_ax25_address) != 0 &&
  919.     (ax25_dev = ax25_addr_ax25dev(&addr->fsa_digipeater[0])) == NULL)
  920. return -EADDRNOTAVAIL;
  921. }  else {
  922. if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL)
  923. return -EADDRNOTAVAIL;
  924. }
  925. if (ax25_dev != NULL)
  926. ax25_fillin_cb(sk->protinfo.ax25, ax25_dev);
  927. done:
  928. ax25_insert_socket(sk->protinfo.ax25);
  929. sk->zapped = 0;
  930. return 0;
  931. }
  932. /*
  933.  * FIXME: nonblock behaviour looks like it may have a bug.
  934.  */
  935. static int ax25_connect(struct socket *sock, struct sockaddr *uaddr, int addr_len, int flags)
  936. {
  937. struct sock *sk = sock->sk;
  938. struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
  939. ax25_digi *digi = NULL;
  940. int ct = 0, err;
  941. /* deal with restarts */
  942. if (sock->state == SS_CONNECTING) {
  943. switch (sk->state) {
  944. case TCP_SYN_SENT: /* still trying */
  945. return -EINPROGRESS;
  946. case TCP_ESTABLISHED: /* connection established */
  947. sock->state = SS_CONNECTED;
  948. return 0;
  949. case TCP_CLOSE: /* connection refused */
  950. sock->state = SS_UNCONNECTED;
  951. return -ECONNREFUSED;
  952. }
  953. }
  954. if (sk->state == TCP_ESTABLISHED && sk->type == SOCK_SEQPACKET)
  955. return -EISCONN; /* No reconnect on a seqpacket socket */
  956. sk->state   = TCP_CLOSE;
  957. sock->state = SS_UNCONNECTED;
  958. /*
  959.  * some sanity checks. code further down depends on this
  960.  */
  961. if (addr_len == sizeof(struct sockaddr_ax25)) {
  962. /* support for this will go away in early 2.5.x */
  963. printk(KERN_WARNING "ax25_connect(): %s uses obsolete socket structuren",
  964. current->comm);
  965. }
  966. else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
  967. /* support for old structure may go away some time */
  968. if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
  969.     (addr_len > sizeof(struct full_sockaddr_ax25)))
  970. return -EINVAL;
  971. printk(KERN_WARNING "ax25_connect(): %s uses old (6 digipeater) socket structure.n",
  972. current->comm);
  973. }
  974. if (fsa->fsa_ax25.sax25_family != AF_AX25)
  975. return -EINVAL;
  976. if (sk->protinfo.ax25->digipeat != NULL) {
  977. kfree(sk->protinfo.ax25->digipeat);
  978. sk->protinfo.ax25->digipeat = NULL;
  979. }
  980. /*
  981.  * Handle digi-peaters to be used.
  982.  */
  983. if (addr_len > sizeof(struct sockaddr_ax25) && fsa->fsa_ax25.sax25_ndigis != 0) {
  984. /* Valid number of digipeaters ? */
  985. if (fsa->fsa_ax25.sax25_ndigis < 1 || fsa->fsa_ax25.sax25_ndigis > AX25_MAX_DIGIS)
  986. return -EINVAL;
  987. if ((digi = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL)
  988. return -ENOBUFS;
  989. digi->ndigi      = fsa->fsa_ax25.sax25_ndigis;
  990. digi->lastrepeat = -1;
  991. while (ct < fsa->fsa_ax25.sax25_ndigis) {
  992. if ((fsa->fsa_digipeater[ct].ax25_call[6] & AX25_HBIT) && sk->protinfo.ax25->iamdigi) {
  993. digi->repeated[ct] = 1;
  994. digi->lastrepeat   = ct;
  995. } else {
  996. digi->repeated[ct] = 0;
  997. }
  998. digi->calls[ct] = fsa->fsa_digipeater[ct];
  999. ct++;
  1000. }
  1001. }
  1002. /*
  1003.  * Must bind first - autobinding in this may or may not work. If
  1004.  * the socket is already bound, check to see if the device has
  1005.  * been filled in, error if it hasn't.
  1006.  */
  1007. if (sk->zapped) {
  1008. /* check if we can remove this feature. It is broken. */
  1009. printk(KERN_WARNING "ax25_connect(): %s uses autobind, please contact jreuter@yaina.den",
  1010. current->comm);
  1011. if ((err = ax25_rt_autobind(sk->protinfo.ax25, &fsa->fsa_ax25.sax25_call)) < 0)
  1012. return err;
  1013. ax25_fillin_cb(sk->protinfo.ax25, sk->protinfo.ax25->ax25_dev);
  1014. ax25_insert_socket(sk->protinfo.ax25);
  1015. } else {
  1016. if (sk->protinfo.ax25->ax25_dev == NULL)
  1017. return -EHOSTUNREACH;
  1018. }
  1019. if (sk->type == SOCK_SEQPACKET && ax25_find_cb(&sk->protinfo.ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi, sk->protinfo.ax25->ax25_dev->dev) != NULL) {
  1020. if (digi != NULL) kfree(digi);
  1021. return -EADDRINUSE; /* Already such a connection */
  1022. }
  1023. sk->protinfo.ax25->dest_addr = fsa->fsa_ax25.sax25_call;
  1024. sk->protinfo.ax25->digipeat  = digi;
  1025. /* First the easy one */
  1026. if (sk->type != SOCK_SEQPACKET) {
  1027. sock->state = SS_CONNECTED;
  1028. sk->state   = TCP_ESTABLISHED;
  1029. return 0;
  1030. }
  1031. /* Move to connecting socket, ax.25 lapb WAIT_UA.. */
  1032. sock->state        = SS_CONNECTING;
  1033. sk->state          = TCP_SYN_SENT;
  1034. switch (sk->protinfo.ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
  1035. case AX25_PROTO_STD_SIMPLEX:
  1036. case AX25_PROTO_STD_DUPLEX:
  1037. ax25_std_establish_data_link(sk->protinfo.ax25);
  1038. break;
  1039. #ifdef CONFIG_AX25_DAMA_SLAVE
  1040. case AX25_PROTO_DAMA_SLAVE:
  1041. sk->protinfo.ax25->modulus = AX25_MODULUS;
  1042. sk->protinfo.ax25->window  = sk->protinfo.ax25->ax25_dev->values[AX25_VALUES_WINDOW];
  1043. if (sk->protinfo.ax25->ax25_dev->dama.slave)
  1044. ax25_ds_establish_data_link(sk->protinfo.ax25);
  1045. else
  1046. ax25_std_establish_data_link(sk->protinfo.ax25);
  1047. break;
  1048. #endif
  1049. }
  1050. sk->protinfo.ax25->state = AX25_STATE_1;
  1051. ax25_start_heartbeat(sk->protinfo.ax25);
  1052. /* Now the loop */
  1053. if (sk->state != TCP_ESTABLISHED && (flags & O_NONBLOCK))
  1054. return -EINPROGRESS;
  1055. cli(); /* To avoid races on the sleep */
  1056. /* A DM or timeout will go to closed, a UA will go to ABM */
  1057. while (sk->state == TCP_SYN_SENT) {
  1058. interruptible_sleep_on(sk->sleep);
  1059. if (signal_pending(current)) {
  1060. sti();
  1061. return -ERESTARTSYS;
  1062. }
  1063. }
  1064. if (sk->state != TCP_ESTABLISHED) {
  1065. /* Not in ABM, not in WAIT_UA -> failed */
  1066. sti();
  1067. sock->state = SS_UNCONNECTED;
  1068. return sock_error(sk); /* Always set at this point */
  1069. }
  1070. sock->state = SS_CONNECTED;
  1071. sti();
  1072. return 0;
  1073. }
  1074. static int ax25_accept(struct socket *sock, struct socket *newsock, int flags)
  1075. {
  1076. struct sock *sk;
  1077. struct sock *newsk;
  1078. struct sk_buff *skb;
  1079. if (sock->state != SS_UNCONNECTED)
  1080. return -EINVAL;
  1081. if ((sk = sock->sk) == NULL)
  1082. return -EINVAL;
  1083. if (sk->type != SOCK_SEQPACKET)
  1084. return -EOPNOTSUPP;
  1085. if (sk->state != TCP_LISTEN)
  1086. return -EINVAL;
  1087. /*
  1088.  * The read queue this time is holding sockets ready to use
  1089.  * hooked into the SABM we saved
  1090.  */
  1091. do {
  1092. if ((skb = skb_dequeue(&sk->receive_queue)) == NULL) {
  1093. if (flags & O_NONBLOCK)
  1094. return -EWOULDBLOCK;
  1095. interruptible_sleep_on(sk->sleep);
  1096. if (signal_pending(current)) 
  1097. return -ERESTARTSYS;
  1098. }
  1099. } while (skb == NULL);
  1100. newsk = skb->sk;
  1101. newsk->pair = NULL;
  1102. newsk->socket = newsock;
  1103. newsk->sleep = &newsock->wait;
  1104. /* Now attach up the new socket */
  1105. kfree_skb(skb);
  1106. sk->ack_backlog--;
  1107. newsock->sk    = newsk;
  1108. newsock->state = SS_CONNECTED;
  1109. return 0;
  1110. }
  1111. static int ax25_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer)
  1112. {
  1113. struct sock *sk = sock->sk;
  1114. struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)uaddr;
  1115. unsigned char ndigi, i;
  1116. if (peer != 0) {
  1117. if (sk->state != TCP_ESTABLISHED)
  1118. return -ENOTCONN;
  1119. fsa->fsa_ax25.sax25_family = AF_AX25;
  1120. fsa->fsa_ax25.sax25_call   = sk->protinfo.ax25->dest_addr;
  1121. fsa->fsa_ax25.sax25_ndigis = 0;
  1122. if (sk->protinfo.ax25->digipeat != NULL) {
  1123. ndigi = sk->protinfo.ax25->digipeat->ndigi;
  1124. fsa->fsa_ax25.sax25_ndigis = ndigi;
  1125. for (i = 0; i < ndigi; i++)
  1126. fsa->fsa_digipeater[i] = sk->protinfo.ax25->digipeat->calls[i];
  1127. }
  1128. } else {
  1129. fsa->fsa_ax25.sax25_family = AF_AX25;
  1130. fsa->fsa_ax25.sax25_call   = sk->protinfo.ax25->source_addr;
  1131. fsa->fsa_ax25.sax25_ndigis = 1;
  1132. if (sk->protinfo.ax25->ax25_dev != NULL) {
  1133. memcpy(&fsa->fsa_digipeater[0], sk->protinfo.ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
  1134. } else {
  1135. fsa->fsa_digipeater[0] = null_ax25_address;
  1136. }
  1137. }
  1138. *uaddr_len = sizeof (struct full_sockaddr_ax25);
  1139. return 0;
  1140. }
  1141. static int ax25_sendmsg(struct socket *sock, struct msghdr *msg, int len, struct scm_cookie *scm)
  1142. {
  1143. struct sock *sk = sock->sk;
  1144. struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
  1145. int err;
  1146. struct sockaddr_ax25 sax;
  1147. struct sk_buff *skb;
  1148. unsigned char *asmptr;
  1149. int size;
  1150. ax25_digi *dp;
  1151. ax25_digi dtmp;
  1152. int lv;
  1153. int addr_len = msg->msg_namelen;
  1154. if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR))
  1155. return -EINVAL;
  1156. if (sk->zapped)
  1157. return -EADDRNOTAVAIL;
  1158. if (sk->shutdown & SEND_SHUTDOWN) {
  1159. send_sig(SIGPIPE, current, 0);
  1160. return -EPIPE;
  1161. }
  1162. if (sk->protinfo.ax25->ax25_dev == NULL)
  1163. return -ENETUNREACH;
  1164. if (usax != NULL) {
  1165. if (usax->sax25_family != AF_AX25)
  1166. return -EINVAL;
  1167. if (addr_len == sizeof(struct sockaddr_ax25)) {
  1168. printk(KERN_WARNING "ax25_sendmsg(): %s uses obsolete socket structuren",
  1169. current->comm);
  1170. }
  1171. else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
  1172. /* support for old structure may go away some time */
  1173. if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
  1174.          (addr_len > sizeof(struct full_sockaddr_ax25)))
  1175.      return -EINVAL;
  1176. printk(KERN_WARNING "ax25_sendmsg(): %s uses old (6 digipeater) socket structure.n",
  1177. current->comm);
  1178. }
  1179. if (addr_len > sizeof(struct sockaddr_ax25) && usax->sax25_ndigis != 0) {
  1180. int ct           = 0;
  1181. struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)usax;
  1182. /* Valid number of digipeaters ? */
  1183. if (usax->sax25_ndigis < 1 || usax->sax25_ndigis > AX25_MAX_DIGIS)
  1184. return -EINVAL;
  1185. dtmp.ndigi      = usax->sax25_ndigis;
  1186. while (ct < usax->sax25_ndigis) {
  1187. dtmp.repeated[ct] = 0;
  1188. dtmp.calls[ct]    = fsa->fsa_digipeater[ct];
  1189. ct++;
  1190. }
  1191. dtmp.lastrepeat = 0;
  1192. }
  1193. sax = *usax;
  1194. if (sk->type == SOCK_SEQPACKET && ax25cmp(&sk->protinfo.ax25->dest_addr, &sax.sax25_call) != 0)
  1195. return -EISCONN;
  1196. if (usax->sax25_ndigis == 0)
  1197. dp = NULL;
  1198. else
  1199. dp = &dtmp;
  1200. } else {
  1201. /*
  1202.  * FIXME: 1003.1g - if the socket is like this because
  1203.  * it has become closed (not started closed) and is VC
  1204.  * we ought to SIGPIPE, EPIPE
  1205.  */
  1206. if (sk->state != TCP_ESTABLISHED)
  1207. return -ENOTCONN;
  1208. sax.sax25_family = AF_AX25;
  1209. sax.sax25_call   = sk->protinfo.ax25->dest_addr;
  1210. dp = sk->protinfo.ax25->digipeat;
  1211. }
  1212. SOCK_DEBUG(sk, "AX.25: sendto: Addresses built.n");
  1213. /* Build a packet */
  1214. SOCK_DEBUG(sk, "AX.25: sendto: building packet.n");
  1215. /* Assume the worst case */
  1216. size = len + 3 + ax25_addr_size(dp) + AX25_BPQ_HEADER_LEN;
  1217. if ((skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err)) == NULL)
  1218. return err;
  1219. skb_reserve(skb, size - len);
  1220. SOCK_DEBUG(sk, "AX.25: Appending user datan");
  1221. /* User data follows immediately after the AX.25 data */
  1222. memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);
  1223. skb->nh.raw = skb->data;
  1224. /* Add the PID if one is not supplied by the user in the skb */
  1225. if (!sk->protinfo.ax25->pidincl) {
  1226. asmptr  = skb_push(skb, 1);
  1227. *asmptr = sk->protocol;
  1228. }
  1229. SOCK_DEBUG(sk, "AX.25: Transmitting buffern");
  1230. if (sk->type == SOCK_SEQPACKET) {
  1231. /* Connected mode sockets go via the LAPB machine */
  1232. if (sk->state != TCP_ESTABLISHED) {
  1233. kfree_skb(skb);
  1234. return -ENOTCONN;
  1235. }
  1236. ax25_output(sk->protinfo.ax25, sk->protinfo.ax25->paclen, skb); /* Shove it onto the queue and kick */
  1237. return len;
  1238. } else {
  1239. asmptr = skb_push(skb, 1 + ax25_addr_size(dp));
  1240. SOCK_DEBUG(sk, "Building AX.25 Header (dp=%p).n", dp);
  1241. if (dp != NULL)
  1242. SOCK_DEBUG(sk, "Num digipeaters=%dn", dp->ndigi);
  1243. /* Build an AX.25 header */
  1244. asmptr += (lv = ax25_addr_build(asmptr, &sk->protinfo.ax25->source_addr, &sax.sax25_call, dp, AX25_COMMAND, AX25_MODULUS));
  1245. SOCK_DEBUG(sk, "Built header (%d bytes)n",lv);
  1246. skb->h.raw = asmptr;
  1247. SOCK_DEBUG(sk, "base=%p pos=%pn", skb->data, asmptr);
  1248. *asmptr = AX25_UI;
  1249. /* Datagram frames go straight out of the door as UI */
  1250. skb->dev      = sk->protinfo.ax25->ax25_dev->dev;
  1251. ax25_queue_xmit(skb);
  1252. return len;
  1253. }
  1254. }
  1255. static int ax25_recvmsg(struct socket *sock, struct msghdr *msg, int size, int flags, struct scm_cookie *scm)
  1256. {
  1257. struct sock *sk = sock->sk;
  1258. int copied;
  1259. struct sk_buff *skb;
  1260. int er;
  1261. /*
  1262.  *  This works for seqpacket too. The receiver has ordered the
  1263.  * queue for us! We do one quick check first though
  1264.  */
  1265. if (sk->type == SOCK_SEQPACKET && sk->state != TCP_ESTABLISHED)
  1266. return -ENOTCONN;
  1267. /* Now we can treat all alike */
  1268. if ((skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, flags & MSG_DONTWAIT, &er)) == NULL)
  1269. return er;
  1270. if (!sk->protinfo.ax25->pidincl)
  1271. skb_pull(skb, 1); /* Remove PID */
  1272. skb->h.raw = skb->data;
  1273. copied     = skb->len;
  1274. if (copied > size) {
  1275. copied = size;
  1276. msg->msg_flags |= MSG_TRUNC;
  1277. }
  1278. skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
  1279. if (msg->msg_namelen != 0) {
  1280. struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
  1281. ax25_digi digi;
  1282. ax25_address dest;
  1283. ax25_addr_parse(skb->mac.raw+1, skb->data-skb->mac.raw-1, NULL, &dest, &digi, NULL, NULL);
  1284. sax->sax25_family = AF_AX25;
  1285. /* We set this correctly, even though we may not let the
  1286.    application know the digi calls further down (because it
  1287.    did NOT ask to know them).  This could get political... **/
  1288. sax->sax25_ndigis = digi.ndigi;
  1289. sax->sax25_call   = dest;
  1290. if (sax->sax25_ndigis != 0) {
  1291. int ct;
  1292. struct full_sockaddr_ax25 *fsa = (struct full_sockaddr_ax25 *)sax;
  1293. for (ct = 0; ct < digi.ndigi; ct++)
  1294. fsa->fsa_digipeater[ct] = digi.calls[ct];
  1295. }
  1296. msg->msg_namelen = sizeof(struct full_sockaddr_ax25);
  1297. }
  1298. skb_free_datagram(sk, skb);
  1299. return copied;
  1300. }
  1301. static int ax25_shutdown(struct socket *sk, int how)
  1302. {
  1303. /* FIXME - generate DM and RNR states */
  1304. return -EOPNOTSUPP;
  1305. }
  1306. static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
  1307. {
  1308. struct sock *sk = sock->sk;
  1309. switch (cmd) {
  1310. case TIOCOUTQ: {
  1311. long amount;
  1312. amount = sk->sndbuf - atomic_read(&sk->wmem_alloc);
  1313. if (amount < 0)
  1314. amount = 0;
  1315. return put_user(amount, (int *)arg);
  1316. }
  1317. case TIOCINQ: {
  1318. struct sk_buff *skb;
  1319. long amount = 0L;
  1320. /* These two are safe on a single CPU system as only user tasks fiddle here */
  1321. if ((skb = skb_peek(&sk->receive_queue)) != NULL)
  1322. amount = skb->len;
  1323. return put_user(amount, (int *)arg);
  1324. }
  1325. case SIOCGSTAMP:
  1326. if (sk != NULL) {
  1327. if (sk->stamp.tv_sec == 0)
  1328. return -ENOENT;
  1329. return copy_to_user((void *)arg, &sk->stamp, sizeof(struct timeval)) ? -EFAULT : 0;
  1330.   }
  1331. return -EINVAL;
  1332. case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */
  1333. case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */
  1334. case SIOCAX25GETUID: {
  1335. struct sockaddr_ax25 sax25;
  1336. if (copy_from_user(&sax25, (void *)arg, sizeof(sax25)))
  1337. return -EFAULT;
  1338. return ax25_uid_ioctl(cmd, &sax25);
  1339. }
  1340. case SIOCAX25NOUID: { /* Set the default policy (default/bar) */
  1341. long amount;
  1342. if (!capable(CAP_NET_ADMIN))
  1343. return -EPERM;
  1344. if (get_user(amount, (long *)arg))
  1345. return -EFAULT;
  1346. if (amount > AX25_NOUID_BLOCK)
  1347. return -EINVAL;
  1348. ax25_uid_policy = amount;
  1349. return 0;
  1350. }
  1351. case SIOCADDRT:
  1352. case SIOCDELRT:
  1353. case SIOCAX25OPTRT:
  1354. if (!capable(CAP_NET_ADMIN))
  1355. return -EPERM;
  1356. return ax25_rt_ioctl(cmd, (void *)arg);
  1357. case SIOCAX25CTLCON:
  1358. if (!capable(CAP_NET_ADMIN))
  1359. return -EPERM;
  1360. return ax25_ctl_ioctl(cmd, (void *)arg);
  1361. case SIOCAX25GETINFO: 
  1362. case SIOCAX25GETINFOOLD: {
  1363. struct ax25_info_struct ax25_info;
  1364. ax25_info.t1        = sk->protinfo.ax25->t1   / HZ;
  1365. ax25_info.t2        = sk->protinfo.ax25->t2   / HZ;
  1366. ax25_info.t3        = sk->protinfo.ax25->t3   / HZ;
  1367. ax25_info.idle      = sk->protinfo.ax25->idle / (60 * HZ);
  1368. ax25_info.n2        = sk->protinfo.ax25->n2;
  1369. ax25_info.t1timer   = ax25_display_timer(&sk->protinfo.ax25->t1timer)   / HZ;
  1370. ax25_info.t2timer   = ax25_display_timer(&sk->protinfo.ax25->t2timer)   / HZ;
  1371. ax25_info.t3timer   = ax25_display_timer(&sk->protinfo.ax25->t3timer)   / HZ;
  1372. ax25_info.idletimer = ax25_display_timer(&sk->protinfo.ax25->idletimer) / (60 * HZ);
  1373. ax25_info.n2count   = sk->protinfo.ax25->n2count;
  1374. ax25_info.state     = sk->protinfo.ax25->state;
  1375. ax25_info.rcv_q     = atomic_read(&sk->rmem_alloc);
  1376. ax25_info.snd_q     = atomic_read(&sk->wmem_alloc);
  1377. ax25_info.vs        = sk->protinfo.ax25->vs;
  1378. ax25_info.vr        = sk->protinfo.ax25->vr;
  1379. ax25_info.va        = sk->protinfo.ax25->va;
  1380. ax25_info.vs_max    = sk->protinfo.ax25->vs; /* reserved */
  1381. ax25_info.paclen    = sk->protinfo.ax25->paclen;
  1382. ax25_info.window    = sk->protinfo.ax25->window;
  1383. /* old structure? */
  1384. if (cmd == SIOCAX25GETINFOOLD) {
  1385. static int warned = 0;
  1386. if (!warned) {
  1387. printk(KERN_INFO "%s uses old SIOCAX25GETINFOn",
  1388. current->comm);
  1389. warned=1;
  1390. }
  1391. if (copy_to_user((void *)arg, &ax25_info, sizeof(struct ax25_info_struct_depreciated)))
  1392. return -EFAULT;
  1393. } else {
  1394. if (copy_to_user((void *)arg, &ax25_info, sizeof(struct ax25_info_struct)))
  1395. return -EINVAL;
  1396. return 0;
  1397. }
  1398. case SIOCAX25ADDFWD:
  1399. case SIOCAX25DELFWD: {
  1400. struct ax25_fwd_struct ax25_fwd;
  1401. if (!capable(CAP_NET_ADMIN))
  1402. return -EPERM;
  1403. if (copy_from_user(&ax25_fwd, (void *)arg, sizeof(ax25_fwd)))
  1404. return -EFAULT;
  1405. return ax25_fwd_ioctl(cmd, &ax25_fwd);
  1406. }
  1407. case SIOCGIFADDR:
  1408. case SIOCSIFADDR:
  1409. case SIOCGIFDSTADDR:
  1410. case SIOCSIFDSTADDR:
  1411. case SIOCGIFBRDADDR:
  1412. case SIOCSIFBRDADDR:
  1413. case SIOCGIFNETMASK:
  1414. case SIOCSIFNETMASK:
  1415. case SIOCGIFMETRIC:
  1416. case SIOCSIFMETRIC:
  1417. return -EINVAL;
  1418. default:
  1419. return dev_ioctl(cmd, (void *)arg);
  1420. }
  1421. /*NOTREACHED*/
  1422. return 0;
  1423. }
  1424. static int ax25_get_info(char *buffer, char **start, off_t offset, int length)
  1425. {
  1426. ax25_cb *ax25;
  1427. int k;
  1428. int len = 0;
  1429. off_t pos = 0;
  1430. off_t begin = 0;
  1431. cli();
  1432. /*
  1433.  * New format:
  1434.  * 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 
  1435.  */
  1436. for (ax25 = ax25_list; ax25 != NULL; ax25 = ax25->next) {
  1437. len += sprintf(buffer+len, "%8.8lx %s %s%s ", 
  1438. (long) ax25, 
  1439. ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
  1440. ax2asc(&ax25->source_addr),
  1441. ax25->iamdigi? "*":"");
  1442. len += sprintf(buffer+len, "%s", ax2asc(&ax25->dest_addr));
  1443. for (k=0; (ax25->digipeat != NULL) && (k < ax25->digipeat->ndigi); k++) {
  1444. len += sprintf(buffer+len, ",%s%s",
  1445. ax2asc(&ax25->digipeat->calls[k]),
  1446. ax25->digipeat->repeated[k]? "*":"");
  1447. }
  1448. len += sprintf(buffer+len, " %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %d %d",
  1449. ax25->state,
  1450. ax25->vs, ax25->vr, ax25->va,
  1451. ax25_display_timer(&ax25->t1timer) / HZ, ax25->t1 / HZ,
  1452. ax25_display_timer(&ax25->t2timer) / HZ, ax25->t2 / HZ,
  1453. ax25_display_timer(&ax25->t3timer) / HZ, ax25->t3 / HZ,
  1454. ax25_display_timer(&ax25->idletimer) / (60 * HZ),
  1455. ax25->idle / (60 * HZ),
  1456. ax25->n2count, ax25->n2,
  1457. ax25->rtt / HZ,
  1458. ax25->window,
  1459. ax25->paclen);
  1460. if (ax25->sk != NULL) {
  1461. len += sprintf(buffer + len, " %d %d %ldn",
  1462. atomic_read(&ax25->sk->wmem_alloc),
  1463. atomic_read(&ax25->sk->rmem_alloc),
  1464. ax25->sk->socket != NULL ? ax25->sk->socket->inode->i_ino : 0L);
  1465. } else {
  1466. len += sprintf(buffer + len, " * * *n");
  1467. }
  1468. pos = begin + len;
  1469. if (pos < offset) {
  1470. len   = 0;
  1471. begin = pos;
  1472. }
  1473. if (pos > offset + length)
  1474. break;
  1475. }
  1476. sti();
  1477. *start = buffer + (offset - begin);
  1478. len   -= (offset - begin);
  1479. if (len > length) len = length;
  1480. return(len);
  1481. }
  1482. static struct net_proto_family ax25_family_ops = {
  1483. family: PF_AX25,
  1484. create: ax25_create,
  1485. };
  1486. static struct proto_ops SOCKOPS_WRAPPED(ax25_proto_ops) = {
  1487. family: PF_AX25,
  1488. release: ax25_release,
  1489. bind: ax25_bind,
  1490. connect: ax25_connect,
  1491. socketpair: sock_no_socketpair,
  1492. accept: ax25_accept,
  1493. getname: ax25_getname,
  1494. poll: datagram_poll,
  1495. ioctl: ax25_ioctl,
  1496. listen: ax25_listen,
  1497. shutdown: ax25_shutdown,
  1498. setsockopt: ax25_setsockopt,
  1499. getsockopt: ax25_getsockopt,
  1500. sendmsg: ax25_sendmsg,
  1501. recvmsg: ax25_recvmsg,
  1502. mmap: sock_no_mmap,
  1503. sendpage: sock_no_sendpage,
  1504. };
  1505. #include <linux/smp_lock.h>
  1506. SOCKOPS_WRAP(ax25_proto, PF_AX25);
  1507. /*
  1508.  * Called by socket.c on kernel start up
  1509.  */
  1510. static struct packet_type ax25_packet_type = {
  1511. type: __constant_htons(ETH_P_AX25),
  1512. func: ax25_kiss_rcv,
  1513. };
  1514. static struct notifier_block ax25_dev_notifier = {
  1515. notifier_call: ax25_device_event,
  1516. };
  1517. EXPORT_SYMBOL(ax25_encapsulate);
  1518. EXPORT_SYMBOL(ax25_rebuild_header);
  1519. EXPORT_SYMBOL(ax25_findbyuid);
  1520. EXPORT_SYMBOL(ax25_find_cb);
  1521. EXPORT_SYMBOL(ax25_linkfail_register);
  1522. EXPORT_SYMBOL(ax25_linkfail_release);
  1523. EXPORT_SYMBOL(ax25_listen_register);
  1524. EXPORT_SYMBOL(ax25_listen_release);
  1525. EXPORT_SYMBOL(ax25_protocol_register);
  1526. EXPORT_SYMBOL(ax25_protocol_release);
  1527. EXPORT_SYMBOL(ax25_send_frame);
  1528. EXPORT_SYMBOL(ax25_uid_policy);
  1529. EXPORT_SYMBOL(ax25cmp);
  1530. EXPORT_SYMBOL(ax2asc);
  1531. EXPORT_SYMBOL(asc2ax);
  1532. EXPORT_SYMBOL(null_ax25_address);
  1533. EXPORT_SYMBOL(ax25_display_timer);
  1534. static char banner[] __initdata = KERN_INFO "NET4: G4KLX/GW4PTS AX.25 for Linux. Version 0.37 for Linux NET4.0n";
  1535. static int __init ax25_init(void)
  1536. {
  1537. sock_register(&ax25_family_ops);
  1538. dev_add_pack(&ax25_packet_type);
  1539. register_netdevice_notifier(&ax25_dev_notifier);
  1540. ax25_register_sysctl();
  1541. proc_net_create("ax25_route", 0, ax25_rt_get_info);
  1542. proc_net_create("ax25", 0, ax25_get_info);
  1543. proc_net_create("ax25_calls", 0, ax25_uid_get_info);
  1544. printk(banner);
  1545. return 0;
  1546. }
  1547. module_init(ax25_init);
  1548. MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
  1549. MODULE_DESCRIPTION("The amateur radio AX.25 link layer protocol");
  1550. static void __exit ax25_exit(void)
  1551. {
  1552. proc_net_remove("ax25_route");
  1553. proc_net_remove("ax25");
  1554. proc_net_remove("ax25_calls");
  1555. ax25_rt_free();
  1556. ax25_uid_free();
  1557. ax25_dev_free();
  1558. ax25_unregister_sysctl();
  1559. unregister_netdevice_notifier(&ax25_dev_notifier);
  1560. dev_remove_pack(&ax25_packet_type);
  1561. sock_unregister(PF_AX25);
  1562. }
  1563. module_exit(ax25_exit);