selftests: mlxsw: spectrum-2: Add simple delta test
authorJiri Pirko <jiri@mellanox.com>
Wed, 14 Nov 2018 08:22:36 +0000 (08:22 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 15 Nov 2018 22:43:43 +0000 (14:43 -0800)
Track the basic codepaths of delta handling, using objagg tracepoints.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh

index 84ef95320c965415f89df08704135edcbda989b8..00ae99fbc2536a2407edc3d92a2b42e6a5bd2728 100755 (executable)
@@ -8,7 +8,7 @@
 lib_dir=$(dirname $0)/../../../../net/forwarding
 
 ALL_TESTS="single_mask_test identical_filters_test two_masks_test \
-       multiple_masks_test ctcam_edge_cases_test"
+       multiple_masks_test ctcam_edge_cases_test delta_simple_test"
 NUM_NETIFS=2
 source $lib_dir/tc_common.sh
 source $lib_dir/lib.sh
@@ -324,6 +324,86 @@ ctcam_edge_cases_test()
        ctcam_no_atcam_masks_test
 }
 
+tp_record()
+{
+       local tracepoint=$1
+       local cmd=$2
+
+       perf record -q -e $tracepoint $cmd
+       return $?
+}
+
+tp_check_hits()
+{
+       local tracepoint=$1
+       local count=$2
+
+       perf_output=`perf script -F trace:event,trace`
+       hits=`echo $perf_output | grep "$tracepoint:" | wc -l`
+       if [[ "$count" -ne "$hits" ]]; then
+               return 1
+       fi
+       return 0
+}
+
+delta_simple_test()
+{
+       # The first filter will create eRP, the second filter will fit into
+       # the first eRP with delta. Remove the first rule then and check that
+        # the eRP stays (referenced by the second filter).
+
+       RET=0
+
+       if [[ "$tcflags" != "skip_sw" ]]; then
+               return 0;
+       fi
+
+       tp_record "objagg:*" "tc filter add dev $h2 ingress protocol ip \
+                  pref 1 handle 101 flower $tcflags dst_ip 192.0.0.0/24 \
+                  action drop"
+       tp_check_hits "objagg:objagg_obj_root_create" 1
+       check_err $? "eRP was not created"
+
+       tp_record "objagg:*" "tc filter add dev $h2 ingress protocol ip \
+                  pref 2 handle 102 flower $tcflags dst_ip 192.0.2.2 \
+                  action drop"
+       tp_check_hits "objagg:objagg_obj_root_create" 0
+       check_err $? "eRP was incorrectly created"
+       tp_check_hits "objagg:objagg_obj_parent_assign" 1
+       check_err $? "delta was not created"
+
+       $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
+               -t ip -q
+
+       tc_check_packets "dev $h2 ingress" 101 1
+       check_fail $? "Matched a wrong filter"
+
+       tc_check_packets "dev $h2 ingress" 102 1
+       check_err $? "Did not match on correct filter"
+
+       tp_record "objagg:*" "tc filter del dev $h2 ingress protocol ip \
+                  pref 1 handle 101 flower"
+       tp_check_hits "objagg:objagg_obj_root_destroy" 0
+       check_err $? "eRP was incorrectly destroyed"
+       tp_check_hits "objagg:objagg_obj_parent_unassign" 0
+       check_err $? "delta was incorrectly destroyed"
+
+       $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
+               -t ip -q
+
+       tc_check_packets "dev $h2 ingress" 102 2
+       check_err $? "Did not match on correct filter after the first was removed"
+
+       tp_record "objagg:*" "tc filter del dev $h2 ingress protocol ip \
+                  pref 2 handle 102 flower"
+       tp_check_hits "objagg:objagg_obj_parent_unassign" 1
+       check_err $? "delta was not destroyed"
+       tp_check_hits "objagg:objagg_obj_root_destroy" 1
+       check_err $? "eRP was not destroyed"
+
+       log_test "delta simple test ($tcflags)"
+}
+
 setup_prepare()
 {
        h1=${NETIFS[p1]}