Lines Matching refs:w

51 	struct fib6_walker w;  member
69 static int fib6_walk(struct fib6_walker *w);
70 static int fib6_walk_continue(struct fib6_walker *w);
82 #define FOR_WALKERS(w) list_for_each_entry(w, &fib6_walkers, lh) argument
84 static void fib6_walker_link(struct fib6_walker *w) in fib6_walker_link() argument
87 list_add(&w->lh, &fib6_walkers); in fib6_walker_link()
91 static void fib6_walker_unlink(struct fib6_walker *w) in fib6_walker_unlink() argument
94 list_del(&w->lh); in fib6_walker_unlink()
309 static int fib6_dump_node(struct fib6_walker *w) in fib6_dump_node() argument
314 for (rt = w->leaf; rt; rt = rt->dst.rt6_next) { in fib6_dump_node()
315 res = rt6_dump_route(rt, w->args); in fib6_dump_node()
318 w->leaf = rt; in fib6_dump_node()
322 w->leaf = NULL; in fib6_dump_node()
328 struct fib6_walker *w = (void *)cb->args[2]; in fib6_dump_end() local
330 if (w) { in fib6_dump_end()
333 fib6_walker_unlink(w); in fib6_dump_end()
336 kfree(w); in fib6_dump_end()
351 struct fib6_walker *w; in fib6_dump_table() local
354 w = (void *)cb->args[2]; in fib6_dump_table()
355 w->root = &table->tb6_root; in fib6_dump_table()
358 w->count = 0; in fib6_dump_table()
359 w->skip = 0; in fib6_dump_table()
362 res = fib6_walk(w); in fib6_dump_table()
366 cb->args[5] = w->root->fn_sernum; in fib6_dump_table()
369 if (cb->args[5] != w->root->fn_sernum) { in fib6_dump_table()
371 cb->args[5] = w->root->fn_sernum; in fib6_dump_table()
372 w->state = FWS_INIT; in fib6_dump_table()
373 w->node = w->root; in fib6_dump_table()
374 w->skip = w->count; in fib6_dump_table()
376 w->skip = 0; in fib6_dump_table()
379 res = fib6_walk_continue(w); in fib6_dump_table()
382 fib6_walker_unlink(w); in fib6_dump_table()
396 struct fib6_walker *w; in inet6_dump_fib() local
404 w = (void *)cb->args[2]; in inet6_dump_fib()
405 if (!w) { in inet6_dump_fib()
416 w = kzalloc(sizeof(*w), GFP_ATOMIC); in inet6_dump_fib()
417 if (!w) in inet6_dump_fib()
419 w->func = fib6_dump_node; in inet6_dump_fib()
420 cb->args[2] = (long)w; in inet6_dump_fib()
426 w->args = &arg; in inet6_dump_fib()
1284 struct fib6_walker *w; in fib6_repair_tree() local
1344 FOR_WALKERS(w) { in fib6_repair_tree()
1346 if (w->root == fn) { in fib6_repair_tree()
1347 w->root = w->node = NULL; in fib6_repair_tree()
1348 RT6_TRACE("W %p adjusted by delroot 1\n", w); in fib6_repair_tree()
1349 } else if (w->node == fn) { in fib6_repair_tree()
1350 RT6_TRACE("W %p adjusted by delnode 1, s=%d/%d\n", w, w->state, nstate); in fib6_repair_tree()
1351 w->node = pn; in fib6_repair_tree()
1352 w->state = nstate; in fib6_repair_tree()
1355 if (w->root == fn) { in fib6_repair_tree()
1356 w->root = child; in fib6_repair_tree()
1357 RT6_TRACE("W %p adjusted by delroot 2\n", w); in fib6_repair_tree()
1359 if (w->node == fn) { in fib6_repair_tree()
1360 w->node = child; in fib6_repair_tree()
1362 RT6_TRACE("W %p adjusted by delnode 2, s=%d\n", w, w->state); in fib6_repair_tree()
1363 w->state = w->state >= FWS_R ? FWS_U : FWS_INIT; in fib6_repair_tree()
1365 RT6_TRACE("W %p adjusted by delnode 2, s=%d\n", w, w->state); in fib6_repair_tree()
1366 w->state = w->state >= FWS_C ? FWS_U : FWS_INIT; in fib6_repair_tree()
1386 struct fib6_walker *w; in fib6_del_route() local
1415 FOR_WALKERS(w) { in fib6_del_route()
1416 if (w->state == FWS_C && w->leaf == rt) { in fib6_del_route()
1417 RT6_TRACE("walker %p adjusted by delroute\n", w); in fib6_del_route()
1418 w->leaf = rt->dst.rt6_next; in fib6_del_route()
1419 if (!w->leaf) in fib6_del_route()
1420 w->state = FWS_U; in fib6_del_route()
1507 static int fib6_walk_continue(struct fib6_walker *w) in fib6_walk_continue() argument
1512 fn = w->node; in fib6_walk_continue()
1516 if (w->prune && fn != w->root && in fib6_walk_continue()
1517 fn->fn_flags & RTN_RTINFO && w->state < FWS_C) { in fib6_walk_continue()
1518 w->state = FWS_C; in fib6_walk_continue()
1519 w->leaf = fn->leaf; in fib6_walk_continue()
1521 switch (w->state) { in fib6_walk_continue()
1525 w->node = FIB6_SUBTREE(fn); in fib6_walk_continue()
1528 w->state = FWS_L; in fib6_walk_continue()
1532 w->node = fn->left; in fib6_walk_continue()
1533 w->state = FWS_INIT; in fib6_walk_continue()
1536 w->state = FWS_R; in fib6_walk_continue()
1539 w->node = fn->right; in fib6_walk_continue()
1540 w->state = FWS_INIT; in fib6_walk_continue()
1543 w->state = FWS_C; in fib6_walk_continue()
1544 w->leaf = fn->leaf; in fib6_walk_continue()
1546 if (w->leaf && fn->fn_flags & RTN_RTINFO) { in fib6_walk_continue()
1549 if (w->skip) { in fib6_walk_continue()
1550 w->skip--; in fib6_walk_continue()
1554 err = w->func(w); in fib6_walk_continue()
1558 w->count++; in fib6_walk_continue()
1562 w->state = FWS_U; in fib6_walk_continue()
1564 if (fn == w->root) in fib6_walk_continue()
1567 w->node = pn; in fib6_walk_continue()
1571 w->state = FWS_L; in fib6_walk_continue()
1576 w->state = FWS_R; in fib6_walk_continue()
1580 w->state = FWS_C; in fib6_walk_continue()
1581 w->leaf = w->node->leaf; in fib6_walk_continue()
1591 static int fib6_walk(struct fib6_walker *w) in fib6_walk() argument
1595 w->state = FWS_INIT; in fib6_walk()
1596 w->node = w->root; in fib6_walk()
1598 fib6_walker_link(w); in fib6_walk()
1599 res = fib6_walk_continue(w); in fib6_walk()
1601 fib6_walker_unlink(w); in fib6_walk()
1605 static int fib6_clean_node(struct fib6_walker *w) in fib6_clean_node() argument
1609 struct fib6_cleaner *c = container_of(w, struct fib6_cleaner, w); in fib6_clean_node()
1615 w->node->fn_sernum != c->sernum) in fib6_clean_node()
1616 w->node->fn_sernum = c->sernum; in fib6_clean_node()
1620 w->leaf = NULL; in fib6_clean_node()
1624 for (rt = w->leaf; rt; rt = rt->dst.rt6_next) { in fib6_clean_node()
1627 w->leaf = rt; in fib6_clean_node()
1640 w->leaf = rt; in fib6_clean_node()
1661 c.w.root = root; in fib6_clean_tree()
1662 c.w.func = fib6_clean_node; in fib6_clean_tree()
1663 c.w.prune = prune; in fib6_clean_tree()
1664 c.w.count = 0; in fib6_clean_tree()
1665 c.w.skip = 0; in fib6_clean_tree()
1671 fib6_walk(&c.w); in fib6_clean_tree()
1929 struct fib6_walker w; member
1956 iter->w.leaf = NULL; in ipv6_route_seq_show()
1960 static int ipv6_route_yield(struct fib6_walker *w) in ipv6_route_yield() argument
1962 struct ipv6_route_iter *iter = w->args; in ipv6_route_yield()
1968 iter->w.leaf = iter->w.leaf->dst.rt6_next; in ipv6_route_yield()
1970 if (!iter->skip && iter->w.leaf) in ipv6_route_yield()
1972 } while (iter->w.leaf); in ipv6_route_yield()
1979 memset(&iter->w, 0, sizeof(iter->w)); in ipv6_route_seq_setup_walk()
1980 iter->w.func = ipv6_route_yield; in ipv6_route_seq_setup_walk()
1981 iter->w.root = &iter->tbl->tb6_root; in ipv6_route_seq_setup_walk()
1982 iter->w.state = FWS_INIT; in ipv6_route_seq_setup_walk()
1983 iter->w.node = iter->w.root; in ipv6_route_seq_setup_walk()
1984 iter->w.args = iter; in ipv6_route_seq_setup_walk()
1985 iter->sernum = iter->w.root->fn_sernum; in ipv6_route_seq_setup_walk()
1986 INIT_LIST_HEAD(&iter->w.lh); in ipv6_route_seq_setup_walk()
1987 fib6_walker_link(&iter->w); in ipv6_route_seq_setup_walk()
2013 if (iter->sernum != iter->w.root->fn_sernum) { in ipv6_route_check_sernum()
2014 iter->sernum = iter->w.root->fn_sernum; in ipv6_route_check_sernum()
2015 iter->w.state = FWS_INIT; in ipv6_route_check_sernum()
2016 iter->w.node = iter->w.root; in ipv6_route_check_sernum()
2017 WARN_ON(iter->w.skip); in ipv6_route_check_sernum()
2018 iter->w.skip = iter->w.count; in ipv6_route_check_sernum()
2041 r = fib6_walk_continue(&iter->w); in ipv6_route_seq_next()
2046 return iter->w.leaf; in ipv6_route_seq_next()
2048 fib6_walker_unlink(&iter->w); in ipv6_route_seq_next()
2051 fib6_walker_unlink(&iter->w); in ipv6_route_seq_next()
2081 struct fib6_walker *w = &iter->w; in ipv6_route_iter_active() local
2082 return w->node && !(w->state == FWS_U && w->node == w->root); in ipv6_route_iter_active()
2091 fib6_walker_unlink(&iter->w); in ipv6_route_seq_stop()