diff options
author | Han Zhou <zhouhan@gmail.com> | 2017-09-09 22:58:25 -0700 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2017-09-11 08:10:46 -0700 |
commit | cdcd89097923107e0cf63d5edaae5ae5d33444b8 (patch) | |
tree | 98c43a7decd595219c369d475ecef88cabe1008a | |
parent | c5c1cc5d06f4c3c8f0a4dc784239d415a0fc0cbc (diff) | |
download | openvswitch-cdcd89097923107e0cf63d5edaae5ae5d33444b8.tar.gz |
ovn-controller: Fix empty address set parsing problem.
When an address set is empty, current implementation will generate
an ovs flow that matches random things (and in most cases matching
everything) due to a problem in expression parser of constant set.
This patch fixes it by replacing the expression by a boolean false
when the set is empty, and adds tests cases accordingly.
Reported-by: Guru Shetty <guru@ovn.org>
Reported-at: https://mail.openvswitch.org/pipermail/ovs-dev/2017-September/338441.html
Signed-off-by: Han Zhou <zhouhan@gmail.com>
Co-authored-by: Ben Pfaff <blp@ovn.org>
Signed-off-by: Ben Pfaff <blp@ovn.org>
-rw-r--r-- | ovn/lib/expr.c | 4 | ||||
-rw-r--r-- | tests/ovn.at | 32 | ||||
-rw-r--r-- | tests/test-ovn.c | 2 |
3 files changed, 38 insertions, 0 deletions
diff --git a/ovn/lib/expr.c b/ovn/lib/expr.c index 060e9ee3d..79ff45762 100644 --- a/ovn/lib/expr.c +++ b/ovn/lib/expr.c @@ -612,6 +612,10 @@ make_cmp(struct expr_context *ctx, } } + if (!cs->n_values) { + e = expr_create_boolean(r == EXPR_R_NE); + goto exit; + } e = make_cmp__(f, r, &cs->values[0]); for (size_t i = 1; i < cs->n_values; i++) { e = expr_combine(r == EXPR_R_EQ ? EXPR_T_OR : EXPR_T_AND, diff --git a/tests/ovn.at b/tests/ovn.at index bb9999ce0..f2035290f 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -623,6 +623,38 @@ dl_src=00:00:00:00:00:02 dl_src=00:00:00:00:00:03 dl_src=ba:be:be:ef:de:ad ]) +AT_CHECK([expr_to_flow 'ip4.src == {$set4}'], [0], [dnl +(no flows) +]) +AT_CHECK([expr_to_flow 'ip4.src == {1.2.3.4, $set4}'], [0], [dnl +ip,nw_src=1.2.3.4 +]) +AT_CHECK([expr_to_flow 'ip4.src == 1.2.3.4 || ip4.src == {$set4}'], [0], [dnl +ip,nw_src=1.2.3.4 +]) +AT_CHECK([expr_to_flow 'ip4.src != {$set4}'], [0], [dnl + +]) +AT_CHECK([expr_to_flow 'ip4.src != {1.0.0.0/8, $set4}'], [0], [dnl +ip,nw_src=0.0.0.0/1.0.0.0 +ip,nw_src=128.0.0.0/1 +ip,nw_src=16.0.0.0/16.0.0.0 +ip,nw_src=2.0.0.0/2.0.0.0 +ip,nw_src=32.0.0.0/32.0.0.0 +ip,nw_src=4.0.0.0/4.0.0.0 +ip,nw_src=64.0.0.0/64.0.0.0 +ip,nw_src=8.0.0.0/8.0.0.0 +]) +AT_CHECK([expr_to_flow 'ip4.src != 1.0.0.0/8 && ip4.src != {$set4}'], [0], [dnl +ip,nw_src=0.0.0.0/1.0.0.0 +ip,nw_src=128.0.0.0/1 +ip,nw_src=16.0.0.0/16.0.0.0 +ip,nw_src=2.0.0.0/2.0.0.0 +ip,nw_src=32.0.0.0/32.0.0.0 +ip,nw_src=4.0.0.0/4.0.0.0 +ip,nw_src=64.0.0.0/64.0.0.0 +ip,nw_src=8.0.0.0/8.0.0.0 +]) AT_CLEANUP AT_SETUP([ovn -- action parsing]) diff --git a/tests/test-ovn.c b/tests/test-ovn.c index 694bc794a..148ce122d 100644 --- a/tests/test-ovn.c +++ b/tests/test-ovn.c @@ -202,10 +202,12 @@ create_addr_sets(struct shash *addr_sets) static const char *const addrs3[] = { "00:00:00:00:00:01", "00:00:00:00:00:02", "00:00:00:00:00:03", }; + static const char *const addrs4[] = {}; expr_addr_sets_add(addr_sets, "set1", addrs1, 3); expr_addr_sets_add(addr_sets, "set2", addrs2, 3); expr_addr_sets_add(addr_sets, "set3", addrs3, 3); + expr_addr_sets_add(addr_sets, "set4", addrs4, 0); } static bool |