Adds following tests:

2. AF_XDP DRV/Native mode
   Works on any netdevice with XDP_REDIRECT support, driver dependent.
   Processes packets before SKB allocation. Provides better performance
   than SKB. Driver hook available just after DMA of buffer descriptor.
   a. nopoll
   b. poll
   * Only copy mode is supported because veth does not currently support
     zero-copy mode

Signed-off-by: Weqaar Janjua <weqaar.a.jan...@intel.com>
---
 tools/testing/selftests/xsk/Makefile          |  4 +++-
 tools/testing/selftests/xsk/README            | 11 +++++++++-
 .../selftests/xsk/TEST_XSK_DRV_NOPOLL.sh      | 18 ++++++++++++++++
 .../selftests/xsk/TEST_XSK_DRV_POLL.sh        | 21 +++++++++++++++++++
 .../selftests/xsk/TEST_XSK_SKB_POLL.sh        |  3 ---
 .../selftests/xsk/xdpprogs/xdpxceiver.c       | 11 ++++++++--
 .../selftests/xsk/xdpprogs/xdpxceiver.h       |  1 +
 7 files changed, 62 insertions(+), 7 deletions(-)
 create mode 100755 tools/testing/selftests/xsk/TEST_XSK_DRV_NOPOLL.sh
 create mode 100755 tools/testing/selftests/xsk/TEST_XSK_DRV_POLL.sh

diff --git a/tools/testing/selftests/xsk/Makefile 
b/tools/testing/selftests/xsk/Makefile
index 63008cd90ab6..472d8975fa5a 100644
--- a/tools/testing/selftests/xsk/Makefile
+++ b/tools/testing/selftests/xsk/Makefile
@@ -8,7 +8,9 @@ XSKOBJ := xdpxceiver
 
 TEST_PROGS := TEST_PREREQUISITES.sh \
        TEST_XSK_SKB_NOPOLL.sh \
-       TEST_XSK_SKB_POLL.sh
+       TEST_XSK_SKB_POLL.sh \
+       TEST_XSK_DRV_NOPOLL.sh \
+       TEST_XSK_DRV_POLL.sh
 TEST_FILES := prereqs.sh xskenv.sh
 TEST_TRANSIENT_FILES := veth.spec
 TEST_PROGS_EXTENDED := $(XSKDIR)/$(XSKOBJ)
diff --git a/tools/testing/selftests/xsk/README 
b/tools/testing/selftests/xsk/README
index db507a0057c1..0088c136a0d1 100644
--- a/tools/testing/selftests/xsk/README
+++ b/tools/testing/selftests/xsk/README
@@ -64,7 +64,16 @@ The following tests are run:
    a. nopoll - soft-irq processing
    b. poll - using poll() syscall
 
-Total tests: 2.
+2. AF_XDP DRV/Native mode
+   Works on any netdevice with XDP_REDIRECT support, driver dependent. 
Processes
+   packets before SKB allocation. Provides better performance than SKB. Driver
+   hook available just after DMA of buffer descriptor.
+   a. nopoll
+   b. poll
+   * Only copy mode is supported because veth does not currently support
+     zero-copy mode
+
+Total tests: 4.
 
 Flow:
 * Single process spawns two threads: Tx and Rx
diff --git a/tools/testing/selftests/xsk/TEST_XSK_DRV_NOPOLL.sh 
b/tools/testing/selftests/xsk/TEST_XSK_DRV_NOPOLL.sh
new file mode 100755
index 000000000000..420f33ad6d14
--- /dev/null
+++ b/tools/testing/selftests/xsk/TEST_XSK_DRV_NOPOLL.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright(c) 2020 Intel Corporation.
+
+. prereqs.sh
+. xskenv.sh
+
+TEST_NAME="DRV NOPOLL"
+
+vethXDPnative ${VETH0} ${VETH1} ${NS1}
+
+params=("-N")
+execxdpxceiver params
+
+retval=$?
+test_status $retval "${TEST_NAME}"
+
+test_exit $retval 0
diff --git a/tools/testing/selftests/xsk/TEST_XSK_DRV_POLL.sh 
b/tools/testing/selftests/xsk/TEST_XSK_DRV_POLL.sh
new file mode 100755
index 000000000000..05e6c0372074
--- /dev/null
+++ b/tools/testing/selftests/xsk/TEST_XSK_DRV_POLL.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright(c) 2020 Intel Corporation.
+
+. prereqs.sh
+. xskenv.sh
+
+TEST_NAME="DRV POLL"
+
+vethXDPnative ${VETH0} ${VETH1} ${NS1}
+
+params=("-N" "-p")
+execxdpxceiver params
+
+retval=$?
+test_status $retval "${TEST_NAME}"
+
+# Must be called in the last test to execute
+cleanup_exit ${VETH0} ${VETH1} ${NS1}
+
+test_exit $retval 0
diff --git a/tools/testing/selftests/xsk/TEST_XSK_SKB_POLL.sh 
b/tools/testing/selftests/xsk/TEST_XSK_SKB_POLL.sh
index 4d314ed72cd8..a06582855d6e 100755
--- a/tools/testing/selftests/xsk/TEST_XSK_SKB_POLL.sh
+++ b/tools/testing/selftests/xsk/TEST_XSK_SKB_POLL.sh
@@ -15,7 +15,4 @@ execxdpxceiver params
 retval=$?
 test_status $retval "${TEST_NAME}"
 
-# Must be called in the last test to execute
-cleanup_exit ${VETH0} ${VETH1} ${NS1}
-
 test_exit $retval 0
diff --git a/tools/testing/selftests/xsk/xdpprogs/xdpxceiver.c 
b/tools/testing/selftests/xsk/xdpprogs/xdpxceiver.c
index 9855a3b33fae..777f839bbd3a 100644
--- a/tools/testing/selftests/xsk/xdpprogs/xdpxceiver.c
+++ b/tools/testing/selftests/xsk/xdpprogs/xdpxceiver.c
@@ -49,7 +49,7 @@ static void __exit_with_error(int error, const char *file, 
const char *func, int
 #define exit_with_error(error) __exit_with_error(error, __FILE__, __func__, 
__LINE__)
 
 #define print_ksft_result(void)\
-       (ksft_test_result_pass("PASS: %s %s\n", uut ? "" : "SKB", opt_poll ? 
"POLL" : "NOPOLL"))
+       (ksft_test_result_pass("PASS: %s %s\n", uut ? "DRV" : "SKB", opt_poll ? 
"POLL" : "NOPOLL"))
 
 static void pthread_init_mutex(void)
 {
@@ -272,6 +272,7 @@ static struct option long_options[] = {
        {"queue", optional_argument, 0, 'q'},
        {"poll", no_argument, 0, 'p'},
        {"xdp-skb", no_argument, 0, 'S'},
+       {"xdp-native", no_argument, 0, 'N'},
        {"copy", no_argument, 0, 'c'},
        {"debug", optional_argument, 0, 'D'},
        {"tx-pkt-count", optional_argument, 0, 'C'},
@@ -287,6 +288,7 @@ static void usage(const char *prog)
            "  -q, --queue=n        Use queue n (default 0)\n"
            "  -p, --poll           Use poll syscall\n"
            "  -S, --xdp-skb=n      Use XDP SKB mode\n"
+           "  -N, --xdp-native=n   Enforce XDP DRV (native) mode\n"
            "  -c, --copy           Force copy mode\n"
            "  -D, --debug          Debug mode - dump packets L2 - L5\n"
            "  -C, --tx-pkt-count=n Number of packets to send\n";
@@ -378,7 +380,7 @@ static void parse_command_line(int argc, char **argv)
        opterr = 0;
 
        for (;;) {
-               c = getopt_long(argc, argv, "i:q:pScDC:", long_options, 
&option_index);
+               c = getopt_long(argc, argv, "i:q:pSNcDC:", long_options, 
&option_index);
 
                if (c == -1)
                        break;
@@ -408,6 +410,11 @@ static void parse_command_line(int argc, char **argv)
                        opt_xdp_bind_flags |= XDP_COPY;
                        uut = ORDER_CONTENT_VALIDATE_XDP_SKB;
                        break;
+               case 'N':
+                       opt_xdp_flags |= XDP_FLAGS_DRV_MODE;
+                       opt_xdp_bind_flags |= XDP_COPY;
+                       uut = ORDER_CONTENT_VALIDATE_XDP_DRV;
+                       break;
                case 'c':
                        opt_xdp_bind_flags |= XDP_COPY;
                        break;
diff --git a/tools/testing/selftests/xsk/xdpprogs/xdpxceiver.h 
b/tools/testing/selftests/xsk/xdpprogs/xdpxceiver.h
index 385a01ab04c0..91ddc01836c9 100644
--- a/tools/testing/selftests/xsk/xdpprogs/xdpxceiver.h
+++ b/tools/testing/selftests/xsk/xdpprogs/xdpxceiver.h
@@ -45,6 +45,7 @@ typedef __u8 u8;
 
 enum TESTS {
        ORDER_CONTENT_VALIDATE_XDP_SKB = 0,
+       ORDER_CONTENT_VALIDATE_XDP_DRV = 1,
 };
 
 u8 uut;
-- 
2.20.1

Reply via email to