forked from Minki/linux
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 dst_entry *xfrm4_dst_lookup(struct net *net, int tos,
|
||||
const xfrm_address_t *saddr,
|
||||
const xfrm_address_t *daddr)
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user