static int parse_gre_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
                            bool *csum_err)
 {
-       unsigned int ip_hlen = ip_hdrlen(skb);
        const struct gre_base_hdr *greh;
        __be32 *options;
        int hdr_len;
        if (unlikely(!pskb_may_pull(skb, sizeof(struct gre_base_hdr))))
                return -EINVAL;
 
-       greh = (struct gre_base_hdr *)(skb_network_header(skb) + ip_hlen);
+       greh = (struct gre_base_hdr *)skb_transport_header(skb);
        if (unlikely(greh->flags & (GRE_VERSION | GRE_ROUTING)))
                return -EINVAL;
 
        if (!pskb_may_pull(skb, hdr_len))
                return -EINVAL;
 
-       greh = (struct gre_base_hdr *)(skb_network_header(skb) + ip_hlen);
+       greh = (struct gre_base_hdr *)skb_transport_header(skb);
        tpi->proto = greh->protocol;
 
        options = (__be32 *)(greh + 1);