日期:2014-05-16  浏览次数:20741 次

关于skb的问题
有个问题,我在NF_IP_POST_ROUTING这个钩子点写了个模块,要在原有基础上加上自己的一段数据。如果tailroom不足,我会重新创建一个sk_buff结果,代码如下:
struct sk_buff* new_skb;
new_skb = alloc_skb(skb_headroom(*pskb) + (*pskb)->len + SIZE + sizeof(ch) , GFP_ATOMIC);
skb_reserve(new_skb,skb_headroom(*pskb));
if(!new_skb){
printk("Skb allocation is failed!\n");
return NF_ACCEPT;
}
memcpy(skb_put(new_skb, (*pskb)->len),(*pskb)->data,(*pskb)->len);
kfree_skb((*pskb));
*pskb = new_skb;

*pskb 指向的是原来的一个sk_buff包。
SIZE 是我要传输的数据大小。
我这么创建以后,内核无法正常运行了,会发出OOPS信息。我觉得是我新创建的sk_buff结构没有保留原来结构的某些信息所导致的,请问哪些sk_buff的信息是我新结构应该保留的呢?

------解决方案--------------------
你的第一条语句是什么意思?
不是要增加size的数据吗?
我没记错的话,skb_trim这个函数应该是减小尾部空间的吧?