From ecf1e7ac2bc61b1d614395354554e672535135f8 Mon Sep 17 00:00:00 2001
From: Ben Pfaff <blp@nicira.com>
Date: Mon, 12 Sep 2011 16:38:52 -0700
Subject: [PATCH] flow: New function flow_wildcards_is_catchall().

This will be used in an upcoming commit.
---
 lib/flow.c | 30 ++++++++++++++++++++++++++++++
 lib/flow.h |  1 +
 2 files changed, 31 insertions(+)

diff --git a/lib/flow.c b/lib/flow.c
index 8ec31ab97..6b78ae36f 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -606,6 +606,8 @@ flow_wildcards_is_exact(const struct flow_wildcards *wc)
 {
     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)
@@ -625,6 +627,34 @@ flow_wildcards_is_exact(const struct flow_wildcards *wc)
     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.  */
diff --git a/lib/flow.h b/lib/flow.h
index e7b49a8f2..6212f8453 100644
--- a/lib/flow.h
+++ b/lib/flow.h
@@ -164,6 +164,7 @@ void flow_wildcards_init_catchall(struct flow_wildcards *);
 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);
-- 
2.47.0