1f2a6ee92SPrankur Gupta // SPDX-License-Identifier: GPL-2.0
2f2a6ee92SPrankur Gupta /* Copyright (c) 2021 Facebook */
3f2a6ee92SPrankur Gupta #include <test_progs.h>
4f2a6ee92SPrankur Gupta #include <netinet/tcp.h>
5f2a6ee92SPrankur Gupta #include "sockopt_qos_to_cc.skel.h"
6f2a6ee92SPrankur Gupta 
run_setsockopt_test(int cg_fd,int sock_fd)7f2a6ee92SPrankur Gupta static void run_setsockopt_test(int cg_fd, int sock_fd)
8f2a6ee92SPrankur Gupta {
9f2a6ee92SPrankur Gupta 	socklen_t optlen;
10f2a6ee92SPrankur Gupta 	char cc[16]; /* TCP_CA_NAME_MAX */
11f2a6ee92SPrankur Gupta 	int buf;
12f2a6ee92SPrankur Gupta 	int err = -1;
13f2a6ee92SPrankur Gupta 
14f2a6ee92SPrankur Gupta 	buf = 0x2D;
15f2a6ee92SPrankur Gupta 	err = setsockopt(sock_fd, SOL_IPV6, IPV6_TCLASS, &buf, sizeof(buf));
16f2a6ee92SPrankur Gupta 	if (!ASSERT_OK(err, "setsockopt(sock_fd, IPV6_TCLASS)"))
17f2a6ee92SPrankur Gupta 		return;
18f2a6ee92SPrankur Gupta 
19f2a6ee92SPrankur Gupta 	/* Verify the setsockopt cc change */
20f2a6ee92SPrankur Gupta 	optlen = sizeof(cc);
21f2a6ee92SPrankur Gupta 	err = getsockopt(sock_fd, SOL_TCP, TCP_CONGESTION, cc, &optlen);
22f2a6ee92SPrankur Gupta 	if (!ASSERT_OK(err, "getsockopt(sock_fd, TCP_CONGESTION)"))
23f2a6ee92SPrankur Gupta 		return;
24f2a6ee92SPrankur Gupta 
25f2a6ee92SPrankur Gupta 	if (!ASSERT_STREQ(cc, "reno", "getsockopt(sock_fd, TCP_CONGESTION)"))
26f2a6ee92SPrankur Gupta 		return;
27f2a6ee92SPrankur Gupta }
28f2a6ee92SPrankur Gupta 
test_sockopt_qos_to_cc(void)29f2a6ee92SPrankur Gupta void test_sockopt_qos_to_cc(void)
30f2a6ee92SPrankur Gupta {
31f2a6ee92SPrankur Gupta 	struct sockopt_qos_to_cc *skel;
32f2a6ee92SPrankur Gupta 	char cc_cubic[16] = "cubic"; /* TCP_CA_NAME_MAX */
33f2a6ee92SPrankur Gupta 	int cg_fd = -1;
34f2a6ee92SPrankur Gupta 	int sock_fd = -1;
35f2a6ee92SPrankur Gupta 	int err;
36f2a6ee92SPrankur Gupta 
37f2a6ee92SPrankur Gupta 	cg_fd = test__join_cgroup("/sockopt_qos_to_cc");
38f2a6ee92SPrankur Gupta 	if (!ASSERT_GE(cg_fd, 0, "cg-join(sockopt_qos_to_cc)"))
39f2a6ee92SPrankur Gupta 		return;
40f2a6ee92SPrankur Gupta 
41f2a6ee92SPrankur Gupta 	skel = sockopt_qos_to_cc__open_and_load();
42f2a6ee92SPrankur Gupta 	if (!ASSERT_OK_PTR(skel, "skel"))
43f2a6ee92SPrankur Gupta 		goto done;
44f2a6ee92SPrankur Gupta 
45*e01b4a72SStanislav Fomichev 	skel->bss->page_size = sysconf(_SC_PAGESIZE);
46*e01b4a72SStanislav Fomichev 
47f2a6ee92SPrankur Gupta 	sock_fd = socket(AF_INET6, SOCK_STREAM, 0);
48f2a6ee92SPrankur Gupta 	if (!ASSERT_GE(sock_fd, 0, "v6 socket open"))
49f2a6ee92SPrankur Gupta 		goto done;
50f2a6ee92SPrankur Gupta 
51f2a6ee92SPrankur Gupta 	err = setsockopt(sock_fd, SOL_TCP, TCP_CONGESTION, &cc_cubic,
52f2a6ee92SPrankur Gupta 			 sizeof(cc_cubic));
53f2a6ee92SPrankur Gupta 	if (!ASSERT_OK(err, "setsockopt(sock_fd, TCP_CONGESTION)"))
54f2a6ee92SPrankur Gupta 		goto done;
55f2a6ee92SPrankur Gupta 
56f2a6ee92SPrankur Gupta 	skel->links.sockopt_qos_to_cc =
57f2a6ee92SPrankur Gupta 		bpf_program__attach_cgroup(skel->progs.sockopt_qos_to_cc,
58f2a6ee92SPrankur Gupta 					   cg_fd);
59f2a6ee92SPrankur Gupta 	if (!ASSERT_OK_PTR(skel->links.sockopt_qos_to_cc,
60f2a6ee92SPrankur Gupta 			   "prog_attach(sockopt_qos_to_cc)"))
61f2a6ee92SPrankur Gupta 		goto done;
62f2a6ee92SPrankur Gupta 
63f2a6ee92SPrankur Gupta 	run_setsockopt_test(cg_fd, sock_fd);
64f2a6ee92SPrankur Gupta 
65f2a6ee92SPrankur Gupta done:
66f2a6ee92SPrankur Gupta 	if (sock_fd != -1)
67f2a6ee92SPrankur Gupta 		close(sock_fd);
68f2a6ee92SPrankur Gupta 	if (cg_fd != -1)
69f2a6ee92SPrankur Gupta 		close(cg_fd);
70f2a6ee92SPrankur Gupta 	/* destroy can take null and error pointer */
71f2a6ee92SPrankur Gupta 	sockopt_qos_to_cc__destroy(skel);
72f2a6ee92SPrankur Gupta }
73