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