]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 beware | |
29 | * of potential deadlocks. | |
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 | { | |
1da177e4 LT |
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 | spin_lock_irqsave(&from->lock,flags); | |
43 | spin_lock(&to->lock); | |
44 | prev = from->prev; | |
45 | from->next->prev = to->prev; | |
46 | prev->next = skb_to; | |
47 | to->prev->next = from->next; | |
48 | to->prev = from->prev; | |
1da177e4 LT |
49 | to->qlen += from->qlen; |
50 | spin_unlock(&to->lock); | |
51 | from->prev = skb_from; | |
52 | from->next = skb_from; | |
53 | from->qlen = 0; | |
54 | spin_unlock_irqrestore(&from->lock,flags); | |
55 | } | |
56 | ||
57 | ||
58 | EXPORT_SYMBOL(skb_migrate); |