Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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