Chinaunix

标题: ip_frag_reasm分片重组的问题 [打印本页]

作者: remaper    时间: 2013-06-20 18:15
标题: ip_frag_reasm分片重组的问题
内核版本:2.6.32.34

在ip_frag_reasm函数里,如下:

  1.         /* Make the one we just received the head. */
  2.         if (prev) {
  3.                 head = prev->next;
  4.                 fp = skb_clone(head, GFP_ATOMIC);
  5.                 if (!fp)
  6.                         goto out_nomem;

  7.                 fp->next = head->next;
  8.                 prev->next = fp;

  9.                 skb_morph(head, qp->q.fragments);
  10.                 head->next = qp->q.fragments->next;

  11.                 kfree_skb(qp->q.fragments);
  12.                 qp->q.fragments = head;
  13.         }
复制代码
请问这里为什么要克隆刚才刚收到的skb?看这里的的代码,克隆后,还要将这个skb放到q.fragments,why? why? why?
作者: 卖萌犯法    时间: 2013-06-21 09:27
首先,LZ需要明白,ip_frag_reasm这个函数不会把重组完成后的报文链返回,而是强制使当前收到的skb成为First分片。First分片即分片队列链表首,First分片在所有分片重组完成后,将携带整个分片队列。

这样做的好处是,上层不需要知道分片队列的存在,分片队列重组后,已经隐藏在当前接收的skb内部,以便于后续处理的连贯性。

分析代码可知,只有在当前接收的skb不是First分片的时候,才会这样做(对于First分片,参数prev指针为空)。





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