selftests/bpf: Xsk selftests - Socket Teardown - SKB, DRV
Adds following tests: 1. AF_XDP SKB mode c. Socket Teardown Create a Tx and a Rx socket, Tx from one socket, Rx on another. Destroy both sockets, then repeat multiple times. Only nopoll mode is used 2. AF_XDP DRV/Native mode c. Socket Teardown * Only copy mode is supported because veth does not currently support zero-copy mode Signed-off-by: Weqaar Janjua <weqaar.a.janjua@intel.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Tested-by: Yonghong Song <yhs@fb.com> Acked-by: Björn Töpel <bjorn.topel@intel.com> Link: https://lore.kernel.org/bpf/20201207215333.11586-5-weqaar.a.janjua@intel.com
This commit is contained in:
parent
9103a8594d
commit
6674bf6656
@ -197,6 +197,30 @@ retval=$?
|
||||
test_status $retval "${TEST_NAME}"
|
||||
statusList+=($retval)
|
||||
|
||||
### TEST 6
|
||||
TEST_NAME="SKB SOCKET TEARDOWN"
|
||||
|
||||
vethXDPgeneric ${VETH0} ${VETH1} ${NS1}
|
||||
|
||||
params=("-S" "-T")
|
||||
execxdpxceiver params
|
||||
|
||||
retval=$?
|
||||
test_status $retval "${TEST_NAME}"
|
||||
statusList+=($retval)
|
||||
|
||||
### TEST 7
|
||||
TEST_NAME="DRV SOCKET TEARDOWN"
|
||||
|
||||
vethXDPnative ${VETH0} ${VETH1} ${NS1}
|
||||
|
||||
params=("-N" "-T")
|
||||
execxdpxceiver params
|
||||
|
||||
retval=$?
|
||||
test_status $retval "${TEST_NAME}"
|
||||
statusList+=($retval)
|
||||
|
||||
## END TESTS
|
||||
|
||||
cleanup_exit ${VETH0} ${VETH1} ${NS1}
|
||||
|
@ -26,6 +26,9 @@
|
||||
* generic XDP path. XDP hook from netif_receive_skb().
|
||||
* a. nopoll - soft-irq processing
|
||||
* b. poll - using poll() syscall
|
||||
* c. Socket Teardown
|
||||
* Create a Tx and a Rx socket, Tx from one socket, Rx on another. Destroy
|
||||
* both sockets, then repeat multiple times. Only nopoll mode is used
|
||||
*
|
||||
* 2. AF_XDP DRV/Native mode
|
||||
* Works on any netdevice with XDP_REDIRECT support, driver dependent. Processes
|
||||
@ -33,10 +36,11 @@
|
||||
* hook available just after DMA of buffer descriptor.
|
||||
* a. nopoll
|
||||
* b. poll
|
||||
* c. Socket Teardown
|
||||
* - Only copy mode is supported because veth does not currently support
|
||||
* zero-copy mode
|
||||
*
|
||||
* Total tests: 4
|
||||
* Total tests: 6
|
||||
*
|
||||
* Flow:
|
||||
* -----
|
||||
@ -97,7 +101,8 @@ 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 ? "DRV" : "SKB", opt_poll ? "POLL" : "NOPOLL"))
|
||||
(ksft_test_result_pass("PASS: %s %s %s\n", uut ? "DRV" : "SKB", opt_poll ? "POLL" :\
|
||||
"NOPOLL", opt_teardown ? "Socket Teardown" : ""))
|
||||
|
||||
static void pthread_init_mutex(void)
|
||||
{
|
||||
@ -322,6 +327,7 @@ static struct option long_options[] = {
|
||||
{"xdp-skb", no_argument, 0, 'S'},
|
||||
{"xdp-native", no_argument, 0, 'N'},
|
||||
{"copy", no_argument, 0, 'c'},
|
||||
{"tear-down", no_argument, 0, 'T'},
|
||||
{"debug", optional_argument, 0, 'D'},
|
||||
{"tx-pkt-count", optional_argument, 0, 'C'},
|
||||
{0, 0, 0, 0}
|
||||
@ -338,6 +344,7 @@ static void usage(const char *prog)
|
||||
" -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"
|
||||
" -T, --tear-down Tear down sockets by repeatedly recreating them\n"
|
||||
" -D, --debug Debug mode - dump packets L2 - L5\n"
|
||||
" -C, --tx-pkt-count=n Number of packets to send\n";
|
||||
ksft_print_msg(str, prog);
|
||||
@ -428,7 +435,7 @@ static void parse_command_line(int argc, char **argv)
|
||||
opterr = 0;
|
||||
|
||||
for (;;) {
|
||||
c = getopt_long(argc, argv, "i:q:pSNcDC:", long_options, &option_index);
|
||||
c = getopt_long(argc, argv, "i:q:pSNcTDC:", long_options, &option_index);
|
||||
|
||||
if (c == -1)
|
||||
break;
|
||||
@ -467,6 +474,9 @@ static void parse_command_line(int argc, char **argv)
|
||||
case 'c':
|
||||
opt_xdp_bind_flags |= XDP_COPY;
|
||||
break;
|
||||
case 'T':
|
||||
opt_teardown = 1;
|
||||
break;
|
||||
case 'D':
|
||||
debug_pkt_dump = 1;
|
||||
break;
|
||||
@ -871,6 +881,9 @@ static void *worker_testapp_validate(void *arg)
|
||||
|
||||
ksft_print_msg("Received %d packets on interface %s\n",
|
||||
pkt_counter, ((struct ifobject *)arg)->ifname);
|
||||
|
||||
if (opt_teardown)
|
||||
ksft_print_msg("Destroying socket\n");
|
||||
}
|
||||
|
||||
xsk_socket__delete(((struct ifobject *)arg)->xsk->xsk);
|
||||
@ -916,6 +929,20 @@ static void testapp_validate(void)
|
||||
free(pkt_buf);
|
||||
}
|
||||
|
||||
if (!opt_teardown)
|
||||
print_ksft_result();
|
||||
}
|
||||
|
||||
static void testapp_sockets(void)
|
||||
{
|
||||
for (int i = 0; i < MAX_TEARDOWN_ITER; i++) {
|
||||
pkt_counter = 0;
|
||||
prev_pkt = -1;
|
||||
sigvar = 0;
|
||||
ksft_print_msg("Creating socket\n");
|
||||
testapp_validate();
|
||||
}
|
||||
|
||||
print_ksft_result();
|
||||
}
|
||||
|
||||
@ -982,7 +1009,7 @@ int main(int argc, char **argv)
|
||||
|
||||
ksft_set_plan(1);
|
||||
|
||||
testapp_validate();
|
||||
opt_teardown ? testapp_sockets() : testapp_validate();
|
||||
|
||||
for (int i = 0; i < MAX_INTERFACES; i++)
|
||||
free(ifdict[i]);
|
||||
|
@ -21,6 +21,7 @@
|
||||
#define MAX_INTERFACE_NAME_CHARS 7
|
||||
#define MAX_INTERFACES_NAMESPACE_CHARS 10
|
||||
#define MAX_SOCKS 1
|
||||
#define MAX_TEARDOWN_ITER 10
|
||||
#define PKT_HDR_SIZE (sizeof(struct ethhdr) + sizeof(struct iphdr) + \
|
||||
sizeof(struct udphdr))
|
||||
#define MIN_PKT_SIZE 64
|
||||
@ -57,6 +58,7 @@ static u32 opt_xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
|
||||
static int opt_queue;
|
||||
static int opt_pkt_count;
|
||||
static int opt_poll;
|
||||
static int opt_teardown;
|
||||
static u32 opt_xdp_bind_flags = XDP_USE_NEED_WAKEUP;
|
||||
static u8 pkt_data[XSK_UMEM__DEFAULT_FRAME_SIZE];
|
||||
static u32 pkt_counter;
|
||||
|
Loading…
x
Reference in New Issue
Block a user