Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
[linux/fpc-iii.git] / drivers / isdn / i4l / isdn_ppp.c
blobf37b8f68d0aa0d3b00f7405d1f7bb31c8ab5e6bb
1 /* $Id: isdn_ppp.c,v 1.1.2.3 2004/02/10 01:07:13 keil Exp $
3 * Linux ISDN subsystem, functions for synchronous PPP (linklevel).
5 * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de)
7 * This software may be used and distributed according to the terms
8 * of the GNU General Public License, incorporated herein by reference.
12 #include <linux/isdn.h>
13 #include <linux/poll.h>
14 #include <linux/ppp-comp.h>
15 #include <linux/slab.h>
16 #ifdef CONFIG_IPPP_FILTER
17 #include <linux/filter.h>
18 #endif
20 #include "isdn_common.h"
21 #include "isdn_ppp.h"
22 #include "isdn_net.h"
24 #ifndef PPP_IPX
25 #define PPP_IPX 0x002b
26 #endif
28 /* Prototypes */
29 static int isdn_ppp_fill_rq(unsigned char *buf, int len, int proto, int slot);
30 static int isdn_ppp_closewait(int slot);
31 static void isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp,
32 struct sk_buff *skb, int proto);
33 static int isdn_ppp_if_get_unit(char *namebuf);
34 static int isdn_ppp_set_compressor(struct ippp_struct *is,struct isdn_ppp_comp_data *);
35 static struct sk_buff *isdn_ppp_decompress(struct sk_buff *,
36 struct ippp_struct *,struct ippp_struct *,int *proto);
37 static void isdn_ppp_receive_ccp(isdn_net_dev * net_dev, isdn_net_local * lp,
38 struct sk_buff *skb,int proto);
39 static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in,int *proto,
40 struct ippp_struct *is,struct ippp_struct *master,int type);
41 static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
42 struct sk_buff *skb);
44 /* New CCP stuff */
45 static void isdn_ppp_ccp_kickup(struct ippp_struct *is);
46 static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
47 unsigned char code, unsigned char id,
48 unsigned char *data, int len);
49 static struct ippp_ccp_reset *isdn_ppp_ccp_reset_alloc(struct ippp_struct *is);
50 static void isdn_ppp_ccp_reset_free(struct ippp_struct *is);
51 static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
52 unsigned char id);
53 static void isdn_ppp_ccp_timer_callback(unsigned long closure);
54 static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
55 unsigned char id);
56 static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
57 struct isdn_ppp_resetparams *rp);
58 static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
59 unsigned char id);
63 #ifdef CONFIG_ISDN_MPP
64 static ippp_bundle * isdn_ppp_bundle_arr = NULL;
66 static int isdn_ppp_mp_bundle_array_init(void);
67 static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to );
68 static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
69 struct sk_buff *skb);
70 static void isdn_ppp_mp_cleanup( isdn_net_local * lp );
72 static int isdn_ppp_bundle(struct ippp_struct *, int unit);
73 #endif /* CONFIG_ISDN_MPP */
75 char *isdn_ppp_revision = "$Revision: 1.1.2.3 $";
77 static struct ippp_struct *ippp_table[ISDN_MAX_CHANNELS];
79 static struct isdn_ppp_compressor *ipc_head = NULL;
82 * frame log (debug)
84 static void
85 isdn_ppp_frame_log(char *info, char *data, int len, int maxlen,int unit,int slot)
87 int cnt,
90 char buf[80];
92 if (len < maxlen)
93 maxlen = len;
95 for (i = 0, cnt = 0; cnt < maxlen; i++) {
96 for (j = 0; j < 16 && cnt < maxlen; j++, cnt++)
97 sprintf(buf + j * 3, "%02x ", (unsigned char) data[cnt]);
98 printk(KERN_DEBUG "[%d/%d].%s[%d]: %s\n",unit,slot, info, i, buf);
103 * unbind isdn_net_local <=> ippp-device
104 * note: it can happen, that we hangup/free the master before the slaves
105 * in this case we bind another lp to the master device
108 isdn_ppp_free(isdn_net_local * lp)
110 struct ippp_struct *is;
112 if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
113 printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
114 __func__, lp->ppp_slot);
115 return 0;
118 #ifdef CONFIG_ISDN_MPP
119 spin_lock(&lp->netdev->pb->lock);
120 #endif
121 isdn_net_rm_from_bundle(lp);
122 #ifdef CONFIG_ISDN_MPP
123 if (lp->netdev->pb->ref_ct == 1) /* last link in queue? */
124 isdn_ppp_mp_cleanup(lp);
126 lp->netdev->pb->ref_ct--;
127 spin_unlock(&lp->netdev->pb->lock);
128 #endif /* CONFIG_ISDN_MPP */
129 if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
130 printk(KERN_ERR "%s: ppp_slot(%d) now invalid\n",
131 __func__, lp->ppp_slot);
132 return 0;
134 is = ippp_table[lp->ppp_slot];
135 if ((is->state & IPPP_CONNECT))
136 isdn_ppp_closewait(lp->ppp_slot); /* force wakeup on ippp device */
137 else if (is->state & IPPP_ASSIGNED)
138 is->state = IPPP_OPEN; /* fallback to 'OPEN but not ASSIGNED' state */
140 if (is->debug & 0x1)
141 printk(KERN_DEBUG "isdn_ppp_free %d %lx %lx\n", lp->ppp_slot, (long) lp, (long) is->lp);
143 is->lp = NULL; /* link is down .. set lp to NULL */
144 lp->ppp_slot = -1; /* is this OK ?? */
146 return 0;
150 * bind isdn_net_local <=> ippp-device
152 * This function is allways called with holding dev->lock so
153 * no additional lock is needed
156 isdn_ppp_bind(isdn_net_local * lp)
158 int i;
159 int unit = 0;
160 struct ippp_struct *is;
161 int retval;
163 if (lp->pppbind < 0) { /* device bounded to ippp device ? */
164 isdn_net_dev *net_dev = dev->netdev;
165 char exclusive[ISDN_MAX_CHANNELS]; /* exclusive flags */
166 memset(exclusive, 0, ISDN_MAX_CHANNELS);
167 while (net_dev) { /* step through net devices to find exclusive minors */
168 isdn_net_local *lp = net_dev->local;
169 if (lp->pppbind >= 0)
170 exclusive[lp->pppbind] = 1;
171 net_dev = net_dev->next;
174 * search a free device / slot
176 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
177 if (ippp_table[i]->state == IPPP_OPEN && !exclusive[ippp_table[i]->minor]) { /* OPEN, but not connected! */
178 break;
181 } else {
182 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
183 if (ippp_table[i]->minor == lp->pppbind &&
184 (ippp_table[i]->state & IPPP_OPEN) == IPPP_OPEN)
185 break;
189 if (i >= ISDN_MAX_CHANNELS) {
190 printk(KERN_WARNING "isdn_ppp_bind: Can't find a (free) connection to the ipppd daemon.\n");
191 retval = -1;
192 goto out;
194 /* get unit number from interface name .. ugly! */
195 unit = isdn_ppp_if_get_unit(lp->netdev->dev->name);
196 if (unit < 0) {
197 printk(KERN_ERR "isdn_ppp_bind: illegal interface name %s.\n",
198 lp->netdev->dev->name);
199 retval = -1;
200 goto out;
203 lp->ppp_slot = i;
204 is = ippp_table[i];
205 is->lp = lp;
206 is->unit = unit;
207 is->state = IPPP_OPEN | IPPP_ASSIGNED; /* assigned to a netdevice but not connected */
208 #ifdef CONFIG_ISDN_MPP
209 retval = isdn_ppp_mp_init(lp, NULL);
210 if (retval < 0)
211 goto out;
212 #endif /* CONFIG_ISDN_MPP */
214 retval = lp->ppp_slot;
216 out:
217 return retval;
221 * kick the ipppd on the device
222 * (wakes up daemon after B-channel connect)
225 void
226 isdn_ppp_wakeup_daemon(isdn_net_local * lp)
228 if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
229 printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
230 __func__, lp->ppp_slot);
231 return;
233 ippp_table[lp->ppp_slot]->state = IPPP_OPEN | IPPP_CONNECT | IPPP_NOBLOCK;
234 wake_up_interruptible(&ippp_table[lp->ppp_slot]->wq);
238 * there was a hangup on the netdevice
239 * force wakeup of the ippp device
240 * go into 'device waits for release' state
242 static int
243 isdn_ppp_closewait(int slot)
245 struct ippp_struct *is;
247 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
248 printk(KERN_ERR "%s: slot(%d) out of range\n",
249 __func__, slot);
250 return 0;
252 is = ippp_table[slot];
253 if (is->state)
254 wake_up_interruptible(&is->wq);
255 is->state = IPPP_CLOSEWAIT;
256 return 1;
260 * isdn_ppp_find_slot / isdn_ppp_free_slot
263 static int
264 isdn_ppp_get_slot(void)
266 int i;
267 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
268 if (!ippp_table[i]->state)
269 return i;
271 return -1;
275 * isdn_ppp_open
279 isdn_ppp_open(int min, struct file *file)
281 int slot;
282 struct ippp_struct *is;
284 if (min < 0 || min >= ISDN_MAX_CHANNELS)
285 return -ENODEV;
287 slot = isdn_ppp_get_slot();
288 if (slot < 0) {
289 return -EBUSY;
291 is = file->private_data = ippp_table[slot];
293 printk(KERN_DEBUG "ippp, open, slot: %d, minor: %d, state: %04x\n",
294 slot, min, is->state);
296 /* compression stuff */
297 is->link_compressor = is->compressor = NULL;
298 is->link_decompressor = is->decompressor = NULL;
299 is->link_comp_stat = is->comp_stat = NULL;
300 is->link_decomp_stat = is->decomp_stat = NULL;
301 is->compflags = 0;
303 is->reset = isdn_ppp_ccp_reset_alloc(is);
305 is->lp = NULL;
306 is->mp_seqno = 0; /* MP sequence number */
307 is->pppcfg = 0; /* ppp configuration */
308 is->mpppcfg = 0; /* mppp configuration */
309 is->last_link_seqno = -1; /* MP: maybe set to Bundle-MIN, when joining a bundle ?? */
310 is->unit = -1; /* set, when we have our interface */
311 is->mru = 1524; /* MRU, default 1524 */
312 is->maxcid = 16; /* VJ: maxcid */
313 is->tk = current;
314 init_waitqueue_head(&is->wq);
315 is->first = is->rq + NUM_RCV_BUFFS - 1; /* receive queue */
316 is->last = is->rq;
317 is->minor = min;
318 #ifdef CONFIG_ISDN_PPP_VJ
320 * VJ header compression init
322 is->slcomp = slhc_init(16, 16); /* not necessary for 2. link in bundle */
323 #endif
324 #ifdef CONFIG_IPPP_FILTER
325 is->pass_filter = NULL;
326 is->active_filter = NULL;
327 #endif
328 is->state = IPPP_OPEN;
330 return 0;
334 * release ippp device
336 void
337 isdn_ppp_release(int min, struct file *file)
339 int i;
340 struct ippp_struct *is;
342 if (min < 0 || min >= ISDN_MAX_CHANNELS)
343 return;
344 is = file->private_data;
346 if (!is) {
347 printk(KERN_ERR "%s: no file->private_data\n", __func__);
348 return;
350 if (is->debug & 0x1)
351 printk(KERN_DEBUG "ippp: release, minor: %d %lx\n", min, (long) is->lp);
353 if (is->lp) { /* a lp address says: this link is still up */
354 isdn_net_dev *p = is->lp->netdev;
356 if (!p) {
357 printk(KERN_ERR "%s: no lp->netdev\n", __func__);
358 return;
360 is->state &= ~IPPP_CONNECT; /* -> effect: no call of wakeup */
362 * isdn_net_hangup() calls isdn_ppp_free()
363 * isdn_ppp_free() sets is->lp to NULL and lp->ppp_slot to -1
364 * removing the IPPP_CONNECT flag omits calling of isdn_ppp_wakeup_daemon()
366 isdn_net_hangup(p->dev);
368 for (i = 0; i < NUM_RCV_BUFFS; i++) {
369 kfree(is->rq[i].buf);
370 is->rq[i].buf = NULL;
372 is->first = is->rq + NUM_RCV_BUFFS - 1; /* receive queue */
373 is->last = is->rq;
375 #ifdef CONFIG_ISDN_PPP_VJ
376 /* TODO: if this was the previous master: link the slcomp to the new master */
377 slhc_free(is->slcomp);
378 is->slcomp = NULL;
379 #endif
380 #ifdef CONFIG_IPPP_FILTER
381 kfree(is->pass_filter);
382 is->pass_filter = NULL;
383 kfree(is->active_filter);
384 is->active_filter = NULL;
385 #endif
387 /* TODO: if this was the previous master: link the stuff to the new master */
388 if(is->comp_stat)
389 is->compressor->free(is->comp_stat);
390 if(is->link_comp_stat)
391 is->link_compressor->free(is->link_comp_stat);
392 if(is->link_decomp_stat)
393 is->link_decompressor->free(is->link_decomp_stat);
394 if(is->decomp_stat)
395 is->decompressor->free(is->decomp_stat);
396 is->compressor = is->link_compressor = NULL;
397 is->decompressor = is->link_decompressor = NULL;
398 is->comp_stat = is->link_comp_stat = NULL;
399 is->decomp_stat = is->link_decomp_stat = NULL;
401 /* Clean up if necessary */
402 if(is->reset)
403 isdn_ppp_ccp_reset_free(is);
405 /* this slot is ready for new connections */
406 is->state = 0;
410 * get_arg .. ioctl helper
412 static int
413 get_arg(void __user *b, void *val, int len)
415 if (len <= 0)
416 len = sizeof(void *);
417 if (copy_from_user(val, b, len))
418 return -EFAULT;
419 return 0;
423 * set arg .. ioctl helper
425 static int
426 set_arg(void __user *b, void *val,int len)
428 if(len <= 0)
429 len = sizeof(void *);
430 if (copy_to_user(b, val, len))
431 return -EFAULT;
432 return 0;
435 #ifdef CONFIG_IPPP_FILTER
436 static int get_filter(void __user *arg, struct sock_filter **p)
438 struct sock_fprog uprog;
439 struct sock_filter *code = NULL;
440 int len, err;
442 if (copy_from_user(&uprog, arg, sizeof(uprog)))
443 return -EFAULT;
445 if (!uprog.len) {
446 *p = NULL;
447 return 0;
450 /* uprog.len is unsigned short, so no overflow here */
451 len = uprog.len * sizeof(struct sock_filter);
452 code = kmalloc(len, GFP_KERNEL);
453 if (code == NULL)
454 return -ENOMEM;
456 if (copy_from_user(code, uprog.filter, len)) {
457 kfree(code);
458 return -EFAULT;
461 err = sk_chk_filter(code, uprog.len);
462 if (err) {
463 kfree(code);
464 return err;
467 *p = code;
468 return uprog.len;
470 #endif /* CONFIG_IPPP_FILTER */
473 * ippp device ioctl
476 isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg)
478 unsigned long val;
479 int r,i,j;
480 struct ippp_struct *is;
481 isdn_net_local *lp;
482 struct isdn_ppp_comp_data data;
483 void __user *argp = (void __user *)arg;
485 is = (struct ippp_struct *) file->private_data;
486 lp = is->lp;
488 if (is->debug & 0x1)
489 printk(KERN_DEBUG "isdn_ppp_ioctl: minor: %d cmd: %x state: %x\n", min, cmd, is->state);
491 if (!(is->state & IPPP_OPEN))
492 return -EINVAL;
494 switch (cmd) {
495 case PPPIOCBUNDLE:
496 #ifdef CONFIG_ISDN_MPP
497 if (!(is->state & IPPP_CONNECT))
498 return -EINVAL;
499 if ((r = get_arg(argp, &val, sizeof(val) )))
500 return r;
501 printk(KERN_DEBUG "iPPP-bundle: minor: %d, slave unit: %d, master unit: %d\n",
502 (int) min, (int) is->unit, (int) val);
503 return isdn_ppp_bundle(is, val);
504 #else
505 return -1;
506 #endif
507 break;
508 case PPPIOCGUNIT: /* get ppp/isdn unit number */
509 if ((r = set_arg(argp, &is->unit, sizeof(is->unit) )))
510 return r;
511 break;
512 case PPPIOCGIFNAME:
513 if(!lp)
514 return -EINVAL;
515 if ((r = set_arg(argp, lp->netdev->dev->name,
516 strlen(lp->netdev->dev->name))))
517 return r;
518 break;
519 case PPPIOCGMPFLAGS: /* get configuration flags */
520 if ((r = set_arg(argp, &is->mpppcfg, sizeof(is->mpppcfg) )))
521 return r;
522 break;
523 case PPPIOCSMPFLAGS: /* set configuration flags */
524 if ((r = get_arg(argp, &val, sizeof(val) )))
525 return r;
526 is->mpppcfg = val;
527 break;
528 case PPPIOCGFLAGS: /* get configuration flags */
529 if ((r = set_arg(argp, &is->pppcfg,sizeof(is->pppcfg) )))
530 return r;
531 break;
532 case PPPIOCSFLAGS: /* set configuration flags */
533 if ((r = get_arg(argp, &val, sizeof(val) ))) {
534 return r;
536 if (val & SC_ENABLE_IP && !(is->pppcfg & SC_ENABLE_IP) && (is->state & IPPP_CONNECT)) {
537 if (lp) {
538 /* OK .. we are ready to send buffers */
539 is->pppcfg = val; /* isdn_ppp_xmit test for SC_ENABLE_IP !!! */
540 netif_wake_queue(lp->netdev->dev);
541 break;
544 is->pppcfg = val;
545 break;
546 case PPPIOCGIDLE: /* get idle time information */
547 if (lp) {
548 struct ppp_idle pidle;
549 pidle.xmit_idle = pidle.recv_idle = lp->huptimer;
550 if ((r = set_arg(argp, &pidle,sizeof(struct ppp_idle))))
551 return r;
553 break;
554 case PPPIOCSMRU: /* set receive unit size for PPP */
555 if ((r = get_arg(argp, &val, sizeof(val) )))
556 return r;
557 is->mru = val;
558 break;
559 case PPPIOCSMPMRU:
560 break;
561 case PPPIOCSMPMTU:
562 break;
563 case PPPIOCSMAXCID: /* set the maximum compression slot id */
564 if ((r = get_arg(argp, &val, sizeof(val) )))
565 return r;
566 val++;
567 if (is->maxcid != val) {
568 #ifdef CONFIG_ISDN_PPP_VJ
569 struct slcompress *sltmp;
570 #endif
571 if (is->debug & 0x1)
572 printk(KERN_DEBUG "ippp, ioctl: changed MAXCID to %ld\n", val);
573 is->maxcid = val;
574 #ifdef CONFIG_ISDN_PPP_VJ
575 sltmp = slhc_init(16, val);
576 if (!sltmp) {
577 printk(KERN_ERR "ippp, can't realloc slhc struct\n");
578 return -ENOMEM;
580 if (is->slcomp)
581 slhc_free(is->slcomp);
582 is->slcomp = sltmp;
583 #endif
585 break;
586 case PPPIOCGDEBUG:
587 if ((r = set_arg(argp, &is->debug, sizeof(is->debug) )))
588 return r;
589 break;
590 case PPPIOCSDEBUG:
591 if ((r = get_arg(argp, &val, sizeof(val) )))
592 return r;
593 is->debug = val;
594 break;
595 case PPPIOCGCOMPRESSORS:
597 unsigned long protos[8] = {0,};
598 struct isdn_ppp_compressor *ipc = ipc_head;
599 while(ipc) {
600 j = ipc->num / (sizeof(long)*8);
601 i = ipc->num % (sizeof(long)*8);
602 if(j < 8)
603 protos[j] |= (0x1<<i);
604 ipc = ipc->next;
606 if ((r = set_arg(argp,protos,8*sizeof(long) )))
607 return r;
609 break;
610 case PPPIOCSCOMPRESSOR:
611 if ((r = get_arg(argp, &data, sizeof(struct isdn_ppp_comp_data))))
612 return r;
613 return isdn_ppp_set_compressor(is, &data);
614 case PPPIOCGCALLINFO:
616 struct pppcallinfo pci;
617 memset((char *) &pci,0,sizeof(struct pppcallinfo));
618 if(lp)
620 strncpy(pci.local_num,lp->msn,63);
621 if(lp->dial) {
622 strncpy(pci.remote_num,lp->dial->num,63);
624 pci.charge_units = lp->charge;
625 if(lp->outgoing)
626 pci.calltype = CALLTYPE_OUTGOING;
627 else
628 pci.calltype = CALLTYPE_INCOMING;
629 if(lp->flags & ISDN_NET_CALLBACK)
630 pci.calltype |= CALLTYPE_CALLBACK;
632 return set_arg(argp,&pci,sizeof(struct pppcallinfo));
634 #ifdef CONFIG_IPPP_FILTER
635 case PPPIOCSPASS:
637 struct sock_filter *code;
638 int len = get_filter(argp, &code);
639 if (len < 0)
640 return len;
641 kfree(is->pass_filter);
642 is->pass_filter = code;
643 is->pass_len = len;
644 break;
646 case PPPIOCSACTIVE:
648 struct sock_filter *code;
649 int len = get_filter(argp, &code);
650 if (len < 0)
651 return len;
652 kfree(is->active_filter);
653 is->active_filter = code;
654 is->active_len = len;
655 break;
657 #endif /* CONFIG_IPPP_FILTER */
658 default:
659 break;
661 return 0;
664 unsigned int
665 isdn_ppp_poll(struct file *file, poll_table * wait)
667 u_int mask;
668 struct ippp_buf_queue *bf, *bl;
669 u_long flags;
670 struct ippp_struct *is;
672 is = file->private_data;
674 if (is->debug & 0x2)
675 printk(KERN_DEBUG "isdn_ppp_poll: minor: %d\n",
676 iminor(file->f_path.dentry->d_inode));
678 /* just registers wait_queue hook. This doesn't really wait. */
679 poll_wait(file, &is->wq, wait);
681 if (!(is->state & IPPP_OPEN)) {
682 if(is->state == IPPP_CLOSEWAIT)
683 return POLLHUP;
684 printk(KERN_DEBUG "isdn_ppp: device not open\n");
685 return POLLERR;
687 /* we're always ready to send .. */
688 mask = POLLOUT | POLLWRNORM;
690 spin_lock_irqsave(&is->buflock, flags);
691 bl = is->last;
692 bf = is->first;
694 * if IPPP_NOBLOCK is set we return even if we have nothing to read
696 if (bf->next != bl || (is->state & IPPP_NOBLOCK)) {
697 is->state &= ~IPPP_NOBLOCK;
698 mask |= POLLIN | POLLRDNORM;
700 spin_unlock_irqrestore(&is->buflock, flags);
701 return mask;
705 * fill up isdn_ppp_read() queue ..
708 static int
709 isdn_ppp_fill_rq(unsigned char *buf, int len, int proto, int slot)
711 struct ippp_buf_queue *bf, *bl;
712 u_long flags;
713 u_char *nbuf;
714 struct ippp_struct *is;
716 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
717 printk(KERN_WARNING "ippp: illegal slot(%d).\n", slot);
718 return 0;
720 is = ippp_table[slot];
722 if (!(is->state & IPPP_CONNECT)) {
723 printk(KERN_DEBUG "ippp: device not activated.\n");
724 return 0;
726 nbuf = kmalloc(len + 4, GFP_ATOMIC);
727 if (!nbuf) {
728 printk(KERN_WARNING "ippp: Can't alloc buf\n");
729 return 0;
731 nbuf[0] = PPP_ALLSTATIONS;
732 nbuf[1] = PPP_UI;
733 nbuf[2] = proto >> 8;
734 nbuf[3] = proto & 0xff;
735 memcpy(nbuf + 4, buf, len);
737 spin_lock_irqsave(&is->buflock, flags);
738 bf = is->first;
739 bl = is->last;
741 if (bf == bl) {
742 printk(KERN_WARNING "ippp: Queue is full; discarding first buffer\n");
743 bf = bf->next;
744 kfree(bf->buf);
745 is->first = bf;
747 bl->buf = (char *) nbuf;
748 bl->len = len + 4;
750 is->last = bl->next;
751 spin_unlock_irqrestore(&is->buflock, flags);
752 wake_up_interruptible(&is->wq);
753 return len;
757 * read() .. non-blocking: ipppd calls it only after select()
758 * reports, that there is data
762 isdn_ppp_read(int min, struct file *file, char __user *buf, int count)
764 struct ippp_struct *is;
765 struct ippp_buf_queue *b;
766 u_long flags;
767 u_char *save_buf;
769 is = file->private_data;
771 if (!(is->state & IPPP_OPEN))
772 return 0;
774 if (!access_ok(VERIFY_WRITE, buf, count))
775 return -EFAULT;
777 spin_lock_irqsave(&is->buflock, flags);
778 b = is->first->next;
779 save_buf = b->buf;
780 if (!save_buf) {
781 spin_unlock_irqrestore(&is->buflock, flags);
782 return -EAGAIN;
784 if (b->len < count)
785 count = b->len;
786 b->buf = NULL;
787 is->first = b;
789 spin_unlock_irqrestore(&is->buflock, flags);
790 if (copy_to_user(buf, save_buf, count))
791 count = -EFAULT;
792 kfree(save_buf);
794 return count;
798 * ipppd wanna write a packet to the card .. non-blocking
802 isdn_ppp_write(int min, struct file *file, const char __user *buf, int count)
804 isdn_net_local *lp;
805 struct ippp_struct *is;
806 int proto;
807 unsigned char protobuf[4];
809 is = file->private_data;
811 if (!(is->state & IPPP_CONNECT))
812 return 0;
814 lp = is->lp;
816 /* -> push it directly to the lowlevel interface */
818 if (!lp)
819 printk(KERN_DEBUG "isdn_ppp_write: lp == NULL\n");
820 else {
822 * Don't reset huptimer for
823 * LCP packets. (Echo requests).
825 if (copy_from_user(protobuf, buf, 4))
826 return -EFAULT;
827 proto = PPP_PROTOCOL(protobuf);
828 if (proto != PPP_LCP)
829 lp->huptimer = 0;
831 if (lp->isdn_device < 0 || lp->isdn_channel < 0)
832 return 0;
834 if ((dev->drv[lp->isdn_device]->flags & DRV_FLAG_RUNNING) &&
835 lp->dialstate == 0 &&
836 (lp->flags & ISDN_NET_CONNECTED)) {
837 unsigned short hl;
838 struct sk_buff *skb;
840 * we need to reserve enough space in front of
841 * sk_buff. old call to dev_alloc_skb only reserved
842 * 16 bytes, now we are looking what the driver want
844 hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
845 skb = alloc_skb(hl+count, GFP_ATOMIC);
846 if (!skb) {
847 printk(KERN_WARNING "isdn_ppp_write: out of memory!\n");
848 return count;
850 skb_reserve(skb, hl);
851 if (copy_from_user(skb_put(skb, count), buf, count))
853 kfree_skb(skb);
854 return -EFAULT;
856 if (is->debug & 0x40) {
857 printk(KERN_DEBUG "ppp xmit: len %d\n", (int) skb->len);
858 isdn_ppp_frame_log("xmit", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
861 isdn_ppp_send_ccp(lp->netdev,lp,skb); /* keeps CCP/compression states in sync */
863 isdn_net_write_super(lp, skb);
866 return count;
870 * init memory, structures etc.
874 isdn_ppp_init(void)
876 int i,
879 #ifdef CONFIG_ISDN_MPP
880 if( isdn_ppp_mp_bundle_array_init() < 0 )
881 return -ENOMEM;
882 #endif /* CONFIG_ISDN_MPP */
884 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
885 if (!(ippp_table[i] = kzalloc(sizeof(struct ippp_struct), GFP_KERNEL))) {
886 printk(KERN_WARNING "isdn_ppp_init: Could not alloc ippp_table\n");
887 for (j = 0; j < i; j++)
888 kfree(ippp_table[j]);
889 return -1;
891 spin_lock_init(&ippp_table[i]->buflock);
892 ippp_table[i]->state = 0;
893 ippp_table[i]->first = ippp_table[i]->rq + NUM_RCV_BUFFS - 1;
894 ippp_table[i]->last = ippp_table[i]->rq;
896 for (j = 0; j < NUM_RCV_BUFFS; j++) {
897 ippp_table[i]->rq[j].buf = NULL;
898 ippp_table[i]->rq[j].last = ippp_table[i]->rq +
899 (NUM_RCV_BUFFS + j - 1) % NUM_RCV_BUFFS;
900 ippp_table[i]->rq[j].next = ippp_table[i]->rq + (j + 1) % NUM_RCV_BUFFS;
903 return 0;
906 void
907 isdn_ppp_cleanup(void)
909 int i;
911 for (i = 0; i < ISDN_MAX_CHANNELS; i++)
912 kfree(ippp_table[i]);
914 #ifdef CONFIG_ISDN_MPP
915 kfree(isdn_ppp_bundle_arr);
916 #endif /* CONFIG_ISDN_MPP */
921 * check for address/control field and skip if allowed
922 * retval != 0 -> discard packet silently
924 static int isdn_ppp_skip_ac(struct ippp_struct *is, struct sk_buff *skb)
926 if (skb->len < 1)
927 return -1;
929 if (skb->data[0] == 0xff) {
930 if (skb->len < 2)
931 return -1;
933 if (skb->data[1] != 0x03)
934 return -1;
936 // skip address/control (AC) field
937 skb_pull(skb, 2);
938 } else {
939 if (is->pppcfg & SC_REJ_COMP_AC)
940 // if AC compression was not negotiated, but used, discard packet
941 return -1;
943 return 0;
947 * get the PPP protocol header and pull skb
948 * retval < 0 -> discard packet silently
950 static int isdn_ppp_strip_proto(struct sk_buff *skb)
952 int proto;
954 if (skb->len < 1)
955 return -1;
957 if (skb->data[0] & 0x1) {
958 // protocol field is compressed
959 proto = skb->data[0];
960 skb_pull(skb, 1);
961 } else {
962 if (skb->len < 2)
963 return -1;
964 proto = ((int) skb->data[0] << 8) + skb->data[1];
965 skb_pull(skb, 2);
967 return proto;
972 * handler for incoming packets on a syncPPP interface
974 void isdn_ppp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff *skb)
976 struct ippp_struct *is;
977 int slot;
978 int proto;
980 BUG_ON(net_dev->local->master); // we're called with the master device always
982 slot = lp->ppp_slot;
983 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
984 printk(KERN_ERR "isdn_ppp_receive: lp->ppp_slot(%d)\n",
985 lp->ppp_slot);
986 kfree_skb(skb);
987 return;
989 is = ippp_table[slot];
991 if (is->debug & 0x4) {
992 printk(KERN_DEBUG "ippp_receive: is:%08lx lp:%08lx slot:%d unit:%d len:%d\n",
993 (long)is,(long)lp,lp->ppp_slot,is->unit,(int) skb->len);
994 isdn_ppp_frame_log("receive", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
997 if (isdn_ppp_skip_ac(is, skb) < 0) {
998 kfree_skb(skb);
999 return;
1001 proto = isdn_ppp_strip_proto(skb);
1002 if (proto < 0) {
1003 kfree_skb(skb);
1004 return;
1007 #ifdef CONFIG_ISDN_MPP
1008 if (is->compflags & SC_LINK_DECOMP_ON) {
1009 skb = isdn_ppp_decompress(skb, is, NULL, &proto);
1010 if (!skb) // decompression error
1011 return;
1014 if (!(is->mpppcfg & SC_REJ_MP_PROT)) { // we agreed to receive MPPP
1015 if (proto == PPP_MP) {
1016 isdn_ppp_mp_receive(net_dev, lp, skb);
1017 return;
1020 #endif
1021 isdn_ppp_push_higher(net_dev, lp, skb, proto);
1025 * we receive a reassembled frame, MPPP has been taken care of before.
1026 * address/control and protocol have been stripped from the skb
1027 * note: net_dev has to be master net_dev
1029 static void
1030 isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff *skb, int proto)
1032 struct net_device *dev = net_dev->dev;
1033 struct ippp_struct *is, *mis;
1034 isdn_net_local *mlp = NULL;
1035 int slot;
1037 slot = lp->ppp_slot;
1038 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1039 printk(KERN_ERR "isdn_ppp_push_higher: lp->ppp_slot(%d)\n",
1040 lp->ppp_slot);
1041 goto drop_packet;
1043 is = ippp_table[slot];
1045 if (lp->master) { // FIXME?
1046 mlp = ISDN_MASTER_PRIV(lp);
1047 slot = mlp->ppp_slot;
1048 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1049 printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n",
1050 lp->ppp_slot);
1051 goto drop_packet;
1054 mis = ippp_table[slot];
1056 if (is->debug & 0x10) {
1057 printk(KERN_DEBUG "push, skb %d %04x\n", (int) skb->len, proto);
1058 isdn_ppp_frame_log("rpush", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
1060 if (mis->compflags & SC_DECOMP_ON) {
1061 skb = isdn_ppp_decompress(skb, is, mis, &proto);
1062 if (!skb) // decompression error
1063 return;
1065 switch (proto) {
1066 case PPP_IPX: /* untested */
1067 if (is->debug & 0x20)
1068 printk(KERN_DEBUG "isdn_ppp: IPX\n");
1069 skb->protocol = htons(ETH_P_IPX);
1070 break;
1071 case PPP_IP:
1072 if (is->debug & 0x20)
1073 printk(KERN_DEBUG "isdn_ppp: IP\n");
1074 skb->protocol = htons(ETH_P_IP);
1075 break;
1076 case PPP_COMP:
1077 case PPP_COMPFRAG:
1078 printk(KERN_INFO "isdn_ppp: unexpected compressed frame dropped\n");
1079 goto drop_packet;
1080 #ifdef CONFIG_ISDN_PPP_VJ
1081 case PPP_VJC_UNCOMP:
1082 if (is->debug & 0x20)
1083 printk(KERN_DEBUG "isdn_ppp: VJC_UNCOMP\n");
1084 if (net_dev->local->ppp_slot < 0) {
1085 printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
1086 __func__, net_dev->local->ppp_slot);
1087 goto drop_packet;
1089 if (slhc_remember(ippp_table[net_dev->local->ppp_slot]->slcomp, skb->data, skb->len) <= 0) {
1090 printk(KERN_WARNING "isdn_ppp: received illegal VJC_UNCOMP frame!\n");
1091 goto drop_packet;
1093 skb->protocol = htons(ETH_P_IP);
1094 break;
1095 case PPP_VJC_COMP:
1096 if (is->debug & 0x20)
1097 printk(KERN_DEBUG "isdn_ppp: VJC_COMP\n");
1099 struct sk_buff *skb_old = skb;
1100 int pkt_len;
1101 skb = dev_alloc_skb(skb_old->len + 128);
1103 if (!skb) {
1104 printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
1105 skb = skb_old;
1106 goto drop_packet;
1108 skb_put(skb, skb_old->len + 128);
1109 skb_copy_from_linear_data(skb_old, skb->data,
1110 skb_old->len);
1111 if (net_dev->local->ppp_slot < 0) {
1112 printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
1113 __func__, net_dev->local->ppp_slot);
1114 goto drop_packet;
1116 pkt_len = slhc_uncompress(ippp_table[net_dev->local->ppp_slot]->slcomp,
1117 skb->data, skb_old->len);
1118 kfree_skb(skb_old);
1119 if (pkt_len < 0)
1120 goto drop_packet;
1122 skb_trim(skb, pkt_len);
1123 skb->protocol = htons(ETH_P_IP);
1125 break;
1126 #endif
1127 case PPP_CCP:
1128 case PPP_CCPFRAG:
1129 isdn_ppp_receive_ccp(net_dev,lp,skb,proto);
1130 /* Dont pop up ResetReq/Ack stuff to the daemon any
1131 longer - the job is done already */
1132 if(skb->data[0] == CCP_RESETREQ ||
1133 skb->data[0] == CCP_RESETACK)
1134 break;
1135 /* fall through */
1136 default:
1137 isdn_ppp_fill_rq(skb->data, skb->len, proto, lp->ppp_slot); /* push data to pppd device */
1138 kfree_skb(skb);
1139 return;
1142 #ifdef CONFIG_IPPP_FILTER
1143 /* check if the packet passes the pass and active filters
1144 * the filter instructions are constructed assuming
1145 * a four-byte PPP header on each packet (which is still present) */
1146 skb_push(skb, 4);
1149 u_int16_t *p = (u_int16_t *) skb->data;
1151 *p = 0; /* indicate inbound */
1154 if (is->pass_filter
1155 && sk_run_filter(skb, is->pass_filter, is->pass_len) == 0) {
1156 if (is->debug & 0x2)
1157 printk(KERN_DEBUG "IPPP: inbound frame filtered.\n");
1158 kfree_skb(skb);
1159 return;
1161 if (!(is->active_filter
1162 && sk_run_filter(skb, is->active_filter,
1163 is->active_len) == 0)) {
1164 if (is->debug & 0x2)
1165 printk(KERN_DEBUG "IPPP: link-active filter: reseting huptimer.\n");
1166 lp->huptimer = 0;
1167 if (mlp)
1168 mlp->huptimer = 0;
1170 skb_pull(skb, 4);
1171 #else /* CONFIG_IPPP_FILTER */
1172 lp->huptimer = 0;
1173 if (mlp)
1174 mlp->huptimer = 0;
1175 #endif /* CONFIG_IPPP_FILTER */
1176 skb->dev = dev;
1177 skb_reset_mac_header(skb);
1178 netif_rx(skb);
1179 /* net_dev->local->stats.rx_packets++; done in isdn_net.c */
1180 return;
1182 drop_packet:
1183 net_dev->local->stats.rx_dropped++;
1184 kfree_skb(skb);
1188 * isdn_ppp_skb_push ..
1189 * checks whether we have enough space at the beginning of the skb
1190 * and allocs a new SKB if necessary
1192 static unsigned char *isdn_ppp_skb_push(struct sk_buff **skb_p,int len)
1194 struct sk_buff *skb = *skb_p;
1196 if(skb_headroom(skb) < len) {
1197 struct sk_buff *nskb = skb_realloc_headroom(skb, len);
1199 if (!nskb) {
1200 printk(KERN_ERR "isdn_ppp_skb_push: can't realloc headroom!\n");
1201 dev_kfree_skb(skb);
1202 return NULL;
1204 printk(KERN_DEBUG "isdn_ppp_skb_push:under %d %d\n",skb_headroom(skb),len);
1205 dev_kfree_skb(skb);
1206 *skb_p = nskb;
1207 return skb_push(nskb, len);
1209 return skb_push(skb,len);
1213 * send ppp frame .. we expect a PIDCOMPressable proto --
1214 * (here: currently always PPP_IP,PPP_VJC_COMP,PPP_VJC_UNCOMP)
1216 * VJ compression may change skb pointer!!! .. requeue with old
1217 * skb isn't allowed!!
1221 isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
1223 isdn_net_local *lp,*mlp;
1224 isdn_net_dev *nd;
1225 unsigned int proto = PPP_IP; /* 0x21 */
1226 struct ippp_struct *ipt,*ipts;
1227 int slot, retval = NETDEV_TX_OK;
1229 mlp = (isdn_net_local *) netdev_priv(netdev);
1230 nd = mlp->netdev; /* get master lp */
1232 slot = mlp->ppp_slot;
1233 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1234 printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1235 mlp->ppp_slot);
1236 kfree_skb(skb);
1237 goto out;
1239 ipts = ippp_table[slot];
1241 if (!(ipts->pppcfg & SC_ENABLE_IP)) { /* PPP connected ? */
1242 if (ipts->debug & 0x1)
1243 printk(KERN_INFO "%s: IP frame delayed.\n", netdev->name);
1244 retval = NETDEV_TX_BUSY;
1245 goto out;
1248 switch (ntohs(skb->protocol)) {
1249 case ETH_P_IP:
1250 proto = PPP_IP;
1251 break;
1252 case ETH_P_IPX:
1253 proto = PPP_IPX; /* untested */
1254 break;
1255 default:
1256 printk(KERN_ERR "isdn_ppp: skipped unsupported protocol: %#x.\n",
1257 skb->protocol);
1258 dev_kfree_skb(skb);
1259 goto out;
1262 lp = isdn_net_get_locked_lp(nd);
1263 if (!lp) {
1264 printk(KERN_WARNING "%s: all channels busy - requeuing!\n", netdev->name);
1265 retval = NETDEV_TX_BUSY;
1266 goto out;
1268 /* we have our lp locked from now on */
1270 slot = lp->ppp_slot;
1271 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1272 printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1273 lp->ppp_slot);
1274 kfree_skb(skb);
1275 goto unlock;
1277 ipt = ippp_table[slot];
1280 * after this line .. requeueing in the device queue is no longer allowed!!!
1283 /* Pull off the fake header we stuck on earlier to keep
1284 * the fragmentation code happy.
1286 skb_pull(skb,IPPP_MAX_HEADER);
1288 #ifdef CONFIG_IPPP_FILTER
1289 /* check if we should pass this packet
1290 * the filter instructions are constructed assuming
1291 * a four-byte PPP header on each packet */
1292 *skb_push(skb, 4) = 1; /* indicate outbound */
1295 __be16 *p = (__be16 *)skb->data;
1297 p++;
1298 *p = htons(proto);
1301 if (ipt->pass_filter
1302 && sk_run_filter(skb, ipt->pass_filter, ipt->pass_len) == 0) {
1303 if (ipt->debug & 0x4)
1304 printk(KERN_DEBUG "IPPP: outbound frame filtered.\n");
1305 kfree_skb(skb);
1306 goto unlock;
1308 if (!(ipt->active_filter
1309 && sk_run_filter(skb, ipt->active_filter,
1310 ipt->active_len) == 0)) {
1311 if (ipt->debug & 0x4)
1312 printk(KERN_DEBUG "IPPP: link-active filter: reseting huptimer.\n");
1313 lp->huptimer = 0;
1315 skb_pull(skb, 4);
1316 #else /* CONFIG_IPPP_FILTER */
1317 lp->huptimer = 0;
1318 #endif /* CONFIG_IPPP_FILTER */
1320 if (ipt->debug & 0x4)
1321 printk(KERN_DEBUG "xmit skb, len %d\n", (int) skb->len);
1322 if (ipts->debug & 0x40)
1323 isdn_ppp_frame_log("xmit0", skb->data, skb->len, 32,ipts->unit,lp->ppp_slot);
1325 #ifdef CONFIG_ISDN_PPP_VJ
1326 if (proto == PPP_IP && ipts->pppcfg & SC_COMP_TCP) { /* ipts here? probably yes, but check this again */
1327 struct sk_buff *new_skb;
1328 unsigned short hl;
1330 * we need to reserve enough space in front of
1331 * sk_buff. old call to dev_alloc_skb only reserved
1332 * 16 bytes, now we are looking what the driver want.
1334 hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen + IPPP_MAX_HEADER;
1336 * Note: hl might still be insufficient because the method
1337 * above does not account for a possibible MPPP slave channel
1338 * which had larger HL header space requirements than the
1339 * master.
1341 new_skb = alloc_skb(hl+skb->len, GFP_ATOMIC);
1342 if (new_skb) {
1343 u_char *buf;
1344 int pktlen;
1346 skb_reserve(new_skb, hl);
1347 new_skb->dev = skb->dev;
1348 skb_put(new_skb, skb->len);
1349 buf = skb->data;
1351 pktlen = slhc_compress(ipts->slcomp, skb->data, skb->len, new_skb->data,
1352 &buf, !(ipts->pppcfg & SC_NO_TCP_CCID));
1354 if (buf != skb->data) {
1355 if (new_skb->data != buf)
1356 printk(KERN_ERR "isdn_ppp: FATAL error after slhc_compress!!\n");
1357 dev_kfree_skb(skb);
1358 skb = new_skb;
1359 } else {
1360 dev_kfree_skb(new_skb);
1363 skb_trim(skb, pktlen);
1364 if (skb->data[0] & SL_TYPE_COMPRESSED_TCP) { /* cslip? style -> PPP */
1365 proto = PPP_VJC_COMP;
1366 skb->data[0] ^= SL_TYPE_COMPRESSED_TCP;
1367 } else {
1368 if (skb->data[0] >= SL_TYPE_UNCOMPRESSED_TCP)
1369 proto = PPP_VJC_UNCOMP;
1370 skb->data[0] = (skb->data[0] & 0x0f) | 0x40;
1374 #endif
1377 * normal (single link) or bundle compression
1379 if(ipts->compflags & SC_COMP_ON) {
1380 /* We send compressed only if both down- und upstream
1381 compression is negotiated, that means, CCP is up */
1382 if(ipts->compflags & SC_DECOMP_ON) {
1383 skb = isdn_ppp_compress(skb,&proto,ipt,ipts,0);
1384 } else {
1385 printk(KERN_DEBUG "isdn_ppp: CCP not yet up - sending as-is\n");
1389 if (ipt->debug & 0x24)
1390 printk(KERN_DEBUG "xmit2 skb, len %d, proto %04x\n", (int) skb->len, proto);
1392 #ifdef CONFIG_ISDN_MPP
1393 if (ipt->mpppcfg & SC_MP_PROT) {
1394 /* we get mp_seqno from static isdn_net_local */
1395 long mp_seqno = ipts->mp_seqno;
1396 ipts->mp_seqno++;
1397 if (ipt->mpppcfg & SC_OUT_SHORT_SEQ) {
1398 unsigned char *data = isdn_ppp_skb_push(&skb, 3);
1399 if(!data)
1400 goto unlock;
1401 mp_seqno &= 0xfff;
1402 data[0] = MP_BEGIN_FRAG | MP_END_FRAG | ((mp_seqno >> 8) & 0xf); /* (B)egin & (E)ndbit .. */
1403 data[1] = mp_seqno & 0xff;
1404 data[2] = proto; /* PID compression */
1405 } else {
1406 unsigned char *data = isdn_ppp_skb_push(&skb, 5);
1407 if(!data)
1408 goto unlock;
1409 data[0] = MP_BEGIN_FRAG | MP_END_FRAG; /* (B)egin & (E)ndbit .. */
1410 data[1] = (mp_seqno >> 16) & 0xff; /* sequence number: 24bit */
1411 data[2] = (mp_seqno >> 8) & 0xff;
1412 data[3] = (mp_seqno >> 0) & 0xff;
1413 data[4] = proto; /* PID compression */
1415 proto = PPP_MP; /* MP Protocol, 0x003d */
1417 #endif
1420 * 'link in bundle' compression ...
1422 if(ipt->compflags & SC_LINK_COMP_ON)
1423 skb = isdn_ppp_compress(skb,&proto,ipt,ipts,1);
1425 if( (ipt->pppcfg & SC_COMP_PROT) && (proto <= 0xff) ) {
1426 unsigned char *data = isdn_ppp_skb_push(&skb,1);
1427 if(!data)
1428 goto unlock;
1429 data[0] = proto & 0xff;
1431 else {
1432 unsigned char *data = isdn_ppp_skb_push(&skb,2);
1433 if(!data)
1434 goto unlock;
1435 data[0] = (proto >> 8) & 0xff;
1436 data[1] = proto & 0xff;
1438 if(!(ipt->pppcfg & SC_COMP_AC)) {
1439 unsigned char *data = isdn_ppp_skb_push(&skb,2);
1440 if(!data)
1441 goto unlock;
1442 data[0] = 0xff; /* All Stations */
1443 data[1] = 0x03; /* Unnumbered information */
1446 /* tx-stats are now updated via BSENT-callback */
1448 if (ipts->debug & 0x40) {
1449 printk(KERN_DEBUG "skb xmit: len: %d\n", (int) skb->len);
1450 isdn_ppp_frame_log("xmit", skb->data, skb->len, 32,ipt->unit,lp->ppp_slot);
1453 isdn_net_writebuf_skb(lp, skb);
1455 unlock:
1456 spin_unlock_bh(&lp->xmit_lock);
1457 out:
1458 return retval;
1461 #ifdef CONFIG_IPPP_FILTER
1463 * check if this packet may trigger auto-dial.
1466 int isdn_ppp_autodial_filter(struct sk_buff *skb, isdn_net_local *lp)
1468 struct ippp_struct *is = ippp_table[lp->ppp_slot];
1469 u_int16_t proto;
1470 int drop = 0;
1472 switch (ntohs(skb->protocol)) {
1473 case ETH_P_IP:
1474 proto = PPP_IP;
1475 break;
1476 case ETH_P_IPX:
1477 proto = PPP_IPX;
1478 break;
1479 default:
1480 printk(KERN_ERR "isdn_ppp_autodial_filter: unsupported protocol 0x%x.\n",
1481 skb->protocol);
1482 return 1;
1485 /* the filter instructions are constructed assuming
1486 * a four-byte PPP header on each packet. we have to
1487 * temporarily remove part of the fake header stuck on
1488 * earlier.
1490 *skb_pull(skb, IPPP_MAX_HEADER - 4) = 1; /* indicate outbound */
1493 __be16 *p = (__be16 *)skb->data;
1495 p++;
1496 *p = htons(proto);
1499 drop |= is->pass_filter
1500 && sk_run_filter(skb, is->pass_filter, is->pass_len) == 0;
1501 drop |= is->active_filter
1502 && sk_run_filter(skb, is->active_filter, is->active_len) == 0;
1504 skb_push(skb, IPPP_MAX_HEADER - 4);
1505 return drop;
1507 #endif
1508 #ifdef CONFIG_ISDN_MPP
1510 /* this is _not_ rfc1990 header, but something we convert both short and long
1511 * headers to for convinience's sake:
1512 * byte 0 is flags as in rfc1990
1513 * bytes 1...4 is 24-bit seqence number converted to host byte order
1515 #define MP_HEADER_LEN 5
1517 #define MP_LONGSEQ_MASK 0x00ffffff
1518 #define MP_SHORTSEQ_MASK 0x00000fff
1519 #define MP_LONGSEQ_MAX MP_LONGSEQ_MASK
1520 #define MP_SHORTSEQ_MAX MP_SHORTSEQ_MASK
1521 #define MP_LONGSEQ_MAXBIT ((MP_LONGSEQ_MASK+1)>>1)
1522 #define MP_SHORTSEQ_MAXBIT ((MP_SHORTSEQ_MASK+1)>>1)
1524 /* sequence-wrap safe comparisions (for long sequence)*/
1525 #define MP_LT(a,b) ((a-b)&MP_LONGSEQ_MAXBIT)
1526 #define MP_LE(a,b) !((b-a)&MP_LONGSEQ_MAXBIT)
1527 #define MP_GT(a,b) ((b-a)&MP_LONGSEQ_MAXBIT)
1528 #define MP_GE(a,b) !((a-b)&MP_LONGSEQ_MAXBIT)
1530 #define MP_SEQ(f) ((*(u32*)(f->data+1)))
1531 #define MP_FLAGS(f) (f->data[0])
1533 static int isdn_ppp_mp_bundle_array_init(void)
1535 int i;
1536 int sz = ISDN_MAX_CHANNELS*sizeof(ippp_bundle);
1537 if( (isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL )
1538 return -ENOMEM;
1539 for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
1540 spin_lock_init(&isdn_ppp_bundle_arr[i].lock);
1541 return 0;
1544 static ippp_bundle * isdn_ppp_mp_bundle_alloc(void)
1546 int i;
1547 for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
1548 if (isdn_ppp_bundle_arr[i].ref_ct <= 0)
1549 return (isdn_ppp_bundle_arr + i);
1550 return NULL;
1553 static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
1555 struct ippp_struct * is;
1557 if (lp->ppp_slot < 0) {
1558 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
1559 __func__, lp->ppp_slot);
1560 return(-EINVAL);
1563 is = ippp_table[lp->ppp_slot];
1564 if (add_to) {
1565 if( lp->netdev->pb )
1566 lp->netdev->pb->ref_ct--;
1567 lp->netdev->pb = add_to;
1568 } else { /* first link in a bundle */
1569 is->mp_seqno = 0;
1570 if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL)
1571 return -ENOMEM;
1572 lp->next = lp->last = lp; /* nobody else in a queue */
1573 lp->netdev->pb->frags = NULL;
1574 lp->netdev->pb->frames = 0;
1575 lp->netdev->pb->seq = UINT_MAX;
1577 lp->netdev->pb->ref_ct++;
1579 is->last_link_seqno = 0;
1580 return 0;
1583 static u32 isdn_ppp_mp_get_seq( int short_seq,
1584 struct sk_buff * skb, u32 last_seq );
1585 static struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
1586 struct sk_buff * from, struct sk_buff * to );
1587 static void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
1588 struct sk_buff * from, struct sk_buff * to );
1589 static void isdn_ppp_mp_free_skb( ippp_bundle * mp, struct sk_buff * skb );
1590 static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb );
1592 static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
1593 struct sk_buff *skb)
1595 struct ippp_struct *is;
1596 isdn_net_local * lpq;
1597 ippp_bundle * mp;
1598 isdn_mppp_stats * stats;
1599 struct sk_buff * newfrag, * frag, * start, *nextf;
1600 u32 newseq, minseq, thisseq;
1601 unsigned long flags;
1602 int slot;
1604 spin_lock_irqsave(&net_dev->pb->lock, flags);
1605 mp = net_dev->pb;
1606 stats = &mp->stats;
1607 slot = lp->ppp_slot;
1608 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1609 printk(KERN_ERR "%s: lp->ppp_slot(%d)\n",
1610 __func__, lp->ppp_slot);
1611 stats->frame_drops++;
1612 dev_kfree_skb(skb);
1613 spin_unlock_irqrestore(&mp->lock, flags);
1614 return;
1616 is = ippp_table[slot];
1617 if( ++mp->frames > stats->max_queue_len )
1618 stats->max_queue_len = mp->frames;
1620 if (is->debug & 0x8)
1621 isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb);
1623 newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ,
1624 skb, is->last_link_seqno);
1627 /* if this packet seq # is less than last already processed one,
1628 * toss it right away, but check for sequence start case first
1630 if( mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT) ) {
1631 mp->seq = newseq; /* the first packet: required for
1632 * rfc1990 non-compliant clients --
1633 * prevents constant packet toss */
1634 } else if( MP_LT(newseq, mp->seq) ) {
1635 stats->frame_drops++;
1636 isdn_ppp_mp_free_skb(mp, skb);
1637 spin_unlock_irqrestore(&mp->lock, flags);
1638 return;
1641 /* find the minimum received sequence number over all links */
1642 is->last_link_seqno = minseq = newseq;
1643 for (lpq = net_dev->queue;;) {
1644 slot = lpq->ppp_slot;
1645 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1646 printk(KERN_ERR "%s: lpq->ppp_slot(%d)\n",
1647 __func__, lpq->ppp_slot);
1648 } else {
1649 u32 lls = ippp_table[slot]->last_link_seqno;
1650 if (MP_LT(lls, minseq))
1651 minseq = lls;
1653 if ((lpq = lpq->next) == net_dev->queue)
1654 break;
1656 if (MP_LT(minseq, mp->seq))
1657 minseq = mp->seq; /* can't go beyond already processed
1658 * packets */
1659 newfrag = skb;
1661 /* if this new fragment is before the first one, then enqueue it now. */
1662 if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) {
1663 newfrag->next = frag;
1664 mp->frags = frag = newfrag;
1665 newfrag = NULL;
1668 start = MP_FLAGS(frag) & MP_BEGIN_FRAG &&
1669 MP_SEQ(frag) == mp->seq ? frag : NULL;
1672 * main fragment traversing loop
1674 * try to accomplish several tasks:
1675 * - insert new fragment into the proper sequence slot (once that's done
1676 * newfrag will be set to NULL)
1677 * - reassemble any complete fragment sequence (non-null 'start'
1678 * indicates there is a contiguous sequence present)
1679 * - discard any incomplete sequences that are below minseq -- due
1680 * to the fact that sender always increment sequence number, if there
1681 * is an incomplete sequence below minseq, no new fragments would
1682 * come to complete such sequence and it should be discarded
1684 * loop completes when we accomplished the following tasks:
1685 * - new fragment is inserted in the proper sequence ('newfrag' is
1686 * set to NULL)
1687 * - we hit a gap in the sequence, so no reassembly/processing is
1688 * possible ('start' would be set to NULL)
1690 * algorithm for this code is derived from code in the book
1691 * 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
1693 while (start != NULL || newfrag != NULL) {
1695 thisseq = MP_SEQ(frag);
1696 nextf = frag->next;
1698 /* drop any duplicate fragments */
1699 if (newfrag != NULL && thisseq == newseq) {
1700 isdn_ppp_mp_free_skb(mp, newfrag);
1701 newfrag = NULL;
1704 /* insert new fragment before next element if possible. */
1705 if (newfrag != NULL && (nextf == NULL ||
1706 MP_LT(newseq, MP_SEQ(nextf)))) {
1707 newfrag->next = nextf;
1708 frag->next = nextf = newfrag;
1709 newfrag = NULL;
1712 if (start != NULL) {
1713 /* check for misplaced start */
1714 if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
1715 printk(KERN_WARNING"isdn_mppp(seq %d): new "
1716 "BEGIN flag with no prior END", thisseq);
1717 stats->seqerrs++;
1718 stats->frame_drops++;
1719 start = isdn_ppp_mp_discard(mp, start,frag);
1720 nextf = frag->next;
1722 } else if (MP_LE(thisseq, minseq)) {
1723 if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
1724 start = frag;
1725 else {
1726 if (MP_FLAGS(frag) & MP_END_FRAG)
1727 stats->frame_drops++;
1728 if( mp->frags == frag )
1729 mp->frags = nextf;
1730 isdn_ppp_mp_free_skb(mp, frag);
1731 frag = nextf;
1732 continue;
1736 /* if start is non-null and we have end fragment, then
1737 * we have full reassembly sequence -- reassemble
1738 * and process packet now
1740 if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) {
1741 minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK;
1742 /* Reassemble the packet then dispatch it */
1743 isdn_ppp_mp_reassembly(net_dev, lp, start, nextf);
1745 start = NULL;
1746 frag = NULL;
1748 mp->frags = nextf;
1751 /* check if need to update start pointer: if we just
1752 * reassembled the packet and sequence is contiguous
1753 * then next fragment should be the start of new reassembly
1754 * if sequence is contiguous, but we haven't reassembled yet,
1755 * keep going.
1756 * if sequence is not contiguous, either clear everyting
1757 * below low watermark and set start to the next frag or
1758 * clear start ptr.
1760 if (nextf != NULL &&
1761 ((thisseq+1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) {
1762 /* if we just reassembled and the next one is here,
1763 * then start another reassembly. */
1765 if (frag == NULL) {
1766 if (MP_FLAGS(nextf) & MP_BEGIN_FRAG)
1767 start = nextf;
1768 else
1770 printk(KERN_WARNING"isdn_mppp(seq %d):"
1771 " END flag with no following "
1772 "BEGIN", thisseq);
1773 stats->seqerrs++;
1777 } else {
1778 if ( nextf != NULL && frag != NULL &&
1779 MP_LT(thisseq, minseq)) {
1780 /* we've got a break in the sequence
1781 * and we not at the end yet
1782 * and we did not just reassembled
1783 *(if we did, there wouldn't be anything before)
1784 * and we below the low watermark
1785 * discard all the frames below low watermark
1786 * and start over */
1787 stats->frame_drops++;
1788 mp->frags = isdn_ppp_mp_discard(mp,start,nextf);
1790 /* break in the sequence, no reassembly */
1791 start = NULL;
1794 frag = nextf;
1795 } /* while -- main loop */
1797 if (mp->frags == NULL)
1798 mp->frags = frag;
1800 /* rather straighforward way to deal with (not very) possible
1801 * queue overflow */
1802 if (mp->frames > MP_MAX_QUEUE_LEN) {
1803 stats->overflows++;
1804 while (mp->frames > MP_MAX_QUEUE_LEN) {
1805 frag = mp->frags->next;
1806 isdn_ppp_mp_free_skb(mp, mp->frags);
1807 mp->frags = frag;
1810 spin_unlock_irqrestore(&mp->lock, flags);
1813 static void isdn_ppp_mp_cleanup( isdn_net_local * lp )
1815 struct sk_buff * frag = lp->netdev->pb->frags;
1816 struct sk_buff * nextfrag;
1817 while( frag ) {
1818 nextfrag = frag->next;
1819 isdn_ppp_mp_free_skb(lp->netdev->pb, frag);
1820 frag = nextfrag;
1822 lp->netdev->pb->frags = NULL;
1825 static u32 isdn_ppp_mp_get_seq( int short_seq,
1826 struct sk_buff * skb, u32 last_seq )
1828 u32 seq;
1829 int flags = skb->data[0] & (MP_BEGIN_FRAG | MP_END_FRAG);
1831 if( !short_seq )
1833 seq = ntohl(*(__be32 *)skb->data) & MP_LONGSEQ_MASK;
1834 skb_push(skb,1);
1836 else
1838 /* convert 12-bit short seq number to 24-bit long one
1840 seq = ntohs(*(__be16 *)skb->data) & MP_SHORTSEQ_MASK;
1842 /* check for seqence wrap */
1843 if( !(seq & MP_SHORTSEQ_MAXBIT) &&
1844 (last_seq & MP_SHORTSEQ_MAXBIT) &&
1845 (unsigned long)last_seq <= MP_LONGSEQ_MAX )
1846 seq |= (last_seq + MP_SHORTSEQ_MAX+1) &
1847 (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
1848 else
1849 seq |= last_seq & (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
1851 skb_push(skb, 3); /* put converted seqence back in skb */
1853 *(u32*)(skb->data+1) = seq; /* put seqence back in _host_ byte
1854 * order */
1855 skb->data[0] = flags; /* restore flags */
1856 return seq;
1859 struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
1860 struct sk_buff * from, struct sk_buff * to )
1862 if( from )
1863 while (from != to) {
1864 struct sk_buff * next = from->next;
1865 isdn_ppp_mp_free_skb(mp, from);
1866 from = next;
1868 return from;
1871 void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
1872 struct sk_buff * from, struct sk_buff * to )
1874 ippp_bundle * mp = net_dev->pb;
1875 int proto;
1876 struct sk_buff * skb;
1877 unsigned int tot_len;
1879 if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
1880 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
1881 __func__, lp->ppp_slot);
1882 return;
1884 if( MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG) ) {
1885 if( ippp_table[lp->ppp_slot]->debug & 0x40 )
1886 printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, "
1887 "len %d\n", MP_SEQ(from), from->len );
1888 skb = from;
1889 skb_pull(skb, MP_HEADER_LEN);
1890 mp->frames--;
1891 } else {
1892 struct sk_buff * frag;
1893 int n;
1895 for(tot_len=n=0, frag=from; frag != to; frag=frag->next, n++)
1896 tot_len += frag->len - MP_HEADER_LEN;
1898 if( ippp_table[lp->ppp_slot]->debug & 0x40 )
1899 printk(KERN_DEBUG"isdn_mppp: reassembling frames %d "
1900 "to %d, len %d\n", MP_SEQ(from),
1901 (MP_SEQ(from)+n-1) & MP_LONGSEQ_MASK, tot_len );
1902 if( (skb = dev_alloc_skb(tot_len)) == NULL ) {
1903 printk(KERN_ERR "isdn_mppp: cannot allocate sk buff "
1904 "of size %d\n", tot_len);
1905 isdn_ppp_mp_discard(mp, from, to);
1906 return;
1909 while( from != to ) {
1910 unsigned int len = from->len - MP_HEADER_LEN;
1912 skb_copy_from_linear_data_offset(from, MP_HEADER_LEN,
1913 skb_put(skb,len),
1914 len);
1915 frag = from->next;
1916 isdn_ppp_mp_free_skb(mp, from);
1917 from = frag;
1920 proto = isdn_ppp_strip_proto(skb);
1921 isdn_ppp_push_higher(net_dev, lp, skb, proto);
1924 static void isdn_ppp_mp_free_skb(ippp_bundle * mp, struct sk_buff * skb)
1926 dev_kfree_skb(skb);
1927 mp->frames--;
1930 static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb )
1932 printk(KERN_DEBUG "mp_recv: %d/%d -> %02x %02x %02x %02x %02x %02x\n",
1933 slot, (int) skb->len,
1934 (int) skb->data[0], (int) skb->data[1], (int) skb->data[2],
1935 (int) skb->data[3], (int) skb->data[4], (int) skb->data[5]);
1938 static int
1939 isdn_ppp_bundle(struct ippp_struct *is, int unit)
1941 char ifn[IFNAMSIZ + 1];
1942 isdn_net_dev *p;
1943 isdn_net_local *lp, *nlp;
1944 int rc;
1945 unsigned long flags;
1947 sprintf(ifn, "ippp%d", unit);
1948 p = isdn_net_findif(ifn);
1949 if (!p) {
1950 printk(KERN_ERR "ippp_bundle: cannot find %s\n", ifn);
1951 return -EINVAL;
1954 spin_lock_irqsave(&p->pb->lock, flags);
1956 nlp = is->lp;
1957 lp = p->queue;
1958 if( nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ||
1959 lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS ) {
1960 printk(KERN_ERR "ippp_bundle: binding to invalid slot %d\n",
1961 nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ?
1962 nlp->ppp_slot : lp->ppp_slot );
1963 rc = -EINVAL;
1964 goto out;
1967 isdn_net_add_to_bundle(p, nlp);
1969 ippp_table[nlp->ppp_slot]->unit = ippp_table[lp->ppp_slot]->unit;
1971 /* maybe also SC_CCP stuff */
1972 ippp_table[nlp->ppp_slot]->pppcfg |= ippp_table[lp->ppp_slot]->pppcfg &
1973 (SC_ENABLE_IP | SC_NO_TCP_CCID | SC_REJ_COMP_TCP);
1974 ippp_table[nlp->ppp_slot]->mpppcfg |= ippp_table[lp->ppp_slot]->mpppcfg &
1975 (SC_MP_PROT | SC_REJ_MP_PROT | SC_OUT_SHORT_SEQ | SC_IN_SHORT_SEQ);
1976 rc = isdn_ppp_mp_init(nlp, p->pb);
1977 out:
1978 spin_unlock_irqrestore(&p->pb->lock, flags);
1979 return rc;
1982 #endif /* CONFIG_ISDN_MPP */
1985 * network device ioctl handlers
1988 static int
1989 isdn_ppp_dev_ioctl_stats(int slot, struct ifreq *ifr, struct net_device *dev)
1991 struct ppp_stats __user *res = ifr->ifr_data;
1992 struct ppp_stats t;
1993 isdn_net_local *lp = (isdn_net_local *) netdev_priv(dev);
1995 if (!access_ok(VERIFY_WRITE, res, sizeof(struct ppp_stats)))
1996 return -EFAULT;
1998 /* build a temporary stat struct and copy it to user space */
2000 memset(&t, 0, sizeof(struct ppp_stats));
2001 if (dev->flags & IFF_UP) {
2002 t.p.ppp_ipackets = lp->stats.rx_packets;
2003 t.p.ppp_ibytes = lp->stats.rx_bytes;
2004 t.p.ppp_ierrors = lp->stats.rx_errors;
2005 t.p.ppp_opackets = lp->stats.tx_packets;
2006 t.p.ppp_obytes = lp->stats.tx_bytes;
2007 t.p.ppp_oerrors = lp->stats.tx_errors;
2008 #ifdef CONFIG_ISDN_PPP_VJ
2009 if (slot >= 0 && ippp_table[slot]->slcomp) {
2010 struct slcompress *slcomp = ippp_table[slot]->slcomp;
2011 t.vj.vjs_packets = slcomp->sls_o_compressed + slcomp->sls_o_uncompressed;
2012 t.vj.vjs_compressed = slcomp->sls_o_compressed;
2013 t.vj.vjs_searches = slcomp->sls_o_searches;
2014 t.vj.vjs_misses = slcomp->sls_o_misses;
2015 t.vj.vjs_errorin = slcomp->sls_i_error;
2016 t.vj.vjs_tossed = slcomp->sls_i_tossed;
2017 t.vj.vjs_uncompressedin = slcomp->sls_i_uncompressed;
2018 t.vj.vjs_compressedin = slcomp->sls_i_compressed;
2020 #endif
2022 if (copy_to_user(res, &t, sizeof(struct ppp_stats)))
2023 return -EFAULT;
2024 return 0;
2028 isdn_ppp_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2030 int error=0;
2031 int len;
2032 isdn_net_local *lp = (isdn_net_local *) netdev_priv(dev);
2035 if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
2036 return -EINVAL;
2038 switch (cmd) {
2039 #define PPP_VERSION "2.3.7"
2040 case SIOCGPPPVER:
2041 len = strlen(PPP_VERSION) + 1;
2042 if (copy_to_user(ifr->ifr_data, PPP_VERSION, len))
2043 error = -EFAULT;
2044 break;
2046 case SIOCGPPPSTATS:
2047 error = isdn_ppp_dev_ioctl_stats(lp->ppp_slot, ifr, dev);
2048 break;
2049 default:
2050 error = -EINVAL;
2051 break;
2053 return error;
2056 static int
2057 isdn_ppp_if_get_unit(char *name)
2059 int len,
2061 unit = 0,
2062 deci;
2064 len = strlen(name);
2066 if (strncmp("ippp", name, 4) || len > 8)
2067 return -1;
2069 for (i = 0, deci = 1; i < len; i++, deci *= 10) {
2070 char a = name[len - i - 1];
2071 if (a >= '0' && a <= '9')
2072 unit += (a - '0') * deci;
2073 else
2074 break;
2076 if (!i || len - i != 4)
2077 unit = -1;
2079 return unit;
2084 isdn_ppp_dial_slave(char *name)
2086 #ifdef CONFIG_ISDN_MPP
2087 isdn_net_dev *ndev;
2088 isdn_net_local *lp;
2089 struct net_device *sdev;
2091 if (!(ndev = isdn_net_findif(name)))
2092 return 1;
2093 lp = ndev->local;
2094 if (!(lp->flags & ISDN_NET_CONNECTED))
2095 return 5;
2097 sdev = lp->slave;
2098 while (sdev) {
2099 isdn_net_local *mlp = (isdn_net_local *) netdev_priv(sdev);
2100 if (!(mlp->flags & ISDN_NET_CONNECTED))
2101 break;
2102 sdev = mlp->slave;
2104 if (!sdev)
2105 return 2;
2107 isdn_net_dial_req((isdn_net_local *) netdev_priv(sdev));
2108 return 0;
2109 #else
2110 return -1;
2111 #endif
2115 isdn_ppp_hangup_slave(char *name)
2117 #ifdef CONFIG_ISDN_MPP
2118 isdn_net_dev *ndev;
2119 isdn_net_local *lp;
2120 struct net_device *sdev;
2122 if (!(ndev = isdn_net_findif(name)))
2123 return 1;
2124 lp = ndev->local;
2125 if (!(lp->flags & ISDN_NET_CONNECTED))
2126 return 5;
2128 sdev = lp->slave;
2129 while (sdev) {
2130 isdn_net_local *mlp = (isdn_net_local *) netdev_priv(sdev);
2132 if (mlp->slave) { /* find last connected link in chain */
2133 isdn_net_local *nlp = ISDN_SLAVE_PRIV(mlp);
2135 if (!(nlp->flags & ISDN_NET_CONNECTED))
2136 break;
2137 } else if (mlp->flags & ISDN_NET_CONNECTED)
2138 break;
2140 sdev = mlp->slave;
2142 if (!sdev)
2143 return 2;
2145 isdn_net_hangup(sdev);
2146 return 0;
2147 #else
2148 return -1;
2149 #endif
2153 * PPP compression stuff
2157 /* Push an empty CCP Data Frame up to the daemon to wake it up and let it
2158 generate a CCP Reset-Request or tear down CCP altogether */
2160 static void isdn_ppp_ccp_kickup(struct ippp_struct *is)
2162 isdn_ppp_fill_rq(NULL, 0, PPP_COMP, is->lp->ppp_slot);
2165 /* In-kernel handling of CCP Reset-Request and Reset-Ack is necessary,
2166 but absolutely nontrivial. The most abstruse problem we are facing is
2167 that the generation, reception and all the handling of timeouts and
2168 resends including proper request id management should be entirely left
2169 to the (de)compressor, but indeed is not covered by the current API to
2170 the (de)compressor. The API is a prototype version from PPP where only
2171 some (de)compressors have yet been implemented and all of them are
2172 rather simple in their reset handling. Especially, their is only one
2173 outstanding ResetAck at a time with all of them and ResetReq/-Acks do
2174 not have parameters. For this very special case it was sufficient to
2175 just return an error code from the decompressor and have a single
2176 reset() entry to communicate all the necessary information between
2177 the framework and the (de)compressor. Bad enough, LZS is different
2178 (and any other compressor may be different, too). It has multiple
2179 histories (eventually) and needs to Reset each of them independently
2180 and thus uses multiple outstanding Acks and history numbers as an
2181 additional parameter to Reqs/Acks.
2182 All that makes it harder to port the reset state engine into the
2183 kernel because it is not just the same simple one as in (i)pppd but
2184 it must be able to pass additional parameters and have multiple out-
2185 standing Acks. We are trying to achieve the impossible by handling
2186 reset transactions independent by their id. The id MUST change when
2187 the data portion changes, thus any (de)compressor who uses more than
2188 one resettable state must provide and recognize individual ids for
2189 each individual reset transaction. The framework itself does _only_
2190 differentiate them by id, because it has no other semantics like the
2191 (de)compressor might.
2192 This looks like a major redesign of the interface would be nice,
2193 but I don't have an idea how to do it better. */
2195 /* Send a CCP Reset-Request or Reset-Ack directly from the kernel. This is
2196 getting that lengthy because there is no simple "send-this-frame-out"
2197 function above but every wrapper does a bit different. Hope I guess
2198 correct in this hack... */
2200 static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
2201 unsigned char code, unsigned char id,
2202 unsigned char *data, int len)
2204 struct sk_buff *skb;
2205 unsigned char *p;
2206 int hl;
2207 int cnt = 0;
2208 isdn_net_local *lp = is->lp;
2210 /* Alloc large enough skb */
2211 hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
2212 skb = alloc_skb(len + hl + 16,GFP_ATOMIC);
2213 if(!skb) {
2214 printk(KERN_WARNING
2215 "ippp: CCP cannot send reset - out of memory\n");
2216 return;
2218 skb_reserve(skb, hl);
2220 /* We may need to stuff an address and control field first */
2221 if(!(is->pppcfg & SC_COMP_AC)) {
2222 p = skb_put(skb, 2);
2223 *p++ = 0xff;
2224 *p++ = 0x03;
2227 /* Stuff proto, code, id and length */
2228 p = skb_put(skb, 6);
2229 *p++ = (proto >> 8);
2230 *p++ = (proto & 0xff);
2231 *p++ = code;
2232 *p++ = id;
2233 cnt = 4 + len;
2234 *p++ = (cnt >> 8);
2235 *p++ = (cnt & 0xff);
2237 /* Now stuff remaining bytes */
2238 if(len) {
2239 p = skb_put(skb, len);
2240 memcpy(p, data, len);
2243 /* skb is now ready for xmit */
2244 printk(KERN_DEBUG "Sending CCP Frame:\n");
2245 isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
2247 isdn_net_write_super(lp, skb);
2250 /* Allocate the reset state vector */
2251 static struct ippp_ccp_reset *isdn_ppp_ccp_reset_alloc(struct ippp_struct *is)
2253 struct ippp_ccp_reset *r;
2254 r = kzalloc(sizeof(struct ippp_ccp_reset), GFP_KERNEL);
2255 if(!r) {
2256 printk(KERN_ERR "ippp_ccp: failed to allocate reset data"
2257 " structure - no mem\n");
2258 return NULL;
2260 printk(KERN_DEBUG "ippp_ccp: allocated reset data structure %p\n", r);
2261 is->reset = r;
2262 return r;
2265 /* Destroy the reset state vector. Kill all pending timers first. */
2266 static void isdn_ppp_ccp_reset_free(struct ippp_struct *is)
2268 unsigned int id;
2270 printk(KERN_DEBUG "ippp_ccp: freeing reset data structure %p\n",
2271 is->reset);
2272 for(id = 0; id < 256; id++) {
2273 if(is->reset->rs[id]) {
2274 isdn_ppp_ccp_reset_free_state(is, (unsigned char)id);
2277 kfree(is->reset);
2278 is->reset = NULL;
2281 /* Free a given state and clear everything up for later reallocation */
2282 static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
2283 unsigned char id)
2285 struct ippp_ccp_reset_state *rs;
2287 if(is->reset->rs[id]) {
2288 printk(KERN_DEBUG "ippp_ccp: freeing state for id %d\n", id);
2289 rs = is->reset->rs[id];
2290 /* Make sure the kernel will not call back later */
2291 if(rs->ta)
2292 del_timer(&rs->timer);
2293 is->reset->rs[id] = NULL;
2294 kfree(rs);
2295 } else {
2296 printk(KERN_WARNING "ippp_ccp: id %d is not allocated\n", id);
2300 /* The timer callback function which is called when a ResetReq has timed out,
2301 aka has never been answered by a ResetAck */
2302 static void isdn_ppp_ccp_timer_callback(unsigned long closure)
2304 struct ippp_ccp_reset_state *rs =
2305 (struct ippp_ccp_reset_state *)closure;
2307 if(!rs) {
2308 printk(KERN_ERR "ippp_ccp: timer cb with zero closure.\n");
2309 return;
2311 if(rs->ta && rs->state == CCPResetSentReq) {
2312 /* We are correct here */
2313 if(!rs->expra) {
2314 /* Hmm, there is no Ack really expected. We can clean
2315 up the state now, it will be reallocated if the
2316 decompressor insists on another reset */
2317 rs->ta = 0;
2318 isdn_ppp_ccp_reset_free_state(rs->is, rs->id);
2319 return;
2321 printk(KERN_DEBUG "ippp_ccp: CCP Reset timed out for id %d\n",
2322 rs->id);
2323 /* Push it again */
2324 isdn_ppp_ccp_xmit_reset(rs->is, PPP_CCP, CCP_RESETREQ, rs->id,
2325 rs->data, rs->dlen);
2326 /* Restart timer */
2327 rs->timer.expires = jiffies + HZ*5;
2328 add_timer(&rs->timer);
2329 } else {
2330 printk(KERN_WARNING "ippp_ccp: timer cb in wrong state %d\n",
2331 rs->state);
2335 /* Allocate a new reset transaction state */
2336 static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
2337 unsigned char id)
2339 struct ippp_ccp_reset_state *rs;
2340 if(is->reset->rs[id]) {
2341 printk(KERN_WARNING "ippp_ccp: old state exists for id %d\n",
2342 id);
2343 return NULL;
2344 } else {
2345 rs = kzalloc(sizeof(struct ippp_ccp_reset_state), GFP_KERNEL);
2346 if(!rs)
2347 return NULL;
2348 rs->state = CCPResetIdle;
2349 rs->is = is;
2350 rs->id = id;
2351 init_timer(&rs->timer);
2352 rs->timer.data = (unsigned long)rs;
2353 rs->timer.function = isdn_ppp_ccp_timer_callback;
2354 is->reset->rs[id] = rs;
2356 return rs;
2360 /* A decompressor wants a reset with a set of parameters - do what is
2361 necessary to fulfill it */
2362 static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
2363 struct isdn_ppp_resetparams *rp)
2365 struct ippp_ccp_reset_state *rs;
2367 if(rp->valid) {
2368 /* The decompressor defines parameters by itself */
2369 if(rp->rsend) {
2370 /* And he wants us to send a request */
2371 if(!(rp->idval)) {
2372 printk(KERN_ERR "ippp_ccp: decompressor must"
2373 " specify reset id\n");
2374 return;
2376 if(is->reset->rs[rp->id]) {
2377 /* There is already a transaction in existence
2378 for this id. May be still waiting for a
2379 Ack or may be wrong. */
2380 rs = is->reset->rs[rp->id];
2381 if(rs->state == CCPResetSentReq && rs->ta) {
2382 printk(KERN_DEBUG "ippp_ccp: reset"
2383 " trans still in progress"
2384 " for id %d\n", rp->id);
2385 } else {
2386 printk(KERN_WARNING "ippp_ccp: reset"
2387 " trans in wrong state %d for"
2388 " id %d\n", rs->state, rp->id);
2390 } else {
2391 /* Ok, this is a new transaction */
2392 printk(KERN_DEBUG "ippp_ccp: new trans for id"
2393 " %d to be started\n", rp->id);
2394 rs = isdn_ppp_ccp_reset_alloc_state(is, rp->id);
2395 if(!rs) {
2396 printk(KERN_ERR "ippp_ccp: out of mem"
2397 " allocing ccp trans\n");
2398 return;
2400 rs->state = CCPResetSentReq;
2401 rs->expra = rp->expra;
2402 if(rp->dtval) {
2403 rs->dlen = rp->dlen;
2404 memcpy(rs->data, rp->data, rp->dlen);
2406 /* HACK TODO - add link comp here */
2407 isdn_ppp_ccp_xmit_reset(is, PPP_CCP,
2408 CCP_RESETREQ, rs->id,
2409 rs->data, rs->dlen);
2410 /* Start the timer */
2411 rs->timer.expires = jiffies + 5*HZ;
2412 add_timer(&rs->timer);
2413 rs->ta = 1;
2415 } else {
2416 printk(KERN_DEBUG "ippp_ccp: no reset sent\n");
2418 } else {
2419 /* The reset params are invalid. The decompressor does not
2420 care about them, so we just send the minimal requests
2421 and increase ids only when an Ack is received for a
2422 given id */
2423 if(is->reset->rs[is->reset->lastid]) {
2424 /* There is already a transaction in existence
2425 for this id. May be still waiting for a
2426 Ack or may be wrong. */
2427 rs = is->reset->rs[is->reset->lastid];
2428 if(rs->state == CCPResetSentReq && rs->ta) {
2429 printk(KERN_DEBUG "ippp_ccp: reset"
2430 " trans still in progress"
2431 " for id %d\n", rp->id);
2432 } else {
2433 printk(KERN_WARNING "ippp_ccp: reset"
2434 " trans in wrong state %d for"
2435 " id %d\n", rs->state, rp->id);
2437 } else {
2438 printk(KERN_DEBUG "ippp_ccp: new trans for id"
2439 " %d to be started\n", is->reset->lastid);
2440 rs = isdn_ppp_ccp_reset_alloc_state(is,
2441 is->reset->lastid);
2442 if(!rs) {
2443 printk(KERN_ERR "ippp_ccp: out of mem"
2444 " allocing ccp trans\n");
2445 return;
2447 rs->state = CCPResetSentReq;
2448 /* We always expect an Ack if the decompressor doesn't
2449 know better */
2450 rs->expra = 1;
2451 rs->dlen = 0;
2452 /* HACK TODO - add link comp here */
2453 isdn_ppp_ccp_xmit_reset(is, PPP_CCP, CCP_RESETREQ,
2454 rs->id, NULL, 0);
2455 /* Start the timer */
2456 rs->timer.expires = jiffies + 5*HZ;
2457 add_timer(&rs->timer);
2458 rs->ta = 1;
2463 /* An Ack was received for this id. This means we stop the timer and clean
2464 up the state prior to calling the decompressors reset routine. */
2465 static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
2466 unsigned char id)
2468 struct ippp_ccp_reset_state *rs = is->reset->rs[id];
2470 if(rs) {
2471 if(rs->ta && rs->state == CCPResetSentReq) {
2472 /* Great, we are correct */
2473 if(!rs->expra)
2474 printk(KERN_DEBUG "ippp_ccp: ResetAck received"
2475 " for id %d but not expected\n", id);
2476 } else {
2477 printk(KERN_INFO "ippp_ccp: ResetAck received out of"
2478 "sync for id %d\n", id);
2480 if(rs->ta) {
2481 rs->ta = 0;
2482 del_timer(&rs->timer);
2484 isdn_ppp_ccp_reset_free_state(is, id);
2485 } else {
2486 printk(KERN_INFO "ippp_ccp: ResetAck received for unknown id"
2487 " %d\n", id);
2489 /* Make sure the simple reset stuff uses a new id next time */
2490 is->reset->lastid++;
2494 * decompress packet
2496 * if master = 0, we're trying to uncompress an per-link compressed packet,
2497 * as opposed to an compressed reconstructed-from-MPPP packet.
2498 * proto is updated to protocol field of uncompressed packet.
2500 * retval: decompressed packet,
2501 * same packet if uncompressed,
2502 * NULL if decompression error
2505 static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb,struct ippp_struct *is,struct ippp_struct *master,
2506 int *proto)
2508 void *stat = NULL;
2509 struct isdn_ppp_compressor *ipc = NULL;
2510 struct sk_buff *skb_out;
2511 int len;
2512 struct ippp_struct *ri;
2513 struct isdn_ppp_resetparams rsparm;
2514 unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
2516 if(!master) {
2517 // per-link decompression
2518 stat = is->link_decomp_stat;
2519 ipc = is->link_decompressor;
2520 ri = is;
2521 } else {
2522 stat = master->decomp_stat;
2523 ipc = master->decompressor;
2524 ri = master;
2527 if (!ipc) {
2528 // no decompressor -> we can't decompress.
2529 printk(KERN_DEBUG "ippp: no decompressor defined!\n");
2530 return skb;
2532 BUG_ON(!stat); // if we have a compressor, stat has been set as well
2534 if((master && *proto == PPP_COMP) || (!master && *proto == PPP_COMPFRAG) ) {
2535 // compressed packets are compressed by their protocol type
2537 // Set up reset params for the decompressor
2538 memset(&rsparm, 0, sizeof(rsparm));
2539 rsparm.data = rsdata;
2540 rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
2542 skb_out = dev_alloc_skb(is->mru + PPP_HDRLEN);
2543 if (!skb_out) {
2544 kfree_skb(skb);
2545 printk(KERN_ERR "ippp: decomp memory allocation failure\n");
2546 return NULL;
2548 len = ipc->decompress(stat, skb, skb_out, &rsparm);
2549 kfree_skb(skb);
2550 if (len <= 0) {
2551 switch(len) {
2552 case DECOMP_ERROR:
2553 printk(KERN_INFO "ippp: decomp wants reset %s params\n",
2554 rsparm.valid ? "with" : "without");
2556 isdn_ppp_ccp_reset_trans(ri, &rsparm);
2557 break;
2558 case DECOMP_FATALERROR:
2559 ri->pppcfg |= SC_DC_FERROR;
2560 /* Kick ipppd to recognize the error */
2561 isdn_ppp_ccp_kickup(ri);
2562 break;
2564 kfree_skb(skb_out);
2565 return NULL;
2567 *proto = isdn_ppp_strip_proto(skb_out);
2568 if (*proto < 0) {
2569 kfree_skb(skb_out);
2570 return NULL;
2572 return skb_out;
2573 } else {
2574 // uncompressed packets are fed through the decompressor to
2575 // update the decompressor state
2576 ipc->incomp(stat, skb, *proto);
2577 return skb;
2582 * compress a frame
2583 * type=0: normal/bundle compression
2584 * =1: link compression
2585 * returns original skb if we haven't compressed the frame
2586 * and a new skb pointer if we've done it
2588 static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in,int *proto,
2589 struct ippp_struct *is,struct ippp_struct *master,int type)
2591 int ret;
2592 int new_proto;
2593 struct isdn_ppp_compressor *compressor;
2594 void *stat;
2595 struct sk_buff *skb_out;
2597 /* we do not compress control protocols */
2598 if(*proto < 0 || *proto > 0x3fff) {
2599 return skb_in;
2602 if(type) { /* type=1 => Link compression */
2603 return skb_in;
2605 else {
2606 if(!master) {
2607 compressor = is->compressor;
2608 stat = is->comp_stat;
2610 else {
2611 compressor = master->compressor;
2612 stat = master->comp_stat;
2614 new_proto = PPP_COMP;
2617 if(!compressor) {
2618 printk(KERN_ERR "isdn_ppp: No compressor set!\n");
2619 return skb_in;
2621 if(!stat) {
2622 printk(KERN_ERR "isdn_ppp: Compressor not initialized?\n");
2623 return skb_in;
2626 /* Allow for at least 150 % expansion (for now) */
2627 skb_out = alloc_skb(skb_in->len + skb_in->len/2 + 32 +
2628 skb_headroom(skb_in), GFP_ATOMIC);
2629 if(!skb_out)
2630 return skb_in;
2631 skb_reserve(skb_out, skb_headroom(skb_in));
2633 ret = (compressor->compress)(stat,skb_in,skb_out,*proto);
2634 if(!ret) {
2635 dev_kfree_skb(skb_out);
2636 return skb_in;
2639 dev_kfree_skb(skb_in);
2640 *proto = new_proto;
2641 return skb_out;
2645 * we received a CCP frame ..
2646 * not a clean solution, but we MUST handle a few cases in the kernel
2648 static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
2649 struct sk_buff *skb,int proto)
2651 struct ippp_struct *is;
2652 struct ippp_struct *mis;
2653 int len;
2654 struct isdn_ppp_resetparams rsparm;
2655 unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
2657 printk(KERN_DEBUG "Received CCP frame from peer slot(%d)\n",
2658 lp->ppp_slot);
2659 if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
2660 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
2661 __func__, lp->ppp_slot);
2662 return;
2664 is = ippp_table[lp->ppp_slot];
2665 isdn_ppp_frame_log("ccp-rcv", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
2667 if(lp->master) {
2668 int slot = ISDN_MASTER_PRIV(lp)->ppp_slot;
2669 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2670 printk(KERN_ERR "%s: slot(%d) out of range\n",
2671 __func__, slot);
2672 return;
2674 mis = ippp_table[slot];
2675 } else
2676 mis = is;
2678 switch(skb->data[0]) {
2679 case CCP_CONFREQ:
2680 if(is->debug & 0x10)
2681 printk(KERN_DEBUG "Disable compression here!\n");
2682 if(proto == PPP_CCP)
2683 mis->compflags &= ~SC_COMP_ON;
2684 else
2685 is->compflags &= ~SC_LINK_COMP_ON;
2686 break;
2687 case CCP_TERMREQ:
2688 case CCP_TERMACK:
2689 if(is->debug & 0x10)
2690 printk(KERN_DEBUG "Disable (de)compression here!\n");
2691 if(proto == PPP_CCP)
2692 mis->compflags &= ~(SC_DECOMP_ON|SC_COMP_ON);
2693 else
2694 is->compflags &= ~(SC_LINK_DECOMP_ON|SC_LINK_COMP_ON);
2695 break;
2696 case CCP_CONFACK:
2697 /* if we RECEIVE an ackowledge we enable the decompressor */
2698 if(is->debug & 0x10)
2699 printk(KERN_DEBUG "Enable decompression here!\n");
2700 if(proto == PPP_CCP) {
2701 if (!mis->decompressor)
2702 break;
2703 mis->compflags |= SC_DECOMP_ON;
2704 } else {
2705 if (!is->decompressor)
2706 break;
2707 is->compflags |= SC_LINK_DECOMP_ON;
2709 break;
2711 case CCP_RESETACK:
2712 printk(KERN_DEBUG "Received ResetAck from peer\n");
2713 len = (skb->data[2] << 8) | skb->data[3];
2714 len -= 4;
2716 if(proto == PPP_CCP) {
2717 /* If a reset Ack was outstanding for this id, then
2718 clean up the state engine */
2719 isdn_ppp_ccp_reset_ack_rcvd(mis, skb->data[1]);
2720 if(mis->decompressor && mis->decomp_stat)
2721 mis->decompressor->
2722 reset(mis->decomp_stat,
2723 skb->data[0],
2724 skb->data[1],
2725 len ? &skb->data[4] : NULL,
2726 len, NULL);
2727 /* TODO: This is not easy to decide here */
2728 mis->compflags &= ~SC_DECOMP_DISCARD;
2730 else {
2731 isdn_ppp_ccp_reset_ack_rcvd(is, skb->data[1]);
2732 if(is->link_decompressor && is->link_decomp_stat)
2733 is->link_decompressor->
2734 reset(is->link_decomp_stat,
2735 skb->data[0],
2736 skb->data[1],
2737 len ? &skb->data[4] : NULL,
2738 len, NULL);
2739 /* TODO: neither here */
2740 is->compflags &= ~SC_LINK_DECOMP_DISCARD;
2742 break;
2744 case CCP_RESETREQ:
2745 printk(KERN_DEBUG "Received ResetReq from peer\n");
2746 /* Receiving a ResetReq means we must reset our compressor */
2747 /* Set up reset params for the reset entry */
2748 memset(&rsparm, 0, sizeof(rsparm));
2749 rsparm.data = rsdata;
2750 rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
2751 /* Isolate data length */
2752 len = (skb->data[2] << 8) | skb->data[3];
2753 len -= 4;
2754 if(proto == PPP_CCP) {
2755 if(mis->compressor && mis->comp_stat)
2756 mis->compressor->
2757 reset(mis->comp_stat,
2758 skb->data[0],
2759 skb->data[1],
2760 len ? &skb->data[4] : NULL,
2761 len, &rsparm);
2763 else {
2764 if(is->link_compressor && is->link_comp_stat)
2765 is->link_compressor->
2766 reset(is->link_comp_stat,
2767 skb->data[0],
2768 skb->data[1],
2769 len ? &skb->data[4] : NULL,
2770 len, &rsparm);
2772 /* Ack the Req as specified by rsparm */
2773 if(rsparm.valid) {
2774 /* Compressor reset handler decided how to answer */
2775 if(rsparm.rsend) {
2776 /* We should send a Frame */
2777 isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
2778 rsparm.idval ? rsparm.id
2779 : skb->data[1],
2780 rsparm.dtval ?
2781 rsparm.data : NULL,
2782 rsparm.dtval ?
2783 rsparm.dlen : 0);
2784 } else {
2785 printk(KERN_DEBUG "ResetAck suppressed\n");
2787 } else {
2788 /* We answer with a straight reflected Ack */
2789 isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
2790 skb->data[1],
2791 len ? &skb->data[4] : NULL,
2792 len);
2794 break;
2800 * Daemon sends a CCP frame ...
2803 /* TODO: Clean this up with new Reset semantics */
2805 /* I believe the CCP handling as-is is done wrong. Compressed frames
2806 * should only be sent/received after CCP reaches UP state, which means
2807 * both sides have sent CONF_ACK. Currently, we handle both directions
2808 * independently, which means we may accept compressed frames too early
2809 * (supposedly not a problem), but may also mean we send compressed frames
2810 * too early, which may turn out to be a problem.
2811 * This part of state machine should actually be handled by (i)pppd, but
2812 * that's too big of a change now. --kai
2815 /* Actually, we might turn this into an advantage: deal with the RFC in
2816 * the old tradition of beeing generous on what we accept, but beeing
2817 * strict on what we send. Thus we should just
2818 * - accept compressed frames as soon as decompression is negotiated
2819 * - send compressed frames only when decomp *and* comp are negotiated
2820 * - drop rx compressed frames if we cannot decomp (instead of pushing them
2821 * up to ipppd)
2822 * and I tried to modify this file according to that. --abp
2825 static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb)
2827 struct ippp_struct *mis,*is;
2828 int proto, slot = lp->ppp_slot;
2829 unsigned char *data;
2831 if(!skb || skb->len < 3)
2832 return;
2833 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2834 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
2835 __func__, slot);
2836 return;
2838 is = ippp_table[slot];
2839 /* Daemon may send with or without address and control field comp */
2840 data = skb->data;
2841 if(!(is->pppcfg & SC_COMP_AC) && data[0] == 0xff && data[1] == 0x03) {
2842 data += 2;
2843 if(skb->len < 5)
2844 return;
2847 proto = ((int)data[0]<<8)+data[1];
2848 if(proto != PPP_CCP && proto != PPP_CCPFRAG)
2849 return;
2851 printk(KERN_DEBUG "Received CCP frame from daemon:\n");
2852 isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
2854 if (lp->master) {
2855 slot = ISDN_MASTER_PRIV(lp)->ppp_slot;
2856 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2857 printk(KERN_ERR "%s: slot(%d) out of range\n",
2858 __func__, slot);
2859 return;
2861 mis = ippp_table[slot];
2862 } else
2863 mis = is;
2864 if (mis != is)
2865 printk(KERN_DEBUG "isdn_ppp: Ouch! Master CCP sends on slave slot!\n");
2867 switch(data[2]) {
2868 case CCP_CONFREQ:
2869 if(is->debug & 0x10)
2870 printk(KERN_DEBUG "Disable decompression here!\n");
2871 if(proto == PPP_CCP)
2872 is->compflags &= ~SC_DECOMP_ON;
2873 else
2874 is->compflags &= ~SC_LINK_DECOMP_ON;
2875 break;
2876 case CCP_TERMREQ:
2877 case CCP_TERMACK:
2878 if(is->debug & 0x10)
2879 printk(KERN_DEBUG "Disable (de)compression here!\n");
2880 if(proto == PPP_CCP)
2881 is->compflags &= ~(SC_DECOMP_ON|SC_COMP_ON);
2882 else
2883 is->compflags &= ~(SC_LINK_DECOMP_ON|SC_LINK_COMP_ON);
2884 break;
2885 case CCP_CONFACK:
2886 /* if we SEND an ackowledge we can/must enable the compressor */
2887 if(is->debug & 0x10)
2888 printk(KERN_DEBUG "Enable compression here!\n");
2889 if(proto == PPP_CCP) {
2890 if (!is->compressor)
2891 break;
2892 is->compflags |= SC_COMP_ON;
2893 } else {
2894 if (!is->compressor)
2895 break;
2896 is->compflags |= SC_LINK_COMP_ON;
2898 break;
2899 case CCP_RESETACK:
2900 /* If we send a ACK we should reset our compressor */
2901 if(is->debug & 0x10)
2902 printk(KERN_DEBUG "Reset decompression state here!\n");
2903 printk(KERN_DEBUG "ResetAck from daemon passed by\n");
2904 if(proto == PPP_CCP) {
2905 /* link to master? */
2906 if(is->compressor && is->comp_stat)
2907 is->compressor->reset(is->comp_stat, 0, 0,
2908 NULL, 0, NULL);
2909 is->compflags &= ~SC_COMP_DISCARD;
2911 else {
2912 if(is->link_compressor && is->link_comp_stat)
2913 is->link_compressor->reset(is->link_comp_stat,
2914 0, 0, NULL, 0, NULL);
2915 is->compflags &= ~SC_LINK_COMP_DISCARD;
2917 break;
2918 case CCP_RESETREQ:
2919 /* Just let it pass by */
2920 printk(KERN_DEBUG "ResetReq from daemon passed by\n");
2921 break;
2925 int isdn_ppp_register_compressor(struct isdn_ppp_compressor *ipc)
2927 ipc->next = ipc_head;
2928 ipc->prev = NULL;
2929 if(ipc_head) {
2930 ipc_head->prev = ipc;
2932 ipc_head = ipc;
2933 return 0;
2936 int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor *ipc)
2938 if(ipc->prev)
2939 ipc->prev->next = ipc->next;
2940 else
2941 ipc_head = ipc->next;
2942 if(ipc->next)
2943 ipc->next->prev = ipc->prev;
2944 ipc->prev = ipc->next = NULL;
2945 return 0;
2948 static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_data *data)
2950 struct isdn_ppp_compressor *ipc = ipc_head;
2951 int ret;
2952 void *stat;
2953 int num = data->num;
2955 if(is->debug & 0x10)
2956 printk(KERN_DEBUG "[%d] Set %s type %d\n",is->unit,
2957 (data->flags&IPPP_COMP_FLAG_XMIT)?"compressor":"decompressor",num);
2959 /* If is has no valid reset state vector, we cannot allocate a
2960 decompressor. The decompressor would cause reset transactions
2961 sooner or later, and they need that vector. */
2963 if(!(data->flags & IPPP_COMP_FLAG_XMIT) && !is->reset) {
2964 printk(KERN_ERR "ippp_ccp: no reset data structure - can't"
2965 " allow decompression.\n");
2966 return -ENOMEM;
2969 while(ipc) {
2970 if(ipc->num == num) {
2971 stat = ipc->alloc(data);
2972 if(stat) {
2973 ret = ipc->init(stat,data,is->unit,0);
2974 if(!ret) {
2975 printk(KERN_ERR "Can't init (de)compression!\n");
2976 ipc->free(stat);
2977 stat = NULL;
2978 break;
2981 else {
2982 printk(KERN_ERR "Can't alloc (de)compression!\n");
2983 break;
2986 if(data->flags & IPPP_COMP_FLAG_XMIT) {
2987 if(data->flags & IPPP_COMP_FLAG_LINK) {
2988 if(is->link_comp_stat)
2989 is->link_compressor->free(is->link_comp_stat);
2990 is->link_comp_stat = stat;
2991 is->link_compressor = ipc;
2993 else {
2994 if(is->comp_stat)
2995 is->compressor->free(is->comp_stat);
2996 is->comp_stat = stat;
2997 is->compressor = ipc;
3000 else {
3001 if(data->flags & IPPP_COMP_FLAG_LINK) {
3002 if(is->link_decomp_stat)
3003 is->link_decompressor->free(is->link_decomp_stat);
3004 is->link_decomp_stat = stat;
3005 is->link_decompressor = ipc;
3007 else {
3008 if(is->decomp_stat)
3009 is->decompressor->free(is->decomp_stat);
3010 is->decomp_stat = stat;
3011 is->decompressor = ipc;
3014 return 0;
3016 ipc = ipc->next;
3018 return -EINVAL;