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

Commit 8f01cb08 authored by David S. Miller's avatar David S. Miller
Browse files

ipv4: xfrm: Eliminate ->rt_src reference in policy code.



Rearrange xfrm4_dst_lookup() so that it works by calling a helper
function __xfrm_dst_lookup() that takes an explicit flow key storage
area as an argument.

Use this new helper in xfrm4_get_saddr() so we can fetch the selected
source address from the flow instead of from rt->rt_src

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5fc3590c
Loading
Loading
Loading
Loading
+21 −13
Original line number Diff line number Diff line
@@ -18,38 +18,46 @@

static struct xfrm_policy_afinfo xfrm4_policy_afinfo;

static struct dst_entry *xfrm4_dst_lookup(struct net *net, int tos,
static struct dst_entry *__xfrm4_dst_lookup(struct net *net, struct flowi4 *fl4,
					    int tos,
					    const xfrm_address_t *saddr,
					    const xfrm_address_t *daddr)
{
	struct flowi4 fl4 = {
		.daddr = daddr->a4,
		.flowi4_tos = tos,
	};
	struct rtable *rt;

	memset(fl4, 0, sizeof(*fl4));
	fl4->daddr = daddr->a4;
	fl4->flowi4_tos = tos;
	if (saddr)
		fl4.saddr = saddr->a4;
		fl4->saddr = saddr->a4;

	rt = __ip_route_output_key(net, &fl4);
	rt = __ip_route_output_key(net, fl4);
	if (!IS_ERR(rt))
		return &rt->dst;

	return ERR_CAST(rt);
}

static struct dst_entry *xfrm4_dst_lookup(struct net *net, int tos,
					  const xfrm_address_t *saddr,
					  const xfrm_address_t *daddr)
{
	struct flowi4 fl4;

	return __xfrm4_dst_lookup(net, &fl4, tos, saddr, daddr);
}

static int xfrm4_get_saddr(struct net *net,
			   xfrm_address_t *saddr, xfrm_address_t *daddr)
{
	struct dst_entry *dst;
	struct rtable *rt;
	struct flowi4 fl4;

	dst = xfrm4_dst_lookup(net, 0, NULL, daddr);
	dst = __xfrm4_dst_lookup(net, &fl4, 0, NULL, daddr);
	if (IS_ERR(dst))
		return -EHOSTUNREACH;

	rt = (struct rtable *)dst;
	saddr->a4 = rt->rt_src;
	saddr->a4 = fl4.saddr;
	dst_release(dst);
	return 0;
}