- 論壇徽章:
- 0
|
STATIC int ReflectPacket(
struct sk_buff *skb,
PRING_BLOCK Ring,
struct net_device *reflect_dev,
int displ)
{
struct sk_buff *new_skb;
if ((reflect_dev != NULL) &&
(reflect_dev->flags & IFF_UP)) {
int ret;
printk(KERN_ALERT"000skb->users:%d\n",skb->users);
new_skb = skb_clone(skb, GFP_ATOMIC);
printk(KERN_ALERT"111skb->users:%d\n",skb->users);
if(!new_skb)
return -1;
new_skb->pkt_type = PACKET_OUTGOING;
new_skb->dev = reflect_dev;
new_skb->protocol = ETH_P_ALL;
new_skb->priority = 1;
printk(KERN_ALERT"new_skb->users:%d\n",new_skb->users);
printk(KERN_ALERT"skb->users:%d\n",skb->users);
if (displ > 0)
skb_push(new_skb, displ);
ret = dev_queue_xmit(new_skb);
printk(KERN_ALERT"222new_skb->users:%d\n",new_skb->users);
printk(KERN_ALERT"222skb->users:%d\n",skb->users);
return ret == NETDEV_TX_OK ? 0 : -ENETDOWN;
}
return -1;
}
上面是基本的代碼,和出現(xiàn)bug時的截圖。代碼就是在模塊里,抓到包之后轉(zhuǎn)發(fā)到另一個網(wǎng)卡。但今天用沖流量的時候,過一段時間就會出現(xiàn)如上圖所示的bug,我不知道我這邊哪邊寫錯了。另外我還有幾個疑問,是關(guān)于skb—>users的,希望大蝦們順便幫解答下:
1.在第一個printk處,為什么抓到的包的skb->users有時候是1,有時候是2?我是不是在最后只調(diào)用kfree_skb一次就行?
2,skb_clone之后的新的sk_buff需要釋放嗎?該怎么釋放掉?因為dev_queue_xmit之后,new_skb->users沒有發(fā)生變化。但是我直接kfree_skb(new_skb)會出錯。
新手一個,望各位大俠給解答下。 |
|