LINUX内核关于IP分片重组问题请教

来源:网络发布时间:2010-02-24

  最近研究学习IP分片重组,也拜读了不少dx的阅读理解。可还是有疑问,请教xdm。

  源代码:linux-2.4.26\linux-2.4.26\net\ipv4\ip_fragment.c

  IP分片的重组大概经过以下几个函数:

  0/ ip_defrag

  1/ ip_find-->ip_frag_create-->ip_frag_intern

  2/ ip_frag_queue

  3/ ip_frag_reasm

  这里定义了一个结构,包括几个重组状态宏

  -------------------------------------

  /* Describe an entry in the "incomplete datagrams" queue. */

  struct ipq {

  struct ipq *next;  /* linked list pointers   */

  struct list_head lru_list; /* lru list member    */

  u32  saddr;

  u32  daddr;

  u16  id;

  u8  protocol;

  u8  last_in;

  #define COMPLETE  4

  #define FIRST_IN  2

  #define LAST_IN   1

  struct sk_buff *fragments; /* linked list of received fragments */

  int  len;  /* total length of original datagram */

  int  meat;

  spinlock_t lock;

  atomic_t refcnt;

  struct timer_list timer; /* when will this queue expire?  */

  struct ipq **pprev;

  int  iif;

  struct timeval stamp;

  };

  ---------------------------

  在处理过程当中有一个状态为COMPLETE(last_in),此状态下如果再来后续分片都被认为无效数据丢弃。可我就是没有看懂什么条件下设置last_in状态为COMPLETE呢?FIRST_IN/LAST_IN都容易理解的。通篇只在函数static struct ipq *ip_frag_intern(unsigned int hash, struct ipq *qp_in)

  看到了对last_in != COMPLETE的赋值。

  请研读过的xd明示。谢谢了!

  我只是看到几处对last_in是否等于COMPLETE的判断,而没有看到什么地方确定所有分片已经到齐而设置 last_in |= COMPLETE,不知道我是哪里出了问题,请各位朋友指点。