mpls_label:20;
 };
 
+#define FLOW_DIS_TUN_OPTS_MAX 255
+/**
+ * struct flow_dissector_key_enc_opts:
+ * @data: tunnel option data
+ * @len: length of tunnel option data
+ * @dst_opt_type: tunnel option type
+ */
+struct flow_dissector_key_enc_opts {
+       u8 data[FLOW_DIS_TUN_OPTS_MAX]; /* Using IP_TUNNEL_OPTS_MAX is desired
+                                        * here but seems difficult to #include
+                                        */
+       u8 len;
+       __be16 dst_opt_type;
+};
+
 struct flow_dissector_key_keyid {
        __be32  keyid;
 };
        FLOW_DISSECTOR_KEY_IP, /* struct flow_dissector_key_ip */
        FLOW_DISSECTOR_KEY_CVLAN, /* struct flow_dissector_key_flow_vlan */
        FLOW_DISSECTOR_KEY_ENC_IP, /* struct flow_dissector_key_ip */
+       FLOW_DISSECTOR_KEY_ENC_OPTS, /* struct flow_dissector_key_enc_opts */
+
        FLOW_DISSECTOR_KEY_MAX,
 };
 
 
            !dissector_uses_key(flow_dissector,
                                FLOW_DISSECTOR_KEY_ENC_PORTS) &&
            !dissector_uses_key(flow_dissector,
-                               FLOW_DISSECTOR_KEY_ENC_IP))
+                               FLOW_DISSECTOR_KEY_ENC_IP) &&
+           !dissector_uses_key(flow_dissector,
+                               FLOW_DISSECTOR_KEY_ENC_OPTS))
                return;
 
        info = skb_tunnel_info(skb);
                ip->tos = key->tos;
                ip->ttl = key->ttl;
        }
+
+       if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ENC_OPTS)) {
+               struct flow_dissector_key_enc_opts *enc_opt;
+
+               enc_opt = skb_flow_dissector_target(flow_dissector,
+                                                   FLOW_DISSECTOR_KEY_ENC_OPTS,
+                                                   target_container);
+
+               if (info->options_len) {
+                       enc_opt->len = info->options_len;
+                       ip_tunnel_info_opts_get(enc_opt->data, info);
+                       enc_opt->dst_opt_type = info->key.tun_flags &
+                                               TUNNEL_OPTIONS_PRESENT;
+               }
+       }
 }
 EXPORT_SYMBOL(skb_flow_dissect_tunnel_info);