新建一个ipq结构的实例作为由ipfrag结构组成的双向
链表的头结点,创建成功后首先修改this_host所指向
的ip_frag_mem为ipq结构的大小(其初始值在创建hostfrags
结构时设置为0),设置其成员变量如下:
分配72(64字节的IP包头――IP包头最长为15*4=60字节,
这里分配了64字节――和8字节的ICMP首部数据)字节
内存作为ip包头并使ipq.iph指向其首地址,并将分片数
据中的IP头加8字节数据(可能是ICMP首部数据)复制
到ipq.iph中,
更新this_host-> ip_frag_mem(即this_host-> ip_frag_mem += 72)
使其始终表示现已分配给当前分片包的字节数;
ipq.ihlen设置为实际的IP包头长;
ipq.len和ipq.fragments设置为0;
ipq.hf设置为this_host,即该分片包所属的主机信息;
设置该ipq所对应的IP分片包的失效期限ipq.timer. expires
为当前时间加IP_FRAG_TIME(大约为30秒);
设置ipq.timer.data为该ipq的地址(在系统收到一个IP分片包后
的30秒再没有收到任何和它属于同一IP包的分片数据时,
系统会丢弃那些属于同一个IP包但未完成的IP分片重组
的数据,系统会根据ipq.timer.data来释放资源);
ipq.timer.function指向该ipq失效时的处理函数,该函数用来释放资源;
ipq.timer设置完后将它加入到系统内的时间链表中;