免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8069 | 回复: 19
打印 上一主题 下一主题

关于一块网卡收包,另一块网卡转发数据包的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-07 16:48 |只看该作者 |倒序浏览
本帖最后由 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,此时不会死机,但是经过网卡的数据包过多时就会死机
请问根据上面的现象大概是哪里有可能有问题,谢谢了,这几天被这个问题困扰很久了,望大牛们帮帮忙

论坛徽章:
0
2 [报告]
发表于 2011-03-07 16:50 |只看该作者
图中那个发出来是一个表情的,其实是数字8

论坛徽章:
0
3 [报告]
发表于 2011-03-07 17:15 |只看该作者
本帖最后由 shank941 于 2011-03-07 17:19 编辑
各位大牛,帮帮我,帮我看一个问题。
用的操作系统是suse9,内核是2.6.5
我在做一个网卡转发包的功能模块 ...
Arm_Linux_boy 发表于 2011-03-07 16:48


1.死机是什么现象?crash了?还是只是驱动不转发了?如果只是网卡不转发,可以把网卡的BD状态打印出来看看bd状态。
2.是直接在驱动层就调用skb->dev->hard_start_xmit转发了么,还是会经过上层协议栈的?
3.另外看到你直接设置引用计数和内存泄漏问题,我猜没释放可能是哪里的引用计数出问题了(kfree_skb只有引用计数为1时才释放),直接set 0 肯定不行,人家还用着呢,你直接set 0给强行free 了。。。
4.方便的话,最好是把代码都放上来。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2011-03-07 17:20 |只看该作者
回复 1# Arm_Linux_boy


   
主要是实现一块网卡接收数据包,然后由另一块网卡转发走

你的代码中体现了 有另一块网卡发出的设置了吗?

论坛徽章:
0
5 [报告]
发表于 2011-03-07 18:50 |只看该作者
回复 3# shank941
(1)系统是直接crash掉的
(2)直接通过skb->dev->hard_start_xmit转发和通过dev_queue_xmit转发的我都有做过,出现的现象我也列在上面了。
(3)对于引用计数,如果不设置为0的话,dev_queue_xmit的调用就会直接死机,如果不设置的话,只能使用skb->dev->hard_start_xmit
不会死机,但是内存泄漏问题就出现了,数据包多了电脑又死机了。如果在skb->dev->hard_start_xmit发生完数据包之后调用kfree_skb将skb释放掉的话就会造成假死问题,能ping主机,但是不能进行操作。

论坛徽章:
0
6 [报告]
发表于 2011-03-07 18:53 |只看该作者
回复 4# Godbach
skb->dev = e_dev;e_dev里面就是用来发送的网卡指针。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2011-03-07 18:59 |只看该作者
你是在什么下测试的,有 Oops 信息吗。还是一发包就死了,什么都没有

论坛徽章:
0
8 [报告]
发表于 2011-03-07 19:15 |只看该作者
当我不设置引用计数为0的时候,直接调用skb->dev->hard_start_xmit(skb, skb->dev)来发送数据包的时候
出现以下的oops信息:
linux kernel: invalid operand: 0000 [1] SMP

然后紧接着就死机了,也ping不同主机

论坛徽章:
0
9 [报告]
发表于 2011-03-07 19:50 |只看该作者
回复 3# shank941
如果引用计数是1,然后skb发送结束后又没有被释放,这时候我来主动用kfree_skb来释放skb,此时就会出现那种假死印象。
应该在什么情况下可以较安全地释放skb?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
10 [报告]
发表于 2011-03-07 20:16 |只看该作者
你的 oops 信息不够全啊。建议你找个虚拟机测试,这样便于保存 oops 信息
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP