@@ -630,67 +630,34 @@ static int geneve_stop(struct net_device *dev)
630
630
}
631
631
632
632
static void geneve_build_header (struct genevehdr * geneveh ,
633
- __be16 tun_flags , u8 vni [3 ],
634
- u8 options_len , u8 * options )
633
+ const struct ip_tunnel_info * info )
635
634
{
636
635
geneveh -> ver = GENEVE_VER ;
637
- geneveh -> opt_len = options_len / 4 ;
638
- geneveh -> oam = !!(tun_flags & TUNNEL_OAM );
639
- geneveh -> critical = !!(tun_flags & TUNNEL_CRIT_OPT );
636
+ geneveh -> opt_len = info -> options_len / 4 ;
637
+ geneveh -> oam = !!(info -> key . tun_flags & TUNNEL_OAM );
638
+ geneveh -> critical = !!(info -> key . tun_flags & TUNNEL_CRIT_OPT );
640
639
geneveh -> rsvd1 = 0 ;
641
- memcpy ( geneveh -> vni , vni , 3 );
640
+ tunnel_id_to_vni ( info -> key . tun_id , geneveh -> vni );
642
641
geneveh -> proto_type = htons (ETH_P_TEB );
643
642
geneveh -> rsvd2 = 0 ;
644
643
645
- memcpy (geneveh -> options , options , options_len );
644
+ ip_tunnel_info_opts_get (geneveh -> options , info );
646
645
}
647
646
648
- static int geneve_build_skb (struct rtable * rt , struct sk_buff * skb ,
649
- __be16 tun_flags , u8 vni [3 ], u8 opt_len , u8 * opt ,
650
- bool xnet )
651
- {
652
- bool udp_sum = !!(tun_flags & TUNNEL_CSUM );
653
- struct genevehdr * gnvh ;
654
- int min_headroom ;
655
- int err ;
656
-
657
- skb_scrub_packet (skb , xnet );
658
-
659
- min_headroom = LL_RESERVED_SPACE (rt -> dst .dev ) + rt -> dst .header_len
660
- + GENEVE_BASE_HLEN + opt_len + sizeof (struct iphdr );
661
- err = skb_cow_head (skb , min_headroom );
662
- if (unlikely (err ))
663
- goto free_rt ;
664
-
665
- err = udp_tunnel_handle_offloads (skb , udp_sum );
666
- if (err )
667
- goto free_rt ;
668
-
669
- gnvh = (struct genevehdr * )__skb_push (skb , sizeof (* gnvh ) + opt_len );
670
- geneve_build_header (gnvh , tun_flags , vni , opt_len , opt );
671
-
672
- skb_set_inner_protocol (skb , htons (ETH_P_TEB ));
673
- return 0 ;
674
-
675
- free_rt :
676
- ip_rt_put (rt );
677
- return err ;
678
- }
679
-
680
- #if IS_ENABLED (CONFIG_IPV6 )
681
- static int geneve6_build_skb (struct dst_entry * dst , struct sk_buff * skb ,
682
- __be16 tun_flags , u8 vni [3 ], u8 opt_len , u8 * opt ,
683
- bool xnet )
647
+ static int geneve_build_skb (struct dst_entry * dst , struct sk_buff * skb ,
648
+ const struct ip_tunnel_info * info ,
649
+ bool xnet , int ip_hdr_len )
684
650
{
685
- bool udp_sum = !!(tun_flags & TUNNEL_CSUM );
651
+ bool udp_sum = !!(info -> key . tun_flags & TUNNEL_CSUM );
686
652
struct genevehdr * gnvh ;
687
653
int min_headroom ;
688
654
int err ;
689
655
656
+ skb_reset_mac_header (skb );
690
657
skb_scrub_packet (skb , xnet );
691
658
692
- min_headroom = LL_RESERVED_SPACE (dst -> dev ) + dst -> header_len
693
- + GENEVE_BASE_HLEN + opt_len + sizeof ( struct ipv6hdr ) ;
659
+ min_headroom = LL_RESERVED_SPACE (dst -> dev ) + dst -> header_len +
660
+ GENEVE_BASE_HLEN + info -> options_len + ip_hdr_len ;
694
661
err = skb_cow_head (skb , min_headroom );
695
662
if (unlikely (err ))
696
663
goto free_dst ;
@@ -699,22 +666,21 @@ static int geneve6_build_skb(struct dst_entry *dst, struct sk_buff *skb,
699
666
if (err )
700
667
goto free_dst ;
701
668
702
- gnvh = (struct genevehdr * )__skb_push (skb , sizeof (* gnvh ) + opt_len );
703
- geneve_build_header ( gnvh , tun_flags , vni , opt_len , opt );
704
-
669
+ gnvh = (struct genevehdr * )__skb_push (skb , sizeof (* gnvh ) +
670
+ info -> options_len );
671
+ geneve_build_header ( gnvh , info );
705
672
skb_set_inner_protocol (skb , htons (ETH_P_TEB ));
706
673
return 0 ;
707
674
708
675
free_dst :
709
676
dst_release (dst );
710
677
return err ;
711
678
}
712
- #endif
713
679
714
680
static struct rtable * geneve_get_v4_rt (struct sk_buff * skb ,
715
681
struct net_device * dev ,
716
682
struct flowi4 * fl4 ,
717
- struct ip_tunnel_info * info )
683
+ const struct ip_tunnel_info * info )
718
684
{
719
685
bool use_cache = ip_tunnel_dst_cache_usable (skb , info );
720
686
struct geneve_dev * geneve = netdev_priv (dev );
@@ -738,7 +704,7 @@ static struct rtable *geneve_get_v4_rt(struct sk_buff *skb,
738
704
}
739
705
fl4 -> flowi4_tos = RT_TOS (tos );
740
706
741
- dst_cache = & info -> dst_cache ;
707
+ dst_cache = ( struct dst_cache * ) & info -> dst_cache ;
742
708
if (use_cache ) {
743
709
rt = dst_cache_get_ip4 (dst_cache , & fl4 -> saddr );
744
710
if (rt )
@@ -763,7 +729,7 @@ static struct rtable *geneve_get_v4_rt(struct sk_buff *skb,
763
729
static struct dst_entry * geneve_get_v6_dst (struct sk_buff * skb ,
764
730
struct net_device * dev ,
765
731
struct flowi6 * fl6 ,
766
- struct ip_tunnel_info * info )
732
+ const struct ip_tunnel_info * info )
767
733
{
768
734
bool use_cache = ip_tunnel_dst_cache_usable (skb , info );
769
735
struct geneve_dev * geneve = netdev_priv (dev );
@@ -789,7 +755,7 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb,
789
755
790
756
fl6 -> flowlabel = ip6_make_flowinfo (RT_TOS (prio ),
791
757
info -> key .label );
792
- dst_cache = & info -> dst_cache ;
758
+ dst_cache = ( struct dst_cache * ) & info -> dst_cache ;
793
759
if (use_cache ) {
794
760
dst = dst_cache_get_ip6 (dst_cache , & fl6 -> saddr );
795
761
if (dst )
@@ -812,19 +778,18 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb,
812
778
#endif
813
779
814
780
static int geneve_xmit_skb (struct sk_buff * skb , struct net_device * dev ,
815
- struct geneve_dev * geneve , struct ip_tunnel_info * info )
781
+ struct geneve_dev * geneve ,
782
+ const struct ip_tunnel_info * info )
816
783
{
817
784
bool xnet = !net_eq (geneve -> net , dev_net (geneve -> dev ));
818
785
struct geneve_sock * gs4 = rcu_dereference (geneve -> sock4 );
819
786
const struct ip_tunnel_key * key = & info -> key ;
820
787
struct rtable * rt ;
821
788
int err = - EINVAL ;
822
789
struct flowi4 fl4 ;
823
- u8 * opts = NULL ;
824
790
__u8 tos , ttl ;
825
791
__be16 sport ;
826
792
__be16 df ;
827
- u8 vni [3 ];
828
793
829
794
if (!gs4 )
830
795
return err ;
@@ -843,13 +808,7 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
843
808
}
844
809
df = key -> tun_flags & TUNNEL_DONT_FRAGMENT ? htons (IP_DF ) : 0 ;
845
810
846
- tunnel_id_to_vni (key -> tun_id , vni );
847
- if (info -> options_len )
848
- opts = ip_tunnel_info_opts (info );
849
-
850
- skb_reset_mac_header (skb );
851
- err = geneve_build_skb (rt , skb , key -> tun_flags , vni ,
852
- info -> options_len , opts , xnet );
811
+ err = geneve_build_skb (& rt -> dst , skb , info , xnet , sizeof (struct iphdr ));
853
812
if (unlikely (err ))
854
813
return err ;
855
814
@@ -862,18 +821,17 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
862
821
863
822
#if IS_ENABLED (CONFIG_IPV6 )
864
823
static int geneve6_xmit_skb (struct sk_buff * skb , struct net_device * dev ,
865
- struct geneve_dev * geneve , struct ip_tunnel_info * info )
824
+ struct geneve_dev * geneve ,
825
+ const struct ip_tunnel_info * info )
866
826
{
867
827
bool xnet = !net_eq (geneve -> net , dev_net (geneve -> dev ));
868
828
struct geneve_sock * gs6 = rcu_dereference (geneve -> sock6 );
869
829
const struct ip_tunnel_key * key = & info -> key ;
870
830
struct dst_entry * dst = NULL ;
871
831
int err = - EINVAL ;
872
832
struct flowi6 fl6 ;
873
- u8 * opts = NULL ;
874
833
__u8 prio , ttl ;
875
834
__be16 sport ;
876
- u8 vni [3 ];
877
835
878
836
if (!gs6 )
879
837
return err ;
@@ -891,13 +849,7 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
891
849
ip_hdr (skb ), skb );
892
850
ttl = key -> ttl ? : ip6_dst_hoplimit (dst );
893
851
}
894
- tunnel_id_to_vni (key -> tun_id , vni );
895
- if (info -> options_len )
896
- opts = ip_tunnel_info_opts (info );
897
-
898
- skb_reset_mac_header (skb );
899
- err = geneve6_build_skb (dst , skb , key -> tun_flags , vni ,
900
- info -> options_len , opts , xnet );
852
+ err = geneve_build_skb (dst , skb , info , xnet , sizeof (struct iphdr ));
901
853
if (unlikely (err ))
902
854
return err ;
903
855
0 commit comments