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