免费注册 查看新帖 |

Chinaunix

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

skb_copy的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-14 16:17 |只看该作者 |倒序浏览
想问一个问题,这是在ip_nat_core.c中的代码,

        /* raw socket (tcpdump) may have clone of incoming skb: don't
           disturb it --RR */
        if (skb_cloned(*pskb) && !(*pskb)->sk) {
                struct sk_buff *nskb = skb_copy(*pskb, GFP_ATOMIC);
                if (!nskb)
                        return NF_DROP;
                kfree_skb(*pskb);
                *pskb = nskb;
        }

在进行 skb_copy前为什么还要做  !(*pskb)->sk的判断,既然是被clone的报文,后续处理为有可能会修改该包,那么就该拷贝啊!
不明白 !(*pskb->sk 的意图。希望高手指点

论坛徽章:
0
2 [报告]
发表于 2010-07-15 01:06 |只看该作者
要修改skb,
注释很楚了,有些tcpdump或其他活动raw socket已经cloned了skb,
那么你就必须copy才能修改。不然,其他仔系统看到的data会改变;
skb_clone是复制skb控制块,共享data。同时skb->sk=NULL,脱离sk
一般cloned过的sk==null,

clone报文,一般不会修改报文,data还在共享呢。

论坛徽章:
0
3 [报告]
发表于 2010-07-15 16:42 |只看该作者
谢谢答复。

我知道skb_copy和skb_clone的区别,不过我认为既然是在ip层clone的包,就没有必要判断 (pskb->sk),因为skb_buff的sk是ip上层(tcp, UDP, ICMP) 的数据结构,
即IP层处理报文涉及不到sk结构体,内核这儿的条件判断语句是不是多余的呢? 不知道我有没有说明白!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP