@@ -343,7 +343,7 @@ static struct ip6_tnl *ip6gre_tunnel_locate(struct net *net,
343
343
goto failed_free ;
344
344
345
345
/* Can use a lockless transmit, unless we generate output sequences */
346
- if (!(nt -> parms .o_flags & GRE_SEQ ))
346
+ if (!(nt -> parms .o_flags & TUNNEL_SEQ ))
347
347
dev -> features |= NETIF_F_LLTX ;
348
348
349
349
dev_hold (dev );
@@ -519,7 +519,7 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb,
519
519
gre_build_header (skb , tunnel -> tun_hlen , tunnel -> parms .o_flags ,
520
520
protocol , tunnel -> parms .o_key , htonl (tunnel -> o_seqno ));
521
521
522
- skb_set_inner_protocol (skb , proto );
522
+ skb_set_inner_protocol (skb , protocol );
523
523
524
524
return ip6_tnl_xmit (skb , dev , dsfield , fl6 , encap_limit , pmtu ,
525
525
NEXTHDR_GRE );
@@ -700,7 +700,7 @@ static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu)
700
700
struct net_device * dev = t -> dev ;
701
701
struct __ip6_tnl_parm * p = & t -> parms ;
702
702
struct flowi6 * fl6 = & t -> fl .u .ip6 ;
703
- int addend = sizeof ( struct ipv6hdr ) + 4 ;
703
+ int t_hlen ;
704
704
705
705
if (dev -> type != ARPHRD_ETHER ) {
706
706
memcpy (dev -> dev_addr , & p -> laddr , sizeof (struct in6_addr ));
@@ -727,16 +727,11 @@ static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu)
727
727
else
728
728
dev -> flags &= ~IFF_POINTOPOINT ;
729
729
730
- /* Precalculate GRE options length */
731
- if (t -> parms .o_flags & (GRE_CSUM |GRE_KEY |GRE_SEQ )) {
732
- if (t -> parms .o_flags & GRE_CSUM )
733
- addend += 4 ;
734
- if (t -> parms .o_flags & GRE_KEY )
735
- addend += 4 ;
736
- if (t -> parms .o_flags & GRE_SEQ )
737
- addend += 4 ;
738
- }
739
- t -> hlen = addend ;
730
+ t -> tun_hlen = gre_calc_hlen (t -> parms .o_flags );
731
+
732
+ t -> hlen = t -> tun_hlen ;
733
+
734
+ t_hlen = t -> hlen + sizeof (struct ipv6hdr );
740
735
741
736
if (p -> flags & IP6_TNL_F_CAP_XMIT ) {
742
737
int strict = (ipv6_addr_type (& p -> raddr ) &
@@ -750,10 +745,11 @@ static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu)
750
745
return ;
751
746
752
747
if (rt -> dst .dev ) {
753
- dev -> hard_header_len = rt -> dst .dev -> hard_header_len + addend ;
748
+ dev -> hard_header_len = rt -> dst .dev -> hard_header_len +
749
+ t_hlen ;
754
750
755
751
if (set_mtu ) {
756
- dev -> mtu = rt -> dst .dev -> mtu - addend ;
752
+ dev -> mtu = rt -> dst .dev -> mtu - t_hlen ;
757
753
if (!(t -> parms .flags & IP6_TNL_F_IGN_ENCAP_LIMIT ))
758
754
dev -> mtu -= 8 ;
759
755
if (dev -> type == ARPHRD_ETHER )
@@ -799,8 +795,8 @@ static void ip6gre_tnl_parm_from_user(struct __ip6_tnl_parm *p,
799
795
p -> link = u -> link ;
800
796
p -> i_key = u -> i_key ;
801
797
p -> o_key = u -> o_key ;
802
- p -> i_flags = u -> i_flags ;
803
- p -> o_flags = u -> o_flags ;
798
+ p -> i_flags = gre_flags_to_tnl_flags ( u -> i_flags ) ;
799
+ p -> o_flags = gre_flags_to_tnl_flags ( u -> o_flags ) ;
804
800
memcpy (p -> name , u -> name , sizeof (u -> name ));
805
801
}
806
802
@@ -817,8 +813,8 @@ static void ip6gre_tnl_parm_to_user(struct ip6_tnl_parm2 *u,
817
813
u -> link = p -> link ;
818
814
u -> i_key = p -> i_key ;
819
815
u -> o_key = p -> o_key ;
820
- u -> i_flags = p -> i_flags ;
821
- u -> o_flags = p -> o_flags ;
816
+ u -> i_flags = gre_tnl_flags_to_gre_flags ( p -> i_flags ) ;
817
+ u -> o_flags = gre_tnl_flags_to_gre_flags ( p -> o_flags ) ;
822
818
memcpy (u -> name , p -> name , sizeof (u -> name ));
823
819
}
824
820
@@ -1027,11 +1023,12 @@ static int ip6gre_tunnel_init_common(struct net_device *dev)
1027
1023
1028
1024
tunnel -> tun_hlen = gre_calc_hlen (tunnel -> parms .o_flags );
1029
1025
1030
- t_hlen = tunnel -> hlen + sizeof ( struct ipv6hdr ) ;
1026
+ tunnel -> hlen = tunnel -> tun_hlen ;
1031
1027
1032
- dev -> needed_headroom = LL_MAX_HEADER + t_hlen + 4 ;
1033
- dev -> mtu = ETH_DATA_LEN - t_hlen - 4 ;
1028
+ t_hlen = tunnel -> hlen + sizeof (struct ipv6hdr );
1034
1029
1030
+ dev -> hard_header_len = LL_MAX_HEADER + t_hlen ;
1031
+ dev -> mtu = ETH_DATA_LEN - t_hlen ;
1035
1032
if (!(tunnel -> parms .flags & IP6_TNL_F_IGN_ENCAP_LIMIT ))
1036
1033
dev -> mtu -= 8 ;
1037
1034
@@ -1217,10 +1214,12 @@ static void ip6gre_netlink_parms(struct nlattr *data[],
1217
1214
parms -> link = nla_get_u32 (data [IFLA_GRE_LINK ]);
1218
1215
1219
1216
if (data [IFLA_GRE_IFLAGS ])
1220
- parms -> i_flags = nla_get_be16 (data [IFLA_GRE_IFLAGS ]);
1217
+ parms -> i_flags = gre_flags_to_tnl_flags (
1218
+ nla_get_be16 (data [IFLA_GRE_IFLAGS ]));
1221
1219
1222
1220
if (data [IFLA_GRE_OFLAGS ])
1223
- parms -> o_flags = nla_get_be16 (data [IFLA_GRE_OFLAGS ]);
1221
+ parms -> o_flags = gre_flags_to_tnl_flags (
1222
+ nla_get_be16 (data [IFLA_GRE_OFLAGS ]));
1224
1223
1225
1224
if (data [IFLA_GRE_IKEY ])
1226
1225
parms -> i_key = nla_get_be32 (data [IFLA_GRE_IKEY ]);
@@ -1315,7 +1314,7 @@ static int ip6gre_newlink(struct net *src_net, struct net_device *dev,
1315
1314
dev -> features |= GRE6_FEATURES ;
1316
1315
dev -> hw_features |= GRE6_FEATURES ;
1317
1316
1318
- if (!(nt -> parms .o_flags & GRE_SEQ )) {
1317
+ if (!(nt -> parms .o_flags & TUNNEL_SEQ )) {
1319
1318
/* TCP segmentation offload is not supported when we
1320
1319
* generate output sequences.
1321
1320
*/
@@ -1412,8 +1411,10 @@ static int ip6gre_fill_info(struct sk_buff *skb, const struct net_device *dev)
1412
1411
struct __ip6_tnl_parm * p = & t -> parms ;
1413
1412
1414
1413
if (nla_put_u32 (skb , IFLA_GRE_LINK , p -> link ) ||
1415
- nla_put_be16 (skb , IFLA_GRE_IFLAGS , p -> i_flags ) ||
1416
- nla_put_be16 (skb , IFLA_GRE_OFLAGS , p -> o_flags ) ||
1414
+ nla_put_be16 (skb , IFLA_GRE_IFLAGS ,
1415
+ gre_tnl_flags_to_gre_flags (p -> i_flags )) ||
1416
+ nla_put_be16 (skb , IFLA_GRE_OFLAGS ,
1417
+ gre_tnl_flags_to_gre_flags (p -> o_flags )) ||
1417
1418
nla_put_be32 (skb , IFLA_GRE_IKEY , p -> i_key ) ||
1418
1419
nla_put_be32 (skb , IFLA_GRE_OKEY , p -> o_key ) ||
1419
1420
nla_put_in6_addr (skb , IFLA_GRE_LOCAL , & p -> laddr ) ||
0 commit comments