免费注册 查看新帖 |

Chinaunix

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

[网络子系统] ip_append_data和skb_copy_and_csum_bits的问题【已解决】 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-19 00:17 |只看该作者 |倒序浏览
本帖最后由 jiufei19 于 2014-03-19 15:39 编辑

内核版本v2.6.23

在对本地udp发送的数据调用ip_append_data函数进行预分段时,有如下调用关系

  int ip_append_data(struct sock *sk,
             int getfrag(void *from, char *to, int offset, int len,
                     int odd, struct sk_buff *skb),
             void *from, int length, int transhdrlen,
             struct ipcm_cookie *ipc, struct rtable *rt,
             unsigned int flags)
  {
      ...

      fraggap = skb_prev->len - maxfraglen;
      ...

      skb->csum = skb_copy_and_csum_bits(skb_prev, maxfraglen, data + transhdrlen, fraggap, 0);
      ...
   }

  __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
                      u8 *to, int len, __wsum csum)
  {
      int start = skb_headlen(skb);
      int i, copy = start - offset;// @offset == @maxfraglen --liub 08-10-5
      int pos = 0;
  
      /* Copy header. */
      if (copy > 0) {
          if (copy > len)
              copy = len;   
                    

          csum = csum_partial_copy_nocheck(skb->data + offset, to,
                           copy, csum);
          if ((len -= copy) == 0)
              return csum;
      ...
   }

我的问题是上述代码中红色字体的内容如何才能成立呢?因为copy变量是当前skb的主buffer中的数据长度减去maxfraglen后的值,而len变量是上述蓝色字体传入的fraggap,而我们又知道fraggap是skb->len减maxfraglen的值,而skb->len肯定是大于skb的主buffer中的数据长度的,所以怎么会有copy > len(部分大于整体的现象)的可能情况出现呢?

请大家解惑!

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
2 [报告]
发表于 2014-03-19 12:22 |只看该作者
That's an universal function not just be called in ip_append_data.
The red code won't be satisfyed under condition you assumed.

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
3 [报告]
发表于 2014-03-19 15:17 |只看该作者
回复 2# firkraag


    非常感谢firkraag的答复,我之前也曾经有过这个想法,但是只是粗略地搜索了下调用该函数的地方,没有仔细去了解还有哪些地方会调用该函数。firkraag非常确信有另外的地方调用该函数而一定会出现copy > len的情况吧?

论坛徽章:
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
4 [报告]
发表于 2014-03-19 15:30 |只看该作者
回复 3# jiufei19
调用的地方不少,如下:

include/linux/skbuff.h
2447:__wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, u8 *to,

net/ipv4/icmp.c
286:        csum = skb_copy_and_csum_bits(icmp_param->skb,

net/ipv4/tcp_output.c
1775:                        nskb->csum = skb_copy_and_csum_bits(skb, 0,

net/ipv4/ip_output.c
952:                                skb->csum = skb_copy_and_csum_bits(
1214:                                skb->csum = skb_copy_and_csum_bits(skb_prev,

net/sunrpc/socklib.c
57:        csum2 = skb_copy_and_csum_bits(desc->skb, pos, to, len, 0);

net/ipv6/icmp.c
287:        csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset,

net/ipv6/ip6_output.c
1387:                                skb->csum = skb_copy_and_csum_bits(

net/core/skbuff.c
2020:__wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
2080:                        csum2 = skb_copy_and_csum_bits(frag_iter,
2095:EXPORT_SYMBOL(skb_copy_and_csum_bits);
2198:                csum = skb_copy_and_csum_bits(skb, csstart, to + csstart,
2969:                        nskb->csum = skb_copy_and_csum_bits(skb, offset,



   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
5 [报告]
发表于 2014-03-19 15:35 |只看该作者
Yes. Like "tcp_mtu_probe".

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
6 [报告]
发表于 2014-03-19 15:39 |只看该作者
感谢版主和firkraag的答复

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
7 [报告]
发表于 2014-03-19 15:41 |只看该作者
回复 5# firkraag


    这里我想请firkraag帮我解答下我这里的这个问题:http://bbs.chinaunix.net/thread-4131240-1-2.html,不知是否可以?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP