忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
楼主: cjCares

[网络子系统] 向tcp报文新增数据后,如何避免接收方校验和出错 [复制链接]

论坛徽章:
0
发表于 2018-03-06 09:18 |显示全部楼层
回复 9# Godbach

static int ip_local_deliver_finish(structnet *net, struct sock*sk, struct sk_buff*skb)
{
      __skb_pull(skb,skb_network_header_len(skb));

      if(ip_hdr(skb)->protocol==6){
          __skb_pull(skb,sizeof("hello world"));
      }
      rcu_read_lock();
      {
             int protocol= ip_hdr(skb)->protocol;
             const struct net_protocol*ipprot;
             int raw;
      resubmit:
             raw = raw_local_deliver(skb,protocol);

论坛徽章:
0
发表于 2018-03-06 14:35 |显示全部楼层
回复 9# Godbach

static int ip_local_deliver_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
{
        __skb_pull(skb, skb_network_header_len(skb));

        if(ip_hdr(skb)->protocol==6){
              __skb_pull(skb,sizeof("hello world")));
        }

        rcu_read_lock();
        {
                int protocol = ip_hdr(skb)->protocol;
                const struct net_protocol *ipprot;
                int raw;

        resubmit:
                raw = raw_local_deliver(skb, protocol);

论坛徽章:
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
发表于 2018-03-06 20:15 |显示全部楼层
回复 12# cjCares
我觉得这样不太稳妥。既然你加了数据,到这里为何不直接把这部分数据删掉呢。这样才是真正还原回来了。

论坛徽章:
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
发表于 2018-03-06 20:18 |显示全部楼层
回复 12# cjCares

这个是个干扰数据。要清理掉。这个数据是有可能导致 TCP 或者 IP 层的其他处理环节误判的。

论坛徽章:
0
发表于 2018-03-06 21:08 |显示全部楼层
回复 14# Godbach

skb_pull不应该就是把数据删除了吗?

论坛徽章:
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
发表于 2018-03-07 11:46 |显示全部楼层
回复 15# cjCares

这个只是移动 data 指向的起始位置,不是真正的移除数据。整个 IP 报文中,你加的这一块数据仍然存在。

论坛徽章:
0
发表于 2018-03-07 15:11 |显示全部楼层
回复 16# Godbach

好的,谢谢!还有一个疑问,我加了自定义部分的报文接受时skb->ip_summed为0,正常的报文值为1,这个值是在哪个函数里面赋值成1的啊?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
发表于 2018-03-08 18:59 |显示全部楼层
回复 17# cjCares

1. 0 是CHECKSUM_NONE吧,表示或者checksum 是bad 或者 硬件不支持校验。但是有个问题,我看skb_checksum_init的代码,好像是NONE的时候,必定回返回0,也就是不会到csum_error那
你确定是从那里退出的吗?

2. 你11L贴的代码对吗?
我看在那个rcu lock 之前还有个reset_transport_header吧?如果没有的话肯定有问题吧

3. 还有我觉得没法把数据移走吧?除非重新分配skb的data 或者移动data,那样就不好了。
其实我觉得你这种应该是类似tunnel,不用移除数据应该是可以实现的,但是协议栈太复杂了,说不定那个地方没改好。

4. 你抓包试过吗?



论坛徽章:
0
发表于 2018-03-09 11:00 |显示全部楼层
回复 18# goingstudy

1. 0 是CHECKSUM_NONE,我确定是从skb_checksum_init里退出的,你可能记错了吧。我看的源码是这样的:
      if (skb->ip_summed == CHECKSUM_COMPLETE) {
        if (!csum_fold(csum_add(psum, skb->csum))) {
                skb->csum_valid = 1;
                return 0;
         }
     } else if (skb->csum_bad) {
        /* ip_summed == CHECKSUM_NONE in this case */
        return (__force __sum16)1;
     }
2.reset_transport_header我写了的,上面忘记加了,获取的tcp头信息都是对的
3.应该是哪里没改好,感觉还是ip_summed的问题吧,但是找不到它的值在哪变化的
4.我就用wireshark抓了包,但是那上面直接把插入的数据当成tcp头了,信息都不对。我现在都是在内核里用printk打印各个字段,有点麻烦,还可以怎么抓包分析啊?


谢谢指导!



论坛徽章:
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
发表于 2018-03-09 12:09 |显示全部楼层
回复 17# cjCares

搜下内核代码,找下赋值的地方。太细节的,记不太不清楚。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP