Lines Matching refs:net
42 struct net *net; member
55 static struct fib6_info *fib6_find_prefix(struct net *net,
58 static struct fib6_node *fib6_repair_tree(struct net *net,
61 static int fib6_walk(struct net *net, struct fib6_walker *w);
73 #define FOR_WALKERS(net, w) \ argument
74 list_for_each_entry(w, &(net)->ipv6.fib6_walkers, lh)
76 static void fib6_walker_link(struct net *net, struct fib6_walker *w) in fib6_walker_link() argument
78 write_lock_bh(&net->ipv6.fib6_walker_lock); in fib6_walker_link()
79 list_add(&w->lh, &net->ipv6.fib6_walkers); in fib6_walker_link()
80 write_unlock_bh(&net->ipv6.fib6_walker_lock); in fib6_walker_link()
83 static void fib6_walker_unlink(struct net *net, struct fib6_walker *w) in fib6_walker_unlink() argument
85 write_lock_bh(&net->ipv6.fib6_walker_lock); in fib6_walker_unlink()
87 write_unlock_bh(&net->ipv6.fib6_walker_lock); in fib6_walker_unlink()
90 static int fib6_new_sernum(struct net *net) in fib6_new_sernum() argument
95 old = atomic_read(&net->ipv6.fib6_sernum); in fib6_new_sernum()
97 } while (atomic_cmpxchg(&net->ipv6.fib6_sernum, in fib6_new_sernum()
106 void fib6_update_sernum(struct net *net, struct fib6_info *f6i) in fib6_update_sernum() argument
113 WRITE_ONCE(fn->fn_sernum, fib6_new_sernum(net)); in fib6_update_sernum()
181 static struct fib6_node *node_alloc(struct net *net) in node_alloc() argument
187 net->ipv6.rt6_stats->fib_nodes++; in node_alloc()
192 static void node_free_immediate(struct net *net, struct fib6_node *fn) in node_free_immediate() argument
195 net->ipv6.rt6_stats->fib_nodes--; in node_free_immediate()
205 static void node_free(struct net *net, struct fib6_node *fn) in node_free() argument
208 net->ipv6.rt6_stats->fib_nodes--; in node_free()
217 static void fib6_link_table(struct net *net, struct fib6_table *tb) in fib6_link_table() argument
232 hlist_add_head_rcu(&tb->tb6_hlist, &net->ipv6.fib_table_hash[h]); in fib6_link_table()
237 static struct fib6_table *fib6_alloc_table(struct net *net, u32 id) in fib6_alloc_table() argument
245 net->ipv6.fib6_null_entry); in fib6_alloc_table()
253 struct fib6_table *fib6_new_table(struct net *net, u32 id) in fib6_new_table() argument
259 tb = fib6_get_table(net, id); in fib6_new_table()
263 tb = fib6_alloc_table(net, id); in fib6_new_table()
265 fib6_link_table(net, tb); in fib6_new_table()
271 struct fib6_table *fib6_get_table(struct net *net, u32 id) in fib6_get_table() argument
281 head = &net->ipv6.fib_table_hash[h]; in fib6_get_table()
294 static void __net_init fib6_tables_init(struct net *net) in fib6_tables_init() argument
296 fib6_link_table(net, net->ipv6.fib6_main_tbl); in fib6_tables_init()
297 fib6_link_table(net, net->ipv6.fib6_local_tbl); in fib6_tables_init()
301 struct fib6_table *fib6_new_table(struct net *net, u32 id) in fib6_new_table() argument
303 return fib6_get_table(net, id); in fib6_new_table()
306 struct fib6_table *fib6_get_table(struct net *net, u32 id) in fib6_get_table() argument
308 return net->ipv6.fib6_main_tbl; in fib6_get_table()
311 struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, in fib6_rule_lookup() argument
318 net, net->ipv6.fib6_main_tbl, fl6, skb, flags); in fib6_rule_lookup()
321 rt = net->ipv6.ip6_null_entry; in fib6_rule_lookup()
330 int fib6_lookup(struct net *net, int oif, struct flowi6 *fl6, in fib6_lookup() argument
333 return fib6_table_lookup(net, net->ipv6.fib6_main_tbl, oif, fl6, in fib6_lookup()
337 static void __net_init fib6_tables_init(struct net *net) in fib6_tables_init() argument
339 fib6_link_table(net, net->ipv6.fib6_main_tbl); in fib6_tables_init()
344 unsigned int fib6_tables_seq_read(struct net *net) in fib6_tables_seq_read() argument
350 struct hlist_head *head = &net->ipv6.fib_table_hash[h]; in fib6_tables_seq_read()
389 int call_fib6_entry_notifiers(struct net *net, in call_fib6_entry_notifiers() argument
400 return call_fib6_notifiers(net, event_type, &info.info); in call_fib6_entry_notifiers()
403 int call_fib6_multipath_entry_notifiers(struct net *net, in call_fib6_multipath_entry_notifiers() argument
416 return call_fib6_notifiers(net, event_type, &info.info); in call_fib6_multipath_entry_notifiers()
419 int call_fib6_entry_notifiers_replace(struct net *net, struct fib6_info *rt) in call_fib6_entry_notifiers_replace() argument
427 return call_fib6_notifiers(net, FIB_EVENT_ENTRY_REPLACE, &info.info); in call_fib6_entry_notifiers_replace()
431 struct net *net; member
441 if (!rt || rt == arg->net->ipv6.fib6_null_entry) in fib6_rt_dump()
465 static int fib6_table_dump(struct net *net, struct fib6_table *tb, in fib6_table_dump() argument
472 err = fib6_walk(net, w); in fib6_table_dump()
478 int fib6_tables_dump(struct net *net, struct notifier_block *nb, in fib6_tables_dump() argument
491 arg.net = net; in fib6_tables_dump()
497 struct hlist_head *head = &net->ipv6.fib_table_hash[h]; in fib6_tables_dump()
501 err = fib6_table_dump(net, tb, w); in fib6_tables_dump()
549 struct net *net = sock_net(cb->skb->sk); in fib6_dump_end() local
555 fib6_walker_unlink(net, w); in fib6_dump_end()
573 struct net *net = sock_net(skb->sk); in fib6_dump_table() local
586 res = fib6_walk(net, w); in fib6_dump_table()
608 fib6_walker_unlink(net, w); in fib6_dump_table()
621 struct net *net = sock_net(skb->sk); in inet6_dump_fib() local
632 err = ip_valid_fib_dump_req(net, nlh, &arg.filter, cb); in inet6_dump_fib()
663 arg.net = net; in inet6_dump_fib()
667 tb = fib6_get_table(net, arg.filter.table_id); in inet6_dump_fib()
690 head = &net->ipv6.fib_table_hash[h]; in inet6_dump_fib()
738 static struct fib6_node *fib6_add_1(struct net *net, in fib6_add_1() argument
792 net->ipv6.fib6_null_entry) { in fib6_add_1()
836 ln = node_alloc(net); in fib6_add_1()
877 in = node_alloc(net); in fib6_add_1()
878 ln = node_alloc(net); in fib6_add_1()
882 node_free_immediate(net, in); in fib6_add_1()
884 node_free_immediate(net, ln); in fib6_add_1()
929 ln = node_alloc(net); in fib6_add_1()
1025 struct net *net) in fib6_purge_rt() argument
1048 new_leaf = fib6_find_prefix(net, table, fn); in fib6_purge_rt()
1322 static void fib6_start_gc(struct net *net, struct fib6_info *rt) in fib6_start_gc() argument
1324 if (!timer_pending(&net->ipv6.ip6_fib_timer) && in fib6_start_gc()
1326 mod_timer(&net->ipv6.ip6_fib_timer, in fib6_start_gc()
1327 jiffies + net->ipv6.sysctl.ip6_rt_gc_interval); in fib6_start_gc()
1330 void fib6_force_start_gc(struct net *net) in fib6_force_start_gc() argument
1332 if (!timer_pending(&net->ipv6.ip6_fib_timer)) in fib6_force_start_gc()
1333 mod_timer(&net->ipv6.ip6_fib_timer, in fib6_force_start_gc()
1334 jiffies + net->ipv6.sysctl.ip6_rt_gc_interval); in fib6_force_start_gc()
1352 void fib6_update_sernum_upto_root(struct net *net, struct fib6_info *rt) in fib6_update_sernum_upto_root() argument
1354 __fib6_update_sernum_upto_root(rt, fib6_new_sernum(net)); in fib6_update_sernum_upto_root()
1358 void fib6_update_sernum_stub(struct net *net, struct fib6_info *f6i) in fib6_update_sernum_stub() argument
1361 fib6_update_sernum_upto_root(net, f6i); in fib6_update_sernum_stub()
1743 static struct fib6_info *fib6_find_prefix(struct net *net, in fib6_find_prefix() argument
1750 return net->ipv6.fib6_null_entry; in fib6_find_prefix()
1775 static struct fib6_node *fib6_repair_tree(struct net *net, in fib6_repair_tree() argument
1787 rcu_assign_pointer(fn->leaf, net->ipv6.fib6_null_entry); in fib6_repair_tree()
1832 new_fn_leaf = fib6_find_prefix(net, table, fn); in fib6_repair_tree()
1836 new_fn_leaf = net->ipv6.fib6_null_entry; in fib6_repair_tree()
1867 read_lock(&net->ipv6.fib6_walker_lock); in fib6_repair_tree()
1868 FOR_WALKERS(net, w) { in fib6_repair_tree()
1888 read_unlock(&net->ipv6.fib6_walker_lock); in fib6_repair_tree()
1890 node_free(net, fn); in fib6_repair_tree()
1907 struct net *net = info->nl_net; in fib6_del_route() local
1929 net->ipv6.rt6_stats->fib_rt_entries--; in fib6_del_route()
1930 net->ipv6.rt6_stats->fib_discarded_routes++; in fib6_del_route()
1957 read_lock(&net->ipv6.fib6_walker_lock); in fib6_del_route()
1958 FOR_WALKERS(net, w) { in fib6_del_route()
1967 read_unlock(&net->ipv6.fib6_walker_lock); in fib6_del_route()
1976 net->ipv6.rt6_stats->fib_route_nodes--; in fib6_del_route()
1978 fn = fib6_repair_tree(net, table, fn); in fib6_del_route()
1981 fib6_purge_rt(rt, fn, net); in fib6_del_route()
1985 call_fib6_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, in fib6_del_route()
1988 call_fib6_entry_notifiers_replace(net, replace_rt); in fib6_del_route()
1999 struct net *net = info->nl_net; in fib6_del() local
2005 if (rt == net->ipv6.fib6_null_entry) in fib6_del()
2150 static int fib6_walk(struct net *net, struct fib6_walker *w) in fib6_walk() argument
2157 fib6_walker_link(net, w); in fib6_walk()
2160 fib6_walker_unlink(net, w); in fib6_walk()
2170 .nl_net = c->net, in fib6_clean_node()
2221 static void fib6_clean_tree(struct net *net, struct fib6_node *root, in fib6_clean_tree() argument
2235 c.net = net; in fib6_clean_tree()
2238 fib6_walk(net, &c.w); in fib6_clean_tree()
2241 static void __fib6_clean_all(struct net *net, in __fib6_clean_all() argument
2251 head = &net->ipv6.fib_table_hash[h]; in __fib6_clean_all()
2254 fib6_clean_tree(net, &table->tb6_root, in __fib6_clean_all()
2262 void fib6_clean_all(struct net *net, int (*func)(struct fib6_info *, void *), in fib6_clean_all() argument
2265 __fib6_clean_all(net, func, FIB6_NO_SERNUM_CHANGE, arg, false); in fib6_clean_all()
2268 void fib6_clean_all_skip_notify(struct net *net, in fib6_clean_all_skip_notify() argument
2272 __fib6_clean_all(net, func, FIB6_NO_SERNUM_CHANGE, arg, true); in fib6_clean_all_skip_notify()
2275 static void fib6_flush_trees(struct net *net) in fib6_flush_trees() argument
2277 int new_sernum = fib6_new_sernum(net); in fib6_flush_trees()
2279 __fib6_clean_all(net, NULL, new_sernum, NULL, false); in fib6_flush_trees()
2313 void fib6_run_gc(unsigned long expires, struct net *net, bool force) in fib6_run_gc() argument
2319 spin_lock_bh(&net->ipv6.fib6_gc_lock); in fib6_run_gc()
2320 } else if (!spin_trylock_bh(&net->ipv6.fib6_gc_lock)) { in fib6_run_gc()
2321 mod_timer(&net->ipv6.ip6_fib_timer, jiffies + HZ); in fib6_run_gc()
2325 net->ipv6.sysctl.ip6_rt_gc_interval; in fib6_run_gc()
2328 fib6_clean_all(net, fib6_age, &gc_args); in fib6_run_gc()
2330 net->ipv6.ip6_rt_last_gc = now; in fib6_run_gc()
2333 mod_timer(&net->ipv6.ip6_fib_timer, in fib6_run_gc()
2335 + net->ipv6.sysctl.ip6_rt_gc_interval)); in fib6_run_gc()
2337 del_timer(&net->ipv6.ip6_fib_timer); in fib6_run_gc()
2338 spin_unlock_bh(&net->ipv6.fib6_gc_lock); in fib6_run_gc()
2343 struct net *arg = from_timer(arg, t, ipv6.ip6_fib_timer); in fib6_gc_timer_cb()
2348 static int __net_init fib6_net_init(struct net *net) in fib6_net_init() argument
2353 err = fib6_notifier_init(net); in fib6_net_init()
2357 spin_lock_init(&net->ipv6.fib6_gc_lock); in fib6_net_init()
2358 rwlock_init(&net->ipv6.fib6_walker_lock); in fib6_net_init()
2359 INIT_LIST_HEAD(&net->ipv6.fib6_walkers); in fib6_net_init()
2360 timer_setup(&net->ipv6.ip6_fib_timer, fib6_gc_timer_cb, 0); in fib6_net_init()
2362 net->ipv6.rt6_stats = kzalloc(sizeof(*net->ipv6.rt6_stats), GFP_KERNEL); in fib6_net_init()
2363 if (!net->ipv6.rt6_stats) in fib6_net_init()
2369 net->ipv6.fib_table_hash = kzalloc(size, GFP_KERNEL); in fib6_net_init()
2370 if (!net->ipv6.fib_table_hash) in fib6_net_init()
2373 net->ipv6.fib6_main_tbl = kzalloc(sizeof(*net->ipv6.fib6_main_tbl), in fib6_net_init()
2375 if (!net->ipv6.fib6_main_tbl) in fib6_net_init()
2378 net->ipv6.fib6_main_tbl->tb6_id = RT6_TABLE_MAIN; in fib6_net_init()
2379 rcu_assign_pointer(net->ipv6.fib6_main_tbl->tb6_root.leaf, in fib6_net_init()
2380 net->ipv6.fib6_null_entry); in fib6_net_init()
2381 net->ipv6.fib6_main_tbl->tb6_root.fn_flags = in fib6_net_init()
2383 inet_peer_base_init(&net->ipv6.fib6_main_tbl->tb6_peers); in fib6_net_init()
2386 net->ipv6.fib6_local_tbl = kzalloc(sizeof(*net->ipv6.fib6_local_tbl), in fib6_net_init()
2388 if (!net->ipv6.fib6_local_tbl) in fib6_net_init()
2390 net->ipv6.fib6_local_tbl->tb6_id = RT6_TABLE_LOCAL; in fib6_net_init()
2391 rcu_assign_pointer(net->ipv6.fib6_local_tbl->tb6_root.leaf, in fib6_net_init()
2392 net->ipv6.fib6_null_entry); in fib6_net_init()
2393 net->ipv6.fib6_local_tbl->tb6_root.fn_flags = in fib6_net_init()
2395 inet_peer_base_init(&net->ipv6.fib6_local_tbl->tb6_peers); in fib6_net_init()
2397 fib6_tables_init(net); in fib6_net_init()
2403 kfree(net->ipv6.fib6_main_tbl); in fib6_net_init()
2406 kfree(net->ipv6.fib_table_hash); in fib6_net_init()
2408 kfree(net->ipv6.rt6_stats); in fib6_net_init()
2410 fib6_notifier_exit(net); in fib6_net_init()
2414 static void fib6_net_exit(struct net *net) in fib6_net_exit() argument
2418 del_timer_sync(&net->ipv6.ip6_fib_timer); in fib6_net_exit()
2421 struct hlist_head *head = &net->ipv6.fib_table_hash[i]; in fib6_net_exit()
2431 kfree(net->ipv6.fib_table_hash); in fib6_net_exit()
2432 kfree(net->ipv6.rt6_stats); in fib6_net_exit()
2433 fib6_notifier_exit(net); in fib6_net_exit()
2532 struct net *net) in ipv6_route_seq_setup_walk() argument
2542 fib6_walker_link(net, &iter->w); in ipv6_route_seq_setup_walk()
2546 struct net *net) in ipv6_route_seq_next_table() argument
2561 hlist_first_rcu(&net->ipv6.fib_table_hash[h++])); in ipv6_route_seq_next_table()
2583 struct net *net = seq_file_net(seq); in ipv6_route_seq_next() local
2602 fib6_walker_unlink(net, &iter->w); in ipv6_route_seq_next()
2605 fib6_walker_unlink(net, &iter->w); in ipv6_route_seq_next()
2607 iter->tbl = ipv6_route_seq_next_table(iter->tbl, net); in ipv6_route_seq_next()
2611 ipv6_route_seq_setup_walk(iter, net); in ipv6_route_seq_next()
2618 struct net *net = seq_file_net(seq); in ipv6_route_seq_start() local
2622 iter->tbl = ipv6_route_seq_next_table(NULL, net); in ipv6_route_seq_start()
2628 ipv6_route_seq_setup_walk(iter, net); in ipv6_route_seq_start()
2644 struct net *net = seq_file_net(seq); in ipv6_route_native_seq_stop() local
2648 fib6_walker_unlink(net, &iter->w); in ipv6_route_native_seq_stop()