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.23-rc6 796 lines 18 kB view raw
1/* 2 * PPP synchronous tty channel driver for Linux. 3 * 4 * This is a ppp channel driver that can be used with tty device drivers 5 * that are frame oriented, such as synchronous HDLC devices. 6 * 7 * Complete PPP frames without encoding/decoding are exchanged between 8 * the channel driver and the device driver. 9 * 10 * The async map IOCTL codes are implemented to keep the user mode 11 * applications happy if they call them. Synchronous PPP does not use 12 * the async maps. 13 * 14 * Copyright 1999 Paul Mackerras. 15 * 16 * Also touched by the grubby hands of Paul Fulghum paulkf@microgate.com 17 * 18 * This program is free software; you can redistribute it and/or 19 * modify it under the terms of the GNU General Public License 20 * as published by the Free Software Foundation; either version 21 * 2 of the License, or (at your option) any later version. 22 * 23 * This driver provides the encapsulation and framing for sending 24 * and receiving PPP frames over sync serial lines. It relies on 25 * the generic PPP layer to give it frames to send and to process 26 * received frames. It implements the PPP line discipline. 27 * 28 * Part of the code in this driver was inspired by the old async-only 29 * PPP driver, written by Michael Callahan and Al Longyear, and 30 * subsequently hacked by Paul Mackerras. 31 * 32 * ==FILEVERSION 20040616== 33 */ 34 35#include <linux/module.h> 36#include <linux/kernel.h> 37#include <linux/skbuff.h> 38#include <linux/tty.h> 39#include <linux/netdevice.h> 40#include <linux/poll.h> 41#include <linux/ppp_defs.h> 42#include <linux/if_ppp.h> 43#include <linux/ppp_channel.h> 44#include <linux/spinlock.h> 45#include <linux/init.h> 46#include <asm/uaccess.h> 47#include <asm/semaphore.h> 48 49#define PPP_VERSION "2.4.2" 50 51/* Structure for storing local state. */ 52struct syncppp { 53 struct tty_struct *tty; 54 unsigned int flags; 55 unsigned int rbits; 56 int mru; 57 spinlock_t xmit_lock; 58 spinlock_t recv_lock; 59 unsigned long xmit_flags; 60 u32 xaccm[8]; 61 u32 raccm; 62 unsigned int bytes_sent; 63 unsigned int bytes_rcvd; 64 65 struct sk_buff *tpkt; 66 unsigned long last_xmit; 67 68 struct sk_buff_head rqueue; 69 70 struct tasklet_struct tsk; 71 72 atomic_t refcnt; 73 struct semaphore dead_sem; 74 struct ppp_channel chan; /* interface to generic ppp layer */ 75}; 76 77/* Bit numbers in xmit_flags */ 78#define XMIT_WAKEUP 0 79#define XMIT_FULL 1 80 81/* Bits in rbits */ 82#define SC_RCV_BITS (SC_RCV_B7_1|SC_RCV_B7_0|SC_RCV_ODDP|SC_RCV_EVNP) 83 84#define PPPSYNC_MAX_RQLEN 32 /* arbitrary */ 85 86/* 87 * Prototypes. 88 */ 89static struct sk_buff* ppp_sync_txmunge(struct syncppp *ap, struct sk_buff *); 90static int ppp_sync_send(struct ppp_channel *chan, struct sk_buff *skb); 91static int ppp_sync_ioctl(struct ppp_channel *chan, unsigned int cmd, 92 unsigned long arg); 93static void ppp_sync_process(unsigned long arg); 94static int ppp_sync_push(struct syncppp *ap); 95static void ppp_sync_flush_output(struct syncppp *ap); 96static void ppp_sync_input(struct syncppp *ap, const unsigned char *buf, 97 char *flags, int count); 98 99static struct ppp_channel_ops sync_ops = { 100 ppp_sync_send, 101 ppp_sync_ioctl 102}; 103 104/* 105 * Utility procedures to print a buffer in hex/ascii 106 */ 107static void 108ppp_print_hex (register __u8 * out, const __u8 * in, int count) 109{ 110 register __u8 next_ch; 111 static const char hex[] = "0123456789ABCDEF"; 112 113 while (count-- > 0) { 114 next_ch = *in++; 115 *out++ = hex[(next_ch >> 4) & 0x0F]; 116 *out++ = hex[next_ch & 0x0F]; 117 ++out; 118 } 119} 120 121static void 122ppp_print_char (register __u8 * out, const __u8 * in, int count) 123{ 124 register __u8 next_ch; 125 126 while (count-- > 0) { 127 next_ch = *in++; 128 129 if (next_ch < 0x20 || next_ch > 0x7e) 130 *out++ = '.'; 131 else { 132 *out++ = next_ch; 133 if (next_ch == '%') /* printk/syslogd has a bug !! */ 134 *out++ = '%'; 135 } 136 } 137 *out = '\0'; 138} 139 140static void 141ppp_print_buffer (const char *name, const __u8 *buf, int count) 142{ 143 __u8 line[44]; 144 145 if (name != NULL) 146 printk(KERN_DEBUG "ppp_synctty: %s, count = %d\n", name, count); 147 148 while (count > 8) { 149 memset (line, 32, 44); 150 ppp_print_hex (line, buf, 8); 151 ppp_print_char (&line[8 * 3], buf, 8); 152 printk(KERN_DEBUG "%s\n", line); 153 count -= 8; 154 buf += 8; 155 } 156 157 if (count > 0) { 158 memset (line, 32, 44); 159 ppp_print_hex (line, buf, count); 160 ppp_print_char (&line[8 * 3], buf, count); 161 printk(KERN_DEBUG "%s\n", line); 162 } 163} 164 165 166/* 167 * Routines implementing the synchronous PPP line discipline. 168 */ 169 170/* 171 * We have a potential race on dereferencing tty->disc_data, 172 * because the tty layer provides no locking at all - thus one 173 * cpu could be running ppp_synctty_receive while another 174 * calls ppp_synctty_close, which zeroes tty->disc_data and 175 * frees the memory that ppp_synctty_receive is using. The best 176 * way to fix this is to use a rwlock in the tty struct, but for now 177 * we use a single global rwlock for all ttys in ppp line discipline. 178 * 179 * FIXME: Fixed in tty_io nowdays. 180 */ 181static DEFINE_RWLOCK(disc_data_lock); 182 183static struct syncppp *sp_get(struct tty_struct *tty) 184{ 185 struct syncppp *ap; 186 187 read_lock(&disc_data_lock); 188 ap = tty->disc_data; 189 if (ap != NULL) 190 atomic_inc(&ap->refcnt); 191 read_unlock(&disc_data_lock); 192 return ap; 193} 194 195static void sp_put(struct syncppp *ap) 196{ 197 if (atomic_dec_and_test(&ap->refcnt)) 198 up(&ap->dead_sem); 199} 200 201/* 202 * Called when a tty is put into sync-PPP line discipline. 203 */ 204static int 205ppp_sync_open(struct tty_struct *tty) 206{ 207 struct syncppp *ap; 208 int err; 209 210 ap = kzalloc(sizeof(*ap), GFP_KERNEL); 211 err = -ENOMEM; 212 if (ap == 0) 213 goto out; 214 215 /* initialize the syncppp structure */ 216 ap->tty = tty; 217 ap->mru = PPP_MRU; 218 spin_lock_init(&ap->xmit_lock); 219 spin_lock_init(&ap->recv_lock); 220 ap->xaccm[0] = ~0U; 221 ap->xaccm[3] = 0x60000000U; 222 ap->raccm = ~0U; 223 224 skb_queue_head_init(&ap->rqueue); 225 tasklet_init(&ap->tsk, ppp_sync_process, (unsigned long) ap); 226 227 atomic_set(&ap->refcnt, 1); 228 init_MUTEX_LOCKED(&ap->dead_sem); 229 230 ap->chan.private = ap; 231 ap->chan.ops = &sync_ops; 232 ap->chan.mtu = PPP_MRU; 233 ap->chan.hdrlen = 2; /* for A/C bytes */ 234 err = ppp_register_channel(&ap->chan); 235 if (err) 236 goto out_free; 237 238 tty->disc_data = ap; 239 tty->receive_room = 65536; 240 return 0; 241 242 out_free: 243 kfree(ap); 244 out: 245 return err; 246} 247 248/* 249 * Called when the tty is put into another line discipline 250 * or it hangs up. We have to wait for any cpu currently 251 * executing in any of the other ppp_synctty_* routines to 252 * finish before we can call ppp_unregister_channel and free 253 * the syncppp struct. This routine must be called from 254 * process context, not interrupt or softirq context. 255 */ 256static void 257ppp_sync_close(struct tty_struct *tty) 258{ 259 struct syncppp *ap; 260 261 write_lock_irq(&disc_data_lock); 262 ap = tty->disc_data; 263 tty->disc_data = NULL; 264 write_unlock_irq(&disc_data_lock); 265 if (ap == 0) 266 return; 267 268 /* 269 * We have now ensured that nobody can start using ap from now 270 * on, but we have to wait for all existing users to finish. 271 * Note that ppp_unregister_channel ensures that no calls to 272 * our channel ops (i.e. ppp_sync_send/ioctl) are in progress 273 * by the time it returns. 274 */ 275 if (!atomic_dec_and_test(&ap->refcnt)) 276 down(&ap->dead_sem); 277 tasklet_kill(&ap->tsk); 278 279 ppp_unregister_channel(&ap->chan); 280 skb_queue_purge(&ap->rqueue); 281 if (ap->tpkt != 0) 282 kfree_skb(ap->tpkt); 283 kfree(ap); 284} 285 286/* 287 * Called on tty hangup in process context. 288 * 289 * Wait for I/O to driver to complete and unregister PPP channel. 290 * This is already done by the close routine, so just call that. 291 */ 292static int ppp_sync_hangup(struct tty_struct *tty) 293{ 294 ppp_sync_close(tty); 295 return 0; 296} 297 298/* 299 * Read does nothing - no data is ever available this way. 300 * Pppd reads and writes packets via /dev/ppp instead. 301 */ 302static ssize_t 303ppp_sync_read(struct tty_struct *tty, struct file *file, 304 unsigned char __user *buf, size_t count) 305{ 306 return -EAGAIN; 307} 308 309/* 310 * Write on the tty does nothing, the packets all come in 311 * from the ppp generic stuff. 312 */ 313static ssize_t 314ppp_sync_write(struct tty_struct *tty, struct file *file, 315 const unsigned char *buf, size_t count) 316{ 317 return -EAGAIN; 318} 319 320static int 321ppp_synctty_ioctl(struct tty_struct *tty, struct file *file, 322 unsigned int cmd, unsigned long arg) 323{ 324 struct syncppp *ap = sp_get(tty); 325 int __user *p = (int __user *)arg; 326 int err, val; 327 328 if (ap == 0) 329 return -ENXIO; 330 err = -EFAULT; 331 switch (cmd) { 332 case PPPIOCGCHAN: 333 err = -ENXIO; 334 if (ap == 0) 335 break; 336 err = -EFAULT; 337 if (put_user(ppp_channel_index(&ap->chan), p)) 338 break; 339 err = 0; 340 break; 341 342 case PPPIOCGUNIT: 343 err = -ENXIO; 344 if (ap == 0) 345 break; 346 err = -EFAULT; 347 if (put_user(ppp_unit_number(&ap->chan), p)) 348 break; 349 err = 0; 350 break; 351 352 case TCGETS: 353 case TCGETA: 354 err = n_tty_ioctl(tty, file, cmd, arg); 355 break; 356 357 case TCFLSH: 358 /* flush our buffers and the serial port's buffer */ 359 if (arg == TCIOFLUSH || arg == TCOFLUSH) 360 ppp_sync_flush_output(ap); 361 err = n_tty_ioctl(tty, file, cmd, arg); 362 break; 363 364 case FIONREAD: 365 val = 0; 366 if (put_user(val, p)) 367 break; 368 err = 0; 369 break; 370 371 default: 372 err = -ENOIOCTLCMD; 373 } 374 375 sp_put(ap); 376 return err; 377} 378 379/* No kernel lock - fine */ 380static unsigned int 381ppp_sync_poll(struct tty_struct *tty, struct file *file, poll_table *wait) 382{ 383 return 0; 384} 385 386/* 387 * This can now be called from hard interrupt level as well 388 * as soft interrupt level or mainline. 389 */ 390static void 391ppp_sync_receive(struct tty_struct *tty, const unsigned char *buf, 392 char *cflags, int count) 393{ 394 struct syncppp *ap = sp_get(tty); 395 unsigned long flags; 396 397 if (ap == 0) 398 return; 399 spin_lock_irqsave(&ap->recv_lock, flags); 400 ppp_sync_input(ap, buf, cflags, count); 401 spin_unlock_irqrestore(&ap->recv_lock, flags); 402 if (!skb_queue_empty(&ap->rqueue)) 403 tasklet_schedule(&ap->tsk); 404 sp_put(ap); 405 if (test_and_clear_bit(TTY_THROTTLED, &tty->flags) 406 && tty->driver->unthrottle) 407 tty->driver->unthrottle(tty); 408} 409 410static void 411ppp_sync_wakeup(struct tty_struct *tty) 412{ 413 struct syncppp *ap = sp_get(tty); 414 415 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); 416 if (ap == 0) 417 return; 418 set_bit(XMIT_WAKEUP, &ap->xmit_flags); 419 tasklet_schedule(&ap->tsk); 420 sp_put(ap); 421} 422 423 424static struct tty_ldisc ppp_sync_ldisc = { 425 .owner = THIS_MODULE, 426 .magic = TTY_LDISC_MAGIC, 427 .name = "pppsync", 428 .open = ppp_sync_open, 429 .close = ppp_sync_close, 430 .hangup = ppp_sync_hangup, 431 .read = ppp_sync_read, 432 .write = ppp_sync_write, 433 .ioctl = ppp_synctty_ioctl, 434 .poll = ppp_sync_poll, 435 .receive_buf = ppp_sync_receive, 436 .write_wakeup = ppp_sync_wakeup, 437}; 438 439static int __init 440ppp_sync_init(void) 441{ 442 int err; 443 444 err = tty_register_ldisc(N_SYNC_PPP, &ppp_sync_ldisc); 445 if (err != 0) 446 printk(KERN_ERR "PPP_sync: error %d registering line disc.\n", 447 err); 448 return err; 449} 450 451/* 452 * The following routines provide the PPP channel interface. 453 */ 454static int 455ppp_sync_ioctl(struct ppp_channel *chan, unsigned int cmd, unsigned long arg) 456{ 457 struct syncppp *ap = chan->private; 458 int err, val; 459 u32 accm[8]; 460 void __user *argp = (void __user *)arg; 461 u32 __user *p = argp; 462 463 err = -EFAULT; 464 switch (cmd) { 465 case PPPIOCGFLAGS: 466 val = ap->flags | ap->rbits; 467 if (put_user(val, (int __user *) argp)) 468 break; 469 err = 0; 470 break; 471 case PPPIOCSFLAGS: 472 if (get_user(val, (int __user *) argp)) 473 break; 474 ap->flags = val & ~SC_RCV_BITS; 475 spin_lock_irq(&ap->recv_lock); 476 ap->rbits = val & SC_RCV_BITS; 477 spin_unlock_irq(&ap->recv_lock); 478 err = 0; 479 break; 480 481 case PPPIOCGASYNCMAP: 482 if (put_user(ap->xaccm[0], p)) 483 break; 484 err = 0; 485 break; 486 case PPPIOCSASYNCMAP: 487 if (get_user(ap->xaccm[0], p)) 488 break; 489 err = 0; 490 break; 491 492 case PPPIOCGRASYNCMAP: 493 if (put_user(ap->raccm, p)) 494 break; 495 err = 0; 496 break; 497 case PPPIOCSRASYNCMAP: 498 if (get_user(ap->raccm, p)) 499 break; 500 err = 0; 501 break; 502 503 case PPPIOCGXASYNCMAP: 504 if (copy_to_user(argp, ap->xaccm, sizeof(ap->xaccm))) 505 break; 506 err = 0; 507 break; 508 case PPPIOCSXASYNCMAP: 509 if (copy_from_user(accm, argp, sizeof(accm))) 510 break; 511 accm[2] &= ~0x40000000U; /* can't escape 0x5e */ 512 accm[3] |= 0x60000000U; /* must escape 0x7d, 0x7e */ 513 memcpy(ap->xaccm, accm, sizeof(ap->xaccm)); 514 err = 0; 515 break; 516 517 case PPPIOCGMRU: 518 if (put_user(ap->mru, (int __user *) argp)) 519 break; 520 err = 0; 521 break; 522 case PPPIOCSMRU: 523 if (get_user(val, (int __user *) argp)) 524 break; 525 if (val < PPP_MRU) 526 val = PPP_MRU; 527 ap->mru = val; 528 err = 0; 529 break; 530 531 default: 532 err = -ENOTTY; 533 } 534 return err; 535} 536 537/* 538 * This is called at softirq level to deliver received packets 539 * to the ppp_generic code, and to tell the ppp_generic code 540 * if we can accept more output now. 541 */ 542static void ppp_sync_process(unsigned long arg) 543{ 544 struct syncppp *ap = (struct syncppp *) arg; 545 struct sk_buff *skb; 546 547 /* process received packets */ 548 while ((skb = skb_dequeue(&ap->rqueue)) != NULL) { 549 if (skb->len == 0) { 550 /* zero length buffers indicate error */ 551 ppp_input_error(&ap->chan, 0); 552 kfree_skb(skb); 553 } 554 else 555 ppp_input(&ap->chan, skb); 556 } 557 558 /* try to push more stuff out */ 559 if (test_bit(XMIT_WAKEUP, &ap->xmit_flags) && ppp_sync_push(ap)) 560 ppp_output_wakeup(&ap->chan); 561} 562 563/* 564 * Procedures for encapsulation and framing. 565 */ 566 567struct sk_buff* 568ppp_sync_txmunge(struct syncppp *ap, struct sk_buff *skb) 569{ 570 int proto; 571 unsigned char *data; 572 int islcp; 573 574 data = skb->data; 575 proto = (data[0] << 8) + data[1]; 576 577 /* LCP packets with codes between 1 (configure-request) 578 * and 7 (code-reject) must be sent as though no options 579 * have been negotiated. 580 */ 581 islcp = proto == PPP_LCP && 1 <= data[2] && data[2] <= 7; 582 583 /* compress protocol field if option enabled */ 584 if (data[0] == 0 && (ap->flags & SC_COMP_PROT) && !islcp) 585 skb_pull(skb,1); 586 587 /* prepend address/control fields if necessary */ 588 if ((ap->flags & SC_COMP_AC) == 0 || islcp) { 589 if (skb_headroom(skb) < 2) { 590 struct sk_buff *npkt = dev_alloc_skb(skb->len + 2); 591 if (npkt == NULL) { 592 kfree_skb(skb); 593 return NULL; 594 } 595 skb_reserve(npkt,2); 596 skb_copy_from_linear_data(skb, 597 skb_put(npkt, skb->len), skb->len); 598 kfree_skb(skb); 599 skb = npkt; 600 } 601 skb_push(skb,2); 602 skb->data[0] = PPP_ALLSTATIONS; 603 skb->data[1] = PPP_UI; 604 } 605 606 ap->last_xmit = jiffies; 607 608 if (skb && ap->flags & SC_LOG_OUTPKT) 609 ppp_print_buffer ("send buffer", skb->data, skb->len); 610 611 return skb; 612} 613 614/* 615 * Transmit-side routines. 616 */ 617 618/* 619 * Send a packet to the peer over an sync tty line. 620 * Returns 1 iff the packet was accepted. 621 * If the packet was not accepted, we will call ppp_output_wakeup 622 * at some later time. 623 */ 624static int 625ppp_sync_send(struct ppp_channel *chan, struct sk_buff *skb) 626{ 627 struct syncppp *ap = chan->private; 628 629 ppp_sync_push(ap); 630 631 if (test_and_set_bit(XMIT_FULL, &ap->xmit_flags)) 632 return 0; /* already full */ 633 skb = ppp_sync_txmunge(ap, skb); 634 if (skb != NULL) 635 ap->tpkt = skb; 636 else 637 clear_bit(XMIT_FULL, &ap->xmit_flags); 638 639 ppp_sync_push(ap); 640 return 1; 641} 642 643/* 644 * Push as much data as possible out to the tty. 645 */ 646static int 647ppp_sync_push(struct syncppp *ap) 648{ 649 int sent, done = 0; 650 struct tty_struct *tty = ap->tty; 651 int tty_stuffed = 0; 652 653 if (!spin_trylock_bh(&ap->xmit_lock)) 654 return 0; 655 for (;;) { 656 if (test_and_clear_bit(XMIT_WAKEUP, &ap->xmit_flags)) 657 tty_stuffed = 0; 658 if (!tty_stuffed && ap->tpkt != 0) { 659 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); 660 sent = tty->driver->write(tty, ap->tpkt->data, ap->tpkt->len); 661 if (sent < 0) 662 goto flush; /* error, e.g. loss of CD */ 663 if (sent < ap->tpkt->len) { 664 tty_stuffed = 1; 665 } else { 666 kfree_skb(ap->tpkt); 667 ap->tpkt = NULL; 668 clear_bit(XMIT_FULL, &ap->xmit_flags); 669 done = 1; 670 } 671 continue; 672 } 673 /* haven't made any progress */ 674 spin_unlock_bh(&ap->xmit_lock); 675 if (!(test_bit(XMIT_WAKEUP, &ap->xmit_flags) 676 || (!tty_stuffed && ap->tpkt != 0))) 677 break; 678 if (!spin_trylock_bh(&ap->xmit_lock)) 679 break; 680 } 681 return done; 682 683flush: 684 if (ap->tpkt != 0) { 685 kfree_skb(ap->tpkt); 686 ap->tpkt = NULL; 687 clear_bit(XMIT_FULL, &ap->xmit_flags); 688 done = 1; 689 } 690 spin_unlock_bh(&ap->xmit_lock); 691 return done; 692} 693 694/* 695 * Flush output from our internal buffers. 696 * Called for the TCFLSH ioctl. 697 */ 698static void 699ppp_sync_flush_output(struct syncppp *ap) 700{ 701 int done = 0; 702 703 spin_lock_bh(&ap->xmit_lock); 704 if (ap->tpkt != NULL) { 705 kfree_skb(ap->tpkt); 706 ap->tpkt = NULL; 707 clear_bit(XMIT_FULL, &ap->xmit_flags); 708 done = 1; 709 } 710 spin_unlock_bh(&ap->xmit_lock); 711 if (done) 712 ppp_output_wakeup(&ap->chan); 713} 714 715/* 716 * Receive-side routines. 717 */ 718 719/* called when the tty driver has data for us. 720 * 721 * Data is frame oriented: each call to ppp_sync_input is considered 722 * a whole frame. If the 1st flag byte is non-zero then the whole 723 * frame is considered to be in error and is tossed. 724 */ 725static void 726ppp_sync_input(struct syncppp *ap, const unsigned char *buf, 727 char *flags, int count) 728{ 729 struct sk_buff *skb; 730 unsigned char *p; 731 732 if (count == 0) 733 return; 734 735 if (ap->flags & SC_LOG_INPKT) 736 ppp_print_buffer ("receive buffer", buf, count); 737 738 /* stuff the chars in the skb */ 739 if ((skb = dev_alloc_skb(ap->mru + PPP_HDRLEN + 2)) == 0) { 740 printk(KERN_ERR "PPPsync: no memory (input pkt)\n"); 741 goto err; 742 } 743 /* Try to get the payload 4-byte aligned */ 744 if (buf[0] != PPP_ALLSTATIONS) 745 skb_reserve(skb, 2 + (buf[0] & 1)); 746 747 if (flags != 0 && *flags) { 748 /* error flag set, ignore frame */ 749 goto err; 750 } else if (count > skb_tailroom(skb)) { 751 /* packet overflowed MRU */ 752 goto err; 753 } 754 755 p = skb_put(skb, count); 756 memcpy(p, buf, count); 757 758 /* strip address/control field if present */ 759 p = skb->data; 760 if (p[0] == PPP_ALLSTATIONS && p[1] == PPP_UI) { 761 /* chop off address/control */ 762 if (skb->len < 3) 763 goto err; 764 p = skb_pull(skb, 2); 765 } 766 767 /* decompress protocol field if compressed */ 768 if (p[0] & 1) { 769 /* protocol is compressed */ 770 skb_push(skb, 1)[0] = 0; 771 } else if (skb->len < 2) 772 goto err; 773 774 /* queue the frame to be processed */ 775 skb_queue_tail(&ap->rqueue, skb); 776 return; 777 778err: 779 /* queue zero length packet as error indication */ 780 if (skb || (skb = dev_alloc_skb(0))) { 781 skb_trim(skb, 0); 782 skb_queue_tail(&ap->rqueue, skb); 783 } 784} 785 786static void __exit 787ppp_sync_cleanup(void) 788{ 789 if (tty_unregister_ldisc(N_SYNC_PPP) != 0) 790 printk(KERN_ERR "failed to unregister Sync PPP line discipline\n"); 791} 792 793module_init(ppp_sync_init); 794module_exit(ppp_sync_cleanup); 795MODULE_LICENSE("GPL"); 796MODULE_ALIAS_LDISC(N_SYNC_PPP);