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,不知道我是哪里出了问题,请各位朋友指点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值