Lines Matching refs:w

41 	struct fib6_walker w;  member
61 static int fib6_walk(struct net *net, struct fib6_walker *w);
62 static int fib6_walk_continue(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
79 list_add(&w->lh, &net->ipv6.fib6_walkers); in fib6_walker_link()
83 static void fib6_walker_unlink(struct net *net, struct fib6_walker *w) in fib6_walker_unlink() argument
86 list_del(&w->lh); in fib6_walker_unlink()
413 static int fib6_node_dump(struct fib6_walker *w) in fib6_node_dump() argument
417 for_each_fib6_walker_rt(w) in fib6_node_dump()
418 fib6_rt_dump(rt, w->args); in fib6_node_dump()
419 w->leaf = NULL; in fib6_node_dump()
424 struct fib6_walker *w) in fib6_table_dump() argument
426 w->root = &tb->tb6_root; in fib6_table_dump()
428 fib6_walk(net, w); in fib6_table_dump()
436 struct fib6_walker *w; in fib6_tables_dump() local
439 w = kzalloc(sizeof(*w), GFP_ATOMIC); in fib6_tables_dump()
440 if (!w) in fib6_tables_dump()
443 w->func = fib6_node_dump; in fib6_tables_dump()
446 w->args = &arg; in fib6_tables_dump()
453 fib6_table_dump(net, tb, w); in fib6_tables_dump()
456 kfree(w); in fib6_tables_dump()
461 static int fib6_dump_node(struct fib6_walker *w) in fib6_dump_node() argument
466 for_each_fib6_walker_rt(w) { in fib6_dump_node()
467 res = rt6_dump_route(rt, w->args, w->skip_in_node); in fib6_dump_node()
470 w->leaf = rt; in fib6_dump_node()
475 w->skip_in_node += res; in fib6_dump_node()
479 w->skip_in_node = 0; in fib6_dump_node()
491 w->leaf = NULL; in fib6_dump_node()
498 struct fib6_walker *w = (void *)cb->args[2]; in fib6_dump_end() local
500 if (w) { in fib6_dump_end()
503 fib6_walker_unlink(net, w); in fib6_dump_end()
506 kfree(w); in fib6_dump_end()
522 struct fib6_walker *w; in fib6_dump_table() local
525 w = (void *)cb->args[2]; in fib6_dump_table()
526 w->root = &table->tb6_root; in fib6_dump_table()
529 w->count = 0; in fib6_dump_table()
530 w->skip = 0; in fib6_dump_table()
531 w->skip_in_node = 0; in fib6_dump_table()
534 res = fib6_walk(net, w); in fib6_dump_table()
538 cb->args[5] = w->root->fn_sernum; in fib6_dump_table()
541 if (cb->args[5] != w->root->fn_sernum) { in fib6_dump_table()
543 cb->args[5] = w->root->fn_sernum; in fib6_dump_table()
544 w->state = FWS_INIT; in fib6_dump_table()
545 w->node = w->root; in fib6_dump_table()
546 w->skip = w->count; in fib6_dump_table()
547 w->skip_in_node = 0; in fib6_dump_table()
549 w->skip = 0; in fib6_dump_table()
552 res = fib6_walk_continue(w); in fib6_dump_table()
555 fib6_walker_unlink(net, w); in fib6_dump_table()
571 struct fib6_walker *w; in inet6_dump_fib() local
589 w = (void *)cb->args[2]; in inet6_dump_fib()
590 if (!w) { in inet6_dump_fib()
601 w = kzalloc(sizeof(*w), GFP_ATOMIC); in inet6_dump_fib()
602 if (!w) in inet6_dump_fib()
604 w->func = fib6_dump_node; in inet6_dump_fib()
605 cb->args[2] = (long)w; in inet6_dump_fib()
611 w->args = &arg; in inet6_dump_fib()
1711 struct fib6_walker *w; in fib6_repair_tree() local
1793 FOR_WALKERS(net, w) { in fib6_repair_tree()
1795 if (w->node == fn) { in fib6_repair_tree()
1796 RT6_TRACE("W %p adjusted by delnode 1, s=%d/%d\n", w, w->state, nstate); in fib6_repair_tree()
1797 w->node = pn; in fib6_repair_tree()
1798 w->state = nstate; in fib6_repair_tree()
1801 if (w->node == fn) { in fib6_repair_tree()
1802 w->node = child; in fib6_repair_tree()
1804 RT6_TRACE("W %p adjusted by delnode 2, s=%d\n", w, w->state); in fib6_repair_tree()
1805 w->state = w->state >= FWS_R ? FWS_U : FWS_INIT; in fib6_repair_tree()
1807 RT6_TRACE("W %p adjusted by delnode 2, s=%d\n", w, w->state); in fib6_repair_tree()
1808 w->state = w->state >= FWS_C ? FWS_U : FWS_INIT; in fib6_repair_tree()
1828 struct fib6_walker *w; in fib6_del_route() local
1862 FOR_WALKERS(net, w) { in fib6_del_route()
1863 if (w->state == FWS_C && w->leaf == rt) { in fib6_del_route()
1864 RT6_TRACE("walker %p adjusted by delroute\n", w); in fib6_del_route()
1865 w->leaf = rcu_dereference_protected(rt->fib6_next, in fib6_del_route()
1867 if (!w->leaf) in fib6_del_route()
1868 w->state = FWS_U; in fib6_del_route()
1952 static int fib6_walk_continue(struct fib6_walker *w) in fib6_walk_continue() argument
1957 WARN_ON_ONCE(!(w->root->fn_flags & RTN_TL_ROOT)); in fib6_walk_continue()
1960 fn = w->node; in fib6_walk_continue()
1964 switch (w->state) { in fib6_walk_continue()
1968 w->node = FIB6_SUBTREE(fn); in fib6_walk_continue()
1971 w->state = FWS_L; in fib6_walk_continue()
1977 w->node = left; in fib6_walk_continue()
1978 w->state = FWS_INIT; in fib6_walk_continue()
1981 w->state = FWS_R; in fib6_walk_continue()
1986 w->node = right; in fib6_walk_continue()
1987 w->state = FWS_INIT; in fib6_walk_continue()
1990 w->state = FWS_C; in fib6_walk_continue()
1991 w->leaf = rcu_dereference_protected(fn->leaf, 1); in fib6_walk_continue()
1994 if (w->leaf && fn->fn_flags & RTN_RTINFO) { in fib6_walk_continue()
1997 if (w->skip) { in fib6_walk_continue()
1998 w->skip--; in fib6_walk_continue()
2002 err = w->func(w); in fib6_walk_continue()
2006 w->count++; in fib6_walk_continue()
2010 w->state = FWS_U; in fib6_walk_continue()
2013 if (fn == w->root) in fib6_walk_continue()
2018 w->node = pn; in fib6_walk_continue()
2022 w->state = FWS_L; in fib6_walk_continue()
2027 w->state = FWS_R; in fib6_walk_continue()
2031 w->state = FWS_C; in fib6_walk_continue()
2032 w->leaf = rcu_dereference_protected(w->node->leaf, 1); in fib6_walk_continue()
2042 static int fib6_walk(struct net *net, struct fib6_walker *w) in fib6_walk() argument
2046 w->state = FWS_INIT; in fib6_walk()
2047 w->node = w->root; in fib6_walk()
2049 fib6_walker_link(net, w); in fib6_walk()
2050 res = fib6_walk_continue(w); in fib6_walk()
2052 fib6_walker_unlink(net, w); in fib6_walk()
2056 static int fib6_clean_node(struct fib6_walker *w) in fib6_clean_node() argument
2060 struct fib6_cleaner *c = container_of(w, struct fib6_cleaner, w); in fib6_clean_node()
2067 w->node->fn_sernum != c->sernum) in fib6_clean_node()
2068 w->node->fn_sernum = c->sernum; in fib6_clean_node()
2072 w->leaf = NULL; in fib6_clean_node()
2076 for_each_fib6_walker_rt(w) { in fib6_clean_node()
2079 w->leaf = rt; in fib6_clean_node()
2100 w->leaf = rt; in fib6_clean_node()
2119 c.w.root = root; in fib6_clean_tree()
2120 c.w.func = fib6_clean_node; in fib6_clean_tree()
2121 c.w.count = 0; in fib6_clean_tree()
2122 c.w.skip = 0; in fib6_clean_tree()
2123 c.w.skip_in_node = 0; in fib6_clean_tree()
2130 fib6_walk(net, &c.w); in fib6_clean_tree()
2400 iter->w.leaf = NULL; in ipv6_route_seq_show()
2404 static int ipv6_route_yield(struct fib6_walker *w) in ipv6_route_yield() argument
2406 struct ipv6_route_iter *iter = w->args; in ipv6_route_yield()
2412 iter->w.leaf = rcu_dereference_protected( in ipv6_route_yield()
2413 iter->w.leaf->fib6_next, in ipv6_route_yield()
2416 if (!iter->skip && iter->w.leaf) in ipv6_route_yield()
2418 } while (iter->w.leaf); in ipv6_route_yield()
2426 memset(&iter->w, 0, sizeof(iter->w)); in ipv6_route_seq_setup_walk()
2427 iter->w.func = ipv6_route_yield; in ipv6_route_seq_setup_walk()
2428 iter->w.root = &iter->tbl->tb6_root; in ipv6_route_seq_setup_walk()
2429 iter->w.state = FWS_INIT; in ipv6_route_seq_setup_walk()
2430 iter->w.node = iter->w.root; in ipv6_route_seq_setup_walk()
2431 iter->w.args = iter; in ipv6_route_seq_setup_walk()
2432 iter->sernum = iter->w.root->fn_sernum; in ipv6_route_seq_setup_walk()
2433 INIT_LIST_HEAD(&iter->w.lh); in ipv6_route_seq_setup_walk()
2434 fib6_walker_link(net, &iter->w); in ipv6_route_seq_setup_walk()
2460 if (iter->sernum != iter->w.root->fn_sernum) { in ipv6_route_check_sernum()
2461 iter->sernum = iter->w.root->fn_sernum; in ipv6_route_check_sernum()
2462 iter->w.state = FWS_INIT; in ipv6_route_check_sernum()
2463 iter->w.node = iter->w.root; in ipv6_route_check_sernum()
2464 WARN_ON(iter->w.skip); in ipv6_route_check_sernum()
2465 iter->w.skip = iter->w.count; in ipv6_route_check_sernum()
2488 r = fib6_walk_continue(&iter->w); in ipv6_route_seq_next()
2493 return iter->w.leaf; in ipv6_route_seq_next()
2495 fib6_walker_unlink(net, &iter->w); in ipv6_route_seq_next()
2498 fib6_walker_unlink(net, &iter->w); in ipv6_route_seq_next()
2528 struct fib6_walker *w = &iter->w; in ipv6_route_iter_active() local
2529 return w->node && !(w->state == FWS_U && w->node == w->root); in ipv6_route_iter_active()
2539 fib6_walker_unlink(net, &iter->w); in ipv6_route_seq_stop()