免费注册 查看新帖 |

Chinaunix

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

我想用linux实现端口镜像,但是老出错,求高手指导。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-01 16:01 |只看该作者 |倒序浏览
我的linux内核2.6.30,带4块网卡,想实现端口镜像,但是老是死机。我把源码附上,望大神们帮我解决。
static int my_test_fun(struct sk_buff* skb, struct net_device* dev,  struct packet_type* pt)
{

        struct sk_buff *skclo = NULL;
        struct net_device *netdev = NULL;
        struct net *net = NULL;
        
        

        skclo = skb_clone(skb, GFP_ATOMIC);
        if (skclo == NULL)
                printk(KERN_ALERT"clone fialed.\n");
        else
        {
        netdev = dev_get_by_name(net, "eth1");
        if (netdev == NULL)
                 printk(KERN_ALERT"get device fialed.\n");
        else
        {
        skclo->dev = netdev;        
        
        if (0 > dev_queue_xmit(skclo))
                printk(KERN_ALERT"send fialed.\n");


        dev_put(skclo->dev);
        kfree_skb(skclo);
        }
        }
        return 0;
}用的是dev_add_packet添加的ETH_P_ALL。这个函数应该有问题。

论坛徽章:
0
2 [报告]
发表于 2011-07-02 22:57 |只看该作者
skb_clone后
如果netdev = dev_get_by_name(net, "eth1")失败则没有了kfree_skb;
函数应该一进入就检查dev_get_by_name;

你的代码事实上dev_get_by_name就有问题了。这里一定会死的(因为struct net *net = NULL)。
正确应该是dev_get_by_name(&init_net, "eth1");

dev_add_pack添加的hook_fun原型应该是
int xxxxx(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev);
但你编译没问题。my_test_fun是被包装的吗?

要实现端口镜像还有很多问题

论坛徽章:
0
3 [报告]
发表于 2011-07-03 17:04 |只看该作者
skb_clone后
如果netdev = dev_get_by_name(net, "eth1"失败则没有了kfree_skb;
函数应该一进入就检查de ...
奇门遁甲-lu 发表于 2011-07-02 22:57


那大哥能不能开放一部分源码,教教我们这些,并给大家一个知识增进。大哥说的dev_get_by_name(&init_net, "eth1");这个的第一个变量是从哪里来的,没定义使用的话会有错误吗?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2011-07-03 21:38 |只看该作者
回复 3# shirui33
init_net是struct net类型的内核全局变量。

论坛徽章:
0
5 [报告]
发表于 2013-08-19 17:12 |只看该作者
        if (0 > dev_queue_xmit(skclo))
                printk(KERN_ALERT"send fialed.\n");


        dev_put(skclo->dev);
        kfree_skb(skclo);

这里kfree_skb(skclo);会重复free,dev_queue_xmit(skclo)本身自带有free的功能,你这一直走下来,还会再一次free的。

论坛徽章:
0
6 [报告]
发表于 2013-08-20 13:43 |只看该作者
你看看tc的mirred这个action是不是符合你的要求,这个action有将一个网卡的流量redirect或者mirror到另外一个网卡的功能,不过只是针对ingress的流量,egress还没有实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP