mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
test_progs run with ASAN reported [1]:
==126==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 32 byte(s) in 1 object(s) allocated from:
#0 0x7f1ff3cfa340 in calloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:77
#1 0x5610c15bb520 in bpf_program_attach_fd /codebuild/output/src685977285/src/actions-runner/_work/vmtest/vmtest/src/tools/lib/bpf/libbpf.c:13164
#2 0x5610c15bb740 in bpf_program__attach_xdp /codebuild/output/src685977285/src/actions-runner/_work/vmtest/vmtest/src/tools/lib/bpf/libbpf.c:13204
#3 0x5610c14f91d3 in test_xdp_flowtable /codebuild/output/src685977285/src/actions-runner/_work/vmtest/vmtest/src/tools/testing/selftests/bpf/prog_tests/xdp_flowtable.c:138
#4 0x5610c1533566 in run_one_test /codebuild/output/src685977285/src/actions-runner/_work/vmtest/vmtest/src/tools/testing/selftests/bpf/test_progs.c:1406
#5 0x5610c1537fb0 in main /codebuild/output/src685977285/src/actions-runner/_work/vmtest/vmtest/src/tools/testing/selftests/bpf/test_progs.c:2097
#6 0x7f1ff25df1c9 (/lib/x86_64-linux-gnu/libc.so.6+0x2a1c9) (BuildId: 8e9fd827446c24067541ac5390e6f527fb5947bb)
#7 0x7f1ff25df28a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a28a) (BuildId: 8e9fd827446c24067541ac5390e6f527fb5947bb)
#8 0x5610c0bd3180 in _start (/tmp/work/vmtest/vmtest/selftests/bpf/test_progs+0x593180) (BuildId: cdf9f103f42307dc0a2cd6cfc8afcbc1366cf8bd)
Fix by properly destroying bpf_link on exit in xdp_flowtable test.
[1] https://github.com/kernel-patches/vmtest/actions/runs/22361085418/job/64716490680
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Reviewed-by: Subbaraya Sundeep <sbhatta@marvell.com>
Link: https://lore.kernel.org/r/20260225003351.465104-1-ihor.solodrai@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
170 lines
4.2 KiB
C
170 lines
4.2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <test_progs.h>
|
|
#include <network_helpers.h>
|
|
#include <bpf/btf.h>
|
|
#include <linux/if_link.h>
|
|
#include <netinet/udp.h>
|
|
#include <net/if.h>
|
|
#include <unistd.h>
|
|
|
|
#include "xdp_flowtable.skel.h"
|
|
|
|
#define TX_NETNS_NAME "ns0"
|
|
#define RX_NETNS_NAME "ns1"
|
|
|
|
#define TX_NAME "v0"
|
|
#define FORWARD_NAME "v1"
|
|
#define RX_NAME "d0"
|
|
|
|
#define TX_MAC "00:00:00:00:00:01"
|
|
#define FORWARD_MAC "00:00:00:00:00:02"
|
|
#define RX_MAC "00:00:00:00:00:03"
|
|
#define DST_MAC "00:00:00:00:00:04"
|
|
|
|
#define TX_ADDR "10.0.0.1"
|
|
#define FORWARD_ADDR "10.0.0.2"
|
|
#define RX_ADDR "20.0.0.1"
|
|
#define DST_ADDR "20.0.0.2"
|
|
|
|
#define PREFIX_LEN "8"
|
|
#define N_PACKETS 10
|
|
#define UDP_PORT 12345
|
|
#define UDP_PORT_STR "12345"
|
|
|
|
static int send_udp_traffic(void)
|
|
{
|
|
struct sockaddr_storage addr;
|
|
int i, sock;
|
|
|
|
if (make_sockaddr(AF_INET, DST_ADDR, UDP_PORT, &addr, NULL))
|
|
return -EINVAL;
|
|
|
|
sock = socket(AF_INET, SOCK_DGRAM, 0);
|
|
if (sock < 0)
|
|
return sock;
|
|
|
|
for (i = 0; i < N_PACKETS; i++) {
|
|
unsigned char buf[] = { 0xaa, 0xbb, 0xcc };
|
|
int n;
|
|
|
|
n = sendto(sock, buf, sizeof(buf), MSG_NOSIGNAL | MSG_CONFIRM,
|
|
(struct sockaddr *)&addr, sizeof(addr));
|
|
if (n != sizeof(buf)) {
|
|
close(sock);
|
|
return -EINVAL;
|
|
}
|
|
|
|
usleep(50000); /* 50ms */
|
|
}
|
|
close(sock);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void test_xdp_flowtable(void)
|
|
{
|
|
struct xdp_flowtable *skel = NULL;
|
|
struct nstoken *tok = NULL;
|
|
int iifindex, stats_fd;
|
|
__u32 value, key = 0;
|
|
struct bpf_link *link = NULL;
|
|
|
|
if (SYS_NOFAIL("nft -v")) {
|
|
fprintf(stdout, "Missing required nft tool\n");
|
|
test__skip();
|
|
return;
|
|
}
|
|
|
|
SYS(out, "ip netns add " TX_NETNS_NAME);
|
|
SYS(out, "ip netns add " RX_NETNS_NAME);
|
|
|
|
tok = open_netns(RX_NETNS_NAME);
|
|
if (!ASSERT_OK_PTR(tok, "setns"))
|
|
goto out;
|
|
|
|
SYS(out, "sysctl -qw net.ipv4.conf.all.forwarding=1");
|
|
|
|
SYS(out, "ip link add " TX_NAME " type veth peer " FORWARD_NAME);
|
|
SYS(out, "ip link set " TX_NAME " netns " TX_NETNS_NAME);
|
|
SYS(out, "ip link set dev " FORWARD_NAME " address " FORWARD_MAC);
|
|
SYS(out,
|
|
"ip addr add " FORWARD_ADDR "/" PREFIX_LEN " dev " FORWARD_NAME);
|
|
SYS(out, "ip link set dev " FORWARD_NAME " up");
|
|
|
|
SYS(out, "ip link add " RX_NAME " type dummy");
|
|
SYS(out, "ip link set dev " RX_NAME " address " RX_MAC);
|
|
SYS(out, "ip addr add " RX_ADDR "/" PREFIX_LEN " dev " RX_NAME);
|
|
SYS(out, "ip link set dev " RX_NAME " up");
|
|
|
|
/* configure the flowtable */
|
|
SYS(out, "nft add table ip filter");
|
|
SYS(out,
|
|
"nft add flowtable ip filter f { hook ingress priority 0\\; "
|
|
"devices = { " FORWARD_NAME ", " RX_NAME " }\\; }");
|
|
SYS(out,
|
|
"nft add chain ip filter forward "
|
|
"{ type filter hook forward priority 0\\; }");
|
|
SYS(out,
|
|
"nft add rule ip filter forward ip protocol udp th dport "
|
|
UDP_PORT_STR " flow add @f");
|
|
|
|
/* Avoid ARP calls */
|
|
SYS(out,
|
|
"ip -4 neigh add " DST_ADDR " lladdr " DST_MAC " dev " RX_NAME);
|
|
|
|
close_netns(tok);
|
|
tok = open_netns(TX_NETNS_NAME);
|
|
if (!ASSERT_OK_PTR(tok, "setns"))
|
|
goto out;
|
|
|
|
SYS(out, "ip addr add " TX_ADDR "/" PREFIX_LEN " dev " TX_NAME);
|
|
SYS(out, "ip link set dev " TX_NAME " address " TX_MAC);
|
|
SYS(out, "ip link set dev " TX_NAME " up");
|
|
SYS(out, "ip route add default via " FORWARD_ADDR);
|
|
|
|
close_netns(tok);
|
|
tok = open_netns(RX_NETNS_NAME);
|
|
if (!ASSERT_OK_PTR(tok, "setns"))
|
|
goto out;
|
|
|
|
iifindex = if_nametoindex(FORWARD_NAME);
|
|
if (!ASSERT_NEQ(iifindex, 0, "iifindex"))
|
|
goto out;
|
|
|
|
skel = xdp_flowtable__open_and_load();
|
|
if (!ASSERT_OK_PTR(skel, "skel"))
|
|
goto out;
|
|
|
|
link = bpf_program__attach_xdp(skel->progs.xdp_flowtable_do_lookup,
|
|
iifindex);
|
|
if (!ASSERT_OK_PTR(link, "prog_attach"))
|
|
goto out;
|
|
|
|
close_netns(tok);
|
|
tok = open_netns(TX_NETNS_NAME);
|
|
if (!ASSERT_OK_PTR(tok, "setns"))
|
|
goto out;
|
|
|
|
if (!ASSERT_OK(send_udp_traffic(), "send udp"))
|
|
goto out;
|
|
|
|
close_netns(tok);
|
|
tok = open_netns(RX_NETNS_NAME);
|
|
if (!ASSERT_OK_PTR(tok, "setns"))
|
|
goto out;
|
|
|
|
stats_fd = bpf_map__fd(skel->maps.stats);
|
|
if (!ASSERT_OK(bpf_map_lookup_elem(stats_fd, &key, &value),
|
|
"bpf_map_update_elem stats"))
|
|
goto out;
|
|
|
|
ASSERT_GE(value, N_PACKETS - 2, "bpf_xdp_flow_lookup failed");
|
|
out:
|
|
bpf_link__destroy(link);
|
|
xdp_flowtable__destroy(skel);
|
|
if (tok)
|
|
close_netns(tok);
|
|
SYS_NOFAIL("ip netns del " TX_NETNS_NAME);
|
|
SYS_NOFAIL("ip netns del " RX_NETNS_NAME);
|
|
}
|