1 /* $Id: isdn_ppp.c,v 1.1.2.3 2004/02/10 01:07:13 keil Exp $
3 * Linux ISDN subsystem, functions for synchronous PPP (linklevel).
5 * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de)
7 * This software may be used and distributed according to the terms
8 * of the GNU General Public License, incorporated herein by reference.
12 #include <linux/isdn.h>
13 #include <linux/poll.h>
14 #include <linux/ppp-comp.h>
15 #include <linux/slab.h>
16 #ifdef CONFIG_IPPP_FILTER
17 #include <linux/filter.h>
20 #include "isdn_common.h"
25 #define PPP_IPX 0x002b
29 static int isdn_ppp_fill_rq(unsigned char *buf
, int len
, int proto
, int slot
);
30 static int isdn_ppp_closewait(int slot
);
31 static void isdn_ppp_push_higher(isdn_net_dev
*net_dev
, isdn_net_local
*lp
,
32 struct sk_buff
*skb
, int proto
);
33 static int isdn_ppp_if_get_unit(char *namebuf
);
34 static int isdn_ppp_set_compressor(struct ippp_struct
*is
, struct isdn_ppp_comp_data
*);
35 static struct sk_buff
*isdn_ppp_decompress(struct sk_buff
*,
36 struct ippp_struct
*, struct ippp_struct
*, int *proto
);
37 static void isdn_ppp_receive_ccp(isdn_net_dev
*net_dev
, isdn_net_local
*lp
,
38 struct sk_buff
*skb
, int proto
);
39 static struct sk_buff
*isdn_ppp_compress(struct sk_buff
*skb_in
, int *proto
,
40 struct ippp_struct
*is
, struct ippp_struct
*master
, int type
);
41 static void isdn_ppp_send_ccp(isdn_net_dev
*net_dev
, isdn_net_local
*lp
,
45 static void isdn_ppp_ccp_kickup(struct ippp_struct
*is
);
46 static void isdn_ppp_ccp_xmit_reset(struct ippp_struct
*is
, int proto
,
47 unsigned char code
, unsigned char id
,
48 unsigned char *data
, int len
);
49 static struct ippp_ccp_reset
*isdn_ppp_ccp_reset_alloc(struct ippp_struct
*is
);
50 static void isdn_ppp_ccp_reset_free(struct ippp_struct
*is
);
51 static void isdn_ppp_ccp_reset_free_state(struct ippp_struct
*is
,
53 static void isdn_ppp_ccp_timer_callback(struct timer_list
*t
);
54 static struct ippp_ccp_reset_state
*isdn_ppp_ccp_reset_alloc_state(struct ippp_struct
*is
,
56 static void isdn_ppp_ccp_reset_trans(struct ippp_struct
*is
,
57 struct isdn_ppp_resetparams
*rp
);
58 static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct
*is
,
63 #ifdef CONFIG_ISDN_MPP
64 static ippp_bundle
*isdn_ppp_bundle_arr
= NULL
;
66 static int isdn_ppp_mp_bundle_array_init(void);
67 static int isdn_ppp_mp_init(isdn_net_local
*lp
, ippp_bundle
*add_to
);
68 static void isdn_ppp_mp_receive(isdn_net_dev
*net_dev
, isdn_net_local
*lp
,
70 static void isdn_ppp_mp_cleanup(isdn_net_local
*lp
);
72 static int isdn_ppp_bundle(struct ippp_struct
*, int unit
);
73 #endif /* CONFIG_ISDN_MPP */
75 char *isdn_ppp_revision
= "$Revision: 1.1.2.3 $";
77 static struct ippp_struct
*ippp_table
[ISDN_MAX_CHANNELS
];
79 static struct isdn_ppp_compressor
*ipc_head
= NULL
;
85 isdn_ppp_frame_log(char *info
, char *data
, int len
, int maxlen
, int unit
, int slot
)
95 for (i
= 0, cnt
= 0; cnt
< maxlen
; i
++) {
96 for (j
= 0; j
< 16 && cnt
< maxlen
; j
++, cnt
++)
97 sprintf(buf
+ j
* 3, "%02x ", (unsigned char)data
[cnt
]);
98 printk(KERN_DEBUG
"[%d/%d].%s[%d]: %s\n", unit
, slot
, info
, i
, buf
);
103 * unbind isdn_net_local <=> ippp-device
104 * note: it can happen, that we hangup/free the master before the slaves
105 * in this case we bind another lp to the master device
108 isdn_ppp_free(isdn_net_local
*lp
)
110 struct ippp_struct
*is
;
112 if (lp
->ppp_slot
< 0 || lp
->ppp_slot
>= ISDN_MAX_CHANNELS
) {
113 printk(KERN_ERR
"%s: ppp_slot(%d) out of range\n",
114 __func__
, lp
->ppp_slot
);
118 #ifdef CONFIG_ISDN_MPP
119 spin_lock(&lp
->netdev
->pb
->lock
);
121 isdn_net_rm_from_bundle(lp
);
122 #ifdef CONFIG_ISDN_MPP
123 if (lp
->netdev
->pb
->ref_ct
== 1) /* last link in queue? */
124 isdn_ppp_mp_cleanup(lp
);
126 lp
->netdev
->pb
->ref_ct
--;
127 spin_unlock(&lp
->netdev
->pb
->lock
);
128 #endif /* CONFIG_ISDN_MPP */
129 if (lp
->ppp_slot
< 0 || lp
->ppp_slot
>= ISDN_MAX_CHANNELS
) {
130 printk(KERN_ERR
"%s: ppp_slot(%d) now invalid\n",
131 __func__
, lp
->ppp_slot
);
134 is
= ippp_table
[lp
->ppp_slot
];
135 if ((is
->state
& IPPP_CONNECT
))
136 isdn_ppp_closewait(lp
->ppp_slot
); /* force wakeup on ippp device */
137 else if (is
->state
& IPPP_ASSIGNED
)
138 is
->state
= IPPP_OPEN
; /* fallback to 'OPEN but not ASSIGNED' state */
141 printk(KERN_DEBUG
"isdn_ppp_free %d %lx %lx\n", lp
->ppp_slot
, (long) lp
, (long) is
->lp
);
143 is
->lp
= NULL
; /* link is down .. set lp to NULL */
144 lp
->ppp_slot
= -1; /* is this OK ?? */
150 * bind isdn_net_local <=> ippp-device
152 * This function is allways called with holding dev->lock so
153 * no additional lock is needed
156 isdn_ppp_bind(isdn_net_local
*lp
)
160 struct ippp_struct
*is
;
163 if (lp
->pppbind
< 0) { /* device bounded to ippp device ? */
164 isdn_net_dev
*net_dev
= dev
->netdev
;
165 char exclusive
[ISDN_MAX_CHANNELS
]; /* exclusive flags */
166 memset(exclusive
, 0, ISDN_MAX_CHANNELS
);
167 while (net_dev
) { /* step through net devices to find exclusive minors */
168 isdn_net_local
*lp
= net_dev
->local
;
169 if (lp
->pppbind
>= 0)
170 exclusive
[lp
->pppbind
] = 1;
171 net_dev
= net_dev
->next
;
174 * search a free device / slot
176 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++) {
177 if (ippp_table
[i
]->state
== IPPP_OPEN
&& !exclusive
[ippp_table
[i
]->minor
]) { /* OPEN, but not connected! */
182 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++) {
183 if (ippp_table
[i
]->minor
== lp
->pppbind
&&
184 (ippp_table
[i
]->state
& IPPP_OPEN
) == IPPP_OPEN
)
189 if (i
>= ISDN_MAX_CHANNELS
) {
190 printk(KERN_WARNING
"isdn_ppp_bind: Can't find a (free) connection to the ipppd daemon.\n");
194 /* get unit number from interface name .. ugly! */
195 unit
= isdn_ppp_if_get_unit(lp
->netdev
->dev
->name
);
197 printk(KERN_ERR
"isdn_ppp_bind: illegal interface name %s.\n",
198 lp
->netdev
->dev
->name
);
207 is
->state
= IPPP_OPEN
| IPPP_ASSIGNED
; /* assigned to a netdevice but not connected */
208 #ifdef CONFIG_ISDN_MPP
209 retval
= isdn_ppp_mp_init(lp
, NULL
);
212 #endif /* CONFIG_ISDN_MPP */
214 retval
= lp
->ppp_slot
;
221 * kick the ipppd on the device
222 * (wakes up daemon after B-channel connect)
226 isdn_ppp_wakeup_daemon(isdn_net_local
*lp
)
228 if (lp
->ppp_slot
< 0 || lp
->ppp_slot
>= ISDN_MAX_CHANNELS
) {
229 printk(KERN_ERR
"%s: ppp_slot(%d) out of range\n",
230 __func__
, lp
->ppp_slot
);
233 ippp_table
[lp
->ppp_slot
]->state
= IPPP_OPEN
| IPPP_CONNECT
| IPPP_NOBLOCK
;
234 wake_up_interruptible(&ippp_table
[lp
->ppp_slot
]->wq
);
238 * there was a hangup on the netdevice
239 * force wakeup of the ippp device
240 * go into 'device waits for release' state
243 isdn_ppp_closewait(int slot
)
245 struct ippp_struct
*is
;
247 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
248 printk(KERN_ERR
"%s: slot(%d) out of range\n",
252 is
= ippp_table
[slot
];
254 wake_up_interruptible(&is
->wq
);
255 is
->state
= IPPP_CLOSEWAIT
;
260 * isdn_ppp_find_slot / isdn_ppp_free_slot
264 isdn_ppp_get_slot(void)
267 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++) {
268 if (!ippp_table
[i
]->state
)
279 isdn_ppp_open(int min
, struct file
*file
)
282 struct ippp_struct
*is
;
284 if (min
< 0 || min
>= ISDN_MAX_CHANNELS
)
287 slot
= isdn_ppp_get_slot();
291 is
= file
->private_data
= ippp_table
[slot
];
293 printk(KERN_DEBUG
"ippp, open, slot: %d, minor: %d, state: %04x\n",
294 slot
, min
, is
->state
);
296 /* compression stuff */
297 is
->link_compressor
= is
->compressor
= NULL
;
298 is
->link_decompressor
= is
->decompressor
= NULL
;
299 is
->link_comp_stat
= is
->comp_stat
= NULL
;
300 is
->link_decomp_stat
= is
->decomp_stat
= NULL
;
303 is
->reset
= isdn_ppp_ccp_reset_alloc(is
);
308 is
->mp_seqno
= 0; /* MP sequence number */
309 is
->pppcfg
= 0; /* ppp configuration */
310 is
->mpppcfg
= 0; /* mppp configuration */
311 is
->last_link_seqno
= -1; /* MP: maybe set to Bundle-MIN, when joining a bundle ?? */
312 is
->unit
= -1; /* set, when we have our interface */
313 is
->mru
= 1524; /* MRU, default 1524 */
314 is
->maxcid
= 16; /* VJ: maxcid */
316 init_waitqueue_head(&is
->wq
);
317 is
->first
= is
->rq
+ NUM_RCV_BUFFS
- 1; /* receive queue */
320 #ifdef CONFIG_ISDN_PPP_VJ
322 * VJ header compression init
324 is
->slcomp
= slhc_init(16, 16); /* not necessary for 2. link in bundle */
325 if (IS_ERR(is
->slcomp
)) {
326 isdn_ppp_ccp_reset_free(is
);
327 return PTR_ERR(is
->slcomp
);
330 #ifdef CONFIG_IPPP_FILTER
331 is
->pass_filter
= NULL
;
332 is
->active_filter
= NULL
;
334 is
->state
= IPPP_OPEN
;
340 * release ippp device
343 isdn_ppp_release(int min
, struct file
*file
)
346 struct ippp_struct
*is
;
348 if (min
< 0 || min
>= ISDN_MAX_CHANNELS
)
350 is
= file
->private_data
;
353 printk(KERN_ERR
"%s: no file->private_data\n", __func__
);
357 printk(KERN_DEBUG
"ippp: release, minor: %d %lx\n", min
, (long) is
->lp
);
359 if (is
->lp
) { /* a lp address says: this link is still up */
360 isdn_net_dev
*p
= is
->lp
->netdev
;
363 printk(KERN_ERR
"%s: no lp->netdev\n", __func__
);
366 is
->state
&= ~IPPP_CONNECT
; /* -> effect: no call of wakeup */
368 * isdn_net_hangup() calls isdn_ppp_free()
369 * isdn_ppp_free() sets is->lp to NULL and lp->ppp_slot to -1
370 * removing the IPPP_CONNECT flag omits calling of isdn_ppp_wakeup_daemon()
372 isdn_net_hangup(p
->dev
);
374 for (i
= 0; i
< NUM_RCV_BUFFS
; i
++) {
375 kfree(is
->rq
[i
].buf
);
376 is
->rq
[i
].buf
= NULL
;
378 is
->first
= is
->rq
+ NUM_RCV_BUFFS
- 1; /* receive queue */
381 #ifdef CONFIG_ISDN_PPP_VJ
382 /* TODO: if this was the previous master: link the slcomp to the new master */
383 slhc_free(is
->slcomp
);
386 #ifdef CONFIG_IPPP_FILTER
387 if (is
->pass_filter
) {
388 bpf_prog_destroy(is
->pass_filter
);
389 is
->pass_filter
= NULL
;
392 if (is
->active_filter
) {
393 bpf_prog_destroy(is
->active_filter
);
394 is
->active_filter
= NULL
;
398 /* TODO: if this was the previous master: link the stuff to the new master */
400 is
->compressor
->free(is
->comp_stat
);
401 if (is
->link_comp_stat
)
402 is
->link_compressor
->free(is
->link_comp_stat
);
403 if (is
->link_decomp_stat
)
404 is
->link_decompressor
->free(is
->link_decomp_stat
);
406 is
->decompressor
->free(is
->decomp_stat
);
407 is
->compressor
= is
->link_compressor
= NULL
;
408 is
->decompressor
= is
->link_decompressor
= NULL
;
409 is
->comp_stat
= is
->link_comp_stat
= NULL
;
410 is
->decomp_stat
= is
->link_decomp_stat
= NULL
;
412 /* Clean up if necessary */
414 isdn_ppp_ccp_reset_free(is
);
416 /* this slot is ready for new connections */
421 * get_arg .. ioctl helper
424 get_arg(void __user
*b
, void *val
, int len
)
427 len
= sizeof(void *);
428 if (copy_from_user(val
, b
, len
))
434 * set arg .. ioctl helper
437 set_arg(void __user
*b
, void *val
, int len
)
440 len
= sizeof(void *);
441 if (copy_to_user(b
, val
, len
))
446 #ifdef CONFIG_IPPP_FILTER
447 static int get_filter(void __user
*arg
, struct sock_filter
**p
)
449 struct sock_fprog uprog
;
450 struct sock_filter
*code
= NULL
;
453 if (copy_from_user(&uprog
, arg
, sizeof(uprog
)))
461 /* uprog.len is unsigned short, so no overflow here */
462 len
= uprog
.len
* sizeof(struct sock_filter
);
463 code
= memdup_user(uprog
.filter
, len
);
465 return PTR_ERR(code
);
470 #endif /* CONFIG_IPPP_FILTER */
476 isdn_ppp_ioctl(int min
, struct file
*file
, unsigned int cmd
, unsigned long arg
)
480 struct ippp_struct
*is
;
482 struct isdn_ppp_comp_data data
;
483 void __user
*argp
= (void __user
*)arg
;
485 is
= file
->private_data
;
489 printk(KERN_DEBUG
"isdn_ppp_ioctl: minor: %d cmd: %x state: %x\n", min
, cmd
, is
->state
);
491 if (!(is
->state
& IPPP_OPEN
))
496 #ifdef CONFIG_ISDN_MPP
497 if (!(is
->state
& IPPP_CONNECT
))
499 if ((r
= get_arg(argp
, &val
, sizeof(val
))))
501 printk(KERN_DEBUG
"iPPP-bundle: minor: %d, slave unit: %d, master unit: %d\n",
502 (int) min
, (int) is
->unit
, (int) val
);
503 return isdn_ppp_bundle(is
, val
);
508 case PPPIOCGUNIT
: /* get ppp/isdn unit number */
509 if ((r
= set_arg(argp
, &is
->unit
, sizeof(is
->unit
))))
515 if ((r
= set_arg(argp
, lp
->netdev
->dev
->name
,
516 strlen(lp
->netdev
->dev
->name
))))
519 case PPPIOCGMPFLAGS
: /* get configuration flags */
520 if ((r
= set_arg(argp
, &is
->mpppcfg
, sizeof(is
->mpppcfg
))))
523 case PPPIOCSMPFLAGS
: /* set configuration flags */
524 if ((r
= get_arg(argp
, &val
, sizeof(val
))))
528 case PPPIOCGFLAGS
: /* get configuration flags */
529 if ((r
= set_arg(argp
, &is
->pppcfg
, sizeof(is
->pppcfg
))))
532 case PPPIOCSFLAGS
: /* set configuration flags */
533 if ((r
= get_arg(argp
, &val
, sizeof(val
)))) {
536 if (val
& SC_ENABLE_IP
&& !(is
->pppcfg
& SC_ENABLE_IP
) && (is
->state
& IPPP_CONNECT
)) {
538 /* OK .. we are ready to send buffers */
539 is
->pppcfg
= val
; /* isdn_ppp_xmit test for SC_ENABLE_IP !!! */
540 netif_wake_queue(lp
->netdev
->dev
);
546 case PPPIOCGIDLE
: /* get idle time information */
548 struct ppp_idle pidle
;
549 pidle
.xmit_idle
= pidle
.recv_idle
= lp
->huptimer
;
550 if ((r
= set_arg(argp
, &pidle
, sizeof(struct ppp_idle
))))
554 case PPPIOCSMRU
: /* set receive unit size for PPP */
555 if ((r
= get_arg(argp
, &val
, sizeof(val
))))
563 case PPPIOCSMAXCID
: /* set the maximum compression slot id */
564 if ((r
= get_arg(argp
, &val
, sizeof(val
))))
567 if (is
->maxcid
!= val
) {
568 #ifdef CONFIG_ISDN_PPP_VJ
569 struct slcompress
*sltmp
;
572 printk(KERN_DEBUG
"ippp, ioctl: changed MAXCID to %ld\n", val
);
574 #ifdef CONFIG_ISDN_PPP_VJ
575 sltmp
= slhc_init(16, val
);
577 return PTR_ERR(sltmp
);
579 slhc_free(is
->slcomp
);
585 if ((r
= set_arg(argp
, &is
->debug
, sizeof(is
->debug
))))
589 if ((r
= get_arg(argp
, &val
, sizeof(val
))))
593 case PPPIOCGCOMPRESSORS
:
595 unsigned long protos
[8] = {0,};
596 struct isdn_ppp_compressor
*ipc
= ipc_head
;
598 j
= ipc
->num
/ (sizeof(long) * 8);
599 i
= ipc
->num
% (sizeof(long) * 8);
601 protos
[j
] |= (1UL << i
);
604 if ((r
= set_arg(argp
, protos
, 8 * sizeof(long))))
608 case PPPIOCSCOMPRESSOR
:
609 if ((r
= get_arg(argp
, &data
, sizeof(struct isdn_ppp_comp_data
))))
611 return isdn_ppp_set_compressor(is
, &data
);
612 case PPPIOCGCALLINFO
:
614 struct pppcallinfo pci
;
615 memset((char *)&pci
, 0, sizeof(struct pppcallinfo
));
618 strncpy(pci
.local_num
, lp
->msn
, 63);
620 strncpy(pci
.remote_num
, lp
->dial
->num
, 63);
622 pci
.charge_units
= lp
->charge
;
624 pci
.calltype
= CALLTYPE_OUTGOING
;
626 pci
.calltype
= CALLTYPE_INCOMING
;
627 if (lp
->flags
& ISDN_NET_CALLBACK
)
628 pci
.calltype
|= CALLTYPE_CALLBACK
;
630 return set_arg(argp
, &pci
, sizeof(struct pppcallinfo
));
632 #ifdef CONFIG_IPPP_FILTER
635 struct sock_fprog_kern fprog
;
636 struct sock_filter
*code
;
637 int err
, len
= get_filter(argp
, &code
);
645 if (is
->pass_filter
) {
646 bpf_prog_destroy(is
->pass_filter
);
647 is
->pass_filter
= NULL
;
649 if (fprog
.filter
!= NULL
)
650 err
= bpf_prog_create(&is
->pass_filter
, &fprog
);
659 struct sock_fprog_kern fprog
;
660 struct sock_filter
*code
;
661 int err
, len
= get_filter(argp
, &code
);
669 if (is
->active_filter
) {
670 bpf_prog_destroy(is
->active_filter
);
671 is
->active_filter
= NULL
;
673 if (fprog
.filter
!= NULL
)
674 err
= bpf_prog_create(&is
->active_filter
, &fprog
);
681 #endif /* CONFIG_IPPP_FILTER */
689 isdn_ppp_poll(struct file
*file
, poll_table
*wait
)
692 struct ippp_buf_queue
*bf
, *bl
;
694 struct ippp_struct
*is
;
696 is
= file
->private_data
;
699 printk(KERN_DEBUG
"isdn_ppp_poll: minor: %d\n",
700 iminor(file_inode(file
)));
702 /* just registers wait_queue hook. This doesn't really wait. */
703 poll_wait(file
, &is
->wq
, wait
);
705 if (!(is
->state
& IPPP_OPEN
)) {
706 if (is
->state
== IPPP_CLOSEWAIT
)
708 printk(KERN_DEBUG
"isdn_ppp: device not open\n");
711 /* we're always ready to send .. */
712 mask
= EPOLLOUT
| EPOLLWRNORM
;
714 spin_lock_irqsave(&is
->buflock
, flags
);
718 * if IPPP_NOBLOCK is set we return even if we have nothing to read
720 if (bf
->next
!= bl
|| (is
->state
& IPPP_NOBLOCK
)) {
721 is
->state
&= ~IPPP_NOBLOCK
;
722 mask
|= EPOLLIN
| EPOLLRDNORM
;
724 spin_unlock_irqrestore(&is
->buflock
, flags
);
729 * fill up isdn_ppp_read() queue ..
733 isdn_ppp_fill_rq(unsigned char *buf
, int len
, int proto
, int slot
)
735 struct ippp_buf_queue
*bf
, *bl
;
738 struct ippp_struct
*is
;
740 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
741 printk(KERN_WARNING
"ippp: illegal slot(%d).\n", slot
);
744 is
= ippp_table
[slot
];
746 if (!(is
->state
& IPPP_CONNECT
)) {
747 printk(KERN_DEBUG
"ippp: device not activated.\n");
750 nbuf
= kmalloc(len
+ 4, GFP_ATOMIC
);
752 printk(KERN_WARNING
"ippp: Can't alloc buf\n");
755 nbuf
[0] = PPP_ALLSTATIONS
;
757 nbuf
[2] = proto
>> 8;
758 nbuf
[3] = proto
& 0xff;
759 memcpy(nbuf
+ 4, buf
, len
);
761 spin_lock_irqsave(&is
->buflock
, flags
);
766 printk(KERN_WARNING
"ippp: Queue is full; discarding first buffer\n");
771 bl
->buf
= (char *) nbuf
;
775 spin_unlock_irqrestore(&is
->buflock
, flags
);
776 wake_up_interruptible(&is
->wq
);
781 * read() .. non-blocking: ipppd calls it only after select()
782 * reports, that there is data
786 isdn_ppp_read(int min
, struct file
*file
, char __user
*buf
, int count
)
788 struct ippp_struct
*is
;
789 struct ippp_buf_queue
*b
;
793 is
= file
->private_data
;
795 if (!(is
->state
& IPPP_OPEN
))
798 spin_lock_irqsave(&is
->buflock
, flags
);
802 spin_unlock_irqrestore(&is
->buflock
, flags
);
810 spin_unlock_irqrestore(&is
->buflock
, flags
);
811 if (copy_to_user(buf
, save_buf
, count
))
819 * ipppd wanna write a packet to the card .. non-blocking
823 isdn_ppp_write(int min
, struct file
*file
, const char __user
*buf
, int count
)
826 struct ippp_struct
*is
;
829 is
= file
->private_data
;
831 if (!(is
->state
& IPPP_CONNECT
))
836 /* -> push it directly to the lowlevel interface */
839 printk(KERN_DEBUG
"isdn_ppp_write: lp == NULL\n");
841 if (lp
->isdn_device
< 0 || lp
->isdn_channel
< 0) {
842 unsigned char protobuf
[4];
844 * Don't reset huptimer for
845 * LCP packets. (Echo requests).
847 if (copy_from_user(protobuf
, buf
, 4))
850 proto
= PPP_PROTOCOL(protobuf
);
851 if (proto
!= PPP_LCP
)
857 if ((dev
->drv
[lp
->isdn_device
]->flags
& DRV_FLAG_RUNNING
) &&
858 lp
->dialstate
== 0 &&
859 (lp
->flags
& ISDN_NET_CONNECTED
)) {
862 unsigned char *cpy_buf
;
864 * we need to reserve enough space in front of
865 * sk_buff. old call to dev_alloc_skb only reserved
866 * 16 bytes, now we are looking what the driver want
868 hl
= dev
->drv
[lp
->isdn_device
]->interface
->hl_hdrlen
;
869 skb
= alloc_skb(hl
+ count
, GFP_ATOMIC
);
871 printk(KERN_WARNING
"isdn_ppp_write: out of memory!\n");
874 skb_reserve(skb
, hl
);
875 cpy_buf
= skb_put(skb
, count
);
876 if (copy_from_user(cpy_buf
, buf
, count
))
883 * Don't reset huptimer for
884 * LCP packets. (Echo requests).
886 proto
= PPP_PROTOCOL(cpy_buf
);
887 if (proto
!= PPP_LCP
)
890 if (is
->debug
& 0x40) {
891 printk(KERN_DEBUG
"ppp xmit: len %d\n", (int) skb
->len
);
892 isdn_ppp_frame_log("xmit", skb
->data
, skb
->len
, 32, is
->unit
, lp
->ppp_slot
);
895 isdn_ppp_send_ccp(lp
->netdev
, lp
, skb
); /* keeps CCP/compression states in sync */
897 isdn_net_write_super(lp
, skb
);
904 * init memory, structures etc.
913 #ifdef CONFIG_ISDN_MPP
914 if (isdn_ppp_mp_bundle_array_init() < 0)
916 #endif /* CONFIG_ISDN_MPP */
918 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++) {
919 if (!(ippp_table
[i
] = kzalloc(sizeof(struct ippp_struct
), GFP_KERNEL
))) {
920 printk(KERN_WARNING
"isdn_ppp_init: Could not alloc ippp_table\n");
921 for (j
= 0; j
< i
; j
++)
922 kfree(ippp_table
[j
]);
925 spin_lock_init(&ippp_table
[i
]->buflock
);
926 ippp_table
[i
]->state
= 0;
927 ippp_table
[i
]->first
= ippp_table
[i
]->rq
+ NUM_RCV_BUFFS
- 1;
928 ippp_table
[i
]->last
= ippp_table
[i
]->rq
;
930 for (j
= 0; j
< NUM_RCV_BUFFS
; j
++) {
931 ippp_table
[i
]->rq
[j
].buf
= NULL
;
932 ippp_table
[i
]->rq
[j
].last
= ippp_table
[i
]->rq
+
933 (NUM_RCV_BUFFS
+ j
- 1) % NUM_RCV_BUFFS
;
934 ippp_table
[i
]->rq
[j
].next
= ippp_table
[i
]->rq
+ (j
+ 1) % NUM_RCV_BUFFS
;
941 isdn_ppp_cleanup(void)
945 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++)
946 kfree(ippp_table
[i
]);
948 #ifdef CONFIG_ISDN_MPP
949 kfree(isdn_ppp_bundle_arr
);
950 #endif /* CONFIG_ISDN_MPP */
955 * check for address/control field and skip if allowed
956 * retval != 0 -> discard packet silently
958 static int isdn_ppp_skip_ac(struct ippp_struct
*is
, struct sk_buff
*skb
)
963 if (skb
->data
[0] == 0xff) {
967 if (skb
->data
[1] != 0x03)
970 // skip address/control (AC) field
973 if (is
->pppcfg
& SC_REJ_COMP_AC
)
974 // if AC compression was not negotiated, but used, discard packet
981 * get the PPP protocol header and pull skb
982 * retval < 0 -> discard packet silently
984 static int isdn_ppp_strip_proto(struct sk_buff
*skb
)
991 if (skb
->data
[0] & 0x1) {
992 // protocol field is compressed
993 proto
= skb
->data
[0];
998 proto
= ((int) skb
->data
[0] << 8) + skb
->data
[1];
1006 * handler for incoming packets on a syncPPP interface
1008 void isdn_ppp_receive(isdn_net_dev
*net_dev
, isdn_net_local
*lp
, struct sk_buff
*skb
)
1010 struct ippp_struct
*is
;
1014 BUG_ON(net_dev
->local
->master
); // we're called with the master device always
1016 slot
= lp
->ppp_slot
;
1017 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
1018 printk(KERN_ERR
"isdn_ppp_receive: lp->ppp_slot(%d)\n",
1023 is
= ippp_table
[slot
];
1025 if (is
->debug
& 0x4) {
1026 printk(KERN_DEBUG
"ippp_receive: is:%08lx lp:%08lx slot:%d unit:%d len:%d\n",
1027 (long)is
, (long)lp
, lp
->ppp_slot
, is
->unit
, (int)skb
->len
);
1028 isdn_ppp_frame_log("receive", skb
->data
, skb
->len
, 32, is
->unit
, lp
->ppp_slot
);
1031 if (isdn_ppp_skip_ac(is
, skb
) < 0) {
1035 proto
= isdn_ppp_strip_proto(skb
);
1041 #ifdef CONFIG_ISDN_MPP
1042 if (is
->compflags
& SC_LINK_DECOMP_ON
) {
1043 skb
= isdn_ppp_decompress(skb
, is
, NULL
, &proto
);
1044 if (!skb
) // decompression error
1048 if (!(is
->mpppcfg
& SC_REJ_MP_PROT
)) { // we agreed to receive MPPP
1049 if (proto
== PPP_MP
) {
1050 isdn_ppp_mp_receive(net_dev
, lp
, skb
);
1055 isdn_ppp_push_higher(net_dev
, lp
, skb
, proto
);
1059 * we receive a reassembled frame, MPPP has been taken care of before.
1060 * address/control and protocol have been stripped from the skb
1061 * note: net_dev has to be master net_dev
1064 isdn_ppp_push_higher(isdn_net_dev
*net_dev
, isdn_net_local
*lp
, struct sk_buff
*skb
, int proto
)
1066 struct net_device
*dev
= net_dev
->dev
;
1067 struct ippp_struct
*is
, *mis
;
1068 isdn_net_local
*mlp
= NULL
;
1071 slot
= lp
->ppp_slot
;
1072 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
1073 printk(KERN_ERR
"isdn_ppp_push_higher: lp->ppp_slot(%d)\n",
1077 is
= ippp_table
[slot
];
1079 if (lp
->master
) { // FIXME?
1080 mlp
= ISDN_MASTER_PRIV(lp
);
1081 slot
= mlp
->ppp_slot
;
1082 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
1083 printk(KERN_ERR
"isdn_ppp_push_higher: master->ppp_slot(%d)\n",
1088 mis
= ippp_table
[slot
];
1090 if (is
->debug
& 0x10) {
1091 printk(KERN_DEBUG
"push, skb %d %04x\n", (int) skb
->len
, proto
);
1092 isdn_ppp_frame_log("rpush", skb
->data
, skb
->len
, 32, is
->unit
, lp
->ppp_slot
);
1094 if (mis
->compflags
& SC_DECOMP_ON
) {
1095 skb
= isdn_ppp_decompress(skb
, is
, mis
, &proto
);
1096 if (!skb
) // decompression error
1100 case PPP_IPX
: /* untested */
1101 if (is
->debug
& 0x20)
1102 printk(KERN_DEBUG
"isdn_ppp: IPX\n");
1103 skb
->protocol
= htons(ETH_P_IPX
);
1106 if (is
->debug
& 0x20)
1107 printk(KERN_DEBUG
"isdn_ppp: IP\n");
1108 skb
->protocol
= htons(ETH_P_IP
);
1112 printk(KERN_INFO
"isdn_ppp: unexpected compressed frame dropped\n");
1114 #ifdef CONFIG_ISDN_PPP_VJ
1115 case PPP_VJC_UNCOMP
:
1116 if (is
->debug
& 0x20)
1117 printk(KERN_DEBUG
"isdn_ppp: VJC_UNCOMP\n");
1118 if (net_dev
->local
->ppp_slot
< 0) {
1119 printk(KERN_ERR
"%s: net_dev->local->ppp_slot(%d) out of range\n",
1120 __func__
, net_dev
->local
->ppp_slot
);
1123 if (slhc_remember(ippp_table
[net_dev
->local
->ppp_slot
]->slcomp
, skb
->data
, skb
->len
) <= 0) {
1124 printk(KERN_WARNING
"isdn_ppp: received illegal VJC_UNCOMP frame!\n");
1127 skb
->protocol
= htons(ETH_P_IP
);
1130 if (is
->debug
& 0x20)
1131 printk(KERN_DEBUG
"isdn_ppp: VJC_COMP\n");
1133 struct sk_buff
*skb_old
= skb
;
1135 skb
= dev_alloc_skb(skb_old
->len
+ 128);
1138 printk(KERN_WARNING
"%s: Memory squeeze, dropping packet.\n", dev
->name
);
1142 skb_put(skb
, skb_old
->len
+ 128);
1143 skb_copy_from_linear_data(skb_old
, skb
->data
,
1145 if (net_dev
->local
->ppp_slot
< 0) {
1146 printk(KERN_ERR
"%s: net_dev->local->ppp_slot(%d) out of range\n",
1147 __func__
, net_dev
->local
->ppp_slot
);
1150 pkt_len
= slhc_uncompress(ippp_table
[net_dev
->local
->ppp_slot
]->slcomp
,
1151 skb
->data
, skb_old
->len
);
1156 skb_trim(skb
, pkt_len
);
1157 skb
->protocol
= htons(ETH_P_IP
);
1163 isdn_ppp_receive_ccp(net_dev
, lp
, skb
, proto
);
1164 /* Dont pop up ResetReq/Ack stuff to the daemon any
1165 longer - the job is done already */
1166 if (skb
->data
[0] == CCP_RESETREQ
||
1167 skb
->data
[0] == CCP_RESETACK
)
1171 isdn_ppp_fill_rq(skb
->data
, skb
->len
, proto
, lp
->ppp_slot
); /* push data to pppd device */
1176 #ifdef CONFIG_IPPP_FILTER
1177 /* check if the packet passes the pass and active filters
1178 * the filter instructions are constructed assuming
1179 * a four-byte PPP header on each packet (which is still present) */
1183 u_int16_t
*p
= (u_int16_t
*) skb
->data
;
1185 *p
= 0; /* indicate inbound */
1189 && BPF_PROG_RUN(is
->pass_filter
, skb
) == 0) {
1190 if (is
->debug
& 0x2)
1191 printk(KERN_DEBUG
"IPPP: inbound frame filtered.\n");
1195 if (!(is
->active_filter
1196 && BPF_PROG_RUN(is
->active_filter
, skb
) == 0)) {
1197 if (is
->debug
& 0x2)
1198 printk(KERN_DEBUG
"IPPP: link-active filter: resetting huptimer.\n");
1204 #else /* CONFIG_IPPP_FILTER */
1208 #endif /* CONFIG_IPPP_FILTER */
1210 skb_reset_mac_header(skb
);
1212 /* net_dev->local->stats.rx_packets++; done in isdn_net.c */
1216 net_dev
->local
->stats
.rx_dropped
++;
1221 * isdn_ppp_skb_push ..
1222 * checks whether we have enough space at the beginning of the skb
1223 * and allocs a new SKB if necessary
1225 static unsigned char *isdn_ppp_skb_push(struct sk_buff
**skb_p
, int len
)
1227 struct sk_buff
*skb
= *skb_p
;
1229 if (skb_headroom(skb
) < len
) {
1230 struct sk_buff
*nskb
= skb_realloc_headroom(skb
, len
);
1233 printk(KERN_ERR
"isdn_ppp_skb_push: can't realloc headroom!\n");
1237 printk(KERN_DEBUG
"isdn_ppp_skb_push:under %d %d\n", skb_headroom(skb
), len
);
1240 return skb_push(nskb
, len
);
1242 return skb_push(skb
, len
);
1246 * send ppp frame .. we expect a PIDCOMPressable proto --
1247 * (here: currently always PPP_IP,PPP_VJC_COMP,PPP_VJC_UNCOMP)
1249 * VJ compression may change skb pointer!!! .. requeue with old
1250 * skb isn't allowed!!
1254 isdn_ppp_xmit(struct sk_buff
*skb
, struct net_device
*netdev
)
1256 isdn_net_local
*lp
, *mlp
;
1258 unsigned int proto
= PPP_IP
; /* 0x21 */
1259 struct ippp_struct
*ipt
, *ipts
;
1260 int slot
, retval
= NETDEV_TX_OK
;
1262 mlp
= netdev_priv(netdev
);
1263 nd
= mlp
->netdev
; /* get master lp */
1265 slot
= mlp
->ppp_slot
;
1266 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
1267 printk(KERN_ERR
"isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1272 ipts
= ippp_table
[slot
];
1274 if (!(ipts
->pppcfg
& SC_ENABLE_IP
)) { /* PPP connected ? */
1275 if (ipts
->debug
& 0x1)
1276 printk(KERN_INFO
"%s: IP frame delayed.\n", netdev
->name
);
1277 retval
= NETDEV_TX_BUSY
;
1281 switch (ntohs(skb
->protocol
)) {
1286 proto
= PPP_IPX
; /* untested */
1289 printk(KERN_ERR
"isdn_ppp: skipped unsupported protocol: %#x.\n",
1295 lp
= isdn_net_get_locked_lp(nd
);
1297 printk(KERN_WARNING
"%s: all channels busy - requeuing!\n", netdev
->name
);
1298 retval
= NETDEV_TX_BUSY
;
1301 /* we have our lp locked from now on */
1303 slot
= lp
->ppp_slot
;
1304 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
1305 printk(KERN_ERR
"isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1310 ipt
= ippp_table
[slot
];
1313 * after this line .. requeueing in the device queue is no longer allowed!!!
1316 /* Pull off the fake header we stuck on earlier to keep
1317 * the fragmentation code happy.
1319 skb_pull(skb
, IPPP_MAX_HEADER
);
1321 #ifdef CONFIG_IPPP_FILTER
1322 /* check if we should pass this packet
1323 * the filter instructions are constructed assuming
1324 * a four-byte PPP header on each packet */
1325 *(u8
*)skb_push(skb
, 4) = 1; /* indicate outbound */
1328 __be16
*p
= (__be16
*)skb
->data
;
1334 if (ipt
->pass_filter
1335 && BPF_PROG_RUN(ipt
->pass_filter
, skb
) == 0) {
1336 if (ipt
->debug
& 0x4)
1337 printk(KERN_DEBUG
"IPPP: outbound frame filtered.\n");
1341 if (!(ipt
->active_filter
1342 && BPF_PROG_RUN(ipt
->active_filter
, skb
) == 0)) {
1343 if (ipt
->debug
& 0x4)
1344 printk(KERN_DEBUG
"IPPP: link-active filter: resetting huptimer.\n");
1348 #else /* CONFIG_IPPP_FILTER */
1350 #endif /* CONFIG_IPPP_FILTER */
1352 if (ipt
->debug
& 0x4)
1353 printk(KERN_DEBUG
"xmit skb, len %d\n", (int) skb
->len
);
1354 if (ipts
->debug
& 0x40)
1355 isdn_ppp_frame_log("xmit0", skb
->data
, skb
->len
, 32, ipts
->unit
, lp
->ppp_slot
);
1357 #ifdef CONFIG_ISDN_PPP_VJ
1358 if (proto
== PPP_IP
&& ipts
->pppcfg
& SC_COMP_TCP
) { /* ipts here? probably yes, but check this again */
1359 struct sk_buff
*new_skb
;
1362 * we need to reserve enough space in front of
1363 * sk_buff. old call to dev_alloc_skb only reserved
1364 * 16 bytes, now we are looking what the driver want.
1366 hl
= dev
->drv
[lp
->isdn_device
]->interface
->hl_hdrlen
+ IPPP_MAX_HEADER
;
1368 * Note: hl might still be insufficient because the method
1369 * above does not account for a possibible MPPP slave channel
1370 * which had larger HL header space requirements than the
1373 new_skb
= alloc_skb(hl
+ skb
->len
, GFP_ATOMIC
);
1378 skb_reserve(new_skb
, hl
);
1379 new_skb
->dev
= skb
->dev
;
1380 skb_put(new_skb
, skb
->len
);
1383 pktlen
= slhc_compress(ipts
->slcomp
, skb
->data
, skb
->len
, new_skb
->data
,
1384 &buf
, !(ipts
->pppcfg
& SC_NO_TCP_CCID
));
1386 if (buf
!= skb
->data
) {
1387 if (new_skb
->data
!= buf
)
1388 printk(KERN_ERR
"isdn_ppp: FATAL error after slhc_compress!!\n");
1392 dev_kfree_skb(new_skb
);
1395 skb_trim(skb
, pktlen
);
1396 if (skb
->data
[0] & SL_TYPE_COMPRESSED_TCP
) { /* cslip? style -> PPP */
1397 proto
= PPP_VJC_COMP
;
1398 skb
->data
[0] ^= SL_TYPE_COMPRESSED_TCP
;
1400 if (skb
->data
[0] >= SL_TYPE_UNCOMPRESSED_TCP
)
1401 proto
= PPP_VJC_UNCOMP
;
1402 skb
->data
[0] = (skb
->data
[0] & 0x0f) | 0x40;
1409 * normal (single link) or bundle compression
1411 if (ipts
->compflags
& SC_COMP_ON
) {
1412 /* We send compressed only if both down- und upstream
1413 compression is negotiated, that means, CCP is up */
1414 if (ipts
->compflags
& SC_DECOMP_ON
) {
1415 skb
= isdn_ppp_compress(skb
, &proto
, ipt
, ipts
, 0);
1417 printk(KERN_DEBUG
"isdn_ppp: CCP not yet up - sending as-is\n");
1421 if (ipt
->debug
& 0x24)
1422 printk(KERN_DEBUG
"xmit2 skb, len %d, proto %04x\n", (int) skb
->len
, proto
);
1424 #ifdef CONFIG_ISDN_MPP
1425 if (ipt
->mpppcfg
& SC_MP_PROT
) {
1426 /* we get mp_seqno from static isdn_net_local */
1427 long mp_seqno
= ipts
->mp_seqno
;
1429 if (ipt
->mpppcfg
& SC_OUT_SHORT_SEQ
) {
1430 unsigned char *data
= isdn_ppp_skb_push(&skb
, 3);
1434 data
[0] = MP_BEGIN_FRAG
| MP_END_FRAG
| ((mp_seqno
>> 8) & 0xf); /* (B)egin & (E)ndbit .. */
1435 data
[1] = mp_seqno
& 0xff;
1436 data
[2] = proto
; /* PID compression */
1438 unsigned char *data
= isdn_ppp_skb_push(&skb
, 5);
1441 data
[0] = MP_BEGIN_FRAG
| MP_END_FRAG
; /* (B)egin & (E)ndbit .. */
1442 data
[1] = (mp_seqno
>> 16) & 0xff; /* sequence number: 24bit */
1443 data
[2] = (mp_seqno
>> 8) & 0xff;
1444 data
[3] = (mp_seqno
>> 0) & 0xff;
1445 data
[4] = proto
; /* PID compression */
1447 proto
= PPP_MP
; /* MP Protocol, 0x003d */
1452 * 'link in bundle' compression ...
1454 if (ipt
->compflags
& SC_LINK_COMP_ON
)
1455 skb
= isdn_ppp_compress(skb
, &proto
, ipt
, ipts
, 1);
1457 if ((ipt
->pppcfg
& SC_COMP_PROT
) && (proto
<= 0xff)) {
1458 unsigned char *data
= isdn_ppp_skb_push(&skb
, 1);
1461 data
[0] = proto
& 0xff;
1464 unsigned char *data
= isdn_ppp_skb_push(&skb
, 2);
1467 data
[0] = (proto
>> 8) & 0xff;
1468 data
[1] = proto
& 0xff;
1470 if (!(ipt
->pppcfg
& SC_COMP_AC
)) {
1471 unsigned char *data
= isdn_ppp_skb_push(&skb
, 2);
1474 data
[0] = 0xff; /* All Stations */
1475 data
[1] = 0x03; /* Unnumbered information */
1478 /* tx-stats are now updated via BSENT-callback */
1480 if (ipts
->debug
& 0x40) {
1481 printk(KERN_DEBUG
"skb xmit: len: %d\n", (int) skb
->len
);
1482 isdn_ppp_frame_log("xmit", skb
->data
, skb
->len
, 32, ipt
->unit
, lp
->ppp_slot
);
1485 isdn_net_writebuf_skb(lp
, skb
);
1488 spin_unlock_bh(&lp
->xmit_lock
);
1493 #ifdef CONFIG_IPPP_FILTER
1495 * check if this packet may trigger auto-dial.
1498 int isdn_ppp_autodial_filter(struct sk_buff
*skb
, isdn_net_local
*lp
)
1500 struct ippp_struct
*is
= ippp_table
[lp
->ppp_slot
];
1504 switch (ntohs(skb
->protocol
)) {
1512 printk(KERN_ERR
"isdn_ppp_autodial_filter: unsupported protocol 0x%x.\n",
1517 /* the filter instructions are constructed assuming
1518 * a four-byte PPP header on each packet. we have to
1519 * temporarily remove part of the fake header stuck on
1522 *(u8
*)skb_pull(skb
, IPPP_MAX_HEADER
- 4) = 1; /* indicate outbound */
1525 __be16
*p
= (__be16
*)skb
->data
;
1531 drop
|= is
->pass_filter
1532 && BPF_PROG_RUN(is
->pass_filter
, skb
) == 0;
1533 drop
|= is
->active_filter
1534 && BPF_PROG_RUN(is
->active_filter
, skb
) == 0;
1536 skb_push(skb
, IPPP_MAX_HEADER
- 4);
1540 #ifdef CONFIG_ISDN_MPP
1542 /* this is _not_ rfc1990 header, but something we convert both short and long
1543 * headers to for convinience's sake:
1544 * byte 0 is flags as in rfc1990
1545 * bytes 1...4 is 24-bit seqence number converted to host byte order
1547 #define MP_HEADER_LEN 5
1549 #define MP_LONGSEQ_MASK 0x00ffffff
1550 #define MP_SHORTSEQ_MASK 0x00000fff
1551 #define MP_LONGSEQ_MAX MP_LONGSEQ_MASK
1552 #define MP_SHORTSEQ_MAX MP_SHORTSEQ_MASK
1553 #define MP_LONGSEQ_MAXBIT ((MP_LONGSEQ_MASK + 1) >> 1)
1554 #define MP_SHORTSEQ_MAXBIT ((MP_SHORTSEQ_MASK + 1) >> 1)
1556 /* sequence-wrap safe comparisons (for long sequence)*/
1557 #define MP_LT(a, b) ((a - b) & MP_LONGSEQ_MAXBIT)
1558 #define MP_LE(a, b) !((b - a) & MP_LONGSEQ_MAXBIT)
1559 #define MP_GT(a, b) ((b - a) & MP_LONGSEQ_MAXBIT)
1560 #define MP_GE(a, b) !((a - b) & MP_LONGSEQ_MAXBIT)
1562 #define MP_SEQ(f) ((*(u32 *)(f->data + 1)))
1563 #define MP_FLAGS(f) (f->data[0])
1565 static int isdn_ppp_mp_bundle_array_init(void)
1568 int sz
= ISDN_MAX_CHANNELS
* sizeof(ippp_bundle
);
1569 if ((isdn_ppp_bundle_arr
= kzalloc(sz
, GFP_KERNEL
)) == NULL
)
1571 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++)
1572 spin_lock_init(&isdn_ppp_bundle_arr
[i
].lock
);
1576 static ippp_bundle
*isdn_ppp_mp_bundle_alloc(void)
1579 for (i
= 0; i
< ISDN_MAX_CHANNELS
; i
++)
1580 if (isdn_ppp_bundle_arr
[i
].ref_ct
<= 0)
1581 return (isdn_ppp_bundle_arr
+ i
);
1585 static int isdn_ppp_mp_init(isdn_net_local
*lp
, ippp_bundle
*add_to
)
1587 struct ippp_struct
*is
;
1589 if (lp
->ppp_slot
< 0) {
1590 printk(KERN_ERR
"%s: lp->ppp_slot(%d) out of range\n",
1591 __func__
, lp
->ppp_slot
);
1595 is
= ippp_table
[lp
->ppp_slot
];
1598 lp
->netdev
->pb
->ref_ct
--;
1599 lp
->netdev
->pb
= add_to
;
1600 } else { /* first link in a bundle */
1602 if ((lp
->netdev
->pb
= isdn_ppp_mp_bundle_alloc()) == NULL
)
1604 lp
->next
= lp
->last
= lp
; /* nobody else in a queue */
1605 lp
->netdev
->pb
->frags
= NULL
;
1606 lp
->netdev
->pb
->frames
= 0;
1607 lp
->netdev
->pb
->seq
= UINT_MAX
;
1609 lp
->netdev
->pb
->ref_ct
++;
1611 is
->last_link_seqno
= 0;
1615 static u32
isdn_ppp_mp_get_seq(int short_seq
,
1616 struct sk_buff
*skb
, u32 last_seq
);
1617 static struct sk_buff
*isdn_ppp_mp_discard(ippp_bundle
*mp
,
1618 struct sk_buff
*from
, struct sk_buff
*to
);
1619 static void isdn_ppp_mp_reassembly(isdn_net_dev
*net_dev
, isdn_net_local
*lp
,
1620 struct sk_buff
*from
, struct sk_buff
*to
);
1621 static void isdn_ppp_mp_free_skb(ippp_bundle
*mp
, struct sk_buff
*skb
);
1622 static void isdn_ppp_mp_print_recv_pkt(int slot
, struct sk_buff
*skb
);
1624 static void isdn_ppp_mp_receive(isdn_net_dev
*net_dev
, isdn_net_local
*lp
,
1625 struct sk_buff
*skb
)
1627 struct ippp_struct
*is
;
1628 isdn_net_local
*lpq
;
1630 isdn_mppp_stats
*stats
;
1631 struct sk_buff
*newfrag
, *frag
, *start
, *nextf
;
1632 u32 newseq
, minseq
, thisseq
;
1633 unsigned long flags
;
1636 spin_lock_irqsave(&net_dev
->pb
->lock
, flags
);
1639 slot
= lp
->ppp_slot
;
1640 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
1641 printk(KERN_ERR
"%s: lp->ppp_slot(%d)\n",
1642 __func__
, lp
->ppp_slot
);
1643 stats
->frame_drops
++;
1645 spin_unlock_irqrestore(&mp
->lock
, flags
);
1648 is
= ippp_table
[slot
];
1649 if (++mp
->frames
> stats
->max_queue_len
)
1650 stats
->max_queue_len
= mp
->frames
;
1652 if (is
->debug
& 0x8)
1653 isdn_ppp_mp_print_recv_pkt(lp
->ppp_slot
, skb
);
1655 newseq
= isdn_ppp_mp_get_seq(is
->mpppcfg
& SC_IN_SHORT_SEQ
,
1656 skb
, is
->last_link_seqno
);
1659 /* if this packet seq # is less than last already processed one,
1660 * toss it right away, but check for sequence start case first
1662 if (mp
->seq
> MP_LONGSEQ_MAX
&& (newseq
& MP_LONGSEQ_MAXBIT
)) {
1663 mp
->seq
= newseq
; /* the first packet: required for
1664 * rfc1990 non-compliant clients --
1665 * prevents constant packet toss */
1666 } else if (MP_LT(newseq
, mp
->seq
)) {
1667 stats
->frame_drops
++;
1668 isdn_ppp_mp_free_skb(mp
, skb
);
1669 spin_unlock_irqrestore(&mp
->lock
, flags
);
1673 /* find the minimum received sequence number over all links */
1674 is
->last_link_seqno
= minseq
= newseq
;
1675 for (lpq
= net_dev
->queue
;;) {
1676 slot
= lpq
->ppp_slot
;
1677 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
1678 printk(KERN_ERR
"%s: lpq->ppp_slot(%d)\n",
1679 __func__
, lpq
->ppp_slot
);
1681 u32 lls
= ippp_table
[slot
]->last_link_seqno
;
1682 if (MP_LT(lls
, minseq
))
1685 if ((lpq
= lpq
->next
) == net_dev
->queue
)
1688 if (MP_LT(minseq
, mp
->seq
))
1689 minseq
= mp
->seq
; /* can't go beyond already processed
1693 /* if this new fragment is before the first one, then enqueue it now. */
1694 if ((frag
= mp
->frags
) == NULL
|| MP_LT(newseq
, MP_SEQ(frag
))) {
1695 newfrag
->next
= frag
;
1696 mp
->frags
= frag
= newfrag
;
1700 start
= MP_FLAGS(frag
) & MP_BEGIN_FRAG
&&
1701 MP_SEQ(frag
) == mp
->seq
? frag
: NULL
;
1704 * main fragment traversing loop
1706 * try to accomplish several tasks:
1707 * - insert new fragment into the proper sequence slot (once that's done
1708 * newfrag will be set to NULL)
1709 * - reassemble any complete fragment sequence (non-null 'start'
1710 * indicates there is a contiguous sequence present)
1711 * - discard any incomplete sequences that are below minseq -- due
1712 * to the fact that sender always increment sequence number, if there
1713 * is an incomplete sequence below minseq, no new fragments would
1714 * come to complete such sequence and it should be discarded
1716 * loop completes when we accomplished the following tasks:
1717 * - new fragment is inserted in the proper sequence ('newfrag' is
1719 * - we hit a gap in the sequence, so no reassembly/processing is
1720 * possible ('start' would be set to NULL)
1722 * algorithm for this code is derived from code in the book
1723 * 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
1725 while (start
!= NULL
|| newfrag
!= NULL
) {
1727 thisseq
= MP_SEQ(frag
);
1730 /* drop any duplicate fragments */
1731 if (newfrag
!= NULL
&& thisseq
== newseq
) {
1732 isdn_ppp_mp_free_skb(mp
, newfrag
);
1736 /* insert new fragment before next element if possible. */
1737 if (newfrag
!= NULL
&& (nextf
== NULL
||
1738 MP_LT(newseq
, MP_SEQ(nextf
)))) {
1739 newfrag
->next
= nextf
;
1740 frag
->next
= nextf
= newfrag
;
1744 if (start
!= NULL
) {
1745 /* check for misplaced start */
1746 if (start
!= frag
&& (MP_FLAGS(frag
) & MP_BEGIN_FRAG
)) {
1747 printk(KERN_WARNING
"isdn_mppp(seq %d): new "
1748 "BEGIN flag with no prior END", thisseq
);
1750 stats
->frame_drops
++;
1751 start
= isdn_ppp_mp_discard(mp
, start
, frag
);
1754 } else if (MP_LE(thisseq
, minseq
)) {
1755 if (MP_FLAGS(frag
) & MP_BEGIN_FRAG
)
1758 if (MP_FLAGS(frag
) & MP_END_FRAG
)
1759 stats
->frame_drops
++;
1760 if (mp
->frags
== frag
)
1762 isdn_ppp_mp_free_skb(mp
, frag
);
1768 /* if start is non-null and we have end fragment, then
1769 * we have full reassembly sequence -- reassemble
1770 * and process packet now
1772 if (start
!= NULL
&& (MP_FLAGS(frag
) & MP_END_FRAG
)) {
1773 minseq
= mp
->seq
= (thisseq
+ 1) & MP_LONGSEQ_MASK
;
1774 /* Reassemble the packet then dispatch it */
1775 isdn_ppp_mp_reassembly(net_dev
, lp
, start
, nextf
);
1783 /* check if need to update start pointer: if we just
1784 * reassembled the packet and sequence is contiguous
1785 * then next fragment should be the start of new reassembly
1786 * if sequence is contiguous, but we haven't reassembled yet,
1788 * if sequence is not contiguous, either clear everything
1789 * below low watermark and set start to the next frag or
1792 if (nextf
!= NULL
&&
1793 ((thisseq
+ 1) & MP_LONGSEQ_MASK
) == MP_SEQ(nextf
)) {
1794 /* if we just reassembled and the next one is here,
1795 * then start another reassembly. */
1798 if (MP_FLAGS(nextf
) & MP_BEGIN_FRAG
)
1802 printk(KERN_WARNING
"isdn_mppp(seq %d):"
1803 " END flag with no following "
1810 if (nextf
!= NULL
&& frag
!= NULL
&&
1811 MP_LT(thisseq
, minseq
)) {
1812 /* we've got a break in the sequence
1813 * and we not at the end yet
1814 * and we did not just reassembled
1815 *(if we did, there wouldn't be anything before)
1816 * and we below the low watermark
1817 * discard all the frames below low watermark
1819 stats
->frame_drops
++;
1820 mp
->frags
= isdn_ppp_mp_discard(mp
, start
, nextf
);
1822 /* break in the sequence, no reassembly */
1827 } /* while -- main loop */
1829 if (mp
->frags
== NULL
)
1832 /* rather straighforward way to deal with (not very) possible
1834 if (mp
->frames
> MP_MAX_QUEUE_LEN
) {
1836 while (mp
->frames
> MP_MAX_QUEUE_LEN
) {
1837 frag
= mp
->frags
->next
;
1838 isdn_ppp_mp_free_skb(mp
, mp
->frags
);
1842 spin_unlock_irqrestore(&mp
->lock
, flags
);
1845 static void isdn_ppp_mp_cleanup(isdn_net_local
*lp
)
1847 struct sk_buff
*frag
= lp
->netdev
->pb
->frags
;
1848 struct sk_buff
*nextfrag
;
1850 nextfrag
= frag
->next
;
1851 isdn_ppp_mp_free_skb(lp
->netdev
->pb
, frag
);
1854 lp
->netdev
->pb
->frags
= NULL
;
1857 static u32
isdn_ppp_mp_get_seq(int short_seq
,
1858 struct sk_buff
*skb
, u32 last_seq
)
1861 int flags
= skb
->data
[0] & (MP_BEGIN_FRAG
| MP_END_FRAG
);
1865 seq
= ntohl(*(__be32
*)skb
->data
) & MP_LONGSEQ_MASK
;
1870 /* convert 12-bit short seq number to 24-bit long one
1872 seq
= ntohs(*(__be16
*)skb
->data
) & MP_SHORTSEQ_MASK
;
1874 /* check for seqence wrap */
1875 if (!(seq
& MP_SHORTSEQ_MAXBIT
) &&
1876 (last_seq
& MP_SHORTSEQ_MAXBIT
) &&
1877 (unsigned long)last_seq
<= MP_LONGSEQ_MAX
)
1878 seq
|= (last_seq
+ MP_SHORTSEQ_MAX
+ 1) &
1879 (~MP_SHORTSEQ_MASK
& MP_LONGSEQ_MASK
);
1881 seq
|= last_seq
& (~MP_SHORTSEQ_MASK
& MP_LONGSEQ_MASK
);
1883 skb_push(skb
, 3); /* put converted seqence back in skb */
1885 *(u32
*)(skb
->data
+ 1) = seq
; /* put seqence back in _host_ byte
1887 skb
->data
[0] = flags
; /* restore flags */
1891 struct sk_buff
*isdn_ppp_mp_discard(ippp_bundle
*mp
,
1892 struct sk_buff
*from
, struct sk_buff
*to
)
1895 while (from
!= to
) {
1896 struct sk_buff
*next
= from
->next
;
1897 isdn_ppp_mp_free_skb(mp
, from
);
1903 void isdn_ppp_mp_reassembly(isdn_net_dev
*net_dev
, isdn_net_local
*lp
,
1904 struct sk_buff
*from
, struct sk_buff
*to
)
1906 ippp_bundle
*mp
= net_dev
->pb
;
1908 struct sk_buff
*skb
;
1909 unsigned int tot_len
;
1911 if (lp
->ppp_slot
< 0 || lp
->ppp_slot
>= ISDN_MAX_CHANNELS
) {
1912 printk(KERN_ERR
"%s: lp->ppp_slot(%d) out of range\n",
1913 __func__
, lp
->ppp_slot
);
1916 if (MP_FLAGS(from
) == (MP_BEGIN_FRAG
| MP_END_FRAG
)) {
1917 if (ippp_table
[lp
->ppp_slot
]->debug
& 0x40)
1918 printk(KERN_DEBUG
"isdn_mppp: reassembly: frame %d, "
1919 "len %d\n", MP_SEQ(from
), from
->len
);
1921 skb_pull(skb
, MP_HEADER_LEN
);
1924 struct sk_buff
*frag
;
1927 for (tot_len
= n
= 0, frag
= from
; frag
!= to
; frag
= frag
->next
, n
++)
1928 tot_len
+= frag
->len
- MP_HEADER_LEN
;
1930 if (ippp_table
[lp
->ppp_slot
]->debug
& 0x40)
1931 printk(KERN_DEBUG
"isdn_mppp: reassembling frames %d "
1932 "to %d, len %d\n", MP_SEQ(from
),
1933 (MP_SEQ(from
) + n
- 1) & MP_LONGSEQ_MASK
, tot_len
);
1934 if ((skb
= dev_alloc_skb(tot_len
)) == NULL
) {
1935 printk(KERN_ERR
"isdn_mppp: cannot allocate sk buff "
1936 "of size %d\n", tot_len
);
1937 isdn_ppp_mp_discard(mp
, from
, to
);
1941 while (from
!= to
) {
1942 unsigned int len
= from
->len
- MP_HEADER_LEN
;
1944 skb_copy_from_linear_data_offset(from
, MP_HEADER_LEN
,
1948 isdn_ppp_mp_free_skb(mp
, from
);
1952 proto
= isdn_ppp_strip_proto(skb
);
1953 isdn_ppp_push_higher(net_dev
, lp
, skb
, proto
);
1956 static void isdn_ppp_mp_free_skb(ippp_bundle
*mp
, struct sk_buff
*skb
)
1962 static void isdn_ppp_mp_print_recv_pkt(int slot
, struct sk_buff
*skb
)
1964 printk(KERN_DEBUG
"mp_recv: %d/%d -> %02x %02x %02x %02x %02x %02x\n",
1965 slot
, (int) skb
->len
,
1966 (int) skb
->data
[0], (int) skb
->data
[1], (int) skb
->data
[2],
1967 (int) skb
->data
[3], (int) skb
->data
[4], (int) skb
->data
[5]);
1971 isdn_ppp_bundle(struct ippp_struct
*is
, int unit
)
1973 char ifn
[IFNAMSIZ
+ 1];
1975 isdn_net_local
*lp
, *nlp
;
1977 unsigned long flags
;
1979 sprintf(ifn
, "ippp%d", unit
);
1980 p
= isdn_net_findif(ifn
);
1982 printk(KERN_ERR
"ippp_bundle: cannot find %s\n", ifn
);
1986 spin_lock_irqsave(&p
->pb
->lock
, flags
);
1990 if (nlp
->ppp_slot
< 0 || nlp
->ppp_slot
>= ISDN_MAX_CHANNELS
||
1991 lp
->ppp_slot
< 0 || lp
->ppp_slot
>= ISDN_MAX_CHANNELS
) {
1992 printk(KERN_ERR
"ippp_bundle: binding to invalid slot %d\n",
1993 nlp
->ppp_slot
< 0 || nlp
->ppp_slot
>= ISDN_MAX_CHANNELS
?
1994 nlp
->ppp_slot
: lp
->ppp_slot
);
1999 isdn_net_add_to_bundle(p
, nlp
);
2001 ippp_table
[nlp
->ppp_slot
]->unit
= ippp_table
[lp
->ppp_slot
]->unit
;
2003 /* maybe also SC_CCP stuff */
2004 ippp_table
[nlp
->ppp_slot
]->pppcfg
|= ippp_table
[lp
->ppp_slot
]->pppcfg
&
2005 (SC_ENABLE_IP
| SC_NO_TCP_CCID
| SC_REJ_COMP_TCP
);
2006 ippp_table
[nlp
->ppp_slot
]->mpppcfg
|= ippp_table
[lp
->ppp_slot
]->mpppcfg
&
2007 (SC_MP_PROT
| SC_REJ_MP_PROT
| SC_OUT_SHORT_SEQ
| SC_IN_SHORT_SEQ
);
2008 rc
= isdn_ppp_mp_init(nlp
, p
->pb
);
2010 spin_unlock_irqrestore(&p
->pb
->lock
, flags
);
2014 #endif /* CONFIG_ISDN_MPP */
2017 * network device ioctl handlers
2021 isdn_ppp_dev_ioctl_stats(int slot
, struct ifreq
*ifr
, struct net_device
*dev
)
2023 struct ppp_stats __user
*res
= ifr
->ifr_data
;
2025 isdn_net_local
*lp
= netdev_priv(dev
);
2027 /* build a temporary stat struct and copy it to user space */
2029 memset(&t
, 0, sizeof(struct ppp_stats
));
2030 if (dev
->flags
& IFF_UP
) {
2031 t
.p
.ppp_ipackets
= lp
->stats
.rx_packets
;
2032 t
.p
.ppp_ibytes
= lp
->stats
.rx_bytes
;
2033 t
.p
.ppp_ierrors
= lp
->stats
.rx_errors
;
2034 t
.p
.ppp_opackets
= lp
->stats
.tx_packets
;
2035 t
.p
.ppp_obytes
= lp
->stats
.tx_bytes
;
2036 t
.p
.ppp_oerrors
= lp
->stats
.tx_errors
;
2037 #ifdef CONFIG_ISDN_PPP_VJ
2038 if (slot
>= 0 && ippp_table
[slot
]->slcomp
) {
2039 struct slcompress
*slcomp
= ippp_table
[slot
]->slcomp
;
2040 t
.vj
.vjs_packets
= slcomp
->sls_o_compressed
+ slcomp
->sls_o_uncompressed
;
2041 t
.vj
.vjs_compressed
= slcomp
->sls_o_compressed
;
2042 t
.vj
.vjs_searches
= slcomp
->sls_o_searches
;
2043 t
.vj
.vjs_misses
= slcomp
->sls_o_misses
;
2044 t
.vj
.vjs_errorin
= slcomp
->sls_i_error
;
2045 t
.vj
.vjs_tossed
= slcomp
->sls_i_tossed
;
2046 t
.vj
.vjs_uncompressedin
= slcomp
->sls_i_uncompressed
;
2047 t
.vj
.vjs_compressedin
= slcomp
->sls_i_compressed
;
2051 if (copy_to_user(res
, &t
, sizeof(struct ppp_stats
)))
2057 isdn_ppp_dev_ioctl(struct net_device
*dev
, struct ifreq
*ifr
, int cmd
)
2061 isdn_net_local
*lp
= netdev_priv(dev
);
2064 if (lp
->p_encap
!= ISDN_NET_ENCAP_SYNCPPP
)
2068 #define PPP_VERSION "2.3.7"
2070 len
= strlen(PPP_VERSION
) + 1;
2071 if (copy_to_user(ifr
->ifr_data
, PPP_VERSION
, len
))
2076 error
= isdn_ppp_dev_ioctl_stats(lp
->ppp_slot
, ifr
, dev
);
2086 isdn_ppp_if_get_unit(char *name
)
2095 if (strncmp("ippp", name
, 4) || len
> 8)
2098 for (i
= 0, deci
= 1; i
< len
; i
++, deci
*= 10) {
2099 char a
= name
[len
- i
- 1];
2100 if (a
>= '0' && a
<= '9')
2101 unit
+= (a
- '0') * deci
;
2105 if (!i
|| len
- i
!= 4)
2113 isdn_ppp_dial_slave(char *name
)
2115 #ifdef CONFIG_ISDN_MPP
2118 struct net_device
*sdev
;
2120 if (!(ndev
= isdn_net_findif(name
)))
2123 if (!(lp
->flags
& ISDN_NET_CONNECTED
))
2128 isdn_net_local
*mlp
= netdev_priv(sdev
);
2129 if (!(mlp
->flags
& ISDN_NET_CONNECTED
))
2136 isdn_net_dial_req(netdev_priv(sdev
));
2144 isdn_ppp_hangup_slave(char *name
)
2146 #ifdef CONFIG_ISDN_MPP
2149 struct net_device
*sdev
;
2151 if (!(ndev
= isdn_net_findif(name
)))
2154 if (!(lp
->flags
& ISDN_NET_CONNECTED
))
2159 isdn_net_local
*mlp
= netdev_priv(sdev
);
2161 if (mlp
->slave
) { /* find last connected link in chain */
2162 isdn_net_local
*nlp
= ISDN_SLAVE_PRIV(mlp
);
2164 if (!(nlp
->flags
& ISDN_NET_CONNECTED
))
2166 } else if (mlp
->flags
& ISDN_NET_CONNECTED
)
2174 isdn_net_hangup(sdev
);
2182 * PPP compression stuff
2186 /* Push an empty CCP Data Frame up to the daemon to wake it up and let it
2187 generate a CCP Reset-Request or tear down CCP altogether */
2189 static void isdn_ppp_ccp_kickup(struct ippp_struct
*is
)
2191 isdn_ppp_fill_rq(NULL
, 0, PPP_COMP
, is
->lp
->ppp_slot
);
2194 /* In-kernel handling of CCP Reset-Request and Reset-Ack is necessary,
2195 but absolutely nontrivial. The most abstruse problem we are facing is
2196 that the generation, reception and all the handling of timeouts and
2197 resends including proper request id management should be entirely left
2198 to the (de)compressor, but indeed is not covered by the current API to
2199 the (de)compressor. The API is a prototype version from PPP where only
2200 some (de)compressors have yet been implemented and all of them are
2201 rather simple in their reset handling. Especially, their is only one
2202 outstanding ResetAck at a time with all of them and ResetReq/-Acks do
2203 not have parameters. For this very special case it was sufficient to
2204 just return an error code from the decompressor and have a single
2205 reset() entry to communicate all the necessary information between
2206 the framework and the (de)compressor. Bad enough, LZS is different
2207 (and any other compressor may be different, too). It has multiple
2208 histories (eventually) and needs to Reset each of them independently
2209 and thus uses multiple outstanding Acks and history numbers as an
2210 additional parameter to Reqs/Acks.
2211 All that makes it harder to port the reset state engine into the
2212 kernel because it is not just the same simple one as in (i)pppd but
2213 it must be able to pass additional parameters and have multiple out-
2214 standing Acks. We are trying to achieve the impossible by handling
2215 reset transactions independent by their id. The id MUST change when
2216 the data portion changes, thus any (de)compressor who uses more than
2217 one resettable state must provide and recognize individual ids for
2218 each individual reset transaction. The framework itself does _only_
2219 differentiate them by id, because it has no other semantics like the
2220 (de)compressor might.
2221 This looks like a major redesign of the interface would be nice,
2222 but I don't have an idea how to do it better. */
2224 /* Send a CCP Reset-Request or Reset-Ack directly from the kernel. This is
2225 getting that lengthy because there is no simple "send-this-frame-out"
2226 function above but every wrapper does a bit different. Hope I guess
2227 correct in this hack... */
2229 static void isdn_ppp_ccp_xmit_reset(struct ippp_struct
*is
, int proto
,
2230 unsigned char code
, unsigned char id
,
2231 unsigned char *data
, int len
)
2233 struct sk_buff
*skb
;
2237 isdn_net_local
*lp
= is
->lp
;
2239 /* Alloc large enough skb */
2240 hl
= dev
->drv
[lp
->isdn_device
]->interface
->hl_hdrlen
;
2241 skb
= alloc_skb(len
+ hl
+ 16, GFP_ATOMIC
);
2244 "ippp: CCP cannot send reset - out of memory\n");
2247 skb_reserve(skb
, hl
);
2249 /* We may need to stuff an address and control field first */
2250 if (!(is
->pppcfg
& SC_COMP_AC
)) {
2251 p
= skb_put(skb
, 2);
2256 /* Stuff proto, code, id and length */
2257 p
= skb_put(skb
, 6);
2258 *p
++ = (proto
>> 8);
2259 *p
++ = (proto
& 0xff);
2264 *p
++ = (cnt
& 0xff);
2266 /* Now stuff remaining bytes */
2268 skb_put_data(skb
, data
, len
);
2271 /* skb is now ready for xmit */
2272 printk(KERN_DEBUG
"Sending CCP Frame:\n");
2273 isdn_ppp_frame_log("ccp-xmit", skb
->data
, skb
->len
, 32, is
->unit
, lp
->ppp_slot
);
2275 isdn_net_write_super(lp
, skb
);
2278 /* Allocate the reset state vector */
2279 static struct ippp_ccp_reset
*isdn_ppp_ccp_reset_alloc(struct ippp_struct
*is
)
2281 struct ippp_ccp_reset
*r
;
2282 r
= kzalloc(sizeof(struct ippp_ccp_reset
), GFP_KERNEL
);
2284 printk(KERN_ERR
"ippp_ccp: failed to allocate reset data"
2285 " structure - no mem\n");
2288 printk(KERN_DEBUG
"ippp_ccp: allocated reset data structure %p\n", r
);
2293 /* Destroy the reset state vector. Kill all pending timers first. */
2294 static void isdn_ppp_ccp_reset_free(struct ippp_struct
*is
)
2298 printk(KERN_DEBUG
"ippp_ccp: freeing reset data structure %p\n",
2300 for (id
= 0; id
< 256; id
++) {
2301 if (is
->reset
->rs
[id
]) {
2302 isdn_ppp_ccp_reset_free_state(is
, (unsigned char)id
);
2309 /* Free a given state and clear everything up for later reallocation */
2310 static void isdn_ppp_ccp_reset_free_state(struct ippp_struct
*is
,
2313 struct ippp_ccp_reset_state
*rs
;
2315 if (is
->reset
->rs
[id
]) {
2316 printk(KERN_DEBUG
"ippp_ccp: freeing state for id %d\n", id
);
2317 rs
= is
->reset
->rs
[id
];
2318 /* Make sure the kernel will not call back later */
2320 del_timer(&rs
->timer
);
2321 is
->reset
->rs
[id
] = NULL
;
2324 printk(KERN_WARNING
"ippp_ccp: id %d is not allocated\n", id
);
2328 /* The timer callback function which is called when a ResetReq has timed out,
2329 aka has never been answered by a ResetAck */
2330 static void isdn_ppp_ccp_timer_callback(struct timer_list
*t
)
2332 struct ippp_ccp_reset_state
*rs
=
2333 from_timer(rs
, t
, timer
);
2336 printk(KERN_ERR
"ippp_ccp: timer cb with zero closure.\n");
2339 if (rs
->ta
&& rs
->state
== CCPResetSentReq
) {
2340 /* We are correct here */
2342 /* Hmm, there is no Ack really expected. We can clean
2343 up the state now, it will be reallocated if the
2344 decompressor insists on another reset */
2346 isdn_ppp_ccp_reset_free_state(rs
->is
, rs
->id
);
2349 printk(KERN_DEBUG
"ippp_ccp: CCP Reset timed out for id %d\n",
2352 isdn_ppp_ccp_xmit_reset(rs
->is
, PPP_CCP
, CCP_RESETREQ
, rs
->id
,
2353 rs
->data
, rs
->dlen
);
2355 rs
->timer
.expires
= jiffies
+ HZ
* 5;
2356 add_timer(&rs
->timer
);
2358 printk(KERN_WARNING
"ippp_ccp: timer cb in wrong state %d\n",
2363 /* Allocate a new reset transaction state */
2364 static struct ippp_ccp_reset_state
*isdn_ppp_ccp_reset_alloc_state(struct ippp_struct
*is
,
2367 struct ippp_ccp_reset_state
*rs
;
2368 if (is
->reset
->rs
[id
]) {
2369 printk(KERN_WARNING
"ippp_ccp: old state exists for id %d\n",
2373 rs
= kzalloc(sizeof(struct ippp_ccp_reset_state
), GFP_ATOMIC
);
2376 rs
->state
= CCPResetIdle
;
2379 timer_setup(&rs
->timer
, isdn_ppp_ccp_timer_callback
, 0);
2380 is
->reset
->rs
[id
] = rs
;
2386 /* A decompressor wants a reset with a set of parameters - do what is
2387 necessary to fulfill it */
2388 static void isdn_ppp_ccp_reset_trans(struct ippp_struct
*is
,
2389 struct isdn_ppp_resetparams
*rp
)
2391 struct ippp_ccp_reset_state
*rs
;
2394 /* The decompressor defines parameters by itself */
2396 /* And he wants us to send a request */
2398 printk(KERN_ERR
"ippp_ccp: decompressor must"
2399 " specify reset id\n");
2402 if (is
->reset
->rs
[rp
->id
]) {
2403 /* There is already a transaction in existence
2404 for this id. May be still waiting for a
2405 Ack or may be wrong. */
2406 rs
= is
->reset
->rs
[rp
->id
];
2407 if (rs
->state
== CCPResetSentReq
&& rs
->ta
) {
2408 printk(KERN_DEBUG
"ippp_ccp: reset"
2409 " trans still in progress"
2410 " for id %d\n", rp
->id
);
2412 printk(KERN_WARNING
"ippp_ccp: reset"
2413 " trans in wrong state %d for"
2414 " id %d\n", rs
->state
, rp
->id
);
2417 /* Ok, this is a new transaction */
2418 printk(KERN_DEBUG
"ippp_ccp: new trans for id"
2419 " %d to be started\n", rp
->id
);
2420 rs
= isdn_ppp_ccp_reset_alloc_state(is
, rp
->id
);
2422 printk(KERN_ERR
"ippp_ccp: out of mem"
2423 " allocing ccp trans\n");
2426 rs
->state
= CCPResetSentReq
;
2427 rs
->expra
= rp
->expra
;
2429 rs
->dlen
= rp
->dlen
;
2430 memcpy(rs
->data
, rp
->data
, rp
->dlen
);
2432 /* HACK TODO - add link comp here */
2433 isdn_ppp_ccp_xmit_reset(is
, PPP_CCP
,
2434 CCP_RESETREQ
, rs
->id
,
2435 rs
->data
, rs
->dlen
);
2436 /* Start the timer */
2437 rs
->timer
.expires
= jiffies
+ 5 * HZ
;
2438 add_timer(&rs
->timer
);
2442 printk(KERN_DEBUG
"ippp_ccp: no reset sent\n");
2445 /* The reset params are invalid. The decompressor does not
2446 care about them, so we just send the minimal requests
2447 and increase ids only when an Ack is received for a
2449 if (is
->reset
->rs
[is
->reset
->lastid
]) {
2450 /* There is already a transaction in existence
2451 for this id. May be still waiting for a
2452 Ack or may be wrong. */
2453 rs
= is
->reset
->rs
[is
->reset
->lastid
];
2454 if (rs
->state
== CCPResetSentReq
&& rs
->ta
) {
2455 printk(KERN_DEBUG
"ippp_ccp: reset"
2456 " trans still in progress"
2457 " for id %d\n", rp
->id
);
2459 printk(KERN_WARNING
"ippp_ccp: reset"
2460 " trans in wrong state %d for"
2461 " id %d\n", rs
->state
, rp
->id
);
2464 printk(KERN_DEBUG
"ippp_ccp: new trans for id"
2465 " %d to be started\n", is
->reset
->lastid
);
2466 rs
= isdn_ppp_ccp_reset_alloc_state(is
,
2469 printk(KERN_ERR
"ippp_ccp: out of mem"
2470 " allocing ccp trans\n");
2473 rs
->state
= CCPResetSentReq
;
2474 /* We always expect an Ack if the decompressor doesn't
2478 /* HACK TODO - add link comp here */
2479 isdn_ppp_ccp_xmit_reset(is
, PPP_CCP
, CCP_RESETREQ
,
2481 /* Start the timer */
2482 rs
->timer
.expires
= jiffies
+ 5 * HZ
;
2483 add_timer(&rs
->timer
);
2489 /* An Ack was received for this id. This means we stop the timer and clean
2490 up the state prior to calling the decompressors reset routine. */
2491 static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct
*is
,
2494 struct ippp_ccp_reset_state
*rs
= is
->reset
->rs
[id
];
2497 if (rs
->ta
&& rs
->state
== CCPResetSentReq
) {
2498 /* Great, we are correct */
2500 printk(KERN_DEBUG
"ippp_ccp: ResetAck received"
2501 " for id %d but not expected\n", id
);
2503 printk(KERN_INFO
"ippp_ccp: ResetAck received out of"
2504 "sync for id %d\n", id
);
2508 del_timer(&rs
->timer
);
2510 isdn_ppp_ccp_reset_free_state(is
, id
);
2512 printk(KERN_INFO
"ippp_ccp: ResetAck received for unknown id"
2515 /* Make sure the simple reset stuff uses a new id next time */
2516 is
->reset
->lastid
++;
2522 * if master = 0, we're trying to uncompress an per-link compressed packet,
2523 * as opposed to an compressed reconstructed-from-MPPP packet.
2524 * proto is updated to protocol field of uncompressed packet.
2526 * retval: decompressed packet,
2527 * same packet if uncompressed,
2528 * NULL if decompression error
2531 static struct sk_buff
*isdn_ppp_decompress(struct sk_buff
*skb
, struct ippp_struct
*is
, struct ippp_struct
*master
,
2535 struct isdn_ppp_compressor
*ipc
= NULL
;
2536 struct sk_buff
*skb_out
;
2538 struct ippp_struct
*ri
;
2539 struct isdn_ppp_resetparams rsparm
;
2540 unsigned char rsdata
[IPPP_RESET_MAXDATABYTES
];
2543 // per-link decompression
2544 stat
= is
->link_decomp_stat
;
2545 ipc
= is
->link_decompressor
;
2548 stat
= master
->decomp_stat
;
2549 ipc
= master
->decompressor
;
2554 // no decompressor -> we can't decompress.
2555 printk(KERN_DEBUG
"ippp: no decompressor defined!\n");
2558 BUG_ON(!stat
); // if we have a compressor, stat has been set as well
2560 if ((master
&& *proto
== PPP_COMP
) || (!master
&& *proto
== PPP_COMPFRAG
)) {
2561 // compressed packets are compressed by their protocol type
2563 // Set up reset params for the decompressor
2564 memset(&rsparm
, 0, sizeof(rsparm
));
2565 rsparm
.data
= rsdata
;
2566 rsparm
.maxdlen
= IPPP_RESET_MAXDATABYTES
;
2568 skb_out
= dev_alloc_skb(is
->mru
+ PPP_HDRLEN
);
2571 printk(KERN_ERR
"ippp: decomp memory allocation failure\n");
2574 len
= ipc
->decompress(stat
, skb
, skb_out
, &rsparm
);
2579 printk(KERN_INFO
"ippp: decomp wants reset %s params\n",
2580 rsparm
.valid
? "with" : "without");
2582 isdn_ppp_ccp_reset_trans(ri
, &rsparm
);
2584 case DECOMP_FATALERROR
:
2585 ri
->pppcfg
|= SC_DC_FERROR
;
2586 /* Kick ipppd to recognize the error */
2587 isdn_ppp_ccp_kickup(ri
);
2593 *proto
= isdn_ppp_strip_proto(skb_out
);
2600 // uncompressed packets are fed through the decompressor to
2601 // update the decompressor state
2602 ipc
->incomp(stat
, skb
, *proto
);
2609 * type=0: normal/bundle compression
2610 * =1: link compression
2611 * returns original skb if we haven't compressed the frame
2612 * and a new skb pointer if we've done it
2614 static struct sk_buff
*isdn_ppp_compress(struct sk_buff
*skb_in
, int *proto
,
2615 struct ippp_struct
*is
, struct ippp_struct
*master
, int type
)
2619 struct isdn_ppp_compressor
*compressor
;
2621 struct sk_buff
*skb_out
;
2623 /* we do not compress control protocols */
2624 if (*proto
< 0 || *proto
> 0x3fff) {
2628 if (type
) { /* type=1 => Link compression */
2633 compressor
= is
->compressor
;
2634 stat
= is
->comp_stat
;
2637 compressor
= master
->compressor
;
2638 stat
= master
->comp_stat
;
2640 new_proto
= PPP_COMP
;
2644 printk(KERN_ERR
"isdn_ppp: No compressor set!\n");
2648 printk(KERN_ERR
"isdn_ppp: Compressor not initialized?\n");
2652 /* Allow for at least 150 % expansion (for now) */
2653 skb_out
= alloc_skb(skb_in
->len
+ skb_in
->len
/ 2 + 32 +
2654 skb_headroom(skb_in
), GFP_ATOMIC
);
2657 skb_reserve(skb_out
, skb_headroom(skb_in
));
2659 ret
= (compressor
->compress
)(stat
, skb_in
, skb_out
, *proto
);
2661 dev_kfree_skb(skb_out
);
2665 dev_kfree_skb(skb_in
);
2671 * we received a CCP frame ..
2672 * not a clean solution, but we MUST handle a few cases in the kernel
2674 static void isdn_ppp_receive_ccp(isdn_net_dev
*net_dev
, isdn_net_local
*lp
,
2675 struct sk_buff
*skb
, int proto
)
2677 struct ippp_struct
*is
;
2678 struct ippp_struct
*mis
;
2680 struct isdn_ppp_resetparams rsparm
;
2681 unsigned char rsdata
[IPPP_RESET_MAXDATABYTES
];
2683 printk(KERN_DEBUG
"Received CCP frame from peer slot(%d)\n",
2685 if (lp
->ppp_slot
< 0 || lp
->ppp_slot
>= ISDN_MAX_CHANNELS
) {
2686 printk(KERN_ERR
"%s: lp->ppp_slot(%d) out of range\n",
2687 __func__
, lp
->ppp_slot
);
2690 is
= ippp_table
[lp
->ppp_slot
];
2691 isdn_ppp_frame_log("ccp-rcv", skb
->data
, skb
->len
, 32, is
->unit
, lp
->ppp_slot
);
2694 int slot
= ISDN_MASTER_PRIV(lp
)->ppp_slot
;
2695 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
2696 printk(KERN_ERR
"%s: slot(%d) out of range\n",
2700 mis
= ippp_table
[slot
];
2704 switch (skb
->data
[0]) {
2706 if (is
->debug
& 0x10)
2707 printk(KERN_DEBUG
"Disable compression here!\n");
2708 if (proto
== PPP_CCP
)
2709 mis
->compflags
&= ~SC_COMP_ON
;
2711 is
->compflags
&= ~SC_LINK_COMP_ON
;
2715 if (is
->debug
& 0x10)
2716 printk(KERN_DEBUG
"Disable (de)compression here!\n");
2717 if (proto
== PPP_CCP
)
2718 mis
->compflags
&= ~(SC_DECOMP_ON
| SC_COMP_ON
);
2720 is
->compflags
&= ~(SC_LINK_DECOMP_ON
| SC_LINK_COMP_ON
);
2723 /* if we RECEIVE an ackowledge we enable the decompressor */
2724 if (is
->debug
& 0x10)
2725 printk(KERN_DEBUG
"Enable decompression here!\n");
2726 if (proto
== PPP_CCP
) {
2727 if (!mis
->decompressor
)
2729 mis
->compflags
|= SC_DECOMP_ON
;
2731 if (!is
->decompressor
)
2733 is
->compflags
|= SC_LINK_DECOMP_ON
;
2738 printk(KERN_DEBUG
"Received ResetAck from peer\n");
2739 len
= (skb
->data
[2] << 8) | skb
->data
[3];
2742 if (proto
== PPP_CCP
) {
2743 /* If a reset Ack was outstanding for this id, then
2744 clean up the state engine */
2745 isdn_ppp_ccp_reset_ack_rcvd(mis
, skb
->data
[1]);
2746 if (mis
->decompressor
&& mis
->decomp_stat
)
2748 reset(mis
->decomp_stat
,
2751 len
? &skb
->data
[4] : NULL
,
2753 /* TODO: This is not easy to decide here */
2754 mis
->compflags
&= ~SC_DECOMP_DISCARD
;
2757 isdn_ppp_ccp_reset_ack_rcvd(is
, skb
->data
[1]);
2758 if (is
->link_decompressor
&& is
->link_decomp_stat
)
2759 is
->link_decompressor
->
2760 reset(is
->link_decomp_stat
,
2763 len
? &skb
->data
[4] : NULL
,
2765 /* TODO: neither here */
2766 is
->compflags
&= ~SC_LINK_DECOMP_DISCARD
;
2771 printk(KERN_DEBUG
"Received ResetReq from peer\n");
2772 /* Receiving a ResetReq means we must reset our compressor */
2773 /* Set up reset params for the reset entry */
2774 memset(&rsparm
, 0, sizeof(rsparm
));
2775 rsparm
.data
= rsdata
;
2776 rsparm
.maxdlen
= IPPP_RESET_MAXDATABYTES
;
2777 /* Isolate data length */
2778 len
= (skb
->data
[2] << 8) | skb
->data
[3];
2780 if (proto
== PPP_CCP
) {
2781 if (mis
->compressor
&& mis
->comp_stat
)
2783 reset(mis
->comp_stat
,
2786 len
? &skb
->data
[4] : NULL
,
2790 if (is
->link_compressor
&& is
->link_comp_stat
)
2791 is
->link_compressor
->
2792 reset(is
->link_comp_stat
,
2795 len
? &skb
->data
[4] : NULL
,
2798 /* Ack the Req as specified by rsparm */
2800 /* Compressor reset handler decided how to answer */
2802 /* We should send a Frame */
2803 isdn_ppp_ccp_xmit_reset(is
, proto
, CCP_RESETACK
,
2804 rsparm
.idval
? rsparm
.id
2811 printk(KERN_DEBUG
"ResetAck suppressed\n");
2814 /* We answer with a straight reflected Ack */
2815 isdn_ppp_ccp_xmit_reset(is
, proto
, CCP_RESETACK
,
2817 len
? &skb
->data
[4] : NULL
,
2826 * Daemon sends a CCP frame ...
2829 /* TODO: Clean this up with new Reset semantics */
2831 /* I believe the CCP handling as-is is done wrong. Compressed frames
2832 * should only be sent/received after CCP reaches UP state, which means
2833 * both sides have sent CONF_ACK. Currently, we handle both directions
2834 * independently, which means we may accept compressed frames too early
2835 * (supposedly not a problem), but may also mean we send compressed frames
2836 * too early, which may turn out to be a problem.
2837 * This part of state machine should actually be handled by (i)pppd, but
2838 * that's too big of a change now. --kai
2841 /* Actually, we might turn this into an advantage: deal with the RFC in
2842 * the old tradition of beeing generous on what we accept, but beeing
2843 * strict on what we send. Thus we should just
2844 * - accept compressed frames as soon as decompression is negotiated
2845 * - send compressed frames only when decomp *and* comp are negotiated
2846 * - drop rx compressed frames if we cannot decomp (instead of pushing them
2848 * and I tried to modify this file according to that. --abp
2851 static void isdn_ppp_send_ccp(isdn_net_dev
*net_dev
, isdn_net_local
*lp
, struct sk_buff
*skb
)
2853 struct ippp_struct
*mis
, *is
;
2854 int proto
, slot
= lp
->ppp_slot
;
2855 unsigned char *data
;
2857 if (!skb
|| skb
->len
< 3)
2859 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
2860 printk(KERN_ERR
"%s: lp->ppp_slot(%d) out of range\n",
2864 is
= ippp_table
[slot
];
2865 /* Daemon may send with or without address and control field comp */
2867 if (!(is
->pppcfg
& SC_COMP_AC
) && data
[0] == 0xff && data
[1] == 0x03) {
2873 proto
= ((int)data
[0]<<8) + data
[1];
2874 if (proto
!= PPP_CCP
&& proto
!= PPP_CCPFRAG
)
2877 printk(KERN_DEBUG
"Received CCP frame from daemon:\n");
2878 isdn_ppp_frame_log("ccp-xmit", skb
->data
, skb
->len
, 32, is
->unit
, lp
->ppp_slot
);
2881 slot
= ISDN_MASTER_PRIV(lp
)->ppp_slot
;
2882 if (slot
< 0 || slot
>= ISDN_MAX_CHANNELS
) {
2883 printk(KERN_ERR
"%s: slot(%d) out of range\n",
2887 mis
= ippp_table
[slot
];
2891 printk(KERN_DEBUG
"isdn_ppp: Ouch! Master CCP sends on slave slot!\n");
2895 if (is
->debug
& 0x10)
2896 printk(KERN_DEBUG
"Disable decompression here!\n");
2897 if (proto
== PPP_CCP
)
2898 is
->compflags
&= ~SC_DECOMP_ON
;
2900 is
->compflags
&= ~SC_LINK_DECOMP_ON
;
2904 if (is
->debug
& 0x10)
2905 printk(KERN_DEBUG
"Disable (de)compression here!\n");
2906 if (proto
== PPP_CCP
)
2907 is
->compflags
&= ~(SC_DECOMP_ON
| SC_COMP_ON
);
2909 is
->compflags
&= ~(SC_LINK_DECOMP_ON
| SC_LINK_COMP_ON
);
2912 /* if we SEND an ackowledge we can/must enable the compressor */
2913 if (is
->debug
& 0x10)
2914 printk(KERN_DEBUG
"Enable compression here!\n");
2915 if (proto
== PPP_CCP
) {
2916 if (!is
->compressor
)
2918 is
->compflags
|= SC_COMP_ON
;
2920 if (!is
->compressor
)
2922 is
->compflags
|= SC_LINK_COMP_ON
;
2926 /* If we send a ACK we should reset our compressor */
2927 if (is
->debug
& 0x10)
2928 printk(KERN_DEBUG
"Reset decompression state here!\n");
2929 printk(KERN_DEBUG
"ResetAck from daemon passed by\n");
2930 if (proto
== PPP_CCP
) {
2931 /* link to master? */
2932 if (is
->compressor
&& is
->comp_stat
)
2933 is
->compressor
->reset(is
->comp_stat
, 0, 0,
2935 is
->compflags
&= ~SC_COMP_DISCARD
;
2938 if (is
->link_compressor
&& is
->link_comp_stat
)
2939 is
->link_compressor
->reset(is
->link_comp_stat
,
2940 0, 0, NULL
, 0, NULL
);
2941 is
->compflags
&= ~SC_LINK_COMP_DISCARD
;
2945 /* Just let it pass by */
2946 printk(KERN_DEBUG
"ResetReq from daemon passed by\n");
2951 int isdn_ppp_register_compressor(struct isdn_ppp_compressor
*ipc
)
2953 ipc
->next
= ipc_head
;
2956 ipc_head
->prev
= ipc
;
2962 int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor
*ipc
)
2965 ipc
->prev
->next
= ipc
->next
;
2967 ipc_head
= ipc
->next
;
2969 ipc
->next
->prev
= ipc
->prev
;
2970 ipc
->prev
= ipc
->next
= NULL
;
2974 static int isdn_ppp_set_compressor(struct ippp_struct
*is
, struct isdn_ppp_comp_data
*data
)
2976 struct isdn_ppp_compressor
*ipc
= ipc_head
;
2979 int num
= data
->num
;
2981 if (is
->debug
& 0x10)
2982 printk(KERN_DEBUG
"[%d] Set %s type %d\n", is
->unit
,
2983 (data
->flags
& IPPP_COMP_FLAG_XMIT
) ? "compressor" : "decompressor", num
);
2985 /* If is has no valid reset state vector, we cannot allocate a
2986 decompressor. The decompressor would cause reset transactions
2987 sooner or later, and they need that vector. */
2989 if (!(data
->flags
& IPPP_COMP_FLAG_XMIT
) && !is
->reset
) {
2990 printk(KERN_ERR
"ippp_ccp: no reset data structure - can't"
2991 " allow decompression.\n");
2996 if (ipc
->num
== num
) {
2997 stat
= ipc
->alloc(data
);
2999 ret
= ipc
->init(stat
, data
, is
->unit
, 0);
3001 printk(KERN_ERR
"Can't init (de)compression!\n");
3008 printk(KERN_ERR
"Can't alloc (de)compression!\n");
3012 if (data
->flags
& IPPP_COMP_FLAG_XMIT
) {
3013 if (data
->flags
& IPPP_COMP_FLAG_LINK
) {
3014 if (is
->link_comp_stat
)
3015 is
->link_compressor
->free(is
->link_comp_stat
);
3016 is
->link_comp_stat
= stat
;
3017 is
->link_compressor
= ipc
;
3021 is
->compressor
->free(is
->comp_stat
);
3022 is
->comp_stat
= stat
;
3023 is
->compressor
= ipc
;
3027 if (data
->flags
& IPPP_COMP_FLAG_LINK
) {
3028 if (is
->link_decomp_stat
)
3029 is
->link_decompressor
->free(is
->link_decomp_stat
);
3030 is
->link_decomp_stat
= stat
;
3031 is
->link_decompressor
= ipc
;
3034 if (is
->decomp_stat
)
3035 is
->decompressor
->free(is
->decomp_stat
);
3036 is
->decomp_stat
= stat
;
3037 is
->decompressor
= ipc
;