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>
20 #include "isdn_common.h"
25 #define PPP_IPX 0x002b
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,
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,
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,
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,
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,
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;
85 isdn_ppp_frame_log(char *info, char *data, int len, int maxlen, int unit, int slot)
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);
118 #ifdef CONFIG_ISDN_MPP
119 spin_lock(&lp->netdev->pb->lock);
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);
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 */
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 ?? */
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)
160 struct ippp_struct *is;
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! */
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)
189 if (i >= ISDN_MAX_CHANNELS) {
190 printk(KERN_WARNING "isdn_ppp_bind: Can't find a (free) connection to the ipppd daemon.\n");
194 /* get unit number from interface name .. ugly! */
195 unit = isdn_ppp_if_get_unit(lp->netdev->dev->name);
197 printk(KERN_ERR "isdn_ppp_bind: illegal interface name %s.\n",
198 lp->netdev->dev->name);
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);
212 #endif /* CONFIG_ISDN_MPP */
214 retval = lp->ppp_slot;
221 * kick the ipppd on the device
222 * (wakes up daemon after B-channel connect)
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);
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
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",
252 is = ippp_table[slot];
254 wake_up_interruptible(&is->wq);
255 is->state = IPPP_CLOSEWAIT;
260 * isdn_ppp_find_slot / isdn_ppp_free_slot
264 isdn_ppp_get_slot(void)
267 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
268 if (!ippp_table[i]->state)
279 isdn_ppp_open(int min, struct file *file)
282 struct ippp_struct *is;
284 if (min < 0 || min >= ISDN_MAX_CHANNELS)
287 slot = isdn_ppp_get_slot();
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;
303 is->reset = isdn_ppp_ccp_reset_alloc(is);
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 */
314 init_waitqueue_head(&is->wq);
315 is->first = is->rq + NUM_RCV_BUFFS - 1; /* receive queue */
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 */
324 #ifdef CONFIG_IPPP_FILTER
325 is->pass_filter = NULL;
326 is->active_filter = NULL;
328 is->state = IPPP_OPEN;
334 * release ippp device
337 isdn_ppp_release(int min, struct file *file)
340 struct ippp_struct *is;
342 if (min < 0 || min >= ISDN_MAX_CHANNELS)
344 is = file->private_data;
347 printk(KERN_ERR "%s: no file->private_data\n", __func__);
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;
357 printk(KERN_ERR "%s: no lp->netdev\n", __func__);
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 */
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);
380 #ifdef CONFIG_IPPP_FILTER
381 if (is->pass_filter) {
382 sk_unattached_filter_destroy(is->pass_filter);
383 is->pass_filter = NULL;
386 if (is->active_filter) {
387 sk_unattached_filter_destroy(is->active_filter);
388 is->active_filter = NULL;
392 /* TODO: if this was the previous master: link the stuff to the new master */
394 is->compressor->free(is->comp_stat);
395 if (is->link_comp_stat)
396 is->link_compressor->free(is->link_comp_stat);
397 if (is->link_decomp_stat)
398 is->link_decompressor->free(is->link_decomp_stat);
400 is->decompressor->free(is->decomp_stat);
401 is->compressor = is->link_compressor = NULL;
402 is->decompressor = is->link_decompressor = NULL;
403 is->comp_stat = is->link_comp_stat = NULL;
404 is->decomp_stat = is->link_decomp_stat = NULL;
406 /* Clean up if necessary */
408 isdn_ppp_ccp_reset_free(is);
410 /* this slot is ready for new connections */
415 * get_arg .. ioctl helper
418 get_arg(void __user *b, void *val, int len)
421 len = sizeof(void *);
422 if (copy_from_user(val, b, len))
428 * set arg .. ioctl helper
431 set_arg(void __user *b, void *val, int len)
434 len = sizeof(void *);
435 if (copy_to_user(b, val, len))
440 #ifdef CONFIG_IPPP_FILTER
441 static int get_filter(void __user *arg, struct sock_filter **p)
443 struct sock_fprog uprog;
444 struct sock_filter *code = NULL;
447 if (copy_from_user(&uprog, arg, sizeof(uprog)))
455 /* uprog.len is unsigned short, so no overflow here */
456 len = uprog.len * sizeof(struct sock_filter);
457 code = memdup_user(uprog.filter, len);
459 return PTR_ERR(code);
464 #endif /* CONFIG_IPPP_FILTER */
470 isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg)
474 struct ippp_struct *is;
476 struct isdn_ppp_comp_data data;
477 void __user *argp = (void __user *)arg;
479 is = file->private_data;
483 printk(KERN_DEBUG "isdn_ppp_ioctl: minor: %d cmd: %x state: %x\n", min, cmd, is->state);
485 if (!(is->state & IPPP_OPEN))
490 #ifdef CONFIG_ISDN_MPP
491 if (!(is->state & IPPP_CONNECT))
493 if ((r = get_arg(argp, &val, sizeof(val))))
495 printk(KERN_DEBUG "iPPP-bundle: minor: %d, slave unit: %d, master unit: %d\n",
496 (int) min, (int) is->unit, (int) val);
497 return isdn_ppp_bundle(is, val);
502 case PPPIOCGUNIT: /* get ppp/isdn unit number */
503 if ((r = set_arg(argp, &is->unit, sizeof(is->unit))))
509 if ((r = set_arg(argp, lp->netdev->dev->name,
510 strlen(lp->netdev->dev->name))))
513 case PPPIOCGMPFLAGS: /* get configuration flags */
514 if ((r = set_arg(argp, &is->mpppcfg, sizeof(is->mpppcfg))))
517 case PPPIOCSMPFLAGS: /* set configuration flags */
518 if ((r = get_arg(argp, &val, sizeof(val))))
522 case PPPIOCGFLAGS: /* get configuration flags */
523 if ((r = set_arg(argp, &is->pppcfg, sizeof(is->pppcfg))))
526 case PPPIOCSFLAGS: /* set configuration flags */
527 if ((r = get_arg(argp, &val, sizeof(val)))) {
530 if (val & SC_ENABLE_IP && !(is->pppcfg & SC_ENABLE_IP) && (is->state & IPPP_CONNECT)) {
532 /* OK .. we are ready to send buffers */
533 is->pppcfg = val; /* isdn_ppp_xmit test for SC_ENABLE_IP !!! */
534 netif_wake_queue(lp->netdev->dev);
540 case PPPIOCGIDLE: /* get idle time information */
542 struct ppp_idle pidle;
543 pidle.xmit_idle = pidle.recv_idle = lp->huptimer;
544 if ((r = set_arg(argp, &pidle, sizeof(struct ppp_idle))))
548 case PPPIOCSMRU: /* set receive unit size for PPP */
549 if ((r = get_arg(argp, &val, sizeof(val))))
557 case PPPIOCSMAXCID: /* set the maximum compression slot id */
558 if ((r = get_arg(argp, &val, sizeof(val))))
561 if (is->maxcid != val) {
562 #ifdef CONFIG_ISDN_PPP_VJ
563 struct slcompress *sltmp;
566 printk(KERN_DEBUG "ippp, ioctl: changed MAXCID to %ld\n", val);
568 #ifdef CONFIG_ISDN_PPP_VJ
569 sltmp = slhc_init(16, val);
571 printk(KERN_ERR "ippp, can't realloc slhc struct\n");
575 slhc_free(is->slcomp);
581 if ((r = set_arg(argp, &is->debug, sizeof(is->debug))))
585 if ((r = get_arg(argp, &val, sizeof(val))))
589 case PPPIOCGCOMPRESSORS:
591 unsigned long protos[8] = {0,};
592 struct isdn_ppp_compressor *ipc = ipc_head;
594 j = ipc->num / (sizeof(long) * 8);
595 i = ipc->num % (sizeof(long) * 8);
597 protos[j] |= (1UL << i);
600 if ((r = set_arg(argp, protos, 8 * sizeof(long))))
604 case PPPIOCSCOMPRESSOR:
605 if ((r = get_arg(argp, &data, sizeof(struct isdn_ppp_comp_data))))
607 return isdn_ppp_set_compressor(is, &data);
608 case PPPIOCGCALLINFO:
610 struct pppcallinfo pci;
611 memset((char *)&pci, 0, sizeof(struct pppcallinfo));
614 strncpy(pci.local_num, lp->msn, 63);
616 strncpy(pci.remote_num, lp->dial->num, 63);
618 pci.charge_units = lp->charge;
620 pci.calltype = CALLTYPE_OUTGOING;
622 pci.calltype = CALLTYPE_INCOMING;
623 if (lp->flags & ISDN_NET_CALLBACK)
624 pci.calltype |= CALLTYPE_CALLBACK;
626 return set_arg(argp, &pci, sizeof(struct pppcallinfo));
628 #ifdef CONFIG_IPPP_FILTER
631 struct sock_fprog_kern fprog;
632 struct sock_filter *code;
633 int err, len = get_filter(argp, &code);
641 if (is->pass_filter) {
642 sk_unattached_filter_destroy(is->pass_filter);
643 is->pass_filter = NULL;
645 if (fprog.filter != NULL)
646 err = sk_unattached_filter_create(&is->pass_filter,
656 struct sock_fprog_kern fprog;
657 struct sock_filter *code;
658 int err, len = get_filter(argp, &code);
666 if (is->active_filter) {
667 sk_unattached_filter_destroy(is->active_filter);
668 is->active_filter = NULL;
670 if (fprog.filter != NULL)
671 err = sk_unattached_filter_create(&is->active_filter,
679 #endif /* CONFIG_IPPP_FILTER */
687 isdn_ppp_poll(struct file *file, poll_table *wait)
690 struct ippp_buf_queue *bf, *bl;
692 struct ippp_struct *is;
694 is = file->private_data;
697 printk(KERN_DEBUG "isdn_ppp_poll: minor: %d\n",
698 iminor(file_inode(file)));
700 /* just registers wait_queue hook. This doesn't really wait. */
701 poll_wait(file, &is->wq, wait);
703 if (!(is->state & IPPP_OPEN)) {
704 if (is->state == IPPP_CLOSEWAIT)
706 printk(KERN_DEBUG "isdn_ppp: device not open\n");
709 /* we're always ready to send .. */
710 mask = POLLOUT | POLLWRNORM;
712 spin_lock_irqsave(&is->buflock, flags);
716 * if IPPP_NOBLOCK is set we return even if we have nothing to read
718 if (bf->next != bl || (is->state & IPPP_NOBLOCK)) {
719 is->state &= ~IPPP_NOBLOCK;
720 mask |= POLLIN | POLLRDNORM;
722 spin_unlock_irqrestore(&is->buflock, flags);
727 * fill up isdn_ppp_read() queue ..
731 isdn_ppp_fill_rq(unsigned char *buf, int len, int proto, int slot)
733 struct ippp_buf_queue *bf, *bl;
736 struct ippp_struct *is;
738 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
739 printk(KERN_WARNING "ippp: illegal slot(%d).\n", slot);
742 is = ippp_table[slot];
744 if (!(is->state & IPPP_CONNECT)) {
745 printk(KERN_DEBUG "ippp: device not activated.\n");
748 nbuf = kmalloc(len + 4, GFP_ATOMIC);
750 printk(KERN_WARNING "ippp: Can't alloc buf\n");
753 nbuf[0] = PPP_ALLSTATIONS;
755 nbuf[2] = proto >> 8;
756 nbuf[3] = proto & 0xff;
757 memcpy(nbuf + 4, buf, len);
759 spin_lock_irqsave(&is->buflock, flags);
764 printk(KERN_WARNING "ippp: Queue is full; discarding first buffer\n");
769 bl->buf = (char *) nbuf;
773 spin_unlock_irqrestore(&is->buflock, flags);
774 wake_up_interruptible(&is->wq);
779 * read() .. non-blocking: ipppd calls it only after select()
780 * reports, that there is data
784 isdn_ppp_read(int min, struct file *file, char __user *buf, int count)
786 struct ippp_struct *is;
787 struct ippp_buf_queue *b;
791 is = file->private_data;
793 if (!(is->state & IPPP_OPEN))
796 if (!access_ok(VERIFY_WRITE, buf, count))
799 spin_lock_irqsave(&is->buflock, flags);
803 spin_unlock_irqrestore(&is->buflock, flags);
811 spin_unlock_irqrestore(&is->buflock, flags);
812 if (copy_to_user(buf, save_buf, count))
820 * ipppd wanna write a packet to the card .. non-blocking
824 isdn_ppp_write(int min, struct file *file, const char __user *buf, int count)
827 struct ippp_struct *is;
829 unsigned char protobuf[4];
831 is = file->private_data;
833 if (!(is->state & IPPP_CONNECT))
838 /* -> push it directly to the lowlevel interface */
841 printk(KERN_DEBUG "isdn_ppp_write: lp == NULL\n");
844 * Don't reset huptimer for
845 * LCP packets. (Echo requests).
847 if (copy_from_user(protobuf, buf, 4))
849 proto = PPP_PROTOCOL(protobuf);
850 if (proto != PPP_LCP)
853 if (lp->isdn_device < 0 || lp->isdn_channel < 0)
856 if ((dev->drv[lp->isdn_device]->flags & DRV_FLAG_RUNNING) &&
857 lp->dialstate == 0 &&
858 (lp->flags & ISDN_NET_CONNECTED)) {
862 * we need to reserve enough space in front of
863 * sk_buff. old call to dev_alloc_skb only reserved
864 * 16 bytes, now we are looking what the driver want
866 hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
867 skb = alloc_skb(hl + count, GFP_ATOMIC);
869 printk(KERN_WARNING "isdn_ppp_write: out of memory!\n");
872 skb_reserve(skb, hl);
873 if (copy_from_user(skb_put(skb, count), buf, count))
878 if (is->debug & 0x40) {
879 printk(KERN_DEBUG "ppp xmit: len %d\n", (int) skb->len);
880 isdn_ppp_frame_log("xmit", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
883 isdn_ppp_send_ccp(lp->netdev, lp, skb); /* keeps CCP/compression states in sync */
885 isdn_net_write_super(lp, skb);
892 * init memory, structures etc.
901 #ifdef CONFIG_ISDN_MPP
902 if (isdn_ppp_mp_bundle_array_init() < 0)
904 #endif /* CONFIG_ISDN_MPP */
906 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
907 if (!(ippp_table[i] = kzalloc(sizeof(struct ippp_struct), GFP_KERNEL))) {
908 printk(KERN_WARNING "isdn_ppp_init: Could not alloc ippp_table\n");
909 for (j = 0; j < i; j++)
910 kfree(ippp_table[j]);
913 spin_lock_init(&ippp_table[i]->buflock);
914 ippp_table[i]->state = 0;
915 ippp_table[i]->first = ippp_table[i]->rq + NUM_RCV_BUFFS - 1;
916 ippp_table[i]->last = ippp_table[i]->rq;
918 for (j = 0; j < NUM_RCV_BUFFS; j++) {
919 ippp_table[i]->rq[j].buf = NULL;
920 ippp_table[i]->rq[j].last = ippp_table[i]->rq +
921 (NUM_RCV_BUFFS + j - 1) % NUM_RCV_BUFFS;
922 ippp_table[i]->rq[j].next = ippp_table[i]->rq + (j + 1) % NUM_RCV_BUFFS;
929 isdn_ppp_cleanup(void)
933 for (i = 0; i < ISDN_MAX_CHANNELS; i++)
934 kfree(ippp_table[i]);
936 #ifdef CONFIG_ISDN_MPP
937 kfree(isdn_ppp_bundle_arr);
938 #endif /* CONFIG_ISDN_MPP */
943 * check for address/control field and skip if allowed
944 * retval != 0 -> discard packet silently
946 static int isdn_ppp_skip_ac(struct ippp_struct *is, struct sk_buff *skb)
951 if (skb->data[0] == 0xff) {
955 if (skb->data[1] != 0x03)
958 // skip address/control (AC) field
961 if (is->pppcfg & SC_REJ_COMP_AC)
962 // if AC compression was not negotiated, but used, discard packet
969 * get the PPP protocol header and pull skb
970 * retval < 0 -> discard packet silently
972 static int isdn_ppp_strip_proto(struct sk_buff *skb)
979 if (skb->data[0] & 0x1) {
980 // protocol field is compressed
981 proto = skb->data[0];
986 proto = ((int) skb->data[0] << 8) + skb->data[1];
994 * handler for incoming packets on a syncPPP interface
996 void isdn_ppp_receive(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb)
998 struct ippp_struct *is;
1002 BUG_ON(net_dev->local->master); // we're called with the master device always
1004 slot = lp->ppp_slot;
1005 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1006 printk(KERN_ERR "isdn_ppp_receive: lp->ppp_slot(%d)\n",
1011 is = ippp_table[slot];
1013 if (is->debug & 0x4) {
1014 printk(KERN_DEBUG "ippp_receive: is:%08lx lp:%08lx slot:%d unit:%d len:%d\n",
1015 (long)is, (long)lp, lp->ppp_slot, is->unit, (int)skb->len);
1016 isdn_ppp_frame_log("receive", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
1019 if (isdn_ppp_skip_ac(is, skb) < 0) {
1023 proto = isdn_ppp_strip_proto(skb);
1029 #ifdef CONFIG_ISDN_MPP
1030 if (is->compflags & SC_LINK_DECOMP_ON) {
1031 skb = isdn_ppp_decompress(skb, is, NULL, &proto);
1032 if (!skb) // decompression error
1036 if (!(is->mpppcfg & SC_REJ_MP_PROT)) { // we agreed to receive MPPP
1037 if (proto == PPP_MP) {
1038 isdn_ppp_mp_receive(net_dev, lp, skb);
1043 isdn_ppp_push_higher(net_dev, lp, skb, proto);
1047 * we receive a reassembled frame, MPPP has been taken care of before.
1048 * address/control and protocol have been stripped from the skb
1049 * note: net_dev has to be master net_dev
1052 isdn_ppp_push_higher(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb, int proto)
1054 struct net_device *dev = net_dev->dev;
1055 struct ippp_struct *is, *mis;
1056 isdn_net_local *mlp = NULL;
1059 slot = lp->ppp_slot;
1060 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1061 printk(KERN_ERR "isdn_ppp_push_higher: lp->ppp_slot(%d)\n",
1065 is = ippp_table[slot];
1067 if (lp->master) { // FIXME?
1068 mlp = ISDN_MASTER_PRIV(lp);
1069 slot = mlp->ppp_slot;
1070 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1071 printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n",
1076 mis = ippp_table[slot];
1078 if (is->debug & 0x10) {
1079 printk(KERN_DEBUG "push, skb %d %04x\n", (int) skb->len, proto);
1080 isdn_ppp_frame_log("rpush", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
1082 if (mis->compflags & SC_DECOMP_ON) {
1083 skb = isdn_ppp_decompress(skb, is, mis, &proto);
1084 if (!skb) // decompression error
1088 case PPP_IPX: /* untested */
1089 if (is->debug & 0x20)
1090 printk(KERN_DEBUG "isdn_ppp: IPX\n");
1091 skb->protocol = htons(ETH_P_IPX);
1094 if (is->debug & 0x20)
1095 printk(KERN_DEBUG "isdn_ppp: IP\n");
1096 skb->protocol = htons(ETH_P_IP);
1100 printk(KERN_INFO "isdn_ppp: unexpected compressed frame dropped\n");
1102 #ifdef CONFIG_ISDN_PPP_VJ
1103 case PPP_VJC_UNCOMP:
1104 if (is->debug & 0x20)
1105 printk(KERN_DEBUG "isdn_ppp: VJC_UNCOMP\n");
1106 if (net_dev->local->ppp_slot < 0) {
1107 printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
1108 __func__, net_dev->local->ppp_slot);
1111 if (slhc_remember(ippp_table[net_dev->local->ppp_slot]->slcomp, skb->data, skb->len) <= 0) {
1112 printk(KERN_WARNING "isdn_ppp: received illegal VJC_UNCOMP frame!\n");
1115 skb->protocol = htons(ETH_P_IP);
1118 if (is->debug & 0x20)
1119 printk(KERN_DEBUG "isdn_ppp: VJC_COMP\n");
1121 struct sk_buff *skb_old = skb;
1123 skb = dev_alloc_skb(skb_old->len + 128);
1126 printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
1130 skb_put(skb, skb_old->len + 128);
1131 skb_copy_from_linear_data(skb_old, skb->data,
1133 if (net_dev->local->ppp_slot < 0) {
1134 printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
1135 __func__, net_dev->local->ppp_slot);
1138 pkt_len = slhc_uncompress(ippp_table[net_dev->local->ppp_slot]->slcomp,
1139 skb->data, skb_old->len);
1144 skb_trim(skb, pkt_len);
1145 skb->protocol = htons(ETH_P_IP);
1151 isdn_ppp_receive_ccp(net_dev, lp, skb, proto);
1152 /* Dont pop up ResetReq/Ack stuff to the daemon any
1153 longer - the job is done already */
1154 if (skb->data[0] == CCP_RESETREQ ||
1155 skb->data[0] == CCP_RESETACK)
1159 isdn_ppp_fill_rq(skb->data, skb->len, proto, lp->ppp_slot); /* push data to pppd device */
1164 #ifdef CONFIG_IPPP_FILTER
1165 /* check if the packet passes the pass and active filters
1166 * the filter instructions are constructed assuming
1167 * a four-byte PPP header on each packet (which is still present) */
1171 u_int16_t *p = (u_int16_t *) skb->data;
1173 *p = 0; /* indicate inbound */
1177 && SK_RUN_FILTER(is->pass_filter, skb) == 0) {
1178 if (is->debug & 0x2)
1179 printk(KERN_DEBUG "IPPP: inbound frame filtered.\n");
1183 if (!(is->active_filter
1184 && SK_RUN_FILTER(is->active_filter, skb) == 0)) {
1185 if (is->debug & 0x2)
1186 printk(KERN_DEBUG "IPPP: link-active filter: resetting huptimer.\n");
1192 #else /* CONFIG_IPPP_FILTER */
1196 #endif /* CONFIG_IPPP_FILTER */
1198 skb_reset_mac_header(skb);
1200 /* net_dev->local->stats.rx_packets++; done in isdn_net.c */
1204 net_dev->local->stats.rx_dropped++;
1209 * isdn_ppp_skb_push ..
1210 * checks whether we have enough space at the beginning of the skb
1211 * and allocs a new SKB if necessary
1213 static unsigned char *isdn_ppp_skb_push(struct sk_buff **skb_p, int len)
1215 struct sk_buff *skb = *skb_p;
1217 if (skb_headroom(skb) < len) {
1218 struct sk_buff *nskb = skb_realloc_headroom(skb, len);
1221 printk(KERN_ERR "isdn_ppp_skb_push: can't realloc headroom!\n");
1225 printk(KERN_DEBUG "isdn_ppp_skb_push:under %d %d\n", skb_headroom(skb), len);
1228 return skb_push(nskb, len);
1230 return skb_push(skb, len);
1234 * send ppp frame .. we expect a PIDCOMPressable proto --
1235 * (here: currently always PPP_IP,PPP_VJC_COMP,PPP_VJC_UNCOMP)
1237 * VJ compression may change skb pointer!!! .. requeue with old
1238 * skb isn't allowed!!
1242 isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
1244 isdn_net_local *lp, *mlp;
1246 unsigned int proto = PPP_IP; /* 0x21 */
1247 struct ippp_struct *ipt, *ipts;
1248 int slot, retval = NETDEV_TX_OK;
1250 mlp = netdev_priv(netdev);
1251 nd = mlp->netdev; /* get master lp */
1253 slot = mlp->ppp_slot;
1254 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1255 printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1260 ipts = ippp_table[slot];
1262 if (!(ipts->pppcfg & SC_ENABLE_IP)) { /* PPP connected ? */
1263 if (ipts->debug & 0x1)
1264 printk(KERN_INFO "%s: IP frame delayed.\n", netdev->name);
1265 retval = NETDEV_TX_BUSY;
1269 switch (ntohs(skb->protocol)) {
1274 proto = PPP_IPX; /* untested */
1277 printk(KERN_ERR "isdn_ppp: skipped unsupported protocol: %#x.\n",
1283 lp = isdn_net_get_locked_lp(nd);
1285 printk(KERN_WARNING "%s: all channels busy - requeuing!\n", netdev->name);
1286 retval = NETDEV_TX_BUSY;
1289 /* we have our lp locked from now on */
1291 slot = lp->ppp_slot;
1292 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1293 printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1298 ipt = ippp_table[slot];
1301 * after this line .. requeueing in the device queue is no longer allowed!!!
1304 /* Pull off the fake header we stuck on earlier to keep
1305 * the fragmentation code happy.
1307 skb_pull(skb, IPPP_MAX_HEADER);
1309 #ifdef CONFIG_IPPP_FILTER
1310 /* check if we should pass this packet
1311 * the filter instructions are constructed assuming
1312 * a four-byte PPP header on each packet */
1313 *skb_push(skb, 4) = 1; /* indicate outbound */
1316 __be16 *p = (__be16 *)skb->data;
1322 if (ipt->pass_filter
1323 && SK_RUN_FILTER(ipt->pass_filter, skb) == 0) {
1324 if (ipt->debug & 0x4)
1325 printk(KERN_DEBUG "IPPP: outbound frame filtered.\n");
1329 if (!(ipt->active_filter
1330 && SK_RUN_FILTER(ipt->active_filter, skb) == 0)) {
1331 if (ipt->debug & 0x4)
1332 printk(KERN_DEBUG "IPPP: link-active filter: resetting huptimer.\n");
1336 #else /* CONFIG_IPPP_FILTER */
1338 #endif /* CONFIG_IPPP_FILTER */
1340 if (ipt->debug & 0x4)
1341 printk(KERN_DEBUG "xmit skb, len %d\n", (int) skb->len);
1342 if (ipts->debug & 0x40)
1343 isdn_ppp_frame_log("xmit0", skb->data, skb->len, 32, ipts->unit, lp->ppp_slot);
1345 #ifdef CONFIG_ISDN_PPP_VJ
1346 if (proto == PPP_IP && ipts->pppcfg & SC_COMP_TCP) { /* ipts here? probably yes, but check this again */
1347 struct sk_buff *new_skb;
1350 * we need to reserve enough space in front of
1351 * sk_buff. old call to dev_alloc_skb only reserved
1352 * 16 bytes, now we are looking what the driver want.
1354 hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen + IPPP_MAX_HEADER;
1356 * Note: hl might still be insufficient because the method
1357 * above does not account for a possibible MPPP slave channel
1358 * which had larger HL header space requirements than the
1361 new_skb = alloc_skb(hl + skb->len, GFP_ATOMIC);
1366 skb_reserve(new_skb, hl);
1367 new_skb->dev = skb->dev;
1368 skb_put(new_skb, skb->len);
1371 pktlen = slhc_compress(ipts->slcomp, skb->data, skb->len, new_skb->data,
1372 &buf, !(ipts->pppcfg & SC_NO_TCP_CCID));
1374 if (buf != skb->data) {
1375 if (new_skb->data != buf)
1376 printk(KERN_ERR "isdn_ppp: FATAL error after slhc_compress!!\n");
1380 dev_kfree_skb(new_skb);
1383 skb_trim(skb, pktlen);
1384 if (skb->data[0] & SL_TYPE_COMPRESSED_TCP) { /* cslip? style -> PPP */
1385 proto = PPP_VJC_COMP;
1386 skb->data[0] ^= SL_TYPE_COMPRESSED_TCP;
1388 if (skb->data[0] >= SL_TYPE_UNCOMPRESSED_TCP)
1389 proto = PPP_VJC_UNCOMP;
1390 skb->data[0] = (skb->data[0] & 0x0f) | 0x40;
1397 * normal (single link) or bundle compression
1399 if (ipts->compflags & SC_COMP_ON) {
1400 /* We send compressed only if both down- und upstream
1401 compression is negotiated, that means, CCP is up */
1402 if (ipts->compflags & SC_DECOMP_ON) {
1403 skb = isdn_ppp_compress(skb, &proto, ipt, ipts, 0);
1405 printk(KERN_DEBUG "isdn_ppp: CCP not yet up - sending as-is\n");
1409 if (ipt->debug & 0x24)
1410 printk(KERN_DEBUG "xmit2 skb, len %d, proto %04x\n", (int) skb->len, proto);
1412 #ifdef CONFIG_ISDN_MPP
1413 if (ipt->mpppcfg & SC_MP_PROT) {
1414 /* we get mp_seqno from static isdn_net_local */
1415 long mp_seqno = ipts->mp_seqno;
1417 if (ipt->mpppcfg & SC_OUT_SHORT_SEQ) {
1418 unsigned char *data = isdn_ppp_skb_push(&skb, 3);
1422 data[0] = MP_BEGIN_FRAG | MP_END_FRAG | ((mp_seqno >> 8) & 0xf); /* (B)egin & (E)ndbit .. */
1423 data[1] = mp_seqno & 0xff;
1424 data[2] = proto; /* PID compression */
1426 unsigned char *data = isdn_ppp_skb_push(&skb, 5);
1429 data[0] = MP_BEGIN_FRAG | MP_END_FRAG; /* (B)egin & (E)ndbit .. */
1430 data[1] = (mp_seqno >> 16) & 0xff; /* sequence number: 24bit */
1431 data[2] = (mp_seqno >> 8) & 0xff;
1432 data[3] = (mp_seqno >> 0) & 0xff;
1433 data[4] = proto; /* PID compression */
1435 proto = PPP_MP; /* MP Protocol, 0x003d */
1440 * 'link in bundle' compression ...
1442 if (ipt->compflags & SC_LINK_COMP_ON)
1443 skb = isdn_ppp_compress(skb, &proto, ipt, ipts, 1);
1445 if ((ipt->pppcfg & SC_COMP_PROT) && (proto <= 0xff)) {
1446 unsigned char *data = isdn_ppp_skb_push(&skb, 1);
1449 data[0] = proto & 0xff;
1452 unsigned char *data = isdn_ppp_skb_push(&skb, 2);
1455 data[0] = (proto >> 8) & 0xff;
1456 data[1] = proto & 0xff;
1458 if (!(ipt->pppcfg & SC_COMP_AC)) {
1459 unsigned char *data = isdn_ppp_skb_push(&skb, 2);
1462 data[0] = 0xff; /* All Stations */
1463 data[1] = 0x03; /* Unnumbered information */
1466 /* tx-stats are now updated via BSENT-callback */
1468 if (ipts->debug & 0x40) {
1469 printk(KERN_DEBUG "skb xmit: len: %d\n", (int) skb->len);
1470 isdn_ppp_frame_log("xmit", skb->data, skb->len, 32, ipt->unit, lp->ppp_slot);
1473 isdn_net_writebuf_skb(lp, skb);
1476 spin_unlock_bh(&lp->xmit_lock);
1481 #ifdef CONFIG_IPPP_FILTER
1483 * check if this packet may trigger auto-dial.
1486 int isdn_ppp_autodial_filter(struct sk_buff *skb, isdn_net_local *lp)
1488 struct ippp_struct *is = ippp_table[lp->ppp_slot];
1492 switch (ntohs(skb->protocol)) {
1500 printk(KERN_ERR "isdn_ppp_autodial_filter: unsupported protocol 0x%x.\n",
1505 /* the filter instructions are constructed assuming
1506 * a four-byte PPP header on each packet. we have to
1507 * temporarily remove part of the fake header stuck on
1510 *skb_pull(skb, IPPP_MAX_HEADER - 4) = 1; /* indicate outbound */
1513 __be16 *p = (__be16 *)skb->data;
1519 drop |= is->pass_filter
1520 && SK_RUN_FILTER(is->pass_filter, skb) == 0;
1521 drop |= is->active_filter
1522 && SK_RUN_FILTER(is->active_filter, skb) == 0;
1524 skb_push(skb, IPPP_MAX_HEADER - 4);
1528 #ifdef CONFIG_ISDN_MPP
1530 /* this is _not_ rfc1990 header, but something we convert both short and long
1531 * headers to for convinience's sake:
1532 * byte 0 is flags as in rfc1990
1533 * bytes 1...4 is 24-bit seqence number converted to host byte order
1535 #define MP_HEADER_LEN 5
1537 #define MP_LONGSEQ_MASK 0x00ffffff
1538 #define MP_SHORTSEQ_MASK 0x00000fff
1539 #define MP_LONGSEQ_MAX MP_LONGSEQ_MASK
1540 #define MP_SHORTSEQ_MAX MP_SHORTSEQ_MASK
1541 #define MP_LONGSEQ_MAXBIT ((MP_LONGSEQ_MASK + 1) >> 1)
1542 #define MP_SHORTSEQ_MAXBIT ((MP_SHORTSEQ_MASK + 1) >> 1)
1544 /* sequence-wrap safe comparisons (for long sequence)*/
1545 #define MP_LT(a, b) ((a - b) & MP_LONGSEQ_MAXBIT)
1546 #define MP_LE(a, b) !((b - a) & MP_LONGSEQ_MAXBIT)
1547 #define MP_GT(a, b) ((b - a) & MP_LONGSEQ_MAXBIT)
1548 #define MP_GE(a, b) !((a - b) & MP_LONGSEQ_MAXBIT)
1550 #define MP_SEQ(f) ((*(u32 *)(f->data + 1)))
1551 #define MP_FLAGS(f) (f->data[0])
1553 static int isdn_ppp_mp_bundle_array_init(void)
1556 int sz = ISDN_MAX_CHANNELS * sizeof(ippp_bundle);
1557 if ((isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL)
1559 for (i = 0; i < ISDN_MAX_CHANNELS; i++)
1560 spin_lock_init(&isdn_ppp_bundle_arr[i].lock);
1564 static ippp_bundle *isdn_ppp_mp_bundle_alloc(void)
1567 for (i = 0; i < ISDN_MAX_CHANNELS; i++)
1568 if (isdn_ppp_bundle_arr[i].ref_ct <= 0)
1569 return (isdn_ppp_bundle_arr + i);
1573 static int isdn_ppp_mp_init(isdn_net_local *lp, ippp_bundle *add_to)
1575 struct ippp_struct *is;
1577 if (lp->ppp_slot < 0) {
1578 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
1579 __func__, lp->ppp_slot);
1583 is = ippp_table[lp->ppp_slot];
1586 lp->netdev->pb->ref_ct--;
1587 lp->netdev->pb = add_to;
1588 } else { /* first link in a bundle */
1590 if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL)
1592 lp->next = lp->last = lp; /* nobody else in a queue */
1593 lp->netdev->pb->frags = NULL;
1594 lp->netdev->pb->frames = 0;
1595 lp->netdev->pb->seq = UINT_MAX;
1597 lp->netdev->pb->ref_ct++;
1599 is->last_link_seqno = 0;
1603 static u32 isdn_ppp_mp_get_seq(int short_seq,
1604 struct sk_buff *skb, u32 last_seq);
1605 static struct sk_buff *isdn_ppp_mp_discard(ippp_bundle *mp,
1606 struct sk_buff *from, struct sk_buff *to);
1607 static void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp,
1608 struct sk_buff *from, struct sk_buff *to);
1609 static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb);
1610 static void isdn_ppp_mp_print_recv_pkt(int slot, struct sk_buff *skb);
1612 static void isdn_ppp_mp_receive(isdn_net_dev *net_dev, isdn_net_local *lp,
1613 struct sk_buff *skb)
1615 struct ippp_struct *is;
1616 isdn_net_local *lpq;
1618 isdn_mppp_stats *stats;
1619 struct sk_buff *newfrag, *frag, *start, *nextf;
1620 u32 newseq, minseq, thisseq;
1621 unsigned long flags;
1624 spin_lock_irqsave(&net_dev->pb->lock, flags);
1627 slot = lp->ppp_slot;
1628 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1629 printk(KERN_ERR "%s: lp->ppp_slot(%d)\n",
1630 __func__, lp->ppp_slot);
1631 stats->frame_drops++;
1633 spin_unlock_irqrestore(&mp->lock, flags);
1636 is = ippp_table[slot];
1637 if (++mp->frames > stats->max_queue_len)
1638 stats->max_queue_len = mp->frames;
1640 if (is->debug & 0x8)
1641 isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb);
1643 newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ,
1644 skb, is->last_link_seqno);
1647 /* if this packet seq # is less than last already processed one,
1648 * toss it right away, but check for sequence start case first
1650 if (mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT)) {
1651 mp->seq = newseq; /* the first packet: required for
1652 * rfc1990 non-compliant clients --
1653 * prevents constant packet toss */
1654 } else if (MP_LT(newseq, mp->seq)) {
1655 stats->frame_drops++;
1656 isdn_ppp_mp_free_skb(mp, skb);
1657 spin_unlock_irqrestore(&mp->lock, flags);
1661 /* find the minimum received sequence number over all links */
1662 is->last_link_seqno = minseq = newseq;
1663 for (lpq = net_dev->queue;;) {
1664 slot = lpq->ppp_slot;
1665 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1666 printk(KERN_ERR "%s: lpq->ppp_slot(%d)\n",
1667 __func__, lpq->ppp_slot);
1669 u32 lls = ippp_table[slot]->last_link_seqno;
1670 if (MP_LT(lls, minseq))
1673 if ((lpq = lpq->next) == net_dev->queue)
1676 if (MP_LT(minseq, mp->seq))
1677 minseq = mp->seq; /* can't go beyond already processed
1681 /* if this new fragment is before the first one, then enqueue it now. */
1682 if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) {
1683 newfrag->next = frag;
1684 mp->frags = frag = newfrag;
1688 start = MP_FLAGS(frag) & MP_BEGIN_FRAG &&
1689 MP_SEQ(frag) == mp->seq ? frag : NULL;
1692 * main fragment traversing loop
1694 * try to accomplish several tasks:
1695 * - insert new fragment into the proper sequence slot (once that's done
1696 * newfrag will be set to NULL)
1697 * - reassemble any complete fragment sequence (non-null 'start'
1698 * indicates there is a contiguous sequence present)
1699 * - discard any incomplete sequences that are below minseq -- due
1700 * to the fact that sender always increment sequence number, if there
1701 * is an incomplete sequence below minseq, no new fragments would
1702 * come to complete such sequence and it should be discarded
1704 * loop completes when we accomplished the following tasks:
1705 * - new fragment is inserted in the proper sequence ('newfrag' is
1707 * - we hit a gap in the sequence, so no reassembly/processing is
1708 * possible ('start' would be set to NULL)
1710 * algorithm for this code is derived from code in the book
1711 * 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
1713 while (start != NULL || newfrag != NULL) {
1715 thisseq = MP_SEQ(frag);
1718 /* drop any duplicate fragments */
1719 if (newfrag != NULL && thisseq == newseq) {
1720 isdn_ppp_mp_free_skb(mp, newfrag);
1724 /* insert new fragment before next element if possible. */
1725 if (newfrag != NULL && (nextf == NULL ||
1726 MP_LT(newseq, MP_SEQ(nextf)))) {
1727 newfrag->next = nextf;
1728 frag->next = nextf = newfrag;
1732 if (start != NULL) {
1733 /* check for misplaced start */
1734 if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
1735 printk(KERN_WARNING"isdn_mppp(seq %d): new "
1736 "BEGIN flag with no prior END", thisseq);
1738 stats->frame_drops++;
1739 start = isdn_ppp_mp_discard(mp, start, frag);
1742 } else if (MP_LE(thisseq, minseq)) {
1743 if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
1746 if (MP_FLAGS(frag) & MP_END_FRAG)
1747 stats->frame_drops++;
1748 if (mp->frags == frag)
1750 isdn_ppp_mp_free_skb(mp, frag);
1756 /* if start is non-null and we have end fragment, then
1757 * we have full reassembly sequence -- reassemble
1758 * and process packet now
1760 if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) {
1761 minseq = mp->seq = (thisseq + 1) & MP_LONGSEQ_MASK;
1762 /* Reassemble the packet then dispatch it */
1763 isdn_ppp_mp_reassembly(net_dev, lp, start, nextf);
1771 /* check if need to update start pointer: if we just
1772 * reassembled the packet and sequence is contiguous
1773 * then next fragment should be the start of new reassembly
1774 * if sequence is contiguous, but we haven't reassembled yet,
1776 * if sequence is not contiguous, either clear everything
1777 * below low watermark and set start to the next frag or
1780 if (nextf != NULL &&
1781 ((thisseq + 1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) {
1782 /* if we just reassembled and the next one is here,
1783 * then start another reassembly. */
1786 if (MP_FLAGS(nextf) & MP_BEGIN_FRAG)
1790 printk(KERN_WARNING"isdn_mppp(seq %d):"
1791 " END flag with no following "
1798 if (nextf != NULL && frag != NULL &&
1799 MP_LT(thisseq, minseq)) {
1800 /* we've got a break in the sequence
1801 * and we not at the end yet
1802 * and we did not just reassembled
1803 *(if we did, there wouldn't be anything before)
1804 * and we below the low watermark
1805 * discard all the frames below low watermark
1807 stats->frame_drops++;
1808 mp->frags = isdn_ppp_mp_discard(mp, start, nextf);
1810 /* break in the sequence, no reassembly */
1815 } /* while -- main loop */
1817 if (mp->frags == NULL)
1820 /* rather straighforward way to deal with (not very) possible
1822 if (mp->frames > MP_MAX_QUEUE_LEN) {
1824 while (mp->frames > MP_MAX_QUEUE_LEN) {
1825 frag = mp->frags->next;
1826 isdn_ppp_mp_free_skb(mp, mp->frags);
1830 spin_unlock_irqrestore(&mp->lock, flags);
1833 static void isdn_ppp_mp_cleanup(isdn_net_local *lp)
1835 struct sk_buff *frag = lp->netdev->pb->frags;
1836 struct sk_buff *nextfrag;
1838 nextfrag = frag->next;
1839 isdn_ppp_mp_free_skb(lp->netdev->pb, frag);
1842 lp->netdev->pb->frags = NULL;
1845 static u32 isdn_ppp_mp_get_seq(int short_seq,
1846 struct sk_buff *skb, u32 last_seq)
1849 int flags = skb->data[0] & (MP_BEGIN_FRAG | MP_END_FRAG);
1853 seq = ntohl(*(__be32 *)skb->data) & MP_LONGSEQ_MASK;
1858 /* convert 12-bit short seq number to 24-bit long one
1860 seq = ntohs(*(__be16 *)skb->data) & MP_SHORTSEQ_MASK;
1862 /* check for seqence wrap */
1863 if (!(seq & MP_SHORTSEQ_MAXBIT) &&
1864 (last_seq & MP_SHORTSEQ_MAXBIT) &&
1865 (unsigned long)last_seq <= MP_LONGSEQ_MAX)
1866 seq |= (last_seq + MP_SHORTSEQ_MAX + 1) &
1867 (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
1869 seq |= last_seq & (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
1871 skb_push(skb, 3); /* put converted seqence back in skb */
1873 *(u32 *)(skb->data + 1) = seq; /* put seqence back in _host_ byte
1875 skb->data[0] = flags; /* restore flags */
1879 struct sk_buff *isdn_ppp_mp_discard(ippp_bundle *mp,
1880 struct sk_buff *from, struct sk_buff *to)
1883 while (from != to) {
1884 struct sk_buff *next = from->next;
1885 isdn_ppp_mp_free_skb(mp, from);
1891 void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp,
1892 struct sk_buff *from, struct sk_buff *to)
1894 ippp_bundle *mp = net_dev->pb;
1896 struct sk_buff *skb;
1897 unsigned int tot_len;
1899 if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
1900 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
1901 __func__, lp->ppp_slot);
1904 if (MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG)) {
1905 if (ippp_table[lp->ppp_slot]->debug & 0x40)
1906 printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, "
1907 "len %d\n", MP_SEQ(from), from->len);
1909 skb_pull(skb, MP_HEADER_LEN);
1912 struct sk_buff *frag;
1915 for (tot_len = n = 0, frag = from; frag != to; frag = frag->next, n++)
1916 tot_len += frag->len - MP_HEADER_LEN;
1918 if (ippp_table[lp->ppp_slot]->debug & 0x40)
1919 printk(KERN_DEBUG"isdn_mppp: reassembling frames %d "
1920 "to %d, len %d\n", MP_SEQ(from),
1921 (MP_SEQ(from) + n - 1) & MP_LONGSEQ_MASK, tot_len);
1922 if ((skb = dev_alloc_skb(tot_len)) == NULL) {
1923 printk(KERN_ERR "isdn_mppp: cannot allocate sk buff "
1924 "of size %d\n", tot_len);
1925 isdn_ppp_mp_discard(mp, from, to);
1929 while (from != to) {
1930 unsigned int len = from->len - MP_HEADER_LEN;
1932 skb_copy_from_linear_data_offset(from, MP_HEADER_LEN,
1936 isdn_ppp_mp_free_skb(mp, from);
1940 proto = isdn_ppp_strip_proto(skb);
1941 isdn_ppp_push_higher(net_dev, lp, skb, proto);
1944 static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb)
1950 static void isdn_ppp_mp_print_recv_pkt(int slot, struct sk_buff *skb)
1952 printk(KERN_DEBUG "mp_recv: %d/%d -> %02x %02x %02x %02x %02x %02x\n",
1953 slot, (int) skb->len,
1954 (int) skb->data[0], (int) skb->data[1], (int) skb->data[2],
1955 (int) skb->data[3], (int) skb->data[4], (int) skb->data[5]);
1959 isdn_ppp_bundle(struct ippp_struct *is, int unit)
1961 char ifn[IFNAMSIZ + 1];
1963 isdn_net_local *lp, *nlp;
1965 unsigned long flags;
1967 sprintf(ifn, "ippp%d", unit);
1968 p = isdn_net_findif(ifn);
1970 printk(KERN_ERR "ippp_bundle: cannot find %s\n", ifn);
1974 spin_lock_irqsave(&p->pb->lock, flags);
1978 if (nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ||
1979 lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
1980 printk(KERN_ERR "ippp_bundle: binding to invalid slot %d\n",
1981 nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ?
1982 nlp->ppp_slot : lp->ppp_slot);
1987 isdn_net_add_to_bundle(p, nlp);
1989 ippp_table[nlp->ppp_slot]->unit = ippp_table[lp->ppp_slot]->unit;
1991 /* maybe also SC_CCP stuff */
1992 ippp_table[nlp->ppp_slot]->pppcfg |= ippp_table[lp->ppp_slot]->pppcfg &
1993 (SC_ENABLE_IP | SC_NO_TCP_CCID | SC_REJ_COMP_TCP);
1994 ippp_table[nlp->ppp_slot]->mpppcfg |= ippp_table[lp->ppp_slot]->mpppcfg &
1995 (SC_MP_PROT | SC_REJ_MP_PROT | SC_OUT_SHORT_SEQ | SC_IN_SHORT_SEQ);
1996 rc = isdn_ppp_mp_init(nlp, p->pb);
1998 spin_unlock_irqrestore(&p->pb->lock, flags);
2002 #endif /* CONFIG_ISDN_MPP */
2005 * network device ioctl handlers
2009 isdn_ppp_dev_ioctl_stats(int slot, struct ifreq *ifr, struct net_device *dev)
2011 struct ppp_stats __user *res = ifr->ifr_data;
2013 isdn_net_local *lp = netdev_priv(dev);
2015 if (!access_ok(VERIFY_WRITE, res, sizeof(struct ppp_stats)))
2018 /* build a temporary stat struct and copy it to user space */
2020 memset(&t, 0, sizeof(struct ppp_stats));
2021 if (dev->flags & IFF_UP) {
2022 t.p.ppp_ipackets = lp->stats.rx_packets;
2023 t.p.ppp_ibytes = lp->stats.rx_bytes;
2024 t.p.ppp_ierrors = lp->stats.rx_errors;
2025 t.p.ppp_opackets = lp->stats.tx_packets;
2026 t.p.ppp_obytes = lp->stats.tx_bytes;
2027 t.p.ppp_oerrors = lp->stats.tx_errors;
2028 #ifdef CONFIG_ISDN_PPP_VJ
2029 if (slot >= 0 && ippp_table[slot]->slcomp) {
2030 struct slcompress *slcomp = ippp_table[slot]->slcomp;
2031 t.vj.vjs_packets = slcomp->sls_o_compressed + slcomp->sls_o_uncompressed;
2032 t.vj.vjs_compressed = slcomp->sls_o_compressed;
2033 t.vj.vjs_searches = slcomp->sls_o_searches;
2034 t.vj.vjs_misses = slcomp->sls_o_misses;
2035 t.vj.vjs_errorin = slcomp->sls_i_error;
2036 t.vj.vjs_tossed = slcomp->sls_i_tossed;
2037 t.vj.vjs_uncompressedin = slcomp->sls_i_uncompressed;
2038 t.vj.vjs_compressedin = slcomp->sls_i_compressed;
2042 if (copy_to_user(res, &t, sizeof(struct ppp_stats)))
2048 isdn_ppp_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2052 isdn_net_local *lp = netdev_priv(dev);
2055 if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
2059 #define PPP_VERSION "2.3.7"
2061 len = strlen(PPP_VERSION) + 1;
2062 if (copy_to_user(ifr->ifr_data, PPP_VERSION, len))
2067 error = isdn_ppp_dev_ioctl_stats(lp->ppp_slot, ifr, dev);
2077 isdn_ppp_if_get_unit(char *name)
2086 if (strncmp("ippp", name, 4) || len > 8)
2089 for (i = 0, deci = 1; i < len; i++, deci *= 10) {
2090 char a = name[len - i - 1];
2091 if (a >= '0' && a <= '9')
2092 unit += (a - '0') * deci;
2096 if (!i || len - i != 4)
2104 isdn_ppp_dial_slave(char *name)
2106 #ifdef CONFIG_ISDN_MPP
2109 struct net_device *sdev;
2111 if (!(ndev = isdn_net_findif(name)))
2114 if (!(lp->flags & ISDN_NET_CONNECTED))
2119 isdn_net_local *mlp = netdev_priv(sdev);
2120 if (!(mlp->flags & ISDN_NET_CONNECTED))
2127 isdn_net_dial_req(netdev_priv(sdev));
2135 isdn_ppp_hangup_slave(char *name)
2137 #ifdef CONFIG_ISDN_MPP
2140 struct net_device *sdev;
2142 if (!(ndev = isdn_net_findif(name)))
2145 if (!(lp->flags & ISDN_NET_CONNECTED))
2150 isdn_net_local *mlp = netdev_priv(sdev);
2152 if (mlp->slave) { /* find last connected link in chain */
2153 isdn_net_local *nlp = ISDN_SLAVE_PRIV(mlp);
2155 if (!(nlp->flags & ISDN_NET_CONNECTED))
2157 } else if (mlp->flags & ISDN_NET_CONNECTED)
2165 isdn_net_hangup(sdev);
2173 * PPP compression stuff
2177 /* Push an empty CCP Data Frame up to the daemon to wake it up and let it
2178 generate a CCP Reset-Request or tear down CCP altogether */
2180 static void isdn_ppp_ccp_kickup(struct ippp_struct *is)
2182 isdn_ppp_fill_rq(NULL, 0, PPP_COMP, is->lp->ppp_slot);
2185 /* In-kernel handling of CCP Reset-Request and Reset-Ack is necessary,
2186 but absolutely nontrivial. The most abstruse problem we are facing is
2187 that the generation, reception and all the handling of timeouts and
2188 resends including proper request id management should be entirely left
2189 to the (de)compressor, but indeed is not covered by the current API to
2190 the (de)compressor. The API is a prototype version from PPP where only
2191 some (de)compressors have yet been implemented and all of them are
2192 rather simple in their reset handling. Especially, their is only one
2193 outstanding ResetAck at a time with all of them and ResetReq/-Acks do
2194 not have parameters. For this very special case it was sufficient to
2195 just return an error code from the decompressor and have a single
2196 reset() entry to communicate all the necessary information between
2197 the framework and the (de)compressor. Bad enough, LZS is different
2198 (and any other compressor may be different, too). It has multiple
2199 histories (eventually) and needs to Reset each of them independently
2200 and thus uses multiple outstanding Acks and history numbers as an
2201 additional parameter to Reqs/Acks.
2202 All that makes it harder to port the reset state engine into the
2203 kernel because it is not just the same simple one as in (i)pppd but
2204 it must be able to pass additional parameters and have multiple out-
2205 standing Acks. We are trying to achieve the impossible by handling
2206 reset transactions independent by their id. The id MUST change when
2207 the data portion changes, thus any (de)compressor who uses more than
2208 one resettable state must provide and recognize individual ids for
2209 each individual reset transaction. The framework itself does _only_
2210 differentiate them by id, because it has no other semantics like the
2211 (de)compressor might.
2212 This looks like a major redesign of the interface would be nice,
2213 but I don't have an idea how to do it better. */
2215 /* Send a CCP Reset-Request or Reset-Ack directly from the kernel. This is
2216 getting that lengthy because there is no simple "send-this-frame-out"
2217 function above but every wrapper does a bit different. Hope I guess
2218 correct in this hack... */
2220 static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
2221 unsigned char code, unsigned char id,
2222 unsigned char *data, int len)
2224 struct sk_buff *skb;
2228 isdn_net_local *lp = is->lp;
2230 /* Alloc large enough skb */
2231 hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
2232 skb = alloc_skb(len + hl + 16, GFP_ATOMIC);
2235 "ippp: CCP cannot send reset - out of memory\n");
2238 skb_reserve(skb, hl);
2240 /* We may need to stuff an address and control field first */
2241 if (!(is->pppcfg & SC_COMP_AC)) {
2242 p = skb_put(skb, 2);
2247 /* Stuff proto, code, id and length */
2248 p = skb_put(skb, 6);
2249 *p++ = (proto >> 8);
2250 *p++ = (proto & 0xff);
2255 *p++ = (cnt & 0xff);
2257 /* Now stuff remaining bytes */
2259 p = skb_put(skb, len);
2260 memcpy(p, data, len);
2263 /* skb is now ready for xmit */
2264 printk(KERN_DEBUG "Sending CCP Frame:\n");
2265 isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
2267 isdn_net_write_super(lp, skb);
2270 /* Allocate the reset state vector */
2271 static struct ippp_ccp_reset *isdn_ppp_ccp_reset_alloc(struct ippp_struct *is)
2273 struct ippp_ccp_reset *r;
2274 r = kzalloc(sizeof(struct ippp_ccp_reset), GFP_KERNEL);
2276 printk(KERN_ERR "ippp_ccp: failed to allocate reset data"
2277 " structure - no mem\n");
2280 printk(KERN_DEBUG "ippp_ccp: allocated reset data structure %p\n", r);
2285 /* Destroy the reset state vector. Kill all pending timers first. */
2286 static void isdn_ppp_ccp_reset_free(struct ippp_struct *is)
2290 printk(KERN_DEBUG "ippp_ccp: freeing reset data structure %p\n",
2292 for (id = 0; id < 256; id++) {
2293 if (is->reset->rs[id]) {
2294 isdn_ppp_ccp_reset_free_state(is, (unsigned char)id);
2301 /* Free a given state and clear everything up for later reallocation */
2302 static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
2305 struct ippp_ccp_reset_state *rs;
2307 if (is->reset->rs[id]) {
2308 printk(KERN_DEBUG "ippp_ccp: freeing state for id %d\n", id);
2309 rs = is->reset->rs[id];
2310 /* Make sure the kernel will not call back later */
2312 del_timer(&rs->timer);
2313 is->reset->rs[id] = NULL;
2316 printk(KERN_WARNING "ippp_ccp: id %d is not allocated\n", id);
2320 /* The timer callback function which is called when a ResetReq has timed out,
2321 aka has never been answered by a ResetAck */
2322 static void isdn_ppp_ccp_timer_callback(unsigned long closure)
2324 struct ippp_ccp_reset_state *rs =
2325 (struct ippp_ccp_reset_state *)closure;
2328 printk(KERN_ERR "ippp_ccp: timer cb with zero closure.\n");
2331 if (rs->ta && rs->state == CCPResetSentReq) {
2332 /* We are correct here */
2334 /* Hmm, there is no Ack really expected. We can clean
2335 up the state now, it will be reallocated if the
2336 decompressor insists on another reset */
2338 isdn_ppp_ccp_reset_free_state(rs->is, rs->id);
2341 printk(KERN_DEBUG "ippp_ccp: CCP Reset timed out for id %d\n",
2344 isdn_ppp_ccp_xmit_reset(rs->is, PPP_CCP, CCP_RESETREQ, rs->id,
2345 rs->data, rs->dlen);
2347 rs->timer.expires = jiffies + HZ * 5;
2348 add_timer(&rs->timer);
2350 printk(KERN_WARNING "ippp_ccp: timer cb in wrong state %d\n",
2355 /* Allocate a new reset transaction state */
2356 static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
2359 struct ippp_ccp_reset_state *rs;
2360 if (is->reset->rs[id]) {
2361 printk(KERN_WARNING "ippp_ccp: old state exists for id %d\n",
2365 rs = kzalloc(sizeof(struct ippp_ccp_reset_state), GFP_KERNEL);
2368 rs->state = CCPResetIdle;
2371 init_timer(&rs->timer);
2372 rs->timer.data = (unsigned long)rs;
2373 rs->timer.function = isdn_ppp_ccp_timer_callback;
2374 is->reset->rs[id] = rs;
2380 /* A decompressor wants a reset with a set of parameters - do what is
2381 necessary to fulfill it */
2382 static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
2383 struct isdn_ppp_resetparams *rp)
2385 struct ippp_ccp_reset_state *rs;
2388 /* The decompressor defines parameters by itself */
2390 /* And he wants us to send a request */
2392 printk(KERN_ERR "ippp_ccp: decompressor must"
2393 " specify reset id\n");
2396 if (is->reset->rs[rp->id]) {
2397 /* There is already a transaction in existence
2398 for this id. May be still waiting for a
2399 Ack or may be wrong. */
2400 rs = is->reset->rs[rp->id];
2401 if (rs->state == CCPResetSentReq && rs->ta) {
2402 printk(KERN_DEBUG "ippp_ccp: reset"
2403 " trans still in progress"
2404 " for id %d\n", rp->id);
2406 printk(KERN_WARNING "ippp_ccp: reset"
2407 " trans in wrong state %d for"
2408 " id %d\n", rs->state, rp->id);
2411 /* Ok, this is a new transaction */
2412 printk(KERN_DEBUG "ippp_ccp: new trans for id"
2413 " %d to be started\n", rp->id);
2414 rs = isdn_ppp_ccp_reset_alloc_state(is, rp->id);
2416 printk(KERN_ERR "ippp_ccp: out of mem"
2417 " allocing ccp trans\n");
2420 rs->state = CCPResetSentReq;
2421 rs->expra = rp->expra;
2423 rs->dlen = rp->dlen;
2424 memcpy(rs->data, rp->data, rp->dlen);
2426 /* HACK TODO - add link comp here */
2427 isdn_ppp_ccp_xmit_reset(is, PPP_CCP,
2428 CCP_RESETREQ, rs->id,
2429 rs->data, rs->dlen);
2430 /* Start the timer */
2431 rs->timer.expires = jiffies + 5 * HZ;
2432 add_timer(&rs->timer);
2436 printk(KERN_DEBUG "ippp_ccp: no reset sent\n");
2439 /* The reset params are invalid. The decompressor does not
2440 care about them, so we just send the minimal requests
2441 and increase ids only when an Ack is received for a
2443 if (is->reset->rs[is->reset->lastid]) {
2444 /* There is already a transaction in existence
2445 for this id. May be still waiting for a
2446 Ack or may be wrong. */
2447 rs = is->reset->rs[is->reset->lastid];
2448 if (rs->state == CCPResetSentReq && rs->ta) {
2449 printk(KERN_DEBUG "ippp_ccp: reset"
2450 " trans still in progress"
2451 " for id %d\n", rp->id);
2453 printk(KERN_WARNING "ippp_ccp: reset"
2454 " trans in wrong state %d for"
2455 " id %d\n", rs->state, rp->id);
2458 printk(KERN_DEBUG "ippp_ccp: new trans for id"
2459 " %d to be started\n", is->reset->lastid);
2460 rs = isdn_ppp_ccp_reset_alloc_state(is,
2463 printk(KERN_ERR "ippp_ccp: out of mem"
2464 " allocing ccp trans\n");
2467 rs->state = CCPResetSentReq;
2468 /* We always expect an Ack if the decompressor doesn't
2472 /* HACK TODO - add link comp here */
2473 isdn_ppp_ccp_xmit_reset(is, PPP_CCP, CCP_RESETREQ,
2475 /* Start the timer */
2476 rs->timer.expires = jiffies + 5 * HZ;
2477 add_timer(&rs->timer);
2483 /* An Ack was received for this id. This means we stop the timer and clean
2484 up the state prior to calling the decompressors reset routine. */
2485 static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
2488 struct ippp_ccp_reset_state *rs = is->reset->rs[id];
2491 if (rs->ta && rs->state == CCPResetSentReq) {
2492 /* Great, we are correct */
2494 printk(KERN_DEBUG "ippp_ccp: ResetAck received"
2495 " for id %d but not expected\n", id);
2497 printk(KERN_INFO "ippp_ccp: ResetAck received out of"
2498 "sync for id %d\n", id);
2502 del_timer(&rs->timer);
2504 isdn_ppp_ccp_reset_free_state(is, id);
2506 printk(KERN_INFO "ippp_ccp: ResetAck received for unknown id"
2509 /* Make sure the simple reset stuff uses a new id next time */
2510 is->reset->lastid++;
2516 * if master = 0, we're trying to uncompress an per-link compressed packet,
2517 * as opposed to an compressed reconstructed-from-MPPP packet.
2518 * proto is updated to protocol field of uncompressed packet.
2520 * retval: decompressed packet,
2521 * same packet if uncompressed,
2522 * NULL if decompression error
2525 static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb, struct ippp_struct *is, struct ippp_struct *master,
2529 struct isdn_ppp_compressor *ipc = NULL;
2530 struct sk_buff *skb_out;
2532 struct ippp_struct *ri;
2533 struct isdn_ppp_resetparams rsparm;
2534 unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
2537 // per-link decompression
2538 stat = is->link_decomp_stat;
2539 ipc = is->link_decompressor;
2542 stat = master->decomp_stat;
2543 ipc = master->decompressor;
2548 // no decompressor -> we can't decompress.
2549 printk(KERN_DEBUG "ippp: no decompressor defined!\n");
2552 BUG_ON(!stat); // if we have a compressor, stat has been set as well
2554 if ((master && *proto == PPP_COMP) || (!master && *proto == PPP_COMPFRAG)) {
2555 // compressed packets are compressed by their protocol type
2557 // Set up reset params for the decompressor
2558 memset(&rsparm, 0, sizeof(rsparm));
2559 rsparm.data = rsdata;
2560 rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
2562 skb_out = dev_alloc_skb(is->mru + PPP_HDRLEN);
2565 printk(KERN_ERR "ippp: decomp memory allocation failure\n");
2568 len = ipc->decompress(stat, skb, skb_out, &rsparm);
2573 printk(KERN_INFO "ippp: decomp wants reset %s params\n",
2574 rsparm.valid ? "with" : "without");
2576 isdn_ppp_ccp_reset_trans(ri, &rsparm);
2578 case DECOMP_FATALERROR:
2579 ri->pppcfg |= SC_DC_FERROR;
2580 /* Kick ipppd to recognize the error */
2581 isdn_ppp_ccp_kickup(ri);
2587 *proto = isdn_ppp_strip_proto(skb_out);
2594 // uncompressed packets are fed through the decompressor to
2595 // update the decompressor state
2596 ipc->incomp(stat, skb, *proto);
2603 * type=0: normal/bundle compression
2604 * =1: link compression
2605 * returns original skb if we haven't compressed the frame
2606 * and a new skb pointer if we've done it
2608 static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in, int *proto,
2609 struct ippp_struct *is, struct ippp_struct *master, int type)
2613 struct isdn_ppp_compressor *compressor;
2615 struct sk_buff *skb_out;
2617 /* we do not compress control protocols */
2618 if (*proto < 0 || *proto > 0x3fff) {
2622 if (type) { /* type=1 => Link compression */
2627 compressor = is->compressor;
2628 stat = is->comp_stat;
2631 compressor = master->compressor;
2632 stat = master->comp_stat;
2634 new_proto = PPP_COMP;
2638 printk(KERN_ERR "isdn_ppp: No compressor set!\n");
2642 printk(KERN_ERR "isdn_ppp: Compressor not initialized?\n");
2646 /* Allow for at least 150 % expansion (for now) */
2647 skb_out = alloc_skb(skb_in->len + skb_in->len / 2 + 32 +
2648 skb_headroom(skb_in), GFP_ATOMIC);
2651 skb_reserve(skb_out, skb_headroom(skb_in));
2653 ret = (compressor->compress)(stat, skb_in, skb_out, *proto);
2655 dev_kfree_skb(skb_out);
2659 dev_kfree_skb(skb_in);
2665 * we received a CCP frame ..
2666 * not a clean solution, but we MUST handle a few cases in the kernel
2668 static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
2669 struct sk_buff *skb, int proto)
2671 struct ippp_struct *is;
2672 struct ippp_struct *mis;
2674 struct isdn_ppp_resetparams rsparm;
2675 unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
2677 printk(KERN_DEBUG "Received CCP frame from peer slot(%d)\n",
2679 if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
2680 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
2681 __func__, lp->ppp_slot);
2684 is = ippp_table[lp->ppp_slot];
2685 isdn_ppp_frame_log("ccp-rcv", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
2688 int slot = ISDN_MASTER_PRIV(lp)->ppp_slot;
2689 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2690 printk(KERN_ERR "%s: slot(%d) out of range\n",
2694 mis = ippp_table[slot];
2698 switch (skb->data[0]) {
2700 if (is->debug & 0x10)
2701 printk(KERN_DEBUG "Disable compression here!\n");
2702 if (proto == PPP_CCP)
2703 mis->compflags &= ~SC_COMP_ON;
2705 is->compflags &= ~SC_LINK_COMP_ON;
2709 if (is->debug & 0x10)
2710 printk(KERN_DEBUG "Disable (de)compression here!\n");
2711 if (proto == PPP_CCP)
2712 mis->compflags &= ~(SC_DECOMP_ON | SC_COMP_ON);
2714 is->compflags &= ~(SC_LINK_DECOMP_ON | SC_LINK_COMP_ON);
2717 /* if we RECEIVE an ackowledge we enable the decompressor */
2718 if (is->debug & 0x10)
2719 printk(KERN_DEBUG "Enable decompression here!\n");
2720 if (proto == PPP_CCP) {
2721 if (!mis->decompressor)
2723 mis->compflags |= SC_DECOMP_ON;
2725 if (!is->decompressor)
2727 is->compflags |= SC_LINK_DECOMP_ON;
2732 printk(KERN_DEBUG "Received ResetAck from peer\n");
2733 len = (skb->data[2] << 8) | skb->data[3];
2736 if (proto == PPP_CCP) {
2737 /* If a reset Ack was outstanding for this id, then
2738 clean up the state engine */
2739 isdn_ppp_ccp_reset_ack_rcvd(mis, skb->data[1]);
2740 if (mis->decompressor && mis->decomp_stat)
2742 reset(mis->decomp_stat,
2745 len ? &skb->data[4] : NULL,
2747 /* TODO: This is not easy to decide here */
2748 mis->compflags &= ~SC_DECOMP_DISCARD;
2751 isdn_ppp_ccp_reset_ack_rcvd(is, skb->data[1]);
2752 if (is->link_decompressor && is->link_decomp_stat)
2753 is->link_decompressor->
2754 reset(is->link_decomp_stat,
2757 len ? &skb->data[4] : NULL,
2759 /* TODO: neither here */
2760 is->compflags &= ~SC_LINK_DECOMP_DISCARD;
2765 printk(KERN_DEBUG "Received ResetReq from peer\n");
2766 /* Receiving a ResetReq means we must reset our compressor */
2767 /* Set up reset params for the reset entry */
2768 memset(&rsparm, 0, sizeof(rsparm));
2769 rsparm.data = rsdata;
2770 rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
2771 /* Isolate data length */
2772 len = (skb->data[2] << 8) | skb->data[3];
2774 if (proto == PPP_CCP) {
2775 if (mis->compressor && mis->comp_stat)
2777 reset(mis->comp_stat,
2780 len ? &skb->data[4] : NULL,
2784 if (is->link_compressor && is->link_comp_stat)
2785 is->link_compressor->
2786 reset(is->link_comp_stat,
2789 len ? &skb->data[4] : NULL,
2792 /* Ack the Req as specified by rsparm */
2794 /* Compressor reset handler decided how to answer */
2796 /* We should send a Frame */
2797 isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
2798 rsparm.idval ? rsparm.id
2805 printk(KERN_DEBUG "ResetAck suppressed\n");
2808 /* We answer with a straight reflected Ack */
2809 isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
2811 len ? &skb->data[4] : NULL,
2820 * Daemon sends a CCP frame ...
2823 /* TODO: Clean this up with new Reset semantics */
2825 /* I believe the CCP handling as-is is done wrong. Compressed frames
2826 * should only be sent/received after CCP reaches UP state, which means
2827 * both sides have sent CONF_ACK. Currently, we handle both directions
2828 * independently, which means we may accept compressed frames too early
2829 * (supposedly not a problem), but may also mean we send compressed frames
2830 * too early, which may turn out to be a problem.
2831 * This part of state machine should actually be handled by (i)pppd, but
2832 * that's too big of a change now. --kai
2835 /* Actually, we might turn this into an advantage: deal with the RFC in
2836 * the old tradition of beeing generous on what we accept, but beeing
2837 * strict on what we send. Thus we should just
2838 * - accept compressed frames as soon as decompression is negotiated
2839 * - send compressed frames only when decomp *and* comp are negotiated
2840 * - drop rx compressed frames if we cannot decomp (instead of pushing them
2842 * and I tried to modify this file according to that. --abp
2845 static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb)
2847 struct ippp_struct *mis, *is;
2848 int proto, slot = lp->ppp_slot;
2849 unsigned char *data;
2851 if (!skb || skb->len < 3)
2853 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2854 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
2858 is = ippp_table[slot];
2859 /* Daemon may send with or without address and control field comp */
2861 if (!(is->pppcfg & SC_COMP_AC) && data[0] == 0xff && data[1] == 0x03) {
2867 proto = ((int)data[0]<<8) + data[1];
2868 if (proto != PPP_CCP && proto != PPP_CCPFRAG)
2871 printk(KERN_DEBUG "Received CCP frame from daemon:\n");
2872 isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
2875 slot = ISDN_MASTER_PRIV(lp)->ppp_slot;
2876 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2877 printk(KERN_ERR "%s: slot(%d) out of range\n",
2881 mis = ippp_table[slot];
2885 printk(KERN_DEBUG "isdn_ppp: Ouch! Master CCP sends on slave slot!\n");
2889 if (is->debug & 0x10)
2890 printk(KERN_DEBUG "Disable decompression here!\n");
2891 if (proto == PPP_CCP)
2892 is->compflags &= ~SC_DECOMP_ON;
2894 is->compflags &= ~SC_LINK_DECOMP_ON;
2898 if (is->debug & 0x10)
2899 printk(KERN_DEBUG "Disable (de)compression here!\n");
2900 if (proto == PPP_CCP)
2901 is->compflags &= ~(SC_DECOMP_ON | SC_COMP_ON);
2903 is->compflags &= ~(SC_LINK_DECOMP_ON | SC_LINK_COMP_ON);
2906 /* if we SEND an ackowledge we can/must enable the compressor */
2907 if (is->debug & 0x10)
2908 printk(KERN_DEBUG "Enable compression here!\n");
2909 if (proto == PPP_CCP) {
2910 if (!is->compressor)
2912 is->compflags |= SC_COMP_ON;
2914 if (!is->compressor)
2916 is->compflags |= SC_LINK_COMP_ON;
2920 /* If we send a ACK we should reset our compressor */
2921 if (is->debug & 0x10)
2922 printk(KERN_DEBUG "Reset decompression state here!\n");
2923 printk(KERN_DEBUG "ResetAck from daemon passed by\n");
2924 if (proto == PPP_CCP) {
2925 /* link to master? */
2926 if (is->compressor && is->comp_stat)
2927 is->compressor->reset(is->comp_stat, 0, 0,
2929 is->compflags &= ~SC_COMP_DISCARD;
2932 if (is->link_compressor && is->link_comp_stat)
2933 is->link_compressor->reset(is->link_comp_stat,
2934 0, 0, NULL, 0, NULL);
2935 is->compflags &= ~SC_LINK_COMP_DISCARD;
2939 /* Just let it pass by */
2940 printk(KERN_DEBUG "ResetReq from daemon passed by\n");
2945 int isdn_ppp_register_compressor(struct isdn_ppp_compressor *ipc)
2947 ipc->next = ipc_head;
2950 ipc_head->prev = ipc;
2956 int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor *ipc)
2959 ipc->prev->next = ipc->next;
2961 ipc_head = ipc->next;
2963 ipc->next->prev = ipc->prev;
2964 ipc->prev = ipc->next = NULL;
2968 static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_data *data)
2970 struct isdn_ppp_compressor *ipc = ipc_head;
2973 int num = data->num;
2975 if (is->debug & 0x10)
2976 printk(KERN_DEBUG "[%d] Set %s type %d\n", is->unit,
2977 (data->flags & IPPP_COMP_FLAG_XMIT) ? "compressor" : "decompressor", num);
2979 /* If is has no valid reset state vector, we cannot allocate a
2980 decompressor. The decompressor would cause reset transactions
2981 sooner or later, and they need that vector. */
2983 if (!(data->flags & IPPP_COMP_FLAG_XMIT) && !is->reset) {
2984 printk(KERN_ERR "ippp_ccp: no reset data structure - can't"
2985 " allow decompression.\n");
2990 if (ipc->num == num) {
2991 stat = ipc->alloc(data);
2993 ret = ipc->init(stat, data, is->unit, 0);
2995 printk(KERN_ERR "Can't init (de)compression!\n");
3002 printk(KERN_ERR "Can't alloc (de)compression!\n");
3006 if (data->flags & IPPP_COMP_FLAG_XMIT) {
3007 if (data->flags & IPPP_COMP_FLAG_LINK) {
3008 if (is->link_comp_stat)
3009 is->link_compressor->free(is->link_comp_stat);
3010 is->link_comp_stat = stat;
3011 is->link_compressor = ipc;
3015 is->compressor->free(is->comp_stat);
3016 is->comp_stat = stat;
3017 is->compressor = ipc;
3021 if (data->flags & IPPP_COMP_FLAG_LINK) {
3022 if (is->link_decomp_stat)
3023 is->link_decompressor->free(is->link_decomp_stat);
3024 is->link_decomp_stat = stat;
3025 is->link_decompressor = ipc;
3028 if (is->decomp_stat)
3029 is->decompressor->free(is->decomp_stat);
3030 is->decomp_stat = stat;
3031 is->decompressor = ipc;