免费注册 查看新帖 |

Chinaunix

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

继续 linux 实现端口镜像,有进展但是也有问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-18 11:31 |只看该作者 |倒序浏览
我的linux内核2.6.30,之前有求教过一些端口镜像的问题,经过改进后有很大进展,但是现在仍然有一个问题会引起死机。
现把问题公布出来,希望大家帮忙解决一下。
int my_test_fun(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
{

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

        netdev = dev_get_by_name(&init_net, "eth1");
        if (netdev == NULL)
        {
                 printk(KERN_ALERT"get device fialed.\n");
                 return -1;
         }
        skclo = skb_clone(skb, GFP_ATOMIC);
        if (skclo == NULL)
        {
                printk(KERN_ALERT"clone fialed.\n");
                return -1;
         }
      
        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_queue_xmit(skclo)这句上,一发送就死机,但是,当发送原始数据包,也就是不克隆的包时,就不会死机,也能正常发出去。用的是dev_add_packet添加的ETH_P_ALL。望高手指点一二。

论坛徽章:
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
2 [报告]
发表于 2011-07-18 12:16 |只看该作者
回复 1# shirui33
你镜像端口的流量,为什么还要发包啊

论坛徽章:
0
3 [报告]
发表于 2011-07-18 14:23 |只看该作者
你重复kfree_skb了。
dev_queue_xmit(skclo)一路下去就会调用kfree_skb(skclo)的。

论坛徽章:
0
4 [报告]
发表于 2011-07-18 14:39 |只看该作者
回复 2# Godbach


   我不只是镜像流量,我要监控,要数据包的镜像。

论坛徽章:
0
5 [报告]
发表于 2011-07-18 15:05 |只看该作者
回复 3# 奇门遁甲-lu

如你所说,根据你的修改 看上去已经解决了,而且,端口镜像也已经实现了,但是,当我挂载模块的同时调用本地浏览器去看网页时,会出现程序死机,而挂载模块的同时ping外部网关,则不会死机,是浏览器的程序有问题吗?,望大神继续在指导。

论坛徽章:
0
6 [报告]
发表于 2011-07-18 15:38 |只看该作者
楼主,QoS子系统中,有一个action就是mirror,不知道是不是拿来实现你这个功能的

  1. static int tcf_mirred(struct sk_buff *skb, struct tc_action *a,
  2.                       struct tcf_result *res)
  3. {
  4.         struct tcf_mirred *m = a->priv;
  5.         struct net_device *dev;
  6.         struct sk_buff *skb2 = NULL;
  7.         u32 at = G_TC_AT(skb->tc_verd);

  8.         spin_lock(&m->tcf_lock);

  9.         dev = m->tcfm_dev;
  10.         m->tcf_tm.lastuse = jiffies;

  11.         if (!(dev->flags&IFF_UP) ) {
  12.                 if (net_ratelimit())
  13.                         printk("mirred to Houston: device %s is gone!\n",
  14.                                dev->name);
  15. bad_mirred:
  16.                 if (skb2 != NULL)
  17.                         kfree_skb(skb2);
  18.                 m->tcf_qstats.overlimits++;
  19.                 m->tcf_bstats.bytes += qdisc_pkt_len(skb);
  20.                 m->tcf_bstats.packets++;
  21.                 spin_unlock(&m->tcf_lock);
  22.                 /* should we be asking for packet to be dropped?
  23.                  * may make sense for redirect case only
  24.                 */
  25.                 return TC_ACT_SHOT;
  26.         }

  27.         skb2 = skb_act_clone(skb, GFP_ATOMIC);
  28.         if (skb2 == NULL)
  29.                 goto bad_mirred;
  30.         if (m->tcfm_eaction != TCA_EGRESS_MIRROR &&
  31.             m->tcfm_eaction != TCA_EGRESS_REDIR) {
  32.                 if (net_ratelimit())
  33.                         printk("tcf_mirred unknown action %d\n",
  34.                                m->tcfm_eaction);
  35.                 goto bad_mirred;
  36.         }

  37.         m->tcf_bstats.bytes += qdisc_pkt_len(skb2);
  38.         m->tcf_bstats.packets++;
  39.         if (!(at & AT_EGRESS))
  40.                 if (m->tcfm_ok_push)
  41.                         skb_push(skb2, skb2->dev->hard_header_len);

  42.         /* mirror is always swallowed */
  43.         if (m->tcfm_eaction != TCA_EGRESS_MIRROR)
  44.                 skb2->tc_verd = SET_TC_FROM(skb2->tc_verd, at);

  45.         skb2->dev = dev;
  46.         skb2->iif = skb->dev->ifindex;
  47.         dev_queue_xmit(skb2);
  48.         spin_unlock(&m->tcf_lock);
  49.         return m->tcf_action;
  50. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2011-07-18 15:54 |只看该作者
回复 6# 独孤九贱


   大神说的是tc里面的吗?   直接用tc的话该怎么用呢?不知道这个函数怎么用,通过什么方式挂接到内核里。望大神详细指导。

论坛徽章:
0
8 [报告]
发表于 2011-07-18 16:17 |只看该作者
回复  奇门遁甲-lu

如你所说,根据你的修改 看上去已经解决了,而且,端口镜像也已经实现了,但是,当我 ...
shirui33 发表于 2011-07-18 15:05


目前,我测试了一下,很悲剧,不论是什么网络程序,跑一会立即死掉,日志上会有BUG:调度,当atomic。不知道 到底哪里出了问题,而且,在发包的时候,收到的包里也会有一些杂包,乱七八糟的不知道什么协议的包。

论坛徽章:
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
9 [报告]
发表于 2011-07-18 17:06 |只看该作者
回复  Godbach


   我不只是镜像流量,我要监控,要数据包的镜像。
shirui33 发表于 2011-07-18 14:39


你没有回答我的问题,为什么要调用 dev_queue_xmit 啊,你不是监控数据包吗?

论坛徽章:
0
10 [报告]
发表于 2011-07-18 17:35 |只看该作者
回复 9# Godbach


   端口镜像就是将所有数据包拷贝一份发送到另外一个端口,调用那个函数就是为了把拷贝的数据包发送到特定的镜像端口。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP