^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) Hans Alblas PE1AYX <hans@esrac.ele.tue.nl>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2004, 05 Ralf Baechle DL5RB <ralf@linux-mips.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2004, 05 Thomas Osterried DL9SAU <thomas@x-berg.in-berlin.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/crc16.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/in.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/inet.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/tty.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/major.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/rtnetlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/etherdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/skbuff.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/if_arp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/refcount.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <net/ax25.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define AX_MTU 236
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /* some arch define END as assembly function ending, just undef it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #undef END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /* SLIP/KISS protocol characters. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define END 0300 /* indicates end of frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define ESC 0333 /* indicates byte stuffing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define ESC_END 0334 /* ESC ESC_END means END 'data' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define ESC_ESC 0335 /* ESC ESC_ESC means ESC 'data' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct mkiss {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct tty_struct *tty; /* ptr to TTY structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct net_device *dev; /* easy for intr handling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /* These are pointers to the malloc()ed frame buffers. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) spinlock_t buflock;/* lock for rbuf and xbuf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) unsigned char *rbuff; /* receiver buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) int rcount; /* received chars counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) unsigned char *xbuff; /* transmitter buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) unsigned char *xhead; /* pointer to next byte to XMIT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) int xleft; /* bytes left in XMIT queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* Detailed SLIP statistics. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) int mtu; /* Our mtu (to spot changes!) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) int buffsize; /* Max buffers sizes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) unsigned long flags; /* Flag values/ mode etc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* long req'd: used by set_bit --RR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define AXF_INUSE 0 /* Channel in use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define AXF_ESCAPE 1 /* ESC received */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define AXF_ERROR 2 /* Parity, etc. error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define AXF_KEEPTEST 3 /* Keepalive test flag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define AXF_OUTWAIT 4 /* is outpacket was flag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) int mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) int crcmode; /* MW: for FlexNet, SMACK etc. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) int crcauto; /* CRC auto mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define CRC_MODE_NONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define CRC_MODE_FLEX 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define CRC_MODE_SMACK 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define CRC_MODE_FLEX_TEST 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define CRC_MODE_SMACK_TEST 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) refcount_t refcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct completion dead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /*---------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) static const unsigned short crc_flex_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) 0x0f87, 0x1e0e, 0x2c95, 0x3d1c, 0x49a3, 0x582a, 0x6ab1, 0x7b38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) 0x83cf, 0x9246, 0xa0dd, 0xb154, 0xc5eb, 0xd462, 0xe6f9, 0xf770,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) 0x1f06, 0x0e8f, 0x3c14, 0x2d9d, 0x5922, 0x48ab, 0x7a30, 0x6bb9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) 0x934e, 0x82c7, 0xb05c, 0xa1d5, 0xd56a, 0xc4e3, 0xf678, 0xe7f1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) 0x2e85, 0x3f0c, 0x0d97, 0x1c1e, 0x68a1, 0x7928, 0x4bb3, 0x5a3a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) 0xa2cd, 0xb344, 0x81df, 0x9056, 0xe4e9, 0xf560, 0xc7fb, 0xd672,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) 0x3e04, 0x2f8d, 0x1d16, 0x0c9f, 0x7820, 0x69a9, 0x5b32, 0x4abb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) 0xb24c, 0xa3c5, 0x915e, 0x80d7, 0xf468, 0xe5e1, 0xd77a, 0xc6f3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) 0x4d83, 0x5c0a, 0x6e91, 0x7f18, 0x0ba7, 0x1a2e, 0x28b5, 0x393c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) 0xc1cb, 0xd042, 0xe2d9, 0xf350, 0x87ef, 0x9666, 0xa4fd, 0xb574,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) 0x5d02, 0x4c8b, 0x7e10, 0x6f99, 0x1b26, 0x0aaf, 0x3834, 0x29bd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) 0xd14a, 0xc0c3, 0xf258, 0xe3d1, 0x976e, 0x86e7, 0xb47c, 0xa5f5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) 0x6c81, 0x7d08, 0x4f93, 0x5e1a, 0x2aa5, 0x3b2c, 0x09b7, 0x183e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) 0xe0c9, 0xf140, 0xc3db, 0xd252, 0xa6ed, 0xb764, 0x85ff, 0x9476,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) 0x7c00, 0x6d89, 0x5f12, 0x4e9b, 0x3a24, 0x2bad, 0x1936, 0x08bf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) 0xf048, 0xe1c1, 0xd35a, 0xc2d3, 0xb66c, 0xa7e5, 0x957e, 0x84f7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) 0x8b8f, 0x9a06, 0xa89d, 0xb914, 0xcdab, 0xdc22, 0xeeb9, 0xff30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 0x07c7, 0x164e, 0x24d5, 0x355c, 0x41e3, 0x506a, 0x62f1, 0x7378,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 0x9b0e, 0x8a87, 0xb81c, 0xa995, 0xdd2a, 0xcca3, 0xfe38, 0xefb1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 0x1746, 0x06cf, 0x3454, 0x25dd, 0x5162, 0x40eb, 0x7270, 0x63f9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 0xaa8d, 0xbb04, 0x899f, 0x9816, 0xeca9, 0xfd20, 0xcfbb, 0xde32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 0x26c5, 0x374c, 0x05d7, 0x145e, 0x60e1, 0x7168, 0x43f3, 0x527a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 0xba0c, 0xab85, 0x991e, 0x8897, 0xfc28, 0xeda1, 0xdf3a, 0xceb3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 0x3644, 0x27cd, 0x1556, 0x04df, 0x7060, 0x61e9, 0x5372, 0x42fb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 0xc98b, 0xd802, 0xea99, 0xfb10, 0x8faf, 0x9e26, 0xacbd, 0xbd34,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 0x45c3, 0x544a, 0x66d1, 0x7758, 0x03e7, 0x126e, 0x20f5, 0x317c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 0xd90a, 0xc883, 0xfa18, 0xeb91, 0x9f2e, 0x8ea7, 0xbc3c, 0xadb5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 0x5542, 0x44cb, 0x7650, 0x67d9, 0x1366, 0x02ef, 0x3074, 0x21fd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 0xe889, 0xf900, 0xcb9b, 0xda12, 0xaead, 0xbf24, 0x8dbf, 0x9c36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 0x64c1, 0x7548, 0x47d3, 0x565a, 0x22e5, 0x336c, 0x01f7, 0x107e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 0xf808, 0xe981, 0xdb1a, 0xca93, 0xbe2c, 0xafa5, 0x9d3e, 0x8cb7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 0x7440, 0x65c9, 0x5752, 0x46db, 0x3264, 0x23ed, 0x1176, 0x00ff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static unsigned short calc_crc_flex(unsigned char *cp, int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) unsigned short crc = 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) while (size--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) crc = (crc << 8) ^ crc_flex_table[((crc >> 8) ^ *cp++) & 0xff];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) return crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) static int check_crc_flex(unsigned char *cp, int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) unsigned short crc = 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) if (size < 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) while (size--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) crc = (crc << 8) ^ crc_flex_table[((crc >> 8) ^ *cp++) & 0xff];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) if ((crc & 0xffff) != 0x7070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static int check_crc_16(unsigned char *cp, int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) unsigned short crc = 0x0000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) if (size < 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) crc = crc16(0, cp, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) if (crc != 0x0000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * Standard encapsulation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static int kiss_esc(unsigned char *s, unsigned char *d, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) unsigned char *ptr = d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) unsigned char c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * Send an initial END character to flush out any data that may have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * accumulated in the receiver due to line noise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) *ptr++ = END;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) while (len-- > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) switch (c = *s++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) case END:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) *ptr++ = ESC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) *ptr++ = ESC_END;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) case ESC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) *ptr++ = ESC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) *ptr++ = ESC_ESC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) *ptr++ = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) *ptr++ = END;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) return ptr - d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * MW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) * OK its ugly, but tell me a better solution without copying the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) * packet to a temporary buffer :-)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) static int kiss_esc_crc(unsigned char *s, unsigned char *d, unsigned short crc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) unsigned char *ptr = d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) unsigned char c=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) *ptr++ = END;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) while (len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) if (len > 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) c = *s++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) else if (len > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) c = crc >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) c = crc & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) len--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) switch (c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) case END:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) *ptr++ = ESC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) *ptr++ = ESC_END;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) case ESC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) *ptr++ = ESC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) *ptr++ = ESC_ESC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) *ptr++ = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) *ptr++ = END;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return ptr - d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* Send one completely decapsulated AX.25 packet to the AX.25 layer. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) static void ax_bump(struct mkiss *ax)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) spin_lock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) if (ax->rbuff[0] > 0x0f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) if (ax->rbuff[0] & 0x80) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if (check_crc_16(ax->rbuff, ax->rcount) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) ax->dev->stats.rx_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) spin_unlock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) if (ax->crcmode != CRC_MODE_SMACK && ax->crcauto) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) printk(KERN_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) "mkiss: %s: Switching to crc-smack\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) ax->crcmode = CRC_MODE_SMACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) ax->rcount -= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) *ax->rbuff &= ~0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) } else if (ax->rbuff[0] & 0x20) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) if (check_crc_flex(ax->rbuff, ax->rcount) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) ax->dev->stats.rx_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) spin_unlock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) if (ax->crcmode != CRC_MODE_FLEX && ax->crcauto) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) printk(KERN_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) "mkiss: %s: Switching to crc-flexnet\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) ax->crcmode = CRC_MODE_FLEX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) ax->rcount -= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * dl9sau bugfix: the trailling two bytes flexnet crc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) * will not be passed to the kernel. thus we have to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) * correct the kissparm signature, because it indicates
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) * a crc but there's none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) *ax->rbuff &= ~0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) count = ax->rcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if ((skb = dev_alloc_skb(count)) == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) printk(KERN_ERR "mkiss: %s: memory squeeze, dropping packet.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) ax->dev->stats.rx_dropped++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) spin_unlock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) skb_put_data(skb, ax->rbuff, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) skb->protocol = ax25_type_trans(skb, ax->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) netif_rx(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) ax->dev->stats.rx_packets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) ax->dev->stats.rx_bytes += count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) spin_unlock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) static void kiss_unesc(struct mkiss *ax, unsigned char s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) switch (s) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) case END:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) /* drop keeptest bit = VSV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) if (test_bit(AXF_KEEPTEST, &ax->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) clear_bit(AXF_KEEPTEST, &ax->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (!test_and_clear_bit(AXF_ERROR, &ax->flags) && (ax->rcount > 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) ax_bump(ax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) clear_bit(AXF_ESCAPE, &ax->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) ax->rcount = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) case ESC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) set_bit(AXF_ESCAPE, &ax->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) case ESC_ESC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) if (test_and_clear_bit(AXF_ESCAPE, &ax->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) s = ESC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) case ESC_END:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if (test_and_clear_bit(AXF_ESCAPE, &ax->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) s = END;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) spin_lock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) if (!test_bit(AXF_ERROR, &ax->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) if (ax->rcount < ax->buffsize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) ax->rbuff[ax->rcount++] = s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) spin_unlock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) ax->dev->stats.rx_over_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) set_bit(AXF_ERROR, &ax->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) spin_unlock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) static int ax_set_mac_address(struct net_device *dev, void *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) struct sockaddr_ax25 *sa = addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) netif_tx_lock_bh(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) netif_addr_lock(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) memcpy(dev->dev_addr, &sa->sax25_call, AX25_ADDR_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) netif_addr_unlock(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) netif_tx_unlock_bh(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) /*---------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) static void ax_changedmtu(struct mkiss *ax)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) struct net_device *dev = ax->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) unsigned char *xbuff, *rbuff, *oxbuff, *orbuff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) len = dev->mtu * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) * allow for arrival of larger UDP packets, even if we say not to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) * also fixes a bug in which SunOS sends 512-byte packets even with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) * an MSS of 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) if (len < 576 * 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) len = 576 * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) xbuff = kmalloc(len + 4, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) rbuff = kmalloc(len + 4, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) if (xbuff == NULL || rbuff == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) printk(KERN_ERR "mkiss: %s: unable to grow ax25 buffers, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) "MTU change cancelled.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) dev->mtu = ax->mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) kfree(xbuff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) kfree(rbuff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) spin_lock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) oxbuff = ax->xbuff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) ax->xbuff = xbuff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) orbuff = ax->rbuff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) ax->rbuff = rbuff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) if (ax->xleft) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (ax->xleft <= len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) memcpy(ax->xbuff, ax->xhead, ax->xleft);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) ax->xleft = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) dev->stats.tx_dropped++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) ax->xhead = ax->xbuff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) if (ax->rcount) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) if (ax->rcount <= len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) memcpy(ax->rbuff, orbuff, ax->rcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) ax->rcount = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) dev->stats.rx_over_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) set_bit(AXF_ERROR, &ax->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) ax->mtu = dev->mtu + 73;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) ax->buffsize = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) spin_unlock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) kfree(oxbuff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) kfree(orbuff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) /* Encapsulate one AX.25 packet and stuff into a TTY queue. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) struct mkiss *ax = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) unsigned char *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) int actual, count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) if (ax->mtu != ax->dev->mtu + 73) /* Someone has been ifconfigging */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) ax_changedmtu(ax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) if (len > ax->mtu) { /* Sigh, shouldn't occur BUT ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) printk(KERN_ERR "mkiss: %s: truncating oversized transmit packet!\n", ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) dev->stats.tx_dropped++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) netif_start_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) p = icp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) spin_lock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if ((*p & 0x0f) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) /* Configuration Command (kissparms(1).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) * Protocol spec says: never append CRC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) * This fixes a very old bug in the linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) * kiss driver. -- dl9sau */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) switch (*p & 0xff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) case 0x85:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) /* command from userspace especially for us,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) * not for delivery to the tnc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) if (len > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) int cmd = (p[1] & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) switch(cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) ax->crcmode = CRC_MODE_SMACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) ax->crcmode = CRC_MODE_FLEX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) ax->crcmode = CRC_MODE_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) ax->crcmode = CRC_MODE_SMACK_TEST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) cmd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) ax->crcauto = (cmd ? 0 : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) printk(KERN_INFO "mkiss: %s: crc mode set to %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) ax->dev->name, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) spin_unlock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) netif_start_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) count = kiss_esc(p, ax->xbuff, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) unsigned short crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) switch (ax->crcmode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) case CRC_MODE_SMACK_TEST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) ax->crcmode = CRC_MODE_FLEX_TEST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) printk(KERN_INFO "mkiss: %s: Trying crc-smack\n", ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) case CRC_MODE_SMACK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) *p |= 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) crc = swab16(crc16(0, p, len));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) count = kiss_esc_crc(p, ax->xbuff, crc, len+2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) case CRC_MODE_FLEX_TEST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) ax->crcmode = CRC_MODE_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) printk(KERN_INFO "mkiss: %s: Trying crc-flexnet\n", ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) case CRC_MODE_FLEX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) *p |= 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) crc = calc_crc_flex(p, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) count = kiss_esc_crc(p, ax->xbuff, crc, len+2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) count = kiss_esc(p, ax->xbuff, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) spin_unlock_bh(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) set_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) actual = ax->tty->ops->write(ax->tty, ax->xbuff, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) dev->stats.tx_packets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) dev->stats.tx_bytes += actual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) netif_trans_update(ax->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) ax->xleft = count - actual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) ax->xhead = ax->xbuff + actual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) /* Encapsulate an AX.25 packet and kick it into a TTY queue. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) static netdev_tx_t ax_xmit(struct sk_buff *skb, struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) struct mkiss *ax = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) if (skb->protocol == htons(ETH_P_IP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) return ax25_ip_xmit(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) if (!netif_running(dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) printk(KERN_ERR "mkiss: %s: xmit call when iface is down\n", dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) return NETDEV_TX_BUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) if (netif_queue_stopped(dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) * May be we must check transmitter timeout here ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) * 14 Oct 1994 Dmitry Gorodchanin.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (time_before(jiffies, dev_trans_start(dev) + 20 * HZ)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) /* 20 sec timeout not reached */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) return NETDEV_TX_BUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) printk(KERN_ERR "mkiss: %s: transmit timed out, %s?\n", dev->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) (tty_chars_in_buffer(ax->tty) || ax->xleft) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) "bad line quality" : "driver error");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) ax->xleft = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) netif_start_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) /* We were not busy, so we are now... :-) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) netif_stop_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) ax_encaps(dev, skb->data, skb->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) return NETDEV_TX_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) static int ax_open_dev(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) struct mkiss *ax = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) if (ax->tty == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) /* Open the low-level part of the AX25 channel. Easy! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) static int ax_open(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) struct mkiss *ax = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) unsigned long len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) if (ax->tty == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) * Allocate the frame buffers:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) * rbuff Receive buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) * xbuff Transmit buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) len = dev->mtu * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) * allow for arrival of larger UDP packets, even if we say not to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) * also fixes a bug in which SunOS sends 512-byte packets even with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) * an MSS of 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) if (len < 576 * 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) len = 576 * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) if ((ax->rbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) goto norbuff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) if ((ax->xbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) goto noxbuff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) ax->mtu = dev->mtu + 73;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) ax->buffsize = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) ax->rcount = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) ax->xleft = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) ax->flags &= (1 << AXF_INUSE); /* Clear ESCAPE & ERROR flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) spin_lock_init(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) noxbuff:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) kfree(ax->rbuff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) norbuff:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) /* Close the low-level part of the AX25 channel. Easy! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) static int ax_close(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) struct mkiss *ax = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) if (ax->tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) netif_stop_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) static const struct net_device_ops ax_netdev_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) .ndo_open = ax_open_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) .ndo_stop = ax_close,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) .ndo_start_xmit = ax_xmit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) .ndo_set_mac_address = ax_set_mac_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) static void ax_setup(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) /* Finish setting up the DEVICE info. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) dev->mtu = AX_MTU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) dev->hard_header_len = AX25_MAX_HEADER_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) dev->addr_len = AX25_ADDR_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) dev->type = ARPHRD_AX25;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) dev->tx_queue_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) dev->header_ops = &ax25_header_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) dev->netdev_ops = &ax_netdev_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) memcpy(dev->broadcast, &ax25_bcast, AX25_ADDR_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) memcpy(dev->dev_addr, &ax25_defaddr, AX25_ADDR_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) dev->flags = IFF_BROADCAST | IFF_MULTICAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) * We have a potential race on dereferencing tty->disc_data, because the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) * layer provides no locking at all - thus one cpu could be running
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) * sixpack_receive_buf while another calls sixpack_close, which zeroes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) * tty->disc_data and frees the memory that sixpack_receive_buf is using. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) * best way to fix this is to use a rwlock in the tty struct, but for now we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) * use a single global rwlock for all ttys in ppp line discipline.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) static DEFINE_RWLOCK(disc_data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) static struct mkiss *mkiss_get(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) struct mkiss *ax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) read_lock(&disc_data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) ax = tty->disc_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) if (ax)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) refcount_inc(&ax->refcnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) read_unlock(&disc_data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) return ax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) static void mkiss_put(struct mkiss *ax)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) if (refcount_dec_and_test(&ax->refcnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) complete(&ax->dead);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) static int crc_force = 0; /* Can be overridden with insmod */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) static int mkiss_open(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) struct mkiss *ax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) if (!capable(CAP_NET_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) if (tty->ops->write == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) dev = alloc_netdev(sizeof(struct mkiss), "ax%d", NET_NAME_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) ax_setup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) if (!dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) ax = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) ax->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) spin_lock_init(&ax->buflock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) refcount_set(&ax->refcnt, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) init_completion(&ax->dead);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) ax->tty = tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) tty->disc_data = ax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) tty->receive_room = 65535;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) tty_driver_flush_buffer(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) /* Restore default settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) dev->type = ARPHRD_AX25;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) /* Perform the low-level AX25 initialization. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) err = ax_open(ax->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) goto out_free_netdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) err = register_netdev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) goto out_free_buffers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) /* after register_netdev() - because else printk smashes the kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) switch (crc_force) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) ax->crcmode = CRC_MODE_SMACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) printk(KERN_INFO "mkiss: %s: crc mode smack forced.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) ax->crcmode = CRC_MODE_FLEX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) printk(KERN_INFO "mkiss: %s: crc mode flexnet forced.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) ax->crcmode = CRC_MODE_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) printk(KERN_INFO "mkiss: %s: crc mode disabled.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) crc_force = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) printk(KERN_INFO "mkiss: %s: crc mode is auto.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) ax->dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) ax->crcmode = CRC_MODE_SMACK_TEST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) ax->crcauto = (crc_force ? 0 : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) netif_start_queue(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) /* Done. We have linked the TTY line to a channel. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) out_free_buffers:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) kfree(ax->rbuff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) kfree(ax->xbuff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) out_free_netdev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) free_netdev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) static void mkiss_close(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) struct mkiss *ax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) write_lock_irq(&disc_data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) ax = tty->disc_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) tty->disc_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) write_unlock_irq(&disc_data_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) if (!ax)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) * We have now ensured that nobody can start using ap from now on, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) * we have to wait for all existing users to finish.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) if (!refcount_dec_and_test(&ax->refcnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) wait_for_completion(&ax->dead);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) * Halt the transmit queue so that a new transmit cannot scribble
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) * on our buffers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) netif_stop_queue(ax->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) unregister_netdev(ax->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) /* Free all AX25 frame buffers after unreg. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) kfree(ax->rbuff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) kfree(ax->xbuff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) ax->tty = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) free_netdev(ax->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) /* Perform I/O control on an active ax25 channel. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) static int mkiss_ioctl(struct tty_struct *tty, struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) struct mkiss *ax = mkiss_get(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) unsigned int tmp, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) /* First make sure we're connected. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) if (ax == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) dev = ax->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) case SIOCGIFNAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) err = copy_to_user((void __user *) arg, ax->dev->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) strlen(ax->dev->name) + 1) ? -EFAULT : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) case SIOCGIFENCAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) err = put_user(4, (int __user *) arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) case SIOCSIFENCAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) if (get_user(tmp, (int __user *) arg)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) ax->mode = tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) dev->addr_len = AX25_ADDR_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) dev->hard_header_len = AX25_KISS_HEADER_LEN +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) AX25_MAX_HEADER_LEN + 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) dev->type = ARPHRD_AX25;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) case SIOCSIFHWADDR: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) char addr[AX25_ADDR_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (copy_from_user(&addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) (void __user *) arg, AX25_ADDR_LEN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) netif_tx_lock_bh(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) memcpy(dev->dev_addr, addr, AX25_ADDR_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) netif_tx_unlock_bh(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) err = -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) mkiss_put(ax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) * Handle the 'receiver data ready' interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) * This function is called by the 'tty_io' module in the kernel when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) * a block of data has been received, which can now be decapsulated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) * and sent on to the AX.25 layer for further processing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) static void mkiss_receive_buf(struct tty_struct *tty, const unsigned char *cp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) char *fp, int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) struct mkiss *ax = mkiss_get(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) if (!ax)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) * Argh! mtu change time! - costs us the packet part received
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) * at the change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) if (ax->mtu != ax->dev->mtu + 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) ax_changedmtu(ax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) /* Read the characters out of the buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) while (count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) if (fp != NULL && *fp++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) if (!test_and_set_bit(AXF_ERROR, &ax->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) ax->dev->stats.rx_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) kiss_unesc(ax, *cp++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) mkiss_put(ax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) tty_unthrottle(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) * Called by the driver when there's room for more data. If we have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) * more packets to send, we send them here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) static void mkiss_write_wakeup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) struct mkiss *ax = mkiss_get(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) int actual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) if (!ax)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) if (ax->xleft <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) /* Now serial buffer is almost free & we can start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) * transmission of another packet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) netif_wake_queue(ax->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) actual = tty->ops->write(tty, ax->xhead, ax->xleft);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) ax->xleft -= actual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) ax->xhead += actual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) mkiss_put(ax);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) static struct tty_ldisc_ops ax_ldisc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) .magic = TTY_LDISC_MAGIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) .name = "mkiss",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) .open = mkiss_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) .close = mkiss_close,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) .ioctl = mkiss_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) .receive_buf = mkiss_receive_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) .write_wakeup = mkiss_write_wakeup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) static const char banner[] __initconst = KERN_INFO \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) "mkiss: AX.25 Multikiss, Hans Albas PE1AYX\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) static const char msg_regfail[] __initconst = KERN_ERR \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) "mkiss: can't register line discipline (err = %d)\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) static int __init mkiss_init_driver(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) printk(banner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) status = tty_register_ldisc(N_AX25, &ax_ldisc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) if (status != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) printk(msg_regfail, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) static const char msg_unregfail[] = KERN_ERR \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) "mkiss: can't unregister line discipline (err = %d)\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) static void __exit mkiss_exit_driver(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) if ((ret = tty_unregister_ldisc(N_AX25)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) printk(msg_unregfail, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) MODULE_AUTHOR("Ralf Baechle DL5RB <ralf@linux-mips.org>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) MODULE_DESCRIPTION("KISS driver for AX.25 over TTYs");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) module_param(crc_force, int, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) MODULE_PARM_DESC(crc_force, "crc [0 = auto | 1 = none | 2 = flexnet | 3 = smack]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) MODULE_ALIAS_LDISC(N_AX25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) module_init(mkiss_init_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) module_exit(mkiss_exit_driver);