diff mbox series

[ovs-dev] system-offloads-traffic.at: Add sFlow offload test cases

Message ID 20210916083852.1863327-1-cmi@nvidia.com
State Superseded
Headers show
Series [ovs-dev] system-offloads-traffic.at: Add sFlow offload test cases | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed

Commit Message

Chris Mi Sept. 16, 2021, 8:38 a.m. UTC
Add two sFlow offload test caes:

  3: sflow offloads with sampling=1 - ping between two ports - offloads enabled ok
  4: sflow offloads with sampling=2 - ping between two ports - offloads enabled ok

Signed-off-by: Chris Mi <cmi@nvidia.com>
---
 tests/system-offloads-traffic.at | 84 ++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)

Comments

Simon Horman Sept. 24, 2021, 7:03 a.m. UTC | #1
On Thu, Sep 16, 2021 at 11:38:52AM +0300, Chris Mi wrote:
> Add two sFlow offload test caes:
> 
>   3: sflow offloads with sampling=1 - ping between two ports - offloads enabled ok
>   4: sflow offloads with sampling=2 - ping between two ports - offloads enabled ok
> 
> Signed-off-by: Chris Mi <cmi@nvidia.com>

Thanks Chris,

These tests look good to me. But could we arrange things such
that they are skipped if the system doesn't support this offload.

Likewise, I think we should make an effort to make all tests in this file
match that pattern. I do acknowledge that Corigine seem to have added some
tests to this file that don't comply with this request, that was an
oversight on my part, sorry.

> ---
>  tests/system-offloads-traffic.at | 84 ++++++++++++++++++++++++++++++++
>  1 file changed, 84 insertions(+)
> 
> diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at
> index be63057bb..f263c9183 100644
> --- a/tests/system-offloads-traffic.at
> +++ b/tests/system-offloads-traffic.at
> @@ -5,6 +5,7 @@ AT_BANNER([datapath offloads])
>  # Normilizes output ports, recirc_id, packets and macs.
>  #
>  m4_define([DUMP_CLEAN_SORTED], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:[[0-9,]]*/actions:output/;s/recirc_id(0),//' | sort])
> +m4_define([DUMP_CLEAN_SORTED_SFLOW], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:.*$/actions:output/;s/recirc_id(0),//' | sort])
>  
>  AT_SETUP([offloads - ping between two ports - offloads disabled])
>  OVS_TRAFFIC_VSWITCHD_START()
> @@ -71,6 +72,89 @@ AT_CHECK([ovs-appctl upcall/show | grep -E "offloaded flows : [[1-9]]"], [0], [i
>  OVS_TRAFFIC_VSWITCHD_STOP
>  AT_CLEANUP
>  
> +AT_SETUP([sflow offloads with sampling=1 - ping between two ports - offloads enabled])
> +OVS_TRAFFIC_VSWITCHD_START()
> +
> +on_exit 'kill `cat test-sflow.pid`'
> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
> +AT_CAPTURE_FILE([sflow.log])
> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
> +
> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
> +
> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
> +AT_CHECK([rm -f ovsdb-server.pid])
> +AT_CHECK([rm -f ovs-vswitchd.pid])
> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
> +on_exit "kill `cat ovsdb-server.pid`"
> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
> +
> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
> +
> +ADD_NAMESPACES(at_ns0, at_ns1)
> +
> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
> +
> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
> +])
> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=1 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
> +])
> +
> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:userspace" |grep "sFlow" | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED_SFLOW], [0], [dnl
> +in_port(2),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
> +in_port(3),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
> +])
> +
> +OVS_TRAFFIC_VSWITCHD_STOP
> +OVS_APP_EXIT_AND_WAIT([test-sflow])
> +count=`cat sflow.log | wc -l`
> +AT_CHECK([[[[ $count -le 22 && $count -ge 18 ]]]])
> +AT_CLEANUP
> +
> +AT_SETUP([sflow offloads with sampling=2 - ping between two ports - offloads enabled])
> +OVS_TRAFFIC_VSWITCHD_START()
> +
> +on_exit 'kill `cat test-sflow.pid`'
> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
> +AT_CAPTURE_FILE([sflow.log])
> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
> +
> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
> +
> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
> +AT_CHECK([rm -f ovsdb-server.pid])
> +AT_CHECK([rm -f ovs-vswitchd.pid])
> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
> +on_exit "kill `cat ovsdb-server.pid`"
> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
> +
> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
> +
> +ADD_NAMESPACES(at_ns0, at_ns1)
> +
> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
> +
> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=2 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
> +NS_CHECK_EXEC([at_ns0], [ping -c 1000 -i 0.01 -w 12 10.1.1.2], [0], [ignore])
> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:sample" | grep "sFlow" | grep "eth_type(0x0800)"], [0], [ignore])
> +
> +OVS_TRAFFIC_VSWITCHD_STOP
> +OVS_APP_EXIT_AND_WAIT([test-sflow])
> +count=`cat sflow.log | wc -l`
> +AT_CHECK([[[[ $count -le 1100 && $count -ge 900 ]]]])
> +AT_CLEANUP
> +
>  AT_SETUP([offloads - set ingress_policing_rate and ingress_policing_burst - offloads disabled])
>  AT_KEYWORDS([ingress_policing])
>  AT_SKIP_IF([test $HAVE_TC = "no"])
> -- 
> 2.27.0
>
Chris Mi Sept. 24, 2021, 7:43 a.m. UTC | #2
Hi Simon,

On 9/24/2021 3:03 PM, Simon Horman wrote:
> On Thu, Sep 16, 2021 at 11:38:52AM +0300, Chris Mi wrote:
>> Add two sFlow offload test caes:
>>
>>    3: sflow offloads with sampling=1 - ping between two ports - offloads enabled ok
>>    4: sflow offloads with sampling=2 - ping between two ports - offloads enabled ok
>>
>> Signed-off-by: Chris Mi <cmi@nvidia.com>
> Thanks Chris,
>
> These tests look good to me. But could we arrange things such
> that they are skipped if the system doesn't support this offload.
Thanks for your suggestion. I think it is reasonable. But I don't know 
how to check if sFlow offload
is supported or not. Maybe test should check ovs version or code. 
Anyway, I'll think about it.

Regards,
Chris
>
> Likewise, I think we should make an effort to make all tests in this file
> match that pattern. I do acknowledge that Corigine seem to have added some
> tests to this file that don't comply with this request, that was an
> oversight on my part, sorry.
>
>> ---
>>   tests/system-offloads-traffic.at | 84 ++++++++++++++++++++++++++++++++
>>   1 file changed, 84 insertions(+)
>>
>> diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at
>> index be63057bb..f263c9183 100644
>> --- a/tests/system-offloads-traffic.at
>> +++ b/tests/system-offloads-traffic.at
>> @@ -5,6 +5,7 @@ AT_BANNER([datapath offloads])
>>   # Normilizes output ports, recirc_id, packets and macs.
>>   #
>>   m4_define([DUMP_CLEAN_SORTED], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:[[0-9,]]*/actions:output/;s/recirc_id(0),//' | sort])
>> +m4_define([DUMP_CLEAN_SORTED_SFLOW], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:.*$/actions:output/;s/recirc_id(0),//' | sort])
>>   
>>   AT_SETUP([offloads - ping between two ports - offloads disabled])
>>   OVS_TRAFFIC_VSWITCHD_START()
>> @@ -71,6 +72,89 @@ AT_CHECK([ovs-appctl upcall/show | grep -E "offloaded flows : [[1-9]]"], [0], [i
>>   OVS_TRAFFIC_VSWITCHD_STOP
>>   AT_CLEANUP
>>   
>> +AT_SETUP([sflow offloads with sampling=1 - ping between two ports - offloads enabled])
>> +OVS_TRAFFIC_VSWITCHD_START()
>> +
>> +on_exit 'kill `cat test-sflow.pid`'
>> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
>> +AT_CAPTURE_FILE([sflow.log])
>> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>> +
>> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
>> +
>> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
>> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
>> +AT_CHECK([rm -f ovsdb-server.pid])
>> +AT_CHECK([rm -f ovs-vswitchd.pid])
>> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
>> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
>> +on_exit "kill `cat ovsdb-server.pid`"
>> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>> +
>> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
>> +
>> +ADD_NAMESPACES(at_ns0, at_ns1)
>> +
>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
>> +
>> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
>> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
>> +])
>> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=1 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
>> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
>> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
>> +])
>> +
>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:userspace" |grep "sFlow" | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED_SFLOW], [0], [dnl
>> +in_port(2),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
>> +in_port(3),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
>> +])
>> +
>> +OVS_TRAFFIC_VSWITCHD_STOP
>> +OVS_APP_EXIT_AND_WAIT([test-sflow])
>> +count=`cat sflow.log | wc -l`
>> +AT_CHECK([[[[ $count -le 22 && $count -ge 18 ]]]])
>> +AT_CLEANUP
>> +
>> +AT_SETUP([sflow offloads with sampling=2 - ping between two ports - offloads enabled])
>> +OVS_TRAFFIC_VSWITCHD_START()
>> +
>> +on_exit 'kill `cat test-sflow.pid`'
>> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
>> +AT_CAPTURE_FILE([sflow.log])
>> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>> +
>> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
>> +
>> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
>> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
>> +AT_CHECK([rm -f ovsdb-server.pid])
>> +AT_CHECK([rm -f ovs-vswitchd.pid])
>> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
>> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
>> +on_exit "kill `cat ovsdb-server.pid`"
>> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>> +
>> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
>> +
>> +ADD_NAMESPACES(at_ns0, at_ns1)
>> +
>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
>> +
>> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=2 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
>> +NS_CHECK_EXEC([at_ns0], [ping -c 1000 -i 0.01 -w 12 10.1.1.2], [0], [ignore])
>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:sample" | grep "sFlow" | grep "eth_type(0x0800)"], [0], [ignore])
>> +
>> +OVS_TRAFFIC_VSWITCHD_STOP
>> +OVS_APP_EXIT_AND_WAIT([test-sflow])
>> +count=`cat sflow.log | wc -l`
>> +AT_CHECK([[[[ $count -le 1100 && $count -ge 900 ]]]])
>> +AT_CLEANUP
>> +
>>   AT_SETUP([offloads - set ingress_policing_rate and ingress_policing_burst - offloads disabled])
>>   AT_KEYWORDS([ingress_policing])
>>   AT_SKIP_IF([test $HAVE_TC = "no"])
>> -- 
>> 2.27.0
>>
Chris Mi Sept. 28, 2021, 6:41 a.m. UTC | #3
Hi Simon,

On 9/24/2021 3:03 PM, Simon Horman wrote:
> On Thu, Sep 16, 2021 at 11:38:52AM +0300, Chris Mi wrote:
>> Add two sFlow offload test caes:
>>
>>    3: sflow offloads with sampling=1 - ping between two ports - offloads enabled ok
>>    4: sflow offloads with sampling=2 - ping between two ports - offloads enabled ok
>>
>> Signed-off-by: Chris Mi<cmi@nvidia.com>
> Thanks Chris,
>
> These tests look good to me. But could we arrange things such
> that they are skipped if the system doesn't support this offload.
Above 2 new tests don't have special requirement. They take test case #2 
as example and extend it.
You know the sample offload series is being reviewed in another email 
thread. Maybe I should add this
patch to the end of that series. There are two reasons I didn't add it:
  1. I don't want to increase the version number too big.
  2. It is easier to review and revise this patch alone.

So how about I add this patch to the sample offload series in next 
version? Then we don't need to check
if the system support it or not. Because if it fails in the future, we 
must fix it.

Thanks,
Chris
> Likewise, I think we should make an effort to make all tests in this file
> match that pattern. I do acknowledge that Corigine seem to have added some
> tests to this file that don't comply with this request, that was an
> oversight on my part, sorry.
>
>> ---
>>   tests/system-offloads-traffic.at | 84 ++++++++++++++++++++++++++++++++
>>   1 file changed, 84 insertions(+)
>>
>> diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at
>> index be63057bb..f263c9183 100644
>> --- a/tests/system-offloads-traffic.at
>> +++ b/tests/system-offloads-traffic.at
>> @@ -5,6 +5,7 @@ AT_BANNER([datapath offloads])
>>   # Normilizes output ports, recirc_id, packets and macs.
>>   #
>>   m4_define([DUMP_CLEAN_SORTED], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:[[0-9,]]*/actions:output/;s/recirc_id(0),//' | sort])
>> +m4_define([DUMP_CLEAN_SORTED_SFLOW], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:.*$/actions:output/;s/recirc_id(0),//' | sort])
>>   
>>   AT_SETUP([offloads - ping between two ports - offloads disabled])
>>   OVS_TRAFFIC_VSWITCHD_START()
>> @@ -71,6 +72,89 @@ AT_CHECK([ovs-appctl upcall/show | grep -E "offloaded flows : [[1-9]]"], [0], [i
>>   OVS_TRAFFIC_VSWITCHD_STOP
>>   AT_CLEANUP
>>   
>> +AT_SETUP([sflow offloads with sampling=1 - ping between two ports - offloads enabled])
>> +OVS_TRAFFIC_VSWITCHD_START()
>> +
>> +on_exit 'kill `cat test-sflow.pid`'
>> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
>> +AT_CAPTURE_FILE([sflow.log])
>> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>> +
>> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
>> +
>> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
>> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
>> +AT_CHECK([rm -f ovsdb-server.pid])
>> +AT_CHECK([rm -f ovs-vswitchd.pid])
>> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
>> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
>> +on_exit "kill `cat ovsdb-server.pid`"
>> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>> +
>> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
>> +
>> +ADD_NAMESPACES(at_ns0, at_ns1)
>> +
>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
>> +
>> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
>> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
>> +])
>> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=1 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
>> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
>> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
>> +])
>> +
>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:userspace" |grep "sFlow" | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED_SFLOW], [0], [dnl
>> +in_port(2),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
>> +in_port(3),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
>> +])
>> +
>> +OVS_TRAFFIC_VSWITCHD_STOP
>> +OVS_APP_EXIT_AND_WAIT([test-sflow])
>> +count=`cat sflow.log | wc -l`
>> +AT_CHECK([[[[ $count -le 22 && $count -ge 18 ]]]])
>> +AT_CLEANUP
>> +
>> +AT_SETUP([sflow offloads with sampling=2 - ping between two ports - offloads enabled])
>> +OVS_TRAFFIC_VSWITCHD_START()
>> +
>> +on_exit 'kill `cat test-sflow.pid`'
>> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
>> +AT_CAPTURE_FILE([sflow.log])
>> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>> +
>> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
>> +
>> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
>> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
>> +AT_CHECK([rm -f ovsdb-server.pid])
>> +AT_CHECK([rm -f ovs-vswitchd.pid])
>> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
>> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
>> +on_exit "kill `cat ovsdb-server.pid`"
>> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>> +
>> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
>> +
>> +ADD_NAMESPACES(at_ns0, at_ns1)
>> +
>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
>> +
>> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=2 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
>> +NS_CHECK_EXEC([at_ns0], [ping -c 1000 -i 0.01 -w 12 10.1.1.2], [0], [ignore])
>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:sample" | grep "sFlow" | grep "eth_type(0x0800)"], [0], [ignore])
>> +
>> +OVS_TRAFFIC_VSWITCHD_STOP
>> +OVS_APP_EXIT_AND_WAIT([test-sflow])
>> +count=`cat sflow.log | wc -l`
>> +AT_CHECK([[[[ $count -le 1100 && $count -ge 900 ]]]])
>> +AT_CLEANUP
>> +
>>   AT_SETUP([offloads - set ingress_policing_rate and ingress_policing_burst - offloads disabled])
>>   AT_KEYWORDS([ingress_policing])
>>   AT_SKIP_IF([test $HAVE_TC = "no"])
>> -- 
>> 2.27.0
>>
Simon Horman Sept. 29, 2021, 11:41 a.m. UTC | #4
On Tue, Sep 28, 2021 at 02:41:17PM +0800, Chris Mi wrote:
> Hi Simon,
> 
> On 9/24/2021 3:03 PM, Simon Horman wrote:
> > On Thu, Sep 16, 2021 at 11:38:52AM +0300, Chris Mi wrote:
> > > Add two sFlow offload test caes:
> > > 
> > >    3: sflow offloads with sampling=1 - ping between two ports - offloads enabled ok
> > >    4: sflow offloads with sampling=2 - ping between two ports - offloads enabled ok
> > > 
> > > Signed-off-by: Chris Mi<cmi@nvidia.com>
> > Thanks Chris,
> > 
> > These tests look good to me. But could we arrange things such
> > that they are skipped if the system doesn't support this offload.
> Above 2 new tests don't have special requirement. They take test case #2 as
> example and extend it.
> You know the sample offload series is being reviewed in another email
> thread. Maybe I should add this
> patch to the end of that series. There are two reasons I didn't add it:
>  1. I don't want to increase the version number too big.
>  2. It is easier to review and revise this patch alone.
> 
> So how about I add this patch to the sample offload series in next version?
> Then we don't need to check
> if the system support it or not. Because if it fails in the future, we must
> fix it.

Thanks, I think that is reasonable.
Eelco Chaudron Oct. 1, 2021, 2:34 p.m. UTC | #5
Thanks for working on the test cases. I have two small requests below to make the tests also verify the datapath actions.

And as you already discussed with Simon this should be part of the generic TC sFlow patchset.

//Eelco

On 16 Sep 2021, at 10:38, Chris Mi wrote:

> Add two sFlow offload test caes:
>
>   3: sflow offloads with sampling=1 - ping between two ports - offloads enabled ok
>   4: sflow offloads with sampling=2 - ping between two ports - offloads enabled ok
>
> Signed-off-by: Chris Mi <cmi@nvidia.com>
> ---
>  tests/system-offloads-traffic.at | 84 ++++++++++++++++++++++++++++++++
>  1 file changed, 84 insertions(+)
>
> diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at
> index be63057bb..f263c9183 100644
> --- a/tests/system-offloads-traffic.at
> +++ b/tests/system-offloads-traffic.at
> @@ -5,6 +5,7 @@ AT_BANNER([datapath offloads])
>  # Normilizes output ports, recirc_id, packets and macs.
>  #
>  m4_define([DUMP_CLEAN_SORTED], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:[[0-9,]]*/actions:output/;s/recirc_id(0),//' | sort])
> +m4_define([DUMP_CLEAN_SORTED_SFLOW], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:.*$/actions:output/;s/recirc_id(0),//' | sort])
>
>  AT_SETUP([offloads - ping between two ports - offloads disabled])
>  OVS_TRAFFIC_VSWITCHD_START()
> @@ -71,6 +72,89 @@ AT_CHECK([ovs-appctl upcall/show | grep -E "offloaded flows : [[1-9]]"], [0], [i
>  OVS_TRAFFIC_VSWITCHD_STOP
>  AT_CLEANUP
>
> +AT_SETUP([sflow offloads with sampling=1 - ping between two ports - offloads enabled])
> +OVS_TRAFFIC_VSWITCHD_START()
> +
> +on_exit 'kill `cat test-sflow.pid`'
> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
> +AT_CAPTURE_FILE([sflow.log])
> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
> +
> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
> +
> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
> +AT_CHECK([rm -f ovsdb-server.pid])
> +AT_CHECK([rm -f ovs-vswitchd.pid])
> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
> +on_exit "kill `cat ovsdb-server.pid`"
> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
> +
> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
> +
> +ADD_NAMESPACES(at_ns0, at_ns1)
> +
> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
> +
> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
> +])
> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=1 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
> +])
> +
> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:userspace" |grep "sFlow" | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED_SFLOW], [0], [dnl
> +in_port(2),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
> +in_port(3),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
> +])

I think your filter to much in this case, as we would like to verify the correct datapath format for actions, so I think it should be something like:

actions:userspace(pid=XXX,sFlow(vid=0,pcp=0,output=341),actions),3

Where you can ignore/replace the actual pid value, but you need to find a way to map the correct if_index.

> +
> +OVS_TRAFFIC_VSWITCHD_STOP
> +OVS_APP_EXIT_AND_WAIT([test-sflow])
> +count=`cat sflow.log | wc -l`
> +AT_CHECK([[[[ $count -le 22 && $count -ge 18 ]]]])
> +AT_CLEANUP
> +
> +AT_SETUP([sflow offloads with sampling=2 - ping between two ports - offloads enabled])
> +OVS_TRAFFIC_VSWITCHD_START()
> +
> +on_exit 'kill `cat test-sflow.pid`'
> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
> +AT_CAPTURE_FILE([sflow.log])
> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
> +
> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
> +
> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
> +AT_CHECK([rm -f ovsdb-server.pid])
> +AT_CHECK([rm -f ovs-vswitchd.pid])
> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
> +on_exit "kill `cat ovsdb-server.pid`"
> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
> +
> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
> +
> +ADD_NAMESPACES(at_ns0, at_ns1)
> +
> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
> +
> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=2 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
> +NS_CHECK_EXEC([at_ns0], [ping -c 1000 -i 0.01 -w 12 10.1.1.2], [0], [ignore])
> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:sample" | grep "sFlow" | grep "eth_type(0x0800)"], [0], [ignore])

Why is this ignore? It should match flow/action,see also above:

  sample(sample=50.0%,actions(userspace(pid=XXX,sFlow(vid=0,pcp=0,output=361),actions))),2

> +
> +OVS_TRAFFIC_VSWITCHD_STOP
> +OVS_APP_EXIT_AND_WAIT([test-sflow])
> +count=`cat sflow.log | wc -l`
> +AT_CHECK([[[[ $count -le 1100 && $count -ge 900 ]]]])
> +AT_CLEANUP
> +
>  AT_SETUP([offloads - set ingress_policing_rate and ingress_policing_burst - offloads disabled])
>  AT_KEYWORDS([ingress_policing])
>  AT_SKIP_IF([test $HAVE_TC = "no"])
> -- 
> 2.27.0
Chris Mi Oct. 8, 2021, 6:23 a.m. UTC | #6
Hi Eelco,

Sorry for the late reply due to the long National Day holiday in China.

On 10/1/2021 10:34 PM, Eelco Chaudron wrote:
> Thanks for working on the test cases. I have two small requests below to make the tests also verify the datapath actions.
>
> And as you already discussed with Simon this should be part of the generic TC sFlow patchset.
>
> //Eelco
>
> On 16 Sep 2021, at 10:38, Chris Mi wrote:
>
>> Add two sFlow offload test caes:
>>
>>    3: sflow offloads with sampling=1 - ping between two ports - offloads enabled ok
>>    4: sflow offloads with sampling=2 - ping between two ports - offloads enabled ok
>>
>> Signed-off-by: Chris Mi <cmi@nvidia.com>
>> ---
>>   tests/system-offloads-traffic.at | 84 ++++++++++++++++++++++++++++++++
>>   1 file changed, 84 insertions(+)
>>
>> diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at
>> index be63057bb..f263c9183 100644
>> --- a/tests/system-offloads-traffic.at
>> +++ b/tests/system-offloads-traffic.at
>> @@ -5,6 +5,7 @@ AT_BANNER([datapath offloads])
>>   # Normilizes output ports, recirc_id, packets and macs.
>>   #
>>   m4_define([DUMP_CLEAN_SORTED], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:[[0-9,]]*/actions:output/;s/recirc_id(0),//' | sort])
>> +m4_define([DUMP_CLEAN_SORTED_SFLOW], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:.*$/actions:output/;s/recirc_id(0),//' | sort])
>>
>>   AT_SETUP([offloads - ping between two ports - offloads disabled])
>>   OVS_TRAFFIC_VSWITCHD_START()
>> @@ -71,6 +72,89 @@ AT_CHECK([ovs-appctl upcall/show | grep -E "offloaded flows : [[1-9]]"], [0], [i
>>   OVS_TRAFFIC_VSWITCHD_STOP
>>   AT_CLEANUP
>>
>> +AT_SETUP([sflow offloads with sampling=1 - ping between two ports - offloads enabled])
>> +OVS_TRAFFIC_VSWITCHD_START()
>> +
>> +on_exit 'kill `cat test-sflow.pid`'
>> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
>> +AT_CAPTURE_FILE([sflow.log])
>> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>> +
>> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
>> +
>> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
>> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
>> +AT_CHECK([rm -f ovsdb-server.pid])
>> +AT_CHECK([rm -f ovs-vswitchd.pid])
>> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
>> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
>> +on_exit "kill `cat ovsdb-server.pid`"
>> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>> +
>> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
>> +
>> +ADD_NAMESPACES(at_ns0, at_ns1)
>> +
>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
>> +
>> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
>> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
>> +])
>> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=1 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
>> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
>> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
>> +])
>> +
>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:userspace" |grep "sFlow" | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED_SFLOW], [0], [dnl
>> +in_port(2),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
>> +in_port(3),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
>> +])
> I think your filter to much in this case, as we would like to verify the correct datapath format for actions, so I think it should be something like:
>
> actions:userspace(pid=XXX,sFlow(vid=0,pcp=0,output=341),actions),3
>
> Where you can ignore/replace the actual pid value, but you need to find a way to map the correct if_index.
Done.
>
>> +
>> +OVS_TRAFFIC_VSWITCHD_STOP
>> +OVS_APP_EXIT_AND_WAIT([test-sflow])
>> +count=`cat sflow.log | wc -l`
>> +AT_CHECK([[[[ $count -le 22 && $count -ge 18 ]]]])
>> +AT_CLEANUP
>> +
>> +AT_SETUP([sflow offloads with sampling=2 - ping between two ports - offloads enabled])
>> +OVS_TRAFFIC_VSWITCHD_START()
>> +
>> +on_exit 'kill `cat test-sflow.pid`'
>> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
>> +AT_CAPTURE_FILE([sflow.log])
>> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>> +
>> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
>> +
>> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
>> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
>> +AT_CHECK([rm -f ovsdb-server.pid])
>> +AT_CHECK([rm -f ovs-vswitchd.pid])
>> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
>> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
>> +on_exit "kill `cat ovsdb-server.pid`"
>> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>> +
>> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
>> +
>> +ADD_NAMESPACES(at_ns0, at_ns1)
>> +
>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
>> +
>> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=2 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
>> +NS_CHECK_EXEC([at_ns0], [ping -c 1000 -i 0.01 -w 12 10.1.1.2], [0], [ignore])
>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:sample" | grep "sFlow" | grep "eth_type(0x0800)"], [0], [ignore])
> Why is this ignore? It should match flow/action,see also above:
>
>    sample(sample=50.0%,actions(userspace(pid=XXX,sFlow(vid=0,pcp=0,output=361),actions))),2
Because I think we have enough grep, so I ignored it. Anyway, it's done now.
I will address your other comments in generic TC sFlow patchset and put 
this patch at the end of it.

Thanks,
Chris
>
>> +
>> +OVS_TRAFFIC_VSWITCHD_STOP
>> +OVS_APP_EXIT_AND_WAIT([test-sflow])
>> +count=`cat sflow.log | wc -l`
>> +AT_CHECK([[[[ $count -le 1100 && $count -ge 900 ]]]])
>> +AT_CLEANUP
>> +
>>   AT_SETUP([offloads - set ingress_policing_rate and ingress_policing_burst - offloads disabled])
>>   AT_KEYWORDS([ingress_policing])
>>   AT_SKIP_IF([test $HAVE_TC = "no"])
>> -- 
>> 2.27.0
Eelco Chaudron Oct. 8, 2021, 6:47 a.m. UTC | #7
Hi Chris,

 I hope you enjoyed the holiday. And don't worry about the delay, as I try to only spend time reviewing stuff on Fridays.

Thanks for fixing the comments, and I will re-review once it's integrated into the sflow patchset.

//Eelco

On 8 Oct 2021, at 8:23, Chris Mi wrote:

> Hi Eelco,
>
> Sorry for the late reply due to the long National Day holiday in China.
>
> On 10/1/2021 10:34 PM, Eelco Chaudron wrote:
>> Thanks for working on the test cases. I have two small requests below to make the tests also verify the datapath actions.
>>
>> And as you already discussed with Simon this should be part of the generic TC sFlow patchset.
>>
>> //Eelco
>>
>> On 16 Sep 2021, at 10:38, Chris Mi wrote:
>>
>>> Add two sFlow offload test caes:
>>>
>>>    3: sflow offloads with sampling=1 - ping between two ports - offloads enabled ok
>>>    4: sflow offloads with sampling=2 - ping between two ports - offloads enabled ok
>>>
>>> Signed-off-by: Chris Mi <cmi@nvidia.com>
>>> ---
>>>   tests/system-offloads-traffic.at | 84 ++++++++++++++++++++++++++++++++
>>>   1 file changed, 84 insertions(+)
>>>
>>> diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at
>>> index be63057bb..f263c9183 100644
>>> --- a/tests/system-offloads-traffic.at
>>> +++ b/tests/system-offloads-traffic.at
>>> @@ -5,6 +5,7 @@ AT_BANNER([datapath offloads])
>>>   # Normilizes output ports, recirc_id, packets and macs.
>>>   #
>>>   m4_define([DUMP_CLEAN_SORTED], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:[[0-9,]]*/actions:output/;s/recirc_id(0),//' | sort])
>>> +m4_define([DUMP_CLEAN_SORTED_SFLOW], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:.*$/actions:output/;s/recirc_id(0),//' | sort])
>>>
>>>   AT_SETUP([offloads - ping between two ports - offloads disabled])
>>>   OVS_TRAFFIC_VSWITCHD_START()
>>> @@ -71,6 +72,89 @@ AT_CHECK([ovs-appctl upcall/show | grep -E "offloaded flows : [[1-9]]"], [0], [i
>>>   OVS_TRAFFIC_VSWITCHD_STOP
>>>   AT_CLEANUP
>>>
>>> +AT_SETUP([sflow offloads with sampling=1 - ping between two ports - offloads enabled])
>>> +OVS_TRAFFIC_VSWITCHD_START()
>>> +
>>> +on_exit 'kill `cat test-sflow.pid`'
>>> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
>>> +AT_CAPTURE_FILE([sflow.log])
>>> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>>> +
>>> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
>>> +
>>> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
>>> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
>>> +AT_CHECK([rm -f ovsdb-server.pid])
>>> +AT_CHECK([rm -f ovs-vswitchd.pid])
>>> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
>>> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
>>> +on_exit "kill `cat ovsdb-server.pid`"
>>> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>>> +
>>> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
>>> +
>>> +ADD_NAMESPACES(at_ns0, at_ns1)
>>> +
>>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>>> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
>>> +
>>> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
>>> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
>>> +])
>>> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=1 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
>>> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
>>> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
>>> +])
>>> +
>>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:userspace" |grep "sFlow" | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED_SFLOW], [0], [dnl
>>> +in_port(2),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
>>> +in_port(3),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
>>> +])
>> I think your filter to much in this case, as we would like to verify the correct datapath format for actions, so I think it should be something like:
>>
>> actions:userspace(pid=XXX,sFlow(vid=0,pcp=0,output=341),actions),3
>>
>> Where you can ignore/replace the actual pid value, but you need to find a way to map the correct if_index.
> Done.
>>
>>> +
>>> +OVS_TRAFFIC_VSWITCHD_STOP
>>> +OVS_APP_EXIT_AND_WAIT([test-sflow])
>>> +count=`cat sflow.log | wc -l`
>>> +AT_CHECK([[[[ $count -le 22 && $count -ge 18 ]]]])
>>> +AT_CLEANUP
>>> +
>>> +AT_SETUP([sflow offloads with sampling=2 - ping between two ports - offloads enabled])
>>> +OVS_TRAFFIC_VSWITCHD_START()
>>> +
>>> +on_exit 'kill `cat test-sflow.pid`'
>>> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
>>> +AT_CAPTURE_FILE([sflow.log])
>>> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>>> +
>>> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
>>> +
>>> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
>>> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
>>> +AT_CHECK([rm -f ovsdb-server.pid])
>>> +AT_CHECK([rm -f ovs-vswitchd.pid])
>>> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
>>> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
>>> +on_exit "kill `cat ovsdb-server.pid`"
>>> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>>> +
>>> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
>>> +
>>> +ADD_NAMESPACES(at_ns0, at_ns1)
>>> +
>>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>>> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
>>> +
>>> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=2 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
>>> +NS_CHECK_EXEC([at_ns0], [ping -c 1000 -i 0.01 -w 12 10.1.1.2], [0], [ignore])
>>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:sample" | grep "sFlow" | grep "eth_type(0x0800)"], [0], [ignore])
>> Why is this ignore? It should match flow/action,see also above:
>>
>>    sample(sample=50.0%,actions(userspace(pid=XXX,sFlow(vid=0,pcp=0,output=361),actions))),2
> Because I think we have enough grep, so I ignored it. Anyway, it's done now.
> I will address your other comments in generic TC sFlow patchset and put this patch at the end of it.
>
> Thanks,
> Chris
>>
>>> +
>>> +OVS_TRAFFIC_VSWITCHD_STOP
>>> +OVS_APP_EXIT_AND_WAIT([test-sflow])
>>> +count=`cat sflow.log | wc -l`
>>> +AT_CHECK([[[[ $count -le 1100 && $count -ge 900 ]]]])
>>> +AT_CLEANUP
>>> +
>>>   AT_SETUP([offloads - set ingress_policing_rate and ingress_policing_burst - offloads disabled])
>>>   AT_KEYWORDS([ingress_policing])
>>>   AT_SKIP_IF([test $HAVE_TC = "no"])
>>> -- 
>>> 2.27.0
Chris Mi Oct. 8, 2021, 6:55 a.m. UTC | #8
On 10/8/2021 2:47 PM, Eelco Chaudron wrote:
> Hi Chris,
>
>   I hope you enjoyed the holiday. And don't worry about the delay, as I try to only spend time reviewing stuff on Fridays.
>
> Thanks for fixing the comments, and I will re-review once it's integrated into the sflow patchset.
Sure.

Thanks,
Chris
>
> //Eelco
>
> On 8 Oct 2021, at 8:23, Chris Mi wrote:
>
>> Hi Eelco,
>>
>> Sorry for the late reply due to the long National Day holiday in China.
>>
>> On 10/1/2021 10:34 PM, Eelco Chaudron wrote:
>>> Thanks for working on the test cases. I have two small requests below to make the tests also verify the datapath actions.
>>>
>>> And as you already discussed with Simon this should be part of the generic TC sFlow patchset.
>>>
>>> //Eelco
>>>
>>> On 16 Sep 2021, at 10:38, Chris Mi wrote:
>>>
>>>> Add two sFlow offload test caes:
>>>>
>>>>     3: sflow offloads with sampling=1 - ping between two ports - offloads enabled ok
>>>>     4: sflow offloads with sampling=2 - ping between two ports - offloads enabled ok
>>>>
>>>> Signed-off-by: Chris Mi <cmi@nvidia.com>
>>>> ---
>>>>    tests/system-offloads-traffic.at | 84 ++++++++++++++++++++++++++++++++
>>>>    1 file changed, 84 insertions(+)
>>>>
>>>> diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at
>>>> index be63057bb..f263c9183 100644
>>>> --- a/tests/system-offloads-traffic.at
>>>> +++ b/tests/system-offloads-traffic.at
>>>> @@ -5,6 +5,7 @@ AT_BANNER([datapath offloads])
>>>>    # Normilizes output ports, recirc_id, packets and macs.
>>>>    #
>>>>    m4_define([DUMP_CLEAN_SORTED], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:[[0-9,]]*/actions:output/;s/recirc_id(0),//' | sort])
>>>> +m4_define([DUMP_CLEAN_SORTED_SFLOW], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:.*$/actions:output/;s/recirc_id(0),//' | sort])
>>>>
>>>>    AT_SETUP([offloads - ping between two ports - offloads disabled])
>>>>    OVS_TRAFFIC_VSWITCHD_START()
>>>> @@ -71,6 +72,89 @@ AT_CHECK([ovs-appctl upcall/show | grep -E "offloaded flows : [[1-9]]"], [0], [i
>>>>    OVS_TRAFFIC_VSWITCHD_STOP
>>>>    AT_CLEANUP
>>>>
>>>> +AT_SETUP([sflow offloads with sampling=1 - ping between two ports - offloads enabled])
>>>> +OVS_TRAFFIC_VSWITCHD_START()
>>>> +
>>>> +on_exit 'kill `cat test-sflow.pid`'
>>>> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
>>>> +AT_CAPTURE_FILE([sflow.log])
>>>> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>>>> +
>>>> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
>>>> +
>>>> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
>>>> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
>>>> +AT_CHECK([rm -f ovsdb-server.pid])
>>>> +AT_CHECK([rm -f ovs-vswitchd.pid])
>>>> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
>>>> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
>>>> +on_exit "kill `cat ovsdb-server.pid`"
>>>> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>>>> +
>>>> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
>>>> +
>>>> +ADD_NAMESPACES(at_ns0, at_ns1)
>>>> +
>>>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>>>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>>>> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
>>>> +
>>>> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
>>>> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
>>>> +])
>>>> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=1 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
>>>> +NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
>>>> +10 packets transmitted, 10 received, 0% packet loss, time 0ms
>>>> +])
>>>> +
>>>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:userspace" |grep "sFlow" | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED_SFLOW], [0], [dnl
>>>> +in_port(2),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
>>>> +in_port(3),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
>>>> +])
>>> I think your filter to much in this case, as we would like to verify the correct datapath format for actions, so I think it should be something like:
>>>
>>> actions:userspace(pid=XXX,sFlow(vid=0,pcp=0,output=341),actions),3
>>>
>>> Where you can ignore/replace the actual pid value, but you need to find a way to map the correct if_index.
>> Done.
>>>> +
>>>> +OVS_TRAFFIC_VSWITCHD_STOP
>>>> +OVS_APP_EXIT_AND_WAIT([test-sflow])
>>>> +count=`cat sflow.log | wc -l`
>>>> +AT_CHECK([[[[ $count -le 22 && $count -ge 18 ]]]])
>>>> +AT_CLEANUP
>>>> +
>>>> +AT_SETUP([sflow offloads with sampling=2 - ping between two ports - offloads enabled])
>>>> +OVS_TRAFFIC_VSWITCHD_START()
>>>> +
>>>> +on_exit 'kill `cat test-sflow.pid`'
>>>> +AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
>>>> +AT_CAPTURE_FILE([sflow.log])
>>>> +PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
>>>> +
>>>> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
>>>> +
>>>> +AT_CHECK([ovs-appctl -t ovsdb-server exit])
>>>> +AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
>>>> +AT_CHECK([rm -f ovsdb-server.pid])
>>>> +AT_CHECK([rm -f ovs-vswitchd.pid])
>>>> +AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
>>>> +AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
>>>> +on_exit "kill `cat ovsdb-server.pid`"
>>>> +on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
>>>> +
>>>> +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
>>>> +
>>>> +ADD_NAMESPACES(at_ns0, at_ns1)
>>>> +
>>>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>>>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>>>> +AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
>>>> +
>>>> +AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=2 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
>>>> +NS_CHECK_EXEC([at_ns0], [ping -c 1000 -i 0.01 -w 12 10.1.1.2], [0], [ignore])
>>>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:sample" | grep "sFlow" | grep "eth_type(0x0800)"], [0], [ignore])
>>> Why is this ignore? It should match flow/action,see also above:
>>>
>>>     sample(sample=50.0%,actions(userspace(pid=XXX,sFlow(vid=0,pcp=0,output=361),actions))),2
>> Because I think we have enough grep, so I ignored it. Anyway, it's done now.
>> I will address your other comments in generic TC sFlow patchset and put this patch at the end of it.
>>
>> Thanks,
>> Chris
>>>> +
>>>> +OVS_TRAFFIC_VSWITCHD_STOP
>>>> +OVS_APP_EXIT_AND_WAIT([test-sflow])
>>>> +count=`cat sflow.log | wc -l`
>>>> +AT_CHECK([[[[ $count -le 1100 && $count -ge 900 ]]]])
>>>> +AT_CLEANUP
>>>> +
>>>>    AT_SETUP([offloads - set ingress_policing_rate and ingress_policing_burst - offloads disabled])
>>>>    AT_KEYWORDS([ingress_policing])
>>>>    AT_SKIP_IF([test $HAVE_TC = "no"])
>>>> -- 
>>>> 2.27.0
diff mbox series

Patch

diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at
index be63057bb..f263c9183 100644
--- a/tests/system-offloads-traffic.at
+++ b/tests/system-offloads-traffic.at
@@ -5,6 +5,7 @@  AT_BANNER([datapath offloads])
 # Normilizes output ports, recirc_id, packets and macs.
 #
 m4_define([DUMP_CLEAN_SORTED], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:[[0-9,]]*/actions:output/;s/recirc_id(0),//' | sort])
+m4_define([DUMP_CLEAN_SORTED_SFLOW], [sed -e 's/used:[[0-9]].[[0-9]]*s/used:0.001s/;s/eth(src=[[a-z0-9:]]*,dst=[[a-z0-9:]]*)/eth(macs)/;s/actions:.*$/actions:output/;s/recirc_id(0),//' | sort])
 
 AT_SETUP([offloads - ping between two ports - offloads disabled])
 OVS_TRAFFIC_VSWITCHD_START()
@@ -71,6 +72,89 @@  AT_CHECK([ovs-appctl upcall/show | grep -E "offloaded flows : [[1-9]]"], [0], [i
 OVS_TRAFFIC_VSWITCHD_STOP
 AT_CLEANUP
 
+AT_SETUP([sflow offloads with sampling=1 - ping between two ports - offloads enabled])
+OVS_TRAFFIC_VSWITCHD_START()
+
+on_exit 'kill `cat test-sflow.pid`'
+AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
+AT_CAPTURE_FILE([sflow.log])
+PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
+
+AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
+
+AT_CHECK([ovs-appctl -t ovsdb-server exit])
+AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
+AT_CHECK([rm -f ovsdb-server.pid])
+AT_CHECK([rm -f ovs-vswitchd.pid])
+AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
+AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
+on_exit "kill `cat ovsdb-server.pid`"
+on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
+
+AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
+
+ADD_NAMESPACES(at_ns0, at_ns1)
+
+ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
+ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
+AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
+
+NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
+10 packets transmitted, 10 received, 0% packet loss, time 0ms
+])
+AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=1 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
+NS_CHECK_EXEC([at_ns0], [ping -c 10 -w 12 10.1.1.2 | FORMAT_PING], [0], [dnl
+10 packets transmitted, 10 received, 0% packet loss, time 0ms
+])
+
+AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:userspace" |grep "sFlow" | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED_SFLOW], [0], [dnl
+in_port(2),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
+in_port(3),eth(macs),eth_type(0x0800),ipv4(frag=no), packets:10, bytes:840, used:0.001s, actions:output
+])
+
+OVS_TRAFFIC_VSWITCHD_STOP
+OVS_APP_EXIT_AND_WAIT([test-sflow])
+count=`cat sflow.log | wc -l`
+AT_CHECK([[[[ $count -le 22 && $count -ge 18 ]]]])
+AT_CLEANUP
+
+AT_SETUP([sflow offloads with sampling=2 - ping between two ports - offloads enabled])
+OVS_TRAFFIC_VSWITCHD_START()
+
+on_exit 'kill `cat test-sflow.pid`'
+AT_CHECK([ovstest test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
+AT_CAPTURE_FILE([sflow.log])
+PARSE_LISTENING_PORT([test-sflow.log], [SFLOW_PORT])
+
+AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:hw-offload=true])
+
+AT_CHECK([ovs-appctl -t ovsdb-server exit])
+AT_CHECK([ovs-appctl -t ovs-vswitchd exit])
+AT_CHECK([rm -f ovsdb-server.pid])
+AT_CHECK([rm -f ovs-vswitchd.pid])
+AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file --remote=punix:$OVS_RUNDIR/db.sock], [0], [], [stderr])
+AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn -vofproto_dpif -vunixctl], [0], [], [stderr])
+on_exit "kill `cat ovsdb-server.pid`"
+on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`"
+
+AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
+
+ADD_NAMESPACES(at_ns0, at_ns1)
+
+ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
+ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
+AT_CHECK([ovs-appctl dpctl/dump-flows], [0], [ignore])
+
+AT_CHECK([ovs-vsctl -- --id=@sflow create sflow agent=lo target=\"127.0.0.1:$SFLOW_PORT\" header=128 sampling=2 polling=100 -- set bridge br0 sflow=@sflow], [0], [ignore])
+NS_CHECK_EXEC([at_ns0], [ping -c 1000 -i 0.01 -w 12 10.1.1.2], [0], [ignore])
+AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "actions:sample" | grep "sFlow" | grep "eth_type(0x0800)"], [0], [ignore])
+
+OVS_TRAFFIC_VSWITCHD_STOP
+OVS_APP_EXIT_AND_WAIT([test-sflow])
+count=`cat sflow.log | wc -l`
+AT_CHECK([[[[ $count -le 1100 && $count -ge 900 ]]]])
+AT_CLEANUP
+
 AT_SETUP([offloads - set ingress_policing_rate and ingress_policing_burst - offloads disabled])
 AT_KEYWORDS([ingress_policing])
 AT_SKIP_IF([test $HAVE_TC = "no"])