diff options
Diffstat (limited to 'net/ipv4/esp4.c')
| -rw-r--r-- | net/ipv4/esp4.c | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index 9d1881c07a32..9bbdd4494551 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c | |||
| @@ -143,10 +143,9 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 143 | int alen = esp->auth.icv_trunc_len; | 143 | int alen = esp->auth.icv_trunc_len; |
| 144 | int elen = skb->len - sizeof(struct ip_esp_hdr) - esp->conf.ivlen - alen; | 144 | int elen = skb->len - sizeof(struct ip_esp_hdr) - esp->conf.ivlen - alen; |
| 145 | int nfrags; | 145 | int nfrags; |
| 146 | int encap_len = 0; | 146 | int ihl; |
| 147 | u8 nexthdr[2]; | 147 | u8 nexthdr[2]; |
| 148 | struct scatterlist *sg; | 148 | struct scatterlist *sg; |
| 149 | u8 workbuf[60]; | ||
| 150 | int padlen; | 149 | int padlen; |
| 151 | 150 | ||
| 152 | if (!pskb_may_pull(skb, sizeof(struct ip_esp_hdr))) | 151 | if (!pskb_may_pull(skb, sizeof(struct ip_esp_hdr))) |
| @@ -177,7 +176,6 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 177 | skb->ip_summed = CHECKSUM_NONE; | 176 | skb->ip_summed = CHECKSUM_NONE; |
| 178 | 177 | ||
| 179 | esph = (struct ip_esp_hdr*)skb->data; | 178 | esph = (struct ip_esp_hdr*)skb->data; |
| 180 | iph = skb->nh.iph; | ||
| 181 | 179 | ||
| 182 | /* Get ivec. This can be wrong, check against another impls. */ | 180 | /* Get ivec. This can be wrong, check against another impls. */ |
| 183 | if (esp->conf.ivlen) | 181 | if (esp->conf.ivlen) |
| @@ -204,12 +202,12 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 204 | 202 | ||
| 205 | /* ... check padding bits here. Silly. :-) */ | 203 | /* ... check padding bits here. Silly. :-) */ |
| 206 | 204 | ||
| 205 | iph = skb->nh.iph; | ||
| 206 | ihl = iph->ihl * 4; | ||
| 207 | |||
| 207 | if (x->encap) { | 208 | if (x->encap) { |
| 208 | struct xfrm_encap_tmpl *encap = x->encap; | 209 | struct xfrm_encap_tmpl *encap = x->encap; |
| 209 | struct udphdr *uh; | 210 | struct udphdr *uh = (void *)(skb->nh.raw + ihl); |
| 210 | |||
| 211 | uh = (struct udphdr *)(iph + 1); | ||
| 212 | encap_len = (void*)esph - (void*)uh; | ||
| 213 | 211 | ||
| 214 | /* | 212 | /* |
| 215 | * 1) if the NAT-T peer's IP or port changed then | 213 | * 1) if the NAT-T peer's IP or port changed then |
| @@ -246,11 +244,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 246 | 244 | ||
| 247 | iph->protocol = nexthdr[1]; | 245 | iph->protocol = nexthdr[1]; |
| 248 | pskb_trim(skb, skb->len - alen - padlen - 2); | 246 | pskb_trim(skb, skb->len - alen - padlen - 2); |
| 249 | memcpy(workbuf, skb->nh.raw, iph->ihl*4); | 247 | skb->h.raw = __skb_pull(skb, sizeof(*esph) + esp->conf.ivlen) - ihl; |
| 250 | skb->h.raw = skb_pull(skb, sizeof(struct ip_esp_hdr) + esp->conf.ivlen); | ||
| 251 | skb->nh.raw += encap_len + sizeof(struct ip_esp_hdr) + esp->conf.ivlen; | ||
| 252 | memcpy(skb->nh.raw, workbuf, iph->ihl*4); | ||
| 253 | skb->nh.iph->tot_len = htons(skb->len); | ||
| 254 | 248 | ||
| 255 | return 0; | 249 | return 0; |
| 256 | 250 | ||
