Skip to content

Commit 296c106

Browse files
committed
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec-next
Conflicts: net/xfrm/xfrm_policy.c Minor merge conflict in xfrm_policy.c, consisting of overlapping changes which were trivial to resolve. Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents e139862 + 1c5ad13 commit 296c106

File tree

5 files changed

+41
-79
lines changed

5 files changed

+41
-79
lines changed

include/net/esp.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,6 @@
33

44
#include <linux/skbuff.h>
55

6-
struct crypto_aead;
7-
8-
struct esp_data {
9-
/* 0..255 */
10-
int padlen;
11-
12-
/* Confidentiality & Integrity */
13-
struct crypto_aead *aead;
14-
};
15-
166
void *pskb_put(struct sk_buff *skb, struct sk_buff *tail, int len);
177

188
struct ip_esp_hdr;

net/ipv4/esp4.c

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
121121
struct aead_givcrypt_request *req;
122122
struct scatterlist *sg;
123123
struct scatterlist *asg;
124-
struct esp_data *esp;
125124
struct sk_buff *trailer;
126125
void *tmp;
127126
u8 *iv;
@@ -139,8 +138,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
139138

140139
/* skb is pure payload to encrypt */
141140

142-
esp = x->data;
143-
aead = esp->aead;
141+
aead = x->data;
144142
alen = crypto_aead_authsize(aead);
145143

146144
tfclen = 0;
@@ -154,8 +152,6 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
154152
}
155153
blksize = ALIGN(crypto_aead_blocksize(aead), 4);
156154
clen = ALIGN(skb->len + 2 + tfclen, blksize);
157-
if (esp->padlen)
158-
clen = ALIGN(clen, esp->padlen);
159155
plen = clen - skb->len - tfclen;
160156

161157
err = skb_cow_data(skb, tfclen + plen + alen, &trailer);
@@ -280,8 +276,7 @@ static int esp_input_done2(struct sk_buff *skb, int err)
280276
{
281277
const struct iphdr *iph;
282278
struct xfrm_state *x = xfrm_input_state(skb);
283-
struct esp_data *esp = x->data;
284-
struct crypto_aead *aead = esp->aead;
279+
struct crypto_aead *aead = x->data;
285280
int alen = crypto_aead_authsize(aead);
286281
int hlen = sizeof(struct ip_esp_hdr) + crypto_aead_ivsize(aead);
287282
int elen = skb->len - hlen;
@@ -376,8 +371,7 @@ static void esp_input_done(struct crypto_async_request *base, int err)
376371
static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
377372
{
378373
struct ip_esp_hdr *esph;
379-
struct esp_data *esp = x->data;
380-
struct crypto_aead *aead = esp->aead;
374+
struct crypto_aead *aead = x->data;
381375
struct aead_request *req;
382376
struct sk_buff *trailer;
383377
int elen = skb->len - sizeof(*esph) - crypto_aead_ivsize(aead);
@@ -459,9 +453,8 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
459453

460454
static u32 esp4_get_mtu(struct xfrm_state *x, int mtu)
461455
{
462-
struct esp_data *esp = x->data;
463-
u32 blksize = ALIGN(crypto_aead_blocksize(esp->aead), 4);
464-
u32 align = max_t(u32, blksize, esp->padlen);
456+
struct crypto_aead *aead = x->data;
457+
u32 blksize = ALIGN(crypto_aead_blocksize(aead), 4);
465458
unsigned int net_adj;
466459

467460
switch (x->props.mode) {
@@ -476,8 +469,8 @@ static u32 esp4_get_mtu(struct xfrm_state *x, int mtu)
476469
BUG();
477470
}
478471

479-
return ((mtu - x->props.header_len - crypto_aead_authsize(esp->aead) -
480-
net_adj) & ~(align - 1)) + net_adj - 2;
472+
return ((mtu - x->props.header_len - crypto_aead_authsize(aead) -
473+
net_adj) & ~(blksize - 1)) + net_adj - 2;
481474
}
482475

483476
static void esp4_err(struct sk_buff *skb, u32 info)
@@ -511,18 +504,16 @@ static void esp4_err(struct sk_buff *skb, u32 info)
511504

512505
static void esp_destroy(struct xfrm_state *x)
513506
{
514-
struct esp_data *esp = x->data;
507+
struct crypto_aead *aead = x->data;
515508

516-
if (!esp)
509+
if (!aead)
517510
return;
518511

519-
crypto_free_aead(esp->aead);
520-
kfree(esp);
512+
crypto_free_aead(aead);
521513
}
522514

523515
static int esp_init_aead(struct xfrm_state *x)
524516
{
525-
struct esp_data *esp = x->data;
526517
struct crypto_aead *aead;
527518
int err;
528519

@@ -531,7 +522,7 @@ static int esp_init_aead(struct xfrm_state *x)
531522
if (IS_ERR(aead))
532523
goto error;
533524

534-
esp->aead = aead;
525+
x->data = aead;
535526

536527
err = crypto_aead_setkey(aead, x->aead->alg_key,
537528
(x->aead->alg_key_len + 7) / 8);
@@ -548,7 +539,6 @@ static int esp_init_aead(struct xfrm_state *x)
548539

549540
static int esp_init_authenc(struct xfrm_state *x)
550541
{
551-
struct esp_data *esp = x->data;
552542
struct crypto_aead *aead;
553543
struct crypto_authenc_key_param *param;
554544
struct rtattr *rta;
@@ -583,7 +573,7 @@ static int esp_init_authenc(struct xfrm_state *x)
583573
if (IS_ERR(aead))
584574
goto error;
585575

586-
esp->aead = aead;
576+
x->data = aead;
587577

588578
keylen = (x->aalg ? (x->aalg->alg_key_len + 7) / 8 : 0) +
589579
(x->ealg->alg_key_len + 7) / 8 + RTA_SPACE(sizeof(*param));
@@ -638,16 +628,11 @@ static int esp_init_authenc(struct xfrm_state *x)
638628

639629
static int esp_init_state(struct xfrm_state *x)
640630
{
641-
struct esp_data *esp;
642631
struct crypto_aead *aead;
643632
u32 align;
644633
int err;
645634

646-
esp = kzalloc(sizeof(*esp), GFP_KERNEL);
647-
if (esp == NULL)
648-
return -ENOMEM;
649-
650-
x->data = esp;
635+
x->data = NULL;
651636

652637
if (x->aead)
653638
err = esp_init_aead(x);
@@ -657,9 +642,7 @@ static int esp_init_state(struct xfrm_state *x)
657642
if (err)
658643
goto error;
659644

660-
aead = esp->aead;
661-
662-
esp->padlen = 0;
645+
aead = x->data;
663646

664647
x->props.header_len = sizeof(struct ip_esp_hdr) +
665648
crypto_aead_ivsize(aead);
@@ -683,9 +666,7 @@ static int esp_init_state(struct xfrm_state *x)
683666
}
684667

685668
align = ALIGN(crypto_aead_blocksize(aead), 4);
686-
if (esp->padlen)
687-
align = max_t(u32, align, esp->padlen);
688-
x->props.trailer_len = align + 1 + crypto_aead_authsize(esp->aead);
669+
x->props.trailer_len = align + 1 + crypto_aead_authsize(aead);
689670

690671
error:
691672
return err;

net/ipv6/esp6.c

Lines changed: 15 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,9 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
164164
u8 *iv;
165165
u8 *tail;
166166
__be32 *seqhi;
167-
struct esp_data *esp = x->data;
168167

169168
/* skb is pure payload to encrypt */
170-
aead = esp->aead;
169+
aead = x->data;
171170
alen = crypto_aead_authsize(aead);
172171

173172
tfclen = 0;
@@ -181,8 +180,6 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
181180
}
182181
blksize = ALIGN(crypto_aead_blocksize(aead), 4);
183182
clen = ALIGN(skb->len + 2 + tfclen, blksize);
184-
if (esp->padlen)
185-
clen = ALIGN(clen, esp->padlen);
186183
plen = clen - skb->len - tfclen;
187184

188185
err = skb_cow_data(skb, tfclen + plen + alen, &trailer);
@@ -271,8 +268,7 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
271268
static int esp_input_done2(struct sk_buff *skb, int err)
272269
{
273270
struct xfrm_state *x = xfrm_input_state(skb);
274-
struct esp_data *esp = x->data;
275-
struct crypto_aead *aead = esp->aead;
271+
struct crypto_aead *aead = x->data;
276272
int alen = crypto_aead_authsize(aead);
277273
int hlen = sizeof(struct ip_esp_hdr) + crypto_aead_ivsize(aead);
278274
int elen = skb->len - hlen;
@@ -325,8 +321,7 @@ static void esp_input_done(struct crypto_async_request *base, int err)
325321
static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
326322
{
327323
struct ip_esp_hdr *esph;
328-
struct esp_data *esp = x->data;
329-
struct crypto_aead *aead = esp->aead;
324+
struct crypto_aead *aead = x->data;
330325
struct aead_request *req;
331326
struct sk_buff *trailer;
332327
int elen = skb->len - sizeof(*esph) - crypto_aead_ivsize(aead);
@@ -414,18 +409,17 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
414409

415410
static u32 esp6_get_mtu(struct xfrm_state *x, int mtu)
416411
{
417-
struct esp_data *esp = x->data;
418-
u32 blksize = ALIGN(crypto_aead_blocksize(esp->aead), 4);
419-
u32 align = max_t(u32, blksize, esp->padlen);
412+
struct crypto_aead *aead = x->data;
413+
u32 blksize = ALIGN(crypto_aead_blocksize(aead), 4);
420414
unsigned int net_adj;
421415

422416
if (x->props.mode != XFRM_MODE_TUNNEL)
423417
net_adj = sizeof(struct ipv6hdr);
424418
else
425419
net_adj = 0;
426420

427-
return ((mtu - x->props.header_len - crypto_aead_authsize(esp->aead) -
428-
net_adj) & ~(align - 1)) + net_adj - 2;
421+
return ((mtu - x->props.header_len - crypto_aead_authsize(aead) -
422+
net_adj) & ~(blksize - 1)) + net_adj - 2;
429423
}
430424

431425
static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
@@ -454,18 +448,16 @@ static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
454448

455449
static void esp6_destroy(struct xfrm_state *x)
456450
{
457-
struct esp_data *esp = x->data;
451+
struct crypto_aead *aead = x->data;
458452

459-
if (!esp)
453+
if (!aead)
460454
return;
461455

462-
crypto_free_aead(esp->aead);
463-
kfree(esp);
456+
crypto_free_aead(aead);
464457
}
465458

466459
static int esp_init_aead(struct xfrm_state *x)
467460
{
468-
struct esp_data *esp = x->data;
469461
struct crypto_aead *aead;
470462
int err;
471463

@@ -474,7 +466,7 @@ static int esp_init_aead(struct xfrm_state *x)
474466
if (IS_ERR(aead))
475467
goto error;
476468

477-
esp->aead = aead;
469+
x->data = aead;
478470

479471
err = crypto_aead_setkey(aead, x->aead->alg_key,
480472
(x->aead->alg_key_len + 7) / 8);
@@ -491,7 +483,6 @@ static int esp_init_aead(struct xfrm_state *x)
491483

492484
static int esp_init_authenc(struct xfrm_state *x)
493485
{
494-
struct esp_data *esp = x->data;
495486
struct crypto_aead *aead;
496487
struct crypto_authenc_key_param *param;
497488
struct rtattr *rta;
@@ -526,7 +517,7 @@ static int esp_init_authenc(struct xfrm_state *x)
526517
if (IS_ERR(aead))
527518
goto error;
528519

529-
esp->aead = aead;
520+
x->data = aead;
530521

531522
keylen = (x->aalg ? (x->aalg->alg_key_len + 7) / 8 : 0) +
532523
(x->ealg->alg_key_len + 7) / 8 + RTA_SPACE(sizeof(*param));
@@ -581,19 +572,14 @@ static int esp_init_authenc(struct xfrm_state *x)
581572

582573
static int esp6_init_state(struct xfrm_state *x)
583574
{
584-
struct esp_data *esp;
585575
struct crypto_aead *aead;
586576
u32 align;
587577
int err;
588578

589579
if (x->encap)
590580
return -EINVAL;
591581

592-
esp = kzalloc(sizeof(*esp), GFP_KERNEL);
593-
if (esp == NULL)
594-
return -ENOMEM;
595-
596-
x->data = esp;
582+
x->data = NULL;
597583

598584
if (x->aead)
599585
err = esp_init_aead(x);
@@ -603,9 +589,7 @@ static int esp6_init_state(struct xfrm_state *x)
603589
if (err)
604590
goto error;
605591

606-
aead = esp->aead;
607-
608-
esp->padlen = 0;
592+
aead = x->data;
609593

610594
x->props.header_len = sizeof(struct ip_esp_hdr) +
611595
crypto_aead_ivsize(aead);
@@ -625,9 +609,7 @@ static int esp6_init_state(struct xfrm_state *x)
625609
}
626610

627611
align = ALIGN(crypto_aead_blocksize(aead), 4);
628-
if (esp->padlen)
629-
align = max_t(u32, align, esp->padlen);
630-
x->props.trailer_len = align + 1 + crypto_aead_authsize(esp->aead);
612+
x->props.trailer_len = align + 1 + crypto_aead_authsize(aead);
631613

632614
error:
633615
return err;

net/xfrm/xfrm_ipcomp.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,8 @@ static void ipcomp_free_scratches(void)
220220

221221
static void * __percpu *ipcomp_alloc_scratches(void)
222222
{
223-
int i;
224223
void * __percpu *scratches;
224+
int i;
225225

226226
if (ipcomp_scratch_users++)
227227
return ipcomp_scratches;
@@ -233,7 +233,9 @@ static void * __percpu *ipcomp_alloc_scratches(void)
233233
ipcomp_scratches = scratches;
234234

235235
for_each_possible_cpu(i) {
236-
void *scratch = vmalloc(IPCOMP_SCRATCH_SIZE);
236+
void *scratch;
237+
238+
scratch = vmalloc_node(IPCOMP_SCRATCH_SIZE, cpu_to_node(i));
237239
if (!scratch)
238240
return NULL;
239241
*per_cpu_ptr(scratches, i) = scratch;

net/xfrm/xfrm_policy.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1844,6 +1844,13 @@ static int xdst_queue_output(struct sk_buff *skb)
18441844
struct xfrm_dst *xdst = (struct xfrm_dst *) dst;
18451845
struct xfrm_policy *pol = xdst->pols[0];
18461846
struct xfrm_policy_queue *pq = &pol->polq;
1847+
const struct sk_buff *fclone = skb + 1;
1848+
1849+
if (unlikely(skb->fclone == SKB_FCLONE_ORIG &&
1850+
fclone->fclone == SKB_FCLONE_CLONE)) {
1851+
kfree_skb(skb);
1852+
return 0;
1853+
}
18471854

18481855
if (pq->hold_queue.qlen > XFRM_MAX_QUEUE_LEN) {
18491856
kfree_skb(skb);

0 commit comments

Comments
 (0)