This commit prevents cfm from raising 'interval' fault when demand mode is only enabled on one end of link.
Signed-off-by: Alex Wang <al...@nicira.com> --- v1 -> v2: - simplify the code. --- lib/cfm.c | 12 +++++++---- tests/automake.mk | 1 + tests/cfm.at | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/testsuite.at | 1 + vswitchd/vswitch.xml | 5 +++-- 5 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 tests/cfm.at diff --git a/lib/cfm.c b/lib/cfm.c index 4a46c05..b496d81 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -255,9 +255,14 @@ cfm_fault_interval(struct cfm *cfm) OVS_REQUIRES(mutex) * as a fault (likely due to a configuration error). Thus we can check all * MPs at once making this quite a bit simpler. * - * According to the specification we should check when (ccm_interval_ms * - * 3.5)ms have passed. */ - return (cfm->ccm_interval_ms * 7) / 2; + * When cfm is not in demand mode, we check when (ccm_interval_ms * 3.5) ms + * have passed. + * When cfm is in demand mode, we check when + * (MAX(ccm_interval_ms, 500) * 3.5) ms have passed. This is to ensure + * that ovs-vswitchd has enough time to pull statistics from the datapath. */ + + return (MAX(cfm->ccm_interval_ms, cfm->demand ? 500 : cfm->ccm_interval_ms) + * 7) / 2; } static uint8_t @@ -611,7 +616,6 @@ cfm_configure(struct cfm *cfm, const struct cfm_settings *s) } if (s->extended && s->demand) { - interval_ms = MAX(interval_ms, 500); if (!cfm->demand) { cfm->demand = true; cfm->rx_packets = cfm_rx_packets(cfm); diff --git a/tests/automake.mk b/tests/automake.mk index 60d3640..8f51a65 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -22,6 +22,7 @@ TESTSUITE_AT = \ tests/odp.at \ tests/multipath.at \ tests/bfd.at \ + tests/cfm.at \ tests/lacp.at \ tests/learn.at \ tests/vconn.at \ diff --git a/tests/cfm.at b/tests/cfm.at new file mode 100644 index 0000000..638e03f --- /dev/null +++ b/tests/cfm.at @@ -0,0 +1,57 @@ +AT_BANNER([cfm]) + +m4_define([CFM_CHECK_EXTENDED], [ +AT_CHECK([ovs-appctl cfm/show $1 | sed -e '/next CCM tx:/d' | sed -e '/next fault check:/d' | sed -e '/recv since check:/d'],[0], +[dnl +---- $1 ---- +MPID $2: extended + average health: $3 + opstate: $4 + remote_opstate: $5 + interval: $6 +Remote MPID $7 + opstate: $8 +]) +]) + +# test cfm under demand mode. +AT_SETUP([cfm - demand mode]) +#Create 2 bridges connected by patch ports and enable BFD +OVS_VSWITCHD_START([add-br br1 -- \ + set bridge br1 datapath-type=dummy \ + other-config:hwaddr=aa:55:aa:56:00:00 -- \ + add-port br1 p1 -- set Interface p1 type=patch \ + options:peer=p0 -- \ + add-port br0 p0 -- set Interface p0 type=patch \ + options:peer=p1 -- \ + set Interface p0 cfm_mpid=1 other_config:cfm_interval=300 other_config:cfm_extended=true -- \ + set Interface p1 cfm_mpid=2 other_config:cfm_interval=300 other_config:cfm_extended=true ]) + +ovs-appctl time/stop +# wait for a while to stablize cfm. +for i in `seq 0 100`; do ovs-appctl time/warp 100; done +CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up]) +CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up]) + +# turn on demand mode on one end. +AT_CHECK([ovs-vsctl set interface p0 other_config:cfm_demand=true]) + +# cfm should never go down. +for i in `seq 0 100` +do + ovs-appctl time/warp 100 + CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up]) + CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up]) +done + +# turn on demand mode on the other end. +AT_CHECK([ovs-vsctl set interface p1 other_config:cfm_demand=true]) +for i in `seq 0 100` +do + ovs-appctl time/warp 100 + CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up]) + CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up]) +done + +OVS_VSWITCHD_STOP +AT_CLEANUP diff --git a/tests/testsuite.at b/tests/testsuite.at index 43efc09..9e16f94 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -68,6 +68,7 @@ m4_include([tests/ovsdb-macros.at]) m4_include([tests/ofproto-macros.at]) m4_include([tests/bfd.at]) +m4_include([tests/cfm.at]) m4_include([tests/lacp.at]) m4_include([tests/library.at]) m4_include([tests/heap.at]) diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index 4b42ec7..5fd5b3b 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -2142,8 +2142,9 @@ <ul> <li> To ensure that ovs-vswitchd has enough time to pull statistics - from the datapath, the minimum - <ref column="other_config" key="cfm_interval"/> is 500ms. + from the datapath, the fault detection interval is set to + 3.5 * MAX(<ref column="other_config" key="cfm_interval"/>, 500) + ms. </li> <li> -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev