return dissector_uses_key(rule->match.dissector, key);
 }
 
+/**
+ * flow_rule_is_supp_control_flags() - check for supported control flags
+ * @supp_flags: control flags supported by driver
+ * @ctrl_flags: control flags present in rule
+ * @extack: The netlink extended ACK for reporting errors.
+ *
+ * Return: true if only supported control flags are set, false otherwise.
+ */
+static inline bool flow_rule_is_supp_control_flags(const u32 supp_flags,
+                                                  const u32 ctrl_flags,
+                                                  struct netlink_ext_ack *extack)
+{
+       if (likely((ctrl_flags & ~supp_flags) == 0))
+               return true;
+
+       NL_SET_ERR_MSG_FMT_MOD(extack,
+                              "Unsupported match on control.flags %#x",
+                              ctrl_flags);
+
+       return false;
+}
+
+/**
+ * flow_rule_has_control_flags() - check for presence of any control flags
+ * @ctrl_flags: control flags present in rule
+ * @extack: The netlink extended ACK for reporting errors.
+ *
+ * Return: true if control flags are set, false otherwise.
+ */
+static inline bool flow_rule_has_control_flags(const u32 ctrl_flags,
+                                              struct netlink_ext_ack *extack)
+{
+       return !flow_rule_is_supp_control_flags(0, ctrl_flags, extack);
+}
+
+/**
+ * flow_rule_match_has_control_flags() - match and check for any control flags
+ * @rule: The flow_rule under evaluation.
+ * @extack: The netlink extended ACK for reporting errors.
+ *
+ * Return: true if control flags are set, false otherwise.
+ */
+static inline bool flow_rule_match_has_control_flags(struct flow_rule *rule,
+                                                    struct netlink_ext_ack *extack)
+{
+       struct flow_match_control match;
+
+       if (!flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CONTROL))
+               return false;
+
+       flow_rule_match_control(rule, &match);
+
+       return flow_rule_has_control_flags(match.mask->flags, extack);
+}
+
 struct flow_stats {
        u64     pkts;
        u64     bytes;