diff options
Diffstat (limited to 'net/ipv6/ipcomp6.c')
| -rw-r--r-- | net/ipv6/ipcomp6.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c index f28cd37feed3..a2860e35efd7 100644 --- a/net/ipv6/ipcomp6.c +++ b/net/ipv6/ipcomp6.c | |||
| @@ -30,7 +30,6 @@ | |||
| 30 | * The decompression of IP datagram MUST be done after the reassembly, | 30 | * The decompression of IP datagram MUST be done after the reassembly, |
| 31 | * AH/ESP processing. | 31 | * AH/ESP processing. |
| 32 | */ | 32 | */ |
| 33 | #include <linux/config.h> | ||
| 34 | #include <linux/module.h> | 33 | #include <linux/module.h> |
| 35 | #include <net/ip.h> | 34 | #include <net/ip.h> |
| 36 | #include <net/xfrm.h> | 35 | #include <net/xfrm.h> |
| @@ -54,7 +53,7 @@ | |||
| 54 | 53 | ||
| 55 | struct ipcomp6_tfms { | 54 | struct ipcomp6_tfms { |
| 56 | struct list_head list; | 55 | struct list_head list; |
| 57 | struct crypto_tfm **tfms; | 56 | struct crypto_comp **tfms; |
| 58 | int users; | 57 | int users; |
| 59 | }; | 58 | }; |
| 60 | 59 | ||
| @@ -71,7 +70,7 @@ static int ipcomp6_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 71 | int plen, dlen; | 70 | int plen, dlen; |
| 72 | struct ipcomp_data *ipcd = x->data; | 71 | struct ipcomp_data *ipcd = x->data; |
| 73 | u8 *start, *scratch; | 72 | u8 *start, *scratch; |
| 74 | struct crypto_tfm *tfm; | 73 | struct crypto_comp *tfm; |
| 75 | int cpu; | 74 | int cpu; |
| 76 | 75 | ||
| 77 | if (skb_linearize_cow(skb)) | 76 | if (skb_linearize_cow(skb)) |
| @@ -110,7 +109,8 @@ static int ipcomp6_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 110 | goto out_put_cpu; | 109 | goto out_put_cpu; |
| 111 | } | 110 | } |
| 112 | 111 | ||
| 113 | skb_put(skb, dlen - plen); | 112 | skb->truesize += dlen - plen; |
| 113 | __skb_put(skb, dlen - plen); | ||
| 114 | memcpy(skb->data, scratch, dlen); | 114 | memcpy(skb->data, scratch, dlen); |
| 115 | err = ipch->nexthdr; | 115 | err = ipch->nexthdr; |
| 116 | 116 | ||
| @@ -129,7 +129,7 @@ static int ipcomp6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
| 129 | struct ipcomp_data *ipcd = x->data; | 129 | struct ipcomp_data *ipcd = x->data; |
| 130 | int plen, dlen; | 130 | int plen, dlen; |
| 131 | u8 *start, *scratch; | 131 | u8 *start, *scratch; |
| 132 | struct crypto_tfm *tfm; | 132 | struct crypto_comp *tfm; |
| 133 | int cpu; | 133 | int cpu; |
| 134 | 134 | ||
| 135 | hdr_len = skb->h.raw - skb->data; | 135 | hdr_len = skb->h.raw - skb->data; |
| @@ -178,7 +178,7 @@ out_ok: | |||
| 178 | static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | 178 | static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, |
| 179 | int type, int code, int offset, __u32 info) | 179 | int type, int code, int offset, __u32 info) |
| 180 | { | 180 | { |
| 181 | u32 spi; | 181 | __be32 spi; |
| 182 | struct ipv6hdr *iph = (struct ipv6hdr*)skb->data; | 182 | struct ipv6hdr *iph = (struct ipv6hdr*)skb->data; |
| 183 | struct ipv6_comp_hdr *ipcomph = (struct ipv6_comp_hdr*)(skb->data+offset); | 183 | struct ipv6_comp_hdr *ipcomph = (struct ipv6_comp_hdr*)(skb->data+offset); |
| 184 | struct xfrm_state *x; | 184 | struct xfrm_state *x; |
| @@ -212,7 +212,7 @@ static struct xfrm_state *ipcomp6_tunnel_create(struct xfrm_state *x) | |||
| 212 | memcpy(t->id.daddr.a6, x->id.daddr.a6, sizeof(struct in6_addr)); | 212 | memcpy(t->id.daddr.a6, x->id.daddr.a6, sizeof(struct in6_addr)); |
| 213 | memcpy(&t->sel, &x->sel, sizeof(t->sel)); | 213 | memcpy(&t->sel, &x->sel, sizeof(t->sel)); |
| 214 | t->props.family = AF_INET6; | 214 | t->props.family = AF_INET6; |
| 215 | t->props.mode = 1; | 215 | t->props.mode = XFRM_MODE_TUNNEL; |
| 216 | memcpy(t->props.saddr.a6, x->props.saddr.a6, sizeof(struct in6_addr)); | 216 | memcpy(t->props.saddr.a6, x->props.saddr.a6, sizeof(struct in6_addr)); |
| 217 | 217 | ||
| 218 | if (xfrm_init_state(t)) | 218 | if (xfrm_init_state(t)) |
| @@ -234,7 +234,7 @@ static int ipcomp6_tunnel_attach(struct xfrm_state *x) | |||
| 234 | { | 234 | { |
| 235 | int err = 0; | 235 | int err = 0; |
| 236 | struct xfrm_state *t = NULL; | 236 | struct xfrm_state *t = NULL; |
| 237 | u32 spi; | 237 | __be32 spi; |
| 238 | 238 | ||
| 239 | spi = xfrm6_tunnel_spi_lookup((xfrm_address_t *)&x->props.saddr); | 239 | spi = xfrm6_tunnel_spi_lookup((xfrm_address_t *)&x->props.saddr); |
| 240 | if (spi) | 240 | if (spi) |
| @@ -301,7 +301,7 @@ static void **ipcomp6_alloc_scratches(void) | |||
| 301 | return scratches; | 301 | return scratches; |
| 302 | } | 302 | } |
| 303 | 303 | ||
| 304 | static void ipcomp6_free_tfms(struct crypto_tfm **tfms) | 304 | static void ipcomp6_free_tfms(struct crypto_comp **tfms) |
| 305 | { | 305 | { |
| 306 | struct ipcomp6_tfms *pos; | 306 | struct ipcomp6_tfms *pos; |
| 307 | int cpu; | 307 | int cpu; |
| @@ -323,28 +323,28 @@ static void ipcomp6_free_tfms(struct crypto_tfm **tfms) | |||
| 323 | return; | 323 | return; |
| 324 | 324 | ||
| 325 | for_each_possible_cpu(cpu) { | 325 | for_each_possible_cpu(cpu) { |
| 326 | struct crypto_tfm *tfm = *per_cpu_ptr(tfms, cpu); | 326 | struct crypto_comp *tfm = *per_cpu_ptr(tfms, cpu); |
| 327 | crypto_free_tfm(tfm); | 327 | crypto_free_comp(tfm); |
| 328 | } | 328 | } |
| 329 | free_percpu(tfms); | 329 | free_percpu(tfms); |
| 330 | } | 330 | } |
| 331 | 331 | ||
| 332 | static struct crypto_tfm **ipcomp6_alloc_tfms(const char *alg_name) | 332 | static struct crypto_comp **ipcomp6_alloc_tfms(const char *alg_name) |
| 333 | { | 333 | { |
| 334 | struct ipcomp6_tfms *pos; | 334 | struct ipcomp6_tfms *pos; |
| 335 | struct crypto_tfm **tfms; | 335 | struct crypto_comp **tfms; |
| 336 | int cpu; | 336 | int cpu; |
| 337 | 337 | ||
| 338 | /* This can be any valid CPU ID so we don't need locking. */ | 338 | /* This can be any valid CPU ID so we don't need locking. */ |
| 339 | cpu = raw_smp_processor_id(); | 339 | cpu = raw_smp_processor_id(); |
| 340 | 340 | ||
| 341 | list_for_each_entry(pos, &ipcomp6_tfms_list, list) { | 341 | list_for_each_entry(pos, &ipcomp6_tfms_list, list) { |
| 342 | struct crypto_tfm *tfm; | 342 | struct crypto_comp *tfm; |
| 343 | 343 | ||
| 344 | tfms = pos->tfms; | 344 | tfms = pos->tfms; |
| 345 | tfm = *per_cpu_ptr(tfms, cpu); | 345 | tfm = *per_cpu_ptr(tfms, cpu); |
| 346 | 346 | ||
| 347 | if (!strcmp(crypto_tfm_alg_name(tfm), alg_name)) { | 347 | if (!strcmp(crypto_comp_name(tfm), alg_name)) { |
| 348 | pos->users++; | 348 | pos->users++; |
| 349 | return tfms; | 349 | return tfms; |
| 350 | } | 350 | } |
| @@ -358,12 +358,13 @@ static struct crypto_tfm **ipcomp6_alloc_tfms(const char *alg_name) | |||
| 358 | INIT_LIST_HEAD(&pos->list); | 358 | INIT_LIST_HEAD(&pos->list); |
| 359 | list_add(&pos->list, &ipcomp6_tfms_list); | 359 | list_add(&pos->list, &ipcomp6_tfms_list); |
| 360 | 360 | ||
| 361 | pos->tfms = tfms = alloc_percpu(struct crypto_tfm *); | 361 | pos->tfms = tfms = alloc_percpu(struct crypto_comp *); |
| 362 | if (!tfms) | 362 | if (!tfms) |
| 363 | goto error; | 363 | goto error; |
| 364 | 364 | ||
| 365 | for_each_possible_cpu(cpu) { | 365 | for_each_possible_cpu(cpu) { |
| 366 | struct crypto_tfm *tfm = crypto_alloc_tfm(alg_name, 0); | 366 | struct crypto_comp *tfm = crypto_alloc_comp(alg_name, 0, |
| 367 | CRYPTO_ALG_ASYNC); | ||
| 367 | if (!tfm) | 368 | if (!tfm) |
| 368 | goto error; | 369 | goto error; |
| 369 | *per_cpu_ptr(tfms, cpu) = tfm; | 370 | *per_cpu_ptr(tfms, cpu) = tfm; |
| @@ -416,7 +417,7 @@ static int ipcomp6_init_state(struct xfrm_state *x) | |||
| 416 | goto out; | 417 | goto out; |
| 417 | 418 | ||
| 418 | x->props.header_len = 0; | 419 | x->props.header_len = 0; |
| 419 | if (x->props.mode) | 420 | if (x->props.mode == XFRM_MODE_TUNNEL) |
| 420 | x->props.header_len += sizeof(struct ipv6hdr); | 421 | x->props.header_len += sizeof(struct ipv6hdr); |
| 421 | 422 | ||
| 422 | mutex_lock(&ipcomp6_resource_mutex); | 423 | mutex_lock(&ipcomp6_resource_mutex); |
| @@ -428,7 +429,7 @@ static int ipcomp6_init_state(struct xfrm_state *x) | |||
| 428 | goto error; | 429 | goto error; |
| 429 | mutex_unlock(&ipcomp6_resource_mutex); | 430 | mutex_unlock(&ipcomp6_resource_mutex); |
| 430 | 431 | ||
| 431 | if (x->props.mode) { | 432 | if (x->props.mode == XFRM_MODE_TUNNEL) { |
| 432 | err = ipcomp6_tunnel_attach(x); | 433 | err = ipcomp6_tunnel_attach(x); |
| 433 | if (err) | 434 | if (err) |
| 434 | goto error_tunnel; | 435 | goto error_tunnel; |
| @@ -460,6 +461,7 @@ static struct xfrm_type ipcomp6_type = | |||
| 460 | .destructor = ipcomp6_destroy, | 461 | .destructor = ipcomp6_destroy, |
| 461 | .input = ipcomp6_input, | 462 | .input = ipcomp6_input, |
| 462 | .output = ipcomp6_output, | 463 | .output = ipcomp6_output, |
| 464 | .hdr_offset = xfrm6_find_1stfragopt, | ||
| 463 | }; | 465 | }; |
| 464 | 466 | ||
| 465 | static struct inet6_protocol ipcomp6_protocol = | 467 | static struct inet6_protocol ipcomp6_protocol = |
