- 论坛徽章:
- 0
|
本帖最后由 dreamice 于 2011-03-08 17:24 编辑
各位大牛,帮帮我,帮我看一个问题。
用的操作系统是suse9,内核是2.6.5
我在做一个网卡转发包的功能模块,是直接在网卡驱动中修改的,修改的网卡驱动是e1000,主要是实现一块网卡接收数据包,然后由另一块网卡转发走。我将网卡的接收模式置成了混杂模式。
首先将A网卡收到的数据包存放到缓存区中,然后将缓存区中的数据包构造成sk_buff结构,sk_buff的设置如下:
skb_reserve(skb, 18);
skb->mac.raw = skb->data;//指向mac域
skb->nh.raw = skb->mac.raw + 14;
memcpy(skb->data, skb_blk, snd_length);//skb_blk是缓存区中保存原先数据包的内容,数据包内容里有完整的mac,ip等各个头信息
skb_put(skb, snd_length);
skb->pkt_type = PACKET_OTHERHOST;
skb->protocol = *(unsigned short *)(skb_blk + 12);
skb->ip_summed = CHECKSUM_NONE;
skb->priority = 0;
skb->len = snd_length;
skb->data_len = 0;
(1)然后直接调用发送函数dev_queue_xmit(skb)会出现死机现象。
(2)如果此时设置atomic_set(&skb->users, 0);再调用dev_queue_xmit(skb)不会死机,但是经过网卡的数据包过多时就是死机。
(3)如果调用skb->dev->hard_start_xmit(skb, skb->dev)这个函数的时候不会死机,但是数据包过多时就会死机,而且此时发现发送成功后的skb没有释放掉,于是我怀疑是内存泄漏,但是再释放skb,但是此时出现的现象是机器假死了,能ping通这台主机,但是不能对主机进行操作了
(4)如果设置atomic_set(&skb->users, 0);再调用skb->dev->hard_start_xmit(skb, skb->dev);然后再释放skb,此时不会死机,但是经过网卡的数据包过多时就会死机
请问根据上面的现象大概是哪里有可能有问题,谢谢了,这几天被这个问题困扰很久了,望大牛们帮帮忙 |
|