static int __net_init fib4_rules_init(struct net *net) { struct fib_table *local_table, *main_table; //分别为LOCAL和MAIN分配fib_table.. local_table = fib_hash_table(RT_TABLE_LOCAL); if (local_table == NULL) return -ENOMEM; main_table = fib_hash_table(RT_TABLE_MAIN); if (main_table == NULL) goto fail; //fib_table_hash为调用该函数时候分配的一个hash数组..也是只有2个数组项... //因此就是把fib_table分别添加到对应的hlist上.. hlist_add_head_rcu(&local_table->tb_hlist, &net->ipv4.fib_table_hash[TABLE_LOCAL_INDEX]); hlist_add_head_rcu(&main_table->tb_hlist, &net->ipv4.fib_table_hash[TABLE_MAIN_INDEX]); return 0; fail: kfree(local_table); return -ENOMEM; }
static int __net_init fib4_rules_init(struct net *net) { struct fib_table *local_table, *main_table; local_table = fib_hash_table(RT_TABLE_LOCAL); if (local_table == NULL) return -ENOMEM; main_table = fib_hash_table(RT_TABLE_MAIN); if (main_table == NULL) goto fail; hlist_add_head_rcu(&local_table->tb_hlist, &net->ipv4.fib_table_hash[TABLE_LOCAL_INDEX]); hlist_add_head_rcu(&main_table->tb_hlist, &net->ipv4.fib_table_hash[TABLE_MAIN_INDEX]); return 0; fail: kfree(local_table); return -ENOMEM; }
struct fib_table *fib_new_table(struct net *net, u32 id) { struct fib_table *tb; unsigned int h; if (id == 0) id = RT_TABLE_MAIN; tb = fib_get_table(net, id); if (tb) return tb; tb = fib_hash_table(id); if (!tb) return NULL; h = id & (FIB_TABLE_HASHSZ - 1); hlist_add_head_rcu(&tb->tb_hlist, &net->ipv4.fib_table_hash[h]); return tb; }