mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 09:58:01 +00:00
The test is passing stack-allocated uninitialized wildcards to the multipath execution: WARNING: MemorySanitizer: use-of-uninitialized-value 0 0x873ece in mf_get_value lib/meta-flow.c:797:23 1 0x8998ad in mf_write_subfield_flow lib/meta-flow.c:3365:5 2 0x90dcbc in nxm_reg_load lib/nx-match.c:1851:5 3 0x8aaf7d in multipath_execute lib/multipath.c:60:5 4 0x5fbbe5 in test_multipath_main tests/test-multipath.c:68:13 5 0x5fb4fb in ovstest_wrapper_test_multipath_main__ tests/test-multipath.c:137:1 6 0x6e3204 in ovs_cmdl_run_command__ lib/command-line.c:247:17 7 0x6e2828 in ovs_cmdl_run_command lib/command-line.c:278:5 8 0x4c3d2a in main tests/ovstest.c:133:9 9 0x7faa2e in __libc_start_call_main 10 0x7faa2e in __libc_start_main@GLIBC_2.2.5 11 0x432b44 in _start (tests/ovstest+0x432b44) This doesn't affect the logic of the test it seems, but it's not a good thing to do. Fixes: f74e7df7450d ("ofproto-dpif: Always un-wildcard fields that are being set.") Acked-by: Mike Pattrick <mkp@redhat.com> Acked-by: Eelco Chaudron <echaudro@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
139 lines
3.9 KiB
C
139 lines
3.9 KiB
C
/*
|
|
* Copyright (c) 2010, 2012, 2013, 2014 Nicira, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <config.h>
|
|
#undef NDEBUG
|
|
#include <assert.h>
|
|
#include <getopt.h>
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "flow.h"
|
|
#include "multipath.h"
|
|
#include "openvswitch/ofp-actions.h"
|
|
#include "ovstest.h"
|
|
#include "util.h"
|
|
|
|
static void
|
|
test_multipath_main(int argc, char *argv[])
|
|
{
|
|
enum { MP_MAX_LINKS = 63 };
|
|
struct ofpact_multipath mp;
|
|
bool ok = true;
|
|
char *error;
|
|
int n;
|
|
|
|
set_program_name(argv[0]);
|
|
|
|
if (argc != 2) {
|
|
ovs_fatal(0, "usage: %s multipath_action", program_name);
|
|
}
|
|
|
|
error = multipath_parse(&mp, argv[1]);
|
|
if (error) {
|
|
ovs_fatal(0, "%s", error);
|
|
}
|
|
|
|
for (n = 1; n <= MP_MAX_LINKS; n++) {
|
|
enum { N_FLOWS = 65536 };
|
|
double disruption, perfect, distribution;
|
|
int histogram[MP_MAX_LINKS];
|
|
double sum_dev2, stddev;
|
|
int changed;
|
|
int i;
|
|
|
|
changed = 0;
|
|
memset(histogram, 0, sizeof histogram);
|
|
for (i = 0; i < N_FLOWS; i++) {
|
|
int old_link, new_link;
|
|
struct flow_wildcards wc;
|
|
struct flow flow;
|
|
|
|
flow_random_hash_fields(&flow);
|
|
flow_wildcards_init_catchall(&wc);
|
|
|
|
mp.max_link = n - 1;
|
|
multipath_execute(&mp, &flow, &wc);
|
|
old_link = flow.regs[0];
|
|
|
|
mp.max_link = n;
|
|
multipath_execute(&mp, &flow, &wc);
|
|
new_link = flow.regs[0];
|
|
|
|
assert(old_link >= 0 && old_link < n);
|
|
assert(new_link >= 0 && new_link < n + 1);
|
|
|
|
histogram[old_link]++;
|
|
changed += old_link != new_link;
|
|
}
|
|
|
|
sum_dev2 = 0.0;
|
|
for (i = 0; i < n; i++) {
|
|
double mean = (double) N_FLOWS / n;
|
|
double deviation = histogram[i] - mean;
|
|
|
|
sum_dev2 += deviation * deviation;
|
|
}
|
|
stddev = sqrt(sum_dev2 / n);
|
|
|
|
disruption = (double) changed / N_FLOWS;
|
|
perfect = 1.0 / (n + 1);
|
|
distribution = stddev / ((double) N_FLOWS / n);
|
|
printf("%2d -> %2d: disruption=%.2f (perfect=%.2f); "
|
|
"stddev/expected=%.4f\n",
|
|
n, n + 1, disruption, perfect, distribution);
|
|
|
|
switch (mp.algorithm) {
|
|
case NX_MP_ALG_MODULO_N:
|
|
if (disruption < (n < 2 ? .25 : .5)) {
|
|
fprintf(stderr, "%d -> %d: disruption=%.2f < .5\n",
|
|
n, n + 1, disruption);
|
|
ok = false;
|
|
}
|
|
break;
|
|
|
|
case NX_MP_ALG_HASH_THRESHOLD:
|
|
if (disruption < .48 || disruption > .52) {
|
|
fprintf(stderr, "%d -> %d: disruption=%.2f not approximately "
|
|
".5\n", n, n + 1, disruption);
|
|
ok = false;
|
|
}
|
|
break;
|
|
|
|
case NX_MP_ALG_ITER_HASH:
|
|
if (!(n & (n - 1))) {
|
|
break;
|
|
}
|
|
/* Fall through. */
|
|
case NX_MP_ALG_HRW:
|
|
if (fabs(disruption - perfect) >= .01) {
|
|
fprintf(stderr, "%d -> %d: disruption=%.5f differs from "
|
|
"perfect=%.5f by more than .01\n",
|
|
n, n + 1, disruption, perfect);
|
|
ok = false;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
OVS_NOT_REACHED();
|
|
}
|
|
}
|
|
|
|
exit(ok ? 0 : 1);
|
|
}
|
|
|
|
OVSTEST_REGISTER("test-multipath", test_multipath_main);
|