Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2774c131 authored by David S. Miller's avatar David S. Miller
Browse files

xfrm: Handle blackhole route creation via afinfo.



That way we don't have to potentially do this in every xfrm_lookup()
caller.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 69ead7af
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -432,17 +432,9 @@ static inline int xfrm_lookup(struct net *net, struct dst_entry **dst_p,
{
	return 0;
} 
static inline int __xfrm_lookup(struct net *net, struct dst_entry **dst_p,
				const struct flowi *fl, struct sock *sk,
				int flags)
{
	return 0;
}
#else
extern int xfrm_lookup(struct net *net, struct dst_entry **dst_p,
		       const struct flowi *fl, struct sock *sk, int flags);
extern int __xfrm_lookup(struct net *net, struct dst_entry **dst_p,
			 const struct flowi *fl, struct sock *sk, int flags);
#endif
#endif

+2 −2
Original line number Diff line number Diff line
@@ -520,7 +520,7 @@ extern struct dst_entry * ip6_sk_dst_lookup_flow(struct sock *sk,
						       struct flowi *fl,
						       const struct in6_addr *final_dst,
						       bool can_sleep);
extern struct dst_entry *	ip6_dst_blackhole(struct net *net,
extern struct dst_entry *	ip6_blackhole_route(struct net *net,
						    struct dst_entry *orig_dst);

/*
+1 −0
Original line number Diff line number Diff line
@@ -121,6 +121,7 @@ extern void rt_cache_flush_batch(struct net *net);
extern int		__ip_route_output_key(struct net *, struct rtable **, const struct flowi *flp);
extern int		ip_route_output_key(struct net *, struct rtable **, struct flowi *flp);
extern int		ip_route_output_flow(struct net *, struct rtable **rp, struct flowi *flp, struct sock *sk);
extern struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_orig);

extern int ip_route_input_common(struct sk_buff *skb, __be32 dst, __be32 src,
				 u8 tos, struct net_device *devin, bool noref);
+1 −0
Original line number Diff line number Diff line
@@ -280,6 +280,7 @@ struct xfrm_policy_afinfo {
	int			(*fill_dst)(struct xfrm_dst *xdst,
					    struct net_device *dev,
					    const struct flowi *fl);
	struct dst_entry	*(*blackhole_route)(struct net *net, struct dst_entry *orig);
};

extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo);
+7 −13
Original line number Diff line number Diff line
@@ -2675,12 +2675,10 @@ static struct dst_ops ipv4_dst_blackhole_ops = {
	.update_pmtu		=	ipv4_rt_blackhole_update_pmtu,
};


static int ipv4_dst_blackhole(struct net *net, struct rtable **rp, struct flowi *flp)
struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_orig)
{
	struct rtable *ort = *rp;
	struct rtable *rt = (struct rtable *)
		dst_alloc(&ipv4_dst_blackhole_ops, 1);
	struct rtable *rt = dst_alloc(&ipv4_dst_blackhole_ops, 1);
	struct rtable *ort = (struct rtable *) dst_orig;

	if (rt) {
		struct dst_entry *new = &rt->dst;
@@ -2714,9 +2712,9 @@ static int ipv4_dst_blackhole(struct net *net, struct rtable **rp, struct flowi
		dst_free(new);
	}

	dst_release(&(*rp)->dst);
	*rp = rt;
	return rt ? 0 : -ENOMEM;
	dst_release(dst_orig);

	return rt ? &rt->dst : ERR_PTR(-ENOMEM);
}

int ip_route_output_flow(struct net *net, struct rtable **rp, struct flowi *flp,
@@ -2732,11 +2730,7 @@ int ip_route_output_flow(struct net *net, struct rtable **rp, struct flowi *flp,
			flp->fl4_src = (*rp)->rt_src;
		if (!flp->fl4_dst)
			flp->fl4_dst = (*rp)->rt_dst;
		err = __xfrm_lookup(net, (struct dst_entry **)rp, flp, sk, 0);
		if (err == -EREMOTE)
			err = ipv4_dst_blackhole(net, rp, flp);

		return err;
		return xfrm_lookup(net, (struct dst_entry **)rp, flp, sk, 0);
	}

	return 0;
Loading