155714Skris// SPDX-License-Identifier: GPL-2.0 255714Skris 355714Skris#include <test_progs.h> 455714Skris#include "netns_cookie_prog.skel.h" 555714Skris#include "network_helpers.h" 655714Skris 755714Skris#ifndef SO_NETNS_COOKIE 855714Skris#define SO_NETNS_COOKIE 71 955714Skris#endif 1055714Skris 1155714Skrisstatic int duration; 1255714Skris 1355714Skrisvoid test_netns_cookie(void) 1455714Skris{ 1555714Skris int server_fd = -1, client_fd = -1, cgroup_fd = -1; 1655714Skris int err, val, ret, map, verdict; 1755714Skris struct netns_cookie_prog *skel; 1855714Skris uint64_t cookie_expected_value; 1955714Skris socklen_t vallen = sizeof(cookie_expected_value); 2055714Skris static const char send_msg[] = "message"; 2155714Skris 2255714Skris skel = netns_cookie_prog__open_and_load(); 2355714Skris if (!ASSERT_OK_PTR(skel, "skel_open")) 2455714Skris return; 2555714Skris 2655714Skris cgroup_fd = test__join_cgroup("/netns_cookie"); 2755714Skris if (CHECK(cgroup_fd < 0, "join_cgroup", "cgroup creation failed\n")) 2855714Skris goto done; 2955714Skris 3055714Skris skel->links.get_netns_cookie_sockops = bpf_program__attach_cgroup( 3155714Skris skel->progs.get_netns_cookie_sockops, cgroup_fd); 3255714Skris if (!ASSERT_OK_PTR(skel->links.get_netns_cookie_sockops, "prog_attach")) 3355714Skris goto done; 3455714Skris 3555714Skris verdict = bpf_program__fd(skel->progs.get_netns_cookie_sk_msg); 3655714Skris map = bpf_map__fd(skel->maps.sock_map); 3755714Skris err = bpf_prog_attach(verdict, map, BPF_SK_MSG_VERDICT, 0); 3855714Skris if (!ASSERT_OK(err, "prog_attach")) 3955714Skris goto done; 4055714Skris 4155714Skris server_fd = start_server(AF_INET6, SOCK_STREAM, "::1", 0, 0); 4255714Skris if (CHECK(server_fd < 0, "start_server", "errno %d\n", errno)) 4355714Skris goto done; 4455714Skris 4555714Skris client_fd = connect_to_fd(server_fd, 0); 4655714Skris if (CHECK(client_fd < 0, "connect_to_fd", "errno %d\n", errno)) 4755714Skris goto done; 4855714Skris 4955714Skris ret = send(client_fd, send_msg, sizeof(send_msg), 0); 5055714Skris if (CHECK(ret != sizeof(send_msg), "send(msg)", "ret:%d\n", ret)) 5155714Skris goto done; 5255714Skris 5355714Skris err = bpf_map_lookup_elem(bpf_map__fd(skel->maps.sockops_netns_cookies), 5455714Skris &client_fd, &val); 5555714Skris if (!ASSERT_OK(err, "map_lookup(sockops_netns_cookies)")) 5655714Skris goto done; 5755714Skris 5855714Skris err = getsockopt(client_fd, SOL_SOCKET, SO_NETNS_COOKIE, 5955714Skris &cookie_expected_value, &vallen); 6055714Skris if (!ASSERT_OK(err, "getsockopt")) 6155714Skris goto done; 6255714Skris 6355714Skris ASSERT_EQ(val, cookie_expected_value, "cookie_value"); 6455714Skris 6555714Skris err = bpf_map_lookup_elem(bpf_map__fd(skel->maps.sk_msg_netns_cookies), 6655714Skris &client_fd, &val); 6755714Skris if (!ASSERT_OK(err, "map_lookup(sk_msg_netns_cookies)")) 6855714Skris goto done; 6955714Skris 7068651Skris ASSERT_EQ(val, cookie_expected_value, "cookie_value"); 7168651Skris 7268651Skrisdone: 7368651Skris if (server_fd != -1) 7455714Skris close(server_fd); 7555714Skris if (client_fd != -1) 7655714Skris close(client_fd); 7755714Skris if (cgroup_fd != -1) 7855714Skris close(cgroup_fd); 7955714Skris netns_cookie_prog__destroy(skel); 8055714Skris} 8155714Skris