| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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); |