diff options
author | David S. Miller <davem@davemloft.net> | 2011-03-02 16:27:41 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-02 16:27:41 -0500 |
commit | 452edd598f60522c11f7f88fdbab27eb36509d1a (patch) | |
tree | df1510e9848e591a412c8bfa724253470c48c4c2 /net/ipv4 | |
parent | 3872b284087081ee5cb0e4630954c2f7a2153cf5 (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.c | 36 | ||||
-rw-r--r-- | net/ipv4/netfilter.c | 6 | ||||
-rw-r--r-- | net/ipv4/route.c | 7 |
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 | ||
459 | relookup_failed: | 451 | relookup_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; |