Lines Matching defs:fib6_nh
107 static int rt6_score_route(const struct fib6_nh *nh, u32 fib6_flags, int oif,
472 if (hash <= atomic_read(&first->fib6_nh->fib_nh_upper_bound)) {
473 if (rt6_score_route(first->fib6_nh, first->fib6_flags, oif,
481 const struct fib6_nh *nh = sibling->fib6_nh;
495 res->nh = match->fib6_nh;
502 static bool __rt6_device_match(struct net *net, const struct fib6_nh *nh,
528 struct fib6_nh *nh;
531 static int __rt6_nh_dev_match(struct fib6_nh *nh, void *_arg)
540 /* returns fib6_nh from nexthop or NULL */
541 static struct fib6_nh *rt6_nh_dev_match(struct net *net, struct nexthop *nh,
567 struct fib6_nh *nh;
575 nh = f6i->fib6_nh;
590 nh = spf6i->fib6_nh;
602 nh = res->f6i->fib6_nh;
611 nh = f6i->fib6_nh;
616 nh = res->f6i->fib6_nh;
650 static void rt6_probe(struct fib6_nh *fib6_nh)
667 if (!fib6_nh->fib_nh_gw_family)
670 nh_gw = &fib6_nh->fib_nh_gw6;
671 dev = fib6_nh->fib_nh_dev;
673 last_probe = READ_ONCE(fib6_nh->last_probe);
697 if (!work || cmpxchg(&fib6_nh->last_probe,
712 static inline void rt6_probe(struct fib6_nh *fib6_nh)
720 static enum rt6_nud_state rt6_check_neigh(const struct fib6_nh *fib6_nh)
726 neigh = __ipv6_neigh_lookup_noref(fib6_nh->fib_nh_dev,
727 &fib6_nh->fib_nh_gw6);
748 static int rt6_score_route(const struct fib6_nh *nh, u32 fib6_flags, int oif,
770 static bool find_match(struct fib6_nh *nh, u32 fib6_flags,
812 struct fib6_nh *nh;
815 static int rt6_nh_find_match(struct fib6_nh *nh, void *_arg)
835 struct fib6_nh *nh;
867 nh = f6i->fib6_nh;
953 res->nh = res->f6i->fib6_nh;
1171 const struct fib6_nh *nh = res->nh;
1625 const struct fib6_nh *nh = res->nh;
1653 struct rt6_exception_bucket *fib6_nh_get_excptn_bucket(const struct fib6_nh *nh,
1683 static void fib6_nh_excptn_bucket_set_flushed(struct fib6_nh *nh,
1706 struct fib6_nh *nh = res->nh;
1782 static void fib6_nh_flush_exceptions(struct fib6_nh *nh, struct fib6_info *from)
1812 static int rt6_nh_flush_exceptions(struct fib6_nh *nh, void *arg)
1828 fib6_nh_flush_exceptions(f6i->fib6_nh, f6i);
1878 static int fib6_nh_remove_exception(const struct fib6_nh *nh, int plen,
1921 static int rt6_nh_remove_exception_rt(struct fib6_nh *nh, void *_arg)
1955 return fib6_nh_remove_exception(from->fib6_nh,
1962 static void fib6_nh_update_exception(const struct fib6_nh *nh, int plen,
1988 struct fib6_nh *match;
1991 /* determine if fib6_nh has given device and gateway */
1992 static int fib6_nh_find_match(struct fib6_nh *nh, void *_arg)
2011 struct fib6_nh *fib6_nh;
2029 fib6_nh = arg.match;
2031 fib6_nh = from->fib6_nh;
2033 fib6_nh_update_exception(fib6_nh, from->fib6_src.plen, rt);
2061 const struct fib6_nh *nh, int mtu)
2089 static void fib6_nh_exceptions_clean_tohost(const struct fib6_nh *nh,
2164 static void fib6_nh_age_exceptions(const struct fib6_nh *nh,
2198 static int rt6_nh_age_exceptions(struct fib6_nh *nh, void *_arg)
2219 fib6_nh_age_exceptions(f6i->fib6_nh, gc_args, now);
2953 /* fib6_info uses a nexthop that does not have fib6_nh
2961 res.nh = res.f6i->fib6_nh;
3048 const struct fib6_nh *nh = res->nh;
3080 static int fib6_nh_redirect_match(struct fib6_nh *nh, void *_arg)
3140 res.nh = rt->fib6_nh;
3161 res.nh = rt->fib6_nh;
3282 const struct fib6_nh *nh = res->nh;
3568 int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
3572 netdevice_tracker *dev_tracker = &fib6_nh->fib_nh_dev_tracker;
3578 fib6_nh->fib_nh_family = AF_INET6;
3580 fib6_nh->last_probe = jiffies;
3583 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3584 fib6_nh->fib_nh_gw_family = AF_INET6;
3612 fib6_nh->fib_nh_flags |= RTNH_F_ONLINK;
3615 fib6_nh->fib_nh_weight = 1;
3645 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3646 fib6_nh->fib_nh_gw_family = AF_INET6;
3667 fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
3669 err = fib_nh_common_init(net, &fib6_nh->nh_common, cfg->fc_encap,
3675 fib6_nh->rt6i_pcpu = alloc_percpu_gfp(struct rt6_info *, gfp_flags);
3676 if (!fib6_nh->rt6i_pcpu) {
3681 fib6_nh->fib_nh_dev = dev;
3682 fib6_nh->fib_nh_oif = dev->ifindex;
3689 fib_nh_common_release(&fib6_nh->nh_common);
3690 fib6_nh->nh_common.nhc_pcpu_rth_output = NULL;
3691 fib6_nh->fib_nh_lws = NULL;
3698 void fib6_nh_release(struct fib6_nh *fib6_nh)
3704 fib6_nh_flush_exceptions(fib6_nh, NULL);
3705 bucket = fib6_nh_get_excptn_bucket(fib6_nh, NULL);
3707 rcu_assign_pointer(fib6_nh->rt6i_exception_bucket, NULL);
3713 fib6_nh_release_dsts(fib6_nh);
3714 free_percpu(fib6_nh->rt6i_pcpu);
3716 fib_nh_common_release(&fib6_nh->nh_common);
3719 void fib6_nh_release_dsts(struct fib6_nh *fib6_nh)
3723 if (!fib6_nh->rt6i_pcpu)
3729 ppcpu_rt = per_cpu_ptr(fib6_nh->rt6i_pcpu, cpu);
3858 struct fib6_nh *fib6_nh;
3884 fib6_nh = nexthop_fib6_nh(rt->nh);
3890 err = fib6_nh_init(net, rt->fib6_nh, cfg, gfp_flags, extack);
3894 fib6_nh = rt->fib6_nh;
3900 if (fib6_is_reject(cfg->fc_flags, rt->fib6_nh->fib_nh_dev,
3906 struct net_device *dev = fib6_nh->fib_nh_dev;
4079 struct fib6_nh *nh)
4099 static int fib6_nh_del_cached_rt(struct fib6_nh *nh, void *_arg)
4141 struct fib6_nh *nh;
4155 nh = rt->fib6_nh;
4181 nh = rt->fib6_nh;
4309 /* fib6_info uses a nexthop that does not have fib6_nh
4316 res.nh = res.f6i->fib6_nh;
4373 if (rt->fib6_nh->fib_nh_dev->ifindex != ifindex)
4376 !rt->fib6_nh->fib_nh_gw_family)
4378 if (!ipv6_addr_equal(&rt->fib6_nh->fib_nh_gw6, gwaddr))
4436 struct fib6_nh *nh;
4442 nh = rt->fib6_nh;
4710 !ipv6_chk_addr(net, addr, rt->fib6_nh->fib_nh_dev, 0)) {
4735 struct fib6_nh *nh;
4741 nh = rt->fib6_nh;
4788 /* only called for fib entries with builtin fib6_nh */
4791 if (rt->fib6_nh->fib_nh_flags & RTNH_F_DEAD ||
4792 (rt->fib6_nh->fib_nh_flags & RTNH_F_LINKDOWN &&
4793 ip6_ignore_linkdown(rt->fib6_nh->fib_nh_dev)))
4805 total += rt->fib6_nh->fib_nh_weight;
4809 total += iter->fib6_nh->fib_nh_weight;
4820 *weight += rt->fib6_nh->fib_nh_weight;
4824 atomic_set(&rt->fib6_nh->fib_nh_upper_bound, upper_bound);
4868 rt->fib6_nh->fib_nh_dev == arg->dev) {
4869 rt->fib6_nh->fib_nh_flags &= ~arg->nh_flags;
4892 /* only called for fib entries with inline fib6_nh */
4898 if (rt->fib6_nh->fib_nh_dev == dev)
4901 if (iter->fib6_nh->fib_nh_dev == dev)
4922 if (rt->fib6_nh->fib_nh_dev == down_dev ||
4923 rt->fib6_nh->fib_nh_flags & RTNH_F_DEAD)
4926 if (iter->fib6_nh->fib_nh_dev == down_dev ||
4927 iter->fib6_nh->fib_nh_flags & RTNH_F_DEAD)
4939 if (rt->fib6_nh->fib_nh_dev == dev)
4940 rt->fib6_nh->fib_nh_flags |= nh_flags;
4942 if (iter->fib6_nh->fib_nh_dev == dev)
4943 iter->fib6_nh->fib_nh_flags |= nh_flags;
4958 return rt->fib6_nh->fib_nh_dev == dev ? -1 : 0;
4963 return rt->fib6_nh->fib_nh_dev == dev ? -1 : 0;
4979 if (rt->fib6_nh->fib_nh_dev != dev ||
4982 rt->fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
5019 static int fib6_nh_mtu_change(struct fib6_nh *nh, void *_arg)
5070 return fib6_nh_mtu_change(f6i->fib6_nh, arg);
5457 rt->fib6_nh->fib_nh_weight = rtnh->rtnh_hops + 1;
5652 /* add the overhead of this fib6_nh to nexthop_len */
5653 static int rt6_nh_nlmsg_size(struct fib6_nh *nh, void *arg)
5674 struct fib6_nh *nh;
5686 nh = f6i->fib6_nh;
5693 rt6_nh_nlmsg_size(sibling->fib6_nh, &nexthop_len);
5732 struct fib6_nh *fib6_nh;
5734 fib6_nh = nexthop_fib6_nh(nh);
5735 if (fib_nexthop_info(skb, &fib6_nh->nh_common, AF_INET6,
5869 if (fib_add_nexthop(skb, &rt->fib6_nh->nh_common,
5870 rt->fib6_nh->fib_nh_weight, AF_INET6,
5878 if (fib_add_nexthop(skb, &sibling->fib6_nh->nh_common,
5879 sibling->fib6_nh->fib_nh_weight,
5903 if (fib_nexthop_info(skb, &rt->fib6_nh->nh_common, AF_INET6,
5939 static int fib6_info_nh_uses_dev(struct fib6_nh *nh, void *arg)
5960 if (f6i->fib6_nh->fib_nh_dev == dev)
5969 if (sibling->fib6_nh->fib_nh_dev == dev) {
5989 static int rt6_nh_dump_exceptions(struct fib6_nh *nh, void *arg)
6097 err = rt6_nh_dump_exceptions(rt->fib6_nh, &w);
6460 net->ipv6.fib6_null_entry->fib6_nh->fib_nh_dev = dev;
6807 init_net.ipv6.fib6_null_entry->fib6_nh->fib_nh_dev = init_net.loopback_dev;