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);
660 if (!work || cmpxchg(&fib6_nh->last_probe,
675 static inline void rt6_probe(struct fib6_nh *fib6_nh)
683 static enum rt6_nud_state rt6_check_neigh(const struct fib6_nh *fib6_nh)
689 neigh = __ipv6_neigh_lookup_noref(fib6_nh->fib_nh_dev,
690 &fib6_nh->fib_nh_gw6);
711 static int rt6_score_route(const struct fib6_nh *nh, u32 fib6_flags, int oif,
733 static bool find_match(struct fib6_nh *nh, u32 fib6_flags,
775 struct fib6_nh *nh;
778 static int rt6_nh_find_match(struct fib6_nh *nh, void *_arg)
798 struct fib6_nh *nh;
830 nh = f6i->fib6_nh;
916 res->nh = res->f6i->fib6_nh;
1133 const struct fib6_nh *nh = res->nh;
1589 const struct fib6_nh *nh = res->nh;
1617 struct rt6_exception_bucket *fib6_nh_get_excptn_bucket(const struct fib6_nh *nh,
1647 static void fib6_nh_excptn_bucket_set_flushed(struct fib6_nh *nh,
1670 struct fib6_nh *nh = res->nh;
1745 static void fib6_nh_flush_exceptions(struct fib6_nh *nh, struct fib6_info *from)
1775 static int rt6_nh_flush_exceptions(struct fib6_nh *nh, void *arg)
1790 fib6_nh_flush_exceptions(f6i->fib6_nh, f6i);
1839 static int fib6_nh_remove_exception(const struct fib6_nh *nh, int plen,
1882 static int rt6_nh_remove_exception_rt(struct fib6_nh *nh, void *_arg)
1916 return fib6_nh_remove_exception(from->fib6_nh,
1923 static void fib6_nh_update_exception(const struct fib6_nh *nh, int plen,
1949 struct fib6_nh *match;
1952 /* determine if fib6_nh has given device and gateway */
1953 static int fib6_nh_find_match(struct fib6_nh *nh, void *_arg)
1972 struct fib6_nh *fib6_nh;
1990 fib6_nh = arg.match;
1992 fib6_nh = from->fib6_nh;
1994 fib6_nh_update_exception(fib6_nh, from->fib6_src.plen, rt);
2022 const struct fib6_nh *nh, int mtu)
2050 static void fib6_nh_exceptions_clean_tohost(const struct fib6_nh *nh,
2124 static void fib6_nh_age_exceptions(const struct fib6_nh *nh,
2158 static int rt6_nh_age_exceptions(struct fib6_nh *nh, void *_arg)
2179 fib6_nh_age_exceptions(f6i->fib6_nh, gc_args, now);
2907 /* fib6_info uses a nexthop that does not have fib6_nh
2915 res.nh = res.f6i->fib6_nh;
3003 const struct fib6_nh *nh = res->nh;
3035 static int fib6_nh_redirect_match(struct fib6_nh *nh, void *_arg)
3095 res.nh = rt->fib6_nh;
3116 res.nh = rt->fib6_nh;
3233 const struct fib6_nh *nh = res->nh;
3519 int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
3523 netdevice_tracker *dev_tracker = &fib6_nh->fib_nh_dev_tracker;
3529 fib6_nh->fib_nh_family = AF_INET6;
3531 fib6_nh->last_probe = jiffies;
3534 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3535 fib6_nh->fib_nh_gw_family = AF_INET6;
3563 fib6_nh->fib_nh_flags |= RTNH_F_ONLINK;
3566 fib6_nh->fib_nh_weight = 1;
3596 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3597 fib6_nh->fib_nh_gw_family = AF_INET6;
3618 fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
3620 err = fib_nh_common_init(net, &fib6_nh->nh_common, cfg->fc_encap,
3626 fib6_nh->rt6i_pcpu = alloc_percpu_gfp(struct rt6_info *, gfp_flags);
3627 if (!fib6_nh->rt6i_pcpu) {
3632 fib6_nh->fib_nh_dev = dev;
3633 fib6_nh->fib_nh_oif = dev->ifindex;
3640 lwtstate_put(fib6_nh->fib_nh_lws);
3641 fib6_nh->fib_nh_lws = NULL;
3648 void fib6_nh_release(struct fib6_nh *fib6_nh)
3654 fib6_nh_flush_exceptions(fib6_nh, NULL);
3655 bucket = fib6_nh_get_excptn_bucket(fib6_nh, NULL);
3657 rcu_assign_pointer(fib6_nh->rt6i_exception_bucket, NULL);
3663 fib6_nh_release_dsts(fib6_nh);
3664 free_percpu(fib6_nh->rt6i_pcpu);
3666 fib_nh_common_release(&fib6_nh->nh_common);
3669 void fib6_nh_release_dsts(struct fib6_nh *fib6_nh)
3673 if (!fib6_nh->rt6i_pcpu)
3679 ppcpu_rt = per_cpu_ptr(fib6_nh->rt6i_pcpu, cpu);
3696 struct fib6_nh *fib6_nh;
3805 fib6_nh = nexthop_fib6_nh(rt->nh);
3807 err = fib6_nh_init(net, rt->fib6_nh, cfg, gfp_flags, extack);
3811 fib6_nh = rt->fib6_nh;
3817 if (fib6_is_reject(cfg->fc_flags, rt->fib6_nh->fib_nh_dev,
3823 struct net_device *dev = fib6_nh->fib_nh_dev;
3988 struct fib6_nh *nh)
4008 static int fib6_nh_del_cached_rt(struct fib6_nh *nh, void *_arg)
4050 struct fib6_nh *nh;
4064 nh = rt->fib6_nh;
4090 nh = rt->fib6_nh;
4218 /* fib6_info uses a nexthop that does not have fib6_nh
4225 res.nh = res.f6i->fib6_nh;
4282 if (rt->fib6_nh->fib_nh_dev->ifindex != ifindex)
4285 !rt->fib6_nh->fib_nh_gw_family)
4287 if (!ipv6_addr_equal(&rt->fib6_nh->fib_nh_gw6, gwaddr))
4345 struct fib6_nh *nh;
4351 nh = rt->fib6_nh;
4610 !ipv6_chk_addr(net, addr, rt->fib6_nh->fib_nh_dev, 0)) {
4635 struct fib6_nh *nh;
4641 nh = rt->fib6_nh;
4688 /* only called for fib entries with builtin fib6_nh */
4691 if (rt->fib6_nh->fib_nh_flags & RTNH_F_DEAD ||
4692 (rt->fib6_nh->fib_nh_flags & RTNH_F_LINKDOWN &&
4693 ip6_ignore_linkdown(rt->fib6_nh->fib_nh_dev)))
4705 total += rt->fib6_nh->fib_nh_weight;
4709 total += iter->fib6_nh->fib_nh_weight;
4720 *weight += rt->fib6_nh->fib_nh_weight;
4724 atomic_set(&rt->fib6_nh->fib_nh_upper_bound, upper_bound);
4768 rt->fib6_nh->fib_nh_dev == arg->dev) {
4769 rt->fib6_nh->fib_nh_flags &= ~arg->nh_flags;
4792 /* only called for fib entries with inline fib6_nh */
4798 if (rt->fib6_nh->fib_nh_dev == dev)
4801 if (iter->fib6_nh->fib_nh_dev == dev)
4822 if (rt->fib6_nh->fib_nh_dev == down_dev ||
4823 rt->fib6_nh->fib_nh_flags & RTNH_F_DEAD)
4826 if (iter->fib6_nh->fib_nh_dev == down_dev ||
4827 iter->fib6_nh->fib_nh_flags & RTNH_F_DEAD)
4839 if (rt->fib6_nh->fib_nh_dev == dev)
4840 rt->fib6_nh->fib_nh_flags |= nh_flags;
4842 if (iter->fib6_nh->fib_nh_dev == dev)
4843 iter->fib6_nh->fib_nh_flags |= nh_flags;
4858 return rt->fib6_nh->fib_nh_dev == dev ? -1 : 0;
4863 return rt->fib6_nh->fib_nh_dev == dev ? -1 : 0;
4879 if (rt->fib6_nh->fib_nh_dev != dev ||
4882 rt->fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
4919 static int fib6_nh_mtu_change(struct fib6_nh *nh, void *_arg)
4970 return fib6_nh_mtu_change(f6i->fib6_nh, arg);
5314 rt->fib6_nh->fib_nh_weight = rtnh->rtnh_hops + 1;
5517 /* add the overhead of this fib6_nh to nexthop_len */
5518 static int rt6_nh_nlmsg_size(struct fib6_nh *nh, void *arg)
5546 struct fib6_nh *nh = f6i->fib6_nh;
5554 rt6_nh_nlmsg_size(sibling->fib6_nh, &nexthop_len);
5591 struct fib6_nh *fib6_nh;
5593 fib6_nh = nexthop_fib6_nh(nh);
5594 if (fib_nexthop_info(skb, &fib6_nh->nh_common, AF_INET6,
5726 if (fib_add_nexthop(skb, &rt->fib6_nh->nh_common,
5727 rt->fib6_nh->fib_nh_weight, AF_INET6,
5733 if (fib_add_nexthop(skb, &sibling->fib6_nh->nh_common,
5734 sibling->fib6_nh->fib_nh_weight,
5753 if (fib_nexthop_info(skb, &rt->fib6_nh->nh_common, AF_INET6,
5789 static int fib6_info_nh_uses_dev(struct fib6_nh *nh, void *arg)
5810 if (f6i->fib6_nh->fib_nh_dev == dev)
5818 if (sibling->fib6_nh->fib_nh_dev == dev)
5834 static int rt6_nh_dump_exceptions(struct fib6_nh *nh, void *arg)
5942 err = rt6_nh_dump_exceptions(rt->fib6_nh, &w);
6285 net->ipv6.fib6_null_entry->fib6_nh->fib_nh_dev = dev;
6632 init_net.ipv6.fib6_null_entry->fib6_nh->fib_nh_dev = init_net.loopback_dev;