*CONST_CAST(cls_version_t *, &cls_match->add_version) = version;
atomic_init(&cls_match->remove_version, version); /* Initially
* invisible. */
- miniflow_clone_inline(CONST_CAST(struct miniflow *, &cls_match->flow),
- rule->match.flow, count);
+ miniflow_clone(CONST_CAST(struct miniflow *, &cls_match->flow),
+ rule->match.flow, count);
ovsrcu_set_hidden(&cls_match->conj_set,
cls_conjunction_set_alloc(cls_match, conj, n));
subtable = xzalloc(sizeof *subtable + MINIFLOW_VALUES_SIZE(count));
cmap_init(&subtable->rules);
- miniflow_clone_inline(CONST_CAST(struct miniflow *, &subtable->mask.masks),
- &mask->masks, count);
+ miniflow_clone(CONST_CAST(struct miniflow *, &subtable->mask.masks),
+ &mask->masks, count);
/* Init indices for segmented lookup, if any. */
flow_wildcards_init_catchall(&new);
return dst;
}
-/* Returns a copy of 'src'. The caller must eventually free the returned
- * miniflow with free(). */
-struct miniflow *
-miniflow_clone(const struct miniflow *src)
-{
- struct miniflow *dst;
- size_t data_size;
-
- data_size = miniflow_alloc(&dst, 1, src);
- memcpy(dst->values, src->values, data_size);
- return dst;
-}
-
/* Initializes 'dst' as a copy of 'src'. The caller must have allocated
* 'dst' to have inline space for 'n_values' data in 'src'. */
void
-miniflow_clone_inline(struct miniflow *dst, const struct miniflow *src,
- size_t n_values)
+miniflow_clone(struct miniflow *dst, const struct miniflow *src,
+ size_t n_values)
{
dst->map = src->map;
memcpy(dst->values, src->values, MINIFLOW_VALUES_SIZE(n_values));
return (struct minimask *)miniflow_create(&wc->masks);
}
-/* Returns a copy of 'src'. The caller must eventually free the returned
- * minimask with free(). */
-struct minimask *
-minimask_clone(const struct minimask *src)
-{
- return (struct minimask *)miniflow_clone(&src->masks);
-}
-
/* Initializes 'dst_' as the bit-wise "and" of 'a_' and 'b_'.
*
* The caller must provide room for FLOW_U64S "uint64_t"s in 'storage', which
size_t miniflow_alloc(struct miniflow *dsts[], size_t n,
const struct miniflow *src);
void miniflow_init(struct miniflow *, const struct flow *);
-
+void miniflow_clone(struct miniflow *, const struct miniflow *,
+ size_t n_values);
struct miniflow * miniflow_create(const struct flow *);
-struct miniflow * miniflow_clone(const struct miniflow *);
-
-void miniflow_clone_inline(struct miniflow *, const struct miniflow *,
- size_t n_values);
void miniflow_expand(const struct miniflow *, struct flow *);
void minimask_init(struct minimask *, const struct flow_wildcards *);
struct minimask * minimask_create(const struct flow_wildcards *);
-struct minimask * minimask_clone(const struct minimask *);
void minimask_combine(struct minimask *dst,
const struct minimask *a, const struct minimask *b,
uint64_t storage[FLOW_U64S]);
}
}
+/* Returns a copy of 'src'. The caller must eventually free the returned
+ * miniflow with free(). */
+static struct miniflow *
+miniflow_clone__(const struct miniflow *src)
+{
+ struct miniflow *dst;
+ size_t data_size;
+
+ data_size = miniflow_alloc(&dst, 1, src);
+ miniflow_clone(dst, src, data_size / sizeof(uint64_t));
+ return dst;
+}
+
static void
test_miniflow(struct ovs_cmdl_context *ctx OVS_UNUSED)
{
assert(flow_equal(&flow, &flow2));
/* Check that copying a miniflow works properly. */
- miniflow2 = miniflow_clone(miniflow);
+ miniflow2 = miniflow_clone__(miniflow);
assert(miniflow_equal(miniflow, miniflow2));
assert(miniflow_hash(miniflow, 0) == miniflow_hash(miniflow2, 0));
miniflow_expand(miniflow2, &flow3);