@@ -231,9 +231,6 @@ static int xfrm4_remove_tunnel_encap(struct xfrm_state *x, struct sk_buff *skb)
231
231
{
232
232
int err = - EINVAL ;
233
233
234
- if (XFRM_MODE_SKB_CB (skb )-> protocol != IPPROTO_IPIP )
235
- goto out ;
236
-
237
234
if (!pskb_may_pull (skb , sizeof (struct iphdr )))
238
235
goto out ;
239
236
@@ -269,8 +266,6 @@ static int xfrm6_remove_tunnel_encap(struct xfrm_state *x, struct sk_buff *skb)
269
266
{
270
267
int err = - EINVAL ;
271
268
272
- if (XFRM_MODE_SKB_CB (skb )-> protocol != IPPROTO_IPV6 )
273
- goto out ;
274
269
if (!pskb_may_pull (skb , sizeof (struct ipv6hdr )))
275
270
goto out ;
276
271
@@ -331,22 +326,26 @@ static int xfrm6_remove_beet_encap(struct xfrm_state *x, struct sk_buff *skb)
331
326
*/
332
327
static int
333
328
xfrm_inner_mode_encap_remove (struct xfrm_state * x ,
334
- const struct xfrm_mode * inner_mode ,
335
329
struct sk_buff * skb )
336
330
{
337
- switch (inner_mode -> encap ) {
331
+ switch (x -> props . mode ) {
338
332
case XFRM_MODE_BEET :
339
- if (inner_mode -> family == AF_INET )
333
+ switch (XFRM_MODE_SKB_CB (skb )-> protocol ) {
334
+ case IPPROTO_IPIP :
335
+ case IPPROTO_BEETPH :
340
336
return xfrm4_remove_beet_encap (x , skb );
341
- if ( inner_mode -> family == AF_INET6 )
337
+ case IPPROTO_IPV6 :
342
338
return xfrm6_remove_beet_encap (x , skb );
339
+ }
343
340
break ;
344
341
case XFRM_MODE_TUNNEL :
345
- if (inner_mode -> family == AF_INET )
342
+ switch (XFRM_MODE_SKB_CB (skb )-> protocol ) {
343
+ case IPPROTO_IPIP :
346
344
return xfrm4_remove_tunnel_encap (x , skb );
347
- if ( inner_mode -> family == AF_INET6 )
345
+ case IPPROTO_IPV6 :
348
346
return xfrm6_remove_tunnel_encap (x , skb );
349
347
break ;
348
+ }
350
349
}
351
350
352
351
WARN_ON_ONCE (1 );
@@ -355,9 +354,7 @@ xfrm_inner_mode_encap_remove(struct xfrm_state *x,
355
354
356
355
static int xfrm_prepare_input (struct xfrm_state * x , struct sk_buff * skb )
357
356
{
358
- const struct xfrm_mode * inner_mode = & x -> inner_mode ;
359
-
360
- switch (x -> outer_mode .family ) {
357
+ switch (x -> props .family ) {
361
358
case AF_INET :
362
359
xfrm4_extract_header (skb );
363
360
break ;
@@ -369,25 +366,20 @@ static int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb)
369
366
return - EAFNOSUPPORT ;
370
367
}
371
368
372
- if (x -> sel .family == AF_UNSPEC ) {
373
- inner_mode = xfrm_ip2inner_mode (x , XFRM_MODE_SKB_CB (skb )-> protocol );
374
- if (!inner_mode )
375
- return - EAFNOSUPPORT ;
376
- }
377
-
378
- switch (inner_mode -> family ) {
379
- case AF_INET :
369
+ switch (XFRM_MODE_SKB_CB (skb )-> protocol ) {
370
+ case IPPROTO_IPIP :
371
+ case IPPROTO_BEETPH :
380
372
skb -> protocol = htons (ETH_P_IP );
381
373
break ;
382
- case AF_INET6 :
374
+ case IPPROTO_IPV6 :
383
375
skb -> protocol = htons (ETH_P_IPV6 );
384
376
break ;
385
377
default :
386
378
WARN_ON_ONCE (1 );
387
379
break ;
388
380
}
389
381
390
- return xfrm_inner_mode_encap_remove (x , inner_mode , skb );
382
+ return xfrm_inner_mode_encap_remove (x , skb );
391
383
}
392
384
393
385
/* Remove encapsulation header.
@@ -433,17 +425,16 @@ static int xfrm6_transport_input(struct xfrm_state *x, struct sk_buff *skb)
433
425
}
434
426
435
427
static int xfrm_inner_mode_input (struct xfrm_state * x ,
436
- const struct xfrm_mode * inner_mode ,
437
428
struct sk_buff * skb )
438
429
{
439
- switch (inner_mode -> encap ) {
430
+ switch (x -> props . mode ) {
440
431
case XFRM_MODE_BEET :
441
432
case XFRM_MODE_TUNNEL :
442
433
return xfrm_prepare_input (x , skb );
443
434
case XFRM_MODE_TRANSPORT :
444
- if (inner_mode -> family == AF_INET )
435
+ if (x -> props . family == AF_INET )
445
436
return xfrm4_transport_input (x , skb );
446
- if (inner_mode -> family == AF_INET6 )
437
+ if (x -> props . family == AF_INET6 )
447
438
return xfrm6_transport_input (x , skb );
448
439
break ;
449
440
case XFRM_MODE_ROUTEOPTIMIZATION :
@@ -461,7 +452,6 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
461
452
{
462
453
const struct xfrm_state_afinfo * afinfo ;
463
454
struct net * net = dev_net (skb -> dev );
464
- const struct xfrm_mode * inner_mode ;
465
455
int err ;
466
456
__be32 seq ;
467
457
__be32 seq_hi ;
@@ -491,7 +481,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
491
481
goto drop ;
492
482
}
493
483
494
- family = x -> outer_mode .family ;
484
+ family = x -> props .family ;
495
485
496
486
/* An encap_type of -1 indicates async resumption. */
497
487
if (encap_type == -1 ) {
@@ -676,17 +666,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
676
666
677
667
XFRM_MODE_SKB_CB (skb )-> protocol = nexthdr ;
678
668
679
- inner_mode = & x -> inner_mode ;
680
-
681
- if (x -> sel .family == AF_UNSPEC ) {
682
- inner_mode = xfrm_ip2inner_mode (x , XFRM_MODE_SKB_CB (skb )-> protocol );
683
- if (inner_mode == NULL ) {
684
- XFRM_INC_STATS (net , LINUX_MIB_XFRMINSTATEMODEERROR );
685
- goto drop ;
686
- }
687
- }
688
-
689
- if (xfrm_inner_mode_input (x , inner_mode , skb )) {
669
+ if (xfrm_inner_mode_input (x , skb )) {
690
670
XFRM_INC_STATS (net , LINUX_MIB_XFRMINSTATEMODEERROR );
691
671
goto drop ;
692
672
}
@@ -701,7 +681,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
701
681
* transport mode so the outer address is identical.
702
682
*/
703
683
daddr = & x -> id .daddr ;
704
- family = x -> outer_mode .family ;
684
+ family = x -> props .family ;
705
685
706
686
err = xfrm_parse_spi (skb , nexthdr , & spi , & seq );
707
687
if (err < 0 ) {
@@ -732,7 +712,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
732
712
733
713
err = - EAFNOSUPPORT ;
734
714
rcu_read_lock ();
735
- afinfo = xfrm_state_afinfo_get_rcu (x -> inner_mode .family );
715
+ afinfo = xfrm_state_afinfo_get_rcu (x -> props .family );
736
716
if (likely (afinfo ))
737
717
err = afinfo -> transport_finish (skb , xfrm_gro || async );
738
718
rcu_read_unlock ();
0 commit comments