Linux内核分析 - 网络[十一]:ICMP模块
同样,开始时sk->sk_write_queue()为空,初始 的设置与上述例子完全相同,不同处在于datalen此时比最大分片还要大,因此要设置datalen=maxfraglen-fragheaderlen。 if (datalen > mtu - fragheaderlen) datalen = maxfraglen - fragheaderlen; 在完全第一个分片后,同样会将分片skb放入sk_write_queue队列,并进入 下一次while循环。此时各参数的值:datalen=496, fraglen=516, alloclen=516, skb->len=516, copy=488, offset=488, length=600-496=104, 更新transhdrlen=0。 __skb_queue_tail(&sk->sk_write_queue, skb); continue; 再次进入while循环,此时不同的是length=104,证明还有数据需要拷贝,此时会对待拷贝的数据进行判断 ,下面所指的填充满是针对maxfraglen而言的。 copy = mtu - skb->len; if (copy < length) copy = maxfraglen - skb->len; 分配新skb的流程与上个skb的分配过程相同,变化的只是偏移量offset,另外, icmp报头只存在于第一个分片中,因为它也属于IP内容的一部分,在这次拷贝完成后length=0,函数返回,最后结果如下: (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |