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