忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 720 | 回复: 1

[内核模块] 数据包修改checksum错误 [复制链接]

论坛徽章:
0
发表于 2017-08-01 13:45 |显示全部楼层
各位大神,我在实现一个修改数据包ip功能的内核模块,使用nf_hook_ops钩子的方式,有两个钩子,一个是在NF_INET_PRE_ROUTING位置,另外一个是在NF_INET_POST_ROUTING位置,NF_INET_POST_ROUTING我搞定了。
但是NF_INET_PRE_ROUTING总是checksum错误。代码如下:

iph = ip_hdr(skb);
tcph = (void*) iph+ iph->ihl * 4;

tot_len = ntohs(iph->tot_len);

if(iph->protocol == IPPOTO_TCP)
{
   if( tcph->soource == htons(22210) && iph->saddr == htonl(svr_ip) )
   {
       iph_len       = ip_hdrlen(skb);
       iph->daddr = in_aton("10.1.52.220");

       tcph->check = 0;
       skb->csum = csum_partial((char*)(tcph,tot_len - iph_len,0);
       tcph->check = tcp_v4_check(tot_len-iph_len,iph->saddr,ip->daddr,skb->csum);

       iph->check = 0;
       ip_send_check(iph);

       return NF_ACCEPT;
    }
}

调试了好久,不知道是哪里的问题,建立连接和断开正常,就是接收数据和ack会失败,请大神们帮忙看看,十分感激!

论坛徽章:
0
发表于 2017-08-03 09:43 |显示全部楼层
终于解决了,使用csum_replace4()更新ip的csum,inet_proto_csum_replace4()更新tcp的csum,最后skb->csum=0;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP