fn_zone结构
struct fn_zone {
struct fn_zone *fz_next;
struct hlist_head *fz_hash;
int fz_nent;
int fz_divisor;
u32 fz_hashmask;
#define FZ_HASHMASK(fz) ((fz)->fz_hashmask)
int fz_order;
__be32 fz_mask;
#define FZ_MASK(fz) ((fz)->fz_mask)
};
struct fn_zone *fz_next;//用于联系fz_zone链表的指针。
struct hlist_head *fz_hash;
//这个结构2.6版本才引入的,在2.4.x下是
struct fib_node **fz_hash;
//前面已经提到,2.6内核使用RCU的方式来管理双向链表,但是在2.4内核中,直接引入
一个fib_node的的链表头
int fz_nent;
//用于记录 fib_node结构的数目
int fz_order;
//记录了当前fz_zone结构在fz_hash中的位置
通过函数inet_make_mask来经由fz_order计算出相对应的fz_mask,
__u32 inet_make_mask(fz)
{
return htonl(~((1<<(32-fz))-1));
}
这样,如果fz_order = 0,那么fz_mask = 0x00000000,如果fz_order = 1,fz_mask = 0x80000000
正好和fz_hash中定义的子网掩码相同,fz_order=0的时候对应默认网关。