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的时候对应默认网关。