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