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
8 * Authors: Laurence Culhane, <loz@holmes.demon.co.uk>
9 * Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
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
41 * from Jim Freeman's <jfree@caldera.com>
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>
61 #include <asm/system.h>
62 #include <asm/uaccess.h>
63 #include <asm/bitops.h>
64 #include <linux/string.h>
66 #include <linux/interrupt.h>
68 #include <linux/tty.h>
69 #include <linux/errno.h>
70 #include <linux/netdevice.h>
71 #include <linux/etherdevice.h>
72 #include <linux/skbuff.h>
73 #include <linux/rtnetlink.h>
74 #include <linux/if_arp.h>
75 #include <linux/if_slip.h>
76 #include <linux/init.h>
80 #include <linux/tcp.h>
81 #include <net/slhc_vj.h>
85 #define SLIP_VERSION "0.8.4-NET3.019-NEWTTY-MODULAR"
87 #define SLIP_VERSION "0.8.4-NET3.019-NEWTTY"
91 typedef struct slip_ctrl {
92 struct slip ctrl; /* SLIP things */
93 struct net_device dev; /* the device */
95 static slip_ctrl_t **slip_ctrls;
97 int slip_maxdev = SL_NRUNIT; /* Can be overridden with insmod! */
98 MODULE_PARM(slip_maxdev, "i");
99 MODULE_PARM_DESC(slip_maxdev, "Maximum number of slip devices");
101 static struct tty_ldisc sl_ldisc;
103 static int slip_esc(unsigned char *p, unsigned char *d, int len);
104 static void slip_unesc(struct slip *sl, unsigned char c);
105 #ifdef CONFIG_SLIP_MODE_SLIP6
106 static int slip_esc6(unsigned char *p, unsigned char *d, int len);
107 static void slip_unesc6(struct slip *sl, unsigned char c);
109 #ifdef CONFIG_SLIP_SMART
110 static void sl_keepalive(unsigned long sls);
111 static void sl_outfill(unsigned long sls);
112 static int sl_ioctl(struct net_device *dev,struct ifreq *rq,int cmd);
115 /********************************
116 * Buffer administration routines:
121 * NOTE: sl_realloc_bufs != sl_free_bufs + sl_alloc_bufs, because
122 * sl_realloc_bufs provides strong atomicity and reallocation
123 * on actively running device.
124 *********************************/
127 Allocate channel buffers.
131 sl_alloc_bufs(struct slip *sl, int mtu)
137 #ifdef SL_INCLUDE_CSLIP
139 struct slcompress *slcomp = NULL;
143 * Allocate the SLIP frame buffers:
145 * rbuff Receive buffer.
146 * xbuff Transmit buffer.
147 * cbuff Temporary compression buffer.
152 * allow for arrival of larger UDP packets, even if we say not to
153 * also fixes a bug in which SunOS sends 512-byte packets even with
158 rbuff = kmalloc(len + 4, GFP_KERNEL);
161 xbuff = kmalloc(len + 4, GFP_KERNEL);
164 #ifdef SL_INCLUDE_CSLIP
165 cbuff = kmalloc(len + 4, GFP_KERNEL);
168 slcomp = slhc_init(16, 16);
172 spin_lock_bh(&sl->lock);
173 if (sl->tty == NULL) {
174 spin_unlock_bh(&sl->lock);
182 rbuff = xchg(&sl->rbuff, rbuff);
183 xbuff = xchg(&sl->xbuff, xbuff);
184 #ifdef SL_INCLUDE_CSLIP
185 cbuff = xchg(&sl->cbuff, cbuff);
186 slcomp = xchg(&sl->slcomp, slcomp);
187 #ifdef CONFIG_SLIP_MODE_SLIP6
192 spin_unlock_bh(&sl->lock);
197 #ifdef SL_INCLUDE_CSLIP
210 /* Free a SLIP channel buffers. */
212 sl_free_bufs(struct slip *sl)
216 /* Free all SLIP frame buffers. */
217 if ((tmp = xchg(&sl->rbuff, NULL)) != NULL)
219 if ((tmp = xchg(&sl->xbuff, NULL)) != NULL)
221 #ifdef SL_INCLUDE_CSLIP
222 if ((tmp = xchg(&sl->cbuff, NULL)) != NULL)
224 if ((tmp = xchg(&sl->slcomp, NULL)) != NULL)
230 Reallocate slip channel buffers.
233 static int sl_realloc_bufs(struct slip *sl, int mtu)
236 struct net_device *dev = sl->dev;
237 unsigned char *xbuff, *rbuff;
238 #ifdef SL_INCLUDE_CSLIP
239 unsigned char *cbuff;
244 * allow for arrival of larger UDP packets, even if we say not to
245 * also fixes a bug in which SunOS sends 512-byte packets even with
251 xbuff = (unsigned char *) kmalloc (len + 4, GFP_ATOMIC);
252 rbuff = (unsigned char *) kmalloc (len + 4, GFP_ATOMIC);
253 #ifdef SL_INCLUDE_CSLIP
254 cbuff = (unsigned char *) kmalloc (len + 4, GFP_ATOMIC);
258 #ifdef SL_INCLUDE_CSLIP
259 if (xbuff == NULL || rbuff == NULL || cbuff == NULL) {
261 if (xbuff == NULL || rbuff == NULL) {
263 if (mtu >= sl->mtu) {
264 printk("%s: unable to grow slip buffers, MTU change cancelled.\n",
271 spin_lock_bh(&sl->lock);
277 xbuff = xchg(&sl->xbuff, xbuff);
278 rbuff = xchg(&sl->rbuff, rbuff);
279 #ifdef SL_INCLUDE_CSLIP
280 cbuff = xchg(&sl->cbuff, cbuff);
283 if (sl->xleft <= len) {
284 memcpy(sl->xbuff, sl->xhead, sl->xleft);
290 sl->xhead = sl->xbuff;
293 if (sl->rcount <= len) {
294 memcpy(sl->rbuff, rbuff, sl->rcount);
297 sl->rx_over_errors++;
298 set_bit(SLF_ERROR, &sl->flags);
307 spin_unlock_bh(&sl->lock);
314 #ifdef SL_INCLUDE_CSLIP
322 /* Set the "sending" flag. This must be atomic hence the set_bit. */
324 sl_lock(struct slip *sl)
326 netif_stop_queue(sl->dev);
330 /* Clear the "sending" flag. This must be atomic, hence the ASM. */
332 sl_unlock(struct slip *sl)
334 netif_wake_queue(sl->dev);
337 /* Send one completely decapsulated IP datagram to the IP layer. */
339 sl_bump(struct slip *sl)
345 #ifdef SL_INCLUDE_CSLIP
346 if (sl->mode & (SL_MODE_ADAPTIVE | SL_MODE_CSLIP)) {
348 if ((c = sl->rbuff[0]) & SL_TYPE_COMPRESSED_TCP) {
349 /* ignore compressed packets when CSLIP is off */
350 if (!(sl->mode & SL_MODE_CSLIP)) {
351 printk("%s: compressed packet ignored\n", sl->dev->name);
354 /* make sure we've reserved enough space for uncompress to use */
355 if (count + 80 > sl->buffsize) {
356 sl->rx_over_errors++;
359 count = slhc_uncompress(sl->slcomp, sl->rbuff, count);
363 } else if (c >= SL_TYPE_UNCOMPRESSED_TCP) {
364 if (!(sl->mode & SL_MODE_CSLIP)) {
365 /* turn on header compression */
366 sl->mode |= SL_MODE_CSLIP;
367 sl->mode &= ~SL_MODE_ADAPTIVE;
368 printk("%s: header compression turned on\n", sl->dev->name);
370 sl->rbuff[0] &= 0x4f;
371 if (slhc_remember(sl->slcomp, sl->rbuff, count) <= 0) {
376 #endif /* SL_INCLUDE_CSLIP */
380 skb = dev_alloc_skb(count);
382 printk("%s: memory squeeze, dropping packet.\n", sl->dev->name);
387 memcpy(skb_put(skb,count), sl->rbuff, count);
388 skb->mac.raw=skb->data;
389 skb->protocol=htons(ETH_P_IP);
391 sl->dev->last_rx = jiffies;
395 /* Encapsulate one IP datagram and stuff into a TTY queue. */
397 sl_encaps(struct slip *sl, unsigned char *icp, int len)
402 if (len > sl->mtu) { /* Sigh, shouldn't occur BUT ... */
403 printk ("%s: truncating oversized transmit packet!\n", sl->dev->name);
410 #ifdef SL_INCLUDE_CSLIP
411 if (sl->mode & SL_MODE_CSLIP) {
412 len = slhc_compress(sl->slcomp, p, len, sl->cbuff, &p, 1);
415 #ifdef CONFIG_SLIP_MODE_SLIP6
416 if(sl->mode & SL_MODE_SLIP6)
417 count = slip_esc6(p, (unsigned char *) sl->xbuff, len);
420 count = slip_esc(p, (unsigned char *) sl->xbuff, len);
422 /* Order of next two lines is *very* important.
423 * When we are sending a little amount of data,
424 * the transfer may be completed inside driver.write()
425 * routine, because it's running with interrupts enabled.
426 * In this case we *never* got WRITE_WAKEUP event,
427 * if we did not request it before write operation.
428 * 14 Oct 1994 Dmitry Gorodchanin.
430 sl->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
431 actual = sl->tty->driver.write(sl->tty, 0, sl->xbuff, count);
432 #ifdef SL_CHECK_TRANSMIT
433 sl->dev->trans_start = jiffies;
435 sl->xleft = count - actual;
436 sl->xhead = sl->xbuff + actual;
437 #ifdef CONFIG_SLIP_SMART
439 clear_bit(SLF_OUTWAIT, &sl->flags); /* reset outfill flag */
444 * Called by the driver when there's room for more data. If we have
445 * more packets to send, we send them here.
447 static void slip_write_wakeup(struct tty_struct *tty)
450 struct slip *sl = (struct slip *) tty->disc_data;
452 /* First make sure we're connected. */
453 if (!sl || sl->magic != SLIP_MAGIC || !netif_running(sl->dev)) {
456 if (sl->xleft <= 0) {
457 /* Now serial buffer is almost free & we can start
458 * transmission of another packet */
460 tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
465 actual = tty->driver.write(tty, 0, sl->xhead, sl->xleft);
470 static void sl_tx_timeout(struct net_device *dev)
472 struct slip *sl = (struct slip*)(dev->priv);
474 spin_lock(&sl->lock);
476 if (netif_queue_stopped(dev)) {
477 struct slip *sl = (struct slip*)(dev->priv);
479 if (!netif_running(dev))
482 /* May be we must check transmitter timeout here ?
483 * 14 Oct 1994 Dmitry Gorodchanin.
485 #ifdef SL_CHECK_TRANSMIT
486 if (time_before(jiffies, dev->trans_start + 20 * HZ)) {
487 /* 20 sec timeout not reached */
490 printk("%s: transmit timed out, %s?\n", dev->name,
491 (sl->tty->driver.chars_in_buffer(sl->tty) || sl->xleft) ?
492 "bad line quality" : "driver error");
494 sl->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
500 spin_unlock(&sl->lock);
504 /* Encapsulate an IP datagram and kick it into a TTY queue. */
506 sl_xmit(struct sk_buff *skb, struct net_device *dev)
508 struct slip *sl = (struct slip*)(dev->priv);
510 spin_lock(&sl->lock);
511 if (!netif_running(dev)) {
512 spin_unlock(&sl->lock);
513 printk("%s: xmit call when iface is down\n", dev->name);
517 if (sl->tty == NULL) {
518 spin_unlock(&sl->lock);
524 sl->tx_bytes+=skb->len;
525 sl_encaps(sl, skb->data, skb->len);
526 spin_unlock(&sl->lock);
533 /******************************************
534 * Routines looking at netdevice side.
535 ******************************************/
537 /* Netdevice UP -> DOWN routine */
540 sl_close(struct net_device *dev)
542 struct slip *sl = (struct slip*)(dev->priv);
544 spin_lock_bh(&sl->lock);
546 /* TTY discipline is running. */
547 sl->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
549 netif_stop_queue(dev);
552 spin_unlock_bh(&sl->lock);
557 /* Netdevice DOWN -> UP routine */
559 static int sl_open(struct net_device *dev)
561 struct slip *sl = (struct slip*)(dev->priv);
566 sl->flags &= (1 << SLF_INUSE);
567 netif_start_queue(dev);
571 /* Netdevice change MTU request */
573 static int sl_change_mtu(struct net_device *dev, int new_mtu)
575 struct slip *sl = (struct slip*)(dev->priv);
577 if (new_mtu < 68 || new_mtu > 65534)
580 if (new_mtu != dev->mtu)
581 return sl_realloc_bufs(sl, new_mtu);
585 /* Netdevice get statistics request */
587 static struct net_device_stats *
588 sl_get_stats(struct net_device *dev)
590 static struct net_device_stats stats;
591 struct slip *sl = (struct slip*)(dev->priv);
592 #ifdef SL_INCLUDE_CSLIP
593 struct slcompress *comp;
596 memset(&stats, 0, sizeof(struct net_device_stats));
598 stats.rx_packets = sl->rx_packets;
599 stats.tx_packets = sl->tx_packets;
600 stats.rx_bytes = sl->rx_bytes;
601 stats.tx_bytes = sl->tx_bytes;
602 stats.rx_dropped = sl->rx_dropped;
603 stats.tx_dropped = sl->tx_dropped;
604 stats.tx_errors = sl->tx_errors;
605 stats.rx_errors = sl->rx_errors;
606 stats.rx_over_errors = sl->rx_over_errors;
607 #ifdef SL_INCLUDE_CSLIP
608 stats.rx_fifo_errors = sl->rx_compressed;
609 stats.tx_fifo_errors = sl->tx_compressed;
610 stats.collisions = sl->tx_misses;
613 stats.rx_fifo_errors += comp->sls_i_compressed;
614 stats.rx_dropped += comp->sls_i_tossed;
615 stats.tx_fifo_errors += comp->sls_o_compressed;
616 stats.collisions += comp->sls_o_misses;
618 #endif /* CONFIG_INET */
622 /* Netdevice register callback */
624 static int sl_init(struct net_device *dev)
626 struct slip *sl = (struct slip*)(dev->priv);
629 * Finish setting up the DEVICE info.
633 dev->hard_start_xmit = sl_xmit;
634 #ifdef SL_CHECK_TRANSMIT
635 dev->tx_timeout = sl_tx_timeout;
636 dev->watchdog_timeo = 20*HZ;
639 dev->stop = sl_close;
640 dev->get_stats = sl_get_stats;
641 dev->change_mtu = sl_change_mtu;
642 #ifdef CONFIG_SLIP_SMART
643 dev->do_ioctl = sl_ioctl;
645 dev->hard_header_len = 0;
647 dev->type = ARPHRD_SLIP + sl->mode;
648 dev->tx_queue_len = 10;
650 SET_MODULE_OWNER(dev);
652 /* New-style flags. */
653 dev->flags = IFF_NOARP|IFF_POINTOPOINT|IFF_MULTICAST;
659 /******************************************
660 Routines looking at TTY side.
661 ******************************************/
664 static int slip_receive_room(struct tty_struct *tty)
666 return 65536; /* We can handle an infinite amount of data. :-) */
670 * Handle the 'receiver data ready' interrupt.
671 * This function is called by the 'tty_io' module in the kernel when
672 * a block of SLIP data has been received, which can now be decapsulated
673 * and sent on to some IP layer for further processing.
676 static void slip_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)
678 struct slip *sl = (struct slip *) tty->disc_data;
680 if (!sl || sl->magic != SLIP_MAGIC ||
681 !netif_running(sl->dev))
684 /* Read the characters out of the buffer */
687 if (!test_and_set_bit(SLF_ERROR, &sl->flags)) {
693 #ifdef CONFIG_SLIP_MODE_SLIP6
694 if (sl->mode & SL_MODE_SLIP6)
695 slip_unesc6(sl, *cp++);
698 slip_unesc(sl, *cp++);
702 /************************************
703 * slip_open helper routines.
704 ************************************/
706 /* Collect hanged up channels */
708 static void sl_sync(void)
712 for (i = 0; i < slip_maxdev; i++) {
713 slip_ctrl_t *slp = slip_ctrls[i];
716 if (slp->ctrl.tty || slp->ctrl.leased)
718 if (slp->dev.flags&IFF_UP)
719 dev_close(&slp->dev);
723 /* Find a free SLIP channel, and link in this `tty' line. */
725 sl_alloc(kdev_t line)
728 slip_ctrl_t *slp = NULL;
733 if (slip_ctrls == NULL)
734 return NULL; /* Master array missing ! */
736 for (i = 0; i < slip_maxdev; i++) {
741 if (slp->ctrl.leased) {
742 if (slp->ctrl.line != line)
747 /* Clear ESCAPE & ERROR flags */
748 slp->ctrl.flags &= (1 << SLF_INUSE);
755 if (current->pid == slp->ctrl.pid) {
756 if (slp->ctrl.line == line && score < 3) {
767 if (slp->ctrl.line == line && score < 1) {
782 slp->ctrl.flags &= (1 << SLF_INUSE);
787 /* Sorry, too many, all slots in use */
788 if (i >= slip_maxdev)
792 if (test_bit(SLF_INUSE, &slp->ctrl.flags)) {
793 unregister_netdevice(&slp->dev);
794 sl_free_bufs(&slp->ctrl);
796 } else if ((slp = (slip_ctrl_t *)kmalloc(sizeof(slip_ctrl_t),GFP_KERNEL)) == NULL)
799 memset(slp, 0, sizeof(slip_ctrl_t));
802 /* Initialize channel control data */
803 sl->magic = SLIP_MAGIC;
805 spin_lock_init(&sl->lock);
806 sl->mode = SL_MODE_DEFAULT;
807 sprintf(slp->dev.name, "sl%d", i);
808 slp->dev.base_addr = i;
809 slp->dev.priv = (void*)sl;
810 slp->dev.init = sl_init;
811 #ifdef CONFIG_SLIP_SMART
812 init_timer(&sl->keepalive_timer); /* initialize timer_list struct */
813 sl->keepalive_timer.data=(unsigned long)sl;
814 sl->keepalive_timer.function=sl_keepalive;
815 init_timer(&sl->outfill_timer);
816 sl->outfill_timer.data=(unsigned long)sl;
817 sl->outfill_timer.function=sl_outfill;
824 * Open the high-level part of the SLIP channel.
825 * This function is called by the TTY module when the
826 * SLIP line discipline is called for. Because we are
827 * sure the tty line exists, we only have to link it to
828 * a free SLIP channel...
831 slip_open(struct tty_struct *tty)
836 if(!capable(CAP_NET_ADMIN))
841 /* RTnetlink lock is misused here to serialize concurrent
842 opens of slip channels. There are better ways, but it is
847 /* Collect hanged up channels. */
850 sl = (struct slip *) tty->disc_data;
853 /* First make sure we're not already connected. */
854 if (sl && sl->magic == SLIP_MAGIC)
857 /* OK. Find a free SLIP channel to use. */
859 if ((sl = sl_alloc(tty->device)) == NULL)
864 sl->line = tty->device;
865 sl->pid = current->pid;
866 if (tty->driver.flush_buffer)
867 tty->driver.flush_buffer(tty);
868 if (tty->ldisc.flush_buffer)
869 tty->ldisc.flush_buffer(tty);
871 if (!test_bit(SLF_INUSE, &sl->flags)) {
872 /* Perform the low-level SLIP initialization. */
873 if ((err = sl_alloc_bufs(sl, SL_MTU)) != 0)
876 if (register_netdevice(sl->dev)) {
881 set_bit(SLF_INUSE, &sl->flags);
884 #ifdef CONFIG_SLIP_SMART
886 sl->keepalive_timer.expires=jiffies+sl->keepalive*HZ;
887 add_timer (&sl->keepalive_timer);
890 sl->outfill_timer.expires=jiffies+sl->outfill*HZ;
891 add_timer (&sl->outfill_timer);
895 /* Done. We have linked the TTY line to a channel. */
897 return sl->dev->base_addr;
901 tty->disc_data = NULL;
902 clear_bit(SLF_INUSE, &sl->flags);
907 /* Count references from TTY module */
913 Let me to blame a bit.
914 1. TTY module calls this funstion on soft interrupt.
915 2. TTY module calls this function WITH MASKED INTERRUPTS!
916 3. TTY module does not notify us about line discipline
919 Seems, now it is clean. The solution is to consider netdevice and
920 line discipline sides as two independent threads.
922 By-product (not desired): sl? does not feel hangups and remains open.
923 It is supposed, that user level program (dip, diald, slattach...)
924 will catch SIGHUP and make the rest of work.
926 I see no way to make more with current tty code. --ANK
930 * Close down a SLIP channel.
931 * This means flushing out any pending queues, and then restoring the
932 * TTY line discipline to what it was before it got hooked to SLIP
933 * (which usually is TTY again).
936 slip_close(struct tty_struct *tty)
938 struct slip *sl = (struct slip *) tty->disc_data;
940 /* First make sure we're connected. */
941 if (!sl || sl->magic != SLIP_MAGIC || sl->tty != tty)
949 /* VSV = very important to remove timers */
950 #ifdef CONFIG_SLIP_SMART
951 del_timer_sync(&sl->keepalive_timer);
952 del_timer_sync(&sl->outfill_timer);
955 /* Count references from TTY module */
959 /************************************************************************
960 * STANDARD SLIP ENCAPSULATION *
961 ************************************************************************/
964 slip_esc(unsigned char *s, unsigned char *d, int len)
966 unsigned char *ptr = d;
970 * Send an initial END character to flush out any
971 * data that may have accumulated in the receiver
978 * For each byte in the packet, send the appropriate
979 * character sequence, according to the SLIP protocol.
1001 static void slip_unesc(struct slip *sl, unsigned char s)
1006 #ifdef CONFIG_SLIP_SMART
1007 /* drop keeptest bit = VSV */
1008 if (test_bit(SLF_KEEPTEST, &sl->flags))
1009 clear_bit(SLF_KEEPTEST, &sl->flags);
1012 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) && (sl->rcount > 2)) {
1015 clear_bit(SLF_ESCAPE, &sl->flags);
1020 set_bit(SLF_ESCAPE, &sl->flags);
1023 if (test_and_clear_bit(SLF_ESCAPE, &sl->flags)) {
1028 if (test_and_clear_bit(SLF_ESCAPE, &sl->flags)) {
1033 if (!test_bit(SLF_ERROR, &sl->flags)) {
1034 if (sl->rcount < sl->buffsize) {
1035 sl->rbuff[sl->rcount++] = s;
1038 sl->rx_over_errors++;
1039 set_bit(SLF_ERROR, &sl->flags);
1044 #ifdef CONFIG_SLIP_MODE_SLIP6
1045 /************************************************************************
1046 * 6 BIT SLIP ENCAPSULATION *
1047 ************************************************************************/
1050 slip_esc6(unsigned char *s, unsigned char *d, int len)
1052 unsigned char *ptr = d;
1055 unsigned short v = 0;
1059 * Send an initial END character to flush out any
1060 * data that may have accumulated in the receiver
1061 * due to line noise.
1067 * Encode the packet into printable ascii characters
1070 for (i = 0; i < len; ++i) {
1071 v = (v << 8) | s[i];
1075 c = 0x30 + ((v >> bits) & 0x3F);
1080 c = 0x30 + ((v << (6 - bits)) & 0x3F);
1088 slip_unesc6(struct slip *sl, unsigned char s)
1093 #ifdef CONFIG_SLIP_SMART
1094 /* drop keeptest bit = VSV */
1095 if (test_bit(SLF_KEEPTEST, &sl->flags))
1096 clear_bit(SLF_KEEPTEST, &sl->flags);
1099 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) && (sl->rcount > 2)) {
1105 } else if (s >= 0x30 && s < 0x70) {
1106 sl->xdata = (sl->xdata << 6) | ((s - 0x30) & 0x3F);
1108 if (sl->xbits >= 8) {
1110 c = (unsigned char)(sl->xdata >> sl->xbits);
1111 if (!test_bit(SLF_ERROR, &sl->flags)) {
1112 if (sl->rcount < sl->buffsize) {
1113 sl->rbuff[sl->rcount++] = c;
1116 sl->rx_over_errors++;
1117 set_bit(SLF_ERROR, &sl->flags);
1122 #endif /* CONFIG_SLIP_MODE_SLIP6 */
1124 /* Perform I/O control on an active SLIP channel. */
1126 slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg)
1128 struct slip *sl = (struct slip *) tty->disc_data;
1131 /* First make sure we're connected. */
1132 if (!sl || sl->magic != SLIP_MAGIC) {
1138 /* Please, do not put this line under copy_to_user,
1139 it breaks my old poor gcc on alpha --ANK
1141 tmp = strlen(sl->dev->name) + 1;
1142 if (copy_to_user(arg, sl->dev->name, tmp))
1147 if (put_user(sl->mode, (int *)arg))
1152 if (get_user(tmp,(int *)arg))
1154 #ifndef SL_INCLUDE_CSLIP
1155 if (tmp & (SL_MODE_CSLIP|SL_MODE_ADAPTIVE)) {
1159 if ((tmp & (SL_MODE_ADAPTIVE | SL_MODE_CSLIP)) ==
1160 (SL_MODE_ADAPTIVE | SL_MODE_CSLIP)) {
1161 /* return -EINVAL; */
1162 tmp &= ~SL_MODE_ADAPTIVE;
1165 #ifndef CONFIG_SLIP_MODE_SLIP6
1166 if (tmp & SL_MODE_SLIP6) {
1171 sl->dev->type = ARPHRD_SLIP+sl->mode;
1177 #ifdef CONFIG_SLIP_SMART
1178 /* VSV changes start here */
1179 case SIOCSKEEPALIVE:
1180 if (get_user(tmp,(int *)arg))
1182 if (tmp > 255) /* max for unchar */
1185 spin_lock_bh(&sl->lock);
1187 spin_unlock_bh(&sl->lock);
1190 if ((sl->keepalive = (unchar) tmp) != 0) {
1191 mod_timer(&sl->keepalive_timer, jiffies+sl->keepalive*HZ);
1192 set_bit(SLF_KEEPTEST, &sl->flags);
1194 del_timer (&sl->keepalive_timer);
1196 spin_unlock_bh(&sl->lock);
1199 case SIOCGKEEPALIVE:
1200 if (put_user(sl->keepalive, (int *)arg))
1205 if (get_user(tmp,(int *)arg))
1207 if (tmp > 255) /* max for unchar */
1209 spin_lock_bh(&sl->lock);
1211 spin_unlock_bh(&sl->lock);
1214 if ((sl->outfill = (unchar) tmp) != 0){
1215 mod_timer(&sl->outfill_timer, jiffies+sl->outfill*HZ);
1216 set_bit(SLF_OUTWAIT, &sl->flags);
1218 del_timer (&sl->outfill_timer);
1220 spin_unlock_bh(&sl->lock);
1224 if (put_user(sl->outfill, (int *)arg))
1227 /* VSV changes end */
1230 /* Allow stty to read, but not set, the serial port */
1233 return n_tty_ioctl(tty, (struct file *) file, cmd, (unsigned long) arg);
1236 return -ENOIOCTLCMD;
1240 /* VSV changes start here */
1241 #ifdef CONFIG_SLIP_SMART
1242 /* function do_ioctl called from net/core/dev.c
1243 to allow get/set outfill/keepalive parameter
1246 static int sl_ioctl(struct net_device *dev,struct ifreq *rq,int cmd)
1248 struct slip *sl = (struct slip*)(dev->priv);
1250 if (sl == NULL) /* Allocation failed ?? */
1253 spin_lock_bh(&sl->lock);
1256 spin_unlock_bh(&sl->lock);
1261 case SIOCSKEEPALIVE:
1262 /* max for unchar */
1263 if (((unsigned int)((unsigned long)rq->ifr_data)) > 255) {
1264 spin_unlock_bh(&sl->lock);
1267 sl->keepalive = (unchar) ((unsigned long)rq->ifr_data);
1268 if (sl->keepalive != 0) {
1269 sl->keepalive_timer.expires=jiffies+sl->keepalive*HZ;
1270 mod_timer(&sl->keepalive_timer, jiffies+sl->keepalive*HZ);
1271 set_bit(SLF_KEEPTEST, &sl->flags);
1273 del_timer(&sl->keepalive_timer);
1277 case SIOCGKEEPALIVE:
1278 rq->ifr_data=(caddr_t)((unsigned long)sl->keepalive);
1282 if (((unsigned)((unsigned long)rq->ifr_data)) > 255) { /* max for unchar */
1283 spin_unlock_bh(&sl->lock);
1286 if ((sl->outfill = (unchar)((unsigned long) rq->ifr_data)) != 0){
1287 mod_timer(&sl->outfill_timer, jiffies+sl->outfill*HZ);
1288 set_bit(SLF_OUTWAIT, &sl->flags);
1290 del_timer (&sl->outfill_timer);
1295 rq->ifr_data=(caddr_t)((unsigned long)sl->outfill);
1299 /* Resolve race condition, when ioctl'ing hanged up
1300 and opened by another process device.
1302 if (sl->tty != current->tty && sl->pid != current->pid) {
1303 spin_unlock_bh(&sl->lock);
1307 if ((unsigned long)rq->ifr_data)
1312 rq->ifr_data=(caddr_t)((unsigned long)sl->leased);
1314 spin_unlock_bh(&sl->lock);
1318 /* VSV changes end */
1320 /* Initialize SLIP control device -- register SLIP line discipline */
1322 int __init slip_init_ctrl_dev(void)
1326 if (slip_maxdev < 4) slip_maxdev = 4; /* Sanity */
1328 printk(KERN_INFO "SLIP: version %s (dynamic channels, max=%d)"
1329 #ifdef CONFIG_SLIP_MODE_SLIP6
1330 " (6 bit encapsulation enabled)"
1333 SLIP_VERSION, slip_maxdev );
1334 #if defined(SL_INCLUDE_CSLIP) && !defined(MODULE)
1335 printk("CSLIP: code copyright 1989 Regents of the University of California.\n");
1337 #ifdef CONFIG_SLIP_SMART
1338 printk(KERN_INFO "SLIP linefill/keepalive option.\n");
1341 slip_ctrls = (slip_ctrl_t **) kmalloc(sizeof(void*)*slip_maxdev, GFP_KERNEL);
1342 if (slip_ctrls == NULL)
1344 printk("SLIP: Can't allocate slip_ctrls[] array! Uaargh! (-> No SLIP available)\n");
1348 /* Clear the pointer array, we allocate devices when we need them */
1349 memset(slip_ctrls, 0, sizeof(void*)*slip_maxdev); /* Pointers */
1351 /* Fill in our line protocol discipline, and register it */
1352 memset(&sl_ldisc, 0, sizeof(sl_ldisc));
1353 sl_ldisc.magic = TTY_LDISC_MAGIC;
1354 sl_ldisc.name = "slip";
1356 sl_ldisc.open = slip_open;
1357 sl_ldisc.close = slip_close;
1358 sl_ldisc.read = NULL;
1359 sl_ldisc.write = NULL;
1360 sl_ldisc.ioctl = (int (*)(struct tty_struct *, struct file *,
1361 unsigned int, unsigned long)) slip_ioctl;
1362 sl_ldisc.poll = NULL;
1363 sl_ldisc.receive_buf = slip_receive_buf;
1364 sl_ldisc.receive_room = slip_receive_room;
1365 sl_ldisc.write_wakeup = slip_write_wakeup;
1366 if ((status = tty_register_ldisc(N_SLIP, &sl_ldisc)) != 0) {
1367 printk("SLIP: can't register line discipline (err = %d)\n", status);
1381 return slip_init_ctrl_dev();
1385 cleanup_module(void)
1389 if (slip_ctrls != NULL) {
1390 unsigned long timeout = jiffies + HZ;
1393 /* First of all: check for active disciplines and hangup them.
1401 for (i = 0; i < slip_maxdev; i++) {
1402 struct slip_ctrl *slc = slip_ctrls[i];
1405 spin_lock(&slc->ctrl.lock);
1406 if (slc->ctrl.tty) {
1408 tty_hangup(slc->ctrl.tty);
1410 spin_unlock(&slc->ctrl.lock);
1413 } while (busy && time_before(jiffies, timeout));
1416 for (i = 0; i < slip_maxdev; i++) {
1417 struct slip_ctrl *slc = slip_ctrls[i];
1419 unregister_netdev(&slc->dev);
1420 if (slc->ctrl.tty) {
1421 printk("%s: tty discipline is still running\n", slc->dev.name);
1422 /* Pin module forever */
1427 sl_free_bufs(&slc->ctrl);
1429 slip_ctrls[i] = NULL;
1437 if ((i = tty_register_ldisc(N_SLIP, NULL)))
1439 printk("SLIP: can't unregister line discipline (err = %d)\n", i);
1444 #ifdef CONFIG_SLIP_SMART
1446 * This is start of the code for multislip style line checking
1447 * added by Stanislav Voronyi. All changes before marked VSV
1450 static void sl_outfill(unsigned long sls)
1452 struct slip *sl=(struct slip *)sls;
1454 spin_lock(&sl->lock);
1456 if (sl->tty == NULL)
1461 if( test_bit(SLF_OUTWAIT, &sl->flags) )
1463 /* no packets were transmitted, do outfill */
1464 #ifdef CONFIG_SLIP_MODE_SLIP6
1465 unsigned char s = (sl->mode & SL_MODE_SLIP6)?0x70:END;
1467 unsigned char s = END;
1469 /* put END into tty queue. Is it right ??? */
1470 if (!netif_queue_stopped(sl->dev))
1472 /* if device busy no outfill */
1473 sl->tty->driver.write(sl->tty, 0, &s, 1);
1477 set_bit(SLF_OUTWAIT, &sl->flags);
1479 mod_timer(&sl->outfill_timer, jiffies+sl->outfill*HZ);
1482 spin_unlock(&sl->lock);
1485 static void sl_keepalive(unsigned long sls)
1487 struct slip *sl=(struct slip *)sls;
1489 spin_lock(&sl->lock);
1491 if (sl->tty == NULL)
1496 if(test_bit(SLF_KEEPTEST, &sl->flags))
1498 /* keepalive still high :(, we must hangup */
1499 if( sl->outfill ) /* outfill timer must be deleted too */
1500 (void)del_timer(&sl->outfill_timer);
1501 printk("%s: no packets received during keepalive timeout, hangup.\n", sl->dev->name);
1502 tty_hangup(sl->tty); /* this must hangup tty & close slip */
1503 /* I think we need not something else */
1507 set_bit(SLF_KEEPTEST, &sl->flags);
1509 mod_timer(&sl->keepalive_timer, jiffies+sl->keepalive*HZ);
1513 spin_unlock(&sl->lock);
1517 MODULE_LICENSE("GPL");