xref: /linux/tools/testing/selftests/bpf/prog_tests/test_dst_clear.c (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
1*64c535dbSJakub Kicinski // SPDX-License-Identifier: GPL-2.0
2*64c535dbSJakub Kicinski /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
3*64c535dbSJakub Kicinski 
4*64c535dbSJakub Kicinski #include <sys/types.h>
5*64c535dbSJakub Kicinski #include <sys/socket.h>
6*64c535dbSJakub Kicinski #include <net/if.h>
7*64c535dbSJakub Kicinski 
8*64c535dbSJakub Kicinski #include "test_progs.h"
9*64c535dbSJakub Kicinski #include "network_helpers.h"
10*64c535dbSJakub Kicinski #include "test_dst_clear.skel.h"
11*64c535dbSJakub Kicinski 
12*64c535dbSJakub Kicinski #define IPV4_IFACE_ADDR "1.0.0.1"
13*64c535dbSJakub Kicinski #define UDP_TEST_PORT 7777
14*64c535dbSJakub Kicinski 
15*64c535dbSJakub Kicinski void test_ns_dst_clear(void)
16*64c535dbSJakub Kicinski {
17*64c535dbSJakub Kicinski 	LIBBPF_OPTS(bpf_tcx_opts, tcx_opts);
18*64c535dbSJakub Kicinski 	struct test_dst_clear *skel;
19*64c535dbSJakub Kicinski 	struct sockaddr_in addr;
20*64c535dbSJakub Kicinski 	struct bpf_link *link;
21*64c535dbSJakub Kicinski 	socklen_t addrlen;
22*64c535dbSJakub Kicinski 	char buf[128] = {};
23*64c535dbSJakub Kicinski 	int sockfd, err;
24*64c535dbSJakub Kicinski 
25*64c535dbSJakub Kicinski 	skel = test_dst_clear__open_and_load();
26*64c535dbSJakub Kicinski 	if (!ASSERT_OK_PTR(skel, "skel open_and_load"))
27*64c535dbSJakub Kicinski 		return;
28*64c535dbSJakub Kicinski 
29*64c535dbSJakub Kicinski 	SYS(fail, "ip addr add %s/8 dev lo", IPV4_IFACE_ADDR);
30*64c535dbSJakub Kicinski 
31*64c535dbSJakub Kicinski 	link = bpf_program__attach_tcx(skel->progs.dst_clear,
32*64c535dbSJakub Kicinski 				       if_nametoindex("lo"), &tcx_opts);
33*64c535dbSJakub Kicinski 	if (!ASSERT_OK_PTR(link, "attach_tcx"))
34*64c535dbSJakub Kicinski 		goto fail;
35*64c535dbSJakub Kicinski 	skel->links.dst_clear = link;
36*64c535dbSJakub Kicinski 
37*64c535dbSJakub Kicinski 	addrlen = sizeof(addr);
38*64c535dbSJakub Kicinski 	err = make_sockaddr(AF_INET, IPV4_IFACE_ADDR, UDP_TEST_PORT,
39*64c535dbSJakub Kicinski 			    (void *)&addr, &addrlen);
40*64c535dbSJakub Kicinski 	if (!ASSERT_OK(err, "make_sockaddr"))
41*64c535dbSJakub Kicinski 		goto fail;
42*64c535dbSJakub Kicinski 	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
43*64c535dbSJakub Kicinski 	if (!ASSERT_NEQ(sockfd, -1, "socket"))
44*64c535dbSJakub Kicinski 		goto fail;
45*64c535dbSJakub Kicinski 	err = sendto(sockfd, buf, sizeof(buf), 0, (void *)&addr, addrlen);
46*64c535dbSJakub Kicinski 	close(sockfd);
47*64c535dbSJakub Kicinski 	if (!ASSERT_EQ(err, sizeof(buf), "send"))
48*64c535dbSJakub Kicinski 		goto fail;
49*64c535dbSJakub Kicinski 
50*64c535dbSJakub Kicinski 	ASSERT_TRUE(skel->bss->had_dst, "had_dst");
51*64c535dbSJakub Kicinski 	ASSERT_TRUE(skel->bss->dst_cleared, "dst_cleared");
52*64c535dbSJakub Kicinski 
53*64c535dbSJakub Kicinski fail:
54*64c535dbSJakub Kicinski 	test_dst_clear__destroy(skel);
55*64c535dbSJakub Kicinski }
56