data, proto, nhoff, hlen, flags);
 }
 
+void
+skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
+                            struct flow_dissector *flow_dissector,
+                            void *target_container);
+
 static inline __u32 skb_get_hash(struct sk_buff *skb)
 {
        if (!skb->l4_hash && !skb->sw_hash)
 
        ctrl->addr_type = type;
 }
 
-static void
-__skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
-                              struct flow_dissector *flow_dissector,
-                              void *target_container)
+void
+skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
+                            struct flow_dissector *flow_dissector,
+                            void *target_container)
 {
        struct ip_tunnel_info *info;
        struct ip_tunnel_key *key;
                tp->dst = key->tp_dst;
        }
 }
+EXPORT_SYMBOL(skb_flow_dissect_tunnel_info);
 
 static enum flow_dissect_ret
 __skb_flow_dissect_mpls(const struct sk_buff *skb,
                                              FLOW_DISSECTOR_KEY_BASIC,
                                              target_container);
 
-       __skb_flow_dissect_tunnel_info(skb, flow_dissector,
-                                      target_container);
-
        if (dissector_uses_key(flow_dissector,
                               FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
                struct ethhdr *eth = eth_hdr(skb);
 
         * so do it rather here.
         */
        skb_key.basic.n_proto = skb->protocol;
+       skb_flow_dissect_tunnel_info(skb, &head->dissector, &skb_key);
        skb_flow_dissect(skb, &head->dissector, &skb_key, 0);
 
        fl_set_masked_key(&skb_mkey, &skb_key, &head->mask);