免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 大侠们,帮我看看我这个网卡转发的代码是什么问题,谢谢了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-24 20:50 |只看该作者 |倒序浏览
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)会出错。

新手一个,望各位大侠给解答下。

snapshot6.png (15.34 KB, 下载次数: 50)

snapshot6.png

论坛徽章:
0
2 [报告]
发表于 2013-06-24 20:53 |只看该作者
不知道是不是流量过大,还是因为有内存没有释放掉,导致的上图中的内容不停地打印出来,无法停止。

论坛徽章:
0
3 [报告]
发表于 2013-06-25 08:07 |只看该作者
介个,没人帮看看嘛

论坛徽章:
0
4 [报告]
发表于 2013-06-25 10:36 |只看该作者
没见过这个现象,可以肯定的是:

不需要调用 kfree_skb ,dev_queue_xmit 自带 kfree_skb,无论它成功失败。

new_skb->protocol = ETH_P_ALL;
这句什么意思?  ETH_P_ALL 只用于packet_type,不作为协议类型。

new_skb->pkt_type = PACKET_OUTGOING;
这句不需要你来设置,dev_queue_xmit 自己会按需要设置,目的是告诉接收者 packet_all ,这是一个发送帧

我想问问,ReflectPacket 是从何处开始调用的。
如果调用不当,可能会造成内部风暴,从而耗尽cache(SLUB),当然,也有可能是流量过大,而耗尽缓存。

论坛徽章:
0
5 [报告]
发表于 2013-06-25 13:15 |只看该作者
谢谢解答。调用是在dev_add_pack注册的回调里,前面简单的判断下是不是回环设备的包,不是的话,就调用这个函数了,没做什么了。还有个疑问,dev_queue_xmit 发送之后users没有减小啊,说明它没有释放吧?回复 4# 卖萌犯法


   

论坛徽章:
0
6 [报告]
发表于 2013-06-25 13:54 |只看该作者
想问下:

调用是在dev_add_pack注册的回调里,前面简单的判断下是不是回环设备的包


1.dev_add_pack调用前,是否设置了packet_type.dev,来指定接收设备?
2.判断环回设备同时,是否判断了“skb->pkt_type == PACKET_OUTGOING”,来过滤发送设备?


没有看过实际代码,会不会出现下面的情况呢:

|-> dev1 -> ReflectPacket -> dev2 -> ReflectPacket  -> dev2 -> ……

应当首先排除这种错误的可能

另:如果users没有变化,可能说明该skb没有完成发送,可能会被重新调度,也有可能已经kfree_skb 了,只是users 由于其他部分的引用而被+1

无论如何, dev_queue_xmit 成功发送之后,是一定会kfree_skb 的,这点不需要担心,即使它不亲自释放,也会委托其他机制来释放

论坛徽章:
0
7 [报告]
发表于 2013-06-25 14:24 |只看该作者
packet_type.dev没有指定,但是在代码里判断过是不是指定的那两张网卡,如果都不是就返回了。
PACKET_OUTGOING也判断过了,PACKET_OUTGOING也会返回。所以,你说的那种类似回环的错误应该不会出现。而且这个bug也不是什么时候都能出现,昨天是测试过一段时间才出现的。
还有一个疑问,就是进入ReflectPacket的skb为什么有时候是1,有时候是2?那我在ReflectPacket返回之后只调用一次kfree_skb合适吗?用不用调用2次?回复 6# 卖萌犯法


   

论坛徽章:
0
8 [报告]
发表于 2013-06-25 16:22 |只看该作者
而且这个bug也不是什么时候都能出现,昨天是测试过一段时间才出现的。

如果不是周期出现的话,应该是流量高峰导致的问题。

还有一个疑问,就是进入ReflectPacket的skb为什么有时候是1,有时候是2?那我在ReflectPacket返回之后只调用一次kfree_skb合适吗?用不用调用2次?

如果skb进入ReflectPacket之前还被别的处理过程引用过就会是2,ReflectPacket 只能调用一次kfree_skb,来释放源skb(被克隆的skb)

论坛徽章:
0
9 [报告]
发表于 2013-06-26 18:22 |只看该作者
谢谢热心回答,今天测试了下,貌似没再出过问题。谢谢了,解了我很多的疑惑。回复 8# 卖萌犯法


   

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
10 [报告]
发表于 2013-06-26 20:23 |只看该作者
回复 9# FlankerSky


    楼主 问题是怎么解决的啊  也说来让我们学习哈撒
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP