return flow_wildcards_hash(&match->wc, flow_hash(&match->flow, basis));
}
+static bool
+match_has_default_recirc_id(const struct match *m)
+{
+ return m->flow.recirc_id == 0 && (m->wc.masks.recirc_id == UINT32_MAX ||
+ m->wc.masks.recirc_id == 0);
+}
+
+static bool
+match_has_default_dp_hash(const struct match *m)
+{
+ return ((m->flow.dp_hash | m->wc.masks.dp_hash) == 0);
+}
+
+/* Return true if the hidden fields of the match are set to the default values.
+ * The default values equals to those set up by match_init_hidden_fields(). */
+bool
+match_has_default_hidden_fields(const struct match *m)
+{
+ return match_has_default_recirc_id(m) && match_has_default_dp_hash(m);
+}
+
+void
+match_init_hidden_fields(struct match *m)
+{
+ match_set_recirc_id(m, 0);
+ match_set_dp_hash_masked(m, 0, 0);
+}
+
static void
format_eth_masked(struct ds *s, const char *name, const uint8_t eth[6],
const uint8_t mask[6])
int i;
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 25);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 26);
if (priority != OFP_DEFAULT_PRIORITY) {
ds_put_format(s, "priority=%u,", priority);
&& minimask_equal(&a->mask, &b->mask));
}
-/* Returns a hash value for 'match', given 'basis'. */
-uint32_t
-minimatch_hash(const struct minimatch *match, uint32_t basis)
-{
- return miniflow_hash(&match->flow, minimask_hash(&match->mask, basis));
-}
-
/* Returns true if 'target' satisifies 'match', that is, if each bit for which
* 'match' specifies a particular value has the correct value in 'target'.
*
const struct flow *target)
{
const uint32_t *target_u32 = (const uint32_t *) target;
- const uint32_t *flowp = match->flow.values;
- const uint32_t *maskp = match->mask.masks.values;
+ const uint32_t *flowp = miniflow_get_u32_values(&match->flow);
+ const uint32_t *maskp = miniflow_get_u32_values(&match->mask.masks);
uint64_t map;
for (map = match->flow.map; map; map = zero_rightmost_1bit(map)) {
return true;
}
-/* Returns a hash value for the bits of range [start, end) in 'minimatch',
- * given 'basis'.
- *
- * The hash values returned by this function are the same as those returned by
- * flow_hash_in_minimask_range(), only the form of the arguments differ. */
-uint32_t
-minimatch_hash_range(const struct minimatch *match, uint8_t start, uint8_t end,
- uint32_t *basis)
-{
- unsigned int offset;
- const uint32_t *p, *q;
- uint32_t hash = *basis;
- int n, i;
-
- n = count_1bits(miniflow_get_map_in_range(&match->mask.masks, start, end,
- &offset));
- q = match->mask.masks.values + offset;
- p = match->flow.values + offset;
-
- for (i = 0; i < n; i++) {
- hash = mhash_add(hash, p[i] & q[i]);
- }
- *basis = hash; /* Allow continuation from the unfinished value. */
- return mhash_finish(hash, (offset + n) * 4);
-}
-
/* Appends a string representation of 'match' to 's'. If 'priority' is
* different from OFP_DEFAULT_PRIORITY, includes it in 's'. */
void