{
int i;
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1);
+
if (wc->wildcards
|| wc->tun_id_mask != htonll(UINT64_MAX)
|| wc->nw_src_mask != htonl(UINT32_MAX)
return true;
}
+/* Returns true if 'wc' matches every packet, false if 'wc' fixes any bits or
+ * fields. */
+bool
+flow_wildcards_is_catchall(const struct flow_wildcards *wc)
+{
+ int i;
+
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1);
+
+ if (wc->wildcards != FWW_ALL
+ || wc->tun_id_mask != htonll(0)
+ || wc->nw_src_mask != htonl(0)
+ || wc->nw_dst_mask != htonl(0)
+ || wc->vlan_tci_mask != htons(0)
+ || !ipv6_mask_is_any(&wc->ipv6_src_mask)
+ || !ipv6_mask_is_any(&wc->ipv6_dst_mask)) {
+ return false;
+ }
+
+ for (i = 0; i < FLOW_N_REGS; i++) {
+ if (wc->reg_masks[i] != 0) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
/* Initializes 'dst' as the combination of wildcards in 'src1' and 'src2'.
* That is, a bit or a field is wildcarded in 'dst' if it is wildcarded in
* 'src1' or 'src2' or both. */
void flow_wildcards_init_exact(struct flow_wildcards *);
bool flow_wildcards_is_exact(const struct flow_wildcards *);
+bool flow_wildcards_is_catchall(const struct flow_wildcards *);
bool flow_wildcards_set_nw_src_mask(struct flow_wildcards *, ovs_be32);
bool flow_wildcards_set_nw_dst_mask(struct flow_wildcards *, ovs_be32);