Lines Matching full:rt

315 	struct rt6_info *rt;  in fib6_rule_lookup()  local
317 rt = pol_lookup_func(lookup, in fib6_rule_lookup()
319 if (rt->dst.error == -EAGAIN) { in fib6_rule_lookup()
320 ip6_rt_put_flags(rt, flags); in fib6_rule_lookup()
321 rt = net->ipv6.ip6_null_entry; in fib6_rule_lookup()
323 dst_hold(&rt->dst); in fib6_rule_lookup()
326 return &rt->dst; in fib6_rule_lookup()
363 struct fib6_info *rt, in call_fib6_entry_notifier() argument
368 .rt = rt, in call_fib6_entry_notifier()
376 struct fib6_info *rt, in call_fib6_multipath_entry_notifier() argument
382 .rt = rt, in call_fib6_multipath_entry_notifier()
391 struct fib6_info *rt, in call_fib6_entry_notifiers() argument
396 .rt = rt, in call_fib6_entry_notifiers()
399 rt->fib6_table->fib_seq++; in call_fib6_entry_notifiers()
405 struct fib6_info *rt, in call_fib6_multipath_entry_notifiers() argument
411 .rt = rt, in call_fib6_multipath_entry_notifiers()
415 rt->fib6_table->fib_seq++; 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
422 .rt = rt, in call_fib6_entry_notifiers_replace()
423 .nsiblings = rt->fib6_nsiblings, in call_fib6_entry_notifiers_replace()
426 rt->fib6_table->fib_seq++; in call_fib6_entry_notifiers_replace()
436 static int fib6_rt_dump(struct fib6_info *rt, struct fib6_dump_arg *arg) in fib6_rt_dump() argument
441 if (!rt || rt == arg->net->ipv6.fib6_null_entry) in fib6_rt_dump()
444 if (rt->fib6_nsiblings) in fib6_rt_dump()
446 rt, in fib6_rt_dump()
447 rt->fib6_nsiblings, in fib6_rt_dump()
450 err = call_fib6_entry_notifier(arg->nb, fib_event, rt, in fib6_rt_dump()
516 struct fib6_info *rt; in fib6_dump_node() local
519 res = rt6_dump_route(rt, w->args, w->skip_in_node); in fib6_dump_node()
522 w->leaf = rt; in fib6_dump_node()
534 * RTA_MULTIPATH attribute. Jump 'rt' to point to the in fib6_dump_node()
538 if (rt->fib6_nsiblings) in fib6_dump_node()
539 rt = list_last_entry(&rt->fib6_siblings, in fib6_dump_node()
1024 static void fib6_purge_rt(struct fib6_info *rt, struct fib6_node *fn, in fib6_purge_rt() argument
1027 struct fib6_table *table = rt->fib6_table; in fib6_purge_rt()
1030 rt6_flush_exceptions(rt); in fib6_purge_rt()
1031 fib6_drop_pcpu_from(rt, table); in fib6_purge_rt()
1033 if (rt->nh && !list_empty(&rt->nh_list)) in fib6_purge_rt()
1034 list_del_init(&rt->nh_list); in fib6_purge_rt()
1036 if (refcount_read(&rt->fib6_ref) != 1) { in fib6_purge_rt()
1047 if (!(fn->fn_flags & RTN_RTINFO) && leaf == rt) { in fib6_purge_rt()
1052 fib6_info_release(rt); in fib6_purge_rt()
1064 static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt, in fib6_add_rt2node() argument
1069 lockdep_is_held(&rt->fib6_table->tb6_lock)); in fib6_add_rt2node()
1078 bool rt_can_ecmp = rt6_qualify_for_ecmp(rt); in fib6_add_rt2node()
1090 lockdep_is_held(&rt->fib6_table->tb6_lock))) { in fib6_add_rt2node()
1095 if (iter->fib6_metric == rt->fib6_metric) { in fib6_add_rt2node()
1113 if (rt6_duplicate_nexthop(iter, rt)) { in fib6_add_rt2node()
1114 if (rt->fib6_nsiblings) in fib6_add_rt2node()
1115 rt->fib6_nsiblings = 0; in fib6_add_rt2node()
1118 if (!(rt->fib6_flags & RTF_EXPIRES)) in fib6_add_rt2node()
1121 fib6_set_expires(iter, rt->expires); in fib6_add_rt2node()
1123 if (rt->fib6_pmtu) in fib6_add_rt2node()
1125 rt->fib6_pmtu); in fib6_add_rt2node()
1141 rt->fib6_nsiblings++; in fib6_add_rt2node()
1144 if (iter->fib6_metric > rt->fib6_metric) in fib6_add_rt2node()
1157 lockdep_is_held(&rt->fib6_table->tb6_lock)); in fib6_add_rt2node()
1166 if (rt->fib6_nsiblings) { in fib6_add_rt2node()
1174 if (sibling->fib6_metric == rt->fib6_metric && in fib6_add_rt2node()
1176 list_add_tail(&rt->fib6_siblings, in fib6_add_rt2node()
1181 lockdep_is_held(&rt->fib6_table->tb6_lock)); in fib6_add_rt2node()
1190 &rt->fib6_siblings, fib6_siblings) { in fib6_add_rt2node()
1192 BUG_ON(sibling->fib6_nsiblings != rt->fib6_nsiblings); in fib6_add_rt2node()
1195 BUG_ON(fib6_nsiblings != rt->fib6_nsiblings); in fib6_add_rt2node()
1222 fib_event, rt, in fib6_add_rt2node()
1230 if (!rt->fib6_nsiblings) in fib6_add_rt2node()
1234 &rt->fib6_siblings, in fib6_add_rt2node()
1237 rt->fib6_nsiblings = 0; in fib6_add_rt2node()
1238 list_del_init(&rt->fib6_siblings); in fib6_add_rt2node()
1244 rcu_assign_pointer(rt->fib6_next, iter); in fib6_add_rt2node()
1245 fib6_info_hold(rt); in fib6_add_rt2node()
1246 rcu_assign_pointer(rt->fib6_node, fn); in fib6_add_rt2node()
1247 rcu_assign_pointer(*ins, rt); in fib6_add_rt2node()
1249 inet6_rt_notify(RTM_NEWROUTE, rt, info, nlflags); in fib6_add_rt2node()
1270 rt, extack); in fib6_add_rt2node()
1275 fib6_info_hold(rt); in fib6_add_rt2node()
1276 rcu_assign_pointer(rt->fib6_node, fn); in fib6_add_rt2node()
1277 rt->fib6_next = iter->fib6_next; in fib6_add_rt2node()
1278 rcu_assign_pointer(*ins, rt); in fib6_add_rt2node()
1280 inet6_rt_notify(RTM_NEWROUTE, rt, info, NLM_F_REPLACE); in fib6_add_rt2node()
1294 ins = &rt->fib6_next; in fib6_add_rt2node()
1296 lockdep_is_held(&rt->fib6_table->tb6_lock)); in fib6_add_rt2node()
1298 if (iter->fib6_metric > rt->fib6_metric) in fib6_add_rt2node()
1313 lockdep_is_held(&rt->fib6_table->tb6_lock)); in fib6_add_rt2node()
1322 static void fib6_start_gc(struct net *net, struct fib6_info *rt) in fib6_start_gc() argument
1325 (rt->fib6_flags & RTF_EXPIRES)) in fib6_start_gc()
1337 static void __fib6_update_sernum_upto_root(struct fib6_info *rt, in __fib6_update_sernum_upto_root() argument
1340 struct fib6_node *fn = rcu_dereference_protected(rt->fib6_node, in __fib6_update_sernum_upto_root()
1341 lockdep_is_held(&rt->fib6_table->tb6_lock)); in __fib6_update_sernum_upto_root()
1348 lockdep_is_held(&rt->fib6_table->tb6_lock)); in __fib6_update_sernum_upto_root()
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()
1372 int fib6_add(struct fib6_node *root, struct fib6_info *rt, in fib6_add() argument
1375 struct fib6_table *table = rt->fib6_table; in fib6_add()
1391 &rt->fib6_dst.addr, rt->fib6_dst.plen, in fib6_add()
1403 if (rt->fib6_src.plen) { in fib6_add()
1432 &rt->fib6_src.addr, rt->fib6_src.plen, in fib6_add()
1451 &rt->fib6_src.addr, rt->fib6_src.plen, in fib6_add()
1467 fib6_info_hold(rt); in fib6_add()
1468 rcu_assign_pointer(fn->leaf, rt); in fib6_add()
1475 err = fib6_add_rt2node(fn, rt, info, extack); in fib6_add()
1477 if (rt->nh) in fib6_add()
1478 list_add(&rt->nh_list, &rt->nh->f6i_list); in fib6_add()
1479 __fib6_update_sernum_upto_root(rt, fib6_new_sernum(info->nl_net)); in fib6_add()
1480 fib6_start_gc(info->nl_net, rt); in fib6_add()
1494 if (pn_leaf == rt) { in fib6_add()
1497 fib6_info_release(rt); in fib6_add()
1515 } else if (fib6_requires_src(rt)) { in fib6_add()
1905 struct fib6_info *rt = rcu_dereference_protected(*rtp, in fib6_del_route() local
1918 if (leaf == rt && !rt->fib6_nsiblings) { in fib6_del_route()
1919 if (rcu_access_pointer(rt->fib6_next)) in fib6_del_route()
1920 replace_rt = rcu_dereference_protected(rt->fib6_next, in fib6_del_route()
1927 *rtp = rt->fib6_next; in fib6_del_route()
1928 rt->fib6_node = NULL; in fib6_del_route()
1933 if (rcu_access_pointer(fn->rr_ptr) == rt) in fib6_del_route()
1937 if (rt->fib6_nsiblings) { in fib6_del_route()
1945 if (rt->fib6_metric == leaf->fib6_metric && in fib6_del_route()
1949 &rt->fib6_siblings, fib6_siblings) in fib6_del_route()
1951 rt->fib6_nsiblings = 0; in fib6_del_route()
1952 list_del_init(&rt->fib6_siblings); in fib6_del_route()
1959 if (w->state == FWS_C && w->leaf == rt) { in fib6_del_route()
1961 w->leaf = rcu_dereference_protected(rt->fib6_next, in fib6_del_route()
1981 fib6_purge_rt(rt, fn, net); in fib6_del_route()
1986 rt, NULL); in fib6_del_route()
1991 inet6_rt_notify(RTM_DELROUTE, rt, info, 0); in fib6_del_route()
1993 fib6_info_release(rt); in fib6_del_route()
1997 int fib6_del(struct fib6_info *rt, struct nl_info *info) in fib6_del() argument
2005 if (rt == net->ipv6.fib6_null_entry) in fib6_del()
2008 table = rt->fib6_table; in fib6_del()
2009 fn = rcu_dereference_protected(rt->fib6_node, in fib6_del()
2023 if (rt == cur) { in fib6_del()
2167 struct fib6_info *rt; in fib6_clean_node() local
2185 res = c->func(rt, c->arg); in fib6_clean_node()
2187 w->leaf = rt; in fib6_clean_node()
2188 res = fib6_del(rt, &info); in fib6_clean_node()
2191 pr_debug("%s: del failed: rt=%p@%p err=%d\n", in fib6_clean_node()
2192 __func__, rt, in fib6_clean_node()
2193 rcu_access_pointer(rt->fib6_node), in fib6_clean_node()
2200 if (WARN_ON(!rt->fib6_nsiblings)) in fib6_clean_node()
2202 rt = list_last_entry(&rt->fib6_siblings, in fib6_clean_node()
2208 w->leaf = rt; in fib6_clean_node()
2286 static int fib6_age(struct fib6_info *rt, void *arg) in fib6_age() argument
2296 if (rt->fib6_flags & RTF_EXPIRES && rt->expires) { in fib6_age()
2297 if (time_after(now, rt->expires)) { in fib6_age()
2298 RT6_TRACE("expiring %p\n", rt); in fib6_age()
2308 rt6_age_exceptions(rt, gc_args, now); in fib6_age()
2481 struct fib6_info *rt = v; in ipv6_route_native_seq_show() local
2483 struct fib6_nh *fib6_nh = rt->fib6_nh; in ipv6_route_native_seq_show()
2484 unsigned int flags = rt->fib6_flags; in ipv6_route_native_seq_show()
2487 if (rt->nh) in ipv6_route_native_seq_show()
2488 fib6_nh = nexthop_fib6_nh_bh(rt->nh); in ipv6_route_native_seq_show()
2490 seq_printf(seq, "%pi6 %02x ", &rt->fib6_dst.addr, rt->fib6_dst.plen); in ipv6_route_native_seq_show()
2493 seq_printf(seq, "%pi6 %02x ", &rt->fib6_src.addr, rt->fib6_src.plen); in ipv6_route_native_seq_show()
2506 rt->fib6_metric, refcount_read(&rt->fib6_ref), 0, in ipv6_route_native_seq_show()
2661 ctx.rt = v; in ipv6_route_prog_seq_show()