aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-03-02 16:27:41 -0500
committerDavid S. Miller <davem@davemloft.net>2011-03-02 16:27:41 -0500
commit452edd598f60522c11f7f88fdbab27eb36509d1a (patch)
treedf1510e9848e591a412c8bfa724253470c48c4c2 /net/ipv4
parent3872b284087081ee5cb0e4630954c2f7a2153cf5 (diff)
xfrm: Return dst directly from xfrm_lookup()
Instead of on the stack. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/icmp.c36
-rw-r--r--net/ipv4/netfilter.c6
-rw-r--r--net/ipv4/route.c7
3 files changed, 24 insertions, 25 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index 2a86c8951dcd..c23bd8cdeee0 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -398,18 +398,14 @@ static struct rtable *icmp_route_lookup(struct net *net, struct sk_buff *skb_in,
398 if (!fl.fl4_src) 398 if (!fl.fl4_src)
399 fl.fl4_src = rt->rt_src; 399 fl.fl4_src = rt->rt_src;
400 400
401 err = xfrm_lookup(net, (struct dst_entry **)&rt, &fl, NULL, 0); 401 rt = (struct rtable *) xfrm_lookup(net, &rt->dst, &fl, NULL, 0);
402 switch (err) { 402 if (!IS_ERR(rt)) {
403 case 0:
404 if (rt != rt2) 403 if (rt != rt2)
405 return rt; 404 return rt;
406 break; 405 } else if (PTR_ERR(rt) == -EPERM) {
407 case -EPERM:
408 rt = NULL; 406 rt = NULL;
409 break; 407 } else
410 default: 408 return rt;
411 return ERR_PTR(err);
412 }
413 409
414 err = xfrm_decode_session_reverse(skb_in, &fl, AF_INET); 410 err = xfrm_decode_session_reverse(skb_in, &fl, AF_INET);
415 if (err) 411 if (err)
@@ -438,22 +434,18 @@ static struct rtable *icmp_route_lookup(struct net *net, struct sk_buff *skb_in,
438 if (err) 434 if (err)
439 goto relookup_failed; 435 goto relookup_failed;
440 436
441 err = xfrm_lookup(net, (struct dst_entry **)&rt2, &fl, NULL, 437 rt2 = (struct rtable *) xfrm_lookup(net, &rt2->dst, &fl, NULL, XFRM_LOOKUP_ICMP);
442 XFRM_LOOKUP_ICMP); 438 if (!IS_ERR(rt2)) {
443 switch (err) {
444 case 0:
445 dst_release(&rt->dst); 439 dst_release(&rt->dst);
446 rt = rt2; 440 rt = rt2;
447 break; 441 } else if (PTR_ERR(rt2) == -EPERM) {
448 case -EPERM: 442 if (rt)
449 return ERR_PTR(err); 443 dst_release(&rt->dst);
450 default: 444 return rt2;
451 if (!rt) 445 } else {
452 return ERR_PTR(err); 446 err = PTR_ERR(rt2);
453 break; 447 goto relookup_failed;
454 } 448 }
455
456
457 return rt; 449 return rt;
458 450
459relookup_failed: 451relookup_failed:
diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c
index 994a1f29ebbc..9770bb427952 100644
--- a/net/ipv4/netfilter.c
+++ b/net/ipv4/netfilter.c
@@ -69,7 +69,8 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type)
69 xfrm_decode_session(skb, &fl, AF_INET) == 0) { 69 xfrm_decode_session(skb, &fl, AF_INET) == 0) {
70 struct dst_entry *dst = skb_dst(skb); 70 struct dst_entry *dst = skb_dst(skb);
71 skb_dst_set(skb, NULL); 71 skb_dst_set(skb, NULL);
72 if (xfrm_lookup(net, &dst, &fl, skb->sk, 0)) 72 dst = xfrm_lookup(net, dst, &fl, skb->sk, 0);
73 if (IS_ERR(dst))
73 return -1; 74 return -1;
74 skb_dst_set(skb, dst); 75 skb_dst_set(skb, dst);
75 } 76 }
@@ -102,7 +103,8 @@ int ip_xfrm_me_harder(struct sk_buff *skb)
102 dst = ((struct xfrm_dst *)dst)->route; 103 dst = ((struct xfrm_dst *)dst)->route;
103 dst_hold(dst); 104 dst_hold(dst);
104 105
105 if (xfrm_lookup(dev_net(dst->dev), &dst, &fl, skb->sk, 0) < 0) 106 dst = xfrm_lookup(dev_net(dst->dev), dst, &fl, skb->sk, 0);
107 if (IS_ERR(dst))
106 return -1; 108 return -1;
107 109
108 skb_dst_drop(skb); 110 skb_dst_drop(skb);
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index e24e4cf2a112..63d37004ee66 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2730,7 +2730,12 @@ int ip_route_output_flow(struct net *net, struct rtable **rp, struct flowi *flp,
2730 flp->fl4_src = (*rp)->rt_src; 2730 flp->fl4_src = (*rp)->rt_src;
2731 if (!flp->fl4_dst) 2731 if (!flp->fl4_dst)
2732 flp->fl4_dst = (*rp)->rt_dst; 2732 flp->fl4_dst = (*rp)->rt_dst;
2733 return xfrm_lookup(net, (struct dst_entry **)rp, flp, sk, 0); 2733 *rp = (struct rtable *) xfrm_lookup(net, &(*rp)->dst, flp, sk, 0);
2734 if (IS_ERR(*rp)) {
2735 err = PTR_ERR(*rp);
2736 *rp = NULL;
2737 return err;
2738 }
2734 } 2739 }
2735 2740
2736 return 0; 2741 return 0;