Lines Matching refs:fib6_nh

106 static int rt6_score_route(const struct fib6_nh *nh, u32 fib6_flags, int oif,
441 if (fl6->mp_hash <= atomic_read(&match->fib6_nh->fib_nh_upper_bound))
446 const struct fib6_nh *nh = sibling->fib6_nh;
460 res->nh = match->fib6_nh;
467 static bool __rt6_device_match(struct net *net, const struct fib6_nh *nh,
493 struct fib6_nh *nh;
496 static int __rt6_nh_dev_match(struct fib6_nh *nh, void *_arg)
505 /* returns fib6_nh from nexthop or NULL */
506 static struct fib6_nh *rt6_nh_dev_match(struct net *net, struct nexthop *nh,
532 struct fib6_nh *nh;
540 nh = f6i->fib6_nh;
555 nh = spf6i->fib6_nh;
567 nh = res->f6i->fib6_nh;
576 nh = f6i->fib6_nh;
581 nh = res->f6i->fib6_nh;
615 static void rt6_probe(struct fib6_nh *fib6_nh)
632 if (!fib6_nh->fib_nh_gw_family)
635 nh_gw = &fib6_nh->fib_nh_gw6;
636 dev = fib6_nh->fib_nh_dev;
638 last_probe = READ_ONCE(fib6_nh->last_probe);
659 if (!work || cmpxchg(&fib6_nh->last_probe,
674 static inline void rt6_probe(struct fib6_nh *fib6_nh)
682 static enum rt6_nud_state rt6_check_neigh(const struct fib6_nh *fib6_nh)
688 neigh = __ipv6_neigh_lookup_noref(fib6_nh->fib_nh_dev,
689 &fib6_nh->fib_nh_gw6);
710 static int rt6_score_route(const struct fib6_nh *nh, u32 fib6_flags, int oif,
732 static bool find_match(struct fib6_nh *nh, u32 fib6_flags,
774 struct fib6_nh *nh;
777 static int rt6_nh_find_match(struct fib6_nh *nh, void *_arg)
797 struct fib6_nh *nh;
829 nh = f6i->fib6_nh;
915 res->nh = res->f6i->fib6_nh;
1123 const struct fib6_nh *nh = res->nh;
1579 const struct fib6_nh *nh = res->nh;
1607 struct rt6_exception_bucket *fib6_nh_get_excptn_bucket(const struct fib6_nh *nh,
1637 static void fib6_nh_excptn_bucket_set_flushed(struct fib6_nh *nh,
1660 struct fib6_nh *nh = res->nh;
1735 static void fib6_nh_flush_exceptions(struct fib6_nh *nh, struct fib6_info *from)
1765 static int rt6_nh_flush_exceptions(struct fib6_nh *nh, void *arg)
1780 fib6_nh_flush_exceptions(f6i->fib6_nh, f6i);
1829 static int fib6_nh_remove_exception(const struct fib6_nh *nh, int plen,
1872 static int rt6_nh_remove_exception_rt(struct fib6_nh *nh, void *_arg)
1906 return fib6_nh_remove_exception(from->fib6_nh,
1913 static void fib6_nh_update_exception(const struct fib6_nh *nh, int plen,
1939 struct fib6_nh *match;
1942 /* determine if fib6_nh has given device and gateway */
1943 static int fib6_nh_find_match(struct fib6_nh *nh, void *_arg)
1962 struct fib6_nh *fib6_nh;
1980 fib6_nh = arg.match;
1982 fib6_nh = from->fib6_nh;
1984 fib6_nh_update_exception(fib6_nh, from->fib6_src.plen, rt);
2012 const struct fib6_nh *nh, int mtu)
2040 static void fib6_nh_exceptions_clean_tohost(const struct fib6_nh *nh,
2114 static void fib6_nh_age_exceptions(const struct fib6_nh *nh,
2148 static int rt6_nh_age_exceptions(struct fib6_nh *nh, void *_arg)
2169 fib6_nh_age_exceptions(f6i->fib6_nh, gc_args, now);
2897 /* fib6_info uses a nexthop that does not have fib6_nh
2905 res.nh = res.f6i->fib6_nh;
2993 const struct fib6_nh *nh = res->nh;
3025 static int fib6_nh_redirect_match(struct fib6_nh *nh, void *_arg)
3085 res.nh = rt->fib6_nh;
3106 res.nh = rt->fib6_nh;
3223 const struct fib6_nh *nh = res->nh;
3509 int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
3513 netdevice_tracker *dev_tracker = &fib6_nh->fib_nh_dev_tracker;
3519 fib6_nh->fib_nh_family = AF_INET6;
3521 fib6_nh->last_probe = jiffies;
3524 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3525 fib6_nh->fib_nh_gw_family = AF_INET6;
3553 fib6_nh->fib_nh_flags |= RTNH_F_ONLINK;
3556 fib6_nh->fib_nh_weight = 1;
3586 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3587 fib6_nh->fib_nh_gw_family = AF_INET6;
3608 fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
3610 err = fib_nh_common_init(net, &fib6_nh->nh_common, cfg->fc_encap,
3616 fib6_nh->rt6i_pcpu = alloc_percpu_gfp(struct rt6_info *, gfp_flags);
3617 if (!fib6_nh->rt6i_pcpu) {
3622 fib6_nh->fib_nh_dev = dev;
3623 fib6_nh->fib_nh_oif = dev->ifindex;
3630 lwtstate_put(fib6_nh->fib_nh_lws);
3631 fib6_nh->fib_nh_lws = NULL;
3638 void fib6_nh_release(struct fib6_nh *fib6_nh)
3644 fib6_nh_flush_exceptions(fib6_nh, NULL);
3645 bucket = fib6_nh_get_excptn_bucket(fib6_nh, NULL);
3647 rcu_assign_pointer(fib6_nh->rt6i_exception_bucket, NULL);
3653 fib6_nh_release_dsts(fib6_nh);
3654 free_percpu(fib6_nh->rt6i_pcpu);
3656 fib_nh_common_release(&fib6_nh->nh_common);
3659 void fib6_nh_release_dsts(struct fib6_nh *fib6_nh)
3663 if (!fib6_nh->rt6i_pcpu)
3669 ppcpu_rt = per_cpu_ptr(fib6_nh->rt6i_pcpu, cpu);
3686 struct fib6_nh *fib6_nh;
3797 fib6_nh = nexthop_fib6_nh(rt->nh);
3799 err = fib6_nh_init(net, rt->fib6_nh, cfg, gfp_flags, extack);
3803 fib6_nh = rt->fib6_nh;
3809 if (fib6_is_reject(cfg->fc_flags, rt->fib6_nh->fib_nh_dev,
3815 struct net_device *dev = fib6_nh->fib_nh_dev;
3980 struct fib6_nh *nh)
4000 static int fib6_nh_del_cached_rt(struct fib6_nh *nh, void *_arg)
4042 struct fib6_nh *nh;
4056 nh = rt->fib6_nh;
4082 nh = rt->fib6_nh;
4209 /* fib6_info uses a nexthop that does not have fib6_nh
4216 res.nh = res.f6i->fib6_nh;
4273 if (rt->fib6_nh->fib_nh_dev->ifindex != ifindex)
4276 !rt->fib6_nh->fib_nh_gw_family)
4278 if (!ipv6_addr_equal(&rt->fib6_nh->fib_nh_gw6, gwaddr))
4336 struct fib6_nh *nh;
4342 nh = rt->fib6_nh;
4599 !ipv6_chk_addr(net, addr, rt->fib6_nh->fib_nh_dev, 0)) {
4624 struct fib6_nh *nh;
4630 nh = rt->fib6_nh;
4677 /* only called for fib entries with builtin fib6_nh */
4680 if (rt->fib6_nh->fib_nh_flags & RTNH_F_DEAD ||
4681 (rt->fib6_nh->fib_nh_flags & RTNH_F_LINKDOWN &&
4682 ip6_ignore_linkdown(rt->fib6_nh->fib_nh_dev)))
4694 total += rt->fib6_nh->fib_nh_weight;
4698 total += iter->fib6_nh->fib_nh_weight;
4709 *weight += rt->fib6_nh->fib_nh_weight;
4713 atomic_set(&rt->fib6_nh->fib_nh_upper_bound, upper_bound);
4757 rt->fib6_nh->fib_nh_dev == arg->dev) {
4758 rt->fib6_nh->fib_nh_flags &= ~arg->nh_flags;
4781 /* only called for fib entries with inline fib6_nh */
4787 if (rt->fib6_nh->fib_nh_dev == dev)
4790 if (iter->fib6_nh->fib_nh_dev == dev)
4811 if (rt->fib6_nh->fib_nh_dev == down_dev ||
4812 rt->fib6_nh->fib_nh_flags & RTNH_F_DEAD)
4815 if (iter->fib6_nh->fib_nh_dev == down_dev ||
4816 iter->fib6_nh->fib_nh_flags & RTNH_F_DEAD)
4828 if (rt->fib6_nh->fib_nh_dev == dev)
4829 rt->fib6_nh->fib_nh_flags |= nh_flags;
4831 if (iter->fib6_nh->fib_nh_dev == dev)
4832 iter->fib6_nh->fib_nh_flags |= nh_flags;
4847 return rt->fib6_nh->fib_nh_dev == dev ? -1 : 0;
4852 return rt->fib6_nh->fib_nh_dev == dev ? -1 : 0;
4868 if (rt->fib6_nh->fib_nh_dev != dev ||
4871 rt->fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
4908 static int fib6_nh_mtu_change(struct fib6_nh *nh, void *_arg)
4959 return fib6_nh_mtu_change(f6i->fib6_nh, arg);
5303 rt->fib6_nh->fib_nh_weight = rtnh->rtnh_hops + 1;
5506 /* add the overhead of this fib6_nh to nexthop_len */
5507 static int rt6_nh_nlmsg_size(struct fib6_nh *nh, void *arg)
5535 struct fib6_nh *nh = f6i->fib6_nh;
5543 rt6_nh_nlmsg_size(sibling->fib6_nh, &nexthop_len);
5580 struct fib6_nh *fib6_nh;
5582 fib6_nh = nexthop_fib6_nh(nh);
5583 if (fib_nexthop_info(skb, &fib6_nh->nh_common, AF_INET6,
5715 if (fib_add_nexthop(skb, &rt->fib6_nh->nh_common,
5716 rt->fib6_nh->fib_nh_weight, AF_INET6,
5722 if (fib_add_nexthop(skb, &sibling->fib6_nh->nh_common,
5723 sibling->fib6_nh->fib_nh_weight,
5742 if (fib_nexthop_info(skb, &rt->fib6_nh->nh_common, AF_INET6,
5778 static int fib6_info_nh_uses_dev(struct fib6_nh *nh, void *arg)
5799 if (f6i->fib6_nh->fib_nh_dev == dev)
5807 if (sibling->fib6_nh->fib_nh_dev == dev)
5823 static int rt6_nh_dump_exceptions(struct fib6_nh *nh, void *arg)
5931 err = rt6_nh_dump_exceptions(rt->fib6_nh, &w);
6274 net->ipv6.fib6_null_entry->fib6_nh->fib_nh_dev = dev;
6626 init_net.ipv6.fib6_null_entry->fib6_nh->fib_nh_dev = init_net.loopback_dev;