免费注册 查看新帖 |

Chinaunix

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

ETH_P_ALL hander的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-17 10:15 |只看该作者 |倒序浏览
我在本机上做了一个sniffer类似的module, 添加了一个ETH_P_ALL 的hander,我在此hander中做些统计操作,

现在的现象是  当我insmod的时候就无法浏览网页了, 只有rmmod之后才正常,

我的疑问:  在 netif_receive_skb的时候,如果ptype_all链表不空,则会调用我的hander处理,处理完之后,仍然会往下进行,特定的包还是会被特定的协议层去处理, 那就应该是可以正常浏览网页的阿, 不知道有什么问题, 请大家指教,  谢谢!

论坛徽章:
0
2 [报告]
发表于 2010-03-17 10:20 |只看该作者
我的code

ETH_P_ALL 的hander:
int        my_new_skb_recv (struct sk_buff * skb,struct net_device * net_dev,
                                        struct packet_type *pack_type,struct net_device *orig_dev)
{
        unsigned short prot;
        pepd tmp=NULL;
        struct kmem_cache *cache = epd_head_cache;
        struct ethhdr *eth_head = NULL;
        struct eth_pck_data  *newp, *last;
       
        if (net_dev->nd_net != &init_net)
                goto freeskb;

        prot = eth_type_trans(skb, net_dev);
       
        if(!(newp = have_this_type(prot,&last)))
        {
                tmp = (pepd)kmem_cache_alloc_node(cache, GFP_ATOMIC & ~__GFP_DMA, wc.node);
                if(!tmp)
                {
                        printk("no memory!\n");
                        return ENOMEM;
                }
                eth_head = eth_hdr(skb);

                memset(tmp,0,sizeof(epd));
                memcpy(tmp->de_mac_add,eth_head->h_dest,ETH_ALEN);
                memcpy(tmp->sr_mac_add,eth_head->h_source,ETH_ALEN);
                tmp->protcol = eth_head->h_proto;
                tmp->count++;
                tmp->next = NULL;

                if(!wc.phead)
                        wc.phead = tmp;
                else if(last)
                        last->next = tmp;
        }
        else
        {
                newp->count++;
        }
        return 0;
       
freeskb:
        kfree_skb(skb);
        return 0;
       
}

并且我加了打印, freeskb没有被调用。

论坛徽章:
0
3 [报告]
发表于 2010-03-17 11:05 |只看该作者
问题解决 了 ,  

没有仔细看一个内核 的函数 导致的

论坛徽章:
0
4 [报告]
发表于 2010-03-17 11:23 |只看该作者
这个 skb 需要在退出 handle 函数前被 kfree_skb 掉
否则 skb->users 被 deliver_skb 计数了,后续部分无法继续正常处理

你的问题是由于没有 kfree_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
5 [报告]
发表于 2010-03-17 11:24 |只看该作者
LZ可否分享一下出问题的地方?

论坛徽章:
0
6 [报告]
发表于 2010-03-17 12:37 |只看该作者
不是计数 的 问题


主要是对skb有进行了更改操作, 导致 skb->data ,skb->len 等已经不正确了

在tg3的 driver里面用了一次 eth_type_trans, 就不应该 再用了。

论坛徽章:
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 [报告]
发表于 2010-03-17 13:00 |只看该作者
不是计数 的 问题


主要是对skb有进行了更改操作, 导致 skb->data ,skb->len 等已经不正确了

在t ...
zhzhl555 发表于 2010-03-17 12:37

哦,是这样。砸你那个ptye_all里面,最好不好对数据包做什么修改,只读取

论坛徽章:
0
8 [报告]
发表于 2010-03-17 13:06 |只看该作者
不去释放引用计数也没有问题吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP