ipv4: xfrm: Eliminate ->rt_src reference in policy code.
authorDavid S. Miller <davem@davemloft.net>
Mon, 9 May 2011 22:13:28 +0000 (15:13 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 10 May 2011 20:32:48 +0000 (13:32 -0700)
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>
net/ipv4/xfrm4_policy.c

index 7ff973b..981e43e 100644 (file)
 
 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;
 }