diff options
Diffstat (limited to 'net/ipv4/esp4_offload.c')
| -rw-r--r-- | net/ipv4/esp4_offload.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/ipv4/esp4_offload.c b/net/ipv4/esp4_offload.c index b61a8ff558f9..8edcfa66d1e5 100644 --- a/net/ipv4/esp4_offload.c +++ b/net/ipv4/esp4_offload.c | |||
| @@ -52,13 +52,13 @@ static struct sk_buff *esp4_gro_receive(struct list_head *head, | |||
| 52 | goto out; | 52 | goto out; |
| 53 | 53 | ||
| 54 | if (sp->len == XFRM_MAX_DEPTH) | 54 | if (sp->len == XFRM_MAX_DEPTH) |
| 55 | goto out; | 55 | goto out_reset; |
| 56 | 56 | ||
| 57 | x = xfrm_state_lookup(dev_net(skb->dev), skb->mark, | 57 | x = xfrm_state_lookup(dev_net(skb->dev), skb->mark, |
| 58 | (xfrm_address_t *)&ip_hdr(skb)->daddr, | 58 | (xfrm_address_t *)&ip_hdr(skb)->daddr, |
| 59 | spi, IPPROTO_ESP, AF_INET); | 59 | spi, IPPROTO_ESP, AF_INET); |
| 60 | if (!x) | 60 | if (!x) |
| 61 | goto out; | 61 | goto out_reset; |
| 62 | 62 | ||
| 63 | sp->xvec[sp->len++] = x; | 63 | sp->xvec[sp->len++] = x; |
| 64 | sp->olen++; | 64 | sp->olen++; |
| @@ -66,7 +66,7 @@ static struct sk_buff *esp4_gro_receive(struct list_head *head, | |||
| 66 | xo = xfrm_offload(skb); | 66 | xo = xfrm_offload(skb); |
| 67 | if (!xo) { | 67 | if (!xo) { |
| 68 | xfrm_state_put(x); | 68 | xfrm_state_put(x); |
| 69 | goto out; | 69 | goto out_reset; |
| 70 | } | 70 | } |
| 71 | } | 71 | } |
| 72 | 72 | ||
| @@ -82,6 +82,8 @@ static struct sk_buff *esp4_gro_receive(struct list_head *head, | |||
| 82 | xfrm_input(skb, IPPROTO_ESP, spi, -2); | 82 | xfrm_input(skb, IPPROTO_ESP, spi, -2); |
| 83 | 83 | ||
| 84 | return ERR_PTR(-EINPROGRESS); | 84 | return ERR_PTR(-EINPROGRESS); |
| 85 | out_reset: | ||
| 86 | secpath_reset(skb); | ||
| 85 | out: | 87 | out: |
| 86 | skb_push(skb, offset); | 88 | skb_push(skb, offset); |
| 87 | NAPI_GRO_CB(skb)->same_flow = 0; | 89 | NAPI_GRO_CB(skb)->same_flow = 0; |
