-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests: drv-net: Test queue xsk attribute
Test that queues which are used for AF_XDP have the xsk nest attribute. The attribute is currently empty, but its existence means the AF_XDP is being used for the queue. Enable CONFIG_XDP_SOCKETS for selftests/drivers/net tests, as well. Signed-off-by: Joe Damato <jdamato@fastly.com> Suggested-by: Jakub Kicinski <kuba@kernel.org> Link: https://patch.msgid.link/20250214211255.14194-4-jdamato@fastly.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
- Loading branch information
Joe Damato
authored and
Jakub Kicinski
committed
Feb 18, 2025
1 parent
df524c8
commit 788e52e
Showing
5 changed files
with
143 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
# SPDX-License-Identifier: GPL-2.0-only | ||
xdp_helper |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
#include <errno.h> | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
#include <unistd.h> | ||
#include <sys/mman.h> | ||
#include <sys/socket.h> | ||
#include <linux/if_xdp.h> | ||
#include <linux/if_link.h> | ||
#include <net/if.h> | ||
#include <inttypes.h> | ||
|
||
#define UMEM_SZ (1U << 16) | ||
#define NUM_DESC (UMEM_SZ / 2048) | ||
|
||
/* this is a simple helper program that creates an XDP socket and does the | ||
* minimum necessary to get bind() to succeed. | ||
* | ||
* this test program is not intended to actually process packets, but could be | ||
* extended in the future if that is actually needed. | ||
* | ||
* it is used by queues.py to ensure the xsk netlinux attribute is set | ||
* correctly. | ||
*/ | ||
int main(int argc, char **argv) | ||
{ | ||
struct xdp_umem_reg umem_reg = { 0 }; | ||
struct sockaddr_xdp sxdp = { 0 }; | ||
int num_desc = NUM_DESC; | ||
void *umem_area; | ||
int ifindex; | ||
int sock_fd; | ||
int queue; | ||
char byte; | ||
|
||
if (argc != 3) { | ||
fprintf(stderr, "Usage: %s ifindex queue_id", argv[0]); | ||
return 1; | ||
} | ||
|
||
sock_fd = socket(AF_XDP, SOCK_RAW, 0); | ||
if (sock_fd < 0) { | ||
perror("socket creation failed"); | ||
/* if the kernel doesn't support AF_XDP, let the test program | ||
* know with -1. All other error paths return 1. | ||
*/ | ||
if (errno == EAFNOSUPPORT) | ||
return -1; | ||
return 1; | ||
} | ||
|
||
ifindex = atoi(argv[1]); | ||
queue = atoi(argv[2]); | ||
|
||
umem_area = mmap(NULL, UMEM_SZ, PROT_READ | PROT_WRITE, MAP_PRIVATE | | ||
MAP_ANONYMOUS, -1, 0); | ||
if (umem_area == MAP_FAILED) { | ||
perror("mmap failed"); | ||
return 1; | ||
} | ||
|
||
umem_reg.addr = (uintptr_t)umem_area; | ||
umem_reg.len = UMEM_SZ; | ||
umem_reg.chunk_size = 2048; | ||
umem_reg.headroom = 0; | ||
|
||
setsockopt(sock_fd, SOL_XDP, XDP_UMEM_REG, &umem_reg, | ||
sizeof(umem_reg)); | ||
setsockopt(sock_fd, SOL_XDP, XDP_UMEM_FILL_RING, &num_desc, | ||
sizeof(num_desc)); | ||
setsockopt(sock_fd, SOL_XDP, XDP_UMEM_COMPLETION_RING, &num_desc, | ||
sizeof(num_desc)); | ||
setsockopt(sock_fd, SOL_XDP, XDP_RX_RING, &num_desc, sizeof(num_desc)); | ||
|
||
sxdp.sxdp_family = AF_XDP; | ||
sxdp.sxdp_ifindex = ifindex; | ||
sxdp.sxdp_queue_id = queue; | ||
sxdp.sxdp_flags = 0; | ||
|
||
if (bind(sock_fd, (struct sockaddr *)&sxdp, sizeof(sxdp)) != 0) { | ||
munmap(umem_area, UMEM_SZ); | ||
perror("bind failed"); | ||
close(sock_fd); | ||
return 1; | ||
} | ||
|
||
/* give the parent program some data when the socket is ready*/ | ||
fprintf(stdout, "%d\n", sock_fd); | ||
|
||
/* parent program will write a byte to stdin when its ready for this | ||
* helper to exit | ||
*/ | ||
read(STDIN_FILENO, &byte, 1); | ||
|
||
close(sock_fd); | ||
return 0; | ||
} |