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