|
@@ -154,7 +154,9 @@ skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
|
|
|
!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);
|
|
@@ -224,6 +226,21 @@ skb_flow_dissect_tunnel_info(const struct sk_buff *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);
|
|
|
|