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 v2.6.32-rc2 1434 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/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 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); 108static 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 126static 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 */ 191err_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. */ 203static 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 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 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 290done_on_bh: 291 spin_unlock_bh(&sl->lock); 292 293done: 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. */ 304static 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. */ 311static 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. */ 317static 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. */ 372static 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 */ 421static 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 444static 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 } 471out: 472 spin_unlock(&sl->lock); 473} 474 475 476/* Encapsulate an IP datagram and kick it into a TTY queue. */ 477static netdev_tx_t 478sl_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 511static int 512sl_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 530static 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 544static 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 558static struct net_device_stats * 559sl_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 595static 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 612static 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 */ 620static 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 627static 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 642static 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 669static 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 */ 699static 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. */ 720static 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 787static 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 854err_free_bufs: 855 sl_free_bufs(sl); 856 857err_free_chan: 858 sl->tty = NULL; 859 tty->disc_data = NULL; 860 clear_bit(SLF_INUSE, &sl->flags); 861 862err_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 877static 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 900static int slip_hangup(struct tty_struct *tty) 901{ 902 slip_close(tty); 903 return 0; 904} 905 /************************************************************************ 906 * STANDARD SLIP ENCAPSULATION * 907 ************************************************************************/ 908 909static 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 946static 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 992static 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 1029static 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. */ 1066static 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 1177static 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 1255static 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 1267static 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 1303static 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 1363module_init(slip_init); 1364module_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 1372static 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 } 1399out: 1400 spin_unlock(&sl->lock); 1401} 1402 1403static 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 } 1428out: 1429 spin_unlock(&sl->lock); 1430} 1431 1432#endif 1433MODULE_LICENSE("GPL"); 1434MODULE_ALIAS_LDISC(N_SLIP);