The patch adds a test to exercise the bpf_iter_udp batching logic. It specifically tests the case that there are multiple so_reuseport udp_sk in a bucket of the udp_table. The test creates two sets of so_reuseport sockets and each set on a different port. Meaning there will be two buckets in the udp_table. The test does the following: 1. read() 3 out of 4 sockets in the first bucket. 2. close() all sockets in the first bucket. This will ensure the current bucket's offset in the kernel does not affect the read() of the following bucket. 3. read() all 4 sockets in the second bucket. The test also reads one udp_sk at a time from the bpf_iter_udp prog. The true case in "do_test(..., bool onebyone)". This is the buggy case that the previous patch fixed. It also tests the "false" case in "do_test(..., bool onebyone)", meaning the userspace reads the whole bucket. There is no bug in this case but adding this test also while at it. Considering the way to have multiple tcp_sk in the same bucket is similar (by using so_reuseport), this patch also tests the bpf_iter_tcp even though the bpf_iter_tcp batching logic works correctly. Both IP v4 and v6 are exercising the same bpf_iter batching code path, so only v6 is tested. Acked-by: Yonghong Song <yonghong.song@linux.dev> Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org> Link: https://lore.kernel.org/r/20240112190530.3751661-4-martin.lau@linux.dev Signed-off-by: Alexei Starovoitov <ast@kernel.org>
106 lines
2.8 KiB
C
106 lines
2.8 KiB
C
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
|
|
#ifndef __BPF_TRACING_NET_H__
|
|
#define __BPF_TRACING_NET_H__
|
|
|
|
#define AF_INET 2
|
|
#define AF_INET6 10
|
|
|
|
#define SOL_SOCKET 1
|
|
#define SO_REUSEADDR 2
|
|
#define SO_SNDBUF 7
|
|
#define SO_RCVBUF 8
|
|
#define SO_KEEPALIVE 9
|
|
#define SO_PRIORITY 12
|
|
#define SO_REUSEPORT 15
|
|
#define SO_RCVLOWAT 18
|
|
#define SO_BINDTODEVICE 25
|
|
#define SO_MARK 36
|
|
#define SO_MAX_PACING_RATE 47
|
|
#define SO_BINDTOIFINDEX 62
|
|
#define SO_TXREHASH 74
|
|
#define __SO_ACCEPTCON (1 << 16)
|
|
|
|
#define IP_TOS 1
|
|
|
|
#define IPV6_TCLASS 67
|
|
#define IPV6_AUTOFLOWLABEL 70
|
|
|
|
#define TC_ACT_UNSPEC (-1)
|
|
#define TC_ACT_OK 0
|
|
#define TC_ACT_SHOT 2
|
|
|
|
#define SOL_TCP 6
|
|
#define TCP_NODELAY 1
|
|
#define TCP_MAXSEG 2
|
|
#define TCP_KEEPIDLE 4
|
|
#define TCP_KEEPINTVL 5
|
|
#define TCP_KEEPCNT 6
|
|
#define TCP_SYNCNT 7
|
|
#define TCP_WINDOW_CLAMP 10
|
|
#define TCP_CONGESTION 13
|
|
#define TCP_THIN_LINEAR_TIMEOUTS 16
|
|
#define TCP_USER_TIMEOUT 18
|
|
#define TCP_NOTSENT_LOWAT 25
|
|
#define TCP_SAVE_SYN 27
|
|
#define TCP_SAVED_SYN 28
|
|
#define TCP_CA_NAME_MAX 16
|
|
#define TCP_NAGLE_OFF 1
|
|
|
|
#define ICSK_TIME_RETRANS 1
|
|
#define ICSK_TIME_PROBE0 3
|
|
#define ICSK_TIME_LOSS_PROBE 5
|
|
#define ICSK_TIME_REO_TIMEOUT 6
|
|
|
|
#define ETH_HLEN 14
|
|
#define ETH_P_IPV6 0x86DD
|
|
|
|
#define CHECKSUM_NONE 0
|
|
#define CHECKSUM_PARTIAL 3
|
|
|
|
#define IFNAMSIZ 16
|
|
|
|
#define RTF_GATEWAY 0x0002
|
|
|
|
#define TCP_INFINITE_SSTHRESH 0x7fffffff
|
|
#define TCP_PINGPONG_THRESH 3
|
|
|
|
#define fib_nh_dev nh_common.nhc_dev
|
|
#define fib_nh_gw_family nh_common.nhc_gw_family
|
|
#define fib_nh_gw6 nh_common.nhc_gw.ipv6
|
|
|
|
#define inet_daddr sk.__sk_common.skc_daddr
|
|
#define inet_rcv_saddr sk.__sk_common.skc_rcv_saddr
|
|
#define inet_dport sk.__sk_common.skc_dport
|
|
|
|
#define udp_portaddr_hash inet.sk.__sk_common.skc_u16hashes[1]
|
|
|
|
#define ir_loc_addr req.__req_common.skc_rcv_saddr
|
|
#define ir_num req.__req_common.skc_num
|
|
#define ir_rmt_addr req.__req_common.skc_daddr
|
|
#define ir_rmt_port req.__req_common.skc_dport
|
|
#define ir_v6_rmt_addr req.__req_common.skc_v6_daddr
|
|
#define ir_v6_loc_addr req.__req_common.skc_v6_rcv_saddr
|
|
|
|
#define sk_num __sk_common.skc_num
|
|
#define sk_dport __sk_common.skc_dport
|
|
#define sk_family __sk_common.skc_family
|
|
#define sk_rmem_alloc sk_backlog.rmem_alloc
|
|
#define sk_refcnt __sk_common.skc_refcnt
|
|
#define sk_state __sk_common.skc_state
|
|
#define sk_net __sk_common.skc_net
|
|
#define sk_v6_daddr __sk_common.skc_v6_daddr
|
|
#define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr
|
|
#define sk_flags __sk_common.skc_flags
|
|
#define sk_reuse __sk_common.skc_reuse
|
|
#define sk_cookie __sk_common.skc_cookie
|
|
|
|
#define s6_addr32 in6_u.u6_addr32
|
|
|
|
#define tw_daddr __tw_common.skc_daddr
|
|
#define tw_rcv_saddr __tw_common.skc_rcv_saddr
|
|
#define tw_dport __tw_common.skc_dport
|
|
#define tw_refcnt __tw_common.skc_refcnt
|
|
#define tw_v6_daddr __tw_common.skc_v6_daddr
|
|
#define tw_v6_rcv_saddr __tw_common.skc_v6_rcv_saddr
|
|
|
|
#endif
|