最近研究学习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,不知道我是哪里出了问题,请各位朋友指点。