diff options
-rw-r--r-- | net/atm/Makefile | 3 | ||||
-rw-r--r-- | net/atm/br2684.c | 28 | ||||
-rw-r--r-- | net/atm/clip.c | 29 | ||||
-rw-r--r-- | net/atm/ipcommon.c | 63 | ||||
-rw-r--r-- | net/atm/ipcommon.h | 22 |
5 files changed, 47 insertions, 98 deletions
diff --git a/net/atm/Makefile b/net/atm/Makefile index 89656d6c0b90..cc50bd1ff1de 100644 --- a/net/atm/Makefile +++ b/net/atm/Makefile | |||
@@ -7,10 +7,7 @@ mpoa-objs := mpc.o mpoa_caches.o mpoa_proc.o | |||
7 | 7 | ||
8 | obj-$(CONFIG_ATM) += atm.o | 8 | obj-$(CONFIG_ATM) += atm.o |
9 | obj-$(CONFIG_ATM_CLIP) += clip.o | 9 | obj-$(CONFIG_ATM_CLIP) += clip.o |
10 | atm-$(subst m,y,$(CONFIG_ATM_CLIP)) += ipcommon.o | ||
11 | obj-$(CONFIG_ATM_BR2684) += br2684.o | 10 | obj-$(CONFIG_ATM_BR2684) += br2684.o |
12 | atm-$(subst m,y,$(CONFIG_ATM_BR2684)) += ipcommon.o | ||
13 | atm-$(subst m,y,$(CONFIG_NET_SCH_ATM)) += ipcommon.o | ||
14 | atm-$(CONFIG_PROC_FS) += proc.o | 11 | atm-$(CONFIG_PROC_FS) += proc.o |
15 | 12 | ||
16 | obj-$(CONFIG_ATM_LANE) += lec.o | 13 | obj-$(CONFIG_ATM_LANE) += lec.o |
diff --git a/net/atm/br2684.c b/net/atm/br2684.c index b04162f10d85..83a1c1b1d6cd 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c | |||
@@ -23,7 +23,6 @@ Author: Marcell GAL, 2000, XDSL Ltd, Hungary | |||
23 | #include <linux/atmbr2684.h> | 23 | #include <linux/atmbr2684.h> |
24 | 24 | ||
25 | #include "common.h" | 25 | #include "common.h" |
26 | #include "ipcommon.h" | ||
27 | 26 | ||
28 | /* | 27 | /* |
29 | * Define this to use a version of the code which interacts with the higher | 28 | * Define this to use a version of the code which interacts with the higher |
@@ -500,11 +499,12 @@ Note: we do not have explicit unassign, but look at _push() | |||
500 | */ | 499 | */ |
501 | int err; | 500 | int err; |
502 | struct br2684_vcc *brvcc; | 501 | struct br2684_vcc *brvcc; |
503 | struct sk_buff_head copy; | ||
504 | struct sk_buff *skb; | 502 | struct sk_buff *skb; |
503 | struct sk_buff_head *rq; | ||
505 | struct br2684_dev *brdev; | 504 | struct br2684_dev *brdev; |
506 | struct net_device *net_dev; | 505 | struct net_device *net_dev; |
507 | struct atm_backend_br2684 be; | 506 | struct atm_backend_br2684 be; |
507 | unsigned long flags; | ||
508 | 508 | ||
509 | if (copy_from_user(&be, arg, sizeof be)) | 509 | if (copy_from_user(&be, arg, sizeof be)) |
510 | return -EFAULT; | 510 | return -EFAULT; |
@@ -554,12 +554,30 @@ Note: we do not have explicit unassign, but look at _push() | |||
554 | brvcc->old_push = atmvcc->push; | 554 | brvcc->old_push = atmvcc->push; |
555 | barrier(); | 555 | barrier(); |
556 | atmvcc->push = br2684_push; | 556 | atmvcc->push = br2684_push; |
557 | skb_queue_head_init(©); | 557 | |
558 | skb_migrate(&sk_atm(atmvcc)->sk_receive_queue, ©); | 558 | rq = &sk_atm(atmvcc)->sk_receive_queue; |
559 | while ((skb = skb_dequeue(©)) != NULL) { | 559 | |
560 | spin_lock_irqsave(&rq->lock, flags); | ||
561 | if (skb_queue_empty(rq)) { | ||
562 | skb = NULL; | ||
563 | } else { | ||
564 | /* NULL terminate the list. */ | ||
565 | rq->prev->next = NULL; | ||
566 | skb = rq->next; | ||
567 | } | ||
568 | rq->prev = rq->next = (struct sk_buff *)rq; | ||
569 | rq->qlen = 0; | ||
570 | spin_unlock_irqrestore(&rq->lock, flags); | ||
571 | |||
572 | while (skb) { | ||
573 | struct sk_buff *next = skb->next; | ||
574 | |||
575 | skb->next = skb->prev = NULL; | ||
560 | BRPRIV(skb->dev)->stats.rx_bytes -= skb->len; | 576 | BRPRIV(skb->dev)->stats.rx_bytes -= skb->len; |
561 | BRPRIV(skb->dev)->stats.rx_packets--; | 577 | BRPRIV(skb->dev)->stats.rx_packets--; |
562 | br2684_push(atmvcc, skb); | 578 | br2684_push(atmvcc, skb); |
579 | |||
580 | skb = next; | ||
563 | } | 581 | } |
564 | __module_get(THIS_MODULE); | 582 | __module_get(THIS_MODULE); |
565 | return 0; | 583 | return 0; |
diff --git a/net/atm/clip.c b/net/atm/clip.c index 1c416934b7c1..5f8a1d222720 100644 --- a/net/atm/clip.c +++ b/net/atm/clip.c | |||
@@ -38,7 +38,6 @@ | |||
38 | 38 | ||
39 | #include "common.h" | 39 | #include "common.h" |
40 | #include "resources.h" | 40 | #include "resources.h" |
41 | #include "ipcommon.h" | ||
42 | #include <net/atmclip.h> | 41 | #include <net/atmclip.h> |
43 | 42 | ||
44 | 43 | ||
@@ -469,8 +468,9 @@ static struct net_device_stats *clip_get_stats(struct net_device *dev) | |||
469 | static int clip_mkip(struct atm_vcc *vcc, int timeout) | 468 | static int clip_mkip(struct atm_vcc *vcc, int timeout) |
470 | { | 469 | { |
471 | struct clip_vcc *clip_vcc; | 470 | struct clip_vcc *clip_vcc; |
472 | struct sk_buff_head copy; | ||
473 | struct sk_buff *skb; | 471 | struct sk_buff *skb; |
472 | struct sk_buff_head *rq; | ||
473 | unsigned long flags; | ||
474 | 474 | ||
475 | if (!vcc->push) | 475 | if (!vcc->push) |
476 | return -EBADFD; | 476 | return -EBADFD; |
@@ -490,10 +490,26 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout) | |||
490 | clip_vcc->old_pop = vcc->pop; | 490 | clip_vcc->old_pop = vcc->pop; |
491 | vcc->push = clip_push; | 491 | vcc->push = clip_push; |
492 | vcc->pop = clip_pop; | 492 | vcc->pop = clip_pop; |
493 | skb_queue_head_init(©); | 493 | |
494 | skb_migrate(&sk_atm(vcc)->sk_receive_queue, ©); | 494 | rq = &sk_atm(vcc)->sk_receive_queue; |
495 | |||
496 | spin_lock_irqsave(&rq->lock, flags); | ||
497 | if (skb_queue_empty(rq)) { | ||
498 | skb = NULL; | ||
499 | } else { | ||
500 | /* NULL terminate the list. */ | ||
501 | rq->prev->next = NULL; | ||
502 | skb = rq->next; | ||
503 | } | ||
504 | rq->prev = rq->next = (struct sk_buff *)rq; | ||
505 | rq->qlen = 0; | ||
506 | spin_unlock_irqrestore(&rq->lock, flags); | ||
507 | |||
495 | /* re-process everything received between connection setup and MKIP */ | 508 | /* re-process everything received between connection setup and MKIP */ |
496 | while ((skb = skb_dequeue(©)) != NULL) | 509 | while (skb) { |
510 | struct sk_buff *next = skb->next; | ||
511 | |||
512 | skb->next = skb->prev = NULL; | ||
497 | if (!clip_devs) { | 513 | if (!clip_devs) { |
498 | atm_return(vcc, skb->truesize); | 514 | atm_return(vcc, skb->truesize); |
499 | kfree_skb(skb); | 515 | kfree_skb(skb); |
@@ -506,6 +522,9 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout) | |||
506 | PRIV(skb->dev)->stats.rx_bytes -= len; | 522 | PRIV(skb->dev)->stats.rx_bytes -= len; |
507 | kfree_skb(skb); | 523 | kfree_skb(skb); |
508 | } | 524 | } |
525 | |||
526 | skb = next; | ||
527 | } | ||
509 | return 0; | 528 | return 0; |
510 | } | 529 | } |
511 | 530 | ||
diff --git a/net/atm/ipcommon.c b/net/atm/ipcommon.c deleted file mode 100644 index 1d3de42fada0..000000000000 --- a/net/atm/ipcommon.c +++ /dev/null | |||
@@ -1,63 +0,0 @@ | |||
1 | /* net/atm/ipcommon.c - Common items for all ways of doing IP over ATM */ | ||
2 | |||
3 | /* Written 1996-2000 by Werner Almesberger, EPFL LRC/ICA */ | ||
4 | |||
5 | |||
6 | #include <linux/module.h> | ||
7 | #include <linux/string.h> | ||
8 | #include <linux/skbuff.h> | ||
9 | #include <linux/netdevice.h> | ||
10 | #include <linux/in.h> | ||
11 | #include <linux/atmdev.h> | ||
12 | #include <linux/atmclip.h> | ||
13 | |||
14 | #include "common.h" | ||
15 | #include "ipcommon.h" | ||
16 | |||
17 | |||
18 | #if 0 | ||
19 | #define DPRINTK(format,args...) printk(KERN_DEBUG format,##args) | ||
20 | #else | ||
21 | #define DPRINTK(format,args...) | ||
22 | #endif | ||
23 | |||
24 | |||
25 | /* | ||
26 | * skb_migrate appends the list at "from" to "to", emptying "from" in the | ||
27 | * process. skb_migrate is atomic with respect to all other skb operations on | ||
28 | * "from" and "to". Note that it locks both lists at the same time, so to deal | ||
29 | * with the lock ordering, the locks are taken in address order. | ||
30 | * | ||
31 | * This function should live in skbuff.c or skbuff.h. | ||
32 | */ | ||
33 | |||
34 | |||
35 | void skb_migrate(struct sk_buff_head *from, struct sk_buff_head *to) | ||
36 | { | ||
37 | unsigned long flags; | ||
38 | struct sk_buff *skb_from = (struct sk_buff *) from; | ||
39 | struct sk_buff *skb_to = (struct sk_buff *) to; | ||
40 | struct sk_buff *prev; | ||
41 | |||
42 | if ((unsigned long) from < (unsigned long) to) { | ||
43 | spin_lock_irqsave(&from->lock, flags); | ||
44 | spin_lock_nested(&to->lock, SINGLE_DEPTH_NESTING); | ||
45 | } else { | ||
46 | spin_lock_irqsave(&to->lock, flags); | ||
47 | spin_lock_nested(&from->lock, SINGLE_DEPTH_NESTING); | ||
48 | } | ||
49 | prev = from->prev; | ||
50 | from->next->prev = to->prev; | ||
51 | prev->next = skb_to; | ||
52 | to->prev->next = from->next; | ||
53 | to->prev = from->prev; | ||
54 | to->qlen += from->qlen; | ||
55 | spin_unlock(&to->lock); | ||
56 | from->prev = skb_from; | ||
57 | from->next = skb_from; | ||
58 | from->qlen = 0; | ||
59 | spin_unlock_irqrestore(&from->lock, flags); | ||
60 | } | ||
61 | |||
62 | |||
63 | EXPORT_SYMBOL(skb_migrate); | ||
diff --git a/net/atm/ipcommon.h b/net/atm/ipcommon.h deleted file mode 100644 index d72165f60939..000000000000 --- a/net/atm/ipcommon.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* net/atm/ipcommon.h - Common items for all ways of doing IP over ATM */ | ||
2 | |||
3 | /* Written 1996-2000 by Werner Almesberger, EPFL LRC/ICA */ | ||
4 | |||
5 | |||
6 | #ifndef NET_ATM_IPCOMMON_H | ||
7 | #define NET_ATM_IPCOMMON_H | ||
8 | |||
9 | |||
10 | #include <linux/string.h> | ||
11 | #include <linux/skbuff.h> | ||
12 | #include <linux/netdevice.h> | ||
13 | #include <linux/atmdev.h> | ||
14 | |||
15 | /* | ||
16 | * Appends all skbs from "from" to "to". The operation is atomic with respect | ||
17 | * to all other skb operations on "from" or "to". | ||
18 | */ | ||
19 | |||
20 | void skb_migrate(struct sk_buff_head *from,struct sk_buff_head *to); | ||
21 | |||
22 | #endif | ||