Lines Matching refs:f6i
108 static size_t rt6_nlmsg_size(struct fib6_info *f6i);
418 struct fib6_info *match = res->f6i;
459 res->f6i = match;
530 struct fib6_info *f6i = res->f6i;
535 if (unlikely(f6i->nh)) {
536 nh = nexthop_fib6_nh(f6i->nh);
537 if (nexthop_is_blackhole(f6i->nh))
540 nh = f6i->fib6_nh;
546 for (spf6i = f6i; spf6i; spf6i = rcu_dereference(spf6i->fib6_next)) {
560 res->f6i = spf6i;
566 res->f6i = net->ipv6.fib6_null_entry;
567 nh = res->f6i->fib6_nh;
571 if (unlikely(f6i->nh)) {
572 nh = nexthop_fib6_nh(f6i->nh);
573 if (nexthop_is_blackhole(f6i->nh))
576 nh = f6i->fib6_nh;
580 res->f6i = net->ipv6.fib6_null_entry;
581 nh = res->f6i->fib6_nh;
585 res->fib6_type = res->f6i->fib6_type;
586 res->fib6_flags = res->f6i->fib6_flags;
791 struct fib6_info *f6i;
793 for (f6i = f6i_start;
794 f6i && f6i != nomatch;
795 f6i = rcu_dereference(f6i->fib6_next)) {
799 if (cont && f6i->fib6_metric != metric) {
800 *cont = f6i;
804 if (fib6_check_expired(f6i))
807 if (unlikely(f6i->nh)) {
809 .flags = f6i->fib6_flags,
816 if (nexthop_is_blackhole(f6i->nh)) {
819 res->f6i = f6i;
820 res->nh = nexthop_fib6_nh(f6i->nh);
823 if (nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_find_match,
829 nh = f6i->fib6_nh;
830 if (find_match(nh, f6i->fib6_flags, oif, strict,
835 res->f6i = f6i;
837 res->fib6_flags = f6i->fib6_flags;
838 res->fib6_type = f6i->fib6_type;
857 if (res->f6i || !cont)
872 /* make sure this function or its helpers sets f6i */
873 res->f6i = NULL;
913 if (!res->f6i) {
914 res->f6i = net->ipv6.fib6_null_entry;
915 res->nh = res->f6i->fib6_nh;
916 res->fib6_flags = res->f6i->fib6_flags;
917 res->fib6_type = res->f6i->fib6_type;
923 return (res->f6i->fib6_flags & RTF_NONEXTHOP) ||
1018 !rt6_need_strict(&res->f6i->fib6_dst.addr))
1086 struct fib6_info *f6i = res->f6i;
1098 } else if (ipv6_addr_type(&f6i->fib6_dst.addr) & IPV6_ADDR_MULTICAST) {
1120 /* Caller must already hold reference to f6i in result */
1125 struct fib6_info *f6i = res->f6i;
1129 rt->rt6i_dst = f6i->fib6_dst;
1136 rt6_set_from(rt, f6i);
1138 rt->rt6i_src = f6i->fib6_src;
1180 struct fib6_info *f6i = res->f6i;
1184 if (!fib6_info_hold_safe(f6i))
1187 flags = fib6_info_dst_flags(f6i);
1190 fib6_info_release(f6i);
1216 res.f6i = rcu_dereference(fn->leaf);
1217 if (!res.f6i)
1218 res.f6i = net->ipv6.fib6_null_entry;
1223 if (res.f6i == net->ipv6.fib6_null_entry) {
1320 struct fib6_info *f6i = res->f6i;
1328 if (!fib6_info_hold_safe(f6i))
1334 fib6_info_release(f6i);
1344 if (f6i->fib6_dst.plen != 128 &&
1345 ipv6_addr_equal(&f6i->fib6_dst.addr, daddr))
1360 struct fib6_info *f6i = res->f6i;
1361 unsigned short flags = fib6_info_dst_flags(f6i);
1365 if (!fib6_info_hold_safe(f6i))
1373 fib6_info_release(f6i);
1379 if (f6i->nh)
1426 if (res->f6i->fib6_destroying) {
1582 if (res->f6i->fib6_pmtu) {
1583 mtu = res->f6i->fib6_pmtu;
1657 struct fib6_info *f6i = res->f6i;
1682 /* fib6_src.plen != 0 indicates f6i is in subtree
1688 if (f6i->fib6_src.plen)
1691 /* rt6_mtu_change() might lower mtu on f6i.
1693 * is less than f6i's mtu value.
1726 spin_lock_bh(&f6i->fib6_table->tb6_lock);
1727 fib6_update_sernum(net, f6i);
1728 spin_unlock_bh(&f6i->fib6_table->tb6_lock);
1767 struct fib6_info *f6i = arg;
1769 fib6_nh_flush_exceptions(nh, f6i);
1774 void rt6_flush_exceptions(struct fib6_info *f6i)
1776 if (f6i->nh)
1777 nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_flush_exceptions,
1778 f6i);
1780 fib6_nh_flush_exceptions(f6i->fib6_nh, f6i);
1796 /* fib6i_src.plen != 0 indicates f6i is in subtree
1802 * So we need to use f6i->fib6_src to redo lookup
1807 if (res->f6i->fib6_src.plen)
1819 if (!ret && src_key && src_key != &res->f6i->fib6_src.addr) {
1820 src_key = &res->f6i->fib6_src.addr;
2156 void rt6_age_exceptions(struct fib6_info *f6i,
2160 if (f6i->nh) {
2166 nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_age_exceptions,
2169 fib6_nh_age_exceptions(f6i->fib6_nh, gc_args, now);
2184 if (res->f6i == net->ipv6.fib6_null_entry) {
2220 if (res.f6i == net->ipv6.fib6_null_entry)
2689 static bool fib6_check(struct fib6_info *f6i, u32 cookie)
2693 if (!fib6_get_cookie_safe(f6i, &rt_cookie) || rt_cookie != cookie)
2696 if (fib6_check_expired(f6i))
2881 res.f6i = rcu_dereference(rt6->from);
2882 if (!res.f6i)
2885 res.fib6_flags = res.f6i->fib6_flags;
2886 res.fib6_type = res.f6i->fib6_type;
2888 if (res.f6i->nh) {
2894 nexthop_for_each_fib6_nh(res.f6i->nh,
2905 res.nh = res.f6i->fib6_nh;
3071 res.f6i = rt;
3105 res.f6i = rt;
3111 res.fib6_flags = res.f6i->fib6_flags;
3112 res.fib6_type = res.f6i->fib6_type;
3224 struct fib6_info *f6i = res->f6i;
3229 if (unlikely(fib6_metric_locked(f6i, RTAX_MTU))) {
3230 mtu = f6i->fib6_pmtu;
3333 if (!err && res->f6i != net->ipv6.fib6_null_entry)
3353 !ipv6_addr_any(&res.f6i->fib6_dst.addr) &&
3983 .f6i = rt,
3997 struct fib6_info *f6i;
4005 rc = ip6_del_cached_rt(arg->cfg, arg->f6i, nh);
4009 static int ip6_del_cached_rt_nh(struct fib6_config *cfg, struct fib6_info *f6i)
4013 .f6i = f6i
4016 return nexthop_for_each_fib6_nh(f6i->nh, fib6_nh_del_cached_rt, &arg);
4196 res.f6i = rcu_dereference(rt->from);
4197 if (!res.f6i)
4200 if (res.f6i->nh) {
4206 nexthop_for_each_fib6_nh(res.f6i->nh,
4216 res.nh = res.f6i->fib6_nh;
4219 res.fib6_flags = res.f6i->fib6_flags;
4220 res.fib6_type = res.f6i->fib6_type;
4562 struct fib6_info *f6i;
4572 f6i = ip6_route_info_create(&cfg, gfp_flags, extack);
4573 if (!IS_ERR(f6i)) {
4574 f6i->dst_nocount = true;
4579 f6i->dst_nopolicy = true;
4582 return f6i;
4905 struct fib6_info *f6i;
4911 struct fib6_info *f6i = arg->f6i;
4920 u32 mtu = f6i->fib6_pmtu;
4924 fib6_metric_set(f6i, RTAX_MTU, arg->mtu);
4934 static int rt6_mtu_change_route(struct fib6_info *f6i, void *p_arg)
4949 if (fib6_metric_locked(f6i, RTAX_MTU))
4952 arg->f6i = f6i;
4953 if (f6i->nh) {
4955 return nexthop_for_each_fib6_nh(f6i->nh, fib6_nh_mtu_change,
4959 return fib6_nh_mtu_change(f6i->fib6_nh, arg);
5525 static size_t rt6_nlmsg_size(struct fib6_info *f6i)
5529 if (f6i->nh) {
5531 nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_nlmsg_size,
5535 struct fib6_nh *nh = f6i->fib6_nh;
5538 if (f6i->fib6_nsiblings) {
5542 &f6i->fib6_siblings, fib6_siblings) {
5788 static bool fib6_info_uses_dev(const struct fib6_info *f6i,
5791 if (f6i->nh) {
5794 return !!nexthop_for_each_fib6_nh(f6i->nh,
5799 if (f6i->fib6_nh->fib_nh_dev == dev)
5802 if (f6i->fib6_nsiblings) {
5806 &f6i->fib6_siblings, fib6_siblings) {
6211 void fib6_info_hw_flags_set(struct net *net, struct fib6_info *f6i,
6217 if (READ_ONCE(f6i->offload) == offload &&
6218 READ_ONCE(f6i->trap) == trap &&
6219 READ_ONCE(f6i->offload_failed) == offload_failed)
6222 WRITE_ONCE(f6i->offload, offload);
6223 WRITE_ONCE(f6i->trap, trap);
6227 READ_ONCE(f6i->offload_failed) == offload_failed)
6230 WRITE_ONCE(f6i->offload_failed, offload_failed);
6232 if (!rcu_access_pointer(f6i->fib6_node))
6241 skb = nlmsg_new(rt6_nlmsg_size(f6i), GFP_KERNEL);
6247 err = rt6_fill_node(net, skb, f6i, NULL, NULL, NULL, 0, RTM_NEWROUTE, 0,