1*61f8c9c8SFlorent Revest // SPDX-License-Identifier: GPL-2.0 2*61f8c9c8SFlorent Revest // Copyright (c) 2020 Google LLC. 3*61f8c9c8SFlorent Revest // Copyright (c) 2018 Facebook 4*61f8c9c8SFlorent Revest 5*61f8c9c8SFlorent Revest #include <test_progs.h> 6*61f8c9c8SFlorent Revest #include "socket_cookie_prog.skel.h" 7*61f8c9c8SFlorent Revest #include "network_helpers.h" 8*61f8c9c8SFlorent Revest 9*61f8c9c8SFlorent Revest static int duration; 10*61f8c9c8SFlorent Revest 11*61f8c9c8SFlorent Revest struct socket_cookie { 12*61f8c9c8SFlorent Revest __u64 cookie_key; 13*61f8c9c8SFlorent Revest __u32 cookie_value; 14*61f8c9c8SFlorent Revest }; 15*61f8c9c8SFlorent Revest 16*61f8c9c8SFlorent Revest void test_socket_cookie(void) 17*61f8c9c8SFlorent Revest { 18*61f8c9c8SFlorent Revest int server_fd = 0, client_fd = 0, cgroup_fd = 0, err = 0; 19*61f8c9c8SFlorent Revest socklen_t addr_len = sizeof(struct sockaddr_in6); 20*61f8c9c8SFlorent Revest struct socket_cookie_prog *skel; 21*61f8c9c8SFlorent Revest __u32 cookie_expected_value; 22*61f8c9c8SFlorent Revest struct sockaddr_in6 addr; 23*61f8c9c8SFlorent Revest struct socket_cookie val; 24*61f8c9c8SFlorent Revest 25*61f8c9c8SFlorent Revest skel = socket_cookie_prog__open_and_load(); 26*61f8c9c8SFlorent Revest if (!ASSERT_OK_PTR(skel, "skel_open")) 27*61f8c9c8SFlorent Revest return; 28*61f8c9c8SFlorent Revest 29*61f8c9c8SFlorent Revest cgroup_fd = test__join_cgroup("/socket_cookie"); 30*61f8c9c8SFlorent Revest if (CHECK(cgroup_fd < 0, "join_cgroup", "cgroup creation failed\n")) 31*61f8c9c8SFlorent Revest goto out; 32*61f8c9c8SFlorent Revest 33*61f8c9c8SFlorent Revest skel->links.set_cookie = bpf_program__attach_cgroup( 34*61f8c9c8SFlorent Revest skel->progs.set_cookie, cgroup_fd); 35*61f8c9c8SFlorent Revest if (!ASSERT_OK_PTR(skel->links.set_cookie, "prog_attach")) 36*61f8c9c8SFlorent Revest goto close_cgroup_fd; 37*61f8c9c8SFlorent Revest 38*61f8c9c8SFlorent Revest skel->links.update_cookie = bpf_program__attach_cgroup( 39*61f8c9c8SFlorent Revest skel->progs.update_cookie, cgroup_fd); 40*61f8c9c8SFlorent Revest if (!ASSERT_OK_PTR(skel->links.update_cookie, "prog_attach")) 41*61f8c9c8SFlorent Revest goto close_cgroup_fd; 42*61f8c9c8SFlorent Revest 43*61f8c9c8SFlorent Revest server_fd = start_server(AF_INET6, SOCK_STREAM, "::1", 0, 0); 44*61f8c9c8SFlorent Revest if (CHECK(server_fd < 0, "start_server", "errno %d\n", errno)) 45*61f8c9c8SFlorent Revest goto close_cgroup_fd; 46*61f8c9c8SFlorent Revest 47*61f8c9c8SFlorent Revest client_fd = connect_to_fd(server_fd, 0); 48*61f8c9c8SFlorent Revest if (CHECK(client_fd < 0, "connect_to_fd", "errno %d\n", errno)) 49*61f8c9c8SFlorent Revest goto close_server_fd; 50*61f8c9c8SFlorent Revest 51*61f8c9c8SFlorent Revest err = bpf_map_lookup_elem(bpf_map__fd(skel->maps.socket_cookies), 52*61f8c9c8SFlorent Revest &client_fd, &val); 53*61f8c9c8SFlorent Revest if (!ASSERT_OK(err, "map_lookup(socket_cookies)")) 54*61f8c9c8SFlorent Revest goto close_client_fd; 55*61f8c9c8SFlorent Revest 56*61f8c9c8SFlorent Revest err = getsockname(client_fd, (struct sockaddr *)&addr, &addr_len); 57*61f8c9c8SFlorent Revest if (!ASSERT_OK(err, "getsockname")) 58*61f8c9c8SFlorent Revest goto close_client_fd; 59*61f8c9c8SFlorent Revest 60*61f8c9c8SFlorent Revest cookie_expected_value = (ntohs(addr.sin6_port) << 8) | 0xFF; 61*61f8c9c8SFlorent Revest ASSERT_EQ(val.cookie_value, cookie_expected_value, "cookie_value"); 62*61f8c9c8SFlorent Revest 63*61f8c9c8SFlorent Revest close_client_fd: 64*61f8c9c8SFlorent Revest close(client_fd); 65*61f8c9c8SFlorent Revest close_server_fd: 66*61f8c9c8SFlorent Revest close(server_fd); 67*61f8c9c8SFlorent Revest close_cgroup_fd: 68*61f8c9c8SFlorent Revest close(cgroup_fd); 69*61f8c9c8SFlorent Revest out: 70*61f8c9c8SFlorent Revest socket_cookie_prog__destroy(skel); 71*61f8c9c8SFlorent Revest } 72