Lines Matching refs:rt

324 	struct rt6_info *rt;  in fib6_rule_lookup()  local
326 rt = pol_lookup_func(lookup, in fib6_rule_lookup()
328 if (rt->dst.error == -EAGAIN) { in fib6_rule_lookup()
329 ip6_rt_put_flags(rt, flags); in fib6_rule_lookup()
330 rt = net->ipv6.ip6_null_entry; in fib6_rule_lookup()
332 dst_hold(&rt->dst); in fib6_rule_lookup()
335 return &rt->dst; in fib6_rule_lookup()
372 struct fib6_info *rt, in call_fib6_entry_notifier() argument
377 .rt = rt, in call_fib6_entry_notifier()
385 struct fib6_info *rt, in call_fib6_multipath_entry_notifier() argument
391 .rt = rt, in call_fib6_multipath_entry_notifier()
400 struct fib6_info *rt, in call_fib6_entry_notifiers() argument
405 .rt = rt, in call_fib6_entry_notifiers()
408 WRITE_ONCE(rt->fib6_table->fib_seq, rt->fib6_table->fib_seq + 1); in call_fib6_entry_notifiers()
414 struct fib6_info *rt, in call_fib6_multipath_entry_notifiers() argument
420 .rt = rt, in call_fib6_multipath_entry_notifiers()
424 WRITE_ONCE(rt->fib6_table->fib_seq, rt->fib6_table->fib_seq + 1); in call_fib6_multipath_entry_notifiers()
428 int call_fib6_entry_notifiers_replace(struct net *net, struct fib6_info *rt) in call_fib6_entry_notifiers_replace() argument
431 .rt = rt, in call_fib6_entry_notifiers_replace()
432 .nsiblings = rt->fib6_nsiblings, in call_fib6_entry_notifiers_replace()
435 WRITE_ONCE(rt->fib6_table->fib_seq, rt->fib6_table->fib_seq + 1); in call_fib6_entry_notifiers_replace()
445 static int fib6_rt_dump(struct fib6_info *rt, struct fib6_dump_arg *arg) in fib6_rt_dump() argument
451 if (!rt || rt == arg->net->ipv6.fib6_null_entry) in fib6_rt_dump()
454 nsiblings = READ_ONCE(rt->fib6_nsiblings); in fib6_rt_dump()
457 rt, in fib6_rt_dump()
461 err = call_fib6_entry_notifier(arg->nb, fib_event, rt, in fib6_rt_dump()
528 struct fib6_info *rt; in fib6_dump_node() local
531 res = rt6_dump_route(rt, w->args, w->skip_in_node); in fib6_dump_node()
534 w->leaf = rt; in fib6_dump_node()
550 if (rt->fib6_nsiblings) in fib6_dump_node()
551 rt = list_last_entry(&rt->fib6_siblings, in fib6_dump_node()
1031 static void fib6_purge_rt(struct fib6_info *rt, struct fib6_node *fn, in fib6_purge_rt() argument
1034 struct fib6_table *table = rt->fib6_table; in fib6_purge_rt()
1037 rt6_flush_exceptions(rt); in fib6_purge_rt()
1038 fib6_drop_pcpu_from(rt); in fib6_purge_rt()
1040 if (rt->nh) { in fib6_purge_rt()
1041 spin_lock(&rt->nh->lock); in fib6_purge_rt()
1043 if (!list_empty(&rt->nh_list)) in fib6_purge_rt()
1044 list_del_init(&rt->nh_list); in fib6_purge_rt()
1046 spin_unlock(&rt->nh->lock); in fib6_purge_rt()
1049 if (refcount_read(&rt->fib6_ref) != 1) { in fib6_purge_rt()
1060 if (!(fn->fn_flags & RTN_RTINFO) && leaf == rt) { in fib6_purge_rt()
1065 fib6_info_release(rt); in fib6_purge_rt()
1072 fib6_clean_expires(rt); in fib6_purge_rt()
1073 fib6_remove_gc_list(rt); in fib6_purge_rt()
1080 static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt, in fib6_add_rt2node() argument
1085 lockdep_is_held(&rt->fib6_table->tb6_lock)); in fib6_add_rt2node()
1094 bool rt_can_ecmp = rt6_qualify_for_ecmp(rt); in fib6_add_rt2node()
1106 lockdep_is_held(&rt->fib6_table->tb6_lock))) { in fib6_add_rt2node()
1111 if (iter->fib6_metric == rt->fib6_metric) { in fib6_add_rt2node()
1129 if (rt6_duplicate_nexthop(iter, rt)) { in fib6_add_rt2node()
1130 if (rt->fib6_nsiblings) in fib6_add_rt2node()
1131 WRITE_ONCE(rt->fib6_nsiblings, 0); in fib6_add_rt2node()
1134 if (!(rt->fib6_flags & RTF_EXPIRES)) { in fib6_add_rt2node()
1138 fib6_set_expires(iter, rt->expires); in fib6_add_rt2node()
1142 if (rt->fib6_pmtu) in fib6_add_rt2node()
1144 rt->fib6_pmtu); in fib6_add_rt2node()
1160 WRITE_ONCE(rt->fib6_nsiblings, in fib6_add_rt2node()
1161 rt->fib6_nsiblings + 1); in fib6_add_rt2node()
1164 if (iter->fib6_metric > rt->fib6_metric) in fib6_add_rt2node()
1177 lockdep_is_held(&rt->fib6_table->tb6_lock)); in fib6_add_rt2node()
1186 if (rt->fib6_nsiblings) { in fib6_add_rt2node()
1194 if (sibling->fib6_metric == rt->fib6_metric && in fib6_add_rt2node()
1196 list_add_tail_rcu(&rt->fib6_siblings, in fib6_add_rt2node()
1201 lockdep_is_held(&rt->fib6_table->tb6_lock)); in fib6_add_rt2node()
1210 &rt->fib6_siblings, fib6_siblings) { in fib6_add_rt2node()
1213 BUG_ON(sibling->fib6_nsiblings != rt->fib6_nsiblings); in fib6_add_rt2node()
1216 BUG_ON(fib6_nsiblings != rt->fib6_nsiblings); in fib6_add_rt2node()
1245 fib_event, rt, in fib6_add_rt2node()
1253 if (!rt->fib6_nsiblings) in fib6_add_rt2node()
1257 &rt->fib6_siblings, in fib6_add_rt2node()
1261 WRITE_ONCE(rt->fib6_nsiblings, 0); in fib6_add_rt2node()
1262 list_del_rcu(&rt->fib6_siblings); in fib6_add_rt2node()
1270 rcu_assign_pointer(rt->fib6_next, iter); in fib6_add_rt2node()
1271 fib6_info_hold(rt); in fib6_add_rt2node()
1272 rcu_assign_pointer(rt->fib6_node, fn); in fib6_add_rt2node()
1273 rcu_assign_pointer(*ins, rt); in fib6_add_rt2node()
1275 inet6_rt_notify(RTM_NEWROUTE, rt, info, nlflags); in fib6_add_rt2node()
1296 rt, extack); in fib6_add_rt2node()
1301 fib6_info_hold(rt); in fib6_add_rt2node()
1302 rcu_assign_pointer(rt->fib6_node, fn); in fib6_add_rt2node()
1303 rt->fib6_next = iter->fib6_next; in fib6_add_rt2node()
1304 rcu_assign_pointer(*ins, rt); in fib6_add_rt2node()
1306 inet6_rt_notify(RTM_NEWROUTE, rt, info, NLM_F_REPLACE); in fib6_add_rt2node()
1319 ins = &rt->fib6_next; in fib6_add_rt2node()
1321 lockdep_is_held(&rt->fib6_table->tb6_lock)); in fib6_add_rt2node()
1323 if (iter->fib6_metric > rt->fib6_metric) in fib6_add_rt2node()
1337 lockdep_is_held(&rt->fib6_table->tb6_lock)); in fib6_add_rt2node()
1346 static int fib6_add_rt2node_nh(struct fib6_node *fn, struct fib6_info *rt, in fib6_add_rt2node_nh() argument
1352 spin_lock(&rt->nh->lock); in fib6_add_rt2node_nh()
1354 if (rt->nh->dead) { in fib6_add_rt2node_nh()
1358 err = fib6_add_rt2node(fn, rt, info, extack, purge_list); in fib6_add_rt2node_nh()
1360 list_add(&rt->nh_list, &rt->nh->f6i_list); in fib6_add_rt2node_nh()
1363 spin_unlock(&rt->nh->lock); in fib6_add_rt2node_nh()
1368 static void fib6_start_gc(struct net *net, struct fib6_info *rt) in fib6_start_gc() argument
1371 (rt->fib6_flags & RTF_EXPIRES)) in fib6_start_gc()
1383 static void __fib6_update_sernum_upto_root(struct fib6_info *rt, in __fib6_update_sernum_upto_root() argument
1386 struct fib6_node *fn = rcu_dereference_protected(rt->fib6_node, in __fib6_update_sernum_upto_root()
1387 lockdep_is_held(&rt->fib6_table->tb6_lock)); in __fib6_update_sernum_upto_root()
1394 lockdep_is_held(&rt->fib6_table->tb6_lock)); in __fib6_update_sernum_upto_root()
1398 void fib6_update_sernum_upto_root(struct net *net, struct fib6_info *rt) in fib6_update_sernum_upto_root() argument
1400 __fib6_update_sernum_upto_root(rt, fib6_new_sernum(net)); in fib6_update_sernum_upto_root()
1418 int fib6_add(struct fib6_node *root, struct fib6_info *rt, in fib6_add() argument
1421 struct fib6_table *table = rt->fib6_table; in fib6_add()
1441 &rt->fib6_dst.addr, rt->fib6_dst.plen, in fib6_add()
1453 if (rt->fib6_src.plen) { in fib6_add()
1482 &rt->fib6_src.addr, rt->fib6_src.plen, in fib6_add()
1501 &rt->fib6_src.addr, rt->fib6_src.plen, in fib6_add()
1517 fib6_info_hold(rt); in fib6_add()
1518 rcu_assign_pointer(fn->leaf, rt); in fib6_add()
1525 if (rt->nh) in fib6_add()
1526 err = fib6_add_rt2node_nh(fn, rt, info, extack, &purge_list); in fib6_add()
1528 err = fib6_add_rt2node(fn, rt, info, extack, &purge_list); in fib6_add()
1538 __fib6_update_sernum_upto_root(rt, fib6_new_sernum(info->nl_net)); in fib6_add()
1540 if (rt->fib6_flags & RTF_EXPIRES) in fib6_add()
1541 fib6_add_gc_list(rt); in fib6_add()
1543 fib6_start_gc(info->nl_net, rt); in fib6_add()
1557 if (pn_leaf == rt) { in fib6_add()
1560 fib6_info_release(rt); in fib6_add()
1574 } else if (fib6_requires_src(rt)) { in fib6_add()
1967 struct fib6_info *rt = rcu_dereference_protected(*rtp, in fib6_del_route() local
1978 if (leaf == rt && !rt->fib6_nsiblings) { in fib6_del_route()
1979 if (rcu_access_pointer(rt->fib6_next)) in fib6_del_route()
1980 replace_rt = rcu_dereference_protected(rt->fib6_next, in fib6_del_route()
1987 *rtp = rt->fib6_next; in fib6_del_route()
1988 rt->fib6_node = NULL; in fib6_del_route()
1993 if (rcu_access_pointer(fn->rr_ptr) == rt) in fib6_del_route()
1997 if (rt->fib6_nsiblings) { in fib6_del_route()
2005 if (rt->fib6_metric == leaf->fib6_metric && in fib6_del_route()
2009 &rt->fib6_siblings, fib6_siblings) in fib6_del_route()
2012 WRITE_ONCE(rt->fib6_nsiblings, 0); in fib6_del_route()
2013 list_del_rcu(&rt->fib6_siblings); in fib6_del_route()
2020 if (w->state == FWS_C && w->leaf == rt) { in fib6_del_route()
2022 w->leaf = rcu_dereference_protected(rt->fib6_next, in fib6_del_route()
2042 fib6_purge_rt(rt, fn, net); in fib6_del_route()
2047 rt, NULL); in fib6_del_route()
2052 inet6_rt_notify(RTM_DELROUTE, rt, info, 0); in fib6_del_route()
2054 fib6_info_release(rt); in fib6_del_route()
2058 int fib6_del(struct fib6_info *rt, struct nl_info *info) in fib6_del() argument
2066 if (rt == net->ipv6.fib6_null_entry) in fib6_del()
2069 table = rt->fib6_table; in fib6_del()
2070 fn = rcu_dereference_protected(rt->fib6_node, in fib6_del()
2084 if (rt == cur) { in fib6_del()
2228 struct fib6_info *rt; in fib6_clean_node() local
2246 res = c->func(rt, c->arg); in fib6_clean_node()
2248 w->leaf = rt; in fib6_clean_node()
2249 res = fib6_del(rt, &info); in fib6_clean_node()
2253 __func__, rt, in fib6_clean_node()
2254 rcu_access_pointer(rt->fib6_node), in fib6_clean_node()
2261 if (WARN_ON(!rt->fib6_nsiblings)) in fib6_clean_node()
2263 rt = list_last_entry(&rt->fib6_siblings, in fib6_clean_node()
2269 w->leaf = rt; in fib6_clean_node()
2347 static int fib6_age(struct fib6_info *rt, struct fib6_gc_args *gc_args) in fib6_age() argument
2356 if (rt->fib6_flags & RTF_EXPIRES && rt->expires) { in fib6_age()
2357 if (time_after(now, rt->expires)) { in fib6_age()
2358 pr_debug("expiring %p\n", rt); in fib6_age()
2368 rt6_age_exceptions(rt, gc_args, now); in fib6_age()
2377 struct fib6_info *rt; in fib6_gc_table() local
2384 hlist_for_each_entry_safe(rt, n, &tb6->tb6_gc_hlist, gc_link) in fib6_gc_table()
2385 if (fib6_age(rt, gc_args) == -1) in fib6_gc_table()
2386 fib6_del(rt, &info); in fib6_gc_table()
2588 struct fib6_info *rt = v; in ipv6_route_native_seq_show() local
2590 struct fib6_nh *fib6_nh = rt->fib6_nh; in ipv6_route_native_seq_show()
2591 unsigned int flags = rt->fib6_flags; in ipv6_route_native_seq_show()
2594 if (rt->nh) in ipv6_route_native_seq_show()
2595 fib6_nh = nexthop_fib6_nh(rt->nh); in ipv6_route_native_seq_show()
2597 seq_printf(seq, "%pi6 %02x ", &rt->fib6_dst.addr, rt->fib6_dst.plen); in ipv6_route_native_seq_show()
2600 seq_printf(seq, "%pi6 %02x ", &rt->fib6_src.addr, rt->fib6_src.plen); in ipv6_route_native_seq_show()
2613 rt->fib6_metric, refcount_read(&rt->fib6_ref), 0, in ipv6_route_native_seq_show()
2768 ctx.rt = v; in ipv6_route_prog_seq_show()