/* These fields used only by GRE */
        __u32 i_seqno;  /* The last seen seqno  */
        __u32 o_seqno;  /* The last output seqno */
-       int hlen;       /* Precalculated GRE header length */
+       int hlen;       /* tun_hlen + encap_hlen */
+       int tun_hlen;   /* Precalculated header length */
        int mlink;
+
 };
 
 /* Tunnel encapsulation limit destination sub-option */
                             const struct in6_addr *raddr);
 struct net *ip6_tnl_get_link_net(const struct net_device *dev);
 int ip6_tnl_get_iflink(const struct net_device *dev);
+int ip6_tnl_change_mtu(struct net_device *dev, int new_mtu);
 
 #ifdef CONFIG_INET
 static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,
 
  *   %-EINVAL if mtu too small
  **/
 
-static int
-ip6_tnl_change_mtu(struct net_device *dev, int new_mtu)
+int ip6_tnl_change_mtu(struct net_device *dev, int new_mtu)
 {
        struct ip6_tnl *tnl = netdev_priv(dev);
 
        dev->mtu = new_mtu;
        return 0;
 }
+EXPORT_SYMBOL(ip6_tnl_change_mtu);
 
 int ip6_tnl_get_iflink(const struct net_device *dev)
 {
        if (ret)
                goto destroy_dst;
 
+       t->hlen = 0;
+       t->tun_hlen = 0;
+
        return 0;
 
 destroy_dst: