Lines Matching refs:rt
157 static void rt6_release(struct rt6_info *rt) in rt6_release() argument
159 if (atomic_dec_and_test(&rt->rt6i_ref)) in rt6_release()
160 dst_free(&rt->dst); in rt6_release()
271 struct rt6_info *rt; in fib6_dump_node() local
273 for (rt = w->leaf; rt; rt = rt->dst.rt6_next) { in fib6_dump_node()
274 res = rt6_dump_route(rt, w->args); in fib6_dump_node()
277 w->leaf = rt; in fib6_dump_node()
626 static bool rt6_qualify_for_ecmp(struct rt6_info *rt) in rt6_qualify_for_ecmp() argument
628 return (rt->rt6i_flags & (RTF_GATEWAY|RTF_ADDRCONF|RTF_DYNAMIC)) == in rt6_qualify_for_ecmp()
664 static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn, in fib6_purge_rt() argument
667 if (atomic_read(&rt->rt6i_ref) != 1) { in fib6_purge_rt()
675 if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) { in fib6_purge_rt()
678 rt6_release(rt); in fib6_purge_rt()
683 BUG_ON(atomic_read(&rt->rt6i_ref) != 1); in fib6_purge_rt()
691 static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, in fib6_add_rt2node() argument
702 bool rt_can_ecmp = rt6_qualify_for_ecmp(rt); in fib6_add_rt2node()
712 if (iter->rt6i_metric == rt->rt6i_metric) { in fib6_add_rt2node()
729 if (iter->dst.dev == rt->dst.dev && in fib6_add_rt2node()
730 iter->rt6i_idev == rt->rt6i_idev && in fib6_add_rt2node()
732 &rt->rt6i_gateway)) { in fib6_add_rt2node()
733 if (rt->rt6i_nsiblings) in fib6_add_rt2node()
734 rt->rt6i_nsiblings = 0; in fib6_add_rt2node()
737 if (!(rt->rt6i_flags & RTF_EXPIRES)) in fib6_add_rt2node()
740 rt6_set_expires(iter, rt->dst.expires); in fib6_add_rt2node()
756 rt->rt6i_nsiblings++; in fib6_add_rt2node()
759 if (iter->rt6i_metric > rt->rt6i_metric) in fib6_add_rt2node()
778 if (rt->rt6i_nsiblings) { in fib6_add_rt2node()
785 if (sibling->rt6i_metric == rt->rt6i_metric && in fib6_add_rt2node()
787 list_add_tail(&rt->rt6i_siblings, in fib6_add_rt2node()
799 &rt->rt6i_siblings, rt6i_siblings) { in fib6_add_rt2node()
801 BUG_ON(sibling->rt6i_nsiblings != rt->rt6i_nsiblings); in fib6_add_rt2node()
804 BUG_ON(rt6i_nsiblings != rt->rt6i_nsiblings); in fib6_add_rt2node()
815 err = fib6_commit_metrics(&rt->dst, mxc); in fib6_add_rt2node()
819 rt->dst.rt6_next = iter; in fib6_add_rt2node()
820 *ins = rt; in fib6_add_rt2node()
821 rt->rt6i_node = fn; in fib6_add_rt2node()
822 atomic_inc(&rt->rt6i_ref); in fib6_add_rt2node()
823 inet6_rt_notify(RTM_NEWROUTE, rt, info); in fib6_add_rt2node()
841 err = fib6_commit_metrics(&rt->dst, mxc); in fib6_add_rt2node()
845 *ins = rt; in fib6_add_rt2node()
846 rt->rt6i_node = fn; in fib6_add_rt2node()
847 rt->dst.rt6_next = iter->dst.rt6_next; in fib6_add_rt2node()
848 atomic_inc(&rt->rt6i_ref); in fib6_add_rt2node()
849 inet6_rt_notify(RTM_NEWROUTE, rt, info); in fib6_add_rt2node()
860 ins = &rt->dst.rt6_next; in fib6_add_rt2node()
880 static void fib6_start_gc(struct net *net, struct rt6_info *rt) in fib6_start_gc() argument
883 (rt->rt6i_flags & (RTF_EXPIRES | RTF_CACHE))) in fib6_start_gc()
901 int fib6_add(struct fib6_node *root, struct rt6_info *rt, in fib6_add() argument
919 fn = fib6_add_1(root, &rt->rt6i_dst.addr, rt->rt6i_dst.plen, in fib6_add()
931 if (rt->rt6i_src.plen) { in fib6_add()
959 sn = fib6_add_1(sfn, &rt->rt6i_src.addr, in fib6_add()
960 rt->rt6i_src.plen, in fib6_add()
978 sn = fib6_add_1(fn->subtree, &rt->rt6i_src.addr, in fib6_add()
979 rt->rt6i_src.plen, in fib6_add()
990 fn->leaf = rt; in fib6_add()
991 atomic_inc(&rt->rt6i_ref); in fib6_add()
997 err = fib6_add_rt2node(fn, rt, info, mxc); in fib6_add()
999 fib6_start_gc(info->nl_net, rt); in fib6_add()
1000 if (!(rt->rt6i_flags & RTF_CACHE)) in fib6_add()
1011 if (pn != fn && pn->leaf == rt) { in fib6_add()
1013 atomic_dec(&rt->rt6i_ref); in fib6_add()
1026 dst_free(&rt->dst); in fib6_add()
1037 dst_free(&rt->dst); in fib6_add()
1338 struct rt6_info *rt = *rtp; in fib6_del_route() local
1344 *rtp = rt->dst.rt6_next; in fib6_del_route()
1345 rt->rt6i_node = NULL; in fib6_del_route()
1350 if (fn->rr_ptr == rt) in fib6_del_route()
1354 if (rt->rt6i_nsiblings) { in fib6_del_route()
1358 &rt->rt6i_siblings, rt6i_siblings) in fib6_del_route()
1360 rt->rt6i_nsiblings = 0; in fib6_del_route()
1361 list_del_init(&rt->rt6i_siblings); in fib6_del_route()
1367 if (w->state == FWS_C && w->leaf == rt) { in fib6_del_route()
1369 w->leaf = rt->dst.rt6_next; in fib6_del_route()
1376 rt->dst.rt6_next = NULL; in fib6_del_route()
1385 fib6_purge_rt(rt, fn, net); in fib6_del_route()
1387 inet6_rt_notify(RTM_DELROUTE, rt, info); in fib6_del_route()
1388 rt6_release(rt); in fib6_del_route()
1391 int fib6_del(struct rt6_info *rt, struct nl_info *info) in fib6_del() argument
1394 struct fib6_node *fn = rt->rt6i_node; in fib6_del()
1398 if (rt->dst.obsolete > 0) { in fib6_del()
1403 if (!fn || rt == net->ipv6.ip6_null_entry) in fib6_del()
1408 if (!(rt->rt6i_flags & RTF_CACHE)) { in fib6_del()
1412 if (rt->rt6i_src.plen) { in fib6_del()
1426 if (*rtp == rt) { in fib6_del()
1559 struct rt6_info *rt; in fib6_clean_node() local
1575 for (rt = w->leaf; rt; rt = rt->dst.rt6_next) { in fib6_clean_node()
1576 res = c->func(rt, c->arg); in fib6_clean_node()
1578 w->leaf = rt; in fib6_clean_node()
1579 res = fib6_del(rt, &info); in fib6_clean_node()
1583 __func__, rt, rt->rt6i_node, res); in fib6_clean_node()
1591 w->leaf = rt; in fib6_clean_node()
1652 static int fib6_prune_clone(struct rt6_info *rt, void *arg) in fib6_prune_clone() argument
1654 if (rt->rt6i_flags & RTF_CACHE) { in fib6_prune_clone()
1655 RT6_TRACE("pruning clone %p\n", rt); in fib6_prune_clone()
1685 static int fib6_age(struct rt6_info *rt, void *arg) in fib6_age() argument
1697 if (rt->rt6i_flags & RTF_EXPIRES && rt->dst.expires) { in fib6_age()
1698 if (time_after(now, rt->dst.expires)) { in fib6_age()
1699 RT6_TRACE("expiring %p\n", rt); in fib6_age()
1703 } else if (rt->rt6i_flags & RTF_CACHE) { in fib6_age()
1704 if (atomic_read(&rt->dst.__refcnt) == 0 && in fib6_age()
1705 time_after_eq(now, rt->dst.lastuse + gc_args.timeout)) { in fib6_age()
1706 RT6_TRACE("aging clone %p\n", rt); in fib6_age()
1708 } else if (rt->rt6i_flags & RTF_GATEWAY) { in fib6_age()
1712 neigh = dst_neigh_lookup(&rt->dst, &rt->rt6i_gateway); in fib6_age()
1719 rt); in fib6_age()
1888 struct rt6_info *rt = v; in ipv6_route_seq_show() local
1891 seq_printf(seq, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen); in ipv6_route_seq_show()
1894 seq_printf(seq, "%pi6 %02x ", &rt->rt6i_src.addr, rt->rt6i_src.plen); in ipv6_route_seq_show()
1898 if (rt->rt6i_flags & RTF_GATEWAY) in ipv6_route_seq_show()
1899 seq_printf(seq, "%pi6", &rt->rt6i_gateway); in ipv6_route_seq_show()
1904 rt->rt6i_metric, atomic_read(&rt->dst.__refcnt), in ipv6_route_seq_show()
1905 rt->dst.__use, rt->rt6i_flags, in ipv6_route_seq_show()
1906 rt->dst.dev ? rt->dst.dev->name : ""); in ipv6_route_seq_show()