@@ -513,14 +513,17 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
513
513
return 0 ;
514
514
}
515
515
516
- static inline void ip6ip6_ecn_decapsulate (struct ipv6hdr * outer_iph ,
517
- struct sk_buff * skb )
516
+ static void ip6ip6_dscp_ecn_decapsulate (struct ip6_tnl * t ,
517
+ struct ipv6hdr * ipv6h ,
518
+ struct sk_buff * skb )
518
519
{
519
- struct ipv6hdr * inner_iph = skb -> nh .ipv6h ;
520
+ if (t -> parms .flags & IP6_TNL_F_RCV_DSCP_COPY )
521
+ ipv6_copy_dscp (ipv6h , skb -> nh .ipv6h );
520
522
521
- if (INET_ECN_is_ce (ipv6_get_dsfield (outer_iph )))
522
- IP6_ECN_set_ce (inner_iph );
523
+ if (INET_ECN_is_ce (ipv6_get_dsfield (ipv6h )))
524
+ IP6_ECN_set_ce (skb -> nh . ipv6h );
523
525
}
526
+
524
527
static inline int ip6_tnl_rcv_ctl (struct ip6_tnl * t )
525
528
{
526
529
struct ip6_tnl_parm * p = & t -> parms ;
@@ -546,12 +549,16 @@ static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t)
546
549
/**
547
550
* ip6ip6_rcv - decapsulate IPv6 packet and retransmit it locally
548
551
* @skb: received socket buffer
552
+ * @protocol: ethernet protocol ID
553
+ * @dscp_ecn_decapsulate: the function to decapsulate DSCP code and ECN
549
554
*
550
555
* Return: 0
551
556
**/
552
557
553
- static int
554
- ip6ip6_rcv (struct sk_buff * skb )
558
+ static int ip6_tnl_rcv (struct sk_buff * skb , __u16 protocol ,
559
+ void (* dscp_ecn_decapsulate )(struct ip6_tnl * t ,
560
+ struct ipv6hdr * ipv6h ,
561
+ struct sk_buff * skb ))
555
562
{
556
563
struct ipv6hdr * ipv6h ;
557
564
struct ip6_tnl * t ;
@@ -574,16 +581,16 @@ ip6ip6_rcv(struct sk_buff *skb)
574
581
secpath_reset (skb );
575
582
skb -> mac .raw = skb -> nh .raw ;
576
583
skb -> nh .raw = skb -> data ;
577
- skb -> protocol = htons (ETH_P_IPV6 );
584
+ skb -> protocol = htons (protocol );
578
585
skb -> pkt_type = PACKET_HOST ;
579
586
memset (skb -> cb , 0 , sizeof (struct inet6_skb_parm ));
580
587
skb -> dev = t -> dev ;
581
588
dst_release (skb -> dst );
582
589
skb -> dst = NULL ;
583
590
nf_reset (skb );
584
- if ( t -> parms . flags & IP6_TNL_F_RCV_DSCP_COPY )
585
- ipv6_copy_dscp ( ipv6h , skb -> nh . ipv6h );
586
- ip6ip6_ecn_decapsulate ( ipv6h , skb );
591
+
592
+ dscp_ecn_decapsulate ( t , ipv6h , skb );
593
+
587
594
t -> stat .rx_packets ++ ;
588
595
t -> stat .rx_bytes += skb -> len ;
589
596
netif_rx (skb );
@@ -598,6 +605,11 @@ ip6ip6_rcv(struct sk_buff *skb)
598
605
return 0 ;
599
606
}
600
607
608
+ static int ip6ip6_rcv (struct sk_buff * skb )
609
+ {
610
+ return ip6_tnl_rcv (skb , ETH_P_IPV6 , ip6ip6_dscp_ecn_decapsulate );
611
+ }
612
+
601
613
struct ipv6_tel_txoption {
602
614
struct ipv6_txoptions ops ;
603
615
__u8 dst_opt [8 ];
0 commit comments