Re: [ovs-dev] [PATCH net-next v7 10/10] selftests: openvswitch: add psample test

2024-07-02 Thread Aaron Conole
Adrián Moreno  writes:

> On Mon, Jul 01, 2024 at 02:38:44PM GMT, Aaron Conole wrote:
>> Adrian Moreno  writes:
>>
>> > Add a test to verify sampling packets via psample works.
>> >
>> > In order to do that, create a subcommand in ovs-dpctl.py to listen to
>> > on the psample multicast group and print samples.
>> >
>> > Signed-off-by: Adrian Moreno 
>> > ---
>> >  .../selftests/net/openvswitch/openvswitch.sh  | 115 +-
>> >  .../selftests/net/openvswitch/ovs-dpctl.py|  73 ++-
>> >  2 files changed, 182 insertions(+), 6 deletions(-)
>> >
>> > diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh 
>> > b/tools/testing/selftests/net/openvswitch/openvswitch.sh
>> > index 15bca0708717..02a366e01004 100755
>> > --- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
>> > +++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
>> > @@ -20,7 +20,8 @@ tests="
>> >nat_related_v4  ip4-nat-related: ICMP related 
>> > matches work with SNAT
>> >netlink_checks  ovsnl: validate netlink attrs 
>> > and settings
>> >upcall_interfaces   ovs: test the upcall interfaces
>> > -  drop_reason drop: test drop reasons are 
>> > emitted"
>> > +  drop_reason drop: test drop reasons are 
>> > emitted
>> > +  psample psample: Sampling packets with 
>> > psample"
>> >
>> >  info() {
>> >  [ $VERBOSE = 0 ] || echo $*
>> > @@ -102,12 +103,21 @@ ovs_netns_spawn_daemon() {
>> >shift
>> >netns=$1
>> >shift
>> > -  info "spawning cmd: $*"
>> > -  ip netns exec $netns $*  >> $ovs_dir/stdout  2>> $ovs_dir/stderr &
>> > +  if [ "$netns" == "_default" ]; then
>> > +  $*  >> $ovs_dir/stdout  2>> $ovs_dir/stderr &
>> > +  else
>> > +  ip netns exec $netns $*  >> $ovs_dir/stdout  2>> 
>> > $ovs_dir/stderr &
>> > +  fi
>> >pid=$!
>> >ovs_sbx "$sbx" on_exit "kill -TERM $pid 2>/dev/null"
>> >  }
>> >
>> > +ovs_spawn_daemon() {
>> > +  sbx=$1
>> > +  shift
>> > +  ovs_netns_spawn_daemon $sbx "_default" $*
>> > +}
>> > +
>> >  ovs_add_netns_and_veths () {
>> >info "Adding netns attached: sbx:$1 dp:$2 {$3, $4, $5}"
>> >ovs_sbx "$1" ip netns add "$3" || return 1
>> > @@ -170,6 +180,19 @@ ovs_drop_reason_count()
>> >return `echo "$perf_output" | grep "$pattern" | wc -l`
>> >  }
>> >
>> > +ovs_test_flow_fails () {
>> > +  ERR_MSG="Flow actions may not be safe on all matching packets"
>> > +
>> > +  PRE_TEST=$(dmesg | grep -c "${ERR_MSG}")
>> > +  ovs_add_flow $@ &> /dev/null $@ && return 1
>> > +  POST_TEST=$(dmesg | grep -c "${ERR_MSG}")
>> > +
>> > +  if [ "$PRE_TEST" == "$POST_TEST" ]; then
>> > +  return 1
>> > +  fi
>> > +  return 0
>> > +}
>> > +
>> >  usage() {
>> >echo
>> >echo "$0 [OPTIONS] [TEST]..."
>> > @@ -184,6 +207,92 @@ usage() {
>> >exit 1
>> >  }
>> >
>> > +
>> > +# psample test
>> > +# - use psample to observe packets
>> > +test_psample() {
>> > +  sbx_add "test_psample" || return $?
>> > +
>> > +  # Add a datapath with per-vport dispatching.
>> > +  ovs_add_dp "test_psample" psample -V 2:1 || return 1
>> > +
>> > +  info "create namespaces"
>> > +  ovs_add_netns_and_veths "test_psample" "psample" \
>> > +  client c0 c1 172.31.110.10/24 -u || return 1
>> > +  ovs_add_netns_and_veths "test_psample" "psample" \
>> > +  server s0 s1 172.31.110.20/24 -u || return 1
>> > +
>> > +  # Check if psample actions can be configured.
>> > +  ovs_add_flow "test_psample" psample \
>> > +  'in_port(1),eth(),eth_type(0x0806),arp()' 'psample(group=1)'
>>
>> Might be good to redirect this stdout/stderr line to /dev/null -
>> otherwise on an unsupported system there will be the following extra
>> splat:
>>
>>   Traceback (most recent call last):
>> File 
>> "/home/aconole/git/linux/tools/testing/selftests/net/openvswitch/ovs-dpctl.py",
>>  line 2774, in 
>>   sys.exit(main(sys.argv))
>>...
>> File "/usr/lib/python3.12/site-packages/pyroute2/netlink/nlsocket.py", 
>> line 489, in get
>>   raise msg['header']['error']
>>   pyroute2.netlink.exceptions.NetlinkError: (22, 'Invalid argument')
>>
>
> I thought knowing the return value was kind of useful but sure, we can
> redirect it to /dev/null.
>
>> > +  if [ $? == 1 ]; then
>> > +  info "no support for psample - skipping"
>> > +  ovs_exit_sig
>> > +  return $ksft_skip
>> > +  fi
>> > +
>> > +  ovs_del_flows "test_psample" psample
>> > +
>> > +  # Test action verification.
>> > +  OLDIFS=$IFS
>> > +  IFS='*'
>> > +  min_key='in_port(1),eth(),eth_type(0x0800),ipv4()'
>> > +  for testcase in \
>> > + "cookie to
>> > large"*"psample(group=1,cookie=1615141312111009080706050403020100)"
>> > \
>> > +  "no group with cookie"*"psample(cookie=abcd)" \
>> > +  "no group"*"psample()";
>> > +  do
>> > +  set -- $testcase;
>> > +  ovs_test_flow_fail

Re: [ovs-dev] [PATCH net-next v7 10/10] selftests: openvswitch: add psample test

2024-07-02 Thread Adrián Moreno
On Mon, Jul 01, 2024 at 02:38:44PM GMT, Aaron Conole wrote:
> Adrian Moreno  writes:
>
> > Add a test to verify sampling packets via psample works.
> >
> > In order to do that, create a subcommand in ovs-dpctl.py to listen to
> > on the psample multicast group and print samples.
> >
> > Signed-off-by: Adrian Moreno 
> > ---
> >  .../selftests/net/openvswitch/openvswitch.sh  | 115 +-
> >  .../selftests/net/openvswitch/ovs-dpctl.py|  73 ++-
> >  2 files changed, 182 insertions(+), 6 deletions(-)
> >
> > diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh 
> > b/tools/testing/selftests/net/openvswitch/openvswitch.sh
> > index 15bca0708717..02a366e01004 100755
> > --- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
> > +++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
> > @@ -20,7 +20,8 @@ tests="
> > nat_related_v4  ip4-nat-related: ICMP related 
> > matches work with SNAT
> > netlink_checks  ovsnl: validate netlink attrs 
> > and settings
> > upcall_interfaces   ovs: test the upcall interfaces
> > -   drop_reason drop: test drop reasons are 
> > emitted"
> > +   drop_reason drop: test drop reasons are 
> > emitted
> > +   psample psample: Sampling packets with 
> > psample"
> >
> >  info() {
> >  [ $VERBOSE = 0 ] || echo $*
> > @@ -102,12 +103,21 @@ ovs_netns_spawn_daemon() {
> > shift
> > netns=$1
> > shift
> > -   info "spawning cmd: $*"
> > -   ip netns exec $netns $*  >> $ovs_dir/stdout  2>> $ovs_dir/stderr &
> > +   if [ "$netns" == "_default" ]; then
> > +   $*  >> $ovs_dir/stdout  2>> $ovs_dir/stderr &
> > +   else
> > +   ip netns exec $netns $*  >> $ovs_dir/stdout  2>> 
> > $ovs_dir/stderr &
> > +   fi
> > pid=$!
> > ovs_sbx "$sbx" on_exit "kill -TERM $pid 2>/dev/null"
> >  }
> >
> > +ovs_spawn_daemon() {
> > +   sbx=$1
> > +   shift
> > +   ovs_netns_spawn_daemon $sbx "_default" $*
> > +}
> > +
> >  ovs_add_netns_and_veths () {
> > info "Adding netns attached: sbx:$1 dp:$2 {$3, $4, $5}"
> > ovs_sbx "$1" ip netns add "$3" || return 1
> > @@ -170,6 +180,19 @@ ovs_drop_reason_count()
> > return `echo "$perf_output" | grep "$pattern" | wc -l`
> >  }
> >
> > +ovs_test_flow_fails () {
> > +   ERR_MSG="Flow actions may not be safe on all matching packets"
> > +
> > +   PRE_TEST=$(dmesg | grep -c "${ERR_MSG}")
> > +   ovs_add_flow $@ &> /dev/null $@ && return 1
> > +   POST_TEST=$(dmesg | grep -c "${ERR_MSG}")
> > +
> > +   if [ "$PRE_TEST" == "$POST_TEST" ]; then
> > +   return 1
> > +   fi
> > +   return 0
> > +}
> > +
> >  usage() {
> > echo
> > echo "$0 [OPTIONS] [TEST]..."
> > @@ -184,6 +207,92 @@ usage() {
> > exit 1
> >  }
> >
> > +
> > +# psample test
> > +# - use psample to observe packets
> > +test_psample() {
> > +   sbx_add "test_psample" || return $?
> > +
> > +   # Add a datapath with per-vport dispatching.
> > +   ovs_add_dp "test_psample" psample -V 2:1 || return 1
> > +
> > +   info "create namespaces"
> > +   ovs_add_netns_and_veths "test_psample" "psample" \
> > +   client c0 c1 172.31.110.10/24 -u || return 1
> > +   ovs_add_netns_and_veths "test_psample" "psample" \
> > +   server s0 s1 172.31.110.20/24 -u || return 1
> > +
> > +   # Check if psample actions can be configured.
> > +   ovs_add_flow "test_psample" psample \
> > +   'in_port(1),eth(),eth_type(0x0806),arp()' 'psample(group=1)'
>
> Might be good to redirect this stdout/stderr line to /dev/null -
> otherwise on an unsupported system there will be the following extra
> splat:
>
>   Traceback (most recent call last):
> File 
> "/home/aconole/git/linux/tools/testing/selftests/net/openvswitch/ovs-dpctl.py",
>  line 2774, in 
>   sys.exit(main(sys.argv))
>...
> File "/usr/lib/python3.12/site-packages/pyroute2/netlink/nlsocket.py", 
> line 489, in get
>   raise msg['header']['error']
>   pyroute2.netlink.exceptions.NetlinkError: (22, 'Invalid argument')
>

I thought knowing the return value was kind of useful but sure, we can
redirect it to /dev/null.

> > +   if [ $? == 1 ]; then
> > +   info "no support for psample - skipping"
> > +   ovs_exit_sig
> > +   return $ksft_skip
> > +   fi
> > +
> > +   ovs_del_flows "test_psample" psample
> > +
> > +   # Test action verification.
> > +   OLDIFS=$IFS
> > +   IFS='*'
> > +   min_key='in_port(1),eth(),eth_type(0x0800),ipv4()'
> > +   for testcase in \
> > +   "cookie to 
> > large"*"psample(group=1,cookie=1615141312111009080706050403020100)" \
> > +   "no group with cookie"*"psample(cookie=abcd)" \
> > +   "no group"*"psample()";
> > +   do
> > +   set -- $testcase;
> > +   ovs_test_flow_fails "test_psample" psample $min_key $2
> > +   if [ $? == 1 ]; then
> > +   in

Re: [ovs-dev] [PATCH net-next v7 10/10] selftests: openvswitch: add psample test

2024-07-01 Thread Aaron Conole
Adrian Moreno  writes:

> Add a test to verify sampling packets via psample works.
>
> In order to do that, create a subcommand in ovs-dpctl.py to listen to
> on the psample multicast group and print samples.
>
> Signed-off-by: Adrian Moreno 
> ---
>  .../selftests/net/openvswitch/openvswitch.sh  | 115 +-
>  .../selftests/net/openvswitch/ovs-dpctl.py|  73 ++-
>  2 files changed, 182 insertions(+), 6 deletions(-)
>
> diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh 
> b/tools/testing/selftests/net/openvswitch/openvswitch.sh
> index 15bca0708717..02a366e01004 100755
> --- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
> +++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
> @@ -20,7 +20,8 @@ tests="
>   nat_related_v4  ip4-nat-related: ICMP related 
> matches work with SNAT
>   netlink_checks  ovsnl: validate netlink attrs 
> and settings
>   upcall_interfaces   ovs: test the upcall interfaces
> - drop_reason drop: test drop reasons are 
> emitted"
> + drop_reason drop: test drop reasons are 
> emitted
> + psample psample: Sampling packets with 
> psample"
>  
>  info() {
>  [ $VERBOSE = 0 ] || echo $*
> @@ -102,12 +103,21 @@ ovs_netns_spawn_daemon() {
>   shift
>   netns=$1
>   shift
> - info "spawning cmd: $*"
> - ip netns exec $netns $*  >> $ovs_dir/stdout  2>> $ovs_dir/stderr &
> + if [ "$netns" == "_default" ]; then
> + $*  >> $ovs_dir/stdout  2>> $ovs_dir/stderr &
> + else
> + ip netns exec $netns $*  >> $ovs_dir/stdout  2>> 
> $ovs_dir/stderr &
> + fi
>   pid=$!
>   ovs_sbx "$sbx" on_exit "kill -TERM $pid 2>/dev/null"
>  }
>  
> +ovs_spawn_daemon() {
> + sbx=$1
> + shift
> + ovs_netns_spawn_daemon $sbx "_default" $*
> +}
> +
>  ovs_add_netns_and_veths () {
>   info "Adding netns attached: sbx:$1 dp:$2 {$3, $4, $5}"
>   ovs_sbx "$1" ip netns add "$3" || return 1
> @@ -170,6 +180,19 @@ ovs_drop_reason_count()
>   return `echo "$perf_output" | grep "$pattern" | wc -l`
>  }
>  
> +ovs_test_flow_fails () {
> + ERR_MSG="Flow actions may not be safe on all matching packets"
> +
> + PRE_TEST=$(dmesg | grep -c "${ERR_MSG}")
> + ovs_add_flow $@ &> /dev/null $@ && return 1
> + POST_TEST=$(dmesg | grep -c "${ERR_MSG}")
> +
> + if [ "$PRE_TEST" == "$POST_TEST" ]; then
> + return 1
> + fi
> + return 0
> +}
> +
>  usage() {
>   echo
>   echo "$0 [OPTIONS] [TEST]..."
> @@ -184,6 +207,92 @@ usage() {
>   exit 1
>  }
>  
> +
> +# psample test
> +# - use psample to observe packets
> +test_psample() {
> + sbx_add "test_psample" || return $?
> +
> + # Add a datapath with per-vport dispatching.
> + ovs_add_dp "test_psample" psample -V 2:1 || return 1
> +
> + info "create namespaces"
> + ovs_add_netns_and_veths "test_psample" "psample" \
> + client c0 c1 172.31.110.10/24 -u || return 1
> + ovs_add_netns_and_veths "test_psample" "psample" \
> + server s0 s1 172.31.110.20/24 -u || return 1
> +
> + # Check if psample actions can be configured.
> + ovs_add_flow "test_psample" psample \
> + 'in_port(1),eth(),eth_type(0x0806),arp()' 'psample(group=1)'

Might be good to redirect this stdout/stderr line to /dev/null -
otherwise on an unsupported system there will be the following extra
splat:

  Traceback (most recent call last):
File 
"/home/aconole/git/linux/tools/testing/selftests/net/openvswitch/ovs-dpctl.py", 
line 2774, in 
  sys.exit(main(sys.argv))
   ...
File "/usr/lib/python3.12/site-packages/pyroute2/netlink/nlsocket.py", line 
489, in get
  raise msg['header']['error']
  pyroute2.netlink.exceptions.NetlinkError: (22, 'Invalid argument')

> + if [ $? == 1 ]; then
> + info "no support for psample - skipping"
> + ovs_exit_sig
> + return $ksft_skip
> + fi
> +
> + ovs_del_flows "test_psample" psample
> +
> + # Test action verification.
> + OLDIFS=$IFS
> + IFS='*'
> + min_key='in_port(1),eth(),eth_type(0x0800),ipv4()'
> + for testcase in \
> + "cookie to 
> large"*"psample(group=1,cookie=1615141312111009080706050403020100)" \
> + "no group with cookie"*"psample(cookie=abcd)" \
> + "no group"*"psample()";
> + do
> + set -- $testcase;
> + ovs_test_flow_fails "test_psample" psample $min_key $2
> + if [ $? == 1 ]; then
> + info "failed - $1"
> + return 1
> + fi
> + done
> + IFS=$OLDIFS
> +
> + ovs_del_flows "test_psample" psample
> + # Allow ARP
> + ovs_add_flow "test_psample" psample \
> + 'in_port(1),eth(),eth_type(0x0806),arp()' '2' || return 1
> 

Re: [ovs-dev] [PATCH net-next v7 10/10] selftests: openvswitch: add psample test

2024-07-01 Thread Ilya Maximets
On 6/30/24 21:57, Adrian Moreno wrote:
> Add a test to verify sampling packets via psample works.
> 
> In order to do that, create a subcommand in ovs-dpctl.py to listen to
> on the psample multicast group and print samples.
> 
> Signed-off-by: Adrian Moreno 
> ---
>  .../selftests/net/openvswitch/openvswitch.sh  | 115 +-
>  .../selftests/net/openvswitch/ovs-dpctl.py|  73 ++-
>  2 files changed, 182 insertions(+), 6 deletions(-)


This version seems to work correctly with and without arguments.

Tested-by: Ilya Maximets 
___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


[ovs-dev] [PATCH net-next v7 10/10] selftests: openvswitch: add psample test

2024-06-30 Thread Adrian Moreno
Add a test to verify sampling packets via psample works.

In order to do that, create a subcommand in ovs-dpctl.py to listen to
on the psample multicast group and print samples.

Signed-off-by: Adrian Moreno 
---
 .../selftests/net/openvswitch/openvswitch.sh  | 115 +-
 .../selftests/net/openvswitch/ovs-dpctl.py|  73 ++-
 2 files changed, 182 insertions(+), 6 deletions(-)

diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh 
b/tools/testing/selftests/net/openvswitch/openvswitch.sh
index 15bca0708717..02a366e01004 100755
--- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
+++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
@@ -20,7 +20,8 @@ tests="
nat_related_v4  ip4-nat-related: ICMP related 
matches work with SNAT
netlink_checks  ovsnl: validate netlink attrs 
and settings
upcall_interfaces   ovs: test the upcall interfaces
-   drop_reason drop: test drop reasons are 
emitted"
+   drop_reason drop: test drop reasons are 
emitted
+   psample psample: Sampling packets with 
psample"
 
 info() {
 [ $VERBOSE = 0 ] || echo $*
@@ -102,12 +103,21 @@ ovs_netns_spawn_daemon() {
shift
netns=$1
shift
-   info "spawning cmd: $*"
-   ip netns exec $netns $*  >> $ovs_dir/stdout  2>> $ovs_dir/stderr &
+   if [ "$netns" == "_default" ]; then
+   $*  >> $ovs_dir/stdout  2>> $ovs_dir/stderr &
+   else
+   ip netns exec $netns $*  >> $ovs_dir/stdout  2>> 
$ovs_dir/stderr &
+   fi
pid=$!
ovs_sbx "$sbx" on_exit "kill -TERM $pid 2>/dev/null"
 }
 
+ovs_spawn_daemon() {
+   sbx=$1
+   shift
+   ovs_netns_spawn_daemon $sbx "_default" $*
+}
+
 ovs_add_netns_and_veths () {
info "Adding netns attached: sbx:$1 dp:$2 {$3, $4, $5}"
ovs_sbx "$1" ip netns add "$3" || return 1
@@ -170,6 +180,19 @@ ovs_drop_reason_count()
return `echo "$perf_output" | grep "$pattern" | wc -l`
 }
 
+ovs_test_flow_fails () {
+   ERR_MSG="Flow actions may not be safe on all matching packets"
+
+   PRE_TEST=$(dmesg | grep -c "${ERR_MSG}")
+   ovs_add_flow $@ &> /dev/null $@ && return 1
+   POST_TEST=$(dmesg | grep -c "${ERR_MSG}")
+
+   if [ "$PRE_TEST" == "$POST_TEST" ]; then
+   return 1
+   fi
+   return 0
+}
+
 usage() {
echo
echo "$0 [OPTIONS] [TEST]..."
@@ -184,6 +207,92 @@ usage() {
exit 1
 }
 
+
+# psample test
+# - use psample to observe packets
+test_psample() {
+   sbx_add "test_psample" || return $?
+
+   # Add a datapath with per-vport dispatching.
+   ovs_add_dp "test_psample" psample -V 2:1 || return 1
+
+   info "create namespaces"
+   ovs_add_netns_and_veths "test_psample" "psample" \
+   client c0 c1 172.31.110.10/24 -u || return 1
+   ovs_add_netns_and_veths "test_psample" "psample" \
+   server s0 s1 172.31.110.20/24 -u || return 1
+
+   # Check if psample actions can be configured.
+   ovs_add_flow "test_psample" psample \
+   'in_port(1),eth(),eth_type(0x0806),arp()' 'psample(group=1)'
+   if [ $? == 1 ]; then
+   info "no support for psample - skipping"
+   ovs_exit_sig
+   return $ksft_skip
+   fi
+
+   ovs_del_flows "test_psample" psample
+
+   # Test action verification.
+   OLDIFS=$IFS
+   IFS='*'
+   min_key='in_port(1),eth(),eth_type(0x0800),ipv4()'
+   for testcase in \
+   "cookie to 
large"*"psample(group=1,cookie=1615141312111009080706050403020100)" \
+   "no group with cookie"*"psample(cookie=abcd)" \
+   "no group"*"psample()";
+   do
+   set -- $testcase;
+   ovs_test_flow_fails "test_psample" psample $min_key $2
+   if [ $? == 1 ]; then
+   info "failed - $1"
+   return 1
+   fi
+   done
+   IFS=$OLDIFS
+
+   ovs_del_flows "test_psample" psample
+   # Allow ARP
+   ovs_add_flow "test_psample" psample \
+   'in_port(1),eth(),eth_type(0x0806),arp()' '2' || return 1
+   ovs_add_flow "test_psample" psample \
+   'in_port(2),eth(),eth_type(0x0806),arp()' '1' || return 1
+
+   # Sample first 14 bytes of all traffic.
+   ovs_add_flow "test_psample" psample \
+   "in_port(1),eth(),eth_type(0x0800),ipv4()" \
+"trunc(14),psample(group=1,cookie=c0ffee),2"
+
+   # Sample all traffic. In this case, use a sample() action with both
+   # psample and an upcall emulating simultaneous local sampling and
+   # sFlow / IPFIX.
+   nlpid=$(grep -E "listening on upcall packet handler" \
+$ovs_dir/s0.out | cut -d ":" -f 2 | tr -d ' ')
+
+   ovs_add_flow "te