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