@@ -343,7 +343,7 @@ static struct ip6_tnl *ip6gre_tunnel_locate(struct net *net,
343343 goto failed_free ;
344344
345345 /* 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 ))
347347 dev -> features |= NETIF_F_LLTX ;
348348
349349 dev_hold (dev );
@@ -519,7 +519,7 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb,
519519 gre_build_header (skb , tunnel -> tun_hlen , tunnel -> parms .o_flags ,
520520 protocol , tunnel -> parms .o_key , htonl (tunnel -> o_seqno ));
521521
522- skb_set_inner_protocol (skb , proto );
522+ skb_set_inner_protocol (skb , protocol );
523523
524524 return ip6_tnl_xmit (skb , dev , dsfield , fl6 , encap_limit , pmtu ,
525525 NEXTHDR_GRE );
@@ -700,7 +700,7 @@ static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu)
700700 struct net_device * dev = t -> dev ;
701701 struct __ip6_tnl_parm * p = & t -> parms ;
702702 struct flowi6 * fl6 = & t -> fl .u .ip6 ;
703- int addend = sizeof ( struct ipv6hdr ) + 4 ;
703+ int t_hlen ;
704704
705705 if (dev -> type != ARPHRD_ETHER ) {
706706 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)
727727 else
728728 dev -> flags &= ~IFF_POINTOPOINT ;
729729
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 );
740735
741736 if (p -> flags & IP6_TNL_F_CAP_XMIT ) {
742737 int strict = (ipv6_addr_type (& p -> raddr ) &
@@ -750,10 +745,11 @@ static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu)
750745 return ;
751746
752747 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 ;
754750
755751 if (set_mtu ) {
756- dev -> mtu = rt -> dst .dev -> mtu - addend ;
752+ dev -> mtu = rt -> dst .dev -> mtu - t_hlen ;
757753 if (!(t -> parms .flags & IP6_TNL_F_IGN_ENCAP_LIMIT ))
758754 dev -> mtu -= 8 ;
759755 if (dev -> type == ARPHRD_ETHER )
@@ -799,8 +795,8 @@ static void ip6gre_tnl_parm_from_user(struct __ip6_tnl_parm *p,
799795 p -> link = u -> link ;
800796 p -> i_key = u -> i_key ;
801797 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 ) ;
804800 memcpy (p -> name , u -> name , sizeof (u -> name ));
805801}
806802
@@ -817,8 +813,8 @@ static void ip6gre_tnl_parm_to_user(struct ip6_tnl_parm2 *u,
817813 u -> link = p -> link ;
818814 u -> i_key = p -> i_key ;
819815 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 ) ;
822818 memcpy (u -> name , p -> name , sizeof (u -> name ));
823819}
824820
@@ -1027,11 +1023,12 @@ static int ip6gre_tunnel_init_common(struct net_device *dev)
10271023
10281024 tunnel -> tun_hlen = gre_calc_hlen (tunnel -> parms .o_flags );
10291025
1030- t_hlen = tunnel -> hlen + sizeof ( struct ipv6hdr ) ;
1026+ tunnel -> hlen = tunnel -> tun_hlen ;
10311027
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 );
10341029
1030+ dev -> hard_header_len = LL_MAX_HEADER + t_hlen ;
1031+ dev -> mtu = ETH_DATA_LEN - t_hlen ;
10351032 if (!(tunnel -> parms .flags & IP6_TNL_F_IGN_ENCAP_LIMIT ))
10361033 dev -> mtu -= 8 ;
10371034
@@ -1217,10 +1214,12 @@ static void ip6gre_netlink_parms(struct nlattr *data[],
12171214 parms -> link = nla_get_u32 (data [IFLA_GRE_LINK ]);
12181215
12191216 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 ]));
12211219
12221220 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 ]));
12241223
12251224 if (data [IFLA_GRE_IKEY ])
12261225 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,
13151314 dev -> features |= GRE6_FEATURES ;
13161315 dev -> hw_features |= GRE6_FEATURES ;
13171316
1318- if (!(nt -> parms .o_flags & GRE_SEQ )) {
1317+ if (!(nt -> parms .o_flags & TUNNEL_SEQ )) {
13191318 /* TCP segmentation offload is not supported when we
13201319 * generate output sequences.
13211320 */
@@ -1412,8 +1411,10 @@ static int ip6gre_fill_info(struct sk_buff *skb, const struct net_device *dev)
14121411 struct __ip6_tnl_parm * p = & t -> parms ;
14131412
14141413 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 )) ||
14171418 nla_put_be32 (skb , IFLA_GRE_IKEY , p -> i_key ) ||
14181419 nla_put_be32 (skb , IFLA_GRE_OKEY , p -> o_key ) ||
14191420 nla_put_in6_addr (skb , IFLA_GRE_LOCAL , & p -> laddr ) ||
0 commit comments