- 论坛徽章:
- 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;
}
上面是基本的代码,和出现bug时的截图。代码就是在模块里,抓到包之后转发到另一个网卡。但今天用冲流量的时候,过一段时间就会出现如上图所示的bug,我不知道我这边哪边写错了。另外我还有几个疑问,是关于skb—>users的,希望大虾们顺便帮解答下:
1.在第一个printk处,为什么抓到的包的skb->users有时候是1,有时候是2?我是不是在最后只调用kfree_skb一次就行?
2,skb_clone之后的新的sk_buff需要释放吗?该怎么释放掉?因为dev_queue_xmit之后,new_skb->users没有发生变化。但是我直接kfree_skb(new_skb)会出错。
新手一个,望各位大侠给解答下。 |
|