Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
isdn_ppp.c
Go to the documentation of this file.
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 ([email protected])
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
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
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
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 
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)
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
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;
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] |= (1UL << 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)
622  else
624  if (lp->flags & ISDN_NET_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
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);
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 {
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
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
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  */
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: resetting 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: resetting 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;
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 &
1967  ippp_table[nlp->ppp_slot]->mpppcfg |= ippp_table[lp->ppp_slot]->mpppcfg &
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
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
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) {
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;
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
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;
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 */
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
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);
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 
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 
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 }