xref: /linux/tools/testing/selftests/bpf/xdp_lb_bench_common.h (revision 0eaed89c18aeedf0898baf2dbf5ff027c6795152)
1*6b4003a7SPuranjay Mohan /* SPDX-License-Identifier: GPL-2.0 */
2*6b4003a7SPuranjay Mohan /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
3*6b4003a7SPuranjay Mohan 
4*6b4003a7SPuranjay Mohan #ifndef XDP_LB_BENCH_COMMON_H
5*6b4003a7SPuranjay Mohan #define XDP_LB_BENCH_COMMON_H
6*6b4003a7SPuranjay Mohan 
7*6b4003a7SPuranjay Mohan #define F_IPV6		(1 << 0)
8*6b4003a7SPuranjay Mohan #define F_LRU_BYPASS	(1 << 1)
9*6b4003a7SPuranjay Mohan 
10*6b4003a7SPuranjay Mohan #define CH_RING_SIZE	65537		/* per-VIP consistent hash ring slots */
11*6b4003a7SPuranjay Mohan #define MAX_VIPS	16
12*6b4003a7SPuranjay Mohan #define CH_RINGS_SIZE	(MAX_VIPS * CH_RING_SIZE)
13*6b4003a7SPuranjay Mohan #define MAX_REALS	512
14*6b4003a7SPuranjay Mohan #define DEFAULT_LRU_SIZE 100000		/* connection tracking cache size */
15*6b4003a7SPuranjay Mohan #define ONE_SEC		1000000000U	/* 1 sec in nanosec */
16*6b4003a7SPuranjay Mohan #define MAX_CONN_RATE	100000000	/* high enough to never trigger in bench */
17*6b4003a7SPuranjay Mohan #define LRU_UDP_TIMEOUT	30000000000ULL	/* 30 sec in nanosec */
18*6b4003a7SPuranjay Mohan #define PCKT_FRAGMENTED	0x3FFF
19*6b4003a7SPuranjay Mohan #define KNUTH_HASH_MULT	2654435761U
20*6b4003a7SPuranjay Mohan #define IPIP_V4_PREFIX	4268		/* 172.16/12 in network order */
21*6b4003a7SPuranjay Mohan #define IPIP_V6_PREFIX1	1		/* 0100::/64 (RFC 6666 discard) */
22*6b4003a7SPuranjay Mohan #define IPIP_V6_PREFIX2	0
23*6b4003a7SPuranjay Mohan #define IPIP_V6_PREFIX3	0
24*6b4003a7SPuranjay Mohan 
25*6b4003a7SPuranjay Mohan /* Stats indices (0..MAX_VIPS-1 are per-VIP packet/byte counters) */
26*6b4003a7SPuranjay Mohan #define STATS_LRU	(MAX_VIPS + 0)	/* v1: total VIP packets, v2: LRU misses */
27*6b4003a7SPuranjay Mohan #define STATS_XDP_TX	(MAX_VIPS + 1)
28*6b4003a7SPuranjay Mohan #define STATS_XDP_PASS	(MAX_VIPS + 2)
29*6b4003a7SPuranjay Mohan #define STATS_XDP_DROP	(MAX_VIPS + 3)
30*6b4003a7SPuranjay Mohan #define STATS_NEW_CONN	(MAX_VIPS + 4)	/* v1: conn count, v2: last reset ts */
31*6b4003a7SPuranjay Mohan #define STATS_LRU_MISS	(MAX_VIPS + 5)	/* v1: TCP LRU misses */
32*6b4003a7SPuranjay Mohan #define STATS_SIZE	(MAX_VIPS + 6)
33*6b4003a7SPuranjay Mohan 
34*6b4003a7SPuranjay Mohan #ifdef __BPF__
35*6b4003a7SPuranjay Mohan #define lb_htons(x)	bpf_htons(x)
36*6b4003a7SPuranjay Mohan #define LB_INLINE	static __always_inline
37*6b4003a7SPuranjay Mohan #else
38*6b4003a7SPuranjay Mohan #define lb_htons(x)	htons(x)
39*6b4003a7SPuranjay Mohan #define LB_INLINE	static inline
40*6b4003a7SPuranjay Mohan #endif
41*6b4003a7SPuranjay Mohan 
42*6b4003a7SPuranjay Mohan LB_INLINE __be32 create_encap_ipv4_src(__u16 port, __be32 src)
43*6b4003a7SPuranjay Mohan {
44*6b4003a7SPuranjay Mohan 	__u32 ip_suffix = lb_htons(port);
45*6b4003a7SPuranjay Mohan 
46*6b4003a7SPuranjay Mohan 	ip_suffix <<= 16;
47*6b4003a7SPuranjay Mohan 	ip_suffix ^= src;
48*6b4003a7SPuranjay Mohan 	return (0xFFFF0000 & ip_suffix) | IPIP_V4_PREFIX;
49*6b4003a7SPuranjay Mohan }
50*6b4003a7SPuranjay Mohan 
51*6b4003a7SPuranjay Mohan LB_INLINE void create_encap_ipv6_src(__u16 port, __be32 src, __be32 *saddr)
52*6b4003a7SPuranjay Mohan {
53*6b4003a7SPuranjay Mohan 	saddr[0] = IPIP_V6_PREFIX1;
54*6b4003a7SPuranjay Mohan 	saddr[1] = IPIP_V6_PREFIX2;
55*6b4003a7SPuranjay Mohan 	saddr[2] = IPIP_V6_PREFIX3;
56*6b4003a7SPuranjay Mohan 	saddr[3] = src ^ port;
57*6b4003a7SPuranjay Mohan }
58*6b4003a7SPuranjay Mohan 
59*6b4003a7SPuranjay Mohan struct flow_key {
60*6b4003a7SPuranjay Mohan 	union {
61*6b4003a7SPuranjay Mohan 		__be32 src;
62*6b4003a7SPuranjay Mohan 		__be32 srcv6[4];
63*6b4003a7SPuranjay Mohan 	};
64*6b4003a7SPuranjay Mohan 	union {
65*6b4003a7SPuranjay Mohan 		__be32 dst;
66*6b4003a7SPuranjay Mohan 		__be32 dstv6[4];
67*6b4003a7SPuranjay Mohan 	};
68*6b4003a7SPuranjay Mohan 	union {
69*6b4003a7SPuranjay Mohan 		__u32 ports;
70*6b4003a7SPuranjay Mohan 		__u16 port16[2];
71*6b4003a7SPuranjay Mohan 	};
72*6b4003a7SPuranjay Mohan 	__u8 proto;
73*6b4003a7SPuranjay Mohan 	__u8 pad[3];
74*6b4003a7SPuranjay Mohan };
75*6b4003a7SPuranjay Mohan 
76*6b4003a7SPuranjay Mohan struct vip_definition {
77*6b4003a7SPuranjay Mohan 	union {
78*6b4003a7SPuranjay Mohan 		__be32 vip;
79*6b4003a7SPuranjay Mohan 		__be32 vipv6[4];
80*6b4003a7SPuranjay Mohan 	};
81*6b4003a7SPuranjay Mohan 	__u16 port;
82*6b4003a7SPuranjay Mohan 	__u8 proto;
83*6b4003a7SPuranjay Mohan 	__u8 pad;
84*6b4003a7SPuranjay Mohan };
85*6b4003a7SPuranjay Mohan 
86*6b4003a7SPuranjay Mohan struct vip_meta {
87*6b4003a7SPuranjay Mohan 	__u32 flags;
88*6b4003a7SPuranjay Mohan 	__u32 vip_num;
89*6b4003a7SPuranjay Mohan };
90*6b4003a7SPuranjay Mohan 
91*6b4003a7SPuranjay Mohan struct real_pos_lru {
92*6b4003a7SPuranjay Mohan 	__u32 pos;
93*6b4003a7SPuranjay Mohan 	__u64 atime;
94*6b4003a7SPuranjay Mohan };
95*6b4003a7SPuranjay Mohan 
96*6b4003a7SPuranjay Mohan struct real_definition {
97*6b4003a7SPuranjay Mohan 	__be32 dst;
98*6b4003a7SPuranjay Mohan 	__be32 dstv6[4];
99*6b4003a7SPuranjay Mohan 	__u8   flags;
100*6b4003a7SPuranjay Mohan };
101*6b4003a7SPuranjay Mohan 
102*6b4003a7SPuranjay Mohan struct lb_stats {
103*6b4003a7SPuranjay Mohan 	__u64 v1;
104*6b4003a7SPuranjay Mohan 	__u64 v2;
105*6b4003a7SPuranjay Mohan };
106*6b4003a7SPuranjay Mohan 
107*6b4003a7SPuranjay Mohan struct ctl_value {
108*6b4003a7SPuranjay Mohan 	__u8 mac[6];
109*6b4003a7SPuranjay Mohan 	__u8 pad[2];
110*6b4003a7SPuranjay Mohan };
111*6b4003a7SPuranjay Mohan 
112*6b4003a7SPuranjay Mohan #endif /* XDP_LB_BENCH_COMMON_H */
113