4 $Id: ppp.c,v 1.2 1994/05/30 02:42:55 paulus Exp $
12 RFC1331: The Point-to-Point Protocol (PPP) for the Transmission of
13 Multi-protocol Datagrams over Point-to-Point Links
19 Flags for this module (any combination is acceptable for testing.):
21 NET02D - Define if using Net-2-Debugged in kernels earler
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
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>
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 */
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>
64 #include <linux/ppp.h>
71 #include <linux/if_arp.h>
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)))
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)
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
*);
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
*);
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
,
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,
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 *,
138 static int ppp_write(struct tty_struct
*, struct file
*, unsigned char *,
140 static int ppp_ioctl(struct tty_struct
*, struct file
*, unsigned int,
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
);
152 static void ppp_tty_input_ready(struct tty_struct
*);
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 /*************************************************************
198 *************************************************************/
200 static int first_time
= 1;
202 /* called at boot time for each ppp device */
205 ppp_init(struct device
*dev
)
210 ppp
= &ppp_ctrl
[dev
->base_addr
];
215 printk (KERN_INFO
"PPP: version %s (%d channels)"
219 #ifdef NEW_TTY_DRIVERS
222 #ifdef OPTIMIZE_FLAG_TIME
225 "\n", PPP_VERSION
, PPP_NRUNIT
);
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
;
244 ppp_ldisc
.handler
= ppp_tty_input_ready
;
247 if ((i
= tty_register_ldisc(N_PPP
, &ppp_ldisc
)) == 0)
248 printk(KERN_INFO
"PPP line discipline registered.\n");
250 printk(KERN_ERR
"error registering line discipline: %d\n", i
);
253 /* initialize PPP control block */
254 ppp_init_ctrl_blk (ppp
);
256 ppp
->line
= dev
->base_addr
;
260 /* clear statistics */
261 memset (&ppp
->stats
, '\0', sizeof (struct ppp_stats
));
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;
274 dev
->type
= ARPHRD_PPP
;
277 dev
->add_arp
= ppp_add_arp
;
278 dev
->queue_xmit
= dev_queue_xmit
;
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
;
290 dev
->pa_alen
= sizeof(unsigned long);
296 ppp_init_ctrl_blk(struct ppp
*ppp
)
298 ppp
->magic
= PPP_MAGIC
;
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;
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;
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
;
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.
357 ppp_changedmtu (struct ppp
*ppp
, int new_mtu
, int new_mru
)
360 unsigned char *new_rbuff
, *new_xbuff
, *new_cbuff
;
361 unsigned char *old_rbuff
, *old_xbuff
, *old_cbuff
;
364 * Allocate the buffer from the kernel for the data
370 /* RFC 1331, section 7.2 says the minimum value is 1500 bytes */
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
)
395 if (new_xbuff
!= NULL
)
398 if (new_cbuff
!= NULL
)
402 * Update the pointers to the new buffer structures.
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
438 * Release old buffer pointers
440 if (old_rbuff
!= NULL
)
443 if (old_xbuff
!= NULL
)
446 if (old_cbuff
!= NULL
)
451 /* called when we abandon the PPP line discipline */
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 */
462 ppp
->dev
->flags
&= ~IFF_UP
; /* down the device */
463 ppp
->dev
->flags
|= IFF_POINTOPOINT
;
469 kfree (ppp
->us_rbuff
);
474 ppp
->us_rbuff
= NULL
;
477 slhc_free(ppp
->slcomp
);
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"));
496 PRINTKN (2,(KERN_INFO
"ppp: channel %s closing.\n", ppp
->dev
->name
));
500 /* called when PPP line discipline is selected on a tty */
502 ppp_open(struct tty_struct
*tty
)
504 struct ppp
*ppp
= ppp_find(tty
);
507 PRINTKN (1,(KERN_ERR
"ppp_open: gack! tty already associated to %s!\n",
508 ppp
->magic
== PPP_MAGIC
? ppp
->dev
->name
: "unknown"));
514 PRINTKN (1,(KERN_ERR
"ppp_open: couldn't allocate ppp channel\n"));
518 /* make sure the channel is actually open */
519 ppp_init_ctrl_blk (ppp
);
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
);
530 tty_read_flush (tty
);
531 tty_write_flush (tty
);
534 if ((ppp
->slcomp
= slhc_init(16, 16)) == NULL
) {
535 PRINTKN (1,(KERN_ERR
"ppp: no space for compression buffers!\n"));
540 /* Define the buffers for operation */
541 ppp_changedmtu (ppp
, ppp
->dev
->mtu
, ppp
->mru
);
542 if (ppp
->rbuff
== NULL
) {
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"));
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
));
564 /* called when ppp interface goes "up". here this just means we start
565 passing IP packets */
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",
580 PRINTKN (2,(KERN_INFO
"ppp: channel %s going up for IP packets!\n",
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",
598 PRINTKN (2,(KERN_INFO
"ppp: channel %s going down for IP packets!\n",
604 /*************************************************************
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
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
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
631 ppp_kick_tty (struct ppp
*ppp
)
633 register int count
= ppp
->xhead
- ppp
->xbuff
;
636 ppp
->stats
.sbytes
+= count
;
638 answer
= tty_write_data (ppp
->tty
,
645 ppp_output_done (ppp
); /* Should not happen */
648 ppp
->stats
.serrors
++;
649 ppp_output_done (ppp
); /* unlock the transmitter */
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
);
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
) {
679 (KERN_ERR
"PPP: write_wakeup called but couldn't "
680 "find PPP struct.\n"));
684 if (!ppp
->xtail
|| (ppp
->flags
& SC_XMIT_BUSY
))
688 if (ppp
->flags
& SC_XMIT_BUSY
)
690 ppp
->flags
|= SC_XMIT_BUSY
;
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
) {
699 tty
->flags
&= ~TTY_DO_WRITE_WAKEUP
;
701 ppp_output_done(ppp
);
703 ppp
->xtail
+= actual
;
705 ppp
->flags
&= ~SC_XMIT_BUSY
;
709 /*************************************************************
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 */
720 ppp_enqueue(struct ppp
*ppp
, unsigned char c
)
726 if (ppp
->rhead
< ppp
->rend
) {
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
742 #ifndef NEW_TTY_DRIVERS
744 ppp_dump_inqueue(struct tty_struct
*tty
)
746 int head
= tty
->read_q
.head
,
747 tail
= tty
->read_q
.tail
,
751 PRINTK ((KERN_DEBUG
"INQUEUE: head %d tail %d imode %x:\n", head
, tail
,
752 (unsigned int) tty
->termios
->c_iflag
))
758 buffer
[count
] = tty
->read_q
.buf
[i
];
760 ppp_print_buffer (NULL
, buffer
, 8, KERNEL_DS
);
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
);
775 unsigned char buff
[128];
777 /* PRINTK( (KERN_DEBUG "PPP: handler called.\n") ) */
778 if (!ppp
|| ppp
->magic
!= PPP_MAGIC
) {
780 (KERN_ERR
"PPP: handler called but couldn't find PPP struct.\n"));
788 ppp_dump_inqueue(ppp
->tty
);
791 n
= tty_read_raw_data(tty
, buff
, 128);
792 if ( n
== 0 ) /* nothing there */
796 ppp_print_buffer ("receive buffer", buff
, n
> 0 ? n
: -n
, KERNEL_DS
);
799 /* Last character is error flag.
800 Process the previous characters, then set toss flag. */
804 ppp
->stats
.rbytes
+= n
;
805 ppp_unesc(ppp
,buff
,n
);
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
817 ppp_unesc(struct ppp
*ppp
, unsigned char *c
, int n
)
821 for (i
= 0; i
< n
; i
++, c
++) {
822 PRINTKN (6,(KERN_DEBUG
"(%x)", (unsigned int) *c
));
824 #ifdef CHECK_CHARACTERS
826 sc
->sc_flags
|= SC_RCV_B7_1
;
828 sc
->sc_flags
|= SC_RCV_B7_0
;
830 if (paritytab
[*c
>> 5] & (1 << (*c
& 0x1F)))
831 sc
->sc_flags
|= SC_RCV_ODDP
;
833 sc
->sc_flags
|= SC_RCV_EVNP
;
837 case PPP_ESC
: /* PPP_ESC: invert 0x20 in next character */
838 ppp
->escape
= PPP_TRANS
;
841 case PPP_FLAG
: /* PPP_FLAG: end of frame */
842 if (ppp
->escape
) /* PPP_ESC just before PPP_FLAG is illegal */
845 if ((ppp
->toss
& 0x80) == 0)
846 ppp_doframe(ppp
); /* pass frame on to next layers */
849 ppp
->rhead
= ppp
->rbuff
;
854 default: /* regular character */
855 if (!in_rmap (ppp
, *c
)) {
857 ppp_enqueue (ppp
, *c
^ ppp
->escape
);
866 static void ppp_receive_buf(struct tty_struct
*tty
, unsigned char *cp
,
869 register struct ppp
*ppp
= ppp_find (tty
);
872 /* PRINTK( ("PPP: handler called.\n") ); */
874 if (!ppp
|| ppp
->magic
!= PPP_MAGIC
) {
875 PRINTKN (1,("PPP: handler called but couldn't find "
882 if (ppp_debug
>= 5) {
883 ppp_print_buffer ("receive buffer", cp
, count
, KERNEL_DS
);
886 while (count
-- > 0) {
890 if (*fp
&& ppp
->toss
== 0)
895 #ifdef CHECK_CHARACTERS
897 sc
->sc_flags
|= SC_RCV_B7_1
;
899 sc
->sc_flags
|= SC_RCV_B7_0
;
901 if (paritytab
[c
>> 5] & (1 << (c
& 0x1F)))
902 sc
->sc_flags
|= SC_RCV_ODDP
;
904 sc
->sc_flags
|= SC_RCV_EVNP
;
908 case PPP_ESC
: /* PPP_ESC: invert 0x20 in next character */
909 ppp
->escape
= PPP_TRANS
;
912 case PPP_FLAG
: /* PPP_FLAG: end of frame */
913 if (ppp
->escape
) /* PPP_ESC just before PPP_FLAG is "cancel"*/
916 if ((ppp
->toss
& 0x80) == 0)
917 ppp_doframe(ppp
); /* pass frame on to next layers */
920 ppp
->rhead
= ppp
->rbuff
;
925 default: /* regular character */
926 if (!in_rmap (ppp
, c
)) {
928 ppp_enqueue (ppp
, c
^ ppp
->escape
);
936 /* on entry, a received frame is in ppp->rbuff
937 check it and dispose as appropriate */
939 ppp_doframe(struct ppp
*ppp
)
941 u_char
*c
= ppp
->rbuff
;
943 int count
= ppp
->rcount
;
945 /* forget it if we've already noticed an error */
947 PRINTKN (1, (KERN_WARNING
"ppp_toss: tossing frame, reason = %d\n",
949 ppp
->stats
.rerrors
++;
953 /* do this before printing buffer to avoid generating copious output */
958 ppp_print_buffer ("receive frame", c
, count
, KERNEL_DS
);
961 PRINTKN (1,(KERN_WARNING
"ppp: got runt ppp frame, %d chars\n", count
));
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
++;
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 */
982 proto
= (u_short
) *c
++; /* PROTO compressed */
986 proto
= (proto
<< 8) | (u_short
) *c
++; /* PROTO uncompressed */
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
;
996 /* If we got here, it has to go to a user process doing a read,
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
++;
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. */
1019 ppp_do_ip (struct ppp
*ppp
, unsigned short proto
, unsigned char *c
,
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
++;
1037 if ((proto
== PROTO_VJCOMP
) && !(ppp
->flags
& SC_REJ_COMP_TCP
)) {
1038 /* get space for uncompressing the header */
1042 if ((ppp
->rhead
+ 80) < ppp
->rend
) {
1047 restore_flags(flags
);
1050 PRINTKN (1,(KERN_NOTICE
1051 "ppp: no space to decompress VJ compressed TCP header.\n"));
1052 ppp
->stats
.roverrun
++;
1056 count
= slhc_uncompress(ppp
->slcomp
, c
, count
);
1058 ppp
->stats
.rerrors
++;
1059 PRINTKN (1,(KERN_NOTICE
"ppp: error in VJ decompression\n"));
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"));
1072 ppp
->stats
.runcomp
++;
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)
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) \
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;
1106 ppp_us_queue(struct ppp
*ppp
, unsigned short proto
,
1107 unsigned char *buf
, int len
)
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"));
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
);
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
);
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"));
1143 ppp
->inp_sig_pid
= 0;
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"));
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
1169 ppp_read(struct tty_struct
*tty
, struct file
*file
, unsigned char *buf
, unsigned int nr
)
1171 struct ppp
*ppp
= ppp_find(tty
);
1175 if (!ppp
|| ppp
->magic
!= PPP_MAGIC
) {
1176 PRINTKN (1,(KERN_ERR
"ppp_read: cannnot find ppp channel\n"));
1182 PRINTKN (4,(KERN_DEBUG
"ppp_read: called %x num %u\n",
1187 /* try to acquire read lock */
1188 if (set_bit(0, &ppp
->us_rbuff_lock
) == 0) {
1190 if (ppp
->us_rbuff_head
== ppp
->us_rbuff_tail
) {
1192 PRINTKN (4,(KERN_DEBUG
"ppp_read: no data\n"));
1193 clear_bit(0, &ppp
->us_rbuff_lock
);
1195 PRINTKN (4,(KERN_DEBUG
"ppp_read: EWOULDBLOCK\n"));
1196 return -EWOULDBLOCK
;
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
));
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",
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! */
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
++);
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
++;
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
)
1246 /* stuff a character into the transmit buffer, using PPP's way of escaping
1248 also, update ppp->fcs to take account of new character */
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
;
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
1270 ppp_write(struct tty_struct
*tty
, struct file
*file
, unsigned char *buf
, unsigned int nr
)
1272 struct ppp
*ppp
= ppp_find(tty
);
1275 if (!ppp
|| ppp
->magic
!= PPP_MAGIC
) {
1276 PRINTKN (1,(KERN_ERR
"ppp_write: cannot find ppp unit\n"));
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",
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
)
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
;
1315 *ppp
->xhead
++ = PPP_FLAG
;
1318 ppp
->fcs
= PPP_FCS_INIT
;
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
;
1331 ppp_print_buffer ("xmit buffer", ppp
->xbuff
, ppp
->xhead
- ppp
->xbuff
, KERNEL_DS
);
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
;
1345 ppp_ioctl(struct tty_struct
*tty
, struct file
*file
, unsigned int i
,
1348 struct ppp
*ppp
= ppp_find(tty
);
1349 register int temp_i
= 0;
1352 if (!ppp
|| ppp
->magic
!= PPP_MAGIC
) {
1353 PRINTK ((KERN_ERR
"ppp_ioctl: can't find PPP block from tty!\n"))
1359 /* This must be root user */
1365 error
= verify_area (VERIFY_READ
, (void *) l
, sizeof (temp_i
));
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
);
1375 error
= verify_area (VERIFY_WRITE
, (void *) l
, sizeof (temp_i
));
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
;
1381 put_fs_long ((long) temp_i
, l
);
1382 PRINTKN (3,(KERN_DEBUG
"ppp_ioctl: get flags: addr %lx flags %x\n",
1389 error
= verify_area (VERIFY_READ
, (void *) l
, sizeof (temp_i
));
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
));
1397 case PPPIOCGASYNCMAP
:
1398 error
= verify_area (VERIFY_WRITE
, (void *) l
, sizeof (temp_i
));
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]));
1406 case PPPIOCSASYNCMAP
:
1407 error
= verify_area (VERIFY_READ
, (void *) l
, sizeof (temp_i
));
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]));
1418 case PPPIOCRASYNCMAP
:
1419 error
= verify_area (VERIFY_READ
, (void *) l
, sizeof (temp_i
));
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
));
1428 error
= verify_area (VERIFY_WRITE
, (void *) l
, sizeof (temp_i
));
1430 put_fs_long (ppp
->dev
->base_addr
, l
);
1431 PRINTKN (3,(KERN_INFO
"ppp_ioctl: get unit: %d", ppp
->dev
->base_addr
));
1436 error
= verify_area (VERIFY_READ
, (void *) l
, sizeof (temp_i
));
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
));
1445 error
= verify_area (VERIFY_READ
, (void *) l
, sizeof (temp_i
));
1447 ppp_debug
= (int) get_fs_long (l
);
1448 ppp_debug_netpackets
= (ppp_debug
& 0xff00) >> 8;
1450 PRINTKN (1, (KERN_INFO
"ppp_ioctl: set debug level %d, netpacket %d\n",
1451 ppp_debug
, ppp_debug_netpackets
));
1456 error
= verify_area (VERIFY_WRITE
, (void *) l
, sizeof (temp_i
));
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)));
1465 error
= verify_area (VERIFY_WRITE
, (void *) l
, sizeof (struct ppp_stats
));
1467 memcpy_tofs ((void *) l
, &ppp
->stats
, sizeof (struct ppp_stats
));
1468 PRINTKN (3,(KERN_INFO
"ppp_ioctl: read statistics\n"));
1473 error
= verify_area (VERIFY_WRITE
, (void *) l
, sizeof (struct ppp_ddinfo
));
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"));
1489 case PPPIOCGXASYNCMAP
:
1490 error
= verify_area (VERIFY_WRITE
,
1492 sizeof (ppp
->xmit_async_map
));
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
));
1501 case PPPIOCSXASYNCMAP
:
1502 error
= verify_area (VERIFY_READ
, (void *) l
,
1503 sizeof (ppp
->xmit_async_map
));
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)
1517 memcpy (ppp
->xmit_async_map
, temp_tbl
, sizeof (ppp
->xmit_async_map
));
1518 PRINTKN (3,(KERN_INFO
"ppp_ioctl: set xasyncmap\n"));
1524 error
= verify_area (VERIFY_READ
, (void *) l
, sizeof (temp_i
));
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"));
1541 #ifdef NEW_TTY_DRIVERS
1542 /* Allow stty to read, but not set, the serial port */
1545 error
= n_tty_ioctl(tty
, file
, i
, l
);
1550 * All other ioctl() events will come here.
1554 PRINTKN (1,(KERN_ERR
"ppp_ioctl: invalid ioctl: %x, addr %lx\n",
1557 #ifdef NEW_TTY_DRIVERS
1558 error
= -ENOIOCTLCMD
;
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"))
1578 /* If the PPP protocol is no longer active, return false */
1581 /* Process the request based upon the type desired */
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
);
1590 clear_bit (0, &ppp
->us_rbuff_lock
);
1591 } /* fall through */
1594 /* Is there a pending error condition? */
1595 if (tty
->packet
&& tty
->link
->ctrl_status
)
1599 if (tty
->flags
& (1 << TTY_SLAVE_CLOSED
))
1602 /* If the tty is disconnected, then this is an exception too */
1603 if (tty_hung_up_p(filp
))
1606 select_wait (&ppp
->read_wait
, wait
);
1610 if (ppp_lock (ppp
)) {
1611 if (ppp
->sending
== 0) {
1617 select_wait (&ppp
->write_wait
, wait
);
1623 /*************************************************************
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
;
1637 unsigned short proto
;
1640 /* just a little sanity check. */
1642 PRINTKN(3,(KERN_WARNING
"ppp_xmit: null packet!\n"));
1646 /* Get pointers to the various components */
1647 ppp
= &ppp_ctrl
[dev
->base_addr
];
1649 p
= (unsigned char *) (skb
+ 1);
1653 PRINTKN(4,(KERN_DEBUG
"ppp_xmit [%s]: skb %lX busy %d\n", dev
->name
,
1654 (unsigned long int) skb
, ppp
->sending
));
1659 PRINTKN(1,(KERN_ERR
"ppp_xmit: %s not connected to a TTY!\n", dev
->name
));
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",
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"));
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
;
1686 /* Attempt to acquire send lock */
1687 if (ppp
->sending
|| !ppp_lock(ppp
)) {
1688 PRINTKN(3,(KERN_WARNING
"ppp_xmit: busy\n"));
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
;
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
)
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
;
1728 *ppp
->xhead
++ = PPP_FLAG
;
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);
1743 ppp_stuff_char(ppp
, *p
++);
1747 *ppp
->xhead
++ = PPP_FLAG
;
1749 /* update the time for demand dial function */
1750 ppp
->ddinfo
.ip_sjiffies
= jiffies
;
1754 ppp_print_buffer ("xmit buffer", ppp
->xbuff
, ppp
->xhead
- ppp
->xbuff
, KERNEL_DS
);
1756 PRINTKN (4,(KERN_DEBUG
1757 "ppp_write: writing %d chars\n", ppp
->xhead
- ppp
->xbuff
));
1764 kfree_skb(skb
, FREE_WRITE
);
1768 static unsigned short
1769 ppp_type_trans (struct sk_buff
*skb
, struct device
*dev
)
1771 return(htons(ETH_P_IP
));
1776 ppp_header(unsigned char *buff
, struct device
*dev
, unsigned short type
,
1777 unsigned long daddr
, unsigned long saddr
, unsigned len
)
1783 ppp_rebuild_header(void *buff
, struct device
*dev
)
1789 ppp_add_arp(unsigned long addr
, struct sk_buff
*skb
, struct device
*dev
)
1796 ppp_header(unsigned char *buff
, struct device
*dev
, unsigned short type
,
1797 void *daddr
, void *saddr
, unsigned len
, struct sk_buff
*skb
)
1803 ppp_rebuild_header(void *buff
, struct device
*dev
, unsigned long raddr
,
1804 struct sk_buff
*skb
)
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"));
1838 /*************************************************************
1840 * Miscellany called by various functions above.
1841 *************************************************************/
1843 #ifndef NEW_TTY_DRIVERS
1844 /* find a PPP channel given a TTY */
1846 ppp_find(struct tty_struct
*tty
)
1849 for (i
= 0; i
< PPP_NRUNIT
; i
++)
1850 if (ppp_ctrl
[i
].inuse
&& (ppp_ctrl
[i
].tty
== tty
)) return &ppp_ctrl
[i
];
1856 /* allocate a PPP channel */
1861 for (i
= 0; i
< PPP_NRUNIT
; i
++)
1862 if (!set_bit(0, &ppp_ctrl
[i
].inuse
)) return &ppp_ctrl
[i
];
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
1873 ppp_lock(struct ppp
*ppp
)
1878 locked
= ppp
->sending
;
1880 if (ppp
->dev
->flags
& IFF_UP
)
1881 ppp
->dev
->tbusy
= 1;
1882 restore_flags(flags
);
1887 ppp_unlock(struct ppp
*ppp
)
1893 if (ppp
->dev
->flags
& IFF_UP
)
1894 ppp
->dev
->tbusy
= 0;
1895 restore_flags(flags
);
1898 /* FCS support functions */
1901 ppp_add_fcs(struct ppp
*ppp
)
1903 unsigned short fcs
= ppp
->fcs
;
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
));
1914 ppp_check_fcs(struct ppp
*ppp
)
1916 unsigned short fcs
= PPP_FCS_INIT
, msgfcs
;
1917 unsigned char *c
= ppp
->rbuff
;
1920 for (i
= 0; i
< ppp
->rcount
- 2; i
++, c
++)
1921 fcs
= (fcs
>> 8) ^ fcstab
[(fcs
^ *c
) & 0xff];
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];
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)
1959 if (next_ch
== '%') /* printk/syslogd has a bug !! */
1967 static void ppp_print_buffer(const char *name
, char *buf
, int count
, int seg
)
1970 int old_fs
= get_fs();
1974 if (name
!= (char *) NULL
)
1975 PRINTK ((KERN_DEBUG
"ppp: %s, count = %d\n", name
, count
));
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
));
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
));