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: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5fc3590c81
commit
8f01cb0827
|
@ -18,38 +18,46 @@
|
||||||
|
|
||||||
static struct xfrm_policy_afinfo xfrm4_policy_afinfo;
|
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 *saddr,
|
||||||
const xfrm_address_t *daddr)
|
const xfrm_address_t *daddr)
|
||||||
{
|
{
|
||||||
struct flowi4 fl4 = {
|
|
||||||
.daddr = daddr->a4,
|
|
||||||
.flowi4_tos = tos,
|
|
||||||
};
|
|
||||||
struct rtable *rt;
|
struct rtable *rt;
|
||||||
|
|
||||||
|
memset(fl4, 0, sizeof(*fl4));
|
||||||
|
fl4->daddr = daddr->a4;
|
||||||
|
fl4->flowi4_tos = tos;
|
||||||
if (saddr)
|
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))
|
if (!IS_ERR(rt))
|
||||||
return &rt->dst;
|
return &rt->dst;
|
||||||
|
|
||||||
return ERR_CAST(rt);
|
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,
|
static int xfrm4_get_saddr(struct net *net,
|
||||||
xfrm_address_t *saddr, xfrm_address_t *daddr)
|
xfrm_address_t *saddr, xfrm_address_t *daddr)
|
||||||
{
|
{
|
||||||
struct dst_entry *dst;
|
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))
|
if (IS_ERR(dst))
|
||||||
return -EHOSTUNREACH;
|
return -EHOSTUNREACH;
|
||||||
|
|
||||||
rt = (struct rtable *)dst;
|
saddr->a4 = fl4.saddr;
|
||||||
saddr->a4 = rt->rt_src;
|
|
||||||
dst_release(dst);
|
dst_release(dst);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue