linux/drivers/net/ppp_synctty.c
<<
>>
Prefs
   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/completion.h>
  46#include <linux/init.h>
  47#include <asm/uaccess.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 completion dead_cmp;
  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                complete(&ap->dead_cmp);
 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        int speed;
 210
 211        if (tty->ops->write == NULL)
 212                return -EOPNOTSUPP;
 213
 214        ap = kzalloc(sizeof(*ap), GFP_KERNEL);
 215        err = -ENOMEM;
 216        if (!ap)
 217                goto out;
 218
 219        /* initialize the syncppp structure */
 220        ap->tty = tty;
 221        ap->mru = PPP_MRU;
 222        spin_lock_init(&ap->xmit_lock);
 223        spin_lock_init(&ap->recv_lock);
 224        ap->xaccm[0] = ~0U;
 225        ap->xaccm[3] = 0x60000000U;
 226        ap->raccm = ~0U;
 227
 228        skb_queue_head_init(&ap->rqueue);
 229        tasklet_init(&ap->tsk, ppp_sync_process, (unsigned long) ap);
 230
 231        atomic_set(&ap->refcnt, 1);
 232        init_completion(&ap->dead_cmp);
 233
 234        ap->chan.private = ap;
 235        ap->chan.ops = &sync_ops;
 236        ap->chan.mtu = PPP_MRU;
 237        ap->chan.hdrlen = 2;    /* for A/C bytes */
 238        speed = tty_get_baud_rate(tty);
 239        ap->chan.speed = speed;
 240        err = ppp_register_channel(&ap->chan);
 241        if (err)
 242                goto out_free;
 243
 244        tty->disc_data = ap;
 245        tty->receive_room = 65536;
 246        return 0;
 247
 248 out_free:
 249        kfree(ap);
 250 out:
 251        return err;
 252}
 253
 254/*
 255 * Called when the tty is put into another line discipline
 256 * or it hangs up.  We have to wait for any cpu currently
 257 * executing in any of the other ppp_synctty_* routines to
 258 * finish before we can call ppp_unregister_channel and free
 259 * the syncppp struct.  This routine must be called from
 260 * process context, not interrupt or softirq context.
 261 */
 262static void
 263ppp_sync_close(struct tty_struct *tty)
 264{
 265        struct syncppp *ap;
 266
 267        write_lock_irq(&disc_data_lock);
 268        ap = tty->disc_data;
 269        tty->disc_data = NULL;
 270        write_unlock_irq(&disc_data_lock);
 271        if (!ap)
 272                return;
 273
 274        /*
 275         * We have now ensured that nobody can start using ap from now
 276         * on, but we have to wait for all existing users to finish.
 277         * Note that ppp_unregister_channel ensures that no calls to
 278         * our channel ops (i.e. ppp_sync_send/ioctl) are in progress
 279         * by the time it returns.
 280         */
 281        if (!atomic_dec_and_test(&ap->refcnt))
 282                wait_for_completion(&ap->dead_cmp);
 283        tasklet_kill(&ap->tsk);
 284
 285        ppp_unregister_channel(&ap->chan);
 286        skb_queue_purge(&ap->rqueue);
 287        kfree_skb(ap->tpkt);
 288        kfree(ap);
 289}
 290
 291/*
 292 * Called on tty hangup in process context.
 293 *
 294 * Wait for I/O to driver to complete and unregister PPP channel.
 295 * This is already done by the close routine, so just call that.
 296 */
 297static int ppp_sync_hangup(struct tty_struct *tty)
 298{
 299        ppp_sync_close(tty);
 300        return 0;
 301}
 302
 303/*
 304 * Read does nothing - no data is ever available this way.
 305 * Pppd reads and writes packets via /dev/ppp instead.
 306 */
 307static ssize_t
 308ppp_sync_read(struct tty_struct *tty, struct file *file,
 309               unsigned char __user *buf, size_t count)
 310{
 311        return -EAGAIN;
 312}
 313
 314/*
 315 * Write on the tty does nothing, the packets all come in
 316 * from the ppp generic stuff.
 317 */
 318static ssize_t
 319ppp_sync_write(struct tty_struct *tty, struct file *file,
 320                const unsigned char *buf, size_t count)
 321{
 322        return -EAGAIN;
 323}
 324
 325static int
 326ppp_synctty_ioctl(struct tty_struct *tty, struct file *file,
 327                  unsigned int cmd, unsigned long arg)
 328{
 329        struct syncppp *ap = sp_get(tty);
 330        int __user *p = (int __user *)arg;
 331        int err, val;
 332
 333        if (!ap)
 334                return -ENXIO;
 335        err = -EFAULT;
 336        switch (cmd) {
 337        case PPPIOCGCHAN:
 338                err = -EFAULT;
 339                if (put_user(ppp_channel_index(&ap->chan), p))
 340                        break;
 341                err = 0;
 342                break;
 343
 344        case PPPIOCGUNIT:
 345                err = -EFAULT;
 346                if (put_user(ppp_unit_number(&ap->chan), p))
 347                        break;
 348                err = 0;
 349                break;
 350
 351        case TCFLSH:
 352                /* flush our buffers and the serial port's buffer */
 353                if (arg == TCIOFLUSH || arg == TCOFLUSH)
 354                        ppp_sync_flush_output(ap);
 355                err = tty_perform_flush(tty, arg);
 356                break;
 357
 358        case FIONREAD:
 359                val = 0;
 360                if (put_user(val, p))
 361                        break;
 362                err = 0;
 363                break;
 364
 365        default:
 366                err = tty_mode_ioctl(tty, file, cmd, arg);
 367                break;
 368        }
 369
 370        sp_put(ap);
 371        return err;
 372}
 373
 374/* No kernel lock - fine */
 375static unsigned int
 376ppp_sync_poll(struct tty_struct *tty, struct file *file, poll_table *wait)
 377{
 378        return 0;
 379}
 380
 381/*
 382 * This can now be called from hard interrupt level as well
 383 * as soft interrupt level or mainline.
 384 */
 385static void
 386ppp_sync_receive(struct tty_struct *tty, const unsigned char *buf,
 387                  char *cflags, int count)
 388{
 389        struct syncppp *ap = sp_get(tty);
 390        unsigned long flags;
 391
 392        if (!ap)
 393                return;
 394        spin_lock_irqsave(&ap->recv_lock, flags);
 395        ppp_sync_input(ap, buf, cflags, count);
 396        spin_unlock_irqrestore(&ap->recv_lock, flags);
 397        if (!skb_queue_empty(&ap->rqueue))
 398                tasklet_schedule(&ap->tsk);
 399        sp_put(ap);
 400        tty_unthrottle(tty);
 401}
 402
 403static void
 404ppp_sync_wakeup(struct tty_struct *tty)
 405{
 406        struct syncppp *ap = sp_get(tty);
 407
 408        clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
 409        if (!ap)
 410                return;
 411        set_bit(XMIT_WAKEUP, &ap->xmit_flags);
 412        tasklet_schedule(&ap->tsk);
 413        sp_put(ap);
 414}
 415
 416
 417static struct tty_ldisc_ops ppp_sync_ldisc = {
 418        .owner  = THIS_MODULE,
 419        .magic  = TTY_LDISC_MAGIC,
 420        .name   = "pppsync",
 421        .open   = ppp_sync_open,
 422        .close  = ppp_sync_close,
 423        .hangup = ppp_sync_hangup,
 424        .read   = ppp_sync_read,
 425        .write  = ppp_sync_write,
 426        .ioctl  = ppp_synctty_ioctl,
 427        .poll   = ppp_sync_poll,
 428        .receive_buf = ppp_sync_receive,
 429        .write_wakeup = ppp_sync_wakeup,
 430};
 431
 432static int __init
 433ppp_sync_init(void)
 434{
 435        int err;
 436
 437        err = tty_register_ldisc(N_SYNC_PPP, &ppp_sync_ldisc);
 438        if (err != 0)
 439                printk(KERN_ERR "PPP_sync: error %d registering line disc.\n",
 440                       err);
 441        return err;
 442}
 443
 444/*
 445 * The following routines provide the PPP channel interface.
 446 */
 447static int
 448ppp_sync_ioctl(struct ppp_channel *chan, unsigned int cmd, unsigned long arg)
 449{
 450        struct syncppp *ap = chan->private;
 451        int err, val;
 452        u32 accm[8];
 453        void __user *argp = (void __user *)arg;
 454        u32 __user *p = argp;
 455
 456        err = -EFAULT;
 457        switch (cmd) {
 458        case PPPIOCGFLAGS:
 459                val = ap->flags | ap->rbits;
 460                if (put_user(val, (int __user *) argp))
 461                        break;
 462                err = 0;
 463                break;
 464        case PPPIOCSFLAGS:
 465                if (get_user(val, (int __user *) argp))
 466                        break;
 467                ap->flags = val & ~SC_RCV_BITS;
 468                spin_lock_irq(&ap->recv_lock);
 469                ap->rbits = val & SC_RCV_BITS;
 470                spin_unlock_irq(&ap->recv_lock);
 471                err = 0;
 472                break;
 473
 474        case PPPIOCGASYNCMAP:
 475                if (put_user(ap->xaccm[0], p))
 476                        break;
 477                err = 0;
 478                break;
 479        case PPPIOCSASYNCMAP:
 480                if (get_user(ap->xaccm[0], p))
 481                        break;
 482                err = 0;
 483                break;
 484
 485        case PPPIOCGRASYNCMAP:
 486                if (put_user(ap->raccm, p))
 487                        break;
 488                err = 0;
 489                break;
 490        case PPPIOCSRASYNCMAP:
 491                if (get_user(ap->raccm, p))
 492                        break;
 493                err = 0;
 494                break;
 495
 496        case PPPIOCGXASYNCMAP:
 497                if (copy_to_user(argp, ap->xaccm, sizeof(ap->xaccm)))
 498                        break;
 499                err = 0;
 500                break;
 501        case PPPIOCSXASYNCMAP:
 502                if (copy_from_user(accm, argp, sizeof(accm)))
 503                        break;
 504                accm[2] &= ~0x40000000U;        /* can't escape 0x5e */
 505                accm[3] |= 0x60000000U;         /* must escape 0x7d, 0x7e */
 506                memcpy(ap->xaccm, accm, sizeof(ap->xaccm));
 507                err = 0;
 508                break;
 509
 510        case PPPIOCGMRU:
 511                if (put_user(ap->mru, (int __user *) argp))
 512                        break;
 513                err = 0;
 514                break;
 515        case PPPIOCSMRU:
 516                if (get_user(val, (int __user *) argp))
 517                        break;
 518                if (val < PPP_MRU)
 519                        val = PPP_MRU;
 520                ap->mru = val;
 521                err = 0;
 522                break;
 523
 524        default:
 525                err = -ENOTTY;
 526        }
 527        return err;
 528}
 529
 530/*
 531 * This is called at softirq level to deliver received packets
 532 * to the ppp_generic code, and to tell the ppp_generic code
 533 * if we can accept more output now.
 534 */
 535static void ppp_sync_process(unsigned long arg)
 536{
 537        struct syncppp *ap = (struct syncppp *) arg;
 538        struct sk_buff *skb;
 539
 540        /* process received packets */
 541        while ((skb = skb_dequeue(&ap->rqueue)) != NULL) {
 542                if (skb->len == 0) {
 543                        /* zero length buffers indicate error */
 544                        ppp_input_error(&ap->chan, 0);
 545                        kfree_skb(skb);
 546                }
 547                else
 548                        ppp_input(&ap->chan, skb);
 549        }
 550
 551        /* try to push more stuff out */
 552        if (test_bit(XMIT_WAKEUP, &ap->xmit_flags) && ppp_sync_push(ap))
 553                ppp_output_wakeup(&ap->chan);
 554}
 555
 556/*
 557 * Procedures for encapsulation and framing.
 558 */
 559
 560static struct sk_buff*
 561ppp_sync_txmunge(struct syncppp *ap, struct sk_buff *skb)
 562{
 563        int proto;
 564        unsigned char *data;
 565        int islcp;
 566
 567        data  = skb->data;
 568        proto = (data[0] << 8) + data[1];
 569
 570        /* LCP packets with codes between 1 (configure-request)
 571         * and 7 (code-reject) must be sent as though no options
 572         * have been negotiated.
 573         */
 574        islcp = proto == PPP_LCP && 1 <= data[2] && data[2] <= 7;
 575
 576        /* compress protocol field if option enabled */
 577        if (data[0] == 0 && (ap->flags & SC_COMP_PROT) && !islcp)
 578                skb_pull(skb,1);
 579
 580        /* prepend address/control fields if necessary */
 581        if ((ap->flags & SC_COMP_AC) == 0 || islcp) {
 582                if (skb_headroom(skb) < 2) {
 583                        struct sk_buff *npkt = dev_alloc_skb(skb->len + 2);
 584                        if (npkt == NULL) {
 585                                kfree_skb(skb);
 586                                return NULL;
 587                        }
 588                        skb_reserve(npkt,2);
 589                        skb_copy_from_linear_data(skb,
 590                                      skb_put(npkt, skb->len), skb->len);
 591                        kfree_skb(skb);
 592                        skb = npkt;
 593                }
 594                skb_push(skb,2);
 595                skb->data[0] = PPP_ALLSTATIONS;
 596                skb->data[1] = PPP_UI;
 597        }
 598
 599        ap->last_xmit = jiffies;
 600
 601        if (skb && ap->flags & SC_LOG_OUTPKT)
 602                ppp_print_buffer ("send buffer", skb->data, skb->len);
 603
 604        return skb;
 605}
 606
 607/*
 608 * Transmit-side routines.
 609 */
 610
 611/*
 612 * Send a packet to the peer over an sync tty line.
 613 * Returns 1 iff the packet was accepted.
 614 * If the packet was not accepted, we will call ppp_output_wakeup
 615 * at some later time.
 616 */
 617static int
 618ppp_sync_send(struct ppp_channel *chan, struct sk_buff *skb)
 619{
 620        struct syncppp *ap = chan->private;
 621
 622        ppp_sync_push(ap);
 623
 624        if (test_and_set_bit(XMIT_FULL, &ap->xmit_flags))
 625                return 0;       /* already full */
 626        skb = ppp_sync_txmunge(ap, skb);
 627        if (skb != NULL)
 628                ap->tpkt = skb;
 629        else
 630                clear_bit(XMIT_FULL, &ap->xmit_flags);
 631
 632        ppp_sync_push(ap);
 633        return 1;
 634}
 635
 636/*
 637 * Push as much data as possible out to the tty.
 638 */
 639static int
 640ppp_sync_push(struct syncppp *ap)
 641{
 642        int sent, done = 0;
 643        struct tty_struct *tty = ap->tty;
 644        int tty_stuffed = 0;
 645
 646        if (!spin_trylock_bh(&ap->xmit_lock))
 647                return 0;
 648        for (;;) {
 649                if (test_and_clear_bit(XMIT_WAKEUP, &ap->xmit_flags))
 650                        tty_stuffed = 0;
 651                if (!tty_stuffed && ap->tpkt) {
 652                        set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
 653                        sent = tty->ops->write(tty, ap->tpkt->data, ap->tpkt->len);
 654                        if (sent < 0)
 655                                goto flush;     /* error, e.g. loss of CD */
 656                        if (sent < ap->tpkt->len) {
 657                                tty_stuffed = 1;
 658                        } else {
 659                                kfree_skb(ap->tpkt);
 660                                ap->tpkt = NULL;
 661                                clear_bit(XMIT_FULL, &ap->xmit_flags);
 662                                done = 1;
 663                        }
 664                        continue;
 665                }
 666                /* haven't made any progress */
 667                spin_unlock_bh(&ap->xmit_lock);
 668                if (!(test_bit(XMIT_WAKEUP, &ap->xmit_flags)
 669                      || (!tty_stuffed && ap->tpkt)))
 670                        break;
 671                if (!spin_trylock_bh(&ap->xmit_lock))
 672                        break;
 673        }
 674        return done;
 675
 676flush:
 677        if (ap->tpkt) {
 678                kfree_skb(ap->tpkt);
 679                ap->tpkt = NULL;
 680                clear_bit(XMIT_FULL, &ap->xmit_flags);
 681                done = 1;
 682        }
 683        spin_unlock_bh(&ap->xmit_lock);
 684        return done;
 685}
 686
 687/*
 688 * Flush output from our internal buffers.
 689 * Called for the TCFLSH ioctl.
 690 */
 691static void
 692ppp_sync_flush_output(struct syncppp *ap)
 693{
 694        int done = 0;
 695
 696        spin_lock_bh(&ap->xmit_lock);
 697        if (ap->tpkt != NULL) {
 698                kfree_skb(ap->tpkt);
 699                ap->tpkt = NULL;
 700                clear_bit(XMIT_FULL, &ap->xmit_flags);
 701                done = 1;
 702        }
 703        spin_unlock_bh(&ap->xmit_lock);
 704        if (done)
 705                ppp_output_wakeup(&ap->chan);
 706}
 707
 708/*
 709 * Receive-side routines.
 710 */
 711
 712/* called when the tty driver has data for us.
 713 *
 714 * Data is frame oriented: each call to ppp_sync_input is considered
 715 * a whole frame. If the 1st flag byte is non-zero then the whole
 716 * frame is considered to be in error and is tossed.
 717 */
 718static void
 719ppp_sync_input(struct syncppp *ap, const unsigned char *buf,
 720                char *flags, int count)
 721{
 722        struct sk_buff *skb;
 723        unsigned char *p;
 724
 725        if (count == 0)
 726                return;
 727
 728        if (ap->flags & SC_LOG_INPKT)
 729                ppp_print_buffer ("receive buffer", buf, count);
 730
 731        /* stuff the chars in the skb */
 732        skb = dev_alloc_skb(ap->mru + PPP_HDRLEN + 2);
 733        if (!skb) {
 734                printk(KERN_ERR "PPPsync: no memory (input pkt)\n");
 735                goto err;
 736        }
 737        /* Try to get the payload 4-byte aligned */
 738        if (buf[0] != PPP_ALLSTATIONS)
 739                skb_reserve(skb, 2 + (buf[0] & 1));
 740
 741        if (flags && *flags) {
 742                /* error flag set, ignore frame */
 743                goto err;
 744        } else if (count > skb_tailroom(skb)) {
 745                /* packet overflowed MRU */
 746                goto err;
 747        }
 748
 749        p = skb_put(skb, count);
 750        memcpy(p, buf, count);
 751
 752        /* strip address/control field if present */
 753        p = skb->data;
 754        if (p[0] == PPP_ALLSTATIONS && p[1] == PPP_UI) {
 755                /* chop off address/control */
 756                if (skb->len < 3)
 757                        goto err;
 758                p = skb_pull(skb, 2);
 759        }
 760
 761        /* decompress protocol field if compressed */
 762        if (p[0] & 1) {
 763                /* protocol is compressed */
 764                skb_push(skb, 1)[0] = 0;
 765        } else if (skb->len < 2)
 766                goto err;
 767
 768        /* queue the frame to be processed */
 769        skb_queue_tail(&ap->rqueue, skb);
 770        return;
 771
 772err:
 773        /* queue zero length packet as error indication */
 774        if (skb || (skb = dev_alloc_skb(0))) {
 775                skb_trim(skb, 0);
 776                skb_queue_tail(&ap->rqueue, skb);
 777        }
 778}
 779
 780static void __exit
 781ppp_sync_cleanup(void)
 782{
 783        if (tty_unregister_ldisc(N_SYNC_PPP) != 0)
 784                printk(KERN_ERR "failed to unregister Sync PPP line discipline\n");
 785}
 786
 787module_init(ppp_sync_init);
 788module_exit(ppp_sync_cleanup);
 789MODULE_LICENSE("GPL");
 790MODULE_ALIAS_LDISC(N_SYNC_PPP);
 791