歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

LINUX內核關於IP分片重組問題請教

最近研究學習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,不知道我是哪裡出了問題,請各位朋友指點

Copyright © Linux教程網 All Rights Reserved