- 论坛徽章:
- 1
|
本帖最后由 jiufei19 于 2014-03-19 15:39 编辑
内核版本v2.6.23
在对本地udp发送的数据调用ip_append_data函数进行预分段时,有如下调用关系
int ip_append_data(struct sock *sk,
int getfrag(void *from, char *to, int offset, int len,
int odd, struct sk_buff *skb),
void *from, int length, int transhdrlen,
struct ipcm_cookie *ipc, struct rtable *rt,
unsigned int flags)
{
...
fraggap = skb_prev->len - maxfraglen;
...
skb->csum = skb_copy_and_csum_bits(skb_prev, maxfraglen, data + transhdrlen, fraggap, 0);
...
}
__wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
u8 *to, int len, __wsum csum)
{
int start = skb_headlen(skb);
int i, copy = start - offset;// @offset == @maxfraglen --liub 08-10-5
int pos = 0;
/* Copy header. */
if (copy > 0) {
if (copy > len)
copy = len;
csum = csum_partial_copy_nocheck(skb->data + offset, to,
copy, csum);
if ((len -= copy) == 0)
return csum;
...
}
我的问题是上述代码中红色字体的内容如何才能成立呢?因为copy变量是当前skb的主buffer中的数据长度减去maxfraglen后的值,而len变量是上述蓝色字体传入的fraggap,而我们又知道fraggap是skb->len减maxfraglen的值,而skb->len肯定是大于skb的主buffer中的数据长度的,所以怎么会有copy > len(部分大于整体的现象)的可能情况出现呢?
请大家解惑! |
|