summaryrefslogtreecommitdiff
path: root/lib/meta-flow.c
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2015-01-11 13:25:24 -0800
committerBen Pfaff <blp@nicira.com>2015-01-11 13:25:24 -0800
commit18080541d2768c17c17711c35b4d4a23ab3e4153 (patch)
treee77602548cb48e31ce673a0509210af054fca9a4 /lib/meta-flow.c
parent2e0bded4b44e671a06c8ceb97fc785778cc49458 (diff)
downloadopenvswitch-18080541d2768c17c17711c35b4d4a23ab3e4153.tar.gz
classifier: Add support for conjunctive matches.
A "conjunctive match" allows higher-level matches in the flow table, such as set membership matches, without causing a cross-product explosion for multidimensional matches. Please refer to the documentation that this commit adds to ovs-ofctl(8) for a better explanation, including an example. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
Diffstat (limited to 'lib/meta-flow.c')
-rw-r--r--lib/meta-flow.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/meta-flow.c b/lib/meta-flow.c
index 90dd27c24..67115b2d7 100644
--- a/lib/meta-flow.c
+++ b/lib/meta-flow.c
@@ -108,6 +108,8 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc)
return !wc->masks.dp_hash;
case MFF_RECIRC_ID:
return !wc->masks.recirc_id;
+ case MFF_CONJ_ID:
+ return !wc->masks.conj_id;
case MFF_TUN_SRC:
return !wc->masks.tunnel.ip_src;
case MFF_TUN_DST:
@@ -363,6 +365,7 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value)
switch (mf->id) {
case MFF_DP_HASH:
case MFF_RECIRC_ID:
+ case MFF_CONJ_ID:
case MFF_TUN_ID:
case MFF_TUN_SRC:
case MFF_TUN_DST:
@@ -464,6 +467,9 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow,
case MFF_RECIRC_ID:
value->be32 = htonl(flow->recirc_id);
break;
+ case MFF_CONJ_ID:
+ value->be32 = htonl(flow->conj_id);
+ break;
case MFF_TUN_ID:
value->be64 = flow->tunnel.tun_id;
break;
@@ -669,6 +675,9 @@ mf_set_value(const struct mf_field *mf,
case MFF_RECIRC_ID:
match_set_recirc_id(match, ntohl(value->be32));
break;
+ case MFF_CONJ_ID:
+ match_set_conj_id(match, ntohl(value->be32));
+ break;
case MFF_TUN_ID:
match_set_tun_id(match, value->be64);
break;
@@ -898,6 +907,9 @@ mf_set_flow_value(const struct mf_field *mf,
case MFF_RECIRC_ID:
flow->recirc_id = ntohl(value->be32);
break;
+ case MFF_CONJ_ID:
+ flow->conj_id = ntohl(value->be32);
+ break;
case MFF_TUN_ID:
flow->tunnel.tun_id = value->be64;
break;
@@ -1152,6 +1164,10 @@ mf_set_wild(const struct mf_field *mf, struct match *match)
match->flow.recirc_id = 0;
match->wc.masks.recirc_id = 0;
break;
+ case MFF_CONJ_ID:
+ match->flow.conj_id = 0;
+ match->wc.masks.conj_id = 0;
+ break;
case MFF_TUN_ID:
match_set_tun_id_masked(match, htonll(0), htonll(0));
break;
@@ -1373,6 +1389,7 @@ mf_set(const struct mf_field *mf,
switch (mf->id) {
case MFF_RECIRC_ID:
+ case MFF_CONJ_ID:
case MFF_IN_PORT:
case MFF_IN_PORT_OXM:
case MFF_ACTSET_OUTPUT: