免费注册 查看新帖 |

Chinaunix

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

[内核模块] skb_trim()问题讨论 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-09 16:35 |只看该作者 |倒序浏览
请问, skb_trim(skb,newlen)之后,数据发送到web服务器正常,接受数据也正常,但是,另外一个事情是,在此步骤之后,tcp会做一个重传,将trim掉的那些数据单独做一个数据包再发给web服务器,同时web服务器就报非法访问错误,请问是何故。

论坛徽章:
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
2 [报告]
发表于 2012-11-09 16:40 |只看该作者
回复 1# yh_tiger
skb_trim 是你自己的代码调用的吗

   

论坛徽章:
0
3 [报告]
发表于 2012-11-09 22:54 |只看该作者
谢谢版主,是的,是我自己调用的,我将skb的data区数据的中间删除了一部分,data区的数据就相应的网上挪,故data区至tail就会空出一片区域,我就用skb_trim()把这片空地给trim了,我抓包看了,数据发送接收都正常,但是tcp会出现重传,把我trim掉的那几个字符单独一个包发给web服务器, 当然web就响应我http 400,导致web服务器先回复我正常接着就回复我无效的请求。
下面就是我的删除的这点代码,麻烦你看看是不是有啥问题,还是需要设置其他的地方呢。
     httplen = httplen + offset - Jlen;
     skb_trim(skb,httplen);
     printk("httplen:%d skb->len:%d iph->tot_len:%d\n",httplen,skb->len,iph->tot_len);
     iph->tot_len = htons(skb->len);
     printk("iph->tot_len:%d truesize:%d\n",iph->tot_len,skb->truesize);     
    }
   //}
     //recompute checknum
     tcph->check = 0;
     (skb)->csum = skb_checksum(skb,iph->ihl<<2,(skb)->len - (iph->ihl<<2),0);
     tcph->check = csum_tcpudp_magic(saddr,daddr,(skb)->len - (iph->ihl<<2),IPPROTO_TCP,(skb)->csum);
     //(skb)->ip_summed = CHECKSUM_UNNECESSARY;
     ip_send_check(iph);

论坛徽章:
0
4 [报告]
发表于 2012-11-23 10:38 |只看该作者
yh_tiger 发表于 2012-11-09 22:54
谢谢版主,是的,是我自己调用的,我将skb的data区数据的中间删除了一部分,data区的数据就相应的网上挪,故 ...


你先看看,内核其它地方,别人是怎么用trim的

论坛徽章:
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 [报告]
发表于 2012-11-24 14:23 |只看该作者
回复 3# yh_tiger

其实你要做的操作就是将有效地数据内容做一些改变,data 和 tail 之间的调整吧,这个其实你直接改指针就行.

要用 skb_trim 的话,还是要搞清楚这个函数的实现。

   

论坛徽章:
0
6 [报告]
发表于 2012-12-02 15:16 |只看该作者
skb_trim(skb,len) 将包体截断为len字节
static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
{
        if (unlikely(skb_is_nonlinear(skb))) {
                WARN_ON(1);
                return;
        }
        skb->len = len;
        skb_set_tail_pointer(skb, len);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP