Chinaunix
标题:
请教:如何把skb_copy的新skb放回链中继续传送?
[打印本页]
作者:
simon_qwl
时间:
2007-10-06 13:41
标题:
请教:如何把skb_copy的新skb放回链中继续传送?
如题,这问题已经折磨我几天了,求各位大牛指点迷津啊
作者:
CUDev
时间:
2007-10-06 14:58
替换掉原来的sk_buff。
static inline struct sk_buff *skb_unshare(struct sk_buff *skb,
gfp_t pri)
{
might_sleep_if(pri & __GFP_WAIT);
if (skb_cloned(skb)) {
struct sk_buff *nskb = skb_copy(skb, pri);
kfree_skb(skb); /* Free our shared copy */
skb = nskb;
}
return skb;
}
复制代码
作者:
CUDev
时间:
2007-10-06 15:15
可以看一下skb_queue_head
可以参考:
http://www.lslnet.com/linux/dosc1/54/linux-361227.htm
SKB_QUEUE_HEAD(9) Linux Networking SKB_QUEUE_HEAD(9)
NAME
skb_queue_head - queue a buffer at the list head
SYNOPSIS
void skb_queue_head(struct sk_buff_head * list, struct sk_buff * newsk);
ARGUMENTS
list
list to use
newsk
buffer to queue
DESCRIPTION
Queue a buffer at the start of the list. This function takes the list lock and can be used safely with other
locking &sk_buff functions safely.
A buffer cannot be placed on two lists at the same time.
COPYRIGHT
Kernel Hackers Manual July 2007 SKB_QUEUE_HEAD(9)
复制代码
作者:
simon_qwl
时间:
2007-10-06 17:42
我试着用skb_queue_head()如下:
new_skb = skb_copy(old_skb, GFP_ATOMIC);
if(new_skb){
skb_unlink(new_skb);
skb_queue_head(old_skb->list,new_skb);
return NF_DROP;
}
return NF_ACCEPT;
复制代码
可是一执行insmod就死机,以为象"A buffer cannot be placed on two lists at the same time." 的原因,所以加了一个 skb_unlink(new_skb);在前面,可以问题依旧,是不是方法用错了?
作者:
deadlylight
时间:
2007-10-09 11:45
要给出你的上下文,你是在什么地方copy的?你想让新的skb和老的skb同时从当前点继续往下走么?
作者:
simon_qwl
时间:
2007-10-26 12:09
我是在检测到我要的数据包以后(通过IP/PORT),就用skb_copy。
对,之后我就是想发送多个skb继续往下走。
作者:
dreamice
时间:
2009-03-13 00:00
这个问题有答案吗?
作者:
mtx99
时间:
2012-03-15 14:54
这个问题有答案吗?
我也遇到了这个问题;
我skb_copy 一个数据包 暂存以下,等下一个相关的包 到达后接到这个暂存包里面, 然后需要把这个暂存的包 继续走协议栈,
不知道怎么实现
作者:
zhouunix
时间:
2012-07-25 16:35
mtx99 发表于 2012-03-15 14:54
这个问题有答案吗?
我也遇到了这个问题;
不知有没有解决,同问啊。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2