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,不知道我是哪里出了问题,请各位朋友指点相关阅读:
浅析SQL Server三大算法的I/O成本
用dom+xhtml+css制作的一个相册效果代码打包下载
利用javascript的面向对象的特性实现限制试用期
Linux系统下使用net send工具
远程访问MySQL数据库的方法小结
ExtJs使用IFrame的实现代码
Javascript 遍历对象中的子对象
获取远程flash并保存到本地
php读取30天之内的根据算法排序的代码
史上最全的MySQL备份方法
让MySQL数据库跑的更快 为数据减肥
jsp2.0新特性
ubuntu8.04系统混音的解决
MySQL入门学习(4)