mlx4_en: Fix a kernel panic when waking tx queue
[linux-2.6] / drivers / net / slip.c
1 /*
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.
5  *
6  * Version:     @(#)slip.c      0.8.3   12/24/94
7  *
8  * Authors:     Laurence Culhane, <loz@holmes.demon.co.uk>
9  *              Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
10  *
11  * Fixes:
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
15  *                                      mtu upwards. Driver now spots this
16  *                                      and grows/shrinks its buffers(hack!).
17  *                                      Memory leak if you run out of memory
18  *                                      setting up a slip driver fixed.
19  *              Matt Dillon     :       Printable slip (borrowed from NET2E)
20  *      Pauline Middelink       :       Slip driver fixes.
21  *              Alan Cox        :       Honours the old SL_COMPRESSED flag
22  *              Alan Cox        :       KISS AX.25 and AXUI IP support
23  *              Michael Riepe   :       Automatic CSLIP recognition added
24  *              Charles Hedrick :       CSLIP header length problem fix.
25  *              Alan Cox        :       Corrected non-IP cases of the above.
26  *              Alan Cox        :       Now uses hardware type as per FvK.
27  *              Alan Cox        :       Default to 192.168.0.0 (RFC 1597)
28  *              A.N.Kuznetsov   :       dev_tint() recursion fix.
29  *      Dmitry Gorodchanin      :       SLIP memory leaks
30  *      Dmitry Gorodchanin      :       Code cleanup. Reduce tty driver
31  *                                      buffering from 4096 to 256 bytes.
32  *                                      Improving SLIP response time.
33  *                                      CONFIG_SLIP_MODE_SLIP6.
34  *                                      ifconfig sl? up & down now works
35  *                                      correctly.
36  *                                      Modularization.
37  *              Alan Cox        :       Oops - fix AX.25 buffer lengths
38  *      Dmitry Gorodchanin      :       Even more cleanups. Preserve CSLIP
39  *                                      statistics. Include CSLIP code only
40  *                                      if it really needed.
41  *              Alan Cox        :       Free slhc buffers in the right place.
42  *              Alan Cox        :       Allow for digipeated IP over AX.25
43  *              Matti Aarnio    :       Dynamic SLIP devices, with ideas taken
44  *                                      from Jim Freeman's <jfree@caldera.com>
45  *                                      dynamic PPP devices.  We do NOT kfree()
46  *                                      device entries, just reg./unreg. them
47  *                                      as they are needed.  We kfree() them
48  *                                      at module cleanup.
49  *                                      With MODULE-loading ``insmod'', user
50  *                                      can issue parameter:  slip_maxdev=1024
51  *                                      (Or how much he/she wants.. Default
52  *                                      is 256)
53  *      Stanislav Voronyi       :       Slip line checking, with ideas taken
54  *                                      from multislip BSDI driver which was
55  *                                      written by Igor Chechik, RELCOM Corp.
56  *                                      Only algorithms have been ported to
57  *                                      Linux SLIP driver.
58  *      Vitaly E. Lavrov        :       Sane behaviour on tty hangup.
59  *      Alexey Kuznetsov        :       Cleanup interfaces to tty & netdevice
60  *                                      modules.
61  */
62
63 #define SL_CHECK_TRANSMIT
64 #include <linux/module.h>
65 #include <linux/moduleparam.h>
66
67 #include <asm/system.h>
68 #include <asm/uaccess.h>
69 #include <linux/bitops.h>
70 #include <linux/string.h>
71 #include <linux/mm.h>
72 #include <linux/interrupt.h>
73 #include <linux/in.h>
74 #include <linux/tty.h>
75 #include <linux/errno.h>
76 #include <linux/netdevice.h>
77 #include <linux/etherdevice.h>
78 #include <linux/skbuff.h>
79 #include <linux/rtnetlink.h>
80 #include <linux/if_arp.h>
81 #include <linux/if_slip.h>
82 #include <linux/delay.h>
83 #include <linux/init.h>
84 #include "slip.h"
85 #ifdef CONFIG_INET
86 #include <linux/ip.h>
87 #include <linux/tcp.h>
88 #include <net/slhc_vj.h>
89 #endif
90
91 #define SLIP_VERSION    "0.8.4-NET3.019-NEWTTY"
92
93 static struct net_device **slip_devs;
94
95 static int slip_maxdev = SL_NRUNIT;
96 module_param(slip_maxdev, int, 0);
97 MODULE_PARM_DESC(slip_maxdev, "Maximum number of slip devices");
98
99 static int slip_esc(unsigned char *p, unsigned char *d, int len);
100 static void slip_unesc(struct slip *sl, unsigned char c);
101 #ifdef CONFIG_SLIP_MODE_SLIP6
102 static int slip_esc6(unsigned char *p, unsigned char *d, int len);
103 static void slip_unesc6(struct slip *sl, unsigned char c);
104 #endif
105 #ifdef CONFIG_SLIP_SMART
106 static void sl_keepalive(unsigned long sls);
107 static void sl_outfill(unsigned long sls);
108 static int sl_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
109 #endif
110
111 /********************************
112 *  Buffer administration routines:
113 *       sl_alloc_bufs()
114 *       sl_free_bufs()
115 *       sl_realloc_bufs()
116 *
117 * NOTE: sl_realloc_bufs != sl_free_bufs + sl_alloc_bufs, because
118 *       sl_realloc_bufs provides strong atomicity and reallocation
119 *       on actively running device.
120 *********************************/
121
122 /*
123    Allocate channel buffers.
124  */
125
126 static int sl_alloc_bufs(struct slip *sl, int mtu)
127 {
128         int err = -ENOBUFS;
129         unsigned long len;
130         char *rbuff = NULL;
131         char *xbuff = NULL;
132 #ifdef SL_INCLUDE_CSLIP
133         char *cbuff = NULL;
134         struct slcompress *slcomp = NULL;
135 #endif
136
137         /*
138          * Allocate the SLIP frame buffers:
139          *
140          * rbuff        Receive buffer.
141          * xbuff        Transmit buffer.
142          * cbuff        Temporary compression buffer.
143          */
144         len = mtu * 2;
145
146         /*
147          * allow for arrival of larger UDP packets, even if we say not to
148          * also fixes a bug in which SunOS sends 512-byte packets even with
149          * an MSS of 128
150          */
151         if (len < 576 * 2)
152                 len = 576 * 2;
153         rbuff = kmalloc(len + 4, GFP_KERNEL);
154         if (rbuff == NULL)
155                 goto err_exit;
156         xbuff = kmalloc(len + 4, GFP_KERNEL);
157         if (xbuff == NULL)
158                 goto err_exit;
159 #ifdef SL_INCLUDE_CSLIP
160         cbuff = kmalloc(len + 4, GFP_KERNEL);
161         if (cbuff == NULL)
162                 goto err_exit;
163         slcomp = slhc_init(16, 16);
164         if (slcomp == NULL)
165                 goto err_exit;
166 #endif
167         spin_lock_bh(&sl->lock);
168         if (sl->tty == NULL) {
169                 spin_unlock_bh(&sl->lock);
170                 err = -ENODEV;
171                 goto err_exit;
172         }
173         sl->mtu      = mtu;
174         sl->buffsize = len;
175         sl->rcount   = 0;
176         sl->xleft    = 0;
177         rbuff = xchg(&sl->rbuff, rbuff);
178         xbuff = xchg(&sl->xbuff, xbuff);
179 #ifdef SL_INCLUDE_CSLIP
180         cbuff = xchg(&sl->cbuff, cbuff);
181         slcomp = xchg(&sl->slcomp, slcomp);
182 #ifdef CONFIG_SLIP_MODE_SLIP6
183         sl->xdata    = 0;
184         sl->xbits    = 0;
185 #endif
186 #endif
187         spin_unlock_bh(&sl->lock);
188         err = 0;
189
190         /* Cleanup */
191 err_exit:
192 #ifdef SL_INCLUDE_CSLIP
193         kfree(cbuff);
194         if (slcomp)
195                 slhc_free(slcomp);
196 #endif
197         kfree(xbuff);
198         kfree(rbuff);
199         return err;
200 }
201
202 /* Free a SLIP channel buffers. */
203 static void sl_free_bufs(struct slip *sl)
204 {
205         /* Free all SLIP frame buffers. */
206         kfree(xchg(&sl->rbuff, NULL));
207         kfree(xchg(&sl->xbuff, NULL));
208 #ifdef SL_INCLUDE_CSLIP
209         kfree(xchg(&sl->cbuff, NULL));
210         slhc_free(xchg(&sl->slcomp, NULL));
211 #endif
212 }
213
214 /*
215    Reallocate slip channel buffers.
216  */
217
218 static int sl_realloc_bufs(struct slip *sl, int mtu)
219 {
220         int err = 0;
221         struct net_device *dev = sl->dev;
222         unsigned char *xbuff, *rbuff;
223 #ifdef SL_INCLUDE_CSLIP
224         unsigned char *cbuff;
225 #endif
226         int len = mtu * 2;
227
228 /*
229  * allow for arrival of larger UDP packets, even if we say not to
230  * also fixes a bug in which SunOS sends 512-byte packets even with
231  * an MSS of 128
232  */
233         if (len < 576 * 2)
234                 len = 576 * 2;
235
236         xbuff = kmalloc(len + 4, GFP_ATOMIC);
237         rbuff = kmalloc(len + 4, GFP_ATOMIC);
238 #ifdef SL_INCLUDE_CSLIP
239         cbuff = kmalloc(len + 4, GFP_ATOMIC);
240 #endif
241
242
243 #ifdef SL_INCLUDE_CSLIP
244         if (xbuff == NULL || rbuff == NULL || cbuff == NULL)  {
245 #else
246         if (xbuff == NULL || rbuff == NULL)  {
247 #endif
248                 if (mtu >= sl->mtu) {
249                         printk(KERN_WARNING "%s: unable to grow slip buffers, MTU change cancelled.\n",
250                                dev->name);
251                         err = -ENOBUFS;
252                 }
253                 goto done;
254         }
255         spin_lock_bh(&sl->lock);
256
257         err = -ENODEV;
258         if (sl->tty == NULL)
259                 goto done_on_bh;
260
261         xbuff    = xchg(&sl->xbuff, xbuff);
262         rbuff    = xchg(&sl->rbuff, rbuff);
263 #ifdef SL_INCLUDE_CSLIP
264         cbuff    = xchg(&sl->cbuff, cbuff);
265 #endif
266         if (sl->xleft)  {
267                 if (sl->xleft <= len)  {
268                         memcpy(sl->xbuff, sl->xhead, sl->xleft);
269                 } else  {
270                         sl->xleft = 0;
271                         sl->tx_dropped++;
272                 }
273         }
274         sl->xhead = sl->xbuff;
275
276         if (sl->rcount)  {
277                 if (sl->rcount <= len) {
278                         memcpy(sl->rbuff, rbuff, sl->rcount);
279                 } else  {
280                         sl->rcount = 0;
281                         sl->rx_over_errors++;
282                         set_bit(SLF_ERROR, &sl->flags);
283                 }
284         }
285         sl->mtu      = mtu;
286         dev->mtu      = mtu;
287         sl->buffsize = len;
288         err = 0;
289
290 done_on_bh:
291         spin_unlock_bh(&sl->lock);
292
293 done:
294         kfree(xbuff);
295         kfree(rbuff);
296 #ifdef SL_INCLUDE_CSLIP
297         kfree(cbuff);
298 #endif
299         return err;
300 }
301
302
303 /* Set the "sending" flag.  This must be atomic hence the set_bit. */
304 static inline void sl_lock(struct slip *sl)
305 {
306         netif_stop_queue(sl->dev);
307 }
308
309
310 /* Clear the "sending" flag.  This must be atomic, hence the ASM. */
311 static inline void sl_unlock(struct slip *sl)
312 {
313         netif_wake_queue(sl->dev);
314 }
315
316 /* Send one completely decapsulated IP datagram to the IP layer. */
317 static void sl_bump(struct slip *sl)
318 {
319         struct sk_buff *skb;
320         int count;
321
322         count = sl->rcount;
323 #ifdef SL_INCLUDE_CSLIP
324         if (sl->mode & (SL_MODE_ADAPTIVE | SL_MODE_CSLIP)) {
325                 unsigned char c = sl->rbuff[0];
326                 if (c & SL_TYPE_COMPRESSED_TCP) {
327                         /* ignore compressed packets when CSLIP is off */
328                         if (!(sl->mode & SL_MODE_CSLIP)) {
329                                 printk(KERN_WARNING "%s: compressed packet ignored\n", sl->dev->name);
330                                 return;
331                         }
332                         /* make sure we've reserved enough space for uncompress
333                            to use */
334                         if (count + 80 > sl->buffsize) {
335                                 sl->rx_over_errors++;
336                                 return;
337                         }
338                         count = slhc_uncompress(sl->slcomp, sl->rbuff, count);
339                         if (count <= 0)
340                                 return;
341                 } else if (c >= SL_TYPE_UNCOMPRESSED_TCP) {
342                         if (!(sl->mode & SL_MODE_CSLIP)) {
343                                 /* turn on header compression */
344                                 sl->mode |= SL_MODE_CSLIP;
345                                 sl->mode &= ~SL_MODE_ADAPTIVE;
346                                 printk(KERN_INFO "%s: header compression turned on\n", sl->dev->name);
347                         }
348                         sl->rbuff[0] &= 0x4f;
349                         if (slhc_remember(sl->slcomp, sl->rbuff, count) <= 0)
350                                 return;
351                 }
352         }
353 #endif  /* SL_INCLUDE_CSLIP */
354
355         sl->rx_bytes += count;
356
357         skb = dev_alloc_skb(count);
358         if (skb == NULL) {
359                 printk(KERN_WARNING "%s: memory squeeze, dropping packet.\n", sl->dev->name);
360                 sl->rx_dropped++;
361                 return;
362         }
363         skb->dev = sl->dev;
364         memcpy(skb_put(skb, count), sl->rbuff, count);
365         skb_reset_mac_header(skb);
366         skb->protocol = htons(ETH_P_IP);
367         netif_rx(skb);
368         sl->rx_packets++;
369 }
370
371 /* Encapsulate one IP datagram and stuff into a TTY queue. */
372 static void sl_encaps(struct slip *sl, unsigned char *icp, int len)
373 {
374         unsigned char *p;
375         int actual, count;
376
377         if (len > sl->mtu) {            /* Sigh, shouldn't occur BUT ... */
378                 printk(KERN_WARNING "%s: truncating oversized transmit packet!\n", sl->dev->name);
379                 sl->tx_dropped++;
380                 sl_unlock(sl);
381                 return;
382         }
383
384         p = icp;
385 #ifdef SL_INCLUDE_CSLIP
386         if (sl->mode & SL_MODE_CSLIP)
387                 len = slhc_compress(sl->slcomp, p, len, sl->cbuff, &p, 1);
388 #endif
389 #ifdef CONFIG_SLIP_MODE_SLIP6
390         if (sl->mode & SL_MODE_SLIP6)
391                 count = slip_esc6(p, (unsigned char *) sl->xbuff, len);
392         else
393 #endif
394                 count = slip_esc(p, (unsigned char *) sl->xbuff, len);
395
396         /* Order of next two lines is *very* important.
397          * When we are sending a little amount of data,
398          * the transfer may be completed inside the ops->write()
399          * routine, because it's running with interrupts enabled.
400          * In this case we *never* got WRITE_WAKEUP event,
401          * if we did not request it before write operation.
402          *       14 Oct 1994  Dmitry Gorodchanin.
403          */
404         set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
405         actual = sl->tty->ops->write(sl->tty, sl->xbuff, count);
406 #ifdef SL_CHECK_TRANSMIT
407         sl->dev->trans_start = jiffies;
408 #endif
409         sl->xleft = count - actual;
410         sl->xhead = sl->xbuff + actual;
411 #ifdef CONFIG_SLIP_SMART
412         /* VSV */
413         clear_bit(SLF_OUTWAIT, &sl->flags);     /* reset outfill flag */
414 #endif
415 }
416
417 /*
418  * Called by the driver when there's room for more data.  If we have
419  * more packets to send, we send them here.
420  */
421 static void slip_write_wakeup(struct tty_struct *tty)
422 {
423         int actual;
424         struct slip *sl = tty->disc_data;
425
426         /* First make sure we're connected. */
427         if (!sl || sl->magic != SLIP_MAGIC || !netif_running(sl->dev))
428                 return;
429
430         if (sl->xleft <= 0)  {
431                 /* Now serial buffer is almost free & we can start
432                  * transmission of another packet */
433                 sl->tx_packets++;
434                 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
435                 sl_unlock(sl);
436                 return;
437         }
438
439         actual = tty->ops->write(tty, sl->xhead, sl->xleft);
440         sl->xleft -= actual;
441         sl->xhead += actual;
442 }
443
444 static void sl_tx_timeout(struct net_device *dev)
445 {
446         struct slip *sl = netdev_priv(dev);
447
448         spin_lock(&sl->lock);
449
450         if (netif_queue_stopped(dev)) {
451                 if (!netif_running(dev))
452                         goto out;
453
454                 /* May be we must check transmitter timeout here ?
455                  *      14 Oct 1994 Dmitry Gorodchanin.
456                  */
457 #ifdef SL_CHECK_TRANSMIT
458                 if (time_before(jiffies, dev->trans_start + 20 * HZ))  {
459                         /* 20 sec timeout not reached */
460                         goto out;
461                 }
462                 printk(KERN_WARNING "%s: transmit timed out, %s?\n",
463                         dev->name,
464                         (tty_chars_in_buffer(sl->tty) || sl->xleft) ?
465                                 "bad line quality" : "driver error");
466                 sl->xleft = 0;
467                 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
468                 sl_unlock(sl);
469 #endif
470         }
471 out:
472         spin_unlock(&sl->lock);
473 }
474
475
476 /* Encapsulate an IP datagram and kick it into a TTY queue. */
477 static int
478 sl_xmit(struct sk_buff *skb, struct net_device *dev)
479 {
480         struct slip *sl = netdev_priv(dev);
481
482         spin_lock(&sl->lock);
483         if (!netif_running(dev)) {
484                 spin_unlock(&sl->lock);
485                 printk(KERN_WARNING "%s: xmit call when iface is down\n", dev->name);
486                 dev_kfree_skb(skb);
487                 return 0;
488         }
489         if (sl->tty == NULL) {
490                 spin_unlock(&sl->lock);
491                 dev_kfree_skb(skb);
492                 return 0;
493         }
494
495         sl_lock(sl);
496         sl->tx_bytes += skb->len;
497         sl_encaps(sl, skb->data, skb->len);
498         spin_unlock(&sl->lock);
499
500         dev_kfree_skb(skb);
501         return 0;
502 }
503
504
505 /******************************************
506  *   Routines looking at netdevice side.
507  ******************************************/
508
509 /* Netdevice UP -> DOWN routine */
510
511 static int
512 sl_close(struct net_device *dev)
513 {
514         struct slip *sl = netdev_priv(dev);
515
516         spin_lock_bh(&sl->lock);
517         if (sl->tty)
518                 /* TTY discipline is running. */
519                 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
520         netif_stop_queue(dev);
521         sl->rcount   = 0;
522         sl->xleft    = 0;
523         spin_unlock_bh(&sl->lock);
524
525         return 0;
526 }
527
528 /* Netdevice DOWN -> UP routine */
529
530 static int sl_open(struct net_device *dev)
531 {
532         struct slip *sl = netdev_priv(dev);
533
534         if (sl->tty == NULL)
535                 return -ENODEV;
536
537         sl->flags &= (1 << SLF_INUSE);
538         netif_start_queue(dev);
539         return 0;
540 }
541
542 /* Netdevice change MTU request */
543
544 static int sl_change_mtu(struct net_device *dev, int new_mtu)
545 {
546         struct slip *sl = netdev_priv(dev);
547
548         if (new_mtu < 68 || new_mtu > 65534)
549                 return -EINVAL;
550
551         if (new_mtu != dev->mtu)
552                 return sl_realloc_bufs(sl, new_mtu);
553         return 0;
554 }
555
556 /* Netdevice get statistics request */
557
558 static struct net_device_stats *
559 sl_get_stats(struct net_device *dev)
560 {
561         static struct net_device_stats stats;
562         struct slip *sl = netdev_priv(dev);
563 #ifdef SL_INCLUDE_CSLIP
564         struct slcompress *comp;
565 #endif
566
567         memset(&stats, 0, sizeof(struct net_device_stats));
568
569         stats.rx_packets     = sl->rx_packets;
570         stats.tx_packets     = sl->tx_packets;
571         stats.rx_bytes       = sl->rx_bytes;
572         stats.tx_bytes       = sl->tx_bytes;
573         stats.rx_dropped     = sl->rx_dropped;
574         stats.tx_dropped     = sl->tx_dropped;
575         stats.tx_errors      = sl->tx_errors;
576         stats.rx_errors      = sl->rx_errors;
577         stats.rx_over_errors = sl->rx_over_errors;
578 #ifdef SL_INCLUDE_CSLIP
579         stats.rx_fifo_errors = sl->rx_compressed;
580         stats.tx_fifo_errors = sl->tx_compressed;
581         stats.collisions     = sl->tx_misses;
582         comp = sl->slcomp;
583         if (comp) {
584                 stats.rx_fifo_errors += comp->sls_i_compressed;
585                 stats.rx_dropped     += comp->sls_i_tossed;
586                 stats.tx_fifo_errors += comp->sls_o_compressed;
587                 stats.collisions     += comp->sls_o_misses;
588         }
589 #endif /* CONFIG_INET */
590         return (&stats);
591 }
592
593 /* Netdevice register callback */
594
595 static int sl_init(struct net_device *dev)
596 {
597         struct slip *sl = netdev_priv(dev);
598
599         /*
600          *      Finish setting up the DEVICE info.
601          */
602
603         dev->mtu                = sl->mtu;
604         dev->type               = ARPHRD_SLIP + sl->mode;
605 #ifdef SL_CHECK_TRANSMIT
606         dev->watchdog_timeo     = 20*HZ;
607 #endif
608         return 0;
609 }
610
611
612 static void sl_uninit(struct net_device *dev)
613 {
614         struct slip *sl = netdev_priv(dev);
615
616         sl_free_bufs(sl);
617 }
618
619 static const struct net_device_ops sl_netdev_ops = {
620         .ndo_init               = sl_init,
621         .ndo_uninit             = sl_uninit,
622         .ndo_open               = sl_open,
623         .ndo_stop               = sl_close,
624         .ndo_start_xmit         = sl_xmit,
625         .ndo_get_stats          = sl_get_stats,
626         .ndo_change_mtu         = sl_change_mtu,
627         .ndo_tx_timeout         = sl_tx_timeout,
628 #ifdef CONFIG_SLIP_SMART
629         .ndo_do_ioctl           = sl_ioctl,
630 #endif
631 };
632
633
634 static void sl_setup(struct net_device *dev)
635 {
636         dev->netdev_ops         = &sl_netdev_ops;
637         dev->destructor         = free_netdev;
638
639         dev->hard_header_len    = 0;
640         dev->addr_len           = 0;
641         dev->tx_queue_len       = 10;
642
643         /* New-style flags. */
644         dev->flags              = IFF_NOARP|IFF_POINTOPOINT|IFF_MULTICAST;
645 }
646
647 /******************************************
648   Routines looking at TTY side.
649  ******************************************/
650
651
652 /*
653  * Handle the 'receiver data ready' interrupt.
654  * This function is called by the 'tty_io' module in the kernel when
655  * a block of SLIP data has been received, which can now be decapsulated
656  * and sent on to some IP layer for further processing. This will not
657  * be re-entered while running but other ldisc functions may be called
658  * in parallel
659  */
660
661 static void slip_receive_buf(struct tty_struct *tty, const unsigned char *cp,
662                                                         char *fp, int count)
663 {
664         struct slip *sl = tty->disc_data;
665
666         if (!sl || sl->magic != SLIP_MAGIC || !netif_running(sl->dev))
667                 return;
668
669         /* Read the characters out of the buffer */
670         while (count--) {
671                 if (fp && *fp++) {
672                         if (!test_and_set_bit(SLF_ERROR, &sl->flags))
673                                 sl->rx_errors++;
674                         cp++;
675                         continue;
676                 }
677 #ifdef CONFIG_SLIP_MODE_SLIP6
678                 if (sl->mode & SL_MODE_SLIP6)
679                         slip_unesc6(sl, *cp++);
680                 else
681 #endif
682                         slip_unesc(sl, *cp++);
683         }
684 }
685
686 /************************************
687  *  slip_open helper routines.
688  ************************************/
689
690 /* Collect hanged up channels */
691 static void sl_sync(void)
692 {
693         int i;
694         struct net_device *dev;
695         struct slip       *sl;
696
697         for (i = 0; i < slip_maxdev; i++) {
698                 dev = slip_devs[i];
699                 if (dev == NULL)
700                         break;
701
702                 sl = netdev_priv(dev);
703                 if (sl->tty || sl->leased)
704                         continue;
705                 if (dev->flags & IFF_UP)
706                         dev_close(dev);
707         }
708 }
709
710
711 /* Find a free SLIP channel, and link in this `tty' line. */
712 static struct slip *sl_alloc(dev_t line)
713 {
714         int i;
715         int sel = -1;
716         int score = -1;
717         struct net_device *dev = NULL;
718         struct slip       *sl;
719
720         if (slip_devs == NULL)
721                 return NULL;    /* Master array missing ! */
722
723         for (i = 0; i < slip_maxdev; i++) {
724                 dev = slip_devs[i];
725                 if (dev == NULL)
726                         break;
727
728                 sl = netdev_priv(dev);
729                 if (sl->leased) {
730                         if (sl->line != line)
731                                 continue;
732                         if (sl->tty)
733                                 return NULL;
734
735                         /* Clear ESCAPE & ERROR flags */
736                         sl->flags &= (1 << SLF_INUSE);
737                         return sl;
738                 }
739
740                 if (sl->tty)
741                         continue;
742
743                 if (current->pid == sl->pid) {
744                         if (sl->line == line && score < 3) {
745                                 sel = i;
746                                 score = 3;
747                                 continue;
748                         }
749                         if (score < 2) {
750                                 sel = i;
751                                 score = 2;
752                         }
753                         continue;
754                 }
755                 if (sl->line == line && score < 1) {
756                         sel = i;
757                         score = 1;
758                         continue;
759                 }
760                 if (score < 0) {
761                         sel = i;
762                         score = 0;
763                 }
764         }
765
766         if (sel >= 0) {
767                 i = sel;
768                 dev = slip_devs[i];
769                 if (score > 1) {
770                         sl = netdev_priv(dev);
771                         sl->flags &= (1 << SLF_INUSE);
772                         return sl;
773                 }
774         }
775
776         /* Sorry, too many, all slots in use */
777         if (i >= slip_maxdev)
778                 return NULL;
779
780         if (dev) {
781                 sl = netdev_priv(dev);
782                 if (test_bit(SLF_INUSE, &sl->flags)) {
783                         unregister_netdevice(dev);
784                         dev = NULL;
785                         slip_devs[i] = NULL;
786                 }
787         }
788
789         if (!dev) {
790                 char name[IFNAMSIZ];
791                 sprintf(name, "sl%d", i);
792
793                 dev = alloc_netdev(sizeof(*sl), name, sl_setup);
794                 if (!dev)
795                         return NULL;
796                 dev->base_addr  = i;
797         }
798
799         sl = netdev_priv(dev);
800
801         /* Initialize channel control data */
802         sl->magic       = SLIP_MAGIC;
803         sl->dev         = dev;
804         spin_lock_init(&sl->lock);
805         sl->mode        = SL_MODE_DEFAULT;
806 #ifdef CONFIG_SLIP_SMART
807         /* initialize timer_list struct */
808         init_timer(&sl->keepalive_timer);
809         sl->keepalive_timer.data = (unsigned long)sl;
810         sl->keepalive_timer.function = sl_keepalive;
811         init_timer(&sl->outfill_timer);
812         sl->outfill_timer.data = (unsigned long)sl;
813         sl->outfill_timer.function = sl_outfill;
814 #endif
815         slip_devs[i] = dev;
816         return sl;
817 }
818
819 /*
820  * Open the high-level part of the SLIP channel.
821  * This function is called by the TTY module when the
822  * SLIP line discipline is called for.  Because we are
823  * sure the tty line exists, we only have to link it to
824  * a free SLIP channel...
825  *
826  * Called in process context serialized from other ldisc calls.
827  */
828
829 static int slip_open(struct tty_struct *tty)
830 {
831         struct slip *sl;
832         int err;
833
834         if (!capable(CAP_NET_ADMIN))
835                 return -EPERM;
836
837         if (tty->ops->write == NULL)
838                 return -EOPNOTSUPP;
839
840         /* RTnetlink lock is misused here to serialize concurrent
841            opens of slip channels. There are better ways, but it is
842            the simplest one.
843          */
844         rtnl_lock();
845
846         /* Collect hanged up channels. */
847         sl_sync();
848
849         sl = tty->disc_data;
850
851         err = -EEXIST;
852         /* First make sure we're not already connected. */
853         if (sl && sl->magic == SLIP_MAGIC)
854                 goto err_exit;
855
856         /* OK.  Find a free SLIP channel to use. */
857         err = -ENFILE;
858         sl = sl_alloc(tty_devnum(tty));
859         if (sl == NULL)
860                 goto err_exit;
861
862         sl->tty = tty;
863         tty->disc_data = sl;
864         sl->line = tty_devnum(tty);
865         sl->pid = current->pid;
866
867         if (!test_bit(SLF_INUSE, &sl->flags)) {
868                 /* Perform the low-level SLIP initialization. */
869                 err = sl_alloc_bufs(sl, SL_MTU);
870                 if (err)
871                         goto err_free_chan;
872
873                 set_bit(SLF_INUSE, &sl->flags);
874
875                 err = register_netdevice(sl->dev);
876                 if (err)
877                         goto err_free_bufs;
878         }
879
880 #ifdef CONFIG_SLIP_SMART
881         if (sl->keepalive) {
882                 sl->keepalive_timer.expires = jiffies + sl->keepalive * HZ;
883                 add_timer(&sl->keepalive_timer);
884         }
885         if (sl->outfill) {
886                 sl->outfill_timer.expires = jiffies + sl->outfill * HZ;
887                 add_timer(&sl->outfill_timer);
888         }
889 #endif
890
891         /* Done.  We have linked the TTY line to a channel. */
892         rtnl_unlock();
893         tty->receive_room = 65536;      /* We don't flow control */
894         return sl->dev->base_addr;
895
896 err_free_bufs:
897         sl_free_bufs(sl);
898
899 err_free_chan:
900         sl->tty = NULL;
901         tty->disc_data = NULL;
902         clear_bit(SLF_INUSE, &sl->flags);
903
904 err_exit:
905         rtnl_unlock();
906
907         /* Count references from TTY module */
908         return err;
909 }
910
911 /*
912
913   FIXME: 1,2 are fixed 3 was never true anyway.
914
915    Let me to blame a bit.
916    1. TTY module calls this funstion on soft interrupt.
917    2. TTY module calls this function WITH MASKED INTERRUPTS!
918    3. TTY module does not notify us about line discipline
919       shutdown,
920
921    Seems, now it is clean. The solution is to consider netdevice and
922    line discipline sides as two independent threads.
923
924    By-product (not desired): sl? does not feel hangups and remains open.
925    It is supposed, that user level program (dip, diald, slattach...)
926    will catch SIGHUP and make the rest of work.
927
928    I see no way to make more with current tty code. --ANK
929  */
930
931 /*
932  * Close down a SLIP channel.
933  * This means flushing out any pending queues, and then returning. This
934  * call is serialized against other ldisc functions.
935  */
936 static void slip_close(struct tty_struct *tty)
937 {
938         struct slip *sl = tty->disc_data;
939
940         /* First make sure we're connected. */
941         if (!sl || sl->magic != SLIP_MAGIC || sl->tty != tty)
942                 return;
943
944         tty->disc_data = NULL;
945         sl->tty = NULL;
946         if (!sl->leased)
947                 sl->line = 0;
948
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);
953 #endif
954
955         /* Count references from TTY module */
956 }
957
958  /************************************************************************
959   *                     STANDARD SLIP ENCAPSULATION                      *
960   ************************************************************************/
961
962 static int slip_esc(unsigned char *s, unsigned char *d, int len)
963 {
964         unsigned char *ptr = d;
965         unsigned char c;
966
967         /*
968          * Send an initial END character to flush out any
969          * data that may have accumulated in the receiver
970          * due to line noise.
971          */
972
973         *ptr++ = END;
974
975         /*
976          * For each byte in the packet, send the appropriate
977          * character sequence, according to the SLIP protocol.
978          */
979
980         while (len-- > 0) {
981                 switch (c = *s++) {
982                 case END:
983                         *ptr++ = ESC;
984                         *ptr++ = ESC_END;
985                         break;
986                 case ESC:
987                         *ptr++ = ESC;
988                         *ptr++ = ESC_ESC;
989                         break;
990                 default:
991                         *ptr++ = c;
992                         break;
993                 }
994         }
995         *ptr++ = END;
996         return (ptr - d);
997 }
998
999 static void slip_unesc(struct slip *sl, unsigned char s)
1000 {
1001
1002         switch (s) {
1003         case END:
1004 #ifdef CONFIG_SLIP_SMART
1005                 /* drop keeptest bit = VSV */
1006                 if (test_bit(SLF_KEEPTEST, &sl->flags))
1007                         clear_bit(SLF_KEEPTEST, &sl->flags);
1008 #endif
1009
1010                 if (!test_and_clear_bit(SLF_ERROR, &sl->flags)
1011                                                         && (sl->rcount > 2))
1012                         sl_bump(sl);
1013                 clear_bit(SLF_ESCAPE, &sl->flags);
1014                 sl->rcount = 0;
1015                 return;
1016
1017         case ESC:
1018                 set_bit(SLF_ESCAPE, &sl->flags);
1019                 return;
1020         case ESC_ESC:
1021                 if (test_and_clear_bit(SLF_ESCAPE, &sl->flags))
1022                         s = ESC;
1023                 break;
1024         case ESC_END:
1025                 if (test_and_clear_bit(SLF_ESCAPE, &sl->flags))
1026                         s = END;
1027                 break;
1028         }
1029         if (!test_bit(SLF_ERROR, &sl->flags))  {
1030                 if (sl->rcount < sl->buffsize)  {
1031                         sl->rbuff[sl->rcount++] = s;
1032                         return;
1033                 }
1034                 sl->rx_over_errors++;
1035                 set_bit(SLF_ERROR, &sl->flags);
1036         }
1037 }
1038
1039
1040 #ifdef CONFIG_SLIP_MODE_SLIP6
1041 /************************************************************************
1042  *                       6 BIT SLIP ENCAPSULATION                       *
1043  ************************************************************************/
1044
1045 static int slip_esc6(unsigned char *s, unsigned char *d, int len)
1046 {
1047         unsigned char *ptr = d;
1048         unsigned char c;
1049         int i;
1050         unsigned short v = 0;
1051         short bits = 0;
1052
1053         /*
1054          * Send an initial END character to flush out any
1055          * data that may have accumulated in the receiver
1056          * due to line noise.
1057          */
1058
1059         *ptr++ = 0x70;
1060
1061         /*
1062          * Encode the packet into printable ascii characters
1063          */
1064
1065         for (i = 0; i < len; ++i) {
1066                 v = (v << 8) | s[i];
1067                 bits += 8;
1068                 while (bits >= 6) {
1069                         bits -= 6;
1070                         c = 0x30 + ((v >> bits) & 0x3F);
1071                         *ptr++ = c;
1072                 }
1073         }
1074         if (bits) {
1075                 c = 0x30 + ((v << (6 - bits)) & 0x3F);
1076                 *ptr++ = c;
1077         }
1078         *ptr++ = 0x70;
1079         return ptr - d;
1080 }
1081
1082 static void slip_unesc6(struct slip *sl, unsigned char s)
1083 {
1084         unsigned char c;
1085
1086         if (s == 0x70) {
1087 #ifdef CONFIG_SLIP_SMART
1088                 /* drop keeptest bit = VSV */
1089                 if (test_bit(SLF_KEEPTEST, &sl->flags))
1090                         clear_bit(SLF_KEEPTEST, &sl->flags);
1091 #endif
1092
1093                 if (!test_and_clear_bit(SLF_ERROR, &sl->flags)
1094                                                         && (sl->rcount > 2))
1095                         sl_bump(sl);
1096                 sl->rcount = 0;
1097                 sl->xbits = 0;
1098                 sl->xdata = 0;
1099         } else if (s >= 0x30 && s < 0x70) {
1100                 sl->xdata = (sl->xdata << 6) | ((s - 0x30) & 0x3F);
1101                 sl->xbits += 6;
1102                 if (sl->xbits >= 8) {
1103                         sl->xbits -= 8;
1104                         c = (unsigned char)(sl->xdata >> sl->xbits);
1105                         if (!test_bit(SLF_ERROR, &sl->flags))  {
1106                                 if (sl->rcount < sl->buffsize)  {
1107                                         sl->rbuff[sl->rcount++] = c;
1108                                         return;
1109                                 }
1110                                 sl->rx_over_errors++;
1111                                 set_bit(SLF_ERROR, &sl->flags);
1112                         }
1113                 }
1114         }
1115 }
1116 #endif /* CONFIG_SLIP_MODE_SLIP6 */
1117
1118 /* Perform I/O control on an active SLIP channel. */
1119 static int slip_ioctl(struct tty_struct *tty, struct file *file,
1120                                         unsigned int cmd, unsigned long arg)
1121 {
1122         struct slip *sl = tty->disc_data;
1123         unsigned int tmp;
1124         int __user *p = (int __user *)arg;
1125
1126         /* First make sure we're connected. */
1127         if (!sl || sl->magic != SLIP_MAGIC)
1128                 return -EINVAL;
1129
1130         switch (cmd) {
1131         case SIOCGIFNAME:
1132                 tmp = strlen(sl->dev->name) + 1;
1133                 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
1134                         return -EFAULT;
1135                 return 0;
1136
1137         case SIOCGIFENCAP:
1138                 if (put_user(sl->mode, p))
1139                         return -EFAULT;
1140                 return 0;
1141
1142         case SIOCSIFENCAP:
1143                 if (get_user(tmp, p))
1144                         return -EFAULT;
1145 #ifndef SL_INCLUDE_CSLIP
1146                 if (tmp & (SL_MODE_CSLIP|SL_MODE_ADAPTIVE))
1147                         return -EINVAL;
1148 #else
1149                 if ((tmp & (SL_MODE_ADAPTIVE | SL_MODE_CSLIP)) ==
1150                     (SL_MODE_ADAPTIVE | SL_MODE_CSLIP))
1151                         /* return -EINVAL; */
1152                         tmp &= ~SL_MODE_ADAPTIVE;
1153 #endif
1154 #ifndef CONFIG_SLIP_MODE_SLIP6
1155                 if (tmp & SL_MODE_SLIP6)
1156                         return -EINVAL;
1157 #endif
1158                 sl->mode = tmp;
1159                 sl->dev->type = ARPHRD_SLIP + sl->mode;
1160                 return 0;
1161
1162         case SIOCSIFHWADDR:
1163                 return -EINVAL;
1164
1165 #ifdef CONFIG_SLIP_SMART
1166         /* VSV changes start here */
1167         case SIOCSKEEPALIVE:
1168                 if (get_user(tmp, p))
1169                         return -EFAULT;
1170                 if (tmp > 255) /* max for unchar */
1171                         return -EINVAL;
1172
1173                 spin_lock_bh(&sl->lock);
1174                 if (!sl->tty) {
1175                         spin_unlock_bh(&sl->lock);
1176                         return -ENODEV;
1177                 }
1178                 sl->keepalive = (u8)tmp;
1179                 if (sl->keepalive != 0) {
1180                         mod_timer(&sl->keepalive_timer,
1181                                         jiffies + sl->keepalive * HZ);
1182                         set_bit(SLF_KEEPTEST, &sl->flags);
1183                 } else
1184                         del_timer(&sl->keepalive_timer);
1185                 spin_unlock_bh(&sl->lock);
1186                 return 0;
1187
1188         case SIOCGKEEPALIVE:
1189                 if (put_user(sl->keepalive, p))
1190                         return -EFAULT;
1191                 return 0;
1192
1193         case SIOCSOUTFILL:
1194                 if (get_user(tmp, p))
1195                         return -EFAULT;
1196                 if (tmp > 255) /* max for unchar */
1197                         return -EINVAL;
1198                 spin_lock_bh(&sl->lock);
1199                 if (!sl->tty) {
1200                         spin_unlock_bh(&sl->lock);
1201                         return -ENODEV;
1202                 }
1203                 sl->outfill = (u8)tmp;
1204                 if (sl->outfill != 0) {
1205                         mod_timer(&sl->outfill_timer,
1206                                                 jiffies + sl->outfill * HZ);
1207                         set_bit(SLF_OUTWAIT, &sl->flags);
1208                 } else
1209                         del_timer(&sl->outfill_timer);
1210                 spin_unlock_bh(&sl->lock);
1211                 return 0;
1212
1213         case SIOCGOUTFILL:
1214                 if (put_user(sl->outfill, p))
1215                         return -EFAULT;
1216                 return 0;
1217         /* VSV changes end */
1218 #endif
1219         default:
1220                 return tty_mode_ioctl(tty, file, cmd, arg);
1221         }
1222 }
1223
1224 /* VSV changes start here */
1225 #ifdef CONFIG_SLIP_SMART
1226 /* function do_ioctl called from net/core/dev.c
1227    to allow get/set outfill/keepalive parameter
1228    by ifconfig                                 */
1229
1230 static int sl_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1231 {
1232         struct slip *sl = netdev_priv(dev);
1233         unsigned long *p = (unsigned long *)&rq->ifr_ifru;
1234
1235         if (sl == NULL)         /* Allocation failed ?? */
1236                 return -ENODEV;
1237
1238         spin_lock_bh(&sl->lock);
1239
1240         if (!sl->tty) {
1241                 spin_unlock_bh(&sl->lock);
1242                 return -ENODEV;
1243         }
1244
1245         switch (cmd) {
1246         case SIOCSKEEPALIVE:
1247                 /* max for unchar */
1248                 if ((unsigned)*p > 255) {
1249                         spin_unlock_bh(&sl->lock);
1250                         return -EINVAL;
1251                 }
1252                 sl->keepalive = (u8)*p;
1253                 if (sl->keepalive != 0) {
1254                         sl->keepalive_timer.expires =
1255                                                 jiffies + sl->keepalive * HZ;
1256                         mod_timer(&sl->keepalive_timer,
1257                                                 jiffies + sl->keepalive * HZ);
1258                         set_bit(SLF_KEEPTEST, &sl->flags);
1259                 } else
1260                         del_timer(&sl->keepalive_timer);
1261                 break;
1262
1263         case SIOCGKEEPALIVE:
1264                 *p = sl->keepalive;
1265                 break;
1266
1267         case SIOCSOUTFILL:
1268                 if ((unsigned)*p > 255) { /* max for unchar */
1269                         spin_unlock_bh(&sl->lock);
1270                         return -EINVAL;
1271                 }
1272                 sl->outfill = (u8)*p;
1273                 if (sl->outfill != 0) {
1274                         mod_timer(&sl->outfill_timer,
1275                                                 jiffies + sl->outfill * HZ);
1276                         set_bit(SLF_OUTWAIT, &sl->flags);
1277                 } else
1278                         del_timer(&sl->outfill_timer);
1279                 break;
1280
1281         case SIOCGOUTFILL:
1282                 *p = sl->outfill;
1283                 break;
1284
1285         case SIOCSLEASE:
1286                 /* Resolve race condition, when ioctl'ing hanged up
1287                    and opened by another process device.
1288                  */
1289                 if (sl->tty != current->signal->tty &&
1290                                                 sl->pid != current->pid) {
1291                         spin_unlock_bh(&sl->lock);
1292                         return -EPERM;
1293                 }
1294                 sl->leased = 0;
1295                 if (*p)
1296                         sl->leased = 1;
1297                 break;
1298
1299         case SIOCGLEASE:
1300                 *p = sl->leased;
1301         };
1302         spin_unlock_bh(&sl->lock);
1303         return 0;
1304 }
1305 #endif
1306 /* VSV changes end */
1307
1308 static struct tty_ldisc_ops sl_ldisc = {
1309         .owner          = THIS_MODULE,
1310         .magic          = TTY_LDISC_MAGIC,
1311         .name           = "slip",
1312         .open           = slip_open,
1313         .close          = slip_close,
1314         .ioctl          = slip_ioctl,
1315         .receive_buf    = slip_receive_buf,
1316         .write_wakeup   = slip_write_wakeup,
1317 };
1318
1319 static int __init slip_init(void)
1320 {
1321         int status;
1322
1323         if (slip_maxdev < 4)
1324                 slip_maxdev = 4; /* Sanity */
1325
1326         printk(KERN_INFO "SLIP: version %s (dynamic channels, max=%d)"
1327 #ifdef CONFIG_SLIP_MODE_SLIP6
1328                " (6 bit encapsulation enabled)"
1329 #endif
1330                ".\n",
1331                SLIP_VERSION, slip_maxdev);
1332 #if defined(SL_INCLUDE_CSLIP)
1333         printk(KERN_INFO "CSLIP: code copyright 1989 Regents of the University of California.\n");
1334 #endif
1335 #ifdef CONFIG_SLIP_SMART
1336         printk(KERN_INFO "SLIP linefill/keepalive option.\n");
1337 #endif
1338
1339         slip_devs = kzalloc(sizeof(struct net_device *)*slip_maxdev,
1340                                                                 GFP_KERNEL);
1341         if (!slip_devs) {
1342                 printk(KERN_ERR "SLIP: Can't allocate slip devices array.\n");
1343                 return -ENOMEM;
1344         }
1345
1346         /* Fill in our line protocol discipline, and register it */
1347         status = tty_register_ldisc(N_SLIP, &sl_ldisc);
1348         if (status != 0) {
1349                 printk(KERN_ERR "SLIP: can't register line discipline (err = %d)\n", status);
1350                 kfree(slip_devs);
1351         }
1352         return status;
1353 }
1354
1355 static void __exit slip_exit(void)
1356 {
1357         int i;
1358         struct net_device *dev;
1359         struct slip *sl;
1360         unsigned long timeout = jiffies + HZ;
1361         int busy = 0;
1362
1363         if (slip_devs == NULL)
1364                 return;
1365
1366         /* First of all: check for active disciplines and hangup them.
1367          */
1368         do {
1369                 if (busy)
1370                         msleep_interruptible(100);
1371
1372                 busy = 0;
1373                 for (i = 0; i < slip_maxdev; i++) {
1374                         dev = slip_devs[i];
1375                         if (!dev)
1376                                 continue;
1377                         sl = netdev_priv(dev);
1378                         spin_lock_bh(&sl->lock);
1379                         if (sl->tty) {
1380                                 busy++;
1381                                 tty_hangup(sl->tty);
1382                         }
1383                         spin_unlock_bh(&sl->lock);
1384                 }
1385         } while (busy && time_before(jiffies, timeout));
1386
1387
1388         for (i = 0; i < slip_maxdev; i++) {
1389                 dev = slip_devs[i];
1390                 if (!dev)
1391                         continue;
1392                 slip_devs[i] = NULL;
1393
1394                 sl = netdev_priv(dev);
1395                 if (sl->tty) {
1396                         printk(KERN_ERR "%s: tty discipline still running\n",
1397                                dev->name);
1398                         /* Intentionally leak the control block. */
1399                         dev->destructor = NULL;
1400                 }
1401
1402                 unregister_netdev(dev);
1403         }
1404
1405         kfree(slip_devs);
1406         slip_devs = NULL;
1407
1408         i = tty_unregister_ldisc(N_SLIP);
1409         if (i != 0)
1410                 printk(KERN_ERR "SLIP: can't unregister line discipline (err = %d)\n", i);
1411 }
1412
1413 module_init(slip_init);
1414 module_exit(slip_exit);
1415
1416 #ifdef CONFIG_SLIP_SMART
1417 /*
1418  * This is start of the code for multislip style line checking
1419  * added by Stanislav Voronyi. All changes before marked VSV
1420  */
1421
1422 static void sl_outfill(unsigned long sls)
1423 {
1424         struct slip *sl = (struct slip *)sls;
1425
1426         spin_lock(&sl->lock);
1427
1428         if (sl->tty == NULL)
1429                 goto out;
1430
1431         if (sl->outfill) {
1432                 if (test_bit(SLF_OUTWAIT, &sl->flags)) {
1433                         /* no packets were transmitted, do outfill */
1434 #ifdef CONFIG_SLIP_MODE_SLIP6
1435                         unsigned char s = (sl->mode & SL_MODE_SLIP6)?0x70:END;
1436 #else
1437                         unsigned char s = END;
1438 #endif
1439                         /* put END into tty queue. Is it right ??? */
1440                         if (!netif_queue_stopped(sl->dev)) {
1441                                 /* if device busy no outfill */
1442                                 sl->tty->ops->write(sl->tty, &s, 1);
1443                         }
1444                 } else
1445                         set_bit(SLF_OUTWAIT, &sl->flags);
1446
1447                 mod_timer(&sl->outfill_timer, jiffies+sl->outfill*HZ);
1448         }
1449 out:
1450         spin_unlock(&sl->lock);
1451 }
1452
1453 static void sl_keepalive(unsigned long sls)
1454 {
1455         struct slip *sl = (struct slip *)sls;
1456
1457         spin_lock(&sl->lock);
1458
1459         if (sl->tty == NULL)
1460                 goto out;
1461
1462         if (sl->keepalive) {
1463                 if (test_bit(SLF_KEEPTEST, &sl->flags)) {
1464                         /* keepalive still high :(, we must hangup */
1465                         if (sl->outfill)
1466                                 /* outfill timer must be deleted too */
1467                                 (void)del_timer(&sl->outfill_timer);
1468                         printk(KERN_DEBUG "%s: no packets received during keepalive timeout, hangup.\n", sl->dev->name);
1469                         /* this must hangup tty & close slip */
1470                         tty_hangup(sl->tty);
1471                         /* I think we need not something else */
1472                         goto out;
1473                 } else
1474                         set_bit(SLF_KEEPTEST, &sl->flags);
1475
1476                 mod_timer(&sl->keepalive_timer, jiffies+sl->keepalive*HZ);
1477         }
1478 out:
1479         spin_unlock(&sl->lock);
1480 }
1481
1482 #endif
1483 MODULE_LICENSE("GPL");
1484 MODULE_ALIAS_LDISC(N_SLIP);