X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2Fcfm.at;h=fdca4ace5fc41b243d69fc02980c60760210a7cc;hb=5767a79a40599e5e6e70662833b27ffdbdab7e37;hp=638e03ffb8c9727145acea7c4f4dca8258574299;hpb=03f209ba2737bf29391e64c4eb387648c9d71e86;p=sliver-openvswitch.git diff --git a/tests/cfm.at b/tests/cfm.at index 638e03ffb..fdca4ace5 100644 --- a/tests/cfm.at +++ b/tests/cfm.at @@ -14,9 +14,67 @@ Remote MPID $7 ]) ]) +m4_define([CFM_CHECK_EXTENDED_FAULT], [ +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 + fault: $3 + average health: $4 + opstate: $5 + remote_opstate: $6 + interval: $7 +]) +]) + +m4_define([CFM_VSCTL_LIST_IFACE], [ +AT_CHECK([ovs-vsctl list interface $1 | sed -n '/$2/p'],[0], +[dnl +$3 +]) +]) + +m4_define([CFM_CHECK_DB], [ +CFM_VSCTL_LIST_IFACE([$1], [cfm_fault_status], [cfm_fault_status : [[$2]]]) +CFM_VSCTL_LIST_IFACE([$1], [cfm_flap_count], [cfm_flap_count : $3]) +CFM_VSCTL_LIST_IFACE([$1], [cfm_health], [cfm_health : [[$4]]]) +CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_mpids], [cfm_remote_mpids : [[$5]]]) +CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_opstate], [cfm_remote_opstate : $6]) +]) + +# This test checks the update of cfm status to OVSDB at startup. +# The cfm status should be updated to OVSDB within 3.5 * cfm_interval. +AT_SETUP([cfm - check update ovsdb]) +#Create 2 bridges connected by patch ports and enable cfm +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 other_config:cfm_interval=300 other_config:cfm_extended=true -- \ + set Interface p1 other_config:cfm_interval=300 other_config:cfm_extended=true]) + +ovs-appctl time/stop + +AT_CHECK([ovs-vsctl set Interface p0 cfm_mpid=1]) +# check cfm status update in OVSDB. +for i in `seq 0 14`; do ovs-appctl time/warp 100; done +CFM_CHECK_DB([p0], [recv], [1], [], [], [up]) + +# turn cfm on p1 off, should increment the cfm_flap_count on p0. +AT_CHECK([ovs-vsctl set interface p1 cfm_mpid=2]) +for i in `seq 0 14`; do ovs-appctl time/warp 100; done +CFM_CHECK_DB([p0], [], [2], [], [2], [up]) +CFM_CHECK_DB([p1], [], [0], [], [1], [up]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + # test cfm under demand mode. AT_SETUP([cfm - demand mode]) -#Create 2 bridges connected by patch ports and enable BFD +#Create 2 bridges connected by patch ports and enable cfm OVS_VSWITCHD_START([add-br br1 -- \ set bridge br1 datapath-type=dummy \ other-config:hwaddr=aa:55:aa:56:00:00 -- \ @@ -55,3 +113,137 @@ done OVS_VSWITCHD_STOP AT_CLEANUP + +# test demand_rx_ccm under demand mode. +AT_SETUP([cfm - demand_rx_ccm]) +#Create 2 bridges connected by patch ports and enable cfm +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 ofport_request=2 -- \ + add-port br0 p0 -- set Interface p0 type=patch \ + options:peer=p1 ofport_request=1 -- \ + set Interface p0 cfm_mpid=1 other_config:cfm_interval=300 other_config:cfm_extended=true other_config:cfm_demand=true -- \ + set Interface p1 cfm_mpid=2 other_config:cfm_interval=300 other_config:cfm_extended=true other_config:cfm_demand=true]) + +ovs-appctl time/stop +# wait for a while to stablize cfm. (need a longer time, since in demand mode +# the fault interval is (MAX(ccm_interval_ms, 500) * 3.5) ms) +for i in `seq 0 200`; 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 off the cfm on p1. +AT_CHECK([ovs-vsctl clear Interface p1 cfm_mpid]) +# cfm should never go down while receiving data packets. +for i in `seq 0 200` +do + ovs-appctl time/warp 100 + AT_CHECK([ovs-ofctl packet-out br1 3 2 "90e2ba01475000101856b2e80806000108000604000100101856b2e80202020300000000000002020202"], + [0], [stdout], []) +done +CFM_CHECK_EXTENDED([p0], [1], [0], [up], [up], [300ms], [2], [up]) + +# wait longer, since the demand_rx_ccm interval is 100 * 300 ms. +# since there is no ccm received, the [recv] fault should be raised. +for i in `seq 0 200` +do + ovs-appctl time/warp 100 + AT_CHECK([ovs-ofctl packet-out br1 3 2 "90e2ba01475000101856b2e80806000108000604000100101856b2e80202020300000000000002020202"], + [0], [stdout], []) +done +CFM_CHECK_EXTENDED_FAULT([p0], [1], [recv], [0], [up], [up], [300ms]) + +# now turn on the cfm on p1 again, +AT_CHECK([ovs-vsctl set Interface p1 cfm_mpid=2]) +# cfm should be up for both p0 and p1 +for i in `seq 0 200`; 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]) + +# now turn off the cfm on p1 again +AT_CHECK([ovs-vsctl clear Interface p1 cfm_mpid]) +# since there is no ccm received, the [recv] fault should be raised. +for i in `seq 0 400` +do + ovs-appctl time/warp 100 + AT_CHECK([ovs-ofctl packet-out br1 3 2 "90e2ba01475000101856b2e80806000108000604000100101856b2e80202020300000000000002020202"], + [0], [stdout], []) +done +CFM_CHECK_EXTENDED_FAULT([p0], [1], [recv], [0], [up], [up], [300ms]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + +# test cfm_flap_count. +AT_SETUP([cfm - flap_count]) +#Create 2 bridges connected by patch ports and enable cfm +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=100 other_config:cfm_extended=true -- \ + set Interface p1 cfm_mpid=2 other_config:cfm_interval=100 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], [100ms], [2], [up]) +CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [100ms], [1], [up]) + +# turn cfm on p1 off, should increment the cfm_flap_count on p0. +AT_CHECK([ovs-vsctl remove interface p1 cfm_mpid 2]) +for i in `seq 0 10`; do ovs-appctl time/warp 100; done +CFM_VSCTL_LIST_IFACE([p0], [cfm_flap_count], [cfm_flap_count : 1]) +CFM_VSCTL_LIST_IFACE([p1], [cfm_flap_count], [cfm_flap_count : [[]]]) + +# turn cfm on p1 on again, should increment the cfm_flap_count on p0. +AT_CHECK([ovs-vsctl set interface p1 cfm_mpid=2]) +for i in `seq 0 10`; do ovs-appctl time/warp 100; done +CFM_VSCTL_LIST_IFACE([p0], [cfm_flap_count], [cfm_flap_count : 2]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([cfm - fault_override]) +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=100 other_config:cfm_extended=true -- \ + set Interface p1 cfm_mpid=2 other_config:cfm_interval=100 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], [100ms], [2], [up]) +CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [100ms], [1], [up]) +AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override'], [1], [ignore]) +CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status : [[]]]) + +# set a fault and see that this is shown in the CFM module and the database +AT_CHECK([ovs-appctl cfm/set-fault p1 true], [0], [OK +]) +AT_CHECK([ovs-appctl time/warp 100], [0], [ignore]) +AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override' | sed -e 's/MPID [[0-9]]*: extended //'], [0], [dnl +fault_override +]) +CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status : [[override]]]) + +# reset and see that it returned to normal +AT_CHECK([ovs-appctl cfm/set-fault normal], [0], [OK +]) +AT_CHECK([ovs-appctl time/warp 100], [0], [ignore]) +AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override'], [1], [ignore]) +CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status : [[]]]) + +OVS_VSWITCHD_STOP +AT_CLEANUP \ No newline at end of file