2 * slip.c This module implements the SLIP protocol for kernel-based
3 * devices like TTY. It interfaces between a raw TTY, and the
4 * kernel's INET protocol layers.
6 * Version: @(#)slip.c 0.8.3 12/24/94
12 * Alan Cox : Sanity checks and avoid tx overruns.
13 * Has a new sl->mtu field.
14 * Alan Cox : Found cause of overrun. ifconfig sl0 mtu upwards.
15 * Driver now spots this and grows/shrinks its buffers(hack!).
16 * Memory leak if you run out of memory setting up a slip driver fixed.
17 * Matt Dillon : Printable slip (borrowed from NET2E)
18 * Pauline Middelink : Slip driver fixes.
19 * Alan Cox : Honours the old SL_COMPRESSED flag
20 * Alan Cox : KISS AX.25 and AXUI IP support
21 * Michael Riepe : Automatic CSLIP recognition added
22 * Charles Hedrick : CSLIP header length problem fix.
23 * Alan Cox : Corrected non-IP cases of the above.
24 * Alan Cox : Now uses hardware type as per FvK.
25 * Alan Cox : Default to 192.168.0.0 (RFC 1597)
26 * A.N.Kuznetsov : dev_tint() recursion fix.
27 * Dmitry Gorodchanin : SLIP memory leaks
28 * Dmitry Gorodchanin : Code cleanup. Reduce tty driver
29 * buffering from 4096 to 256 bytes.
30 * Improving SLIP response time.
31 * CONFIG_SLIP_MODE_SLIP6.
32 * ifconfig sl? up & down now works correctly.
34 * Alan Cox : Oops - fix AX.25 buffer lengths
35 * Dmitry Gorodchanin : Even more cleanups. Preserve CSLIP
36 * statistics. Include CSLIP code only
37 * if it really needed.
38 * Alan Cox : Free slhc buffers in the right place.
39 * Alan Cox : Allow for digipeated IP over AX.25
40 * Matti Aarnio : Dynamic SLIP devices, with ideas taken
42 * dynamic PPP devices. We do NOT kfree()
43 * device entries, just reg./unreg. them
44 * as they are needed. We kfree() them
46 * With MODULE-loading ``insmod'', user can
47 * issue parameter: slip_maxdev=1024
48 * (Or how much he/she wants.. Default is 256)
49 * * Stanislav Voronyi : Slip line checking, with ideas taken
50 * from multislip BSDI driver which was written
51 * by Igor Chechik, RELCOM Corp. Only algorithms
52 * have been ported to Linux SLIP driver.
53 * Vitaly E. Lavrov : Sane behaviour on tty hangup.
54 * Alexey Kuznetsov : Cleanup interfaces to tty&netdevice modules.
57 #define SL_CHECK_TRANSMIT
58 #include <linux/config.h>
59 #include <linux/module.h>
60 #include <linux/moduleparam.h>
62 #include <asm/system.h>
63 #include <asm/uaccess.h>
64 #include <linux/bitops.h>
65 #include <linux/string.h>
67 #include <linux/interrupt.h>
69 #include <linux/tty.h>
70 #include <linux/errno.h>
71 #include <linux/netdevice.h>
72 #include <linux/etherdevice.h>
73 #include <linux/skbuff.h>
74 #include <linux/rtnetlink.h>
75 #include <linux/if_arp.h>
76 #include <linux/if_slip.h>
77 #include <linux/init.h>
81 #include <linux/tcp.h>
82 #include <net/slhc_vj.h>
85 #define SLIP_VERSION "0.8.4-NET3.019-NEWTTY"
87 static struct net_device **slip_devs;
89 static int slip_maxdev = SL_NRUNIT;
90 module_param(slip_maxdev, int, 0);
91 MODULE_PARM_DESC(slip_maxdev, "Maximum number of slip devices");
93 static int slip_esc(unsigned char *p, unsigned char *d, int len);
94 static void slip_unesc(struct slip *sl, unsigned char c);
95 #ifdef CONFIG_SLIP_MODE_SLIP6
96 static int slip_esc6(unsigned char *p, unsigned char *d, int len);
97 static void slip_unesc6(struct slip *sl, unsigned char c);
99 #ifdef CONFIG_SLIP_SMART
100 static void sl_keepalive(unsigned long sls);
101 static void sl_outfill(unsigned long sls);
102 static int sl_ioctl(struct net_device *dev,struct ifreq *rq,int cmd);
105 /********************************
106 * Buffer administration routines:
111 * NOTE: sl_realloc_bufs != sl_free_bufs + sl_alloc_bufs, because
112 * sl_realloc_bufs provides strong atomicity and reallocation
113 * on actively running device.
114 *********************************/
117 Allocate channel buffers.
121 sl_alloc_bufs(struct slip *sl, int mtu)
127 #ifdef SL_INCLUDE_CSLIP
129 struct slcompress *slcomp = NULL;
133 * Allocate the SLIP frame buffers:
135 * rbuff Receive buffer.
136 * xbuff Transmit buffer.
137 * cbuff Temporary compression buffer.
142 * allow for arrival of larger UDP packets, even if we say not to
143 * also fixes a bug in which SunOS sends 512-byte packets even with
148 rbuff = kmalloc(len + 4, GFP_KERNEL);
151 xbuff = kmalloc(len + 4, GFP_KERNEL);
154 #ifdef SL_INCLUDE_CSLIP
155 cbuff = kmalloc(len + 4, GFP_KERNEL);
158 slcomp = slhc_init(16, 16);
162 spin_lock_bh(&sl->lock);
163 if (sl->tty == NULL) {
164 spin_unlock_bh(&sl->lock);
172 rbuff = xchg(&sl->rbuff, rbuff);
173 xbuff = xchg(&sl->xbuff, xbuff);
174 #ifdef SL_INCLUDE_CSLIP
175 cbuff = xchg(&sl->cbuff, cbuff);
176 slcomp = xchg(&sl->slcomp, slcomp);
177 #ifdef CONFIG_SLIP_MODE_SLIP6
182 spin_unlock_bh(&sl->lock);
187 #ifdef SL_INCLUDE_CSLIP
200 /* Free a SLIP channel buffers. */
202 sl_free_bufs(struct slip *sl)
206 /* Free all SLIP frame buffers. */
207 if ((tmp = xchg(&sl->rbuff, NULL)) != NULL)
209 if ((tmp = xchg(&sl->xbuff, NULL)) != NULL)
211 #ifdef SL_INCLUDE_CSLIP
212 if ((tmp = xchg(&sl->cbuff, NULL)) != NULL)
214 if ((tmp = xchg(&sl->slcomp, NULL)) != NULL)
220 Reallocate slip channel buffers.
223 static int sl_realloc_bufs(struct slip *sl, int mtu)
226 struct net_device *dev = sl->dev;
227 unsigned char *xbuff, *rbuff;
228 #ifdef SL_INCLUDE_CSLIP
229 unsigned char *cbuff;
234 * allow for arrival of larger UDP packets, even if we say not to
235 * also fixes a bug in which SunOS sends 512-byte packets even with
241 xbuff = (unsigned char *) kmalloc (len + 4, GFP_ATOMIC);
242 rbuff = (unsigned char *) kmalloc (len + 4, GFP_ATOMIC);
243 #ifdef SL_INCLUDE_CSLIP
244 cbuff = (unsigned char *) kmalloc (len + 4, GFP_ATOMIC);
248 #ifdef SL_INCLUDE_CSLIP
249 if (xbuff == NULL || rbuff == NULL || cbuff == NULL) {
251 if (xbuff == NULL || rbuff == NULL) {
253 if (mtu >= sl->mtu) {
254 printk(KERN_WARNING "%s: unable to grow slip buffers, MTU change cancelled.\n",
261 spin_lock_bh(&sl->lock);
267 xbuff = xchg(&sl->xbuff, xbuff);
268 rbuff = xchg(&sl->rbuff, rbuff);
269 #ifdef SL_INCLUDE_CSLIP
270 cbuff = xchg(&sl->cbuff, cbuff);
273 if (sl->xleft <= len) {
274 memcpy(sl->xbuff, sl->xhead, sl->xleft);
280 sl->xhead = sl->xbuff;
283 if (sl->rcount <= len) {
284 memcpy(sl->rbuff, rbuff, sl->rcount);
287 sl->rx_over_errors++;
288 set_bit(SLF_ERROR, &sl->flags);
297 spin_unlock_bh(&sl->lock);
304 #ifdef SL_INCLUDE_CSLIP
312 /* Set the "sending" flag. This must be atomic hence the set_bit. */
314 sl_lock(struct slip *sl)
316 netif_stop_queue(sl->dev);
320 /* Clear the "sending" flag. This must be atomic, hence the ASM. */
322 sl_unlock(struct slip *sl)
324 netif_wake_queue(sl->dev);
327 /* Send one completely decapsulated IP datagram to the IP layer. */
329 sl_bump(struct slip *sl)
335 #ifdef SL_INCLUDE_CSLIP
336 if (sl->mode & (SL_MODE_ADAPTIVE | SL_MODE_CSLIP)) {
338 if ((c = sl->rbuff[0]) & SL_TYPE_COMPRESSED_TCP) {
339 /* ignore compressed packets when CSLIP is off */
340 if (!(sl->mode & SL_MODE_CSLIP)) {
341 printk(KERN_WARNING "%s: compressed packet ignored\n", sl->dev->name);
344 /* make sure we've reserved enough space for uncompress to use */
345 if (count + 80 > sl->buffsize) {
346 sl->rx_over_errors++;
349 count = slhc_uncompress(sl->slcomp, sl->rbuff, count);
353 } else if (c >= SL_TYPE_UNCOMPRESSED_TCP) {
354 if (!(sl->mode & SL_MODE_CSLIP)) {
355 /* turn on header compression */
356 sl->mode |= SL_MODE_CSLIP;
357 sl->mode &= ~SL_MODE_ADAPTIVE;
358 printk(KERN_INFO "%s: header compression turned on\n", sl->dev->name);
360 sl->rbuff[0] &= 0x4f;
361 if (slhc_remember(sl->slcomp, sl->rbuff, count) <= 0) {
366 #endif /* SL_INCLUDE_CSLIP */
370 skb = dev_alloc_skb(count);
372 printk(KERN_WARNING "%s: memory squeeze, dropping packet.\n", sl->dev->name);
377 memcpy(skb_put(skb,count), sl->rbuff, count);
378 skb->mac.raw=skb->data;
379 skb->protocol=htons(ETH_P_IP);
381 sl->dev->last_rx = jiffies;
385 /* Encapsulate one IP datagram and stuff into a TTY queue. */
387 sl_encaps(struct slip *sl, unsigned char *icp, int len)
392 if (len > sl->mtu) { /* Sigh, shouldn't occur BUT ... */
393 printk(KERN_WARNING "%s: truncating oversized transmit packet!\n", sl->dev->name);
400 #ifdef SL_INCLUDE_CSLIP
401 if (sl->mode & SL_MODE_CSLIP) {
402 len = slhc_compress(sl->slcomp, p, len, sl->cbuff, &p, 1);
405 #ifdef CONFIG_SLIP_MODE_SLIP6
406 if(sl->mode & SL_MODE_SLIP6)
407 count = slip_esc6(p, (unsigned char *) sl->xbuff, len);
410 count = slip_esc(p, (unsigned char *) sl->xbuff, len);
412 /* Order of next two lines is *very* important.
413 * When we are sending a little amount of data,
414 * the transfer may be completed inside driver.write()
415 * routine, because it's running with interrupts enabled.
416 * In this case we *never* got WRITE_WAKEUP event,
417 * if we did not request it before write operation.
418 * 14 Oct 1994 Dmitry Gorodchanin.
420 sl->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
421 actual = sl->tty->driver->write(sl->tty, sl->xbuff, count);
422 #ifdef SL_CHECK_TRANSMIT
423 sl->dev->trans_start = jiffies;
425 sl->xleft = count - actual;
426 sl->xhead = sl->xbuff + actual;
427 #ifdef CONFIG_SLIP_SMART
429 clear_bit(SLF_OUTWAIT, &sl->flags); /* reset outfill flag */
434 * Called by the driver when there's room for more data. If we have
435 * more packets to send, we send them here.
437 static void slip_write_wakeup(struct tty_struct *tty)
440 struct slip *sl = (struct slip *) tty->disc_data;
442 /* First make sure we're connected. */
443 if (!sl || sl->magic != SLIP_MAGIC || !netif_running(sl->dev)) {
446 if (sl->xleft <= 0) {
447 /* Now serial buffer is almost free & we can start
448 * transmission of another packet */
450 tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
455 actual = tty->driver->write(tty, sl->xhead, sl->xleft);
460 static void sl_tx_timeout(struct net_device *dev)
462 struct slip *sl = netdev_priv(dev);
464 spin_lock(&sl->lock);
466 if (netif_queue_stopped(dev)) {
467 if (!netif_running(dev))
470 /* May be we must check transmitter timeout here ?
471 * 14 Oct 1994 Dmitry Gorodchanin.
473 #ifdef SL_CHECK_TRANSMIT
474 if (time_before(jiffies, dev->trans_start + 20 * HZ)) {
475 /* 20 sec timeout not reached */
478 printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name,
479 (sl->tty->driver->chars_in_buffer(sl->tty) || sl->xleft) ?
480 "bad line quality" : "driver error");
482 sl->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
488 spin_unlock(&sl->lock);
492 /* Encapsulate an IP datagram and kick it into a TTY queue. */
494 sl_xmit(struct sk_buff *skb, struct net_device *dev)
496 struct slip *sl = netdev_priv(dev);
498 spin_lock(&sl->lock);
499 if (!netif_running(dev)) {
500 spin_unlock(&sl->lock);
501 printk(KERN_WARNING "%s: xmit call when iface is down\n", dev->name);
505 if (sl->tty == NULL) {
506 spin_unlock(&sl->lock);
512 sl->tx_bytes+=skb->len;
513 sl_encaps(sl, skb->data, skb->len);
514 spin_unlock(&sl->lock);
521 /******************************************
522 * Routines looking at netdevice side.
523 ******************************************/
525 /* Netdevice UP -> DOWN routine */
528 sl_close(struct net_device *dev)
530 struct slip *sl = netdev_priv(dev);
532 spin_lock_bh(&sl->lock);
534 /* TTY discipline is running. */
535 sl->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
537 netif_stop_queue(dev);
540 spin_unlock_bh(&sl->lock);
545 /* Netdevice DOWN -> UP routine */
547 static int sl_open(struct net_device *dev)
549 struct slip *sl = netdev_priv(dev);
554 sl->flags &= (1 << SLF_INUSE);
555 netif_start_queue(dev);
559 /* Netdevice change MTU request */
561 static int sl_change_mtu(struct net_device *dev, int new_mtu)
563 struct slip *sl = netdev_priv(dev);
565 if (new_mtu < 68 || new_mtu > 65534)
568 if (new_mtu != dev->mtu)
569 return sl_realloc_bufs(sl, new_mtu);
573 /* Netdevice get statistics request */
575 static struct net_device_stats *
576 sl_get_stats(struct net_device *dev)
578 static struct net_device_stats stats;
579 struct slip *sl = netdev_priv(dev);
580 #ifdef SL_INCLUDE_CSLIP
581 struct slcompress *comp;
584 memset(&stats, 0, sizeof(struct net_device_stats));
586 stats.rx_packets = sl->rx_packets;
587 stats.tx_packets = sl->tx_packets;
588 stats.rx_bytes = sl->rx_bytes;
589 stats.tx_bytes = sl->tx_bytes;
590 stats.rx_dropped = sl->rx_dropped;
591 stats.tx_dropped = sl->tx_dropped;
592 stats.tx_errors = sl->tx_errors;
593 stats.rx_errors = sl->rx_errors;
594 stats.rx_over_errors = sl->rx_over_errors;
595 #ifdef SL_INCLUDE_CSLIP
596 stats.rx_fifo_errors = sl->rx_compressed;
597 stats.tx_fifo_errors = sl->tx_compressed;
598 stats.collisions = sl->tx_misses;
601 stats.rx_fifo_errors += comp->sls_i_compressed;
602 stats.rx_dropped += comp->sls_i_tossed;
603 stats.tx_fifo_errors += comp->sls_o_compressed;
604 stats.collisions += comp->sls_o_misses;
606 #endif /* CONFIG_INET */
610 /* Netdevice register callback */
612 static int sl_init(struct net_device *dev)
614 struct slip *sl = netdev_priv(dev);
617 * Finish setting up the DEVICE info.
621 dev->type = ARPHRD_SLIP + sl->mode;
622 #ifdef SL_CHECK_TRANSMIT
623 dev->tx_timeout = sl_tx_timeout;
624 dev->watchdog_timeo = 20*HZ;
630 static void sl_uninit(struct net_device *dev)
632 struct slip *sl = netdev_priv(dev);
637 static void sl_setup(struct net_device *dev)
640 dev->uninit = sl_uninit;
642 dev->destructor = free_netdev;
643 dev->stop = sl_close;
644 dev->get_stats = sl_get_stats;
645 dev->change_mtu = sl_change_mtu;
646 dev->hard_start_xmit = sl_xmit;
647 #ifdef CONFIG_SLIP_SMART
648 dev->do_ioctl = sl_ioctl;
650 dev->hard_header_len = 0;
652 dev->tx_queue_len = 10;
654 SET_MODULE_OWNER(dev);
656 /* New-style flags. */
657 dev->flags = IFF_NOARP|IFF_POINTOPOINT|IFF_MULTICAST;
660 /******************************************
661 Routines looking at TTY side.
662 ******************************************/
665 static int slip_receive_room(struct tty_struct *tty)
667 return 65536; /* We can handle an infinite amount of data. :-) */
671 * Handle the 'receiver data ready' interrupt.
672 * This function is called by the 'tty_io' module in the kernel when
673 * a block of SLIP data has been received, which can now be decapsulated
674 * and sent on to some IP layer for further processing. This will not
675 * be re-entered while running but other ldisc functions may be called
679 static void slip_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)
681 struct slip *sl = (struct slip *) tty->disc_data;
683 if (!sl || sl->magic != SLIP_MAGIC ||
684 !netif_running(sl->dev))
687 /* Read the characters out of the buffer */
690 if (!test_and_set_bit(SLF_ERROR, &sl->flags)) {
696 #ifdef CONFIG_SLIP_MODE_SLIP6
697 if (sl->mode & SL_MODE_SLIP6)
698 slip_unesc6(sl, *cp++);
701 slip_unesc(sl, *cp++);
705 /************************************
706 * slip_open helper routines.
707 ************************************/
709 /* Collect hanged up channels */
711 static void sl_sync(void)
714 struct net_device *dev;
717 for (i = 0; i < slip_maxdev; i++) {
718 if ((dev = slip_devs[i]) == NULL)
721 sl = netdev_priv(dev);
722 if (sl->tty || sl->leased)
724 if (dev->flags&IFF_UP)
730 /* Find a free SLIP channel, and link in this `tty' line. */
737 struct net_device *dev = NULL;
740 if (slip_devs == NULL)
741 return NULL; /* Master array missing ! */
743 for (i = 0; i < slip_maxdev; i++) {
748 sl = netdev_priv(dev);
750 if (sl->line != line)
755 /* Clear ESCAPE & ERROR flags */
756 sl->flags &= (1 << SLF_INUSE);
763 if (current->pid == sl->pid) {
764 if (sl->line == line && score < 3) {
775 if (sl->line == line && score < 1) {
790 sl = netdev_priv(dev);
791 sl->flags &= (1 << SLF_INUSE);
796 /* Sorry, too many, all slots in use */
797 if (i >= slip_maxdev)
801 sl = netdev_priv(dev);
802 if (test_bit(SLF_INUSE, &sl->flags)) {
803 unregister_netdevice(dev);
811 sprintf(name, "sl%d", i);
813 dev = alloc_netdev(sizeof(*sl), name, sl_setup);
819 sl = netdev_priv(dev);
821 /* Initialize channel control data */
822 sl->magic = SLIP_MAGIC;
824 spin_lock_init(&sl->lock);
825 sl->mode = SL_MODE_DEFAULT;
826 #ifdef CONFIG_SLIP_SMART
827 init_timer(&sl->keepalive_timer); /* initialize timer_list struct */
828 sl->keepalive_timer.data=(unsigned long)sl;
829 sl->keepalive_timer.function=sl_keepalive;
830 init_timer(&sl->outfill_timer);
831 sl->outfill_timer.data=(unsigned long)sl;
832 sl->outfill_timer.function=sl_outfill;
840 * Open the high-level part of the SLIP channel.
841 * This function is called by the TTY module when the
842 * SLIP line discipline is called for. Because we are
843 * sure the tty line exists, we only have to link it to
844 * a free SLIP channel...
846 * Called in process context serialized from other ldisc calls.
849 static int slip_open(struct tty_struct *tty)
854 if(!capable(CAP_NET_ADMIN))
857 /* RTnetlink lock is misused here to serialize concurrent
858 opens of slip channels. There are better ways, but it is
863 /* Collect hanged up channels. */
866 sl = (struct slip *) tty->disc_data;
869 /* First make sure we're not already connected. */
870 if (sl && sl->magic == SLIP_MAGIC)
873 /* OK. Find a free SLIP channel to use. */
875 if ((sl = sl_alloc(tty_devnum(tty))) == NULL)
880 sl->line = tty_devnum(tty);
881 sl->pid = current->pid;
883 /* FIXME: already done before we were called - seems this can go */
884 if (tty->driver->flush_buffer)
885 tty->driver->flush_buffer(tty);
887 if (!test_bit(SLF_INUSE, &sl->flags)) {
888 /* Perform the low-level SLIP initialization. */
889 if ((err = sl_alloc_bufs(sl, SL_MTU)) != 0)
892 set_bit(SLF_INUSE, &sl->flags);
894 if ((err = register_netdevice(sl->dev)))
898 #ifdef CONFIG_SLIP_SMART
900 sl->keepalive_timer.expires=jiffies+sl->keepalive*HZ;
901 add_timer (&sl->keepalive_timer);
904 sl->outfill_timer.expires=jiffies+sl->outfill*HZ;
905 add_timer (&sl->outfill_timer);
909 /* Done. We have linked the TTY line to a channel. */
911 return sl->dev->base_addr;
918 tty->disc_data = NULL;
919 clear_bit(SLF_INUSE, &sl->flags);
924 /* Count references from TTY module */
930 FIXME: 1,2 are fixed 3 was never true anyway.
932 Let me to blame a bit.
933 1. TTY module calls this funstion on soft interrupt.
934 2. TTY module calls this function WITH MASKED INTERRUPTS!
935 3. TTY module does not notify us about line discipline
938 Seems, now it is clean. The solution is to consider netdevice and
939 line discipline sides as two independent threads.
941 By-product (not desired): sl? does not feel hangups and remains open.
942 It is supposed, that user level program (dip, diald, slattach...)
943 will catch SIGHUP and make the rest of work.
945 I see no way to make more with current tty code. --ANK
949 * Close down a SLIP channel.
950 * This means flushing out any pending queues, and then returning. This
951 * call is serialized against other ldisc functions.
954 slip_close(struct tty_struct *tty)
956 struct slip *sl = (struct slip *) tty->disc_data;
958 /* First make sure we're connected. */
959 if (!sl || sl->magic != SLIP_MAGIC || sl->tty != tty)
962 tty->disc_data = NULL;
967 /* VSV = very important to remove timers */
968 #ifdef CONFIG_SLIP_SMART
969 del_timer_sync(&sl->keepalive_timer);
970 del_timer_sync(&sl->outfill_timer);
973 /* Count references from TTY module */
976 /************************************************************************
977 * STANDARD SLIP ENCAPSULATION *
978 ************************************************************************/
981 slip_esc(unsigned char *s, unsigned char *d, int len)
983 unsigned char *ptr = d;
987 * Send an initial END character to flush out any
988 * data that may have accumulated in the receiver
995 * For each byte in the packet, send the appropriate
996 * character sequence, according to the SLIP protocol.
1018 static void slip_unesc(struct slip *sl, unsigned char s)
1023 #ifdef CONFIG_SLIP_SMART
1024 /* drop keeptest bit = VSV */
1025 if (test_bit(SLF_KEEPTEST, &sl->flags))
1026 clear_bit(SLF_KEEPTEST, &sl->flags);
1029 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) && (sl->rcount > 2)) {
1032 clear_bit(SLF_ESCAPE, &sl->flags);
1037 set_bit(SLF_ESCAPE, &sl->flags);
1040 if (test_and_clear_bit(SLF_ESCAPE, &sl->flags)) {
1045 if (test_and_clear_bit(SLF_ESCAPE, &sl->flags)) {
1050 if (!test_bit(SLF_ERROR, &sl->flags)) {
1051 if (sl->rcount < sl->buffsize) {
1052 sl->rbuff[sl->rcount++] = s;
1055 sl->rx_over_errors++;
1056 set_bit(SLF_ERROR, &sl->flags);
1061 #ifdef CONFIG_SLIP_MODE_SLIP6
1062 /************************************************************************
1063 * 6 BIT SLIP ENCAPSULATION *
1064 ************************************************************************/
1067 slip_esc6(unsigned char *s, unsigned char *d, int len)
1069 unsigned char *ptr = d;
1072 unsigned short v = 0;
1076 * Send an initial END character to flush out any
1077 * data that may have accumulated in the receiver
1078 * due to line noise.
1084 * Encode the packet into printable ascii characters
1087 for (i = 0; i < len; ++i) {
1088 v = (v << 8) | s[i];
1092 c = 0x30 + ((v >> bits) & 0x3F);
1097 c = 0x30 + ((v << (6 - bits)) & 0x3F);
1105 slip_unesc6(struct slip *sl, unsigned char s)
1110 #ifdef CONFIG_SLIP_SMART
1111 /* drop keeptest bit = VSV */
1112 if (test_bit(SLF_KEEPTEST, &sl->flags))
1113 clear_bit(SLF_KEEPTEST, &sl->flags);
1116 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) && (sl->rcount > 2)) {
1122 } else if (s >= 0x30 && s < 0x70) {
1123 sl->xdata = (sl->xdata << 6) | ((s - 0x30) & 0x3F);
1125 if (sl->xbits >= 8) {
1127 c = (unsigned char)(sl->xdata >> sl->xbits);
1128 if (!test_bit(SLF_ERROR, &sl->flags)) {
1129 if (sl->rcount < sl->buffsize) {
1130 sl->rbuff[sl->rcount++] = c;
1133 sl->rx_over_errors++;
1134 set_bit(SLF_ERROR, &sl->flags);
1139 #endif /* CONFIG_SLIP_MODE_SLIP6 */
1141 /* Perform I/O control on an active SLIP channel. */
1142 static int slip_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
1144 struct slip *sl = (struct slip *) tty->disc_data;
1146 int __user *p = (int __user *)arg;
1148 /* First make sure we're connected. */
1149 if (!sl || sl->magic != SLIP_MAGIC) {
1155 tmp = strlen(sl->dev->name) + 1;
1156 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
1161 if (put_user(sl->mode, p))
1166 if (get_user(tmp, p))
1168 #ifndef SL_INCLUDE_CSLIP
1169 if (tmp & (SL_MODE_CSLIP|SL_MODE_ADAPTIVE)) {
1173 if ((tmp & (SL_MODE_ADAPTIVE | SL_MODE_CSLIP)) ==
1174 (SL_MODE_ADAPTIVE | SL_MODE_CSLIP)) {
1175 /* return -EINVAL; */
1176 tmp &= ~SL_MODE_ADAPTIVE;
1179 #ifndef CONFIG_SLIP_MODE_SLIP6
1180 if (tmp & SL_MODE_SLIP6) {
1185 sl->dev->type = ARPHRD_SLIP+sl->mode;
1191 #ifdef CONFIG_SLIP_SMART
1192 /* VSV changes start here */
1193 case SIOCSKEEPALIVE:
1194 if (get_user(tmp, p))
1196 if (tmp > 255) /* max for unchar */
1199 spin_lock_bh(&sl->lock);
1201 spin_unlock_bh(&sl->lock);
1204 if ((sl->keepalive = (unchar) tmp) != 0) {
1205 mod_timer(&sl->keepalive_timer, jiffies+sl->keepalive*HZ);
1206 set_bit(SLF_KEEPTEST, &sl->flags);
1208 del_timer (&sl->keepalive_timer);
1210 spin_unlock_bh(&sl->lock);
1213 case SIOCGKEEPALIVE:
1214 if (put_user(sl->keepalive, p))
1219 if (get_user(tmp, p))
1221 if (tmp > 255) /* max for unchar */
1223 spin_lock_bh(&sl->lock);
1225 spin_unlock_bh(&sl->lock);
1228 if ((sl->outfill = (unchar) tmp) != 0){
1229 mod_timer(&sl->outfill_timer, jiffies+sl->outfill*HZ);
1230 set_bit(SLF_OUTWAIT, &sl->flags);
1232 del_timer (&sl->outfill_timer);
1234 spin_unlock_bh(&sl->lock);
1238 if (put_user(sl->outfill, p))
1241 /* VSV changes end */
1244 /* Allow stty to read, but not set, the serial port */
1247 return n_tty_ioctl(tty, file, cmd, arg);
1250 return -ENOIOCTLCMD;
1254 /* VSV changes start here */
1255 #ifdef CONFIG_SLIP_SMART
1256 /* function do_ioctl called from net/core/dev.c
1257 to allow get/set outfill/keepalive parameter
1260 static int sl_ioctl(struct net_device *dev,struct ifreq *rq,int cmd)
1262 struct slip *sl = netdev_priv(dev);
1263 unsigned long *p = (unsigned long *)&rq->ifr_ifru;
1265 if (sl == NULL) /* Allocation failed ?? */
1268 spin_lock_bh(&sl->lock);
1271 spin_unlock_bh(&sl->lock);
1276 case SIOCSKEEPALIVE:
1277 /* max for unchar */
1278 if ((unsigned)*p > 255) {
1279 spin_unlock_bh(&sl->lock);
1282 sl->keepalive = (unchar) *p;
1283 if (sl->keepalive != 0) {
1284 sl->keepalive_timer.expires=jiffies+sl->keepalive*HZ;
1285 mod_timer(&sl->keepalive_timer, jiffies+sl->keepalive*HZ);
1286 set_bit(SLF_KEEPTEST, &sl->flags);
1288 del_timer(&sl->keepalive_timer);
1292 case SIOCGKEEPALIVE:
1297 if ((unsigned)*p > 255) { /* max for unchar */
1298 spin_unlock_bh(&sl->lock);
1301 if ((sl->outfill = (unchar)*p) != 0){
1302 mod_timer(&sl->outfill_timer, jiffies+sl->outfill*HZ);
1303 set_bit(SLF_OUTWAIT, &sl->flags);
1305 del_timer (&sl->outfill_timer);
1314 /* Resolve race condition, when ioctl'ing hanged up
1315 and opened by another process device.
1317 if (sl->tty != current->signal->tty && sl->pid != current->pid) {
1318 spin_unlock_bh(&sl->lock);
1329 spin_unlock_bh(&sl->lock);
1333 /* VSV changes end */
1335 static struct tty_ldisc sl_ldisc = {
1336 .owner = THIS_MODULE,
1337 .magic = TTY_LDISC_MAGIC,
1340 .close = slip_close,
1341 .ioctl = slip_ioctl,
1342 .receive_buf = slip_receive_buf,
1343 .receive_room = slip_receive_room,
1344 .write_wakeup = slip_write_wakeup,
1347 static int __init slip_init(void)
1351 if (slip_maxdev < 4)
1352 slip_maxdev = 4; /* Sanity */
1354 printk(KERN_INFO "SLIP: version %s (dynamic channels, max=%d)"
1355 #ifdef CONFIG_SLIP_MODE_SLIP6
1356 " (6 bit encapsulation enabled)"
1359 SLIP_VERSION, slip_maxdev );
1360 #if defined(SL_INCLUDE_CSLIP)
1361 printk(KERN_INFO "CSLIP: code copyright 1989 Regents of the University of California.\n");
1363 #ifdef CONFIG_SLIP_SMART
1364 printk(KERN_INFO "SLIP linefill/keepalive option.\n");
1367 slip_devs = kmalloc(sizeof(struct net_device *)*slip_maxdev, GFP_KERNEL);
1369 printk(KERN_ERR "SLIP: Can't allocate slip devices array! Uaargh! (-> No SLIP available)\n");
1373 /* Clear the pointer array, we allocate devices when we need them */
1374 memset(slip_devs, 0, sizeof(struct net_device *)*slip_maxdev);
1376 /* Fill in our line protocol discipline, and register it */
1377 if ((status = tty_register_ldisc(N_SLIP, &sl_ldisc)) != 0) {
1378 printk(KERN_ERR "SLIP: can't register line discipline (err = %d)\n", status);
1384 static void __exit slip_exit(void)
1387 struct net_device *dev;
1389 unsigned long timeout = jiffies + HZ;
1392 if (slip_devs == NULL)
1395 /* First of all: check for active disciplines and hangup them.
1399 set_current_state(TASK_INTERRUPTIBLE);
1400 schedule_timeout(HZ / 10);
1404 for (i = 0; i < slip_maxdev; i++) {
1408 sl = netdev_priv(dev);
1409 spin_lock_bh(&sl->lock);
1412 tty_hangup(sl->tty);
1414 spin_unlock_bh(&sl->lock);
1416 } while (busy && time_before(jiffies, timeout));
1419 for (i = 0; i < slip_maxdev; i++) {
1423 slip_devs[i] = NULL;
1425 sl = netdev_priv(dev);
1427 printk(KERN_ERR "%s: tty discipline still running\n",
1429 /* Intentionally leak the control block. */
1430 dev->destructor = NULL;
1433 unregister_netdev(dev);
1439 if ((i = tty_register_ldisc(N_SLIP, NULL)))
1441 printk(KERN_ERR "SLIP: can't unregister line discipline (err = %d)\n", i);
1445 module_init(slip_init);
1446 module_exit(slip_exit);
1448 #ifdef CONFIG_SLIP_SMART
1450 * This is start of the code for multislip style line checking
1451 * added by Stanislav Voronyi. All changes before marked VSV
1454 static void sl_outfill(unsigned long sls)
1456 struct slip *sl=(struct slip *)sls;
1458 spin_lock(&sl->lock);
1460 if (sl->tty == NULL)
1465 if( test_bit(SLF_OUTWAIT, &sl->flags) )
1467 /* no packets were transmitted, do outfill */
1468 #ifdef CONFIG_SLIP_MODE_SLIP6
1469 unsigned char s = (sl->mode & SL_MODE_SLIP6)?0x70:END;
1471 unsigned char s = END;
1473 /* put END into tty queue. Is it right ??? */
1474 if (!netif_queue_stopped(sl->dev))
1476 /* if device busy no outfill */
1477 sl->tty->driver->write(sl->tty, &s, 1);
1481 set_bit(SLF_OUTWAIT, &sl->flags);
1483 mod_timer(&sl->outfill_timer, jiffies+sl->outfill*HZ);
1486 spin_unlock(&sl->lock);
1489 static void sl_keepalive(unsigned long sls)
1491 struct slip *sl=(struct slip *)sls;
1493 spin_lock(&sl->lock);
1495 if (sl->tty == NULL)
1500 if(test_bit(SLF_KEEPTEST, &sl->flags))
1502 /* keepalive still high :(, we must hangup */
1503 if( sl->outfill ) /* outfill timer must be deleted too */
1504 (void)del_timer(&sl->outfill_timer);
1505 printk(KERN_DEBUG "%s: no packets received during keepalive timeout, hangup.\n", sl->dev->name);
1506 tty_hangup(sl->tty); /* this must hangup tty & close slip */
1507 /* I think we need not something else */
1511 set_bit(SLF_KEEPTEST, &sl->flags);
1513 mod_timer(&sl->keepalive_timer, jiffies+sl->keepalive*HZ);
1517 spin_unlock(&sl->lock);
1521 MODULE_LICENSE("GPL");
1522 MODULE_ALIAS_LDISC(N_SLIP);