e17c535a577efeb9d1b6447243423590246263f0
[linux-3.10.git] / 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 netdev_tx_t
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 NETDEV_TX_OK;
488         }
489         if (sl->tty == NULL) {
490                 spin_unlock(&sl->lock);
491                 dev_kfree_skb(skb);
492                 return NETDEV_TX_OK;
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 NETDEV_TX_OK;
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 /* Hook the destructor so we can free slip devices at the right point in time */
620 static void sl_free_netdev(struct net_device *dev)
621 {
622         int i = dev->base_addr;
623         free_netdev(dev);
624         slip_devs[i] = NULL;
625 }
626
627 static const struct net_device_ops sl_netdev_ops = {
628         .ndo_init               = sl_init,
629         .ndo_uninit             = sl_uninit,
630         .ndo_open               = sl_open,
631         .ndo_stop               = sl_close,
632         .ndo_start_xmit         = sl_xmit,
633         .ndo_get_stats          = sl_get_stats,
634         .ndo_change_mtu         = sl_change_mtu,
635         .ndo_tx_timeout         = sl_tx_timeout,
636 #ifdef CONFIG_SLIP_SMART
637         .ndo_do_ioctl           = sl_ioctl,
638 #endif
639 };
640
641
642 static void sl_setup(struct net_device *dev)
643 {
644         dev->netdev_ops         = &sl_netdev_ops;
645         dev->destructor         = sl_free_netdev;
646
647         dev->hard_header_len    = 0;
648         dev->addr_len           = 0;
649         dev->tx_queue_len       = 10;
650
651         /* New-style flags. */
652         dev->flags              = IFF_NOARP|IFF_POINTOPOINT|IFF_MULTICAST;
653 }
654
655 /******************************************
656   Routines looking at TTY side.
657  ******************************************/
658
659
660 /*
661  * Handle the 'receiver data ready' interrupt.
662  * This function is called by the 'tty_io' module in the kernel when
663  * a block of SLIP data has been received, which can now be decapsulated
664  * and sent on to some IP layer for further processing. This will not
665  * be re-entered while running but other ldisc functions may be called
666  * in parallel
667  */
668
669 static void slip_receive_buf(struct tty_struct *tty, const unsigned char *cp,
670                                                         char *fp, int count)
671 {
672         struct slip *sl = tty->disc_data;
673
674         if (!sl || sl->magic != SLIP_MAGIC || !netif_running(sl->dev))
675                 return;
676
677         /* Read the characters out of the buffer */
678         while (count--) {
679                 if (fp && *fp++) {
680                         if (!test_and_set_bit(SLF_ERROR, &sl->flags))
681                                 sl->rx_errors++;
682                         cp++;
683                         continue;
684                 }
685 #ifdef CONFIG_SLIP_MODE_SLIP6
686                 if (sl->mode & SL_MODE_SLIP6)
687                         slip_unesc6(sl, *cp++);
688                 else
689 #endif
690                         slip_unesc(sl, *cp++);
691         }
692 }
693
694 /************************************
695  *  slip_open helper routines.
696  ************************************/
697
698 /* Collect hanged up channels */
699 static void sl_sync(void)
700 {
701         int i;
702         struct net_device *dev;
703         struct slip       *sl;
704
705         for (i = 0; i < slip_maxdev; i++) {
706                 dev = slip_devs[i];
707                 if (dev == NULL)
708                         break;
709
710                 sl = netdev_priv(dev);
711                 if (sl->tty || sl->leased)
712                         continue;
713                 if (dev->flags & IFF_UP)
714                         dev_close(dev);
715         }
716 }
717
718
719 /* Find a free SLIP channel, and link in this `tty' line. */
720 static struct slip *sl_alloc(dev_t line)
721 {
722         int i;
723         struct net_device *dev = NULL;
724         struct slip       *sl;
725
726         if (slip_devs == NULL)
727                 return NULL;    /* Master array missing ! */
728
729         for (i = 0; i < slip_maxdev; i++) {
730                 dev = slip_devs[i];
731                 if (dev == NULL)
732                         break;
733         }
734         /* Sorry, too many, all slots in use */
735         if (i >= slip_maxdev)
736                 return NULL;
737
738         if (dev) {
739                 sl = netdev_priv(dev);
740                 if (test_bit(SLF_INUSE, &sl->flags)) {
741                         unregister_netdevice(dev);
742                         dev = NULL;
743                         slip_devs[i] = NULL;
744                 }
745         }
746
747         if (!dev) {
748                 char name[IFNAMSIZ];
749                 sprintf(name, "sl%d", i);
750
751                 dev = alloc_netdev(sizeof(*sl), name, sl_setup);
752                 if (!dev)
753                         return NULL;
754                 dev->base_addr  = i;
755         }
756
757         sl = netdev_priv(dev);
758
759         /* Initialize channel control data */
760         sl->magic       = SLIP_MAGIC;
761         sl->dev         = dev;
762         spin_lock_init(&sl->lock);
763         sl->mode        = SL_MODE_DEFAULT;
764 #ifdef CONFIG_SLIP_SMART
765         /* initialize timer_list struct */
766         init_timer(&sl->keepalive_timer);
767         sl->keepalive_timer.data = (unsigned long)sl;
768         sl->keepalive_timer.function = sl_keepalive;
769         init_timer(&sl->outfill_timer);
770         sl->outfill_timer.data = (unsigned long)sl;
771         sl->outfill_timer.function = sl_outfill;
772 #endif
773         slip_devs[i] = dev;
774         return sl;
775 }
776
777 /*
778  * Open the high-level part of the SLIP channel.
779  * This function is called by the TTY module when the
780  * SLIP line discipline is called for.  Because we are
781  * sure the tty line exists, we only have to link it to
782  * a free SLIP channel...
783  *
784  * Called in process context serialized from other ldisc calls.
785  */
786
787 static int slip_open(struct tty_struct *tty)
788 {
789         struct slip *sl;
790         int err;
791
792         if (!capable(CAP_NET_ADMIN))
793                 return -EPERM;
794
795         if (tty->ops->write == NULL)
796                 return -EOPNOTSUPP;
797
798         /* RTnetlink lock is misused here to serialize concurrent
799            opens of slip channels. There are better ways, but it is
800            the simplest one.
801          */
802         rtnl_lock();
803
804         /* Collect hanged up channels. */
805         sl_sync();
806
807         sl = tty->disc_data;
808
809         err = -EEXIST;
810         /* First make sure we're not already connected. */
811         if (sl && sl->magic == SLIP_MAGIC)
812                 goto err_exit;
813
814         /* OK.  Find a free SLIP channel to use. */
815         err = -ENFILE;
816         sl = sl_alloc(tty_devnum(tty));
817         if (sl == NULL)
818                 goto err_exit;
819
820         sl->tty = tty;
821         tty->disc_data = sl;
822         sl->line = tty_devnum(tty);
823         sl->pid = current->pid;
824
825         if (!test_bit(SLF_INUSE, &sl->flags)) {
826                 /* Perform the low-level SLIP initialization. */
827                 err = sl_alloc_bufs(sl, SL_MTU);
828                 if (err)
829                         goto err_free_chan;
830
831                 set_bit(SLF_INUSE, &sl->flags);
832
833                 err = register_netdevice(sl->dev);
834                 if (err)
835                         goto err_free_bufs;
836         }
837
838 #ifdef CONFIG_SLIP_SMART
839         if (sl->keepalive) {
840                 sl->keepalive_timer.expires = jiffies + sl->keepalive * HZ;
841                 add_timer(&sl->keepalive_timer);
842         }
843         if (sl->outfill) {
844                 sl->outfill_timer.expires = jiffies + sl->outfill * HZ;
845                 add_timer(&sl->outfill_timer);
846         }
847 #endif
848
849         /* Done.  We have linked the TTY line to a channel. */
850         rtnl_unlock();
851         tty->receive_room = 65536;      /* We don't flow control */
852         return sl->dev->base_addr;
853
854 err_free_bufs:
855         sl_free_bufs(sl);
856
857 err_free_chan:
858         sl->tty = NULL;
859         tty->disc_data = NULL;
860         clear_bit(SLF_INUSE, &sl->flags);
861
862 err_exit:
863         rtnl_unlock();
864
865         /* Count references from TTY module */
866         return err;
867 }
868
869 /*
870  * Close down a SLIP channel.
871  * This means flushing out any pending queues, and then returning. This
872  * call is serialized against other ldisc functions.
873  *
874  * We also use this method fo a hangup event
875  */
876
877 static void slip_close(struct tty_struct *tty)
878 {
879         struct slip *sl = tty->disc_data;
880
881         /* First make sure we're connected. */
882         if (!sl || sl->magic != SLIP_MAGIC || sl->tty != tty)
883                 return;
884
885         tty->disc_data = NULL;
886         sl->tty = NULL;
887         if (!sl->leased)
888                 sl->line = 0;
889
890         /* VSV = very important to remove timers */
891 #ifdef CONFIG_SLIP_SMART
892         del_timer_sync(&sl->keepalive_timer);
893         del_timer_sync(&sl->outfill_timer);
894 #endif
895         /* Flush network side */
896         unregister_netdev(sl->dev);
897         /* This will complete via sl_free_netdev */
898 }
899
900 static int slip_hangup(struct tty_struct *tty)
901 {
902         slip_close(tty);
903         return 0;
904 }
905  /************************************************************************
906   *                     STANDARD SLIP ENCAPSULATION                      *
907   ************************************************************************/
908
909 static int slip_esc(unsigned char *s, unsigned char *d, int len)
910 {
911         unsigned char *ptr = d;
912         unsigned char c;
913
914         /*
915          * Send an initial END character to flush out any
916          * data that may have accumulated in the receiver
917          * due to line noise.
918          */
919
920         *ptr++ = END;
921
922         /*
923          * For each byte in the packet, send the appropriate
924          * character sequence, according to the SLIP protocol.
925          */
926
927         while (len-- > 0) {
928                 switch (c = *s++) {
929                 case END:
930                         *ptr++ = ESC;
931                         *ptr++ = ESC_END;
932                         break;
933                 case ESC:
934                         *ptr++ = ESC;
935                         *ptr++ = ESC_ESC;
936                         break;
937                 default:
938                         *ptr++ = c;
939                         break;
940                 }
941         }
942         *ptr++ = END;
943         return (ptr - d);
944 }
945
946 static void slip_unesc(struct slip *sl, unsigned char s)
947 {
948
949         switch (s) {
950         case END:
951 #ifdef CONFIG_SLIP_SMART
952                 /* drop keeptest bit = VSV */
953                 if (test_bit(SLF_KEEPTEST, &sl->flags))
954                         clear_bit(SLF_KEEPTEST, &sl->flags);
955 #endif
956
957                 if (!test_and_clear_bit(SLF_ERROR, &sl->flags)
958                                                         && (sl->rcount > 2))
959                         sl_bump(sl);
960                 clear_bit(SLF_ESCAPE, &sl->flags);
961                 sl->rcount = 0;
962                 return;
963
964         case ESC:
965                 set_bit(SLF_ESCAPE, &sl->flags);
966                 return;
967         case ESC_ESC:
968                 if (test_and_clear_bit(SLF_ESCAPE, &sl->flags))
969                         s = ESC;
970                 break;
971         case ESC_END:
972                 if (test_and_clear_bit(SLF_ESCAPE, &sl->flags))
973                         s = END;
974                 break;
975         }
976         if (!test_bit(SLF_ERROR, &sl->flags))  {
977                 if (sl->rcount < sl->buffsize)  {
978                         sl->rbuff[sl->rcount++] = s;
979                         return;
980                 }
981                 sl->rx_over_errors++;
982                 set_bit(SLF_ERROR, &sl->flags);
983         }
984 }
985
986
987 #ifdef CONFIG_SLIP_MODE_SLIP6
988 /************************************************************************
989  *                       6 BIT SLIP ENCAPSULATION                       *
990  ************************************************************************/
991
992 static int slip_esc6(unsigned char *s, unsigned char *d, int len)
993 {
994         unsigned char *ptr = d;
995         unsigned char c;
996         int i;
997         unsigned short v = 0;
998         short bits = 0;
999
1000         /*
1001          * Send an initial END character to flush out any
1002          * data that may have accumulated in the receiver
1003          * due to line noise.
1004          */
1005
1006         *ptr++ = 0x70;
1007
1008         /*
1009          * Encode the packet into printable ascii characters
1010          */
1011
1012         for (i = 0; i < len; ++i) {
1013                 v = (v << 8) | s[i];
1014                 bits += 8;
1015                 while (bits >= 6) {
1016                         bits -= 6;
1017                         c = 0x30 + ((v >> bits) & 0x3F);
1018                         *ptr++ = c;
1019                 }
1020         }
1021         if (bits) {
1022                 c = 0x30 + ((v << (6 - bits)) & 0x3F);
1023                 *ptr++ = c;
1024         }
1025         *ptr++ = 0x70;
1026         return ptr - d;
1027 }
1028
1029 static void slip_unesc6(struct slip *sl, unsigned char s)
1030 {
1031         unsigned char c;
1032
1033         if (s == 0x70) {
1034 #ifdef CONFIG_SLIP_SMART
1035                 /* drop keeptest bit = VSV */
1036                 if (test_bit(SLF_KEEPTEST, &sl->flags))
1037                         clear_bit(SLF_KEEPTEST, &sl->flags);
1038 #endif
1039
1040                 if (!test_and_clear_bit(SLF_ERROR, &sl->flags)
1041                                                         && (sl->rcount > 2))
1042                         sl_bump(sl);
1043                 sl->rcount = 0;
1044                 sl->xbits = 0;
1045                 sl->xdata = 0;
1046         } else if (s >= 0x30 && s < 0x70) {
1047                 sl->xdata = (sl->xdata << 6) | ((s - 0x30) & 0x3F);
1048                 sl->xbits += 6;
1049                 if (sl->xbits >= 8) {
1050                         sl->xbits -= 8;
1051                         c = (unsigned char)(sl->xdata >> sl->xbits);
1052                         if (!test_bit(SLF_ERROR, &sl->flags))  {
1053                                 if (sl->rcount < sl->buffsize)  {
1054                                         sl->rbuff[sl->rcount++] = c;
1055                                         return;
1056                                 }
1057                                 sl->rx_over_errors++;
1058                                 set_bit(SLF_ERROR, &sl->flags);
1059                         }
1060                 }
1061         }
1062 }
1063 #endif /* CONFIG_SLIP_MODE_SLIP6 */
1064
1065 /* Perform I/O control on an active SLIP channel. */
1066 static int slip_ioctl(struct tty_struct *tty, struct file *file,
1067                                         unsigned int cmd, unsigned long arg)
1068 {
1069         struct slip *sl = tty->disc_data;
1070         unsigned int tmp;
1071         int __user *p = (int __user *)arg;
1072
1073         /* First make sure we're connected. */
1074         if (!sl || sl->magic != SLIP_MAGIC)
1075                 return -EINVAL;
1076
1077         switch (cmd) {
1078         case SIOCGIFNAME:
1079                 tmp = strlen(sl->dev->name) + 1;
1080                 if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
1081                         return -EFAULT;
1082                 return 0;
1083
1084         case SIOCGIFENCAP:
1085                 if (put_user(sl->mode, p))
1086                         return -EFAULT;
1087                 return 0;
1088
1089         case SIOCSIFENCAP:
1090                 if (get_user(tmp, p))
1091                         return -EFAULT;
1092 #ifndef SL_INCLUDE_CSLIP
1093                 if (tmp & (SL_MODE_CSLIP|SL_MODE_ADAPTIVE))
1094                         return -EINVAL;
1095 #else
1096                 if ((tmp & (SL_MODE_ADAPTIVE | SL_MODE_CSLIP)) ==
1097                     (SL_MODE_ADAPTIVE | SL_MODE_CSLIP))
1098                         /* return -EINVAL; */
1099                         tmp &= ~SL_MODE_ADAPTIVE;
1100 #endif
1101 #ifndef CONFIG_SLIP_MODE_SLIP6
1102                 if (tmp & SL_MODE_SLIP6)
1103                         return -EINVAL;
1104 #endif
1105                 sl->mode = tmp;
1106                 sl->dev->type = ARPHRD_SLIP + sl->mode;
1107                 return 0;
1108
1109         case SIOCSIFHWADDR:
1110                 return -EINVAL;
1111
1112 #ifdef CONFIG_SLIP_SMART
1113         /* VSV changes start here */
1114         case SIOCSKEEPALIVE:
1115                 if (get_user(tmp, p))
1116                         return -EFAULT;
1117                 if (tmp > 255) /* max for unchar */
1118                         return -EINVAL;
1119
1120                 spin_lock_bh(&sl->lock);
1121                 if (!sl->tty) {
1122                         spin_unlock_bh(&sl->lock);
1123                         return -ENODEV;
1124                 }
1125                 sl->keepalive = (u8)tmp;
1126                 if (sl->keepalive != 0) {
1127                         mod_timer(&sl->keepalive_timer,
1128                                         jiffies + sl->keepalive * HZ);
1129                         set_bit(SLF_KEEPTEST, &sl->flags);
1130                 } else
1131                         del_timer(&sl->keepalive_timer);
1132                 spin_unlock_bh(&sl->lock);
1133                 return 0;
1134
1135         case SIOCGKEEPALIVE:
1136                 if (put_user(sl->keepalive, p))
1137                         return -EFAULT;
1138                 return 0;
1139
1140         case SIOCSOUTFILL:
1141                 if (get_user(tmp, p))
1142                         return -EFAULT;
1143                 if (tmp > 255) /* max for unchar */
1144                         return -EINVAL;
1145                 spin_lock_bh(&sl->lock);
1146                 if (!sl->tty) {
1147                         spin_unlock_bh(&sl->lock);
1148                         return -ENODEV;
1149                 }
1150                 sl->outfill = (u8)tmp;
1151                 if (sl->outfill != 0) {
1152                         mod_timer(&sl->outfill_timer,
1153                                                 jiffies + sl->outfill * HZ);
1154                         set_bit(SLF_OUTWAIT, &sl->flags);
1155                 } else
1156                         del_timer(&sl->outfill_timer);
1157                 spin_unlock_bh(&sl->lock);
1158                 return 0;
1159
1160         case SIOCGOUTFILL:
1161                 if (put_user(sl->outfill, p))
1162                         return -EFAULT;
1163                 return 0;
1164         /* VSV changes end */
1165 #endif
1166         default:
1167                 return tty_mode_ioctl(tty, file, cmd, arg);
1168         }
1169 }
1170
1171 /* VSV changes start here */
1172 #ifdef CONFIG_SLIP_SMART
1173 /* function do_ioctl called from net/core/dev.c
1174    to allow get/set outfill/keepalive parameter
1175    by ifconfig                                 */
1176
1177 static int sl_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1178 {
1179         struct slip *sl = netdev_priv(dev);
1180         unsigned long *p = (unsigned long *)&rq->ifr_ifru;
1181
1182         if (sl == NULL)         /* Allocation failed ?? */
1183                 return -ENODEV;
1184
1185         spin_lock_bh(&sl->lock);
1186
1187         if (!sl->tty) {
1188                 spin_unlock_bh(&sl->lock);
1189                 return -ENODEV;
1190         }
1191
1192         switch (cmd) {
1193         case SIOCSKEEPALIVE:
1194                 /* max for unchar */
1195                 if ((unsigned)*p > 255) {
1196                         spin_unlock_bh(&sl->lock);
1197                         return -EINVAL;
1198                 }
1199                 sl->keepalive = (u8)*p;
1200                 if (sl->keepalive != 0) {
1201                         sl->keepalive_timer.expires =
1202                                                 jiffies + sl->keepalive * HZ;
1203                         mod_timer(&sl->keepalive_timer,
1204                                                 jiffies + sl->keepalive * HZ);
1205                         set_bit(SLF_KEEPTEST, &sl->flags);
1206                 } else
1207                         del_timer(&sl->keepalive_timer);
1208                 break;
1209
1210         case SIOCGKEEPALIVE:
1211                 *p = sl->keepalive;
1212                 break;
1213
1214         case SIOCSOUTFILL:
1215                 if ((unsigned)*p > 255) { /* max for unchar */
1216                         spin_unlock_bh(&sl->lock);
1217                         return -EINVAL;
1218                 }
1219                 sl->outfill = (u8)*p;
1220                 if (sl->outfill != 0) {
1221                         mod_timer(&sl->outfill_timer,
1222                                                 jiffies + sl->outfill * HZ);
1223                         set_bit(SLF_OUTWAIT, &sl->flags);
1224                 } else
1225                         del_timer(&sl->outfill_timer);
1226                 break;
1227
1228         case SIOCGOUTFILL:
1229                 *p = sl->outfill;
1230                 break;
1231
1232         case SIOCSLEASE:
1233                 /* Resolve race condition, when ioctl'ing hanged up
1234                    and opened by another process device.
1235                  */
1236                 if (sl->tty != current->signal->tty &&
1237                                                 sl->pid != current->pid) {
1238                         spin_unlock_bh(&sl->lock);
1239                         return -EPERM;
1240                 }
1241                 sl->leased = 0;
1242                 if (*p)
1243                         sl->leased = 1;
1244                 break;
1245
1246         case SIOCGLEASE:
1247                 *p = sl->leased;
1248         };
1249         spin_unlock_bh(&sl->lock);
1250         return 0;
1251 }
1252 #endif
1253 /* VSV changes end */
1254
1255 static struct tty_ldisc_ops sl_ldisc = {
1256         .owner          = THIS_MODULE,
1257         .magic          = TTY_LDISC_MAGIC,
1258         .name           = "slip",
1259         .open           = slip_open,
1260         .close          = slip_close,
1261         .hangup         = slip_hangup,
1262         .ioctl          = slip_ioctl,
1263         .receive_buf    = slip_receive_buf,
1264         .write_wakeup   = slip_write_wakeup,
1265 };
1266
1267 static int __init slip_init(void)
1268 {
1269         int status;
1270
1271         if (slip_maxdev < 4)
1272                 slip_maxdev = 4; /* Sanity */
1273
1274         printk(KERN_INFO "SLIP: version %s (dynamic channels, max=%d)"
1275 #ifdef CONFIG_SLIP_MODE_SLIP6
1276                " (6 bit encapsulation enabled)"
1277 #endif
1278                ".\n",
1279                SLIP_VERSION, slip_maxdev);
1280 #if defined(SL_INCLUDE_CSLIP)
1281         printk(KERN_INFO "CSLIP: code copyright 1989 Regents of the University of California.\n");
1282 #endif
1283 #ifdef CONFIG_SLIP_SMART
1284         printk(KERN_INFO "SLIP linefill/keepalive option.\n");
1285 #endif
1286
1287         slip_devs = kzalloc(sizeof(struct net_device *)*slip_maxdev,
1288                                                                 GFP_KERNEL);
1289         if (!slip_devs) {
1290                 printk(KERN_ERR "SLIP: Can't allocate slip devices array.\n");
1291                 return -ENOMEM;
1292         }
1293
1294         /* Fill in our line protocol discipline, and register it */
1295         status = tty_register_ldisc(N_SLIP, &sl_ldisc);
1296         if (status != 0) {
1297                 printk(KERN_ERR "SLIP: can't register line discipline (err = %d)\n", status);
1298                 kfree(slip_devs);
1299         }
1300         return status;
1301 }
1302
1303 static void __exit slip_exit(void)
1304 {
1305         int i;
1306         struct net_device *dev;
1307         struct slip *sl;
1308         unsigned long timeout = jiffies + HZ;
1309         int busy = 0;
1310
1311         if (slip_devs == NULL)
1312                 return;
1313
1314         /* First of all: check for active disciplines and hangup them.
1315          */
1316         do {
1317                 if (busy)
1318                         msleep_interruptible(100);
1319
1320                 busy = 0;
1321                 for (i = 0; i < slip_maxdev; i++) {
1322                         dev = slip_devs[i];
1323                         if (!dev)
1324                                 continue;
1325                         sl = netdev_priv(dev);
1326                         spin_lock_bh(&sl->lock);
1327                         if (sl->tty) {
1328                                 busy++;
1329                                 tty_hangup(sl->tty);
1330                         }
1331                         spin_unlock_bh(&sl->lock);
1332                 }
1333         } while (busy && time_before(jiffies, timeout));
1334
1335         /* FIXME: hangup is async so we should wait when doing this second
1336            phase */
1337
1338         for (i = 0; i < slip_maxdev; i++) {
1339                 dev = slip_devs[i];
1340                 if (!dev)
1341                         continue;
1342                 slip_devs[i] = NULL;
1343
1344                 sl = netdev_priv(dev);
1345                 if (sl->tty) {
1346                         printk(KERN_ERR "%s: tty discipline still running\n",
1347                                dev->name);
1348                         /* Intentionally leak the control block. */
1349                         dev->destructor = NULL;
1350                 }
1351
1352                 unregister_netdev(dev);
1353         }
1354
1355         kfree(slip_devs);
1356         slip_devs = NULL;
1357
1358         i = tty_unregister_ldisc(N_SLIP);
1359         if (i != 0)
1360                 printk(KERN_ERR "SLIP: can't unregister line discipline (err = %d)\n", i);
1361 }
1362
1363 module_init(slip_init);
1364 module_exit(slip_exit);
1365
1366 #ifdef CONFIG_SLIP_SMART
1367 /*
1368  * This is start of the code for multislip style line checking
1369  * added by Stanislav Voronyi. All changes before marked VSV
1370  */
1371
1372 static void sl_outfill(unsigned long sls)
1373 {
1374         struct slip *sl = (struct slip *)sls;
1375
1376         spin_lock(&sl->lock);
1377
1378         if (sl->tty == NULL)
1379                 goto out;
1380
1381         if (sl->outfill) {
1382                 if (test_bit(SLF_OUTWAIT, &sl->flags)) {
1383                         /* no packets were transmitted, do outfill */
1384 #ifdef CONFIG_SLIP_MODE_SLIP6
1385                         unsigned char s = (sl->mode & SL_MODE_SLIP6)?0x70:END;
1386 #else
1387                         unsigned char s = END;
1388 #endif
1389                         /* put END into tty queue. Is it right ??? */
1390                         if (!netif_queue_stopped(sl->dev)) {
1391                                 /* if device busy no outfill */
1392                                 sl->tty->ops->write(sl->tty, &s, 1);
1393                         }
1394                 } else
1395                         set_bit(SLF_OUTWAIT, &sl->flags);
1396
1397                 mod_timer(&sl->outfill_timer, jiffies+sl->outfill*HZ);
1398         }
1399 out:
1400         spin_unlock(&sl->lock);
1401 }
1402
1403 static void sl_keepalive(unsigned long sls)
1404 {
1405         struct slip *sl = (struct slip *)sls;
1406
1407         spin_lock(&sl->lock);
1408
1409         if (sl->tty == NULL)
1410                 goto out;
1411
1412         if (sl->keepalive) {
1413                 if (test_bit(SLF_KEEPTEST, &sl->flags)) {
1414                         /* keepalive still high :(, we must hangup */
1415                         if (sl->outfill)
1416                                 /* outfill timer must be deleted too */
1417                                 (void)del_timer(&sl->outfill_timer);
1418                         printk(KERN_DEBUG "%s: no packets received during keepalive timeout, hangup.\n", sl->dev->name);
1419                         /* this must hangup tty & close slip */
1420                         tty_hangup(sl->tty);
1421                         /* I think we need not something else */
1422                         goto out;
1423                 } else
1424                         set_bit(SLF_KEEPTEST, &sl->flags);
1425
1426                 mod_timer(&sl->keepalive_timer, jiffies+sl->keepalive*HZ);
1427         }
1428 out:
1429         spin_unlock(&sl->lock);
1430 }
1431
1432 #endif
1433 MODULE_LICENSE("GPL");
1434 MODULE_ALIAS_LDISC(N_SLIP);