summaryrefslogtreecommitdiff
path: root/net/core/flow_dissector.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/flow_dissector.c')
-rw-r--r--net/core/flow_dissector.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
index f82e9a7d3b37..59fe46077b3c 100644
--- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c
@@ -382,7 +382,9 @@ skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
!dissector_uses_key(flow_dissector,
FLOW_DISSECTOR_KEY_ENC_IP) &&
!dissector_uses_key(flow_dissector,
- FLOW_DISSECTOR_KEY_ENC_OPTS))
+ FLOW_DISSECTOR_KEY_ENC_OPTS) &&
+ !dissector_uses_key(flow_dissector,
+ FLOW_DISSECTOR_KEY_ENC_FLAGS))
return;
info = skb_tunnel_info(skb);
@@ -475,6 +477,18 @@ skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
IP_TUNNEL_GENEVE_OPT_BIT);
enc_opt->dst_opt_type = val < __IP_TUNNEL_FLAG_NUM ? val : 0;
}
+
+ if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ENC_FLAGS)) {
+ struct flow_dissector_key_enc_flags *enc_flags;
+ IP_TUNNEL_DECLARE_FLAGS(flags) = {};
+
+ enc_flags = skb_flow_dissector_target(flow_dissector,
+ FLOW_DISSECTOR_KEY_ENC_FLAGS,
+ target_container);
+ ip_tunnel_set_encflags_present(flags);
+ ip_tunnel_flags_and(flags, flags, info->key.tun_flags);
+ enc_flags->flags = bitmap_read(flags, IP_TUNNEL_CSUM_BIT, 32);
+ }
}
EXPORT_SYMBOL(skb_flow_dissect_tunnel_info);