1 /* $Id: isdn_ppp.c,v 1.85 2000/11/25 17:00:59 kai Exp $
3 * Linux ISDN subsystem, functions for synchronous PPP (linklevel).
5 * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de)
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <linux/config.h>
24 #define __NO_VERSION__
25 #include <linux/module.h>
26 #include <linux/version.h>
27 #include <linux/poll.h>
28 #include <linux/isdn.h>
29 #include <linux/ppp-comp.h>
31 #include "isdn_common.h"
36 #define PPP_IPX 0x002b
40 static int isdn_ppp_fill_rq(unsigned char *buf
, int len
, int proto
, int slot
);
41 static int isdn_ppp_closewait(int slot
);
42 static void isdn_ppp_push_higher(isdn_net_dev
* net_dev
, isdn_net_local
* lp
,
43 struct sk_buff
*skb
, int proto
);
44 static int isdn_ppp_if_get_unit(char *namebuf
);
45 static int isdn_ppp_set_compressor(struct ippp_struct
*is
,struct isdn_ppp_comp_data
*);
46 static struct sk_buff
*isdn_ppp_decompress(struct sk_buff
*,
47 struct ippp_struct
*,struct ippp_struct
*,int *proto
);
48 static void isdn_ppp_receive_ccp(isdn_net_dev
* net_dev
, isdn_net_local
* lp
,
49 struct sk_buff
*skb
,int proto
);
50 static struct sk_buff
*isdn_ppp_compress(struct sk_buff
*skb_in
,int *proto
,
51 struct ippp_struct
*is
,struct ippp_struct
*master
,int type
);
52 static void isdn_ppp_send_ccp(isdn_net_dev
*net_dev
, isdn_net_local
*lp
,
56 static void isdn_ppp_ccp_kickup(struct ippp_struct
*is
);
57 static void isdn_ppp_ccp_xmit_reset(struct ippp_struct
*is
, int proto
,
58 unsigned char code
, unsigned char id
,
59 unsigned char *data
, int len
);
60 static struct ippp_ccp_reset
*isdn_ppp_ccp_reset_alloc(struct ippp_struct
*is
);
61 static void isdn_ppp_ccp_reset_free(struct ippp_struct
*is
);
62 static void isdn_ppp_ccp_reset_free_state(struct ippp_struct
*is
,
64 static void isdn_ppp_ccp_timer_callback(unsigned long closure
);
65 static struct ippp_ccp_reset_state
*isdn_ppp_ccp_reset_alloc_state(struct ippp_struct
*is
,
67 static void isdn_ppp_ccp_reset_trans(struct ippp_struct
*is
,
68 struct isdn_ppp_resetparams
*rp
);
69 static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct
*is
,
74 #ifdef CONFIG_ISDN_MPP
75 static ippp_bundle
* isdn_ppp_bundle_arr
= NULL
;
77 static int isdn_ppp_mp_bundle_array_init(void);
78 static int isdn_ppp_mp_init( isdn_net_local
* lp
, ippp_bundle
* add_to
);
79 static void isdn_ppp_mp_receive(isdn_net_dev
* net_dev
, isdn_net_local
* lp
,
81 static void isdn_ppp_mp_cleanup( isdn_net_local
* lp
);
83 static int isdn_ppp_bundle(struct ippp_struct
*, int unit
);
84 #endif /* CONFIG_ISDN_MPP */
86 char *isdn_ppp_revision
= "$Revision: 1.85 $";
88 static struct ippp_struct
*ippp_table
[ISDN_MAX_CHANNELS
];
90 static struct isdn_ppp_compressor
*ipc_head
= NULL
;
96 isdn_ppp_frame_log(char *info
, char *data
, int len
, int maxlen
,int unit
,int slot
)
106 for (i
= 0, cnt
= 0; cnt
< maxlen
; i
++) {
107 for (j
= 0; j
< 16 && cnt
< maxlen
; j
++, cnt
++)
108 sprintf(buf
+ j
* 3, "%02x ", (unsigned char) data
[cnt
]);
109 printk(KERN_DEBUG
"[%d/%d].%s[%d]: %s\n",unit
,slot
, info
, i
, buf
);
114 * unbind isdn_net_local <=> ippp-device
115 * note: it can happen, that we hangup/free the master before the slaves
116 * in this case we bind another lp to the master device
119 isdn_ppp_free(isdn_net_local
* lp
)
122 struct ippp_struct
*is
;
124 if (lp
->ppp_slot
< 0 || lp
->ppp_slot
> ISDN_MAX_CHANNELS
)
130 #ifdef CONFIG_ISDN_MPP
131 spin_lock(&lp
->netdev
->pb
->lock
);
133 isdn_net_rm_from_bundle(lp
);
134 #ifdef CONFIG_ISDN_MPP
135 if (lp
->netdev
->pb
->ref_ct
== 1) /* last link in queue? */
136 isdn_ppp_mp_cleanup(lp
);
138 lp
->netdev
->pb
->ref_ct
--;
139 spin_unlock(&lp
->netdev
->pb
->lock
);
140 #endif /* CONFIG_ISDN_MPP */
142 is
= ippp_table
[lp
->ppp_slot
];
143 if ((is
->state
& IPPP_CONNECT
))
144 isdn_ppp_closewait(lp
->ppp_slot
); /* force wakeup on ippp device */
145 else if (is
->state
& IPPP_ASSIGNED
)
146 is
->state
= IPPP_OPEN
; /* fallback to 'OPEN but not ASSIGNED' state */
149 printk(KERN_DEBUG
"isdn_ppp_free %d %lx %lx\n", lp
->ppp_slot
, (long) lp
, (long) is
->lp
);
151 is
->lp
= NULL
; /* link is down .. set lp to NULL */
152 lp
->ppp_slot
= -1; /* is this OK ?? */
154 restore_flags(flags
);
159 * bind isdn_net_local <=> ippp-device
162 isdn_ppp_bind(isdn_net_local
* lp
)
167 struct ippp_struct
*is
;
171 if (lp
->pppbind
< 0) { /* device bounded to ippp device ? */
172 isdn_net_dev
*net_dev
= dev
->netdev
;
173 char exclusive
[ISDN_MAX_CHANNELS
]; /* exclusive flags */
174 memset(exclusive
, 0, ISDN_MAX_CHANNELS
);
175 while (net_dev
) { /* step through net devices to find exclusive minors */
176 isdn_net_local
*lp
= net_dev
->local
;
177 if (lp
->pppbind
>= 0)
178 exclusive
[lp
->pppbind
] = 1;
179 net_dev
= net_dev
->next
;
182 * search a free device / slot
184 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++) {
185 if (ippp_table
[i
]->state
== IPPP_OPEN
&& !exclusive
[ippp_table
[i
]->minor
]) { /* OPEN, but not connected! */
190 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++) {
191 if (ippp_table
[i
]->minor
== lp
->pppbind
&&
192 (ippp_table
[i
]->state
& IPPP_OPEN
) == IPPP_OPEN
)
197 if (i
>= ISDN_MAX_CHANNELS
) {
198 restore_flags(flags
);
199 printk(KERN_WARNING
"isdn_ppp_bind: Can't find a (free) connection to the ipppd daemon.\n");
202 unit
= isdn_ppp_if_get_unit(lp
->name
); /* get unit number from interface name .. ugly! */
204 printk(KERN_ERR
"isdn_ppp_bind: illegal interface name %s.\n", lp
->name
);
212 is
->state
= IPPP_OPEN
| IPPP_ASSIGNED
; /* assigned to a netdevice but not connected */
213 #ifdef CONFIG_ISDN_MPP
214 if (isdn_ppp_mp_init(lp
, NULL
) < 0)
216 #endif /* CONFIG_ISDN_MPP */
218 restore_flags(flags
);
224 * kick the ipppd on the device
225 * (wakes up daemon after B-channel connect)
229 isdn_ppp_wakeup_daemon(isdn_net_local
* lp
)
231 if (lp
->ppp_slot
< 0 || lp
->ppp_slot
>= ISDN_MAX_CHANNELS
)
234 ippp_table
[lp
->ppp_slot
]->state
= IPPP_OPEN
| IPPP_CONNECT
| IPPP_NOBLOCK
;
236 wake_up_interruptible(&ippp_table
[lp
->ppp_slot
]->wq
);
240 * there was a hangup on the netdevice
241 * force wakeup of the ippp device
242 * go into 'device waits for release' state
245 isdn_ppp_closewait(int slot
)
247 struct ippp_struct
*is
;
249 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
)
251 is
= ippp_table
[slot
];
254 wake_up_interruptible(&is
->wq
);
256 is
->state
= IPPP_CLOSEWAIT
;
261 * isdn_ppp_find_slot / isdn_ppp_free_slot
265 isdn_ppp_get_slot(void)
268 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++) {
269 if (!ippp_table
[i
]->state
)
280 isdn_ppp_open(int min
, struct file
*file
)
283 struct ippp_struct
*is
;
285 if (min
< 0 || min
> ISDN_MAX_CHANNELS
)
288 slot
= isdn_ppp_get_slot();
292 is
= file
->private_data
= ippp_table
[slot
];
294 printk(KERN_DEBUG
"ippp, open, slot: %d, minor: %d, state: %04x\n", slot
, min
, is
->state
);
296 /* compression stuff */
297 is
->link_compressor
= is
->compressor
= NULL
;
298 is
->link_decompressor
= is
->decompressor
= NULL
;
299 is
->link_comp_stat
= is
->comp_stat
= NULL
;
300 is
->link_decomp_stat
= is
->decomp_stat
= NULL
;
303 is
->reset
= isdn_ppp_ccp_reset_alloc(is
);
306 is
->mp_seqno
= 0; /* MP sequence number */
307 is
->pppcfg
= 0; /* ppp configuration */
308 is
->mpppcfg
= 0; /* mppp configuration */
309 is
->last_link_seqno
= -1; /* MP: maybe set to Bundle-MIN, when joining a bundle ?? */
310 is
->unit
= -1; /* set, when we have our interface */
311 is
->mru
= 1524; /* MRU, default 1524 */
312 is
->maxcid
= 16; /* VJ: maxcid */
314 init_waitqueue_head(&is
->wq
);
315 is
->first
= is
->rq
+ NUM_RCV_BUFFS
- 1; /* receive queue */
318 #ifdef CONFIG_ISDN_PPP_VJ
320 * VJ header compression init
322 is
->slcomp
= slhc_init(16, 16); /* not necessary for 2. link in bundle */
325 is
->state
= IPPP_OPEN
;
331 * release ippp device
334 isdn_ppp_release(int min
, struct file
*file
)
337 struct ippp_struct
*is
;
339 if (min
< 0 || min
>= ISDN_MAX_CHANNELS
)
341 is
= file
->private_data
;
344 printk(KERN_DEBUG
"ippp: release, minor: %d %lx\n", min
, (long) is
->lp
);
346 if (is
->lp
) { /* a lp address says: this link is still up */
347 isdn_net_dev
*p
= is
->lp
->netdev
;
349 is
->state
&= ~IPPP_CONNECT
; /* -> effect: no call of wakeup */
351 * isdn_net_hangup() calls isdn_ppp_free()
352 * isdn_ppp_free() sets is->lp to NULL and lp->ppp_slot to -1
353 * removing the IPPP_CONNECT flag omits calling of isdn_ppp_wakeup_daemon()
355 isdn_net_hangup(&p
->dev
);
357 for (i
= 0; i
< NUM_RCV_BUFFS
; i
++) {
359 kfree(is
->rq
[i
].buf
);
360 is
->rq
[i
].buf
= NULL
;
363 is
->first
= is
->rq
+ NUM_RCV_BUFFS
- 1; /* receive queue */
366 #ifdef CONFIG_ISDN_PPP_VJ
367 /* TODO: if this was the previous master: link the slcomp to the new master */
368 slhc_free(is
->slcomp
);
372 /* TODO: if this was the previous master: link the the stuff to the new master */
374 is
->compressor
->free(is
->comp_stat
);
375 if(is
->link_comp_stat
)
376 is
->link_compressor
->free(is
->link_comp_stat
);
377 if(is
->link_decomp_stat
)
378 is
->link_decompressor
->free(is
->link_decomp_stat
);
380 is
->decompressor
->free(is
->decomp_stat
);
381 is
->compressor
= is
->link_compressor
= NULL
;
382 is
->decompressor
= is
->link_decompressor
= NULL
;
383 is
->comp_stat
= is
->link_comp_stat
= NULL
;
384 is
->decomp_stat
= is
->link_decomp_stat
= NULL
;
386 /* Clean up if necessary */
388 isdn_ppp_ccp_reset_free(is
);
390 /* this slot is ready for new connections */
395 * get_arg .. ioctl helper
398 get_arg(void *b
, void *val
, int len
)
401 len
= sizeof(void *);
402 if (copy_from_user((void *) val
, b
, len
))
408 * set arg .. ioctl helper
411 set_arg(void *b
, void *val
,int len
)
414 len
= sizeof(void *);
415 if (copy_to_user(b
, (void *) val
, len
))
424 isdn_ppp_ioctl(int min
, struct file
*file
, unsigned int cmd
, unsigned long arg
)
428 struct ippp_struct
*is
;
430 struct isdn_ppp_comp_data data
;
432 is
= (struct ippp_struct
*) file
->private_data
;
436 printk(KERN_DEBUG
"isdn_ppp_ioctl: minor: %d cmd: %x state: %x\n", min
, cmd
, is
->state
);
438 if (!(is
->state
& IPPP_OPEN
))
443 #ifdef CONFIG_ISDN_MPP
444 if (!(is
->state
& IPPP_CONNECT
))
446 if ((r
= get_arg((void *) arg
, &val
, sizeof(val
) )))
448 printk(KERN_DEBUG
"iPPP-bundle: minor: %d, slave unit: %d, master unit: %d\n",
449 (int) min
, (int) is
->unit
, (int) val
);
450 return isdn_ppp_bundle(is
, val
);
455 case PPPIOCGUNIT
: /* get ppp/isdn unit number */
456 if ((r
= set_arg((void *) arg
, &is
->unit
, sizeof(is
->unit
) )))
462 if ((r
= set_arg((void *) arg
, lp
->name
, strlen(lp
->name
))))
465 case PPPIOCGMPFLAGS
: /* get configuration flags */
466 if ((r
= set_arg((void *) arg
, &is
->mpppcfg
, sizeof(is
->mpppcfg
) )))
469 case PPPIOCSMPFLAGS
: /* set configuration flags */
470 if ((r
= get_arg((void *) arg
, &val
, sizeof(val
) )))
474 case PPPIOCGFLAGS
: /* get configuration flags */
475 if ((r
= set_arg((void *) arg
, &is
->pppcfg
,sizeof(is
->pppcfg
) )))
478 case PPPIOCSFLAGS
: /* set configuration flags */
479 if ((r
= get_arg((void *) arg
, &val
, sizeof(val
) ))) {
482 if (val
& SC_ENABLE_IP
&& !(is
->pppcfg
& SC_ENABLE_IP
) && (is
->state
& IPPP_CONNECT
)) {
484 /* OK .. we are ready to send buffers */
485 netif_wake_queue(&lp
->netdev
->dev
);
490 case PPPIOCGIDLE
: /* get idle time information */
492 struct ppp_idle pidle
;
493 pidle
.xmit_idle
= pidle
.recv_idle
= lp
->huptimer
;
494 if ((r
= set_arg((void *) arg
, &pidle
,sizeof(struct ppp_idle
))))
498 case PPPIOCSMRU
: /* set receive unit size for PPP */
499 if ((r
= get_arg((void *) arg
, &val
, sizeof(val
) )))
507 case PPPIOCSMAXCID
: /* set the maximum compression slot id */
508 if ((r
= get_arg((void *) arg
, &val
, sizeof(val
) )))
511 if (is
->maxcid
!= val
) {
512 #ifdef CONFIG_ISDN_PPP_VJ
513 struct slcompress
*sltmp
;
516 printk(KERN_DEBUG
"ippp, ioctl: changed MAXCID to %ld\n", val
);
518 #ifdef CONFIG_ISDN_PPP_VJ
519 sltmp
= slhc_init(16, val
);
521 printk(KERN_ERR
"ippp, can't realloc slhc struct\n");
525 slhc_free(is
->slcomp
);
531 if ((r
= set_arg((void *) arg
, &is
->debug
, sizeof(is
->debug
) )))
535 if ((r
= get_arg((void *) arg
, &val
, sizeof(val
) )))
539 case PPPIOCGCOMPRESSORS
:
541 unsigned long protos
[8] = {0,};
542 struct isdn_ppp_compressor
*ipc
= ipc_head
;
544 j
= ipc
->num
/ (sizeof(long)*8);
545 i
= ipc
->num
% (sizeof(long)*8);
547 protos
[j
] |= (0x1<<i
);
550 if ((r
= set_arg((void *) arg
,protos
,8*sizeof(long) )))
554 case PPPIOCSCOMPRESSOR
:
555 if ((r
= get_arg((void *) arg
, &data
, sizeof(struct isdn_ppp_comp_data
))))
557 return isdn_ppp_set_compressor(is
, &data
);
558 case PPPIOCGCALLINFO
:
560 struct pppcallinfo pci
;
561 memset((char *) &pci
,0,sizeof(struct pppcallinfo
));
564 strncpy(pci
.local_num
,lp
->msn
,63);
566 strncpy(pci
.remote_num
,lp
->dial
->num
,63);
568 pci
.charge_units
= lp
->charge
;
570 pci
.calltype
= CALLTYPE_OUTGOING
;
572 pci
.calltype
= CALLTYPE_INCOMING
;
573 if(lp
->flags
& ISDN_NET_CALLBACK
)
574 pci
.calltype
|= CALLTYPE_CALLBACK
;
576 return set_arg((void *)arg
,&pci
,sizeof(struct pppcallinfo
));
585 isdn_ppp_poll(struct file
*file
, poll_table
* wait
)
588 struct ippp_buf_queue
*bf
;
589 struct ippp_buf_queue
*bl
;
591 struct ippp_struct
*is
;
593 is
= file
->private_data
;
596 printk(KERN_DEBUG
"isdn_ppp_poll: minor: %d\n",
597 MINOR(file
->f_dentry
->d_inode
->i_rdev
));
599 /* just registers wait_queue hook. This doesn't really wait. */
600 poll_wait(file
, &is
->wq
, wait
);
602 if (!(is
->state
& IPPP_OPEN
)) {
603 if(is
->state
== IPPP_CLOSEWAIT
)
605 printk(KERN_DEBUG
"isdn_ppp: device not open\n");
608 /* we're always ready to send .. */
609 mask
= POLLOUT
| POLLWRNORM
;
616 * if IPPP_NOBLOCK is set we return even if we have nothing to read
618 if (bf
->next
!= bl
|| (is
->state
& IPPP_NOBLOCK
)) {
619 is
->state
&= ~IPPP_NOBLOCK
;
620 mask
|= POLLIN
| POLLRDNORM
;
622 restore_flags(flags
);
627 * fill up isdn_ppp_read() queue ..
631 isdn_ppp_fill_rq(unsigned char *buf
, int len
, int proto
, int slot
)
633 struct ippp_buf_queue
*bf
,
637 struct ippp_struct
*is
;
639 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
640 printk(KERN_WARNING
"ippp: illegal slot.\n");
643 is
= ippp_table
[slot
];
645 if (!(is
->state
& IPPP_CONNECT
)) {
646 printk(KERN_DEBUG
"ippp: device not activated.\n");
649 nbuf
= (unsigned char *) kmalloc(len
+ 4, GFP_ATOMIC
);
651 printk(KERN_WARNING
"ippp: Can't alloc buf\n");
654 nbuf
[0] = PPP_ALLSTATIONS
;
656 nbuf
[2] = proto
>> 8;
657 nbuf
[3] = proto
& 0xff;
658 memcpy(nbuf
+ 4, buf
, len
);
667 printk(KERN_WARNING
"ippp: Queue is full; discarding first buffer\n");
672 bl
->buf
= (char *) nbuf
;
676 restore_flags(flags
);
678 wake_up_interruptible(&is
->wq
);
684 * read() .. non-blocking: ipppd calls it only after select()
685 * reports, that there is data
689 isdn_ppp_read(int min
, struct file
*file
, char *buf
, int count
)
691 struct ippp_struct
*is
;
692 struct ippp_buf_queue
*b
;
695 unsigned char *save_buf
;
697 is
= file
->private_data
;
699 if (!(is
->state
& IPPP_OPEN
))
702 if ((r
= verify_area(VERIFY_WRITE
, (void *) buf
, count
)))
711 restore_flags(flags
);
719 restore_flags(flags
);
721 copy_to_user(buf
, save_buf
, count
);
728 * ipppd wanna write a packet to the card .. non-blocking
732 isdn_ppp_write(int min
, struct file
*file
, const char *buf
, int count
)
735 struct ippp_struct
*is
;
737 unsigned char protobuf
[4];
739 is
= file
->private_data
;
741 if (!(is
->state
& IPPP_CONNECT
))
746 /* -> push it directly to the lowlevel interface */
749 printk(KERN_DEBUG
"isdn_ppp_write: lp == NULL\n");
752 * Don't reset huptimer for
753 * LCP packets. (Echo requests).
755 if (copy_from_user(protobuf
, buf
, 4))
757 proto
= PPP_PROTOCOL(protobuf
);
758 if (proto
!= PPP_LCP
)
761 if (lp
->isdn_device
< 0 || lp
->isdn_channel
< 0)
764 if ((dev
->drv
[lp
->isdn_device
]->flags
& DRV_FLAG_RUNNING
) &&
765 lp
->dialstate
== 0 &&
766 (lp
->flags
& ISDN_NET_CONNECTED
)) {
770 * we need to reserve enought space in front of
771 * sk_buff. old call to dev_alloc_skb only reserved
772 * 16 bytes, now we are looking what the driver want
774 hl
= dev
->drv
[lp
->isdn_device
]->interface
->hl_hdrlen
;
775 skb
= alloc_skb(hl
+count
, GFP_ATOMIC
);
777 printk(KERN_WARNING
"isdn_ppp_write: out of memory!\n");
780 skb_reserve(skb
, hl
);
781 if (copy_from_user(skb_put(skb
, count
), buf
, count
))
783 if (is
->debug
& 0x40) {
784 printk(KERN_DEBUG
"ppp xmit: len %d\n", (int) skb
->len
);
785 isdn_ppp_frame_log("xmit", skb
->data
, skb
->len
, 32,is
->unit
,lp
->ppp_slot
);
788 isdn_ppp_send_ccp(lp
->netdev
,lp
,skb
); /* keeps CCP/compression states in sync */
790 isdn_net_write_super(lp
, skb
);
797 * init memory, structures etc.
806 #ifdef CONFIG_ISDN_MPP
807 if( isdn_ppp_mp_bundle_array_init() < 0 )
809 #endif /* CONFIG_ISDN_MPP */
811 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++) {
812 if (!(ippp_table
[i
] = (struct ippp_struct
*)
813 kmalloc(sizeof(struct ippp_struct
), GFP_KERNEL
))) {
814 printk(KERN_WARNING
"isdn_ppp_init: Could not alloc ippp_table\n");
815 for (j
= 0; j
< i
; j
++)
816 kfree(ippp_table
[i
]);
819 memset((char *) ippp_table
[i
], 0, sizeof(struct ippp_struct
));
820 ippp_table
[i
]->state
= 0;
821 ippp_table
[i
]->first
= ippp_table
[i
]->rq
+ NUM_RCV_BUFFS
- 1;
822 ippp_table
[i
]->last
= ippp_table
[i
]->rq
;
824 for (j
= 0; j
< NUM_RCV_BUFFS
; j
++) {
825 ippp_table
[i
]->rq
[j
].buf
= NULL
;
826 ippp_table
[i
]->rq
[j
].last
= ippp_table
[i
]->rq
+
827 (NUM_RCV_BUFFS
+ j
- 1) % NUM_RCV_BUFFS
;
828 ippp_table
[i
]->rq
[j
].next
= ippp_table
[i
]->rq
+ (j
+ 1) % NUM_RCV_BUFFS
;
835 isdn_ppp_cleanup(void)
839 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++)
840 kfree(ippp_table
[i
]);
842 #ifdef CONFIG_ISDN_MPP
843 if (isdn_ppp_bundle_arr
)
844 kfree(isdn_ppp_bundle_arr
);
845 #endif /* CONFIG_ISDN_MPP */
850 * check for address/control field and skip if allowed
851 * retval != 0 -> discard packet silently
853 static int isdn_ppp_skip_ac(struct ippp_struct
*is
, struct sk_buff
*skb
)
858 if (skb
->data
[0] == 0xff) {
862 if (skb
->data
[1] != 0x03)
865 // skip address/control (AC) field
868 if (is
->pppcfg
& SC_REJ_COMP_AC
)
869 // if AC compression was not negotiated, but used, discard packet
876 * get the PPP protocol header and pull skb
877 * retval < 0 -> discard packet silently
879 static int isdn_ppp_strip_proto(struct sk_buff
*skb
)
886 if (skb
->data
[0] & 0x1) {
887 // protocol field is compressed
888 proto
= skb
->data
[0];
893 proto
= ((int) skb
->data
[0] << 8) + skb
->data
[1];
901 * handler for incoming packets on a syncPPP interface
903 void isdn_ppp_receive(isdn_net_dev
* net_dev
, isdn_net_local
* lp
, struct sk_buff
*skb
)
905 struct ippp_struct
*is
;
909 if (net_dev
->local
->master
)
910 BUG(); // we're called with the master device always
913 if (slot
< 0 || slot
> ISDN_MAX_CHANNELS
) {
914 printk(KERN_ERR
"isdn_ppp_receive: lp->ppp_slot %d\n", lp
->ppp_slot
);
918 is
= ippp_table
[slot
];
920 if (is
->debug
& 0x4) {
921 printk(KERN_DEBUG
"ippp_receive: is:%08lx lp:%08lx slot:%d unit:%d len:%d\n",
922 (long)is
,(long)lp
,lp
->ppp_slot
,is
->unit
,(int) skb
->len
);
923 isdn_ppp_frame_log("receive", skb
->data
, skb
->len
, 32,is
->unit
,lp
->ppp_slot
);
926 if (isdn_ppp_skip_ac(is
, skb
) < 0) {
930 proto
= isdn_ppp_strip_proto(skb
);
936 #ifdef CONFIG_ISDN_MPP
937 if (is
->compflags
& SC_LINK_DECOMP_ON
) {
938 skb
= isdn_ppp_decompress(skb
, is
, NULL
, &proto
);
939 if (!skb
) // decompression error
943 if (!(is
->mpppcfg
& SC_REJ_MP_PROT
)) { // we agreed to receive MPPP
944 if (proto
== PPP_MP
) {
945 isdn_ppp_mp_receive(net_dev
, lp
, skb
);
950 isdn_ppp_push_higher(net_dev
, lp
, skb
, proto
);
954 * we receive a reassembled frame, MPPP has been taken care of before.
955 * address/control and protocol have been stripped from the skb
956 * note: net_dev has to be master net_dev
959 isdn_ppp_push_higher(isdn_net_dev
* net_dev
, isdn_net_local
* lp
, struct sk_buff
*skb
, int proto
)
961 struct net_device
*dev
= &net_dev
->dev
;
962 struct ippp_struct
*is
, *mis
;
966 if (slot
< 0 || slot
> ISDN_MAX_CHANNELS
) {
967 printk(KERN_ERR
"isdn_ppp_push_higher: lp->ppp_slot %d\n", lp
->ppp_slot
);
970 is
= ippp_table
[slot
];
972 if (lp
->master
) { // FIXME?
973 slot
= ((isdn_net_local
*) (lp
->master
->priv
))->ppp_slot
;
974 if (slot
< 0 || slot
> ISDN_MAX_CHANNELS
) {
975 printk(KERN_ERR
"isdn_ppp_push_higher: master->ppp_slot %d\n", lp
->ppp_slot
);
979 mis
= ippp_table
[slot
];
981 if (is
->debug
& 0x10) {
982 printk(KERN_DEBUG
"push, skb %d %04x\n", (int) skb
->len
, proto
);
983 isdn_ppp_frame_log("rpush", skb
->data
, skb
->len
, 32,is
->unit
,lp
->ppp_slot
);
985 if (is
->compflags
& SC_DECOMP_ON
) {
986 skb
= isdn_ppp_decompress(skb
, is
, mis
, &proto
);
987 if (!skb
) // decompression error
991 case PPP_IPX
: /* untested */
992 if (is
->debug
& 0x20)
993 printk(KERN_DEBUG
"isdn_ppp: IPX\n");
994 skb
->protocol
= htons(ETH_P_IPX
);
997 if (is
->debug
& 0x20)
998 printk(KERN_DEBUG
"isdn_ppp: IP\n");
999 skb
->protocol
= htons(ETH_P_IP
);
1001 #ifdef CONFIG_ISDN_PPP_VJ
1002 case PPP_VJC_UNCOMP
:
1003 if (is
->debug
& 0x20)
1004 printk(KERN_DEBUG
"isdn_ppp: VJC_UNCOMP\n");
1005 if (slhc_remember(ippp_table
[net_dev
->local
->ppp_slot
]->slcomp
, skb
->data
, skb
->len
) <= 0) {
1006 printk(KERN_WARNING
"isdn_ppp: received illegal VJC_UNCOMP frame!\n");
1009 skb
->protocol
= htons(ETH_P_IP
);
1012 if (is
->debug
& 0x20)
1013 printk(KERN_DEBUG
"isdn_ppp: VJC_COMP\n");
1015 struct sk_buff
*skb_old
= skb
;
1017 skb
= dev_alloc_skb(skb_old
->len
+ 128);
1020 printk(KERN_WARNING
"%s: Memory squeeze, dropping packet.\n", dev
->name
);
1024 skb_put(skb
, skb_old
->len
+ 128);
1025 memcpy(skb
->data
, skb_old
->data
, skb_old
->len
);
1026 pkt_len
= slhc_uncompress(ippp_table
[net_dev
->local
->ppp_slot
]->slcomp
,
1027 skb
->data
, skb_old
->len
);
1032 skb_trim(skb
, pkt_len
);
1033 skb
->protocol
= htons(ETH_P_IP
);
1039 isdn_ppp_receive_ccp(net_dev
,lp
,skb
,proto
);
1040 /* Dont pop up ResetReq/Ack stuff to the daemon any
1041 longer - the job is done already */
1042 if(skb
->data
[0] == CCP_RESETREQ
||
1043 skb
->data
[0] == CCP_RESETACK
)
1047 isdn_ppp_fill_rq(skb
->data
, skb
->len
, proto
, lp
->ppp_slot
); /* push data to pppd device */
1052 /* Reset hangup-timer */
1056 skb
->mac
.raw
= skb
->data
;
1058 /* net_dev->local->stats.rx_packets++; done in isdn_net.c */
1062 net_dev
->local
->stats
.rx_dropped
++;
1067 * isdn_ppp_skb_push ..
1068 * checks whether we have enough space at the beginning of the skb
1069 * and allocs a new SKB if necessary
1071 static unsigned char *isdn_ppp_skb_push(struct sk_buff
**skb_p
,int len
)
1073 struct sk_buff
*skb
= *skb_p
;
1075 if(skb_headroom(skb
) < len
) {
1076 struct sk_buff
*nskb
= skb_realloc_headroom(skb
, len
);
1079 printk(KERN_ERR
"isdn_ppp_skb_push: can't realloc headroom!\n");
1083 printk(KERN_DEBUG
"isdn_ppp_skb_push:under %d %d\n",skb_headroom(skb
),len
);
1086 return skb_push(nskb
, len
);
1088 return skb_push(skb
,len
);
1093 * send ppp frame .. we expect a PIDCOMPressable proto --
1094 * (here: currently always PPP_IP,PPP_VJC_COMP,PPP_VJC_UNCOMP)
1096 * VJ compression may change skb pointer!!! .. requeue with old
1097 * skb isn't allowed!!
1101 isdn_ppp_xmit(struct sk_buff
*skb
, struct net_device
*netdev
)
1103 isdn_net_local
*lp
,*mlp
;
1105 unsigned int proto
= PPP_IP
; /* 0x21 */
1106 struct ippp_struct
*ipt
,*ipts
;
1109 mlp
= (isdn_net_local
*) (netdev
->priv
);
1110 nd
= mlp
->netdev
; /* get master lp */
1112 slot
= mlp
->ppp_slot
;
1113 if (slot
< 0 || slot
> ISDN_MAX_CHANNELS
) {
1114 printk(KERN_ERR
"isdn_ppp_xmit: lp->ppp_slot %d\n", mlp
->ppp_slot
);
1118 ipts
= ippp_table
[slot
];
1120 if (!(ipts
->pppcfg
& SC_ENABLE_IP
)) { /* PPP connected ? */
1121 if (ipts
->debug
& 0x1)
1122 printk(KERN_INFO
"%s: IP frame delayed.\n", netdev
->name
);
1126 switch (ntohs(skb
->protocol
)) {
1131 proto
= PPP_IPX
; /* untested */
1135 printk(KERN_ERR
"isdn_ppp: skipped unsupported protocol: %#x.\n",
1140 lp
= isdn_net_get_locked_lp(nd
);
1142 printk(KERN_WARNING
"%s: all channels busy - requeuing!\n", netdev
->name
);
1145 /* we have our lp locked from now on */
1147 slot
= lp
->ppp_slot
;
1148 if (slot
< 0 || slot
> ISDN_MAX_CHANNELS
) {
1149 printk(KERN_ERR
"isdn_ppp_xmit: lp->ppp_slot %d\n", lp
->ppp_slot
);
1153 ipt
= ippp_table
[slot
];
1157 * after this line .. requeueing in the device queue is no longer allowed!!!
1160 /* Pull off the fake header we stuck on earlier to keep
1161 * the fragmentation code happy.
1163 skb_pull(skb
,IPPP_MAX_HEADER
);
1165 if (ipt
->debug
& 0x4)
1166 printk(KERN_DEBUG
"xmit skb, len %d\n", (int) skb
->len
);
1167 if (ipts
->debug
& 0x40)
1168 isdn_ppp_frame_log("xmit0", skb
->data
, skb
->len
, 32,ipts
->unit
,lp
->ppp_slot
);
1170 #ifdef CONFIG_ISDN_PPP_VJ
1171 if (proto
== PPP_IP
&& ipts
->pppcfg
& SC_COMP_TCP
) { /* ipts here? probably yes, but check this again */
1172 struct sk_buff
*new_skb
;
1175 * we need to reserve enought space in front of
1176 * sk_buff. old call to dev_alloc_skb only reserved
1177 * 16 bytes, now we are looking what the driver want.
1179 hl
= dev
->drv
[lp
->isdn_device
]->interface
->hl_hdrlen
+ IPPP_MAX_HEADER
;
1181 * Note: hl might still be insufficient because the method
1182 * above does not account for a possibible MPPP slave channel
1183 * which had larger HL header space requirements than the
1186 new_skb
= alloc_skb(hl
+skb
->len
, GFP_ATOMIC
);
1191 skb_reserve(new_skb
, hl
);
1192 new_skb
->dev
= skb
->dev
;
1193 skb_put(new_skb
, skb
->len
);
1196 pktlen
= slhc_compress(ipts
->slcomp
, skb
->data
, skb
->len
, new_skb
->data
,
1197 &buf
, !(ipts
->pppcfg
& SC_NO_TCP_CCID
));
1199 if (buf
!= skb
->data
) {
1200 if (new_skb
->data
!= buf
)
1201 printk(KERN_ERR
"isdn_ppp: FATAL error after slhc_compress!!\n");
1205 dev_kfree_skb(new_skb
);
1208 skb_trim(skb
, pktlen
);
1209 if (skb
->data
[0] & SL_TYPE_COMPRESSED_TCP
) { /* cslip? style -> PPP */
1210 proto
= PPP_VJC_COMP
;
1211 skb
->data
[0] ^= SL_TYPE_COMPRESSED_TCP
;
1213 if (skb
->data
[0] >= SL_TYPE_UNCOMPRESSED_TCP
)
1214 proto
= PPP_VJC_UNCOMP
;
1215 skb
->data
[0] = (skb
->data
[0] & 0x0f) | 0x40;
1222 * normal (single link) or bundle compression
1224 if(ipts
->compflags
& SC_COMP_ON
)
1225 skb
= isdn_ppp_compress(skb
,&proto
,ipt
,ipts
,0);
1227 if (ipt
->debug
& 0x24)
1228 printk(KERN_DEBUG
"xmit2 skb, len %d, proto %04x\n", (int) skb
->len
, proto
);
1230 #ifdef CONFIG_ISDN_MPP
1231 if (ipt
->mpppcfg
& SC_MP_PROT
) {
1232 /* we get mp_seqno from static isdn_net_local */
1233 long mp_seqno
= ipts
->mp_seqno
;
1235 if (ipt
->mpppcfg
& SC_OUT_SHORT_SEQ
) {
1236 unsigned char *data
= isdn_ppp_skb_push(&skb
, 3);
1240 data
[0] = MP_BEGIN_FRAG
| MP_END_FRAG
| ((mp_seqno
>> 8) & 0xf); /* (B)egin & (E)ndbit .. */
1241 data
[1] = mp_seqno
& 0xff;
1242 data
[2] = proto
; /* PID compression */
1244 unsigned char *data
= isdn_ppp_skb_push(&skb
, 5);
1247 data
[0] = MP_BEGIN_FRAG
| MP_END_FRAG
; /* (B)egin & (E)ndbit .. */
1248 data
[1] = (mp_seqno
>> 16) & 0xff; /* sequence number: 24bit */
1249 data
[2] = (mp_seqno
>> 8) & 0xff;
1250 data
[3] = (mp_seqno
>> 0) & 0xff;
1251 data
[4] = proto
; /* PID compression */
1253 proto
= PPP_MP
; /* MP Protocol, 0x003d */
1258 * 'link in bundle' compression ...
1260 if(ipt
->compflags
& SC_LINK_COMP_ON
)
1261 skb
= isdn_ppp_compress(skb
,&proto
,ipt
,ipts
,1);
1263 if( (ipt
->pppcfg
& SC_COMP_PROT
) && (proto
<= 0xff) ) {
1264 unsigned char *data
= isdn_ppp_skb_push(&skb
,1);
1267 data
[0] = proto
& 0xff;
1270 unsigned char *data
= isdn_ppp_skb_push(&skb
,2);
1273 data
[0] = (proto
>> 8) & 0xff;
1274 data
[1] = proto
& 0xff;
1276 if(!(ipt
->pppcfg
& SC_COMP_AC
)) {
1277 unsigned char *data
= isdn_ppp_skb_push(&skb
,2);
1280 data
[0] = 0xff; /* All Stations */
1281 data
[1] = 0x03; /* Unnumbered information */
1284 /* tx-stats are now updated via BSENT-callback */
1286 if (ipts
->debug
& 0x40) {
1287 printk(KERN_DEBUG
"skb xmit: len: %d\n", (int) skb
->len
);
1288 isdn_ppp_frame_log("xmit", skb
->data
, skb
->len
, 32,ipt
->unit
,lp
->ppp_slot
);
1291 isdn_net_writebuf_skb(lp
, skb
);
1294 spin_unlock_bh(&lp
->xmit_lock
);
1298 #ifdef CONFIG_ISDN_MPP
1300 /* this is _not_ rfc1990 header, but something we convert both short and long
1301 * headers to for convinience's sake:
1302 * byte 0 is flags as in rfc1990
1303 * bytes 1...4 is 24-bit seqence number converted to host byte order
1305 #define MP_HEADER_LEN 5
1307 #define MP_LONGSEQ_MASK 0x00ffffff
1308 #define MP_SHORTSEQ_MASK 0x00000fff
1309 #define MP_LONGSEQ_MAX MP_LONGSEQ_MASK
1310 #define MP_SHORTSEQ_MAX MP_SHORTSEQ_MASK
1311 #define MP_LONGSEQ_MAXBIT ((MP_LONGSEQ_MASK+1)>>1)
1312 #define MP_SHORTSEQ_MAXBIT ((MP_SHORTSEQ_MASK+1)>>1)
1314 /* sequence-wrap safe comparisions (for long sequence)*/
1315 #define MP_LT(a,b) ((a-b)&MP_LONGSEQ_MAXBIT)
1316 #define MP_LE(a,b) !((b-a)&MP_LONGSEQ_MAXBIT)
1317 #define MP_GT(a,b) ((b-a)&MP_LONGSEQ_MAXBIT)
1318 #define MP_GE(a,b) !((a-b)&MP_LONGSEQ_MAXBIT)
1320 #define MP_SEQ(f) ((*(u32*)(f->data+1)))
1321 #define MP_FLAGS(f) (f->data[0])
1323 static int isdn_ppp_mp_bundle_array_init(void)
1326 int sz
= ISDN_MAX_CHANNELS
*sizeof(ippp_bundle
);
1327 if( (isdn_ppp_bundle_arr
= (ippp_bundle
*)kmalloc(sz
,
1328 GFP_KERNEL
)) == NULL
)
1330 memset(isdn_ppp_bundle_arr
, 0, sz
);
1331 for( i
= 0; i
< ISDN_MAX_CHANNELS
; i
++ )
1332 spin_lock_init(&isdn_ppp_bundle_arr
[i
].lock
);
1336 static ippp_bundle
* isdn_ppp_mp_bundle_alloc(void)
1339 for( i
= 0; i
< ISDN_MAX_CHANNELS
; i
++ )
1340 if (isdn_ppp_bundle_arr
[i
].ref_ct
<= 0)
1341 return (isdn_ppp_bundle_arr
+ i
);
1345 static int isdn_ppp_mp_init( isdn_net_local
* lp
, ippp_bundle
* add_to
)
1347 struct ippp_struct
* is
= ippp_table
[lp
->ppp_slot
];
1350 if( lp
->netdev
->pb
)
1351 lp
->netdev
->pb
->ref_ct
--;
1352 lp
->netdev
->pb
= add_to
;
1353 } else { /* first link in a bundle */
1355 if ((lp
->netdev
->pb
= isdn_ppp_mp_bundle_alloc()) == NULL
)
1357 lp
->next
= lp
->last
= lp
; /* nobody else in a queue */
1358 lp
->netdev
->pb
->frags
= NULL
;
1359 lp
->netdev
->pb
->frames
= 0;
1360 lp
->netdev
->pb
->seq
= LONG_MAX
;
1362 lp
->netdev
->pb
->ref_ct
++;
1364 is
->last_link_seqno
= 0;
1368 static u32
isdn_ppp_mp_get_seq( int short_seq
,
1369 struct sk_buff
* skb
, u32 last_seq
);
1370 static struct sk_buff
* isdn_ppp_mp_discard( ippp_bundle
* mp
,
1371 struct sk_buff
* from
, struct sk_buff
* to
);
1372 static void isdn_ppp_mp_reassembly( isdn_net_dev
* net_dev
, isdn_net_local
* lp
,
1373 struct sk_buff
* from
, struct sk_buff
* to
);
1374 static void isdn_ppp_mp_free_skb( ippp_bundle
* mp
, struct sk_buff
* skb
);
1375 static void isdn_ppp_mp_print_recv_pkt( int slot
, struct sk_buff
* skb
);
1377 static void isdn_ppp_mp_receive(isdn_net_dev
* net_dev
, isdn_net_local
* lp
,
1378 struct sk_buff
*skb
)
1380 struct ippp_struct
*is
;
1381 isdn_net_local
* lpq
;
1383 isdn_mppp_stats
* stats
;
1384 struct sk_buff
* newfrag
, * frag
, * start
, *nextf
;
1385 u32 newseq
, minseq
, thisseq
;
1386 unsigned long flags
;
1389 spin_lock_irqsave(&net_dev
->pb
->lock
, flags
);
1392 slot
= lp
->ppp_slot
;
1393 if (slot
< 0 || slot
> ISDN_MAX_CHANNELS
) {
1394 printk(KERN_ERR
"isdn_ppp_mp_receive: lp->ppp_slot %d\n", lp
->ppp_slot
);
1395 stats
->frame_drops
++;
1397 spin_unlock_irqrestore(&mp
->lock
, flags
);
1400 is
= ippp_table
[slot
];
1401 if( ++mp
->frames
> stats
->max_queue_len
)
1402 stats
->max_queue_len
= mp
->frames
;
1404 if (is
->debug
& 0x8)
1405 isdn_ppp_mp_print_recv_pkt(lp
->ppp_slot
, skb
);
1407 newseq
= isdn_ppp_mp_get_seq(is
->mpppcfg
& SC_IN_SHORT_SEQ
,
1408 skb
, is
->last_link_seqno
);
1411 /* if this packet seq # is less than last already processed one,
1412 * toss it right away, but check for sequence start case first
1414 if( mp
->seq
> MP_LONGSEQ_MAX
&& (newseq
& MP_LONGSEQ_MAXBIT
) ) {
1415 mp
->seq
= newseq
; /* the first packet: required for
1416 * rfc1990 non-compliant clients --
1417 * prevents constant packet toss */
1418 } else if( MP_LT(newseq
, mp
->seq
) ) {
1419 stats
->frame_drops
++;
1420 isdn_ppp_mp_free_skb(mp
, skb
);
1421 spin_unlock_irqrestore(&mp
->lock
, flags
);
1425 /* find the minimum received sequence number over all links */
1426 is
->last_link_seqno
= minseq
= newseq
;
1427 for (lpq
= net_dev
->queue
;;) {
1428 slot
= lpq
->ppp_slot
;
1429 if (slot
< 0 || slot
> ISDN_MAX_CHANNELS
) {
1430 printk(KERN_ERR
"isdn_ppp_mp_receive: lpq->ppp_slot %d\n", lpq
->ppp_slot
);
1432 u32 lls
= ippp_table
[slot
]->last_link_seqno
;
1433 if (MP_LT(lls
, minseq
))
1436 if ((lpq
= lpq
->next
) == net_dev
->queue
)
1439 if (MP_LT(minseq
, mp
->seq
))
1440 minseq
= mp
->seq
; /* can't go beyond already processed
1444 /* if this new fragment is before the first one, then enqueue it now. */
1445 if ((frag
= mp
->frags
) == NULL
|| MP_LT(newseq
, MP_SEQ(frag
))) {
1446 newfrag
->next
= frag
;
1447 mp
->frags
= frag
= newfrag
;
1451 start
= MP_FLAGS(frag
) & MP_BEGIN_FRAG
&&
1452 MP_SEQ(frag
) == mp
->seq
? frag
: NULL
;
1455 * main fragment traversing loop
1457 * try to accomplish several tasks:
1458 * - insert new fragment into the proper sequence slot (once that's done
1459 * newfrag will be set to NULL)
1460 * - reassemble any complete fragment sequence (non-null 'start'
1461 * indicates there is a continguous sequence present)
1462 * - discard any incomplete sequences that are below minseq -- due
1463 * to the fact that sender always increment sequence number, if there
1464 * is an incomplete sequence below minseq, no new fragments would
1465 * come to complete such sequence and it should be discarded
1467 * loop completes when we accomplished the following tasks:
1468 * - new fragment is inserted in the proper sequence ('newfrag' is
1470 * - we hit a gap in the sequence, so no reassembly/processing is
1471 * possible ('start' would be set to NULL)
1473 * algorightm for this code is derived from code in the book
1474 * 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
1476 while (start
!= NULL
|| newfrag
!= NULL
) {
1478 thisseq
= MP_SEQ(frag
);
1481 /* drop any duplicate fragments */
1482 if (newfrag
!= NULL
&& thisseq
== newseq
) {
1483 isdn_ppp_mp_free_skb(mp
, newfrag
);
1487 /* insert new fragment before next element if possible. */
1488 if (newfrag
!= NULL
&& (nextf
== NULL
||
1489 MP_LT(newseq
, MP_SEQ(nextf
)))) {
1490 newfrag
->next
= nextf
;
1491 frag
->next
= nextf
= newfrag
;
1495 if (start
!= NULL
) {
1496 /* check for misplaced start */
1497 if (start
!= frag
&& (MP_FLAGS(frag
) & MP_BEGIN_FRAG
)) {
1498 printk(KERN_WARNING
"isdn_mppp(seq %d): new "
1499 "BEGIN flag with no prior END", thisseq
);
1501 stats
->frame_drops
++;
1502 start
= isdn_ppp_mp_discard(mp
, start
,frag
);
1505 } else if (MP_LE(thisseq
, minseq
)) {
1506 if (MP_FLAGS(frag
) & MP_BEGIN_FRAG
)
1509 if (MP_FLAGS(frag
) & MP_END_FRAG
)
1510 stats
->frame_drops
++;
1511 if( mp
->frags
== frag
)
1513 isdn_ppp_mp_free_skb(mp
, frag
);
1519 /* if start is non-null and we have end fragment, then
1520 * we have full reassembly sequence -- reassemble
1521 * and process packet now
1523 if (start
!= NULL
&& (MP_FLAGS(frag
) & MP_END_FRAG
)) {
1524 minseq
= mp
->seq
= (thisseq
+1) & MP_LONGSEQ_MASK
;
1525 /* Reassemble the packet then dispatch it */
1526 isdn_ppp_mp_reassembly(net_dev
, lp
, start
, nextf
);
1534 /* check if need to update start pointer: if we just
1535 * reassembled the packet and sequence is contiguous
1536 * then next fragment should be the start of new reassembly
1537 * if sequence is contiguous, but we haven't reassembled yet,
1539 * if sequence is not contiguous, either clear everyting
1540 * below low watermark and set start to the next frag or
1543 if (nextf
!= NULL
&&
1544 ((thisseq
+1) & MP_LONGSEQ_MASK
) == MP_SEQ(nextf
)) {
1545 /* if we just reassembled and the next one is here,
1546 * then start another reassembly. */
1549 if (MP_FLAGS(nextf
) & MP_BEGIN_FRAG
)
1553 printk(KERN_WARNING
"isdn_mppp(seq %d):"
1554 " END flag with no following "
1561 if ( nextf
!= NULL
&& frag
!= NULL
&&
1562 MP_LT(thisseq
, minseq
)) {
1563 /* we've got a break in the sequence
1564 * and we not at the end yet
1565 * and we did not just reassembled
1566 *(if we did, there wouldn't be anything before)
1567 * and we below the low watermark
1568 * discard all the frames below low watermark
1570 stats
->frame_drops
++;
1571 mp
->frags
= isdn_ppp_mp_discard(mp
,start
,nextf
);
1573 /* break in the sequence, no reassembly */
1578 } /* while -- main loop */
1580 if (mp
->frags
== NULL
)
1583 /* rather straighforward way to deal with (not very) possible
1585 if (mp
->frames
> MP_MAX_QUEUE_LEN
) {
1587 while (mp
->frames
> MP_MAX_QUEUE_LEN
) {
1588 frag
= mp
->frags
->next
;
1589 isdn_ppp_mp_free_skb(mp
, mp
->frags
);
1593 spin_unlock_irqrestore(&mp
->lock
, flags
);
1596 static void isdn_ppp_mp_cleanup( isdn_net_local
* lp
)
1598 struct sk_buff
* frag
= lp
->netdev
->pb
->frags
;
1599 struct sk_buff
* nextfrag
;
1601 nextfrag
= frag
->next
;
1602 isdn_ppp_mp_free_skb(lp
->netdev
->pb
, frag
);
1605 lp
->netdev
->pb
->frags
= NULL
;
1608 static u32
isdn_ppp_mp_get_seq( int short_seq
,
1609 struct sk_buff
* skb
, u32 last_seq
)
1612 int flags
= skb
->data
[0] & (MP_BEGIN_FRAG
| MP_END_FRAG
);
1616 seq
= ntohl(*(u32
*)skb
->data
) & MP_LONGSEQ_MASK
;
1621 /* convert 12-bit short seq number to 24-bit long one
1623 seq
= ntohs(*(u16
*)skb
->data
) & MP_SHORTSEQ_MASK
;
1625 /* check for seqence wrap */
1626 if( !(seq
& MP_SHORTSEQ_MAXBIT
) &&
1627 (last_seq
& MP_SHORTSEQ_MAXBIT
) &&
1628 (unsigned long)last_seq
<= MP_LONGSEQ_MAX
)
1629 seq
|= (last_seq
+ MP_SHORTSEQ_MAX
+1) &
1630 (~MP_SHORTSEQ_MASK
& MP_LONGSEQ_MASK
);
1632 seq
|= last_seq
& (~MP_SHORTSEQ_MASK
& MP_LONGSEQ_MASK
);
1634 skb_push(skb
, 3); /* put converted seqence back in skb */
1636 *(u32
*)(skb
->data
+1) = seq
; /* put seqence back in _host_ byte
1638 skb
->data
[0] = flags
; /* restore flags */
1642 struct sk_buff
* isdn_ppp_mp_discard( ippp_bundle
* mp
,
1643 struct sk_buff
* from
, struct sk_buff
* to
)
1646 while (from
!= to
) {
1647 struct sk_buff
* next
= from
->next
;
1648 isdn_ppp_mp_free_skb(mp
, from
);
1654 void isdn_ppp_mp_reassembly( isdn_net_dev
* net_dev
, isdn_net_local
* lp
,
1655 struct sk_buff
* from
, struct sk_buff
* to
)
1657 ippp_bundle
* mp
= net_dev
->pb
;
1659 struct sk_buff
* skb
;
1660 unsigned int tot_len
;
1662 if( MP_FLAGS(from
) == (MP_BEGIN_FRAG
| MP_END_FRAG
) ) {
1663 if( ippp_table
[lp
->ppp_slot
]->debug
& 0x40 )
1664 printk(KERN_DEBUG
"isdn_mppp: reassembly: frame %d, "
1665 "len %d\n", MP_SEQ(from
), from
->len
);
1667 skb_pull(skb
, MP_HEADER_LEN
);
1670 struct sk_buff
* frag
;
1673 for(tot_len
=n
=0, frag
=from
; frag
!= to
; frag
=frag
->next
, n
++)
1674 tot_len
+= frag
->len
- MP_HEADER_LEN
;
1676 if( ippp_table
[lp
->ppp_slot
]->debug
& 0x40 )
1677 printk(KERN_DEBUG
"isdn_mppp: reassembling frames %d "
1678 "to %d, len %d\n", MP_SEQ(from
),
1679 (MP_SEQ(from
)+n
-1) & MP_LONGSEQ_MASK
, tot_len
);
1680 if( (skb
= dev_alloc_skb(tot_len
)) == NULL
) {
1681 printk(KERN_ERR
"isdn_mppp: cannot allocate sk buff "
1682 "of size %d\n", tot_len
);
1683 isdn_ppp_mp_discard(mp
, from
, to
);
1687 while( from
!= to
) {
1688 unsigned int len
= from
->len
- MP_HEADER_LEN
;
1690 memcpy(skb_put(skb
,len
), from
->data
+MP_HEADER_LEN
, len
);
1692 isdn_ppp_mp_free_skb(mp
, from
);
1696 proto
= isdn_ppp_strip_proto(skb
);
1697 isdn_ppp_push_higher(net_dev
, lp
, skb
, proto
);
1700 static void isdn_ppp_mp_free_skb(ippp_bundle
* mp
, struct sk_buff
* skb
)
1706 static void isdn_ppp_mp_print_recv_pkt( int slot
, struct sk_buff
* skb
)
1708 printk(KERN_DEBUG
"mp_recv: %d/%d -> %02x %02x %02x %02x %02x %02x\n",
1709 slot
, (int) skb
->len
,
1710 (int) skb
->data
[0], (int) skb
->data
[1], (int) skb
->data
[2],
1711 (int) skb
->data
[3], (int) skb
->data
[4], (int) skb
->data
[5]);
1715 isdn_ppp_bundle(struct ippp_struct
*is
, int unit
)
1717 char ifn
[IFNAMSIZ
+ 1];
1719 isdn_net_local
*lp
, *nlp
;
1721 unsigned long flags
;
1723 sprintf(ifn
, "ippp%d", unit
);
1724 p
= isdn_net_findif(ifn
);
1726 printk(KERN_ERR
"ippp_bundle: cannot find %s\n", ifn
);
1730 spin_lock_irqsave(&p
->pb
->lock
, flags
);
1734 if( nlp
->ppp_slot
< 0 || nlp
->ppp_slot
>= ISDN_MAX_CHANNELS
||
1735 lp
->ppp_slot
< 0 || lp
->ppp_slot
>= ISDN_MAX_CHANNELS
) {
1736 printk(KERN_ERR
"ippp_bundle: binding to invalid slot %d\n",
1737 nlp
->ppp_slot
< 0 || nlp
->ppp_slot
>= ISDN_MAX_CHANNELS
?
1738 nlp
->ppp_slot
: lp
->ppp_slot
);
1743 isdn_net_add_to_bundle(p
, nlp
);
1745 ippp_table
[nlp
->ppp_slot
]->unit
= ippp_table
[lp
->ppp_slot
]->unit
;
1747 /* maybe also SC_CCP stuff */
1748 ippp_table
[nlp
->ppp_slot
]->pppcfg
|= ippp_table
[lp
->ppp_slot
]->pppcfg
&
1749 (SC_ENABLE_IP
| SC_NO_TCP_CCID
| SC_REJ_COMP_TCP
);
1750 ippp_table
[nlp
->ppp_slot
]->mpppcfg
|= ippp_table
[lp
->ppp_slot
]->mpppcfg
&
1751 (SC_MP_PROT
| SC_REJ_MP_PROT
| SC_OUT_SHORT_SEQ
| SC_IN_SHORT_SEQ
);
1752 rc
= isdn_ppp_mp_init(nlp
, p
->pb
);
1754 spin_unlock_irqrestore(&p
->pb
->lock
, flags
);
1758 #endif /* CONFIG_ISDN_MPP */
1761 * network device ioctl handlers
1765 isdn_ppp_dev_ioctl_stats(int slot
, struct ifreq
*ifr
, struct net_device
*dev
)
1767 struct ppp_stats
*res
,
1769 isdn_net_local
*lp
= (isdn_net_local
*) dev
->priv
;
1772 res
= (struct ppp_stats
*) ifr
->ifr_ifru
.ifru_data
;
1773 err
= verify_area(VERIFY_WRITE
, res
, sizeof(struct ppp_stats
));
1778 /* build a temporary stat struct and copy it to user space */
1780 memset(&t
, 0, sizeof(struct ppp_stats
));
1781 if (dev
->flags
& IFF_UP
) {
1782 t
.p
.ppp_ipackets
= lp
->stats
.rx_packets
;
1783 t
.p
.ppp_ierrors
= lp
->stats
.rx_errors
;
1784 t
.p
.ppp_opackets
= lp
->stats
.tx_packets
;
1785 t
.p
.ppp_oerrors
= lp
->stats
.tx_errors
;
1786 #ifdef CONFIG_ISDN_PPP_VJ
1787 if (slot
>= 0 && ippp_table
[slot
]->slcomp
) {
1788 struct slcompress
*slcomp
= ippp_table
[slot
]->slcomp
;
1789 t
.vj
.vjs_packets
= slcomp
->sls_o_compressed
+ slcomp
->sls_o_uncompressed
;
1790 t
.vj
.vjs_compressed
= slcomp
->sls_o_compressed
;
1791 t
.vj
.vjs_searches
= slcomp
->sls_o_searches
;
1792 t
.vj
.vjs_misses
= slcomp
->sls_o_misses
;
1793 t
.vj
.vjs_errorin
= slcomp
->sls_i_error
;
1794 t
.vj
.vjs_tossed
= slcomp
->sls_i_tossed
;
1795 t
.vj
.vjs_uncompressedin
= slcomp
->sls_i_uncompressed
;
1796 t
.vj
.vjs_compressedin
= slcomp
->sls_i_compressed
;
1800 if( copy_to_user(res
, &t
, sizeof(struct ppp_stats
))) return -EFAULT
;
1805 isdn_ppp_dev_ioctl(struct net_device
*dev
, struct ifreq
*ifr
, int cmd
)
1810 isdn_net_local
*lp
= (isdn_net_local
*) dev
->priv
;
1813 if (lp
->p_encap
!= ISDN_NET_ENCAP_SYNCPPP
)
1818 r
= (char *) ifr
->ifr_ifru
.ifru_data
;
1819 len
= strlen(PPP_VERSION
) + 1;
1820 if(copy_to_user(r
, PPP_VERSION
, len
)) error
= -EFAULT
;
1823 error
= isdn_ppp_dev_ioctl_stats(lp
->ppp_slot
, ifr
, dev
);
1833 isdn_ppp_if_get_unit(char *name
)
1842 if (strncmp("ippp", name
, 4) || len
> 8)
1845 for (i
= 0, deci
= 1; i
< len
; i
++, deci
*= 10) {
1846 char a
= name
[len
- i
- 1];
1847 if (a
>= '0' && a
<= '9')
1848 unit
+= (a
- '0') * deci
;
1852 if (!i
|| len
- i
!= 4)
1860 isdn_ppp_dial_slave(char *name
)
1862 #ifdef CONFIG_ISDN_MPP
1865 struct net_device
*sdev
;
1867 if (!(ndev
= isdn_net_findif(name
)))
1870 if (!(lp
->flags
& ISDN_NET_CONNECTED
))
1875 isdn_net_local
*mlp
= (isdn_net_local
*) sdev
->priv
;
1876 if (!(mlp
->flags
& ISDN_NET_CONNECTED
))
1883 isdn_net_dial_req((isdn_net_local
*) sdev
->priv
);
1891 isdn_ppp_hangup_slave(char *name
)
1893 #ifdef CONFIG_ISDN_MPP
1896 struct net_device
*sdev
;
1898 if (!(ndev
= isdn_net_findif(name
)))
1901 if (!(lp
->flags
& ISDN_NET_CONNECTED
))
1906 isdn_net_local
*mlp
= (isdn_net_local
*) sdev
->priv
;
1907 if ((mlp
->flags
& ISDN_NET_CONNECTED
))
1914 isdn_net_hangup(sdev
);
1922 * PPP compression stuff
1926 /* Push an empty CCP Data Frame up to the daemon to wake it up and let it
1927 generate a CCP Reset-Request or tear down CCP altogether */
1929 static void isdn_ppp_ccp_kickup(struct ippp_struct
*is
)
1931 isdn_ppp_fill_rq(NULL
, 0, PPP_COMP
, is
->lp
->ppp_slot
);
1934 /* In-kernel handling of CCP Reset-Request and Reset-Ack is necessary,
1935 but absolutely nontrivial. The most abstruse problem we are facing is
1936 that the generation, reception and all the handling of timeouts and
1937 resends including proper request id management should be entirely left
1938 to the (de)compressor, but indeed is not covered by the current API to
1939 the (de)compressor. The API is a prototype version from PPP where only
1940 some (de)compressors have yet been implemented and all of them are
1941 rather simple in their reset handling. Especially, their is only one
1942 outstanding ResetAck at a time with all of them and ResetReq/-Acks do
1943 not have parameters. For this very special case it was sufficient to
1944 just return an error code from the decompressor and have a single
1945 reset() entry to communicate all the necessary information between
1946 the framework and the (de)compressor. Bad enough, LZS is different
1947 (and any other compressor may be different, too). It has multiple
1948 histories (eventually) and needs to Reset each of them independently
1949 and thus uses multiple outstanding Acks and history numbers as an
1950 additional parameter to Reqs/Acks.
1951 All that makes it harder to port the reset state engine into the
1952 kernel because it is not just the same simple one as in (i)pppd but
1953 it must be able to pass additional parameters and have multiple out-
1954 standing Acks. We are trying to achieve the impossible by handling
1955 reset transactions independent by their id. The id MUST change when
1956 the data portion changes, thus any (de)compressor who uses more than
1957 one resettable state must provide and recognize individual ids for
1958 each individual reset transaction. The framework itself does _only_
1959 differentiate them by id, because it has no other semantics like the
1960 (de)compressor might.
1961 This looks like a major redesign of the interface would be nice,
1962 but I don't have an idea how to do it better. */
1964 /* Send a CCP Reset-Request or Reset-Ack directly from the kernel. This is
1965 getting that lengthy because there is no simple "send-this-frame-out"
1966 function above but every wrapper does a bit different. Hope I guess
1967 correct in this hack... */
1969 static void isdn_ppp_ccp_xmit_reset(struct ippp_struct
*is
, int proto
,
1970 unsigned char code
, unsigned char id
,
1971 unsigned char *data
, int len
)
1973 struct sk_buff
*skb
;
1977 isdn_net_local
*lp
= is
->lp
;
1979 /* Alloc large enough skb */
1980 hl
= dev
->drv
[lp
->isdn_device
]->interface
->hl_hdrlen
;
1981 skb
= alloc_skb(len
+ hl
+ 16,GFP_ATOMIC
);
1984 "ippp: CCP cannot send reset - out of memory\n");
1987 skb_reserve(skb
, hl
);
1989 /* We may need to stuff an address and control field first */
1990 if(!(is
->pppcfg
& SC_COMP_AC
)) {
1991 p
= skb_put(skb
, 2);
1996 /* Stuff proto, code, id and length */
1997 p
= skb_put(skb
, 6);
1998 *p
++ = (proto
>> 8);
1999 *p
++ = (proto
& 0xff);
2004 *p
++ = (cnt
& 0xff);
2006 /* Now stuff remaining bytes */
2008 p
= skb_put(skb
, len
);
2009 memcpy(p
, data
, len
);
2012 /* skb is now ready for xmit */
2013 printk(KERN_DEBUG
"Sending CCP Frame:\n");
2014 isdn_ppp_frame_log("ccp-xmit", skb
->data
, skb
->len
, 32, is
->unit
,lp
->ppp_slot
);
2016 isdn_net_write_super(lp
, skb
);
2019 /* Allocate the reset state vector */
2020 static struct ippp_ccp_reset
*isdn_ppp_ccp_reset_alloc(struct ippp_struct
*is
)
2022 struct ippp_ccp_reset
*r
;
2023 r
= kmalloc(sizeof(struct ippp_ccp_reset
), GFP_KERNEL
);
2025 printk(KERN_ERR
"ippp_ccp: failed to allocate reset data"
2026 " structure - no mem\n");
2029 memset(r
, 0, sizeof(struct ippp_ccp_reset
));
2030 printk(KERN_DEBUG
"ippp_ccp: allocated reset data structure %p\n", r
);
2035 /* Destroy the reset state vector. Kill all pending timers first. */
2036 static void isdn_ppp_ccp_reset_free(struct ippp_struct
*is
)
2040 printk(KERN_DEBUG
"ippp_ccp: freeing reset data structure %p\n",
2042 for(id
= 0; id
< 256; id
++) {
2043 if(is
->reset
->rs
[id
]) {
2044 isdn_ppp_ccp_reset_free_state(is
, (unsigned char)id
);
2051 /* Free a given state and clear everything up for later reallocation */
2052 static void isdn_ppp_ccp_reset_free_state(struct ippp_struct
*is
,
2055 struct ippp_ccp_reset_state
*rs
;
2057 if(is
->reset
->rs
[id
]) {
2058 printk(KERN_DEBUG
"ippp_ccp: freeing state for id %d\n", id
);
2059 rs
= is
->reset
->rs
[id
];
2060 /* Make sure the kernel will not call back later */
2062 del_timer(&rs
->timer
);
2063 is
->reset
->rs
[id
] = NULL
;
2066 printk(KERN_WARNING
"ippp_ccp: id %d is not allocated\n", id
);
2070 /* The timer callback function which is called when a ResetReq has timed out,
2071 aka has never been answered by a ResetAck */
2072 static void isdn_ppp_ccp_timer_callback(unsigned long closure
)
2074 struct ippp_ccp_reset_state
*rs
=
2075 (struct ippp_ccp_reset_state
*)closure
;
2078 printk(KERN_ERR
"ippp_ccp: timer cb with zero closure.\n");
2081 if(rs
->ta
&& rs
->state
== CCPResetSentReq
) {
2082 /* We are correct here */
2083 printk(KERN_DEBUG
"ippp_ccp: CCP Reset timed out for id %d\n",
2086 /* Hmm, there is no Ack really expected. We can clean
2087 up the state now, it will be reallocated if the
2088 decompressor insists on another reset */
2090 isdn_ppp_ccp_reset_free_state(rs
->is
, rs
->id
);
2094 isdn_ppp_ccp_xmit_reset(rs
->is
, PPP_CCP
, CCP_RESETREQ
, rs
->id
,
2095 rs
->data
, rs
->dlen
);
2097 rs
->timer
.expires
= jiffies
+ HZ
*5;
2098 add_timer(&rs
->timer
);
2100 printk(KERN_WARNING
"ippp_ccp: timer cb in wrong state %d\n",
2105 /* Allocate a new reset transaction state */
2106 static struct ippp_ccp_reset_state
*isdn_ppp_ccp_reset_alloc_state(struct ippp_struct
*is
,
2109 struct ippp_ccp_reset_state
*rs
;
2110 if(is
->reset
->rs
[id
]) {
2111 printk(KERN_WARNING
"ippp_ccp: old state exists for id %d\n",
2115 rs
= kmalloc(sizeof(struct ippp_ccp_reset_state
), GFP_KERNEL
);
2118 memset(rs
, 0, sizeof(struct ippp_ccp_reset_state
));
2119 rs
->state
= CCPResetIdle
;
2122 rs
->timer
.data
= (unsigned long)rs
;
2123 rs
->timer
.function
= isdn_ppp_ccp_timer_callback
;
2124 is
->reset
->rs
[id
] = rs
;
2130 /* A decompressor wants a reset with a set of parameters - do what is
2131 necessary to fulfill it */
2132 static void isdn_ppp_ccp_reset_trans(struct ippp_struct
*is
,
2133 struct isdn_ppp_resetparams
*rp
)
2135 struct ippp_ccp_reset_state
*rs
;
2138 /* The decompressor defines parameters by itself */
2140 /* And he wants us to send a request */
2142 printk(KERN_ERR
"ippp_ccp: decompressor must"
2143 " specify reset id\n");
2146 if(is
->reset
->rs
[rp
->id
]) {
2147 /* There is already a transaction in existence
2148 for this id. May be still waiting for a
2149 Ack or may be wrong. */
2150 rs
= is
->reset
->rs
[rp
->id
];
2151 if(rs
->state
== CCPResetSentReq
&& rs
->ta
) {
2152 printk(KERN_DEBUG
"ippp_ccp: reset"
2153 " trans still in progress"
2154 " for id %d\n", rp
->id
);
2156 printk(KERN_WARNING
"ippp_ccp: reset"
2157 " trans in wrong state %d for"
2158 " id %d\n", rs
->state
, rp
->id
);
2161 /* Ok, this is a new transaction */
2162 printk(KERN_DEBUG
"ippp_ccp: new trans for id"
2163 " %d to be started\n", rp
->id
);
2164 rs
= isdn_ppp_ccp_reset_alloc_state(is
, rp
->id
);
2166 printk(KERN_ERR
"ippp_ccp: out of mem"
2167 " allocing ccp trans\n");
2170 rs
->state
= CCPResetSentReq
;
2171 rs
->expra
= rp
->expra
;
2173 rs
->dlen
= rp
->dlen
;
2174 memcpy(rs
->data
, rp
->data
, rp
->dlen
);
2176 /* HACK TODO - add link comp here */
2177 isdn_ppp_ccp_xmit_reset(is
, PPP_CCP
,
2178 CCP_RESETREQ
, rs
->id
,
2179 rs
->data
, rs
->dlen
);
2180 /* Start the timer */
2181 rs
->timer
.expires
= jiffies
+ 5*HZ
;
2182 add_timer(&rs
->timer
);
2186 printk(KERN_DEBUG
"ippp_ccp: no reset sent\n");
2189 /* The reset params are invalid. The decompressor does not
2190 care about them, so we just send the minimal requests
2191 and increase ids only when an Ack is received for a
2193 if(is
->reset
->rs
[is
->reset
->lastid
]) {
2194 /* There is already a transaction in existence
2195 for this id. May be still waiting for a
2196 Ack or may be wrong. */
2197 rs
= is
->reset
->rs
[is
->reset
->lastid
];
2198 if(rs
->state
== CCPResetSentReq
&& rs
->ta
) {
2199 printk(KERN_DEBUG
"ippp_ccp: reset"
2200 " trans still in progress"
2201 " for id %d\n", rp
->id
);
2203 printk(KERN_WARNING
"ippp_ccp: reset"
2204 " trans in wrong state %d for"
2205 " id %d\n", rs
->state
, rp
->id
);
2208 printk(KERN_DEBUG
"ippp_ccp: new trans for id"
2209 " %d to be started\n", is
->reset
->lastid
);
2210 rs
= isdn_ppp_ccp_reset_alloc_state(is
,
2213 printk(KERN_ERR
"ippp_ccp: out of mem"
2214 " allocing ccp trans\n");
2217 rs
->state
= CCPResetSentReq
;
2218 /* We always expect an Ack if the decompressor doesnt
2222 /* HACK TODO - add link comp here */
2223 isdn_ppp_ccp_xmit_reset(is
, PPP_CCP
, CCP_RESETREQ
,
2225 /* Start the timer */
2226 rs
->timer
.expires
= jiffies
+ 5*HZ
;
2227 add_timer(&rs
->timer
);
2233 /* An Ack was received for this id. This means we stop the timer and clean
2234 up the state prior to calling the decompressors reset routine. */
2235 static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct
*is
,
2238 struct ippp_ccp_reset_state
*rs
= is
->reset
->rs
[id
];
2241 if(rs
->ta
&& rs
->state
== CCPResetSentReq
) {
2242 /* Great, we are correct */
2244 printk(KERN_DEBUG
"ippp_ccp: ResetAck received"
2245 " for id %d but not expected\n", id
);
2247 printk(KERN_INFO
"ippp_ccp: ResetAck received out of"
2248 "sync for id %d\n", id
);
2252 del_timer(&rs
->timer
);
2254 isdn_ppp_ccp_reset_free_state(is
, id
);
2256 printk(KERN_INFO
"ippp_ccp: ResetAck received for unknown id"
2259 /* Make sure the simple reset stuff uses a new id next time */
2260 is
->reset
->lastid
++;
2266 * if master = 0, we're trying to uncompress an per-link compressed packet,
2267 * as opposed to an compressed reconstructed-from-MPPP packet.
2268 * proto is updated to protocol field of uncompressed packet.
2270 * retval: decompressed packet,
2271 * same packet if uncompressed,
2272 * NULL if decompression error
2275 static struct sk_buff
*isdn_ppp_decompress(struct sk_buff
*skb
,struct ippp_struct
*is
,struct ippp_struct
*master
,
2279 struct isdn_ppp_compressor
*ipc
= NULL
;
2280 struct sk_buff
*skb_out
;
2282 struct ippp_struct
*ri
;
2283 struct isdn_ppp_resetparams rsparm
;
2284 unsigned char rsdata
[IPPP_RESET_MAXDATABYTES
];
2287 // per-link decompression
2288 stat
= is
->link_decomp_stat
;
2289 ipc
= is
->link_decompressor
;
2292 stat
= master
->decomp_stat
;
2293 ipc
= master
->decompressor
;
2298 // no decompressor -> we can't decompress.
2299 printk(KERN_DEBUG
"ippp: no decompressor defined!\n");
2302 if (!stat
) // if we have a compressor, stat has been set as well
2305 if((master
&& *proto
== PPP_COMP
) || (!master
&& *proto
== PPP_COMPFRAG
) ) {
2306 // compressed packets are compressed by their protocol type
2308 // Set up reset params for the decompressor
2309 memset(&rsparm
, 0, sizeof(rsparm
));
2310 rsparm
.data
= rsdata
;
2311 rsparm
.maxdlen
= IPPP_RESET_MAXDATABYTES
;
2313 /* !!!HACK,HACK,HACK!!! 2048 is only assumed */
2314 skb_out
= dev_alloc_skb(2048);
2315 len
= ipc
->decompress(stat
, skb
, skb_out
, &rsparm
);
2320 ri
->pppcfg
|= SC_DC_ERROR
;
2321 printk(KERN_INFO
"ippp: decomp wants reset %s params\n",
2322 rsparm
.valid
? "with" : "without");
2324 isdn_ppp_ccp_reset_trans(ri
, &rsparm
);
2326 case DECOMP_FATALERROR
:
2327 ri
->pppcfg
|= SC_DC_FERROR
;
2328 /* Kick ipppd to recognize the error */
2329 isdn_ppp_ccp_kickup(ri
);
2336 if (isdn_ppp_skip_ac(ri
, skb
) < 0) {
2340 *proto
= isdn_ppp_strip_proto(skb
);
2347 // uncompressed packets are fed through the decompressor to
2348 // update the decompressor state
2349 ipc
->incomp(stat
, skb
, *proto
);
2356 * type=0: normal/bundle compression
2357 * =1: link compression
2358 * returns original skb if we haven't compressed the frame
2359 * and a new skb pointer if we've done it
2361 static struct sk_buff
*isdn_ppp_compress(struct sk_buff
*skb_in
,int *proto
,
2362 struct ippp_struct
*is
,struct ippp_struct
*master
,int type
)
2366 struct isdn_ppp_compressor
*compressor
;
2368 struct sk_buff
*skb_out
;
2370 /* we do not compress control protocols */
2371 if(*proto
< 0 || *proto
> 0x3fff) {
2375 if(type
) { /* type=1 => Link compression */
2380 compressor
= is
->compressor
;
2381 stat
= is
->comp_stat
;
2384 compressor
= master
->compressor
;
2385 stat
= master
->comp_stat
;
2387 new_proto
= PPP_COMP
;
2391 printk(KERN_ERR
"isdn_ppp: No compressor set!\n");
2395 printk(KERN_ERR
"isdn_ppp: Compressor not initialized?\n");
2399 /* Allow for at least 150 % expansion (for now) */
2400 skb_out
= alloc_skb(skb_in
->len
+ skb_in
->len
/2 + 32 +
2401 skb_headroom(skb_in
), GFP_ATOMIC
);
2404 skb_reserve(skb_out
, skb_headroom(skb_in
));
2406 ret
= (compressor
->compress
)(stat
,skb_in
,skb_out
,*proto
);
2408 dev_kfree_skb(skb_out
);
2412 dev_kfree_skb(skb_in
);
2418 * we received a CCP frame ..
2419 * not a clean solution, but we MUST handle a few cases in the kernel
2421 static void isdn_ppp_receive_ccp(isdn_net_dev
*net_dev
, isdn_net_local
*lp
,
2422 struct sk_buff
*skb
,int proto
)
2424 struct ippp_struct
*is
= ippp_table
[lp
->ppp_slot
];
2425 struct ippp_struct
*mis
;
2427 struct isdn_ppp_resetparams rsparm
;
2428 unsigned char rsdata
[IPPP_RESET_MAXDATABYTES
];
2430 printk(KERN_DEBUG
"Received CCP frame from peer\n");
2431 isdn_ppp_frame_log("ccp-rcv", skb
->data
, skb
->len
, 32, is
->unit
,lp
->ppp_slot
);
2434 mis
= ippp_table
[((isdn_net_local
*) (lp
->master
->priv
))->ppp_slot
];
2438 switch(skb
->data
[0]) {
2442 if(is
->debug
& 0x10)
2443 printk(KERN_DEBUG
"Disable (de)compression here!\n");
2444 if(proto
== PPP_CCP
)
2445 mis
->compflags
&= ~(SC_DECOMP_ON
|SC_COMP_ON
);
2447 is
->compflags
&= ~(SC_LINK_DECOMP_ON
|SC_LINK_COMP_ON
);
2450 /* if we RECEIVE an ackowledge we enable the decompressor */
2451 if(is
->debug
& 0x10)
2452 printk(KERN_DEBUG
"Enable decompression here!\n");
2453 if(proto
== PPP_CCP
)
2454 mis
->compflags
|= SC_DECOMP_ON
;
2456 is
->compflags
|= SC_LINK_DECOMP_ON
;
2460 printk(KERN_DEBUG
"Received ResetAck from peer\n");
2461 len
= (skb
->data
[2] << 8) | skb
->data
[3];
2464 if(proto
== PPP_CCP
) {
2465 /* If a reset Ack was outstanding for this id, then
2466 clean up the state engine */
2467 isdn_ppp_ccp_reset_ack_rcvd(mis
, skb
->data
[1]);
2468 if(mis
->decompressor
&& mis
->decomp_stat
)
2470 reset(mis
->decomp_stat
,
2473 len
? &skb
->data
[4] : NULL
,
2475 /* TODO: This is not easy to decide here */
2476 mis
->compflags
&= ~SC_DECOMP_DISCARD
;
2477 mis
->pppcfg
&= ~SC_DC_ERROR
;
2480 isdn_ppp_ccp_reset_ack_rcvd(is
, skb
->data
[1]);
2481 if(is
->link_decompressor
&& is
->link_decomp_stat
)
2482 is
->link_decompressor
->
2483 reset(is
->link_decomp_stat
,
2486 len
? &skb
->data
[4] : NULL
,
2488 /* TODO: neither here */
2489 is
->compflags
&= ~SC_LINK_DECOMP_DISCARD
;
2490 is
->pppcfg
&= ~SC_DC_ERROR
;
2495 printk(KERN_DEBUG
"Received ResetReq from peer\n");
2496 /* Receiving a ResetReq means we must reset our compressor */
2497 /* Set up reset params for the reset entry */
2498 memset(&rsparm
, 0, sizeof(rsparm
));
2499 rsparm
.data
= rsdata
;
2500 rsparm
.maxdlen
= IPPP_RESET_MAXDATABYTES
;
2501 /* Isolate data length */
2502 len
= (skb
->data
[2] << 8) | skb
->data
[3];
2504 if(proto
== PPP_CCP
) {
2505 if(mis
->compressor
&& mis
->comp_stat
)
2507 reset(mis
->comp_stat
,
2510 len
? &skb
->data
[4] : NULL
,
2514 if(is
->link_compressor
&& is
->link_comp_stat
)
2515 is
->link_compressor
->
2516 reset(is
->link_comp_stat
,
2519 len
? &skb
->data
[4] : NULL
,
2522 /* Ack the Req as specified by rsparm */
2524 /* Compressor reset handler decided how to answer */
2526 /* We should send a Frame */
2527 isdn_ppp_ccp_xmit_reset(is
, proto
, CCP_RESETACK
,
2528 rsparm
.idval
? rsparm
.id
2535 printk(KERN_DEBUG
"ResetAck suppressed\n");
2538 /* We answer with a straight reflected Ack */
2539 isdn_ppp_ccp_xmit_reset(is
, proto
, CCP_RESETACK
,
2541 len
? &skb
->data
[4] : NULL
,
2550 * Daemon sends a CCP frame ...
2553 /* TODO: Clean this up with new Reset semantics */
2555 static void isdn_ppp_send_ccp(isdn_net_dev
*net_dev
, isdn_net_local
*lp
, struct sk_buff
*skb
)
2557 struct ippp_struct
*mis
,*is
= ippp_table
[lp
->ppp_slot
];
2559 unsigned char *data
;
2561 if(!skb
|| skb
->len
< 3)
2564 /* Daemon may send with or without address and control field comp */
2566 if(!(is
->pppcfg
& SC_COMP_AC
) && data
[0] == 0xff && data
[1] == 0x03) {
2572 proto
= ((int)data
[0]<<8)+data
[1];
2573 if(proto
!= PPP_CCP
&& proto
!= PPP_CCPFRAG
)
2576 printk(KERN_DEBUG
"Received CCP frame from daemon:\n");
2577 isdn_ppp_frame_log("ccp-xmit", skb
->data
, skb
->len
, 32, is
->unit
,lp
->ppp_slot
);
2580 mis
= ippp_table
[((isdn_net_local
*) (lp
->master
->priv
))->ppp_slot
];
2585 printk(KERN_DEBUG
"isdn_ppp: Ouch! Master CCP sends on slave slot!\n");
2591 if(is
->debug
& 0x10)
2592 printk(KERN_DEBUG
"Disable (de)compression here!\n");
2593 if(proto
== PPP_CCP
)
2594 is
->compflags
&= ~(SC_DECOMP_ON
|SC_COMP_ON
);
2596 is
->compflags
&= ~(SC_LINK_DECOMP_ON
|SC_LINK_COMP_ON
);
2599 /* if we SEND an ackowledge we can/must enable the compressor */
2600 if(is
->debug
& 0x10)
2601 printk(KERN_DEBUG
"Enable compression here!\n");
2602 if(proto
== PPP_CCP
)
2603 is
->compflags
|= SC_COMP_ON
;
2605 is
->compflags
|= SC_LINK_COMP_ON
;
2608 /* If we send a ACK we should reset our compressor */
2609 if(is
->debug
& 0x10)
2610 printk(KERN_DEBUG
"Reset decompression state here!\n");
2611 printk(KERN_DEBUG
"ResetAck from daemon passed by\n");
2612 if(proto
== PPP_CCP
) {
2613 /* link to master? */
2614 if(is
->compressor
&& is
->comp_stat
)
2615 is
->compressor
->reset(is
->comp_stat
, 0, 0,
2617 is
->compflags
&= ~SC_COMP_DISCARD
;
2620 if(is
->link_compressor
&& is
->link_comp_stat
)
2621 is
->link_compressor
->reset(is
->link_comp_stat
,
2622 0, 0, NULL
, 0, NULL
);
2623 is
->compflags
&= ~SC_LINK_COMP_DISCARD
;
2627 /* Just let it pass by */
2628 printk(KERN_DEBUG
"ResetReq from daemon passed by\n");
2633 int isdn_ppp_register_compressor(struct isdn_ppp_compressor
*ipc
)
2635 ipc
->next
= ipc_head
;
2638 ipc_head
->prev
= ipc
;
2644 int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor
*ipc
)
2647 ipc
->prev
->next
= ipc
->next
;
2649 ipc_head
= ipc
->next
;
2651 ipc
->next
->prev
= ipc
->prev
;
2652 ipc
->prev
= ipc
->next
= NULL
;
2656 static int isdn_ppp_set_compressor(struct ippp_struct
*is
, struct isdn_ppp_comp_data
*data
)
2658 struct isdn_ppp_compressor
*ipc
= ipc_head
;
2661 int num
= data
->num
;
2663 if(is
->debug
& 0x10)
2664 printk(KERN_DEBUG
"[%d] Set %s type %d\n",is
->unit
,
2665 (data
->flags
&IPPP_COMP_FLAG_XMIT
)?"compressor":"decompressor",num
);
2667 /* If is has no valid reset state vector, we cannot allocate a
2668 decompressor. The decompressor would cause reset transactions
2669 sooner or later, and they need that vector. */
2671 if(!(data
->flags
& IPPP_COMP_FLAG_XMIT
) && !is
->reset
) {
2672 printk(KERN_ERR
"ippp_ccp: no reset data structure - can't"
2673 " allow decompression.\n");
2678 if(ipc
->num
== num
) {
2679 stat
= ipc
->alloc(data
);
2681 ret
= ipc
->init(stat
,data
,is
->unit
,0);
2683 printk(KERN_ERR
"Can't init (de)compression!\n");
2690 printk(KERN_ERR
"Can't alloc (de)compression!\n");
2694 if(data
->flags
& IPPP_COMP_FLAG_XMIT
) {
2695 if(data
->flags
& IPPP_COMP_FLAG_LINK
) {
2696 if(is
->link_comp_stat
)
2697 is
->link_compressor
->free(is
->link_comp_stat
);
2698 is
->link_comp_stat
= stat
;
2699 is
->link_compressor
= ipc
;
2703 is
->compressor
->free(is
->comp_stat
);
2704 is
->comp_stat
= stat
;
2705 is
->compressor
= ipc
;
2709 if(data
->flags
& IPPP_COMP_FLAG_LINK
) {
2710 if(is
->link_decomp_stat
)
2711 is
->link_decompressor
->free(is
->link_decomp_stat
);
2712 is
->link_decomp_stat
= stat
;
2713 is
->link_decompressor
= ipc
;
2717 is
->decompressor
->free(is
->decomp_stat
);
2718 is
->decomp_stat
= stat
;
2719 is
->decompressor
= ipc
;