Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: Add Userspace tests for TCP_WINDOW_CLAMP

Adding selftests for new added functionality to set TCP_WINDOW_CLAMP
from bpf setsockopt.

Signed-off-by: Prankur gupta <prankgup@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20201202213152.435886-3-prankgup@fb.com

authored by

Prankur gupta and committed by
Alexei Starovoitov
55144f31 cb811109

+40
+1
tools/testing/selftests/bpf/bpf_tcp_helpers.h
··· 56 56 __u32 rcv_nxt; 57 57 __u32 snd_nxt; 58 58 __u32 snd_una; 59 + __u32 window_clamp; 59 60 __u8 ecn_flags; 60 61 __u32 delivered; 61 62 __u32 delivered_ce;
+4
tools/testing/selftests/bpf/prog_tests/tcpbpf_user.c
··· 42 42 43 43 /* check getsockopt for SAVED_SYN */ 44 44 ASSERT_EQ(result->tcp_saved_syn, 1, "tcp_saved_syn"); 45 + 46 + /* check getsockopt for window_clamp */ 47 + ASSERT_EQ(result->window_clamp_client, 9216, "window_clamp_client"); 48 + ASSERT_EQ(result->window_clamp_server, 9216, "window_clamp_server"); 45 49 } 46 50 47 51 static void run_test(struct tcpbpf_globals *result)
+33
tools/testing/selftests/bpf/progs/test_tcpbpf_kern.c
··· 12 12 #include <linux/tcp.h> 13 13 #include <bpf/bpf_helpers.h> 14 14 #include <bpf/bpf_endian.h> 15 + #include "bpf_tcp_helpers.h" 15 16 #include "test_tcpbpf.h" 16 17 17 18 struct tcpbpf_globals global = {}; 18 19 int _version SEC("version") = 1; 20 + 21 + /** 22 + * SOL_TCP is defined in <netinet/tcp.h> while 23 + * TCP_SAVED_SYN is defined in already included <linux/tcp.h> 24 + */ 25 + #ifndef SOL_TCP 26 + #define SOL_TCP 6 27 + #endif 28 + 29 + static __always_inline int get_tp_window_clamp(struct bpf_sock_ops *skops) 30 + { 31 + struct bpf_sock *sk; 32 + struct tcp_sock *tp; 33 + 34 + sk = skops->sk; 35 + if (!sk) 36 + return -1; 37 + tp = bpf_skc_to_tcp_sock(sk); 38 + if (!tp) 39 + return -1; 40 + return tp->window_clamp; 41 + } 19 42 20 43 SEC("sockops") 21 44 int bpf_testcb(struct bpf_sock_ops *skops) ··· 46 23 char header[sizeof(struct ipv6hdr) + sizeof(struct tcphdr)]; 47 24 struct bpf_sock_ops *reuse = skops; 48 25 struct tcphdr *thdr; 26 + int window_clamp = 9216; 49 27 int good_call_rv = 0; 50 28 int bad_call_rv = 0; 51 29 int save_syn = 1; ··· 99 75 global.event_map |= (1 << op); 100 76 101 77 switch (op) { 78 + case BPF_SOCK_OPS_TCP_CONNECT_CB: 79 + rv = bpf_setsockopt(skops, SOL_TCP, TCP_WINDOW_CLAMP, 80 + &window_clamp, sizeof(window_clamp)); 81 + global.window_clamp_client = get_tp_window_clamp(skops); 82 + break; 102 83 case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: 103 84 /* Test failure to set largest cb flag (assumes not defined) */ 104 85 global.bad_cb_test_rv = bpf_sock_ops_cb_flags_set(skops, 0x80); ··· 129 100 global.tcp_saved_syn = v; 130 101 } 131 102 } 103 + rv = bpf_setsockopt(skops, SOL_TCP, TCP_WINDOW_CLAMP, 104 + &window_clamp, sizeof(window_clamp)); 105 + 106 + global.window_clamp_server = get_tp_window_clamp(skops); 132 107 break; 133 108 case BPF_SOCK_OPS_RTO_CB: 134 109 break;
+2
tools/testing/selftests/bpf/test_tcpbpf.h
··· 16 16 __u32 num_close_events; 17 17 __u32 tcp_save_syn; 18 18 __u32 tcp_saved_syn; 19 + __u32 window_clamp_client; 20 + __u32 window_clamp_server; 19 21 }; 20 22 #endif