Lines Matching refs:w
43 struct fib6_walker w; member
63 static int fib6_walk(struct net *net, struct fib6_walker *w);
64 static int fib6_walk_continue(struct fib6_walker *w);
75 #define FOR_WALKERS(net, w) \ argument
76 list_for_each_entry(w, &(net)->ipv6.fib6_walkers, lh)
78 static void fib6_walker_link(struct net *net, struct fib6_walker *w) in fib6_walker_link() argument
81 list_add(&w->lh, &net->ipv6.fib6_walkers); in fib6_walker_link()
85 static void fib6_walker_unlink(struct net *net, struct fib6_walker *w) in fib6_walker_unlink() argument
88 list_del(&w->lh); in fib6_walker_unlink()
467 static int fib6_node_dump(struct fib6_walker *w) in fib6_node_dump() argument
471 err = fib6_rt_dump(w->leaf, w->args); in fib6_node_dump()
472 w->leaf = NULL; in fib6_node_dump()
477 struct fib6_walker *w) in fib6_table_dump() argument
481 w->root = &tb->tb6_root; in fib6_table_dump()
483 err = fib6_walk(net, w); in fib6_table_dump()
493 struct fib6_walker *w; in fib6_tables_dump() local
497 w = kzalloc(sizeof(*w), GFP_ATOMIC); in fib6_tables_dump()
498 if (!w) in fib6_tables_dump()
501 w->func = fib6_node_dump; in fib6_tables_dump()
505 w->args = &arg; in fib6_tables_dump()
512 err = fib6_table_dump(net, tb, w); in fib6_tables_dump()
519 kfree(w); in fib6_tables_dump()
525 static int fib6_dump_node(struct fib6_walker *w) in fib6_dump_node() argument
530 for_each_fib6_walker_rt(w) { in fib6_dump_node()
531 res = rt6_dump_route(rt, w->args, w->skip_in_node); in fib6_dump_node()
534 w->leaf = rt; in fib6_dump_node()
539 w->skip_in_node += res; in fib6_dump_node()
543 w->skip_in_node = 0; in fib6_dump_node()
555 w->leaf = NULL; in fib6_dump_node()
562 struct fib6_walker *w = (void *)cb->args[2]; in fib6_dump_end() local
564 if (w) { in fib6_dump_end()
567 fib6_walker_unlink(net, w); in fib6_dump_end()
570 kfree(w); in fib6_dump_end()
586 struct fib6_walker *w; in fib6_dump_table() local
589 w = (void *)cb->args[2]; in fib6_dump_table()
590 w->root = &table->tb6_root; in fib6_dump_table()
593 w->count = 0; in fib6_dump_table()
594 w->skip = 0; in fib6_dump_table()
595 w->skip_in_node = 0; in fib6_dump_table()
598 res = fib6_walk(net, w); in fib6_dump_table()
602 cb->args[5] = READ_ONCE(w->root->fn_sernum); in fib6_dump_table()
605 int sernum = READ_ONCE(w->root->fn_sernum); in fib6_dump_table()
609 w->state = FWS_INIT; in fib6_dump_table()
610 w->node = w->root; in fib6_dump_table()
611 w->skip = w->count; in fib6_dump_table()
612 w->skip_in_node = 0; in fib6_dump_table()
614 w->skip = 0; in fib6_dump_table()
617 res = fib6_walk_continue(w); in fib6_dump_table()
620 fib6_walker_unlink(net, w); in fib6_dump_table()
639 struct fib6_walker *w; in inet6_dump_fib() local
656 w = (void *)cb->args[2]; in inet6_dump_fib()
657 if (!w) { in inet6_dump_fib()
662 w = kzalloc(sizeof(*w), GFP_ATOMIC); in inet6_dump_fib()
663 if (!w) { in inet6_dump_fib()
667 w->func = fib6_dump_node; in inet6_dump_fib()
668 cb->args[2] = (long)w; in inet6_dump_fib()
680 w->args = &arg; in inet6_dump_fib()
1841 struct fib6_walker *w; in fib6_repair_tree() local
1927 FOR_WALKERS(net, w) { in fib6_repair_tree()
1929 if (w->node == fn) { in fib6_repair_tree()
1931 w, w->state, nstate); in fib6_repair_tree()
1932 w->node = pn; in fib6_repair_tree()
1933 w->state = nstate; in fib6_repair_tree()
1936 if (w->node == fn) { in fib6_repair_tree()
1937 w->node = child; in fib6_repair_tree()
1940 w, w->state); in fib6_repair_tree()
1941 w->state = w->state >= FWS_R ? FWS_U : FWS_INIT; in fib6_repair_tree()
1944 w, w->state); in fib6_repair_tree()
1945 w->state = w->state >= FWS_C ? FWS_U : FWS_INIT; in fib6_repair_tree()
1966 struct fib6_walker *w; in fib6_del_route() local
2019 FOR_WALKERS(net, w) { in fib6_del_route()
2020 if (w->state == FWS_C && w->leaf == rt) { in fib6_del_route()
2021 pr_debug("walker %p adjusted by delroute\n", w); in fib6_del_route()
2022 w->leaf = rcu_dereference_protected(rt->fib6_next, in fib6_del_route()
2024 if (!w->leaf) in fib6_del_route()
2025 w->state = FWS_U; in fib6_del_route()
2121 static int fib6_walk_continue(struct fib6_walker *w) in fib6_walk_continue() argument
2126 WARN_ON_ONCE(!(w->root->fn_flags & RTN_TL_ROOT)); in fib6_walk_continue()
2129 fn = w->node; in fib6_walk_continue()
2133 switch (w->state) { in fib6_walk_continue()
2137 w->node = FIB6_SUBTREE(fn); in fib6_walk_continue()
2140 w->state = FWS_L; in fib6_walk_continue()
2146 w->node = left; in fib6_walk_continue()
2147 w->state = FWS_INIT; in fib6_walk_continue()
2150 w->state = FWS_R; in fib6_walk_continue()
2155 w->node = right; in fib6_walk_continue()
2156 w->state = FWS_INIT; in fib6_walk_continue()
2159 w->state = FWS_C; in fib6_walk_continue()
2160 w->leaf = rcu_dereference_protected(fn->leaf, 1); in fib6_walk_continue()
2163 if (w->leaf && fn->fn_flags & RTN_RTINFO) { in fib6_walk_continue()
2166 if (w->skip) { in fib6_walk_continue()
2167 w->skip--; in fib6_walk_continue()
2171 err = w->func(w); in fib6_walk_continue()
2175 w->count++; in fib6_walk_continue()
2179 w->state = FWS_U; in fib6_walk_continue()
2182 if (fn == w->root) in fib6_walk_continue()
2187 w->node = pn; in fib6_walk_continue()
2191 w->state = FWS_L; in fib6_walk_continue()
2196 w->state = FWS_R; in fib6_walk_continue()
2200 w->state = FWS_C; in fib6_walk_continue()
2201 w->leaf = rcu_dereference_protected(w->node->leaf, 1); in fib6_walk_continue()
2211 static int fib6_walk(struct net *net, struct fib6_walker *w) in fib6_walk() argument
2215 w->state = FWS_INIT; in fib6_walk()
2216 w->node = w->root; in fib6_walk()
2218 fib6_walker_link(net, w); in fib6_walk()
2219 res = fib6_walk_continue(w); in fib6_walk()
2221 fib6_walker_unlink(net, w); in fib6_walk()
2225 static int fib6_clean_node(struct fib6_walker *w) in fib6_clean_node() argument
2229 struct fib6_cleaner *c = container_of(w, struct fib6_cleaner, w); in fib6_clean_node()
2236 READ_ONCE(w->node->fn_sernum) != c->sernum) in fib6_clean_node()
2237 WRITE_ONCE(w->node->fn_sernum, c->sernum); in fib6_clean_node()
2241 w->leaf = NULL; in fib6_clean_node()
2245 for_each_fib6_walker_rt(w) { in fib6_clean_node()
2248 w->leaf = rt; in fib6_clean_node()
2269 w->leaf = rt; in fib6_clean_node()
2288 c.w.root = root; in fib6_clean_tree()
2289 c.w.func = fib6_clean_node; in fib6_clean_tree()
2290 c.w.count = 0; in fib6_clean_tree()
2291 c.w.skip = 0; in fib6_clean_tree()
2292 c.w.skip_in_node = 0; in fib6_clean_tree()
2299 fib6_walk(net, &c.w); in fib6_clean_tree()
2615 iter->w.leaf = NULL; in ipv6_route_native_seq_show()
2619 static int ipv6_route_yield(struct fib6_walker *w) in ipv6_route_yield() argument
2621 struct ipv6_route_iter *iter = w->args; in ipv6_route_yield()
2627 iter->w.leaf = rcu_dereference_protected( in ipv6_route_yield()
2628 iter->w.leaf->fib6_next, in ipv6_route_yield()
2631 if (!iter->skip && iter->w.leaf) in ipv6_route_yield()
2633 } while (iter->w.leaf); in ipv6_route_yield()
2641 memset(&iter->w, 0, sizeof(iter->w)); in ipv6_route_seq_setup_walk()
2642 iter->w.func = ipv6_route_yield; in ipv6_route_seq_setup_walk()
2643 iter->w.root = &iter->tbl->tb6_root; in ipv6_route_seq_setup_walk()
2644 iter->w.state = FWS_INIT; in ipv6_route_seq_setup_walk()
2645 iter->w.node = iter->w.root; in ipv6_route_seq_setup_walk()
2646 iter->w.args = iter; in ipv6_route_seq_setup_walk()
2647 iter->sernum = READ_ONCE(iter->w.root->fn_sernum); in ipv6_route_seq_setup_walk()
2648 INIT_LIST_HEAD(&iter->w.lh); in ipv6_route_seq_setup_walk()
2649 fib6_walker_link(net, &iter->w); in ipv6_route_seq_setup_walk()
2675 int sernum = READ_ONCE(iter->w.root->fn_sernum); in ipv6_route_check_sernum()
2679 iter->w.state = FWS_INIT; in ipv6_route_check_sernum()
2680 iter->w.node = iter->w.root; in ipv6_route_check_sernum()
2681 WARN_ON(iter->w.skip); in ipv6_route_check_sernum()
2682 iter->w.skip = iter->w.count; in ipv6_route_check_sernum()
2704 r = fib6_walk_continue(&iter->w); in ipv6_route_seq_next()
2707 return iter->w.leaf; in ipv6_route_seq_next()
2709 fib6_walker_unlink(net, &iter->w); in ipv6_route_seq_next()
2712 fib6_walker_unlink(net, &iter->w); in ipv6_route_seq_next()
2744 struct fib6_walker *w = &iter->w; in ipv6_route_iter_active() local
2745 return w->node && !(w->state == FWS_U && w->node == w->root); in ipv6_route_iter_active()
2755 fib6_walker_unlink(net, &iter->w); in ipv6_route_native_seq_stop()
2785 iter->w.leaf = NULL; in ipv6_route_seq_show()