upgrade looped-back message from debug statement to syslog warning
[mpls-ppp.git] / linux / ppp.c
blobf0582e39bd35bf2405115990b951b63bec503669
1 /*
2 PPP for Linux
4 $Id: ppp.c,v 1.2 1994/05/30 02:42:55 paulus Exp $
5 */
7 /*
8 Sources:
10 slip.c
12 RFC1331: The Point-to-Point Protocol (PPP) for the Transmission of
13 Multi-protocol Datagrams over Point-to-Point Links
15 RFC1332: IPCP
17 ppp-2.0
19 Flags for this module (any combination is acceptable for testing.):
21 NET02D - Define if using Net-2-Debugged in kernels earler
22 than v1.1.4.
24 NEW_TTY_DRIVERS - Define if using new Ted Ts'o's alpha TTY drivers
25 from tsx-11.mit.edu. From Ted Ts'o.
27 OPTIMIZE_FLAG_TIME - Number of jiffies to force sending of leading flag
28 character. This is normally set to ((HZ * 3) / 2).
29 This is 1.5 seconds. If not defined then the leading
30 flag is always sent.
33 /* #define NET02D /* */
34 /* #define NEW_TTY_DRIVERS /* */
35 #define OPTIMIZE_FLAG_TIME ((HZ * 3)/2) /* */
37 #include <linux/kernel.h>
38 #include <linux/sched.h>
39 #include <linux/types.h>
40 #include <linux/fcntl.h>
41 #include <linux/interrupt.h>
42 #include <linux/ptrace.h>
43 #include <linux/ioport.h>
44 #include <linux/in.h>
45 #include <linux/malloc.h>
46 #include <linux/tty.h>
47 #include <linux/errno.h>
48 #include <linux/sched.h> /* to get the struct task_struct */
49 #include <linux/string.h> /* used in new tty drivers */
50 #include <linux/signal.h> /* used in new tty drivers */
51 #include <asm/system.h>
52 #include <asm/bitops.h>
53 #include <asm/segment.h>
55 #ifdef NET02D /* v1.1.4 net code and earlier */
56 #include <dev.h>
57 #include <skbuff.h>
58 #define skb_queue_head_init(buf) *(buf) = NULL
59 #else /* v1.1.5 and later */
60 #include <linux/netdevice.h>
61 #include <linux/skbuff.h>
62 #endif
64 #include <linux/ppp.h>
66 #include <ip.h>
67 #include <tcp.h>
68 #include <inet.h>
69 #include "slhc.h"
71 #include <linux/if_arp.h>
72 #ifndef ARPHRD_PPP
73 #define ARPHRD_PPP 0
74 #endif
76 #define PRINTK(p) printk p ;
77 #define ASSERT(p) if (!p) PRINTK ((KERN_CRIT "assertion failed: " # p))
78 #define PRINTKN(n,p) {if (ppp_debug >= n) PRINTK (p)}
79 #define CHECK_PPP(a) if (!ppp->inuse) { PRINTK ((ppp_warning, __LINE__)) return a;}
80 #define CHECK_PPP_VOID() if (!ppp->inuse) { PRINTK ((ppp_warning, __LINE__)) return;}
82 #define in_xmap(ppp,c) (ppp->xmit_async_map[(c) >> 5] & (1 << ((c) & 0x1f)))
83 #define in_rmap(ppp,c) ((((unsigned int) (unsigned char) (c)) < 0x20) && \
84 ppp->recv_async_map & (1 << (c)))
86 #define bset(p,b) ((p)[(b) >> 5] |= (1 << ((b) & 0x1f)))
88 int ppp_debug = 2;
89 int ppp_debug_netpackets = 0;
91 /* Define this string only once for all macro envocations */
92 static char ppp_warning[] = KERN_WARNING "PPP: ALERT! not INUSE! %d\n";
94 int ppp_init(struct device *);
95 static void ppp_init_ctrl_blk(struct ppp *);
96 static int ppp_dev_open(struct device *);
97 static int ppp_dev_close(struct device *);
98 static void ppp_kick_tty(struct ppp *);
100 #ifdef NEW_TTY_DRIVERS
101 #define ppp_find(tty) ((struct ppp *) tty->disc_data)
102 #else
103 static void ppp_output_done(void *);
104 static void ppp_unesc(struct ppp *ppp, unsigned char *c, int n);
105 static struct ppp *ppp_find(struct tty_struct *);
106 #endif
108 static void ppp_doframe(struct ppp *);
109 static int ppp_do_ip(struct ppp *, unsigned short, unsigned char *, int);
110 static int ppp_us_queue(struct ppp *, unsigned short, unsigned char *, int);
111 static int ppp_xmit(struct sk_buff *, struct device *);
112 static unsigned short ppp_type_trans(struct sk_buff *, struct device *);
114 #ifdef NET02D
115 static int ppp_header(unsigned char *buff, struct device *dev,
116 unsigned short type, unsigned long daddr,
117 unsigned long saddr, unsigned len);
118 static int ppp_rebuild_header(void *buff, struct device *dev);
119 static void ppp_add_arp(unsigned long addr, struct sk_buff *skb,
120 struct device *dev);
121 #else
122 static int ppp_header(unsigned char *, struct device *, unsigned short,
123 void *, void *, unsigned, struct sk_buff *);
124 static int ppp_rebuild_header(void *, struct device *, unsigned long,
125 struct sk_buff *);
126 #endif
128 static struct enet_statistics *ppp_get_stats (struct device *);
129 static struct ppp *ppp_alloc(void);
130 static int ppp_lock(struct ppp *);
131 static void ppp_unlock(struct ppp *);
132 static void ppp_add_fcs(struct ppp *);
133 static int ppp_check_fcs(struct ppp *);
134 static void ppp_print_buffer(const char *,char *,int,int);
136 static int ppp_read(struct tty_struct *, struct file *, unsigned char *,
137 unsigned int);
138 static int ppp_write(struct tty_struct *, struct file *, unsigned char *,
139 unsigned int);
140 static int ppp_ioctl(struct tty_struct *, struct file *, unsigned int,
141 unsigned long);
142 static int ppp_select(struct tty_struct *tty, struct inode * inode,
143 struct file * filp, int sel_type, select_table * wait);
144 static int ppp_open(struct tty_struct *);
145 static void ppp_close(struct tty_struct *);
147 #ifdef NEW_TTY_DRIVERS
148 static void ppp_receive_buf(struct tty_struct *tty, unsigned char *cp,
149 char *fp, int count);
150 static void ppp_write_wakeup(struct tty_struct *tty);
151 #else
152 static void ppp_tty_input_ready(struct tty_struct *);
153 #endif
155 /* FCS table from RFC1331 */
157 static unsigned short fcstab[256] = {
158 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
159 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
160 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
161 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
162 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
163 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
164 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
165 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
166 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
167 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
168 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
169 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
170 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
171 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
172 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
173 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
174 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
175 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
176 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
177 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
178 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
179 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
180 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
181 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
182 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
183 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
184 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
185 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
186 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
187 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
188 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
189 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
192 struct tty_ldisc ppp_ldisc;
194 static struct ppp ppp_ctrl[PPP_NRUNIT];
196 /*************************************************************
197 * INITIALIZATION
198 *************************************************************/
200 static int first_time = 1;
202 /* called at boot time for each ppp device */
205 ppp_init(struct device *dev)
207 struct ppp *ppp;
208 int i;
210 ppp = &ppp_ctrl[dev->base_addr];
212 if (first_time) {
213 first_time = 0;
215 printk (KERN_INFO "PPP: version %s (%d channels)"
216 #ifdef NET02D
217 " NET02D"
218 #endif
219 #ifdef NEW_TTY_DRIVERS
220 " NEW_TTY_DRIVERS"
221 #endif
222 #ifdef OPTIMIZE_FLAG_TIME
223 " OPTIMIZE_FLAGS"
224 #endif
225 "\n", PPP_VERSION, PPP_NRUNIT);
227 printk (KERN_INFO
228 "TCP compression code copyright 1989 Regents of the "
229 "University of California\n");
231 (void) memset(&ppp_ldisc, 0, sizeof(ppp_ldisc));
232 ppp_ldisc.open = ppp_open;
233 ppp_ldisc.close = ppp_close;
234 ppp_ldisc.read = ppp_read;
235 ppp_ldisc.write = ppp_write;
236 ppp_ldisc.ioctl = ppp_ioctl;
237 ppp_ldisc.select = ppp_select;
239 #ifdef NEW_TTY_DRIVERS
240 ppp_ldisc.magic = TTY_LDISC_MAGIC;
241 ppp_ldisc.receive_buf = ppp_receive_buf;
242 ppp_ldisc.write_wakeup = ppp_write_wakeup;
243 #else
244 ppp_ldisc.handler = ppp_tty_input_ready;
245 #endif
247 if ((i = tty_register_ldisc(N_PPP, &ppp_ldisc)) == 0)
248 printk(KERN_INFO "PPP line discipline registered.\n");
249 else
250 printk(KERN_ERR "error registering line discipline: %d\n", i);
253 /* initialize PPP control block */
254 ppp_init_ctrl_blk (ppp);
255 ppp->inuse = 0;
256 ppp->line = dev->base_addr;
257 ppp->tty = NULL;
258 ppp->dev = dev;
260 /* clear statistics */
261 memset (&ppp->stats, '\0', sizeof (struct ppp_stats));
263 /* device INFO */
264 dev->mtu = PPP_MTU;
265 dev->hard_start_xmit = ppp_xmit;
266 dev->open = ppp_dev_open;
267 dev->stop = ppp_dev_close;
268 dev->get_stats = ppp_get_stats;
269 dev->hard_header = ppp_header;
270 dev->type_trans = ppp_type_trans;
271 dev->rebuild_header = ppp_rebuild_header;
272 dev->hard_header_len = 0;
273 dev->addr_len = 0;
274 dev->type = ARPHRD_PPP;
276 #ifdef NET02D
277 dev->add_arp = ppp_add_arp;
278 dev->queue_xmit = dev_queue_xmit;
279 #endif
281 for (i = 0; i < DEV_NUMBUFFS; i++)
282 skb_queue_head_init(&dev->buffs[i]); /* = NULL if NET02D */
284 /* New-style flags */
285 dev->flags = IFF_POINTOPOINT;
286 dev->family = AF_INET;
287 dev->pa_addr = 0;
288 dev->pa_brdaddr = 0;
289 dev->pa_mask = 0;
290 dev->pa_alen = sizeof(unsigned long);
292 return 0;
295 static void
296 ppp_init_ctrl_blk(struct ppp *ppp)
298 ppp->magic = PPP_MAGIC;
299 ppp->sending = 0;
300 ppp->toss = 0xFE;
301 ppp->escape = 0;
303 ppp->flags = 0;
304 ppp->mtu = PPP_MTU;
305 ppp->mru = PPP_MRU;
306 ppp->fcs = 0;
308 memset (ppp->xmit_async_map, 0, sizeof (ppp->xmit_async_map));
309 ppp->xmit_async_map[0] = 0xffffffff;
310 ppp->xmit_async_map[3] = 0x60000000;
311 ppp->recv_async_map = 0x00000000;
313 ppp->slcomp = NULL;
314 ppp->rbuff = NULL;
315 ppp->xbuff = NULL;
316 ppp->cbuff = NULL;
318 ppp->rhead = NULL;
319 ppp->rend = NULL;
320 ppp->rcount = 0;
321 ppp->xhead = NULL;
322 ppp->xtail = NULL;
324 ppp->us_rbuff = NULL;
325 ppp->us_rbuff_end = NULL;
326 ppp->us_rbuff_head = NULL;
327 ppp->us_rbuff_tail = NULL;
328 ppp->read_wait = NULL;
329 ppp->write_wait = NULL;
330 ppp->us_rbuff_lock = 0;
331 ppp->inp_sig = 0;
332 ppp->inp_sig_pid = 0;
334 #ifdef OPTIMIZE_FLAG_TIME /* ensure flag will always be sent first time */
335 ppp->last_xmit = jiffies - OPTIMIZE_FLAG_TIME;
336 #else
337 ppp->last_xmit = 0;
338 #endif
340 /* clear statistics */
341 memset (&ppp->stats, '\0', sizeof (struct ppp_stats));
343 /* Reset the demand dial information */
344 ppp->ddinfo.ip_sjiffies =
345 ppp->ddinfo.ip_rjiffies =
346 ppp->ddinfo.nip_sjiffies =
347 ppp->ddinfo.nip_rjiffies = jiffies;
351 * MTU has been changed by the IP layer. Unfortunately we are not told
352 * about this, but we spot it ourselves and fix things up. We could be
353 * in an upcall from the tty driver, or in an ip packet queue.
356 static void
357 ppp_changedmtu (struct ppp *ppp, int new_mtu, int new_mru)
359 struct device *dev;
360 unsigned char *new_rbuff, *new_xbuff, *new_cbuff;
361 unsigned char *old_rbuff, *old_xbuff, *old_cbuff;
362 int mtu, mru;
364 * Allocate the buffer from the kernel for the data
366 dev = ppp->dev;
367 mru = new_mru;
368 mtu = new_mtu;
370 /* RFC 1331, section 7.2 says the minimum value is 1500 bytes */
371 if (mru < PPP_MRU)
372 mru = PPP_MRU;
374 mtu = (mtu * 2) + 20;
375 mru = (mru * 2) + 20;
377 PRINTKN (2,(KERN_INFO "ppp: channel %s mtu = %d, mru = %d\n",
378 dev->name, new_mtu, new_mru));
380 new_xbuff = (unsigned char *) kmalloc(mtu + 4, GFP_ATOMIC);
381 new_rbuff = (unsigned char *) kmalloc(mru + 4, GFP_ATOMIC);
382 new_cbuff = (unsigned char *) kmalloc(mru + 4, GFP_ATOMIC);
384 * If the buffers failed to allocate then complain.
386 if (new_xbuff == NULL || new_rbuff == NULL || new_cbuff == NULL)
388 PRINTKN (2,(KERN_ERR "ppp: failed to allocate new buffers\n"));
390 * Release new buffer pointers if the updates were not performed
392 if (new_rbuff != NULL)
393 kfree (new_rbuff);
395 if (new_xbuff != NULL)
396 kfree (new_xbuff);
398 if (new_cbuff != NULL)
399 kfree (new_cbuff);
402 * Update the pointers to the new buffer structures.
404 else
406 cli();
407 old_xbuff = ppp->xbuff;
408 old_rbuff = ppp->rbuff;
409 old_cbuff = ppp->cbuff;
411 ppp->xbuff = new_xbuff;
412 ppp->rbuff = new_rbuff;
413 ppp->cbuff = new_cbuff;
415 dev->mem_start = (unsigned long) new_xbuff;
416 dev->mem_end = (unsigned long) (dev->mem_start + mtu);
418 dev->rmem_start = (unsigned long) new_rbuff;
419 ppp->rend = (unsigned char *)
420 dev->rmem_end = (unsigned long) (dev->rmem_start + mru);
422 ppp->rhead = new_rbuff;
424 * Update the parameters for the new buffer sizes
426 ppp->toss = 0xFE;
427 ppp->escape = 0;
428 ppp->sending = 0;
429 ppp->rcount = 0;
431 ppp->mru = new_mru;
433 ppp->mtu =
434 dev->mtu = new_mtu;
436 sti();
438 * Release old buffer pointers
440 if (old_rbuff != NULL)
441 kfree (old_rbuff);
443 if (old_xbuff != NULL)
444 kfree (old_xbuff);
446 if (old_cbuff != NULL)
447 kfree (old_cbuff);
451 /* called when we abandon the PPP line discipline */
453 static void
454 ppp_release(struct ppp *ppp)
456 #ifdef NEW_TTY_DRIVERS
457 if (ppp->tty != NULL && ppp->tty->disc_data == ppp)
458 ppp->tty->disc_data = NULL; /* Break the tty->ppp link */
459 #endif
461 if (ppp->dev) {
462 ppp->dev->flags &= ~IFF_UP; /* down the device */
463 ppp->dev->flags |= IFF_POINTOPOINT;
466 kfree (ppp->xbuff);
467 kfree (ppp->cbuff);
468 kfree (ppp->rbuff);
469 kfree (ppp->us_rbuff);
471 ppp->xbuff =
472 ppp->cbuff =
473 ppp->rbuff =
474 ppp->us_rbuff = NULL;
476 if (ppp->slcomp) {
477 slhc_free(ppp->slcomp);
478 ppp->slcomp = NULL;
481 ppp->inuse = 0;
482 ppp->tty = NULL;
485 static void
486 ppp_close(struct tty_struct *tty)
488 struct ppp *ppp = ppp_find(tty);
490 if (ppp == NULL || ppp->magic != PPP_MAGIC) {
491 PRINTKN (1,(KERN_WARNING "ppp: trying to close unopened tty!\n"));
492 } else {
493 CHECK_PPP_VOID();
494 ppp_release (ppp);
496 PRINTKN (2,(KERN_INFO "ppp: channel %s closing.\n", ppp->dev->name));
500 /* called when PPP line discipline is selected on a tty */
501 static int
502 ppp_open(struct tty_struct *tty)
504 struct ppp *ppp = ppp_find(tty);
506 if (ppp) {
507 PRINTKN (1,(KERN_ERR "ppp_open: gack! tty already associated to %s!\n",
508 ppp->magic == PPP_MAGIC ? ppp->dev->name : "unknown"));
509 return -EEXIST;
512 ppp = ppp_alloc();
513 if (ppp == NULL) {
514 PRINTKN (1,(KERN_ERR "ppp_open: couldn't allocate ppp channel\n"));
515 return -ENFILE;
518 /* make sure the channel is actually open */
519 ppp_init_ctrl_blk (ppp);
521 ppp->tty = tty;
523 #ifdef NEW_TTY_DRIVERS
524 tty->disc_data = ppp;
525 if (tty->driver.flush_buffer)
526 tty->driver.flush_buffer(tty);
527 if (tty->ldisc.flush_buffer)
528 tty->ldisc.flush_buffer(tty);
529 #else
530 tty_read_flush (tty);
531 tty_write_flush (tty);
532 #endif
534 if ((ppp->slcomp = slhc_init(16, 16)) == NULL) {
535 PRINTKN (1,(KERN_ERR "ppp: no space for compression buffers!\n"));
536 ppp_release (ppp);
537 return -ENOMEM;
540 /* Define the buffers for operation */
541 ppp_changedmtu (ppp, ppp->dev->mtu, ppp->mru);
542 if (ppp->rbuff == NULL) {
543 ppp_release (ppp);
544 return -ENOMEM;
547 /* Allocate a user-level receive buffer */
548 ppp->us_rbuff = kmalloc (RBUFSIZE, GFP_KERNEL);
549 if (ppp->us_rbuff == NULL) {
550 PRINTKN (1,(KERN_ERR "ppp: no space for user receive buffer\n"));
551 ppp_release (ppp);
552 return -ENOMEM;
555 ppp->us_rbuff_head =
556 ppp->us_rbuff_tail = ppp->us_rbuff;
557 ppp->us_rbuff_end = ppp->us_rbuff + RBUFSIZE;
559 PRINTKN (2,(KERN_INFO "ppp: channel %s open\n", ppp->dev->name));
561 return (ppp->line);
564 /* called when ppp interface goes "up". here this just means we start
565 passing IP packets */
566 static int
567 ppp_dev_open(struct device *dev)
569 struct ppp *ppp = &ppp_ctrl[dev->base_addr];
571 /* reset POINTOPOINT every time, since dev_close zaps it! */
572 dev->flags |= IFF_POINTOPOINT;
574 if (ppp->tty == NULL) {
575 PRINTKN (1,(KERN_ERR "ppp: %s not connected to a TTY! can't go open!\n",
576 dev->name));
577 return -ENXIO;
580 PRINTKN (2,(KERN_INFO "ppp: channel %s going up for IP packets!\n",
581 dev->name));
583 CHECK_PPP(-ENXIO);
584 return 0;
587 static int
588 ppp_dev_close(struct device *dev)
590 struct ppp *ppp = &ppp_ctrl[dev->base_addr];
592 if (ppp->tty == NULL) {
593 PRINTKN (1,(KERN_ERR "ppp: %s not connected to a TTY! can't go down!\n",
594 dev->name));
595 return -ENXIO;
598 PRINTKN (2,(KERN_INFO "ppp: channel %s going down for IP packets!\n",
599 dev->name));
600 CHECK_PPP(-ENXIO);
601 return 0;
604 /*************************************************************
605 * TTY OUTPUT
606 * The following function delivers a fully-formed PPP
607 * frame in ppp->xbuff to the TTY for output.
608 *************************************************************/
610 #ifdef NEW_TTY_DRIVERS
611 static inline void
612 #else
613 static void
614 #endif
615 ppp_output_done (void *ppp)
617 /* unlock the transmitter queue */
618 ppp_unlock ((struct ppp *) ppp);
620 /* If the device is still up then enable the transmitter of the
621 next frame. */
622 if (((struct ppp *) ppp)->dev->flags & IFF_UP)
623 dev_tint (((struct ppp *) ppp)->dev);
625 /* enable any blocked process pending transmission */
626 wake_up_interruptible (&((struct ppp *) ppp)->write_wait);
629 #ifndef NEW_TTY_DRIVERS
630 static void
631 ppp_kick_tty (struct ppp *ppp)
633 register int count = ppp->xhead - ppp->xbuff;
634 register int answer;
636 ppp->stats.sbytes += count;
638 answer = tty_write_data (ppp->tty,
639 ppp->xbuff,
640 count,
641 ppp_output_done,
642 (void *) ppp);
644 if (answer == 0)
645 ppp_output_done (ppp); /* Should not happen */
646 else
647 if (answer < 0) {
648 ppp->stats.serrors++;
649 ppp_output_done (ppp); /* unlock the transmitter */
653 #else
655 static void
656 ppp_kick_tty (struct ppp *ppp)
658 register int count, actual;
660 count = ppp->xhead - ppp->xbuff;
662 actual = ppp->tty->driver.write(ppp->tty, 0, ppp->xbuff, count);
663 ppp->stats.sbytes += actual;
664 if (actual == count) {
665 ppp_output_done(ppp);
666 } else {
667 ppp->xtail = ppp->xbuff + actual;
668 ppp->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
672 static void ppp_write_wakeup(struct tty_struct *tty)
674 register int count, actual;
675 struct ppp *ppp = ppp_find(tty);
677 if (!ppp || ppp->magic != PPP_MAGIC) {
678 PRINTKN (1,
679 (KERN_ERR "PPP: write_wakeup called but couldn't "
680 "find PPP struct.\n"));
681 return;
684 if (!ppp->xtail || (ppp->flags & SC_XMIT_BUSY))
685 return;
687 cli();
688 if (ppp->flags & SC_XMIT_BUSY)
689 return;
690 ppp->flags |= SC_XMIT_BUSY;
691 sti();
693 count = ppp->xhead - ppp->xtail;
695 actual = tty->driver.write(tty, 0, ppp->xtail, count);
696 ppp->stats.sbytes += actual;
697 if (actual == count) {
698 ppp->xtail = 0;
699 tty->flags &= ~TTY_DO_WRITE_WAKEUP;
701 ppp_output_done(ppp);
702 } else {
703 ppp->xtail += actual;
705 ppp->flags &= ~SC_XMIT_BUSY;
707 #endif
709 /*************************************************************
710 * TTY INPUT
711 * The following functions handle input that arrives from
712 * the TTY. It recognizes PPP frames and either hands them
713 * to the network layer or queues them for delivery to a
714 * user process reading this TTY.
715 *************************************************************/
717 /* stuff a single character into the receive buffer */
719 inline void
720 ppp_enqueue(struct ppp *ppp, unsigned char c)
722 unsigned long flags;
724 save_flags(flags);
725 cli();
726 if (ppp->rhead < ppp->rend) {
727 *ppp->rhead = c;
728 ppp->rhead++;
729 ppp->rcount++;
730 } else
731 ppp->stats.roverrun++;
732 restore_flags(flags);
735 #ifdef CHECK_CHARACTERS
736 static unsigned paritytab[8] = {
737 0x96696996, 0x69969669, 0x69969669, 0x96696996,
738 0x69969669, 0x96696996, 0x96696996, 0x69969669
740 #endif
742 #ifndef NEW_TTY_DRIVERS
743 static void
744 ppp_dump_inqueue(struct tty_struct *tty)
746 int head = tty->read_q.head,
747 tail = tty->read_q.tail,
748 i, count;
749 char buffer[8];
751 PRINTK ((KERN_DEBUG "INQUEUE: head %d tail %d imode %x:\n", head, tail,
752 (unsigned int) tty->termios->c_iflag))
754 i = tail;
755 count = 0;
757 while (i != head) {
758 buffer [count] = tty->read_q.buf[i];
759 if (++count == 8) {
760 ppp_print_buffer (NULL, buffer, 8, KERNEL_DS);
761 count = 0;
763 i = (i + 1) & (TTY_BUF_SIZE - 1);
765 ppp_print_buffer (NULL, buffer, count, KERNEL_DS);
768 /* called by lower levels of TTY driver when data becomes available.
769 all incoming data comes through this function. */
771 void ppp_tty_input_ready(struct tty_struct *tty)
773 struct ppp *ppp = ppp_find(tty);
774 int n, error;
775 unsigned char buff[128];
777 /* PRINTK( (KERN_DEBUG "PPP: handler called.\n") ) */
778 if (!ppp || ppp->magic != PPP_MAGIC) {
779 PRINTKN (1,
780 (KERN_ERR "PPP: handler called but couldn't find PPP struct.\n"));
781 return;
784 CHECK_PPP_VOID();
786 /* ZZZ */
787 if (ppp_debug >= 5)
788 ppp_dump_inqueue(ppp->tty);
790 do {
791 n = tty_read_raw_data(tty, buff, 128);
792 if ( n == 0 ) /* nothing there */
793 break;
795 if (ppp_debug >= 5)
796 ppp_print_buffer ("receive buffer", buff, n > 0 ? n : -n, KERNEL_DS);
798 if ( n < 0 ) {
799 /* Last character is error flag.
800 Process the previous characters, then set toss flag. */
801 n = (-n) - 1;
802 error = buff[n];
803 } else error = 0;
804 ppp->stats.rbytes += n;
805 ppp_unesc(ppp,buff,n);
806 if (error)
807 ppp->toss = error;
808 } while (1);
811 /* recover frame by undoing PPP escape mechanism;
812 copies N chars of input data from C into PPP->rbuff
813 calls ppp_doframe to dispose of any frames it finds
816 static void
817 ppp_unesc(struct ppp *ppp, unsigned char *c, int n)
819 int i;
821 for (i = 0; i < n; i++, c++) {
822 PRINTKN (6,(KERN_DEBUG "(%x)", (unsigned int) *c));
824 #ifdef CHECK_CHARACTERS
825 if (*c & 0x80)
826 sc->sc_flags |= SC_RCV_B7_1;
827 else
828 sc->sc_flags |= SC_RCV_B7_0;
830 if (paritytab[*c >> 5] & (1 << (*c & 0x1F)))
831 sc->sc_flags |= SC_RCV_ODDP;
832 else
833 sc->sc_flags |= SC_RCV_EVNP;
834 #endif
836 switch (*c) {
837 case PPP_ESC: /* PPP_ESC: invert 0x20 in next character */
838 ppp->escape = PPP_TRANS;
839 break;
841 case PPP_FLAG: /* PPP_FLAG: end of frame */
842 if (ppp->escape) /* PPP_ESC just before PPP_FLAG is illegal */
843 ppp->toss = 0xFF;
845 if ((ppp->toss & 0x80) == 0)
846 ppp_doframe(ppp); /* pass frame on to next layers */
848 ppp->rcount = 0;
849 ppp->rhead = ppp->rbuff;
850 ppp->escape = 0;
851 ppp->toss = 0;
852 break;
854 default: /* regular character */
855 if (!in_rmap (ppp, *c)) {
856 if (ppp->toss == 0)
857 ppp_enqueue (ppp, *c ^ ppp->escape);
858 ppp->escape = 0;
860 break;
865 #else
866 static void ppp_receive_buf(struct tty_struct *tty, unsigned char *cp,
867 char *fp, int count)
869 register struct ppp *ppp = ppp_find (tty);
870 unsigned char c;
872 /* PRINTK( ("PPP: handler called.\n") ); */
874 if (!ppp || ppp->magic != PPP_MAGIC) {
875 PRINTKN (1,("PPP: handler called but couldn't find "
876 "PPP struct.\n"));
877 return;
880 CHECK_PPP_VOID();
882 if (ppp_debug >= 5) {
883 ppp_print_buffer ("receive buffer", cp, count, KERNEL_DS);
886 while (count-- > 0) {
887 c = *cp++;
889 if (fp) {
890 if (*fp && ppp->toss == 0)
891 ppp->toss = *fp;
892 fp++;
895 #ifdef CHECK_CHARACTERS
896 if (c & 0x80)
897 sc->sc_flags |= SC_RCV_B7_1;
898 else
899 sc->sc_flags |= SC_RCV_B7_0;
901 if (paritytab[c >> 5] & (1 << (c & 0x1F)))
902 sc->sc_flags |= SC_RCV_ODDP;
903 else
904 sc->sc_flags |= SC_RCV_EVNP;
905 #endif
907 switch (c) {
908 case PPP_ESC: /* PPP_ESC: invert 0x20 in next character */
909 ppp->escape = PPP_TRANS;
910 break;
912 case PPP_FLAG: /* PPP_FLAG: end of frame */
913 if (ppp->escape) /* PPP_ESC just before PPP_FLAG is "cancel"*/
914 ppp->toss = 0xFF;
916 if ((ppp->toss & 0x80) == 0)
917 ppp_doframe(ppp); /* pass frame on to next layers */
919 ppp->rcount = 0;
920 ppp->rhead = ppp->rbuff;
921 ppp->escape = 0;
922 ppp->toss = 0;
923 break;
925 default: /* regular character */
926 if (!in_rmap (ppp, c)) {
927 if (ppp->toss == 0)
928 ppp_enqueue (ppp, c ^ ppp->escape);
929 ppp->escape = 0;
934 #endif
936 /* on entry, a received frame is in ppp->rbuff
937 check it and dispose as appropriate */
938 static void
939 ppp_doframe(struct ppp *ppp)
941 u_char *c = ppp->rbuff;
942 u_short proto;
943 int count = ppp->rcount;
945 /* forget it if we've already noticed an error */
946 if (ppp->toss) {
947 PRINTKN (1, (KERN_WARNING "ppp_toss: tossing frame, reason = %d\n",
948 ppp->toss));
949 ppp->stats.rerrors++;
950 return;
953 /* do this before printing buffer to avoid generating copious output */
954 if (count == 0)
955 return;
957 if (ppp_debug >= 3)
958 ppp_print_buffer ("receive frame", c, count, KERNEL_DS);
960 if (count < 4) {
961 PRINTKN (1,(KERN_WARNING "ppp: got runt ppp frame, %d chars\n", count));
962 ppp->stats.runts++;
963 return;
966 /* check PPP error detection field */
967 if (!ppp_check_fcs(ppp)) {
968 PRINTKN (1,(KERN_WARNING "ppp: frame with bad fcs\n"));
969 ppp->stats.rerrors++;
970 return;
973 count -= 2; /* ignore last two characters */
975 /* now we have a good frame */
976 /* figure out the protocol field */
977 if ((c[0] == PPP_ADDRESS) && (c[1] == PPP_CONTROL)) {
978 c = c + 2; /* ADDR/CTRL not compressed, so skip */
979 count -= 2;
982 proto = (u_short) *c++; /* PROTO compressed */
983 if (proto & 1) {
984 count--;
985 } else {
986 proto = (proto << 8) | (u_short) *c++; /* PROTO uncompressed */
987 count -= 2;
990 /* Send the frame to the network if the ppp device is up */
991 if ((ppp->dev->flags & IFF_UP) && ppp_do_ip(ppp, proto, c, count)) {
992 ppp->ddinfo.ip_rjiffies = jiffies;
993 return;
996 /* If we got here, it has to go to a user process doing a read,
997 so queue it.
999 User process expects to get whole frame (for some reason), so
1000 use count+2 so as to include FCS field. */
1002 if (ppp_us_queue (ppp, proto, c, count+2)) {
1003 ppp->ddinfo.nip_rjiffies = jiffies;
1004 ppp->stats.rothers++;
1005 return;
1008 /* couldn't cope. */
1009 PRINTKN (1,(KERN_WARNING
1010 "ppp: dropping packet on the floor: nobody could take it.\n"));
1011 ppp->stats.tossed++;
1014 /* Examine packet at C, attempt to pass up to net layer.
1015 PROTO is the protocol field from the PPP frame.
1016 Return 1 if could handle it, 0 otherwise. */
1018 static int
1019 ppp_do_ip (struct ppp *ppp, unsigned short proto, unsigned char *c,
1020 int count)
1022 int flags, done;
1024 PRINTKN (4,(KERN_DEBUG "ppp_do_ip: proto %x len %d first byte %x\n",
1025 (int) proto, count, c[0]));
1027 if (ppp_debug_netpackets) {
1028 PRINTK (("KERN_DEBUG %s <-- proto %x len %d\n", ppp->dev->name,
1029 (int) proto, count));
1032 if (proto == PROTO_IP) {
1033 ppp->stats.runcomp++;
1034 goto sendit;
1037 if ((proto == PROTO_VJCOMP) && !(ppp->flags & SC_REJ_COMP_TCP)) {
1038 /* get space for uncompressing the header */
1039 done = 0;
1040 save_flags (flags);
1041 cli();
1042 if ((ppp->rhead + 80) < ppp->rend) {
1043 ppp->rhead += 80;
1044 ppp->rcount += 80;
1045 done = 1;
1047 restore_flags(flags);
1049 if (! done) {
1050 PRINTKN (1,(KERN_NOTICE
1051 "ppp: no space to decompress VJ compressed TCP header.\n"));
1052 ppp->stats.roverrun++;
1053 return 1;
1056 count = slhc_uncompress(ppp->slcomp, c, count);
1057 if (count <= 0) {
1058 ppp->stats.rerrors++;
1059 PRINTKN (1,(KERN_NOTICE "ppp: error in VJ decompression\n"));
1060 return 1;
1062 ppp->stats.rcomp++;
1063 goto sendit;
1066 if ((proto == PROTO_VJUNCOMP) && !(ppp->flags & SC_REJ_COMP_TCP)) {
1067 if (slhc_remember(ppp->slcomp, c, count) <= 0) {
1068 ppp->stats.rerrors++;
1069 PRINTKN (1,(KERN_NOTICE "ppp: error in VJ memorizing\n"));
1070 return 1;
1072 ppp->stats.runcomp++;
1073 goto sendit;
1076 /* not ours */
1077 return 0;
1079 sendit:
1080 if (ppp_debug_netpackets) {
1081 struct iphdr *iph = (struct iphdr *) c;
1082 PRINTK ((KERN_INFO "%s <-- src %lx dst %lx len %d\n", ppp->dev->name,
1083 iph->saddr, iph->daddr, count))
1086 /* receive the frame through the network software */
1087 while ((dev_rint(c, count, 0, ppp->dev) & ~1) != 0)
1090 return 1;
1093 /* stuff packet at BUF, length LEN, into the us_rbuff buffer
1094 prepend PROTO information */
1096 #define PUTC(c,label) *ppp->us_rbuff_head++ = c; \
1097 if (ppp->us_rbuff_head == ppp->us_rbuff_end) \
1098 ppp->us_rbuff_head = ppp->us_rbuff; \
1099 if (ppp->us_rbuff_head == ppp->us_rbuff_tail) \
1100 goto label;
1101 #define GETC(c) c = *ppp->us_rbuff_tail++; \
1102 if (ppp->us_rbuff_tail == ppp->us_rbuff_end) \
1103 ppp->us_rbuff_tail = ppp->us_rbuff;
1105 static int
1106 ppp_us_queue(struct ppp *ppp, unsigned short proto,
1107 unsigned char *buf, int len)
1109 int totlen;
1110 unsigned char *saved_head;
1112 totlen = len+2; /* including protocol */
1114 if (set_bit(1, &ppp->us_rbuff_lock)) {
1115 PRINTKN (1, (KERN_NOTICE "ppp_us_queue: can't get lock\n"));
1116 return 0;
1118 saved_head = ppp->us_rbuff_head;
1120 PUTC((totlen & 0xff00) >> 8, failure);
1121 PUTC(totlen & 0x00ff, failure);
1122 PUTC((proto & 0xff00) >> 8, failure);
1123 PUTC(proto & 0x00ff, failure);
1125 while (len-- > 0) {
1126 PUTC(*buf++, failure);
1129 PRINTKN (3, (KERN_INFO "ppp: successfully queued %d bytes\n", totlen));
1130 clear_bit(1, &ppp->us_rbuff_lock);
1131 wake_up_interruptible (&ppp->read_wait);
1133 #ifdef NEW_TTY_DRIVERS
1134 kill_fasync(ppp->tty->fasync, SIGIO);
1135 #endif
1137 if (ppp->inp_sig && ppp->inp_sig_pid)
1138 if (kill_proc (ppp->inp_sig_pid, ppp->inp_sig, 1) != 0) {
1139 /* process is gone */
1140 PRINTKN (2,(KERN_NOTICE
1141 "ppp: process that requested notification is gone\n"));
1142 ppp->inp_sig = 0;
1143 ppp->inp_sig_pid = 0;
1145 return 1;
1147 failure:
1148 ppp->us_rbuff_head = saved_head;
1149 clear_bit(1, &ppp->us_rbuff_lock);
1151 PRINTKN (1, (KERN_NOTICE "ppp_us_queue: ran out of buffer space.\n"));
1153 return 0;
1156 /*************************************************************
1157 * LINE DISCIPLINE SUPPORT
1158 * The following functions form support user programs
1159 * which read and write data on a TTY with the PPP line
1160 * discipline. Reading is done from a circular queue,
1161 * filled by the lower TTY levels.
1162 *************************************************************/
1164 /* read a PPP frame from the us_rbuff circular buffer,
1165 waiting if necessary
1168 static int
1169 ppp_read(struct tty_struct *tty, struct file *file, unsigned char *buf, unsigned int nr)
1171 struct ppp *ppp = ppp_find(tty);
1172 unsigned char c;
1173 int len, i;
1175 if (!ppp || ppp->magic != PPP_MAGIC) {
1176 PRINTKN (1,(KERN_ERR "ppp_read: cannnot find ppp channel\n"));
1177 return -EIO;
1180 CHECK_PPP(-ENXIO);
1182 PRINTKN (4,(KERN_DEBUG "ppp_read: called %x num %u\n",
1183 (unsigned int) buf,
1184 nr));
1186 do {
1187 /* try to acquire read lock */
1188 if (set_bit(0, &ppp->us_rbuff_lock) == 0) {
1189 /* got lock */
1190 if (ppp->us_rbuff_head == ppp->us_rbuff_tail) {
1191 /* no data */
1192 PRINTKN (4,(KERN_DEBUG "ppp_read: no data\n"));
1193 clear_bit(0, &ppp->us_rbuff_lock);
1194 if (ppp->inp_sig) {
1195 PRINTKN (4,(KERN_DEBUG "ppp_read: EWOULDBLOCK\n"));
1196 return -EWOULDBLOCK;
1197 } else goto wait;
1200 /* reset the time of the last read operation */
1201 ppp->ddinfo.nip_rjiffies = jiffies;
1203 GETC (c); len = c << 8; GETC (c); len += c;
1205 PRINTKN (4,(KERN_DEBUG "ppp_read: len = %d\n", len));
1207 if (len + 2 > nr) {
1208 /* frame too big; can't copy it, but do update us_rbuff_head */
1209 PRINTKN (1,(KERN_DEBUG
1210 "ppp: read of %u bytes too small for %d frame\n",
1211 nr, len+2));
1212 ppp->us_rbuff_head += len;
1213 if (ppp->us_rbuff_head > ppp->us_rbuff_end)
1214 ppp->us_rbuff_head += - (ppp->us_rbuff_end - ppp->us_rbuff);
1215 clear_bit(0, &ppp->us_rbuff_lock);
1216 wake_up_interruptible (&ppp->read_wait);
1217 ppp->stats.rgiants++;
1218 return -EOVERFLOW; /* ZZZ; HACK! */
1219 } else {
1220 /* have the space: copy the packet, faking the first two bytes */
1221 put_fs_byte (PPP_ADDRESS, buf++);
1222 put_fs_byte (PPP_CONTROL, buf++);
1223 i = len;
1224 while (i-- > 0) {
1225 GETC (c);
1226 put_fs_byte (c, buf++);
1230 clear_bit(0, &ppp->us_rbuff_lock);
1231 PRINTKN (3,(KERN_DEBUG "ppp_read: passing %d bytes up\n", len + 2));
1232 ppp->stats.rothers++;
1233 return len + 2;
1236 /* need to wait */
1237 wait:
1238 current->timeout = 0;
1239 PRINTKN (3,(KERN_DEBUG "ppp_read: sleeping\n"));
1240 interruptible_sleep_on (&ppp->read_wait);
1241 if (current->signal & ~current->blocked)
1242 return -EINTR;
1243 } while (1);
1246 /* stuff a character into the transmit buffer, using PPP's way of escaping
1247 special characters.
1248 also, update ppp->fcs to take account of new character */
1249 static inline void
1250 ppp_stuff_char(struct ppp *ppp, unsigned char c)
1252 int curpt = ppp->xhead - ppp->xbuff;
1253 if ((curpt < 0) || (curpt > 3000)) {
1254 PRINTK ((KERN_DEBUG "ppp_stuff_char: %x %x %d\n",
1255 (unsigned int) ppp->xbuff, (unsigned int) ppp->xhead, curpt))
1257 if (in_xmap (ppp, c)) {
1258 *ppp->xhead++ = PPP_ESC;
1259 *ppp->xhead++ = c ^ PPP_TRANS;
1260 } else
1261 *ppp->xhead++ = c;
1262 ppp->fcs = (ppp->fcs >> 8) ^ fcstab[(ppp->fcs ^ c) & 0xff];
1265 /* write a frame with NR chars from BUF to TTY
1266 we have to put the FCS field on ourselves
1269 static int
1270 ppp_write(struct tty_struct *tty, struct file *file, unsigned char *buf, unsigned int nr)
1272 struct ppp *ppp = ppp_find(tty);
1273 int i;
1275 if (!ppp || ppp->magic != PPP_MAGIC) {
1276 PRINTKN (1,(KERN_ERR "ppp_write: cannot find ppp unit\n"));
1277 return -EIO;
1280 CHECK_PPP(-ENXIO);
1282 if (ppp->mtu != ppp->dev->mtu) /* Someone has been ifconfigging */
1283 ppp_changedmtu (ppp, ppp->dev->mtu, ppp->mru);
1285 if (nr > ppp->mtu) {
1286 PRINTKN (1,(KERN_WARNING
1287 "ppp_write: truncating user packet from %u to mtu %d\n",
1288 nr, ppp->mtu));
1289 nr = ppp->mtu;
1292 if (ppp_debug >= 3)
1293 ppp_print_buffer ("write frame", buf, nr, USER_DS);
1295 /* lock this PPP unit so we will be the only writer;
1296 sleep if necessary */
1297 while ((ppp->sending == 1) || !ppp_lock(ppp)) {
1298 current->timeout = 0;
1299 PRINTKN (3,(KERN_DEBUG "ppp_write: sleeping\n"));
1300 interruptible_sleep_on(&ppp->write_wait);
1301 if (current->signal & ~current->blocked)
1302 return -EINTR;
1305 /* OK, locked. Stuff the given bytes into the buffer. */
1307 PRINTKN(4,(KERN_DEBUG "ppp_write: acquired write lock\n"));
1308 ppp->xhead = ppp->xbuff;
1310 #ifdef OPTIMIZE_FLAG_TIME
1311 if (jiffies - ppp->last_xmit > OPTIMIZE_FLAG_TIME)
1312 *ppp->xhead++ = PPP_FLAG;
1313 ppp->last_xmit = jiffies;
1314 #else
1315 *ppp->xhead++ = PPP_FLAG;
1316 #endif
1318 ppp->fcs = PPP_FCS_INIT;
1319 i = nr;
1320 while (i-- > 0)
1321 ppp_stuff_char(ppp,get_fs_byte(buf++));
1323 ppp_add_fcs(ppp); /* concatenate FCS at end */
1325 *ppp->xhead++ = PPP_FLAG;
1327 /* reset the time of the last write operation */
1328 ppp->ddinfo.nip_sjiffies = jiffies;
1330 if (ppp_debug >= 6)
1331 ppp_print_buffer ("xmit buffer", ppp->xbuff, ppp->xhead - ppp->xbuff, KERNEL_DS);
1332 else {
1333 PRINTKN (4,(KERN_DEBUG
1334 "ppp_write: writing %d chars\n", ppp->xhead - ppp->xbuff));
1337 /* packet is ready-to-go */
1338 ++ppp->stats.sothers;
1339 ppp_kick_tty(ppp);
1341 return((int)nr);
1344 static int
1345 ppp_ioctl(struct tty_struct *tty, struct file *file, unsigned int i,
1346 unsigned long l)
1348 struct ppp *ppp = ppp_find(tty);
1349 register int temp_i = 0;
1350 int error;
1352 if (!ppp || ppp->magic != PPP_MAGIC) {
1353 PRINTK ((KERN_ERR "ppp_ioctl: can't find PPP block from tty!\n"))
1354 return -EBADF;
1357 CHECK_PPP(-ENXIO);
1359 /* This must be root user */
1360 if (!suser())
1361 return -EPERM;
1363 switch (i) {
1364 case PPPIOCSMRU:
1365 error = verify_area (VERIFY_READ, (void *) l, sizeof (temp_i));
1366 if (error == 0) {
1367 PRINTKN (3,(KERN_INFO "ppp_ioctl: set mru to %x\n", temp_i));
1368 temp_i = (int) get_fs_long (l);
1369 if (ppp->mru != temp_i)
1370 ppp_changedmtu (ppp, ppp->mtu, temp_i);
1372 break;
1374 case PPPIOCGFLAGS:
1375 error = verify_area (VERIFY_WRITE, (void *) l, sizeof (temp_i));
1376 if (error == 0) {
1377 temp_i = (ppp->flags & SC_MASK);
1378 #ifndef CHECK_CHARACTERS /* Don't generate errors if we don't check chars. */
1379 temp_i |= SC_RCV_B7_1 | SC_RCV_B7_0 | SC_RCV_ODDP | SC_RCV_EVNP;
1380 #endif
1381 put_fs_long ((long) temp_i, l);
1382 PRINTKN (3,(KERN_DEBUG "ppp_ioctl: get flags: addr %lx flags %x\n",
1384 temp_i));
1386 break;
1388 case PPPIOCSFLAGS:
1389 error = verify_area (VERIFY_READ, (void *) l, sizeof (temp_i));
1390 if (error == 0) {
1391 temp_i = (int) get_fs_long (l);
1392 ppp->flags ^= ((ppp->flags ^ temp_i) & SC_MASK);
1393 PRINTKN (3,(KERN_INFO "ppp_ioctl: set flags to %x\n", temp_i));
1395 break;
1397 case PPPIOCGASYNCMAP:
1398 error = verify_area (VERIFY_WRITE, (void *) l, sizeof (temp_i));
1399 if (error == 0) {
1400 put_fs_long (ppp->xmit_async_map[0], l);
1401 PRINTKN (3,(KERN_INFO "ppp_ioctl: get asyncmap: addr %lx asyncmap %lx\n",
1402 l, ppp->xmit_async_map[0]));
1404 break;
1406 case PPPIOCSASYNCMAP:
1407 error = verify_area (VERIFY_READ, (void *) l, sizeof (temp_i));
1408 if (error == 0) {
1409 memset (ppp->xmit_async_map, 0, sizeof (ppp->xmit_async_map));
1410 ppp->xmit_async_map[0] = get_fs_long (l);
1411 bset (ppp->xmit_async_map, PPP_FLAG);
1412 bset (ppp->xmit_async_map, PPP_ESC);
1413 PRINTKN (3,(KERN_INFO "ppp_ioctl: set xmit asyncmap %lx\n",
1414 ppp->xmit_async_map[0]));
1416 break;
1418 case PPPIOCRASYNCMAP:
1419 error = verify_area (VERIFY_READ, (void *) l, sizeof (temp_i));
1420 if (error == 0) {
1421 ppp->recv_async_map = get_fs_long (l);
1422 PRINTKN (3,(KERN_INFO "ppp_ioctl: set recv asyncmap %lx\n",
1423 ppp->recv_async_map));
1425 break;
1427 case PPPIOCGUNIT:
1428 error = verify_area (VERIFY_WRITE, (void *) l, sizeof (temp_i));
1429 if (error == 0) {
1430 put_fs_long (ppp->dev->base_addr, l);
1431 PRINTKN (3,(KERN_INFO "ppp_ioctl: get unit: %d", ppp->dev->base_addr));
1433 break;
1435 case PPPIOCSINPSIG:
1436 error = verify_area (VERIFY_READ, (void *) l, sizeof (temp_i));
1437 if (error == 0) {
1438 ppp->inp_sig = (int) get_fs_long (l);
1439 ppp->inp_sig_pid = current->pid;
1440 PRINTKN (3,(KERN_INFO "ppp_ioctl: set input signal %d\n", ppp->inp_sig));
1442 break;
1444 case PPPIOCSDEBUG:
1445 error = verify_area (VERIFY_READ, (void *) l, sizeof (temp_i));
1446 if (error == 0) {
1447 ppp_debug = (int) get_fs_long (l);
1448 ppp_debug_netpackets = (ppp_debug & 0xff00) >> 8;
1449 ppp_debug &= 0xff;
1450 PRINTKN (1, (KERN_INFO "ppp_ioctl: set debug level %d, netpacket %d\n",
1451 ppp_debug, ppp_debug_netpackets));
1453 break;
1455 case PPPIOCGDEBUG:
1456 error = verify_area (VERIFY_WRITE, (void *) l, sizeof (temp_i));
1457 if (error == 0) {
1458 put_fs_long ((long) (ppp_debug | (ppp_debug_netpackets << 8)), l);
1459 PRINTKN (3,(KERN_INFO "ppp_ioctl: get debug level %d\n",
1460 ppp_debug | (ppp_debug_netpackets << 8)));
1462 break;
1464 case PPPIOCGSTAT:
1465 error = verify_area (VERIFY_WRITE, (void *) l, sizeof (struct ppp_stats));
1466 if (error == 0) {
1467 memcpy_tofs ((void *) l, &ppp->stats, sizeof (struct ppp_stats));
1468 PRINTKN (3,(KERN_INFO "ppp_ioctl: read statistics\n"));
1470 break;
1472 case PPPIOCGTIME:
1473 error = verify_area (VERIFY_WRITE, (void *) l, sizeof (struct ppp_ddinfo));
1474 if (error == 0) {
1475 struct ppp_ddinfo cur_ddinfo;
1476 unsigned long cur_jiffies = jiffies;
1478 /* change absolute times to relative times. */
1479 cur_ddinfo.ip_sjiffies = cur_jiffies - ppp->ddinfo.ip_sjiffies;
1480 cur_ddinfo.ip_rjiffies = cur_jiffies - ppp->ddinfo.ip_rjiffies;
1481 cur_ddinfo.nip_sjiffies = cur_jiffies - ppp->ddinfo.nip_sjiffies;
1482 cur_ddinfo.nip_rjiffies = cur_jiffies - ppp->ddinfo.nip_rjiffies;
1484 memcpy_tofs ((void *) l, &cur_ddinfo, sizeof (struct ppp_ddinfo));
1485 PRINTKN (3,(KERN_INFO "ppp_ioctl: read demand dial info\n"));
1487 break;
1489 case PPPIOCGXASYNCMAP:
1490 error = verify_area (VERIFY_WRITE,
1491 (void *) l,
1492 sizeof (ppp->xmit_async_map));
1493 if (error == 0) {
1494 memcpy_tofs ((void *) l,
1495 ppp->xmit_async_map,
1496 sizeof (ppp->xmit_async_map));
1497 PRINTKN (3,(KERN_INFO "ppp_ioctl: get xasyncmap: addr %lx\n", l));
1499 break;
1501 case PPPIOCSXASYNCMAP:
1502 error = verify_area (VERIFY_READ, (void *) l,
1503 sizeof (ppp->xmit_async_map));
1504 if (error == 0) {
1505 unsigned long temp_tbl [8];
1507 memcpy_fromfs (temp_tbl, (void *) l, sizeof (ppp->xmit_async_map));
1508 temp_tbl[1] = 0x00000000; /* must not escape 0x20 - 0x3f */
1509 temp_tbl[2] &= ~0x40000000; /* must not escape 0x5e */
1510 temp_tbl[3] |= 0x60000000; /* must escape 0x7d and 0x7e */
1512 if ((temp_tbl[2] & temp_tbl[3]) != 0 ||
1513 (temp_tbl[4] & temp_tbl[5]) != 0 ||
1514 (temp_tbl[6] & temp_tbl[7]) != 0)
1515 error = -EINVAL;
1516 else {
1517 memcpy (ppp->xmit_async_map, temp_tbl, sizeof (ppp->xmit_async_map));
1518 PRINTKN (3,(KERN_INFO "ppp_ioctl: set xasyncmap\n"));
1521 break;
1523 case PPPIOCSMAXCID:
1524 error = verify_area (VERIFY_READ, (void *) l, sizeof (temp_i));
1525 if (error == 0) {
1526 temp_i = (int) get_fs_long (l) + 1;
1527 PRINTKN (3,(KERN_INFO "ppp_ioctl: set maxcid to %d\n", temp_i));
1528 if (ppp->slcomp != NULL)
1529 slhc_free (ppp->slcomp);
1531 ppp->slcomp = slhc_init (temp_i, temp_i);
1533 if (ppp->slcomp == NULL) {
1534 PRINTKN (1,(KERN_ERR "ppp: no space for compression buffers!\n"));
1535 ppp_release (ppp);
1536 error = -ENOMEM;
1539 break;
1541 #ifdef NEW_TTY_DRIVERS
1542 /* Allow stty to read, but not set, the serial port */
1543 case TCGETS:
1544 case TCGETA:
1545 error = n_tty_ioctl(tty, file, i, l);
1546 break;
1547 #endif
1550 * All other ioctl() events will come here.
1553 default:
1554 PRINTKN (1,(KERN_ERR "ppp_ioctl: invalid ioctl: %x, addr %lx\n",
1556 l));
1557 #ifdef NEW_TTY_DRIVERS
1558 error = -ENOIOCTLCMD;
1559 #else
1560 error = -EINVAL;
1561 #endif
1562 break;
1564 return error;
1567 static int
1568 ppp_select (struct tty_struct *tty, struct inode * inode,
1569 struct file * filp, int sel_type, select_table * wait)
1571 struct ppp *ppp = ppp_find (tty);
1573 if (!ppp || ppp->magic != PPP_MAGIC) {
1574 PRINTK ((KERN_ERR "ppp_select: can't find PPP block from tty!\n"))
1575 return -EBADF;
1578 /* If the PPP protocol is no longer active, return false */
1579 CHECK_PPP (0);
1581 /* Process the request based upon the type desired */
1582 switch (sel_type) {
1583 case SEL_IN:
1584 if (set_bit(0, &ppp->us_rbuff_lock) == 0) {
1585 /* Test for the presence of data in the queue */
1586 if (ppp->us_rbuff_head != ppp->us_rbuff_tail) {
1587 clear_bit (0, &ppp->us_rbuff_lock);
1588 return 1;
1590 clear_bit (0, &ppp->us_rbuff_lock);
1591 } /* fall through */
1593 case SEL_EX:
1594 /* Is there a pending error condition? */
1595 if (tty->packet && tty->link->ctrl_status)
1596 return 1;
1598 /* closed? */
1599 if (tty->flags & (1 << TTY_SLAVE_CLOSED))
1600 return 1;
1602 /* If the tty is disconnected, then this is an exception too */
1603 if (tty_hung_up_p(filp))
1604 return 1;
1606 select_wait (&ppp->read_wait, wait);
1607 break;
1609 case SEL_OUT:
1610 if (ppp_lock (ppp)) {
1611 if (ppp->sending == 0) {
1612 ppp_unlock (ppp);
1613 return 1;
1615 ppp_unlock (ppp);
1617 select_wait (&ppp->write_wait, wait);
1618 break;
1620 return 0;
1623 /*************************************************************
1624 * NETWORK OUTPUT
1625 * This routine accepts requests from the network layer
1626 * and attempts to deliver the packets.
1627 * It also includes various routines we are compelled to
1628 * have to make the network layer work (arp, etc...).
1629 *************************************************************/
1632 ppp_xmit(struct sk_buff *skb, struct device *dev)
1634 struct tty_struct *tty;
1635 struct ppp *ppp;
1636 unsigned char *p;
1637 unsigned short proto;
1638 int len;
1640 /* just a little sanity check. */
1641 if (skb == NULL) {
1642 PRINTKN(3,(KERN_WARNING "ppp_xmit: null packet!\n"));
1643 return 0;
1646 /* Get pointers to the various components */
1647 ppp = &ppp_ctrl[dev->base_addr];
1648 tty = ppp->tty;
1649 p = (unsigned char *) (skb + 1);
1650 len = skb->len;
1651 proto = PROTO_IP;
1653 PRINTKN(4,(KERN_DEBUG "ppp_xmit [%s]: skb %lX busy %d\n", dev->name,
1654 (unsigned long int) skb, ppp->sending));
1656 CHECK_PPP(0);
1658 if (tty == NULL) {
1659 PRINTKN(1,(KERN_ERR "ppp_xmit: %s not connected to a TTY!\n", dev->name));
1660 goto done;
1663 if (!(dev->flags & IFF_UP)) {
1664 PRINTKN(1,(KERN_WARNING
1665 "ppp_xmit: packet sent on interface %s, which is down for IP\n",
1666 dev->name));
1667 goto done;
1670 /* get length from IP header as per Alan Cox bugfix for slip.c */
1671 if (len < sizeof(struct iphdr)) {
1672 PRINTKN(0,(KERN_ERR "ppp_xmit: given runt packet, ignoring\n"));
1673 return 1;
1675 len = ntohs( ((struct iphdr *)(skb->data)) -> tot_len );
1677 /* If doing demand dial then divert the first frame to pppd. */
1678 if (ppp->flags & SC_IP_DOWN) {
1679 if (ppp->flags & SC_IP_FLUSH == 0) {
1680 if (ppp_us_queue (ppp, proto, p, len))
1681 ppp->flags |= SC_IP_FLUSH;
1683 goto done;
1686 /* Attempt to acquire send lock */
1687 if (ppp->sending || !ppp_lock(ppp)) {
1688 PRINTKN(3,(KERN_WARNING "ppp_xmit: busy\n"));
1689 ppp->stats.sbusy++;
1690 return 1;
1693 ppp->xhead = ppp->xbuff;
1695 /* try to compress, if VJ compression mode is on */
1696 if (ppp->flags & SC_COMP_TCP) {
1697 /* NOTE: last 0 argument says never to compress connection ID */
1698 len = slhc_compress(ppp->slcomp, p, len, ppp->cbuff, &p, 0);
1699 if (p[0] & SL_TYPE_COMPRESSED_TCP)
1700 proto = PROTO_VJCOMP;
1701 else {
1702 if (p[0] >= SL_TYPE_UNCOMPRESSED_TCP) {
1703 proto = PROTO_VJUNCOMP;
1704 p[0] = (p[0] & 0x0f) | 0x40;
1709 /* increment appropriate counter */
1710 if (proto == PROTO_VJCOMP)
1711 ++ppp->stats.scomp;
1712 else
1713 ++ppp->stats.suncomp;
1715 if (ppp_debug_netpackets) {
1716 struct iphdr *iph = (struct iphdr *) (skb + 1);
1717 PRINTK ((KERN_DEBUG "%s ==> proto %x len %d src %x dst %x proto %d\n",
1718 dev->name, (int) proto, (int) len, (int) iph->saddr,
1719 (int) iph->daddr, (int) iph->protocol))
1722 /* start of frame: FLAG ALL_STATIONS CONTROL <protohi> <protolo> */
1723 #ifdef OPTIMIZE_FLAG_TIME
1724 if (jiffies - ppp->last_xmit > OPTIMIZE_FLAG_TIME)
1725 *ppp->xhead++ = PPP_FLAG;
1726 ppp->last_xmit = jiffies;
1727 #else
1728 *ppp->xhead++ = PPP_FLAG;
1729 #endif
1731 ppp->fcs = PPP_FCS_INIT;
1732 if (!(ppp->flags & SC_COMP_AC)) {
1733 ppp_stuff_char(ppp, PPP_ADDRESS);
1734 ppp_stuff_char(ppp, PPP_CONTROL);
1737 if (!(ppp->flags & SC_COMP_PROT) || (proto & 0xff00))
1738 ppp_stuff_char(ppp, proto>>8);
1739 ppp_stuff_char(ppp, proto&0xff);
1741 /* data part */
1742 while (len-- > 0)
1743 ppp_stuff_char(ppp, *p++);
1745 /* fcs and flag */
1746 ppp_add_fcs(ppp);
1747 *ppp->xhead++ = PPP_FLAG;
1749 /* update the time for demand dial function */
1750 ppp->ddinfo.ip_sjiffies = jiffies;
1752 /* send it! */
1753 if (ppp_debug >= 6)
1754 ppp_print_buffer ("xmit buffer", ppp->xbuff, ppp->xhead - ppp->xbuff, KERNEL_DS);
1755 else {
1756 PRINTKN (4,(KERN_DEBUG
1757 "ppp_write: writing %d chars\n", ppp->xhead - ppp->xbuff));
1760 ppp_kick_tty(ppp);
1762 done:
1763 if (skb->free)
1764 kfree_skb(skb, FREE_WRITE);
1765 return 0;
1768 static unsigned short
1769 ppp_type_trans (struct sk_buff *skb, struct device *dev)
1771 return(htons(ETH_P_IP));
1774 #ifdef NET02D
1775 static int
1776 ppp_header(unsigned char *buff, struct device *dev, unsigned short type,
1777 unsigned long daddr, unsigned long saddr, unsigned len)
1779 return(0);
1782 static int
1783 ppp_rebuild_header(void *buff, struct device *dev)
1785 return(0);
1788 static void
1789 ppp_add_arp(unsigned long addr, struct sk_buff *skb, struct device *dev)
1793 #else
1795 static int
1796 ppp_header(unsigned char *buff, struct device *dev, unsigned short type,
1797 void *daddr, void *saddr, unsigned len, struct sk_buff *skb)
1799 return(0);
1802 static int
1803 ppp_rebuild_header(void *buff, struct device *dev, unsigned long raddr,
1804 struct sk_buff *skb)
1806 return(0);
1808 #endif
1810 static struct enet_statistics *
1811 ppp_get_stats (struct device *dev)
1813 struct ppp *ppp = &ppp_ctrl[dev->base_addr];
1814 static struct enet_statistics ppp_stats;
1816 ppp_stats.rx_packets = ppp->stats.rcomp + ppp->stats.runcomp;
1817 ppp_stats.rx_errors = ppp->stats.rerrors;
1818 ppp_stats.rx_dropped = ppp->stats.tossed;
1819 ppp_stats.rx_fifo_errors = 0;
1820 ppp_stats.rx_length_errors = ppp->stats.runts;
1821 ppp_stats.rx_over_errors = ppp->stats.roverrun;
1822 ppp_stats.rx_crc_errors = 0;
1823 ppp_stats.rx_frame_errors = 0;
1824 ppp_stats.tx_packets = ppp->stats.scomp + ppp->stats.suncomp;
1825 ppp_stats.tx_errors = ppp->stats.serrors;
1826 ppp_stats.tx_dropped = 0;
1827 ppp_stats.tx_fifo_errors = 0;
1828 ppp_stats.collisions = ppp->stats.sbusy;
1829 ppp_stats.tx_carrier_errors = 0;
1830 ppp_stats.tx_aborted_errors = 0;
1831 ppp_stats.tx_window_errors = 0;
1832 ppp_stats.tx_heartbeat_errors = 0;
1834 PRINTKN (3, (KERN_INFO "ppp_get_stats called"));
1835 return &ppp_stats;
1838 /*************************************************************
1839 * UTILITIES
1840 * Miscellany called by various functions above.
1841 *************************************************************/
1843 #ifndef NEW_TTY_DRIVERS
1844 /* find a PPP channel given a TTY */
1845 struct ppp *
1846 ppp_find(struct tty_struct *tty)
1848 int i;
1849 for (i = 0; i < PPP_NRUNIT; i++)
1850 if (ppp_ctrl[i].inuse && (ppp_ctrl[i].tty == tty)) return &ppp_ctrl[i];
1852 return NULL;
1854 #endif
1856 /* allocate a PPP channel */
1857 static struct ppp *
1858 ppp_alloc(void)
1860 int i;
1861 for (i = 0; i < PPP_NRUNIT; i++)
1862 if (!set_bit(0, &ppp_ctrl[i].inuse)) return &ppp_ctrl[i];
1864 return NULL;
1867 /* marks a PPP interface 'busy'. user processes will wait, if
1868 they try to write, and the network code will refrain from sending
1869 return nonzero if succeeded in acquiring lock
1872 static int
1873 ppp_lock(struct ppp *ppp)
1875 int flags, locked;
1876 save_flags(flags);
1877 cli();
1878 locked = ppp->sending;
1879 ppp->sending = 1;
1880 if (ppp->dev->flags & IFF_UP)
1881 ppp->dev->tbusy = 1;
1882 restore_flags(flags);
1883 return locked == 0;
1886 static void
1887 ppp_unlock(struct ppp *ppp)
1889 int flags;
1890 save_flags(flags);
1891 cli();
1892 ppp->sending = 0;
1893 if (ppp->dev->flags & IFF_UP)
1894 ppp->dev->tbusy = 0;
1895 restore_flags(flags);
1898 /* FCS support functions */
1900 static void
1901 ppp_add_fcs(struct ppp *ppp)
1903 unsigned short fcs = ppp->fcs;
1905 fcs ^= 0xffff;
1906 ppp_stuff_char(ppp, fcs & 0x00ff);
1907 ppp_stuff_char(ppp, (fcs & 0xff00) >> 8);
1908 ASSERT (ppp->fcs == PPP_FCS_GOOD);
1909 PRINTKN (4,(KERN_DEBUG "ppp_add_fcs: fcs is %lx\n",
1910 (long) (unsigned long) fcs));
1913 static int
1914 ppp_check_fcs(struct ppp *ppp)
1916 unsigned short fcs = PPP_FCS_INIT, msgfcs;
1917 unsigned char *c = ppp->rbuff;
1918 int i;
1920 for (i = 0; i < ppp->rcount - 2; i++, c++)
1921 fcs = (fcs >> 8) ^ fcstab[(fcs ^ *c) & 0xff];
1923 fcs ^= 0xffff;
1924 msgfcs = (c[1] << 8) + c[0];
1925 PRINTKN (4,(KERN_INFO "ppp_check_fcs: got %lx want %lx\n",
1926 (unsigned long) msgfcs, (unsigned long) fcs));
1927 return fcs == msgfcs;
1930 static char hex[] = "0123456789ABCDEF";
1932 inline void ppp_print_hex (register char *out, char *in, int count);
1933 inline void ppp_print_hex (register char *out, char *in, int count)
1935 register unsigned char next_ch;
1937 while (count-- > 0) {
1938 next_ch = (unsigned char) get_fs_byte (in);
1940 *out++ = hex[(next_ch >> 4) & 0x0F];
1941 *out++ = hex[next_ch & 0x0F];
1942 ++out;
1943 ++in;
1947 inline void ppp_print_char (register char *out, char *in, int count);
1948 inline void ppp_print_char (register char *out, char *in, int count)
1950 register unsigned char next_ch;
1952 while (count-- > 0) {
1953 next_ch = (unsigned char) get_fs_byte (in);
1955 if (next_ch < 0x20 || next_ch > 0x7e)
1956 *out++ = '.';
1957 else {
1958 *out++ = next_ch;
1959 if (next_ch == '%') /* printk/syslogd has a bug !! */
1960 *out++ = '%';
1962 ++in;
1964 *out = '\0';
1967 static void ppp_print_buffer(const char *name, char *buf, int count, int seg)
1969 char line [44];
1970 int old_fs = get_fs();
1972 set_fs (seg);
1974 if (name != (char *) NULL)
1975 PRINTK ((KERN_DEBUG "ppp: %s, count = %d\n", name, count));
1977 while (count > 8) {
1978 memset (line, ' ', sizeof (line));
1979 ppp_print_hex (line, buf, 8);
1980 ppp_print_char (&line[8 * 3], buf, 8);
1981 PRINTK ((KERN_DEBUG "%s\n", line));
1982 count -= 8;
1983 buf += 8;
1986 if (count > 0) {
1987 memset (line, ' ', sizeof (line));
1988 ppp_print_hex (line, buf, count);
1989 ppp_print_char (&line[8 * 3], buf, count);
1990 PRINTK ((KERN_DEBUG "%s\n", line));
1993 set_fs (old_fs);