}
        }
 
+       skb_gro_pull(skb, gh_len);
+       skb_gro_postpull_rcsum(skb, gh, gh_len);
        type = gh->proto_type;
+       if (likely(type == htons(ETH_P_TEB)))
+               return call_gro_receive(eth_gro_receive, head, skb);
 
        ptype = gro_find_receive_by_type(type);
        if (!ptype)
                goto out;
 
-       skb_gro_pull(skb, gh_len);
-       skb_gro_postpull_rcsum(skb, gh, gh_len);
        pp = call_gro_receive(ptype->callbacks.gro_receive, head, skb);
        flush = 0;
 
        gh_len = geneve_hlen(gh);
        type = gh->proto_type;
 
+       /* since skb->encapsulation is set, eth_gro_complete() sets the inner mac header */
+       if (likely(type == htons(ETH_P_TEB)))
+               return eth_gro_complete(skb, nhoff + gh_len);
+
        ptype = gro_find_complete_by_type(type);
        if (ptype)
                err = ptype->callbacks.gro_complete(skb, nhoff + gh_len);