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