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/config.h>
13 #include <linux/isdn.h>
14 #include <linux/poll.h>
15 #include <linux/ppp-comp.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 __FUNCTION__, 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 __FUNCTION__, 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 unit = isdn_ppp_if_get_unit(lp->name); /* get unit number from interface name .. ugly! */
196 printk(KERN_ERR "isdn_ppp_bind: illegal interface name %s.\n", lp->name);
205 is->state = IPPP_OPEN | IPPP_ASSIGNED; /* assigned to a netdevice but not connected */
206 #ifdef CONFIG_ISDN_MPP
207 retval = isdn_ppp_mp_init(lp, NULL);
210 #endif /* CONFIG_ISDN_MPP */
212 retval = lp->ppp_slot;
219 * kick the ipppd on the device
220 * (wakes up daemon after B-channel connect)
224 isdn_ppp_wakeup_daemon(isdn_net_local * lp)
226 if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
227 printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
228 __FUNCTION__, lp->ppp_slot);
231 ippp_table[lp->ppp_slot]->state = IPPP_OPEN | IPPP_CONNECT | IPPP_NOBLOCK;
232 wake_up_interruptible(&ippp_table[lp->ppp_slot]->wq);
236 * there was a hangup on the netdevice
237 * force wakeup of the ippp device
238 * go into 'device waits for release' state
241 isdn_ppp_closewait(int slot)
243 struct ippp_struct *is;
245 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
246 printk(KERN_ERR "%s: slot(%d) out of range\n",
250 is = ippp_table[slot];
252 wake_up_interruptible(&is->wq);
253 is->state = IPPP_CLOSEWAIT;
258 * isdn_ppp_find_slot / isdn_ppp_free_slot
262 isdn_ppp_get_slot(void)
265 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
266 if (!ippp_table[i]->state)
277 isdn_ppp_open(int min, struct file *file)
280 struct ippp_struct *is;
282 if (min < 0 || min > ISDN_MAX_CHANNELS)
285 slot = isdn_ppp_get_slot();
289 is = file->private_data = ippp_table[slot];
291 printk(KERN_DEBUG "ippp, open, slot: %d, minor: %d, state: %04x\n",
292 slot, min, is->state);
294 /* compression stuff */
295 is->link_compressor = is->compressor = NULL;
296 is->link_decompressor = is->decompressor = NULL;
297 is->link_comp_stat = is->comp_stat = NULL;
298 is->link_decomp_stat = is->decomp_stat = NULL;
301 is->reset = isdn_ppp_ccp_reset_alloc(is);
304 is->mp_seqno = 0; /* MP sequence number */
305 is->pppcfg = 0; /* ppp configuration */
306 is->mpppcfg = 0; /* mppp configuration */
307 is->last_link_seqno = -1; /* MP: maybe set to Bundle-MIN, when joining a bundle ?? */
308 is->unit = -1; /* set, when we have our interface */
309 is->mru = 1524; /* MRU, default 1524 */
310 is->maxcid = 16; /* VJ: maxcid */
312 init_waitqueue_head(&is->wq);
313 is->first = is->rq + NUM_RCV_BUFFS - 1; /* receive queue */
316 #ifdef CONFIG_ISDN_PPP_VJ
318 * VJ header compression init
320 is->slcomp = slhc_init(16, 16); /* not necessary for 2. link in bundle */
322 #ifdef CONFIG_IPPP_FILTER
323 is->pass_filter.filter = NULL;
324 is->active_filter.filter = NULL;
326 is->state = IPPP_OPEN;
332 * release ippp device
335 isdn_ppp_release(int min, struct file *file)
338 struct ippp_struct *is;
340 if (min < 0 || min >= ISDN_MAX_CHANNELS)
342 is = file->private_data;
345 printk(KERN_ERR "%s: no file->private_data\n", __FUNCTION__);
349 printk(KERN_DEBUG "ippp: release, minor: %d %lx\n", min, (long) is->lp);
351 if (is->lp) { /* a lp address says: this link is still up */
352 isdn_net_dev *p = is->lp->netdev;
355 printk(KERN_ERR "%s: no lp->netdev\n", __FUNCTION__);
358 is->state &= ~IPPP_CONNECT; /* -> effect: no call of wakeup */
360 * isdn_net_hangup() calls isdn_ppp_free()
361 * isdn_ppp_free() sets is->lp to NULL and lp->ppp_slot to -1
362 * removing the IPPP_CONNECT flag omits calling of isdn_ppp_wakeup_daemon()
364 isdn_net_hangup(&p->dev);
366 for (i = 0; i < NUM_RCV_BUFFS; i++) {
368 kfree(is->rq[i].buf);
369 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.filter) {
382 kfree(is->pass_filter.filter);
383 is->pass_filter.filter = NULL;
385 if (is->active_filter.filter) {
386 kfree(is->active_filter.filter);
387 is->active_filter.filter = NULL;
391 /* TODO: if this was the previous master: link the stuff to the new master */
393 is->compressor->free(is->comp_stat);
394 if(is->link_comp_stat)
395 is->link_compressor->free(is->link_comp_stat);
396 if(is->link_decomp_stat)
397 is->link_decompressor->free(is->link_decomp_stat);
399 is->decompressor->free(is->decomp_stat);
400 is->compressor = is->link_compressor = NULL;
401 is->decompressor = is->link_decompressor = NULL;
402 is->comp_stat = is->link_comp_stat = NULL;
403 is->decomp_stat = is->link_decomp_stat = NULL;
405 /* Clean up if necessary */
407 isdn_ppp_ccp_reset_free(is);
409 /* this slot is ready for new connections */
414 * get_arg .. ioctl helper
417 get_arg(void *b, void *val, int len)
420 len = sizeof(void *);
421 if (copy_from_user((void *) val, b, len))
427 * set arg .. ioctl helper
430 set_arg(void *b, void *val,int len)
433 len = sizeof(void *);
434 if (copy_to_user(b, (void *) val, len))
443 isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg)
447 struct ippp_struct *is;
449 struct isdn_ppp_comp_data data;
451 is = (struct ippp_struct *) file->private_data;
455 printk(KERN_DEBUG "isdn_ppp_ioctl: minor: %d cmd: %x state: %x\n", min, cmd, is->state);
457 if (!(is->state & IPPP_OPEN))
462 #ifdef CONFIG_ISDN_MPP
463 if (!(is->state & IPPP_CONNECT))
465 if ((r = get_arg((void *) arg, &val, sizeof(val) )))
467 printk(KERN_DEBUG "iPPP-bundle: minor: %d, slave unit: %d, master unit: %d\n",
468 (int) min, (int) is->unit, (int) val);
469 return isdn_ppp_bundle(is, val);
474 case PPPIOCGUNIT: /* get ppp/isdn unit number */
475 if ((r = set_arg((void *) arg, &is->unit, sizeof(is->unit) )))
481 if ((r = set_arg((void *) arg, lp->name, strlen(lp->name))))
484 case PPPIOCGMPFLAGS: /* get configuration flags */
485 if ((r = set_arg((void *) arg, &is->mpppcfg, sizeof(is->mpppcfg) )))
488 case PPPIOCSMPFLAGS: /* set configuration flags */
489 if ((r = get_arg((void *) arg, &val, sizeof(val) )))
493 case PPPIOCGFLAGS: /* get configuration flags */
494 if ((r = set_arg((void *) arg, &is->pppcfg,sizeof(is->pppcfg) )))
497 case PPPIOCSFLAGS: /* set configuration flags */
498 if ((r = get_arg((void *) arg, &val, sizeof(val) ))) {
501 if (val & SC_ENABLE_IP && !(is->pppcfg & SC_ENABLE_IP) && (is->state & IPPP_CONNECT)) {
503 /* OK .. we are ready to send buffers */
504 is->pppcfg = val; /* isdn_ppp_xmit test for SC_ENABLE_IP !!! */
505 netif_wake_queue(&lp->netdev->dev);
511 case PPPIOCGIDLE: /* get idle time information */
513 struct ppp_idle pidle;
514 pidle.xmit_idle = pidle.recv_idle = lp->huptimer;
515 if ((r = set_arg((void *) arg, &pidle,sizeof(struct ppp_idle))))
519 case PPPIOCSMRU: /* set receive unit size for PPP */
520 if ((r = get_arg((void *) arg, &val, sizeof(val) )))
528 case PPPIOCSMAXCID: /* set the maximum compression slot id */
529 if ((r = get_arg((void *) arg, &val, sizeof(val) )))
532 if (is->maxcid != val) {
533 #ifdef CONFIG_ISDN_PPP_VJ
534 struct slcompress *sltmp;
537 printk(KERN_DEBUG "ippp, ioctl: changed MAXCID to %ld\n", val);
539 #ifdef CONFIG_ISDN_PPP_VJ
540 sltmp = slhc_init(16, val);
542 printk(KERN_ERR "ippp, can't realloc slhc struct\n");
546 slhc_free(is->slcomp);
552 if ((r = set_arg((void *) arg, &is->debug, sizeof(is->debug) )))
556 if ((r = get_arg((void *) arg, &val, sizeof(val) )))
560 case PPPIOCGCOMPRESSORS:
562 unsigned long protos[8] = {0,};
563 struct isdn_ppp_compressor *ipc = ipc_head;
565 j = ipc->num / (sizeof(long)*8);
566 i = ipc->num % (sizeof(long)*8);
568 protos[j] |= (0x1<<i);
571 if ((r = set_arg((void *) arg,protos,8*sizeof(long) )))
575 case PPPIOCSCOMPRESSOR:
576 if ((r = get_arg((void *) arg, &data, sizeof(struct isdn_ppp_comp_data))))
578 return isdn_ppp_set_compressor(is, &data);
579 case PPPIOCGCALLINFO:
581 struct pppcallinfo pci;
582 memset((char *) &pci,0,sizeof(struct pppcallinfo));
585 strncpy(pci.local_num,lp->msn,63);
587 strncpy(pci.remote_num,lp->dial->num,63);
589 pci.charge_units = lp->charge;
591 pci.calltype = CALLTYPE_OUTGOING;
593 pci.calltype = CALLTYPE_INCOMING;
594 if(lp->flags & ISDN_NET_CALLBACK)
595 pci.calltype |= CALLTYPE_CALLBACK;
597 return set_arg((void *)arg,&pci,sizeof(struct pppcallinfo));
599 #ifdef CONFIG_IPPP_FILTER
603 struct sock_fprog uprog, *filtp;
604 struct sock_filter *code = NULL;
607 if (copy_from_user(&uprog, (void *) arg, sizeof(uprog)))
610 len = uprog.len * sizeof(struct sock_filter);
611 code = kmalloc(len, GFP_KERNEL);
614 if (copy_from_user(code, uprog.filter, len)) {
618 err = sk_chk_filter(code, uprog.len);
624 filtp = (cmd == PPPIOCSPASS) ? &is->pass_filter : &is->active_filter;
626 kfree(filtp->filter);
627 filtp->filter = code;
628 filtp->len = uprog.len;
631 #endif /* CONFIG_IPPP_FILTER */
639 isdn_ppp_poll(struct file *file, poll_table * wait)
642 struct ippp_buf_queue *bf, *bl;
644 struct ippp_struct *is;
646 is = file->private_data;
649 printk(KERN_DEBUG "isdn_ppp_poll: minor: %d\n",
650 MINOR(file->f_dentry->d_inode->i_rdev));
652 /* just registers wait_queue hook. This doesn't really wait. */
653 poll_wait(file, &is->wq, wait);
655 if (!(is->state & IPPP_OPEN)) {
656 if(is->state == IPPP_CLOSEWAIT)
658 printk(KERN_DEBUG "isdn_ppp: device not open\n");
661 /* we're always ready to send .. */
662 mask = POLLOUT | POLLWRNORM;
664 spin_lock_irqsave(&is->buflock, flags);
668 * if IPPP_NOBLOCK is set we return even if we have nothing to read
670 if (bf->next != bl || (is->state & IPPP_NOBLOCK)) {
671 is->state &= ~IPPP_NOBLOCK;
672 mask |= POLLIN | POLLRDNORM;
674 spin_unlock_irqrestore(&is->buflock, flags);
679 * fill up isdn_ppp_read() queue ..
683 isdn_ppp_fill_rq(unsigned char *buf, int len, int proto, int slot)
685 struct ippp_buf_queue *bf, *bl;
688 struct ippp_struct *is;
690 if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
691 printk(KERN_WARNING "ippp: illegal slot(%d).\n", slot);
694 is = ippp_table[slot];
696 if (!(is->state & IPPP_CONNECT)) {
697 printk(KERN_DEBUG "ippp: device not activated.\n");
700 nbuf = (unsigned char *) kmalloc(len + 4, GFP_ATOMIC);
702 printk(KERN_WARNING "ippp: Can't alloc buf\n");
705 nbuf[0] = PPP_ALLSTATIONS;
707 nbuf[2] = proto >> 8;
708 nbuf[3] = proto & 0xff;
709 memcpy(nbuf + 4, buf, len);
711 spin_lock_irqsave(&is->buflock, flags);
716 printk(KERN_WARNING "ippp: Queue is full; discarding first buffer\n");
721 bl->buf = (char *) nbuf;
725 spin_unlock_irqrestore(&is->buflock, flags);
726 wake_up_interruptible(&is->wq);
731 * read() .. non-blocking: ipppd calls it only after select()
732 * reports, that there is data
736 isdn_ppp_read(int min, struct file *file, char *buf, int count)
738 struct ippp_struct *is;
739 struct ippp_buf_queue *b;
744 is = file->private_data;
746 if (!(is->state & IPPP_OPEN))
749 if ((r = verify_area(VERIFY_WRITE, (void *) buf, count)))
752 spin_lock_irqsave(&is->buflock, flags);
756 spin_unlock_irqrestore(&is->buflock, flags);
764 spin_unlock_irqrestore(&is->buflock, flags);
765 copy_to_user(buf, save_buf, count);
772 * ipppd wanna write a packet to the card .. non-blocking
776 isdn_ppp_write(int min, struct file *file, const char *buf, int count)
779 struct ippp_struct *is;
781 unsigned char protobuf[4];
783 is = file->private_data;
785 if (!(is->state & IPPP_CONNECT))
790 /* -> push it directly to the lowlevel interface */
793 printk(KERN_DEBUG "isdn_ppp_write: lp == NULL\n");
796 * Don't reset huptimer for
797 * LCP packets. (Echo requests).
799 if (copy_from_user(protobuf, buf, 4))
801 proto = PPP_PROTOCOL(protobuf);
802 if (proto != PPP_LCP)
805 if (lp->isdn_device < 0 || lp->isdn_channel < 0)
808 if ((dev->drv[lp->isdn_device]->flags & DRV_FLAG_RUNNING) &&
809 lp->dialstate == 0 &&
810 (lp->flags & ISDN_NET_CONNECTED)) {
814 * we need to reserve enought space in front of
815 * sk_buff. old call to dev_alloc_skb only reserved
816 * 16 bytes, now we are looking what the driver want
818 hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
819 skb = alloc_skb(hl+count, GFP_ATOMIC);
821 printk(KERN_WARNING "isdn_ppp_write: out of memory!\n");
824 skb_reserve(skb, hl);
825 if (copy_from_user(skb_put(skb, count), buf, count))
830 if (is->debug & 0x40) {
831 printk(KERN_DEBUG "ppp xmit: len %d\n", (int) skb->len);
832 isdn_ppp_frame_log("xmit", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
835 isdn_ppp_send_ccp(lp->netdev,lp,skb); /* keeps CCP/compression states in sync */
837 isdn_net_write_super(lp, skb);
844 * init memory, structures etc.
853 #ifdef CONFIG_ISDN_MPP
854 if( isdn_ppp_mp_bundle_array_init() < 0 )
856 #endif /* CONFIG_ISDN_MPP */
858 for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
859 if (!(ippp_table[i] = (struct ippp_struct *)
860 kmalloc(sizeof(struct ippp_struct), GFP_KERNEL))) {
861 printk(KERN_WARNING "isdn_ppp_init: Could not alloc ippp_table\n");
862 for (j = 0; j < i; j++)
863 kfree(ippp_table[j]);
866 memset((char *) ippp_table[i], 0, sizeof(struct ippp_struct));
867 spin_lock_init(&ippp_table[i]->buflock);
868 ippp_table[i]->state = 0;
869 ippp_table[i]->first = ippp_table[i]->rq + NUM_RCV_BUFFS - 1;
870 ippp_table[i]->last = ippp_table[i]->rq;
872 for (j = 0; j < NUM_RCV_BUFFS; j++) {
873 ippp_table[i]->rq[j].buf = NULL;
874 ippp_table[i]->rq[j].last = ippp_table[i]->rq +
875 (NUM_RCV_BUFFS + j - 1) % NUM_RCV_BUFFS;
876 ippp_table[i]->rq[j].next = ippp_table[i]->rq + (j + 1) % NUM_RCV_BUFFS;
883 isdn_ppp_cleanup(void)
887 for (i = 0; i < ISDN_MAX_CHANNELS; i++)
888 kfree(ippp_table[i]);
890 #ifdef CONFIG_ISDN_MPP
891 if (isdn_ppp_bundle_arr)
892 kfree(isdn_ppp_bundle_arr);
893 #endif /* CONFIG_ISDN_MPP */
898 * check for address/control field and skip if allowed
899 * retval != 0 -> discard packet silently
901 static int isdn_ppp_skip_ac(struct ippp_struct *is, struct sk_buff *skb)
906 if (skb->data[0] == 0xff) {
910 if (skb->data[1] != 0x03)
913 // skip address/control (AC) field
916 if (is->pppcfg & SC_REJ_COMP_AC)
917 // if AC compression was not negotiated, but used, discard packet
924 * get the PPP protocol header and pull skb
925 * retval < 0 -> discard packet silently
927 static int isdn_ppp_strip_proto(struct sk_buff *skb)
934 if (skb->data[0] & 0x1) {
935 // protocol field is compressed
936 proto = skb->data[0];
941 proto = ((int) skb->data[0] << 8) + skb->data[1];
949 * handler for incoming packets on a syncPPP interface
951 void isdn_ppp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff *skb)
953 struct ippp_struct *is;
957 if (net_dev->local->master)
958 BUG(); // we're called with the master device always
961 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
962 printk(KERN_ERR "isdn_ppp_receive: lp->ppp_slot(%d)\n",
967 is = ippp_table[slot];
969 if (is->debug & 0x4) {
970 printk(KERN_DEBUG "ippp_receive: is:%08lx lp:%08lx slot:%d unit:%d len:%d\n",
971 (long)is,(long)lp,lp->ppp_slot,is->unit,(int) skb->len);
972 isdn_ppp_frame_log("receive", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
975 if (isdn_ppp_skip_ac(is, skb) < 0) {
979 proto = isdn_ppp_strip_proto(skb);
985 #ifdef CONFIG_ISDN_MPP
986 if (is->compflags & SC_LINK_DECOMP_ON) {
987 skb = isdn_ppp_decompress(skb, is, NULL, &proto);
988 if (!skb) // decompression error
992 if (!(is->mpppcfg & SC_REJ_MP_PROT)) { // we agreed to receive MPPP
993 if (proto == PPP_MP) {
994 isdn_ppp_mp_receive(net_dev, lp, skb);
999 isdn_ppp_push_higher(net_dev, lp, skb, proto);
1003 * we receive a reassembled frame, MPPP has been taken care of before.
1004 * address/control and protocol have been stripped from the skb
1005 * note: net_dev has to be master net_dev
1008 isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff *skb, int proto)
1010 struct net_device *dev = &net_dev->dev;
1011 struct ippp_struct *is, *mis;
1012 isdn_net_local *mlp = NULL;
1015 slot = lp->ppp_slot;
1016 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
1017 printk(KERN_ERR "isdn_ppp_push_higher: lp->ppp_slot(%d)\n",
1021 is = ippp_table[slot];
1023 if (lp->master) { // FIXME?
1024 mlp = (isdn_net_local *) lp->master->priv;
1025 slot = mlp->ppp_slot;
1026 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
1027 printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n",
1032 mis = ippp_table[slot];
1034 if (is->debug & 0x10) {
1035 printk(KERN_DEBUG "push, skb %d %04x\n", (int) skb->len, proto);
1036 isdn_ppp_frame_log("rpush", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
1038 if (mis->compflags & SC_DECOMP_ON) {
1039 skb = isdn_ppp_decompress(skb, is, mis, &proto);
1040 if (!skb) // decompression error
1044 case PPP_IPX: /* untested */
1045 if (is->debug & 0x20)
1046 printk(KERN_DEBUG "isdn_ppp: IPX\n");
1047 skb->protocol = htons(ETH_P_IPX);
1050 if (is->debug & 0x20)
1051 printk(KERN_DEBUG "isdn_ppp: IP\n");
1052 skb->protocol = htons(ETH_P_IP);
1056 printk(KERN_INFO "isdn_ppp: unexpected compressed frame dropped\n");
1058 #ifdef CONFIG_ISDN_PPP_VJ
1059 case PPP_VJC_UNCOMP:
1060 if (is->debug & 0x20)
1061 printk(KERN_DEBUG "isdn_ppp: VJC_UNCOMP\n");
1062 if (net_dev->local->ppp_slot < 0) {
1063 printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
1064 __FUNCTION__, net_dev->local->ppp_slot);
1067 if (slhc_remember(ippp_table[net_dev->local->ppp_slot]->slcomp, skb->data, skb->len) <= 0) {
1068 printk(KERN_WARNING "isdn_ppp: received illegal VJC_UNCOMP frame!\n");
1071 skb->protocol = htons(ETH_P_IP);
1074 if (is->debug & 0x20)
1075 printk(KERN_DEBUG "isdn_ppp: VJC_COMP\n");
1077 struct sk_buff *skb_old = skb;
1079 skb = dev_alloc_skb(skb_old->len + 128);
1082 printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
1086 skb_put(skb, skb_old->len + 128);
1087 memcpy(skb->data, skb_old->data, skb_old->len);
1088 if (net_dev->local->ppp_slot < 0) {
1089 printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
1090 __FUNCTION__, net_dev->local->ppp_slot);
1093 pkt_len = slhc_uncompress(ippp_table[net_dev->local->ppp_slot]->slcomp,
1094 skb->data, skb_old->len);
1099 skb_trim(skb, pkt_len);
1100 skb->protocol = htons(ETH_P_IP);
1106 isdn_ppp_receive_ccp(net_dev,lp,skb,proto);
1107 /* Dont pop up ResetReq/Ack stuff to the daemon any
1108 longer - the job is done already */
1109 if(skb->data[0] == CCP_RESETREQ ||
1110 skb->data[0] == CCP_RESETACK)
1114 isdn_ppp_fill_rq(skb->data, skb->len, proto, lp->ppp_slot); /* push data to pppd device */
1119 #ifdef CONFIG_IPPP_FILTER
1120 /* check if the packet passes the pass and active filters
1121 * the filter instructions are constructed assuming
1122 * a four-byte PPP header on each packet (which is still present) */
1126 u_int16_t *p = (u_int16_t *) skb->data;
1128 *p = 0; /* indicate inbound in DLT_LINUX_SLL */
1131 if (is->pass_filter.filter
1132 && sk_run_filter(skb, is->pass_filter.filter,
1133 is->pass_filter.len) == 0) {
1134 if (is->debug & 0x2)
1135 printk(KERN_DEBUG "IPPP: inbound frame filtered.\n");
1139 if (!(is->active_filter.filter
1140 && sk_run_filter(skb, is->active_filter.filter,
1141 is->active_filter.len) == 0)) {
1142 if (is->debug & 0x2)
1143 printk(KERN_DEBUG "IPPP: link-active filter: reseting huptimer.\n");
1149 #else /* CONFIG_IPPP_FILTER */
1153 #endif /* CONFIG_IPPP_FILTER */
1155 skb->mac.raw = skb->data;
1157 /* net_dev->local->stats.rx_packets++; done in isdn_net.c */
1161 net_dev->local->stats.rx_dropped++;
1166 * isdn_ppp_skb_push ..
1167 * checks whether we have enough space at the beginning of the skb
1168 * and allocs a new SKB if necessary
1170 static unsigned char *isdn_ppp_skb_push(struct sk_buff **skb_p,int len)
1172 struct sk_buff *skb = *skb_p;
1174 if(skb_headroom(skb) < len) {
1175 struct sk_buff *nskb = skb_realloc_headroom(skb, len);
1178 printk(KERN_ERR "isdn_ppp_skb_push: can't realloc headroom!\n");
1182 printk(KERN_DEBUG "isdn_ppp_skb_push:under %d %d\n",skb_headroom(skb),len);
1185 return skb_push(nskb, len);
1187 return skb_push(skb,len);
1191 * send ppp frame .. we expect a PIDCOMPressable proto --
1192 * (here: currently always PPP_IP,PPP_VJC_COMP,PPP_VJC_UNCOMP)
1194 * VJ compression may change skb pointer!!! .. requeue with old
1195 * skb isn't allowed!!
1199 isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
1201 isdn_net_local *lp,*mlp;
1203 unsigned int proto = PPP_IP; /* 0x21 */
1204 struct ippp_struct *ipt,*ipts;
1205 int slot, retval = 0;
1207 mlp = (isdn_net_local *) (netdev->priv);
1208 nd = mlp->netdev; /* get master lp */
1210 slot = mlp->ppp_slot;
1211 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
1212 printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1217 ipts = ippp_table[slot];
1219 if (!(ipts->pppcfg & SC_ENABLE_IP)) { /* PPP connected ? */
1220 if (ipts->debug & 0x1)
1221 printk(KERN_INFO "%s: IP frame delayed.\n", netdev->name);
1226 switch (ntohs(skb->protocol)) {
1231 proto = PPP_IPX; /* untested */
1234 printk(KERN_ERR "isdn_ppp: skipped unsupported protocol: %#x.\n",
1240 lp = isdn_net_get_locked_lp(nd);
1242 printk(KERN_WARNING "%s: all channels busy - requeuing!\n", netdev->name);
1246 /* we have our lp locked from now on */
1248 slot = lp->ppp_slot;
1249 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
1250 printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1255 ipt = ippp_table[slot];
1258 * after this line .. requeueing in the device queue is no longer allowed!!!
1261 /* Pull off the fake header we stuck on earlier to keep
1262 * the fragmentation code happy.
1264 skb_pull(skb,IPPP_MAX_HEADER);
1266 #ifdef CONFIG_IPPP_FILTER
1267 /* check if we should pass this packet
1268 * the filter instructions are constructed assuming
1269 * a four-byte PPP header on each packet */
1273 u_int16_t *p = (u_int16_t *) skb->data;
1275 *p++ = htons(4); /* indicate outbound in DLT_LINUX_SLL */
1279 if (ipt->pass_filter.filter
1280 && sk_run_filter(skb, ipt->pass_filter.filter,
1281 ipt->pass_filter.len) == 0) {
1282 if (ipt->debug & 0x4)
1283 printk(KERN_DEBUG "IPPP: outbound frame filtered.\n");
1287 if (!(ipt->active_filter.filter
1288 && sk_run_filter(skb, ipt->active_filter.filter,
1289 ipt->active_filter.len) == 0)) {
1290 if (ipt->debug & 0x4)
1291 printk(KERN_DEBUG "IPPP: link-active filter: reseting huptimer.\n");
1295 #else /* CONFIG_IPPP_FILTER */
1297 #endif /* CONFIG_IPPP_FILTER */
1299 if (ipt->debug & 0x4)
1300 printk(KERN_DEBUG "xmit skb, len %d\n", (int) skb->len);
1301 if (ipts->debug & 0x40)
1302 isdn_ppp_frame_log("xmit0", skb->data, skb->len, 32,ipts->unit,lp->ppp_slot);
1304 #ifdef CONFIG_ISDN_PPP_VJ
1305 if (proto == PPP_IP && ipts->pppcfg & SC_COMP_TCP) { /* ipts here? probably yes, but check this again */
1306 struct sk_buff *new_skb;
1309 * we need to reserve enought space in front of
1310 * sk_buff. old call to dev_alloc_skb only reserved
1311 * 16 bytes, now we are looking what the driver want.
1313 hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen + IPPP_MAX_HEADER;
1315 * Note: hl might still be insufficient because the method
1316 * above does not account for a possibible MPPP slave channel
1317 * which had larger HL header space requirements than the
1320 new_skb = alloc_skb(hl+skb->len, GFP_ATOMIC);
1325 skb_reserve(new_skb, hl);
1326 new_skb->dev = skb->dev;
1327 skb_put(new_skb, skb->len);
1330 pktlen = slhc_compress(ipts->slcomp, skb->data, skb->len, new_skb->data,
1331 &buf, !(ipts->pppcfg & SC_NO_TCP_CCID));
1333 if (buf != skb->data) {
1334 if (new_skb->data != buf)
1335 printk(KERN_ERR "isdn_ppp: FATAL error after slhc_compress!!\n");
1339 dev_kfree_skb(new_skb);
1342 skb_trim(skb, pktlen);
1343 if (skb->data[0] & SL_TYPE_COMPRESSED_TCP) { /* cslip? style -> PPP */
1344 proto = PPP_VJC_COMP;
1345 skb->data[0] ^= SL_TYPE_COMPRESSED_TCP;
1347 if (skb->data[0] >= SL_TYPE_UNCOMPRESSED_TCP)
1348 proto = PPP_VJC_UNCOMP;
1349 skb->data[0] = (skb->data[0] & 0x0f) | 0x40;
1356 * normal (single link) or bundle compression
1358 if(ipts->compflags & SC_COMP_ON) {
1359 /* We send compressed only if both down- und upstream
1360 compression is negotiated, that means, CCP is up */
1361 if(ipts->compflags & SC_DECOMP_ON) {
1362 skb = isdn_ppp_compress(skb,&proto,ipt,ipts,0);
1364 printk(KERN_DEBUG "isdn_ppp: CCP not yet up - sending as-is\n");
1368 if (ipt->debug & 0x24)
1369 printk(KERN_DEBUG "xmit2 skb, len %d, proto %04x\n", (int) skb->len, proto);
1371 #ifdef CONFIG_ISDN_MPP
1372 if (ipt->mpppcfg & SC_MP_PROT) {
1373 /* we get mp_seqno from static isdn_net_local */
1374 long mp_seqno = ipts->mp_seqno;
1376 if (ipt->mpppcfg & SC_OUT_SHORT_SEQ) {
1377 unsigned char *data = isdn_ppp_skb_push(&skb, 3);
1381 data[0] = MP_BEGIN_FRAG | MP_END_FRAG | ((mp_seqno >> 8) & 0xf); /* (B)egin & (E)ndbit .. */
1382 data[1] = mp_seqno & 0xff;
1383 data[2] = proto; /* PID compression */
1385 unsigned char *data = isdn_ppp_skb_push(&skb, 5);
1388 data[0] = MP_BEGIN_FRAG | MP_END_FRAG; /* (B)egin & (E)ndbit .. */
1389 data[1] = (mp_seqno >> 16) & 0xff; /* sequence number: 24bit */
1390 data[2] = (mp_seqno >> 8) & 0xff;
1391 data[3] = (mp_seqno >> 0) & 0xff;
1392 data[4] = proto; /* PID compression */
1394 proto = PPP_MP; /* MP Protocol, 0x003d */
1399 * 'link in bundle' compression ...
1401 if(ipt->compflags & SC_LINK_COMP_ON)
1402 skb = isdn_ppp_compress(skb,&proto,ipt,ipts,1);
1404 if( (ipt->pppcfg & SC_COMP_PROT) && (proto <= 0xff) ) {
1405 unsigned char *data = isdn_ppp_skb_push(&skb,1);
1408 data[0] = proto & 0xff;
1411 unsigned char *data = isdn_ppp_skb_push(&skb,2);
1414 data[0] = (proto >> 8) & 0xff;
1415 data[1] = proto & 0xff;
1417 if(!(ipt->pppcfg & SC_COMP_AC)) {
1418 unsigned char *data = isdn_ppp_skb_push(&skb,2);
1421 data[0] = 0xff; /* All Stations */
1422 data[1] = 0x03; /* Unnumbered information */
1425 /* tx-stats are now updated via BSENT-callback */
1427 if (ipts->debug & 0x40) {
1428 printk(KERN_DEBUG "skb xmit: len: %d\n", (int) skb->len);
1429 isdn_ppp_frame_log("xmit", skb->data, skb->len, 32,ipt->unit,lp->ppp_slot);
1432 isdn_net_writebuf_skb(lp, skb);
1435 spin_unlock_bh(&lp->xmit_lock);
1440 #ifdef CONFIG_IPPP_FILTER
1442 * check if this packet may trigger auto-dial.
1445 int isdn_ppp_autodial_filter(struct sk_buff *skb, isdn_net_local *lp)
1447 struct ippp_struct *is = ippp_table[lp->ppp_slot];
1451 switch (ntohs(skb->protocol)) {
1459 printk(KERN_ERR "isdn_ppp_autodial_filter: unsupported protocol 0x%x.\n",
1464 /* the filter instructions are constructed assuming
1465 * a four-byte PPP header on each packet. we have to
1466 * temporarily remove part of the fake header stuck on
1469 skb_pull(skb, IPPP_MAX_HEADER - 4);
1472 u_int16_t *p = (u_int16_t *) skb->data;
1474 *p++ = htons(4); /* indicate outbound in DLT_LINUX_SLL */
1478 drop |= is->pass_filter.filter
1479 && sk_run_filter(skb, is->pass_filter.filter,
1480 is->pass_filter.len) == 0;
1481 drop |= is->active_filter.filter
1482 && sk_run_filter(skb, is->active_filter.filter,
1483 is->active_filter.len) == 0;
1485 skb_push(skb, IPPP_MAX_HEADER - 4);
1489 #ifdef CONFIG_ISDN_MPP
1491 /* this is _not_ rfc1990 header, but something we convert both short and long
1492 * headers to for convinience's sake:
1493 * byte 0 is flags as in rfc1990
1494 * bytes 1...4 is 24-bit seqence number converted to host byte order
1496 #define MP_HEADER_LEN 5
1498 #define MP_LONGSEQ_MASK 0x00ffffff
1499 #define MP_SHORTSEQ_MASK 0x00000fff
1500 #define MP_LONGSEQ_MAX MP_LONGSEQ_MASK
1501 #define MP_SHORTSEQ_MAX MP_SHORTSEQ_MASK
1502 #define MP_LONGSEQ_MAXBIT ((MP_LONGSEQ_MASK+1)>>1)
1503 #define MP_SHORTSEQ_MAXBIT ((MP_SHORTSEQ_MASK+1)>>1)
1505 /* sequence-wrap safe comparisions (for long sequence)*/
1506 #define MP_LT(a,b) ((a-b)&MP_LONGSEQ_MAXBIT)
1507 #define MP_LE(a,b) !((b-a)&MP_LONGSEQ_MAXBIT)
1508 #define MP_GT(a,b) ((b-a)&MP_LONGSEQ_MAXBIT)
1509 #define MP_GE(a,b) !((a-b)&MP_LONGSEQ_MAXBIT)
1511 #define MP_SEQ(f) ((*(u32*)(f->data+1)))
1512 #define MP_FLAGS(f) (f->data[0])
1514 static int isdn_ppp_mp_bundle_array_init(void)
1517 int sz = ISDN_MAX_CHANNELS*sizeof(ippp_bundle);
1518 if( (isdn_ppp_bundle_arr = (ippp_bundle*)kmalloc(sz,
1519 GFP_KERNEL)) == NULL )
1521 memset(isdn_ppp_bundle_arr, 0, sz);
1522 for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
1523 spin_lock_init(&isdn_ppp_bundle_arr[i].lock);
1527 static ippp_bundle * isdn_ppp_mp_bundle_alloc(void)
1530 for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
1531 if (isdn_ppp_bundle_arr[i].ref_ct <= 0)
1532 return (isdn_ppp_bundle_arr + i);
1536 static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
1538 struct ippp_struct * is;
1540 if (lp->ppp_slot < 0) {
1541 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
1542 __FUNCTION__, lp->ppp_slot);
1546 is = ippp_table[lp->ppp_slot];
1548 if( lp->netdev->pb )
1549 lp->netdev->pb->ref_ct--;
1550 lp->netdev->pb = add_to;
1551 } else { /* first link in a bundle */
1553 if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL)
1555 lp->next = lp->last = lp; /* nobody else in a queue */
1556 lp->netdev->pb->frags = NULL;
1557 lp->netdev->pb->frames = 0;
1558 lp->netdev->pb->seq = LONG_MAX;
1560 lp->netdev->pb->ref_ct++;
1562 is->last_link_seqno = 0;
1566 static u32 isdn_ppp_mp_get_seq( int short_seq,
1567 struct sk_buff * skb, u32 last_seq );
1568 static struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
1569 struct sk_buff * from, struct sk_buff * to );
1570 static void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
1571 struct sk_buff * from, struct sk_buff * to );
1572 static void isdn_ppp_mp_free_skb( ippp_bundle * mp, struct sk_buff * skb );
1573 static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb );
1575 static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
1576 struct sk_buff *skb)
1578 struct ippp_struct *is;
1579 isdn_net_local * lpq;
1581 isdn_mppp_stats * stats;
1582 struct sk_buff * newfrag, * frag, * start, *nextf;
1583 u32 newseq, minseq, thisseq;
1584 unsigned long flags;
1587 spin_lock_irqsave(&net_dev->pb->lock, flags);
1590 slot = lp->ppp_slot;
1591 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
1592 printk(KERN_ERR "%s: lp->ppp_slot(%d)\n",
1593 __FUNCTION__, lp->ppp_slot);
1594 stats->frame_drops++;
1596 spin_unlock_irqrestore(&mp->lock, flags);
1599 is = ippp_table[slot];
1600 if( ++mp->frames > stats->max_queue_len )
1601 stats->max_queue_len = mp->frames;
1603 if (is->debug & 0x8)
1604 isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb);
1606 newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ,
1607 skb, is->last_link_seqno);
1610 /* if this packet seq # is less than last already processed one,
1611 * toss it right away, but check for sequence start case first
1613 if( mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT) ) {
1614 mp->seq = newseq; /* the first packet: required for
1615 * rfc1990 non-compliant clients --
1616 * prevents constant packet toss */
1617 } else if( MP_LT(newseq, mp->seq) ) {
1618 stats->frame_drops++;
1619 isdn_ppp_mp_free_skb(mp, skb);
1620 spin_unlock_irqrestore(&mp->lock, flags);
1624 /* find the minimum received sequence number over all links */
1625 is->last_link_seqno = minseq = newseq;
1626 for (lpq = net_dev->queue;;) {
1627 slot = lpq->ppp_slot;
1628 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
1629 printk(KERN_ERR "%s: lpq->ppp_slot(%d)\n",
1630 __FUNCTION__, lpq->ppp_slot);
1632 u32 lls = ippp_table[slot]->last_link_seqno;
1633 if (MP_LT(lls, minseq))
1636 if ((lpq = lpq->next) == net_dev->queue)
1639 if (MP_LT(minseq, mp->seq))
1640 minseq = mp->seq; /* can't go beyond already processed
1644 /* if this new fragment is before the first one, then enqueue it now. */
1645 if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) {
1646 newfrag->next = frag;
1647 mp->frags = frag = newfrag;
1651 start = MP_FLAGS(frag) & MP_BEGIN_FRAG &&
1652 MP_SEQ(frag) == mp->seq ? frag : NULL;
1655 * main fragment traversing loop
1657 * try to accomplish several tasks:
1658 * - insert new fragment into the proper sequence slot (once that's done
1659 * newfrag will be set to NULL)
1660 * - reassemble any complete fragment sequence (non-null 'start'
1661 * indicates there is a continguous sequence present)
1662 * - discard any incomplete sequences that are below minseq -- due
1663 * to the fact that sender always increment sequence number, if there
1664 * is an incomplete sequence below minseq, no new fragments would
1665 * come to complete such sequence and it should be discarded
1667 * loop completes when we accomplished the following tasks:
1668 * - new fragment is inserted in the proper sequence ('newfrag' is
1670 * - we hit a gap in the sequence, so no reassembly/processing is
1671 * possible ('start' would be set to NULL)
1673 * algorightm for this code is derived from code in the book
1674 * 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
1676 while (start != NULL || newfrag != NULL) {
1678 thisseq = MP_SEQ(frag);
1681 /* drop any duplicate fragments */
1682 if (newfrag != NULL && thisseq == newseq) {
1683 isdn_ppp_mp_free_skb(mp, newfrag);
1687 /* insert new fragment before next element if possible. */
1688 if (newfrag != NULL && (nextf == NULL ||
1689 MP_LT(newseq, MP_SEQ(nextf)))) {
1690 newfrag->next = nextf;
1691 frag->next = nextf = newfrag;
1695 if (start != NULL) {
1696 /* check for misplaced start */
1697 if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
1698 printk(KERN_WARNING"isdn_mppp(seq %d): new "
1699 "BEGIN flag with no prior END", thisseq);
1701 stats->frame_drops++;
1702 start = isdn_ppp_mp_discard(mp, start,frag);
1705 } else if (MP_LE(thisseq, minseq)) {
1706 if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
1709 if (MP_FLAGS(frag) & MP_END_FRAG)
1710 stats->frame_drops++;
1711 if( mp->frags == frag )
1713 isdn_ppp_mp_free_skb(mp, frag);
1719 /* if start is non-null and we have end fragment, then
1720 * we have full reassembly sequence -- reassemble
1721 * and process packet now
1723 if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) {
1724 minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK;
1725 /* Reassemble the packet then dispatch it */
1726 isdn_ppp_mp_reassembly(net_dev, lp, start, nextf);
1734 /* check if need to update start pointer: if we just
1735 * reassembled the packet and sequence is contiguous
1736 * then next fragment should be the start of new reassembly
1737 * if sequence is contiguous, but we haven't reassembled yet,
1739 * if sequence is not contiguous, either clear everyting
1740 * below low watermark and set start to the next frag or
1743 if (nextf != NULL &&
1744 ((thisseq+1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) {
1745 /* if we just reassembled and the next one is here,
1746 * then start another reassembly. */
1749 if (MP_FLAGS(nextf) & MP_BEGIN_FRAG)
1753 printk(KERN_WARNING"isdn_mppp(seq %d):"
1754 " END flag with no following "
1761 if ( nextf != NULL && frag != NULL &&
1762 MP_LT(thisseq, minseq)) {
1763 /* we've got a break in the sequence
1764 * and we not at the end yet
1765 * and we did not just reassembled
1766 *(if we did, there wouldn't be anything before)
1767 * and we below the low watermark
1768 * discard all the frames below low watermark
1770 stats->frame_drops++;
1771 mp->frags = isdn_ppp_mp_discard(mp,start,nextf);
1773 /* break in the sequence, no reassembly */
1778 } /* while -- main loop */
1780 if (mp->frags == NULL)
1783 /* rather straighforward way to deal with (not very) possible
1785 if (mp->frames > MP_MAX_QUEUE_LEN) {
1787 while (mp->frames > MP_MAX_QUEUE_LEN) {
1788 frag = mp->frags->next;
1789 isdn_ppp_mp_free_skb(mp, mp->frags);
1793 spin_unlock_irqrestore(&mp->lock, flags);
1796 static void isdn_ppp_mp_cleanup( isdn_net_local * lp )
1798 struct sk_buff * frag = lp->netdev->pb->frags;
1799 struct sk_buff * nextfrag;
1801 nextfrag = frag->next;
1802 isdn_ppp_mp_free_skb(lp->netdev->pb, frag);
1805 lp->netdev->pb->frags = NULL;
1808 static u32 isdn_ppp_mp_get_seq( int short_seq,
1809 struct sk_buff * skb, u32 last_seq )
1812 int flags = skb->data[0] & (MP_BEGIN_FRAG | MP_END_FRAG);
1816 seq = ntohl(*(u32*)skb->data) & MP_LONGSEQ_MASK;
1821 /* convert 12-bit short seq number to 24-bit long one
1823 seq = ntohs(*(u16*)skb->data) & MP_SHORTSEQ_MASK;
1825 /* check for seqence wrap */
1826 if( !(seq & MP_SHORTSEQ_MAXBIT) &&
1827 (last_seq & MP_SHORTSEQ_MAXBIT) &&
1828 (unsigned long)last_seq <= MP_LONGSEQ_MAX )
1829 seq |= (last_seq + MP_SHORTSEQ_MAX+1) &
1830 (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
1832 seq |= last_seq & (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
1834 skb_push(skb, 3); /* put converted seqence back in skb */
1836 *(u32*)(skb->data+1) = seq; /* put seqence back in _host_ byte
1838 skb->data[0] = flags; /* restore flags */
1842 struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
1843 struct sk_buff * from, struct sk_buff * to )
1846 while (from != to) {
1847 struct sk_buff * next = from->next;
1848 isdn_ppp_mp_free_skb(mp, from);
1854 void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
1855 struct sk_buff * from, struct sk_buff * to )
1857 ippp_bundle * mp = net_dev->pb;
1859 struct sk_buff * skb;
1860 unsigned int tot_len;
1862 if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) {
1863 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
1864 __FUNCTION__, lp->ppp_slot);
1867 if( MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG) ) {
1868 if( ippp_table[lp->ppp_slot]->debug & 0x40 )
1869 printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, "
1870 "len %d\n", MP_SEQ(from), from->len );
1872 skb_pull(skb, MP_HEADER_LEN);
1875 struct sk_buff * frag;
1878 for(tot_len=n=0, frag=from; frag != to; frag=frag->next, n++)
1879 tot_len += frag->len - MP_HEADER_LEN;
1881 if( ippp_table[lp->ppp_slot]->debug & 0x40 )
1882 printk(KERN_DEBUG"isdn_mppp: reassembling frames %d "
1883 "to %d, len %d\n", MP_SEQ(from),
1884 (MP_SEQ(from)+n-1) & MP_LONGSEQ_MASK, tot_len );
1885 if( (skb = dev_alloc_skb(tot_len)) == NULL ) {
1886 printk(KERN_ERR "isdn_mppp: cannot allocate sk buff "
1887 "of size %d\n", tot_len);
1888 isdn_ppp_mp_discard(mp, from, to);
1892 while( from != to ) {
1893 unsigned int len = from->len - MP_HEADER_LEN;
1895 memcpy(skb_put(skb,len), from->data+MP_HEADER_LEN, len);
1897 isdn_ppp_mp_free_skb(mp, from);
1901 proto = isdn_ppp_strip_proto(skb);
1902 isdn_ppp_push_higher(net_dev, lp, skb, proto);
1905 static void isdn_ppp_mp_free_skb(ippp_bundle * mp, struct sk_buff * skb)
1911 static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb )
1913 printk(KERN_DEBUG "mp_recv: %d/%d -> %02x %02x %02x %02x %02x %02x\n",
1914 slot, (int) skb->len,
1915 (int) skb->data[0], (int) skb->data[1], (int) skb->data[2],
1916 (int) skb->data[3], (int) skb->data[4], (int) skb->data[5]);
1920 isdn_ppp_bundle(struct ippp_struct *is, int unit)
1922 char ifn[IFNAMSIZ + 1];
1924 isdn_net_local *lp, *nlp;
1926 unsigned long flags;
1928 sprintf(ifn, "ippp%d", unit);
1929 p = isdn_net_findif(ifn);
1931 printk(KERN_ERR "ippp_bundle: cannot find %s\n", ifn);
1935 spin_lock_irqsave(&p->pb->lock, flags);
1939 if( nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ||
1940 lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS ) {
1941 printk(KERN_ERR "ippp_bundle: binding to invalid slot %d\n",
1942 nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ?
1943 nlp->ppp_slot : lp->ppp_slot );
1948 isdn_net_add_to_bundle(p, nlp);
1950 ippp_table[nlp->ppp_slot]->unit = ippp_table[lp->ppp_slot]->unit;
1952 /* maybe also SC_CCP stuff */
1953 ippp_table[nlp->ppp_slot]->pppcfg |= ippp_table[lp->ppp_slot]->pppcfg &
1954 (SC_ENABLE_IP | SC_NO_TCP_CCID | SC_REJ_COMP_TCP);
1955 ippp_table[nlp->ppp_slot]->mpppcfg |= ippp_table[lp->ppp_slot]->mpppcfg &
1956 (SC_MP_PROT | SC_REJ_MP_PROT | SC_OUT_SHORT_SEQ | SC_IN_SHORT_SEQ);
1957 rc = isdn_ppp_mp_init(nlp, p->pb);
1959 spin_unlock_irqrestore(&p->pb->lock, flags);
1963 #endif /* CONFIG_ISDN_MPP */
1966 * network device ioctl handlers
1970 isdn_ppp_dev_ioctl_stats(int slot, struct ifreq *ifr, struct net_device *dev)
1972 struct ppp_stats *res,
1974 isdn_net_local *lp = (isdn_net_local *) dev->priv;
1977 res = (struct ppp_stats *) ifr->ifr_ifru.ifru_data;
1978 err = verify_area(VERIFY_WRITE, res, sizeof(struct ppp_stats));
1983 /* build a temporary stat struct and copy it to user space */
1985 memset(&t, 0, sizeof(struct ppp_stats));
1986 if (dev->flags & IFF_UP) {
1987 t.p.ppp_ipackets = lp->stats.rx_packets;
1988 t.p.ppp_ibytes = lp->stats.rx_bytes;
1989 t.p.ppp_ierrors = lp->stats.rx_errors;
1990 t.p.ppp_opackets = lp->stats.tx_packets;
1991 t.p.ppp_obytes = lp->stats.tx_bytes;
1992 t.p.ppp_oerrors = lp->stats.tx_errors;
1993 #ifdef CONFIG_ISDN_PPP_VJ
1994 if (slot >= 0 && ippp_table[slot]->slcomp) {
1995 struct slcompress *slcomp = ippp_table[slot]->slcomp;
1996 t.vj.vjs_packets = slcomp->sls_o_compressed + slcomp->sls_o_uncompressed;
1997 t.vj.vjs_compressed = slcomp->sls_o_compressed;
1998 t.vj.vjs_searches = slcomp->sls_o_searches;
1999 t.vj.vjs_misses = slcomp->sls_o_misses;
2000 t.vj.vjs_errorin = slcomp->sls_i_error;
2001 t.vj.vjs_tossed = slcomp->sls_i_tossed;
2002 t.vj.vjs_uncompressedin = slcomp->sls_i_uncompressed;
2003 t.vj.vjs_compressedin = slcomp->sls_i_compressed;
2007 if( copy_to_user(res, &t, sizeof(struct ppp_stats))) return -EFAULT;
2012 isdn_ppp_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2017 isdn_net_local *lp = (isdn_net_local *) dev->priv;
2020 if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
2024 #define PPP_VERSION "2.3.7"
2026 r = (char *) ifr->ifr_ifru.ifru_data;
2027 len = strlen(PPP_VERSION) + 1;
2028 if (copy_to_user(r, PPP_VERSION, len))
2033 error = isdn_ppp_dev_ioctl_stats(lp->ppp_slot, ifr, dev);
2043 isdn_ppp_if_get_unit(char *name)
2052 if (strncmp("ippp", name, 4) || len > 8)
2055 for (i = 0, deci = 1; i < len; i++, deci *= 10) {
2056 char a = name[len - i - 1];
2057 if (a >= '0' && a <= '9')
2058 unit += (a - '0') * deci;
2062 if (!i || len - i != 4)
2070 isdn_ppp_dial_slave(char *name)
2072 #ifdef CONFIG_ISDN_MPP
2075 struct net_device *sdev;
2077 if (!(ndev = isdn_net_findif(name)))
2080 if (!(lp->flags & ISDN_NET_CONNECTED))
2085 isdn_net_local *mlp = (isdn_net_local *) sdev->priv;
2086 if (!(mlp->flags & ISDN_NET_CONNECTED))
2093 isdn_net_dial_req((isdn_net_local *) sdev->priv);
2101 isdn_ppp_hangup_slave(char *name)
2103 #ifdef CONFIG_ISDN_MPP
2106 struct net_device *sdev;
2108 if (!(ndev = isdn_net_findif(name)))
2111 if (!(lp->flags & ISDN_NET_CONNECTED))
2116 isdn_net_local *mlp = (isdn_net_local *) sdev->priv;
2118 if (mlp->slave) { /* find last connected link in chain */
2119 isdn_net_local *nlp = (isdn_net_local *) mlp->slave->priv;
2121 if (!(nlp->flags & ISDN_NET_CONNECTED))
2123 } else if (mlp->flags & ISDN_NET_CONNECTED)
2131 isdn_net_hangup(sdev);
2139 * PPP compression stuff
2143 /* Push an empty CCP Data Frame up to the daemon to wake it up and let it
2144 generate a CCP Reset-Request or tear down CCP altogether */
2146 static void isdn_ppp_ccp_kickup(struct ippp_struct *is)
2148 isdn_ppp_fill_rq(NULL, 0, PPP_COMP, is->lp->ppp_slot);
2151 /* In-kernel handling of CCP Reset-Request and Reset-Ack is necessary,
2152 but absolutely nontrivial. The most abstruse problem we are facing is
2153 that the generation, reception and all the handling of timeouts and
2154 resends including proper request id management should be entirely left
2155 to the (de)compressor, but indeed is not covered by the current API to
2156 the (de)compressor. The API is a prototype version from PPP where only
2157 some (de)compressors have yet been implemented and all of them are
2158 rather simple in their reset handling. Especially, their is only one
2159 outstanding ResetAck at a time with all of them and ResetReq/-Acks do
2160 not have parameters. For this very special case it was sufficient to
2161 just return an error code from the decompressor and have a single
2162 reset() entry to communicate all the necessary information between
2163 the framework and the (de)compressor. Bad enough, LZS is different
2164 (and any other compressor may be different, too). It has multiple
2165 histories (eventually) and needs to Reset each of them independently
2166 and thus uses multiple outstanding Acks and history numbers as an
2167 additional parameter to Reqs/Acks.
2168 All that makes it harder to port the reset state engine into the
2169 kernel because it is not just the same simple one as in (i)pppd but
2170 it must be able to pass additional parameters and have multiple out-
2171 standing Acks. We are trying to achieve the impossible by handling
2172 reset transactions independent by their id. The id MUST change when
2173 the data portion changes, thus any (de)compressor who uses more than
2174 one resettable state must provide and recognize individual ids for
2175 each individual reset transaction. The framework itself does _only_
2176 differentiate them by id, because it has no other semantics like the
2177 (de)compressor might.
2178 This looks like a major redesign of the interface would be nice,
2179 but I don't have an idea how to do it better. */
2181 /* Send a CCP Reset-Request or Reset-Ack directly from the kernel. This is
2182 getting that lengthy because there is no simple "send-this-frame-out"
2183 function above but every wrapper does a bit different. Hope I guess
2184 correct in this hack... */
2186 static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
2187 unsigned char code, unsigned char id,
2188 unsigned char *data, int len)
2190 struct sk_buff *skb;
2194 isdn_net_local *lp = is->lp;
2196 /* Alloc large enough skb */
2197 hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
2198 skb = alloc_skb(len + hl + 16,GFP_ATOMIC);
2201 "ippp: CCP cannot send reset - out of memory\n");
2204 skb_reserve(skb, hl);
2206 /* We may need to stuff an address and control field first */
2207 if(!(is->pppcfg & SC_COMP_AC)) {
2208 p = skb_put(skb, 2);
2213 /* Stuff proto, code, id and length */
2214 p = skb_put(skb, 6);
2215 *p++ = (proto >> 8);
2216 *p++ = (proto & 0xff);
2221 *p++ = (cnt & 0xff);
2223 /* Now stuff remaining bytes */
2225 p = skb_put(skb, len);
2226 memcpy(p, data, len);
2229 /* skb is now ready for xmit */
2230 printk(KERN_DEBUG "Sending CCP Frame:\n");
2231 isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
2233 isdn_net_write_super(lp, skb);
2236 /* Allocate the reset state vector */
2237 static struct ippp_ccp_reset *isdn_ppp_ccp_reset_alloc(struct ippp_struct *is)
2239 struct ippp_ccp_reset *r;
2240 r = kmalloc(sizeof(struct ippp_ccp_reset), GFP_KERNEL);
2242 printk(KERN_ERR "ippp_ccp: failed to allocate reset data"
2243 " structure - no mem\n");
2246 memset(r, 0, sizeof(struct ippp_ccp_reset));
2247 printk(KERN_DEBUG "ippp_ccp: allocated reset data structure %p\n", r);
2252 /* Destroy the reset state vector. Kill all pending timers first. */
2253 static void isdn_ppp_ccp_reset_free(struct ippp_struct *is)
2257 printk(KERN_DEBUG "ippp_ccp: freeing reset data structure %p\n",
2259 for(id = 0; id < 256; id++) {
2260 if(is->reset->rs[id]) {
2261 isdn_ppp_ccp_reset_free_state(is, (unsigned char)id);
2268 /* Free a given state and clear everything up for later reallocation */
2269 static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
2272 struct ippp_ccp_reset_state *rs;
2274 if(is->reset->rs[id]) {
2275 printk(KERN_DEBUG "ippp_ccp: freeing state for id %d\n", id);
2276 rs = is->reset->rs[id];
2277 /* Make sure the kernel will not call back later */
2279 del_timer(&rs->timer);
2280 is->reset->rs[id] = NULL;
2283 printk(KERN_WARNING "ippp_ccp: id %d is not allocated\n", id);
2287 /* The timer callback function which is called when a ResetReq has timed out,
2288 aka has never been answered by a ResetAck */
2289 static void isdn_ppp_ccp_timer_callback(unsigned long closure)
2291 struct ippp_ccp_reset_state *rs =
2292 (struct ippp_ccp_reset_state *)closure;
2295 printk(KERN_ERR "ippp_ccp: timer cb with zero closure.\n");
2298 if(rs->ta && rs->state == CCPResetSentReq) {
2299 /* We are correct here */
2301 /* Hmm, there is no Ack really expected. We can clean
2302 up the state now, it will be reallocated if the
2303 decompressor insists on another reset */
2305 isdn_ppp_ccp_reset_free_state(rs->is, rs->id);
2308 printk(KERN_DEBUG "ippp_ccp: CCP Reset timed out for id %d\n",
2311 isdn_ppp_ccp_xmit_reset(rs->is, PPP_CCP, CCP_RESETREQ, rs->id,
2312 rs->data, rs->dlen);
2314 rs->timer.expires = jiffies + HZ*5;
2315 add_timer(&rs->timer);
2317 printk(KERN_WARNING "ippp_ccp: timer cb in wrong state %d\n",
2322 /* Allocate a new reset transaction state */
2323 static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
2326 struct ippp_ccp_reset_state *rs;
2327 if(is->reset->rs[id]) {
2328 printk(KERN_WARNING "ippp_ccp: old state exists for id %d\n",
2332 rs = kmalloc(sizeof(struct ippp_ccp_reset_state), GFP_KERNEL);
2335 memset(rs, 0, sizeof(struct ippp_ccp_reset_state));
2336 rs->state = CCPResetIdle;
2339 rs->timer.data = (unsigned long)rs;
2340 rs->timer.function = isdn_ppp_ccp_timer_callback;
2341 is->reset->rs[id] = rs;
2347 /* A decompressor wants a reset with a set of parameters - do what is
2348 necessary to fulfill it */
2349 static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
2350 struct isdn_ppp_resetparams *rp)
2352 struct ippp_ccp_reset_state *rs;
2355 /* The decompressor defines parameters by itself */
2357 /* And he wants us to send a request */
2359 printk(KERN_ERR "ippp_ccp: decompressor must"
2360 " specify reset id\n");
2363 if(is->reset->rs[rp->id]) {
2364 /* There is already a transaction in existence
2365 for this id. May be still waiting for a
2366 Ack or may be wrong. */
2367 rs = is->reset->rs[rp->id];
2368 if(rs->state == CCPResetSentReq && rs->ta) {
2369 printk(KERN_DEBUG "ippp_ccp: reset"
2370 " trans still in progress"
2371 " for id %d\n", rp->id);
2373 printk(KERN_WARNING "ippp_ccp: reset"
2374 " trans in wrong state %d for"
2375 " id %d\n", rs->state, rp->id);
2378 /* Ok, this is a new transaction */
2379 printk(KERN_DEBUG "ippp_ccp: new trans for id"
2380 " %d to be started\n", rp->id);
2381 rs = isdn_ppp_ccp_reset_alloc_state(is, rp->id);
2383 printk(KERN_ERR "ippp_ccp: out of mem"
2384 " allocing ccp trans\n");
2387 rs->state = CCPResetSentReq;
2388 rs->expra = rp->expra;
2390 rs->dlen = rp->dlen;
2391 memcpy(rs->data, rp->data, rp->dlen);
2393 /* HACK TODO - add link comp here */
2394 isdn_ppp_ccp_xmit_reset(is, PPP_CCP,
2395 CCP_RESETREQ, rs->id,
2396 rs->data, rs->dlen);
2397 /* Start the timer */
2398 rs->timer.expires = jiffies + 5*HZ;
2399 add_timer(&rs->timer);
2403 printk(KERN_DEBUG "ippp_ccp: no reset sent\n");
2406 /* The reset params are invalid. The decompressor does not
2407 care about them, so we just send the minimal requests
2408 and increase ids only when an Ack is received for a
2410 if(is->reset->rs[is->reset->lastid]) {
2411 /* There is already a transaction in existence
2412 for this id. May be still waiting for a
2413 Ack or may be wrong. */
2414 rs = is->reset->rs[is->reset->lastid];
2415 if(rs->state == CCPResetSentReq && rs->ta) {
2416 printk(KERN_DEBUG "ippp_ccp: reset"
2417 " trans still in progress"
2418 " for id %d\n", rp->id);
2420 printk(KERN_WARNING "ippp_ccp: reset"
2421 " trans in wrong state %d for"
2422 " id %d\n", rs->state, rp->id);
2425 printk(KERN_DEBUG "ippp_ccp: new trans for id"
2426 " %d to be started\n", is->reset->lastid);
2427 rs = isdn_ppp_ccp_reset_alloc_state(is,
2430 printk(KERN_ERR "ippp_ccp: out of mem"
2431 " allocing ccp trans\n");
2434 rs->state = CCPResetSentReq;
2435 /* We always expect an Ack if the decompressor doesn't
2439 /* HACK TODO - add link comp here */
2440 isdn_ppp_ccp_xmit_reset(is, PPP_CCP, CCP_RESETREQ,
2442 /* Start the timer */
2443 rs->timer.expires = jiffies + 5*HZ;
2444 add_timer(&rs->timer);
2450 /* An Ack was received for this id. This means we stop the timer and clean
2451 up the state prior to calling the decompressors reset routine. */
2452 static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
2455 struct ippp_ccp_reset_state *rs = is->reset->rs[id];
2458 if(rs->ta && rs->state == CCPResetSentReq) {
2459 /* Great, we are correct */
2461 printk(KERN_DEBUG "ippp_ccp: ResetAck received"
2462 " for id %d but not expected\n", id);
2464 printk(KERN_INFO "ippp_ccp: ResetAck received out of"
2465 "sync for id %d\n", id);
2469 del_timer(&rs->timer);
2471 isdn_ppp_ccp_reset_free_state(is, id);
2473 printk(KERN_INFO "ippp_ccp: ResetAck received for unknown id"
2476 /* Make sure the simple reset stuff uses a new id next time */
2477 is->reset->lastid++;
2483 * if master = 0, we're trying to uncompress an per-link compressed packet,
2484 * as opposed to an compressed reconstructed-from-MPPP packet.
2485 * proto is updated to protocol field of uncompressed packet.
2487 * retval: decompressed packet,
2488 * same packet if uncompressed,
2489 * NULL if decompression error
2492 static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb,struct ippp_struct *is,struct ippp_struct *master,
2496 struct isdn_ppp_compressor *ipc = NULL;
2497 struct sk_buff *skb_out;
2499 struct ippp_struct *ri;
2500 struct isdn_ppp_resetparams rsparm;
2501 unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
2504 // per-link decompression
2505 stat = is->link_decomp_stat;
2506 ipc = is->link_decompressor;
2509 stat = master->decomp_stat;
2510 ipc = master->decompressor;
2515 // no decompressor -> we can't decompress.
2516 printk(KERN_DEBUG "ippp: no decompressor defined!\n");
2519 if (!stat) // if we have a compressor, stat has been set as well
2522 if((master && *proto == PPP_COMP) || (!master && *proto == PPP_COMPFRAG) ) {
2523 // compressed packets are compressed by their protocol type
2525 // Set up reset params for the decompressor
2526 memset(&rsparm, 0, sizeof(rsparm));
2527 rsparm.data = rsdata;
2528 rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
2530 skb_out = dev_alloc_skb(is->mru + PPP_HDRLEN);
2531 len = ipc->decompress(stat, skb, skb_out, &rsparm);
2536 printk(KERN_INFO "ippp: decomp wants reset %s params\n",
2537 rsparm.valid ? "with" : "without");
2539 isdn_ppp_ccp_reset_trans(ri, &rsparm);
2541 case DECOMP_FATALERROR:
2542 ri->pppcfg |= SC_DC_FERROR;
2543 /* Kick ipppd to recognize the error */
2544 isdn_ppp_ccp_kickup(ri);
2550 *proto = isdn_ppp_strip_proto(skb_out);
2557 // uncompressed packets are fed through the decompressor to
2558 // update the decompressor state
2559 ipc->incomp(stat, skb, *proto);
2566 * type=0: normal/bundle compression
2567 * =1: link compression
2568 * returns original skb if we haven't compressed the frame
2569 * and a new skb pointer if we've done it
2571 static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in,int *proto,
2572 struct ippp_struct *is,struct ippp_struct *master,int type)
2576 struct isdn_ppp_compressor *compressor;
2578 struct sk_buff *skb_out;
2580 /* we do not compress control protocols */
2581 if(*proto < 0 || *proto > 0x3fff) {
2585 if(type) { /* type=1 => Link compression */
2590 compressor = is->compressor;
2591 stat = is->comp_stat;
2594 compressor = master->compressor;
2595 stat = master->comp_stat;
2597 new_proto = PPP_COMP;
2601 printk(KERN_ERR "isdn_ppp: No compressor set!\n");
2605 printk(KERN_ERR "isdn_ppp: Compressor not initialized?\n");
2609 /* Allow for at least 150 % expansion (for now) */
2610 skb_out = alloc_skb(skb_in->len + skb_in->len/2 + 32 +
2611 skb_headroom(skb_in), GFP_ATOMIC);
2614 skb_reserve(skb_out, skb_headroom(skb_in));
2616 ret = (compressor->compress)(stat,skb_in,skb_out,*proto);
2618 dev_kfree_skb(skb_out);
2622 dev_kfree_skb(skb_in);
2628 * we received a CCP frame ..
2629 * not a clean solution, but we MUST handle a few cases in the kernel
2631 static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
2632 struct sk_buff *skb,int proto)
2634 struct ippp_struct *is;
2635 struct ippp_struct *mis;
2637 struct isdn_ppp_resetparams rsparm;
2638 unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
2640 printk(KERN_DEBUG "Received CCP frame from peer slot(%d)\n",
2642 if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) {
2643 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
2644 __FUNCTION__, lp->ppp_slot);
2647 is = ippp_table[lp->ppp_slot];
2648 isdn_ppp_frame_log("ccp-rcv", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
2651 int slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot;
2652 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
2653 printk(KERN_ERR "%s: slot(%d) out of range\n",
2654 __FUNCTION__, slot);
2657 mis = ippp_table[slot];
2661 switch(skb->data[0]) {
2663 if(is->debug & 0x10)
2664 printk(KERN_DEBUG "Disable compression here!\n");
2665 if(proto == PPP_CCP)
2666 mis->compflags &= ~SC_COMP_ON;
2668 is->compflags &= ~SC_LINK_COMP_ON;
2672 if(is->debug & 0x10)
2673 printk(KERN_DEBUG "Disable (de)compression here!\n");
2674 if(proto == PPP_CCP)
2675 mis->compflags &= ~(SC_DECOMP_ON|SC_COMP_ON);
2677 is->compflags &= ~(SC_LINK_DECOMP_ON|SC_LINK_COMP_ON);
2680 /* if we RECEIVE an ackowledge we enable the decompressor */
2681 if(is->debug & 0x10)
2682 printk(KERN_DEBUG "Enable decompression here!\n");
2683 if(proto == PPP_CCP) {
2684 if (!mis->decompressor)
2686 mis->compflags |= SC_DECOMP_ON;
2688 if (!is->decompressor)
2690 is->compflags |= SC_LINK_DECOMP_ON;
2695 printk(KERN_DEBUG "Received ResetAck from peer\n");
2696 len = (skb->data[2] << 8) | skb->data[3];
2699 if(proto == PPP_CCP) {
2700 /* If a reset Ack was outstanding for this id, then
2701 clean up the state engine */
2702 isdn_ppp_ccp_reset_ack_rcvd(mis, skb->data[1]);
2703 if(mis->decompressor && mis->decomp_stat)
2705 reset(mis->decomp_stat,
2708 len ? &skb->data[4] : NULL,
2710 /* TODO: This is not easy to decide here */
2711 mis->compflags &= ~SC_DECOMP_DISCARD;
2714 isdn_ppp_ccp_reset_ack_rcvd(is, skb->data[1]);
2715 if(is->link_decompressor && is->link_decomp_stat)
2716 is->link_decompressor->
2717 reset(is->link_decomp_stat,
2720 len ? &skb->data[4] : NULL,
2722 /* TODO: neither here */
2723 is->compflags &= ~SC_LINK_DECOMP_DISCARD;
2728 printk(KERN_DEBUG "Received ResetReq from peer\n");
2729 /* Receiving a ResetReq means we must reset our compressor */
2730 /* Set up reset params for the reset entry */
2731 memset(&rsparm, 0, sizeof(rsparm));
2732 rsparm.data = rsdata;
2733 rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
2734 /* Isolate data length */
2735 len = (skb->data[2] << 8) | skb->data[3];
2737 if(proto == PPP_CCP) {
2738 if(mis->compressor && mis->comp_stat)
2740 reset(mis->comp_stat,
2743 len ? &skb->data[4] : NULL,
2747 if(is->link_compressor && is->link_comp_stat)
2748 is->link_compressor->
2749 reset(is->link_comp_stat,
2752 len ? &skb->data[4] : NULL,
2755 /* Ack the Req as specified by rsparm */
2757 /* Compressor reset handler decided how to answer */
2759 /* We should send a Frame */
2760 isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
2761 rsparm.idval ? rsparm.id
2768 printk(KERN_DEBUG "ResetAck suppressed\n");
2771 /* We answer with a straight reflected Ack */
2772 isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
2774 len ? &skb->data[4] : NULL,
2783 * Daemon sends a CCP frame ...
2786 /* TODO: Clean this up with new Reset semantics */
2788 /* I believe the CCP handling as-is is done wrong. Compressed frames
2789 * should only be sent/received after CCP reaches UP state, which means
2790 * both sides have sent CONF_ACK. Currently, we handle both directions
2791 * independently, which means we may accept compressed frames too early
2792 * (supposedly not a problem), but may also mean we send compressed frames
2793 * too early, which may turn out to be a problem.
2794 * This part of state machine should actually be handled by (i)pppd, but
2795 * that's too big of a change now. --kai
2798 /* Actually, we might turn this into an advantage: deal with the RFC in
2799 * the old tradition of beeing generous on what we accept, but beeing
2800 * strict on what we send. Thus we should just
2801 * - accept compressed frames as soon as decompression is negotiated
2802 * - send compressed frames only when decomp *and* comp are negotiated
2803 * - drop rx compressed frames if we cannot decomp (instead of pushing them
2805 * and I tried to modify this file according to that. --abp
2808 static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb)
2810 struct ippp_struct *mis,*is;
2811 int proto, slot = lp->ppp_slot;
2812 unsigned char *data;
2814 if(!skb || skb->len < 3)
2816 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
2817 printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
2818 __FUNCTION__, slot);
2821 is = ippp_table[slot];
2822 /* Daemon may send with or without address and control field comp */
2824 if(!(is->pppcfg & SC_COMP_AC) && data[0] == 0xff && data[1] == 0x03) {
2830 proto = ((int)data[0]<<8)+data[1];
2831 if(proto != PPP_CCP && proto != PPP_CCPFRAG)
2834 printk(KERN_DEBUG "Received CCP frame from daemon:\n");
2835 isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
2838 slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot;
2839 if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
2840 printk(KERN_ERR "%s: slot(%d) out of range\n",
2841 __FUNCTION__, slot);
2844 mis = ippp_table[slot];
2848 printk(KERN_DEBUG "isdn_ppp: Ouch! Master CCP sends on slave slot!\n");
2852 if(is->debug & 0x10)
2853 printk(KERN_DEBUG "Disable decompression here!\n");
2854 if(proto == PPP_CCP)
2855 is->compflags &= ~SC_DECOMP_ON;
2857 is->compflags &= ~SC_LINK_DECOMP_ON;
2861 if(is->debug & 0x10)
2862 printk(KERN_DEBUG "Disable (de)compression here!\n");
2863 if(proto == PPP_CCP)
2864 is->compflags &= ~(SC_DECOMP_ON|SC_COMP_ON);
2866 is->compflags &= ~(SC_LINK_DECOMP_ON|SC_LINK_COMP_ON);
2869 /* if we SEND an ackowledge we can/must enable the compressor */
2870 if(is->debug & 0x10)
2871 printk(KERN_DEBUG "Enable compression here!\n");
2872 if(proto == PPP_CCP) {
2873 if (!is->compressor)
2875 is->compflags |= SC_COMP_ON;
2877 if (!is->compressor)
2879 is->compflags |= SC_LINK_COMP_ON;
2883 /* If we send a ACK we should reset our compressor */
2884 if(is->debug & 0x10)
2885 printk(KERN_DEBUG "Reset decompression state here!\n");
2886 printk(KERN_DEBUG "ResetAck from daemon passed by\n");
2887 if(proto == PPP_CCP) {
2888 /* link to master? */
2889 if(is->compressor && is->comp_stat)
2890 is->compressor->reset(is->comp_stat, 0, 0,
2892 is->compflags &= ~SC_COMP_DISCARD;
2895 if(is->link_compressor && is->link_comp_stat)
2896 is->link_compressor->reset(is->link_comp_stat,
2897 0, 0, NULL, 0, NULL);
2898 is->compflags &= ~SC_LINK_COMP_DISCARD;
2902 /* Just let it pass by */
2903 printk(KERN_DEBUG "ResetReq from daemon passed by\n");
2908 int isdn_ppp_register_compressor(struct isdn_ppp_compressor *ipc)
2910 ipc->next = ipc_head;
2913 ipc_head->prev = ipc;
2919 int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor *ipc)
2922 ipc->prev->next = ipc->next;
2924 ipc_head = ipc->next;
2926 ipc->next->prev = ipc->prev;
2927 ipc->prev = ipc->next = NULL;
2931 static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_data *data)
2933 struct isdn_ppp_compressor *ipc = ipc_head;
2936 int num = data->num;
2938 if(is->debug & 0x10)
2939 printk(KERN_DEBUG "[%d] Set %s type %d\n",is->unit,
2940 (data->flags&IPPP_COMP_FLAG_XMIT)?"compressor":"decompressor",num);
2942 /* If is has no valid reset state vector, we cannot allocate a
2943 decompressor. The decompressor would cause reset transactions
2944 sooner or later, and they need that vector. */
2946 if(!(data->flags & IPPP_COMP_FLAG_XMIT) && !is->reset) {
2947 printk(KERN_ERR "ippp_ccp: no reset data structure - can't"
2948 " allow decompression.\n");
2953 if(ipc->num == num) {
2954 stat = ipc->alloc(data);
2956 ret = ipc->init(stat,data,is->unit,0);
2958 printk(KERN_ERR "Can't init (de)compression!\n");
2965 printk(KERN_ERR "Can't alloc (de)compression!\n");
2969 if(data->flags & IPPP_COMP_FLAG_XMIT) {
2970 if(data->flags & IPPP_COMP_FLAG_LINK) {
2971 if(is->link_comp_stat)
2972 is->link_compressor->free(is->link_comp_stat);
2973 is->link_comp_stat = stat;
2974 is->link_compressor = ipc;
2978 is->compressor->free(is->comp_stat);
2979 is->comp_stat = stat;
2980 is->compressor = ipc;
2984 if(data->flags & IPPP_COMP_FLAG_LINK) {
2985 if(is->link_decomp_stat)
2986 is->link_decompressor->free(is->link_decomp_stat);
2987 is->link_decomp_stat = stat;
2988 is->link_decompressor = ipc;
2992 is->decompressor->free(is->decomp_stat);
2993 is->decomp_stat = stat;
2994 is->decompressor = ipc;