Chinaunix

标题: skb_trim()问题讨论 [打印本页]

作者: yh_tiger    时间: 2012-11-09 16:35
标题: skb_trim()问题讨论
请问, skb_trim(skb,newlen)之后,数据发送到web服务器正常,接受数据也正常,但是,另外一个事情是,在此步骤之后,tcp会做一个重传,将trim掉的那些数据单独做一个数据包再发给web服务器,同时web服务器就报非法访问错误,请问是何故。
作者: Godbach    时间: 2012-11-09 16:40
回复 1# yh_tiger
skb_trim 是你自己的代码调用的吗

   
作者: yh_tiger    时间: 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);

作者: finalfantasy000    时间: 2012-11-23 10:38
yh_tiger 发表于 2012-11-09 22:54
谢谢版主,是的,是我自己调用的,我将skb的data区数据的中间删除了一部分,data区的数据就相应的网上挪,故 ...


你先看看,内核其它地方,别人是怎么用trim的
作者: Godbach    时间: 2012-11-24 14:23
回复 3# yh_tiger

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

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

   
作者: SCDXMOE    时间: 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);
}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2