Skip to content

Commit

Permalink
ipv4: xfrm: Eliminate ->rt_src reference in policy code.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David S. Miller committed May 10, 2011
1 parent 5fc3590 commit 8f01cb0
Showing 1 changed file with 21 additions and 13 deletions.
34 changes: 21 additions & 13 deletions net/ipv4/xfrm4_policy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit 8f01cb0

Please sign in to comment.