1 /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2 #ifndef __BPF_TRACING_NET_H__
3 #define __BPF_TRACING_NET_H__
6 #include <bpf/bpf_core_read.h>
12 #define SO_REUSEADDR 2
15 #define SO_KEEPALIVE 9
16 #define SO_PRIORITY 12
17 #define SO_REUSEPORT 15
18 #define SO_RCVLOWAT 18
19 #define SO_BINDTODEVICE 25
21 #define SO_MAX_PACING_RATE 47
22 #define SO_BINDTOIFINDEX 62
23 #define SO_TXREHASH 74
24 #define __SO_ACCEPTCON (1 << 16)
29 #define IPV6_TCLASS 67
30 #define IPV6_AUTOFLOWLABEL 70
32 #define TC_ACT_UNSPEC (-1)
39 #define TCP_KEEPIDLE 4
40 #define TCP_KEEPINTVL 5
43 #define TCP_WINDOW_CLAMP 10
44 #define TCP_CONGESTION 13
45 #define TCP_THIN_LINEAR_TIMEOUTS 16
46 #define TCP_USER_TIMEOUT 18
47 #define TCP_NOTSENT_LOWAT 25
48 #define TCP_SAVE_SYN 27
49 #define TCP_SAVED_SYN 28
50 #define TCP_CA_NAME_MAX 16
51 #define TCP_NAGLE_OFF 1
54 #define TCP_ECN_QUEUE_CWR 2
55 #define TCP_ECN_DEMAND_CWR 4
56 #define TCP_ECN_SEEN 8
58 #define TCP_CONG_NEEDS_ECN 0x2
60 #define ICSK_TIME_RETRANS 1
61 #define ICSK_TIME_PROBE0 3
62 #define ICSK_TIME_LOSS_PROBE 5
63 #define ICSK_TIME_REO_TIMEOUT 6
67 #define ETH_P_IP 0x0800
68 #define ETH_P_IPV6 0x86DD
75 #define TCPOPT_WINDOW 3
76 #define TCPOPT_TIMESTAMP 8
77 #define TCPOPT_SACK_PERM 4
80 #define TCPOLEN_WINDOW 3
81 #define TCPOLEN_TIMESTAMP 10
82 #define TCPOLEN_SACK_PERM 2
84 #define CHECKSUM_NONE 0
85 #define CHECKSUM_PARTIAL 3
89 #define RTF_GATEWAY 0x0002
91 #define TCP_INFINITE_SSTHRESH 0x7fffffff
92 #define TCP_PINGPONG_THRESH 3
94 #define FLAG_DATA_ACKED 0x04 /* This ACK acknowledged new data. */
95 #define FLAG_SYN_ACKED 0x10 /* This ACK acknowledged SYN. */
96 #define FLAG_DATA_SACKED 0x20 /* New SACK. */
97 #define FLAG_SND_UNA_ADVANCED \
98 0x400 /* Snd_una was changed (!= FLAG_DATA_ACKED) */
99 #define FLAG_ACKED (FLAG_DATA_ACKED | FLAG_SYN_ACKED)
100 #define FLAG_FORWARD_PROGRESS (FLAG_ACKED | FLAG_DATA_SACKED)
102 #define fib_nh_dev nh_common.nhc_dev
103 #define fib_nh_gw_family nh_common.nhc_gw_family
104 #define fib_nh_gw6 nh_common.nhc_gw.ipv6
106 #define inet_daddr sk.__sk_common.skc_daddr
107 #define inet_rcv_saddr sk.__sk_common.skc_rcv_saddr
108 #define inet_dport sk.__sk_common.skc_dport
110 #define udp_portaddr_hash inet.sk.__sk_common.skc_u16hashes[1]
112 #define ir_loc_addr req.__req_common.skc_rcv_saddr
113 #define ir_num req.__req_common.skc_num
114 #define ir_rmt_addr req.__req_common.skc_daddr
115 #define ir_rmt_port req.__req_common.skc_dport
116 #define ir_v6_rmt_addr req.__req_common.skc_v6_daddr
117 #define ir_v6_loc_addr req.__req_common.skc_v6_rcv_saddr
119 #define sk_num __sk_common.skc_num
120 #define sk_dport __sk_common.skc_dport
121 #define sk_family __sk_common.skc_family
122 #define sk_rmem_alloc sk_backlog.rmem_alloc
123 #define sk_refcnt __sk_common.skc_refcnt
124 #define sk_state __sk_common.skc_state
125 #define sk_net __sk_common.skc_net
126 #define sk_v6_daddr __sk_common.skc_v6_daddr
127 #define sk_v6_rcv_saddr __sk_common.skc_v6_rcv_saddr
128 #define sk_flags __sk_common.skc_flags
129 #define sk_reuse __sk_common.skc_reuse
130 #define sk_cookie __sk_common.skc_cookie
132 #define s6_addr32 in6_u.u6_addr32
134 #define tw_daddr __tw_common.skc_daddr
135 #define tw_rcv_saddr __tw_common.skc_rcv_saddr
136 #define tw_dport __tw_common.skc_dport
137 #define tw_refcnt __tw_common.skc_refcnt
138 #define tw_v6_daddr __tw_common.skc_v6_daddr
139 #define tw_v6_rcv_saddr __tw_common.skc_v6_rcv_saddr
141 #define tcp_jiffies32 ((__u32)bpf_jiffies64())
143 static inline struct inet_connection_sock *inet_csk(const struct sock *sk)
145 return (struct inet_connection_sock *)sk;
148 static inline void *inet_csk_ca(const struct sock *sk)
150 return (void *)inet_csk(sk)->icsk_ca_priv;
153 static inline struct tcp_sock *tcp_sk(const struct sock *sk)
155 return (struct tcp_sock *)sk;
158 static inline bool tcp_in_slow_start(const struct tcp_sock *tp)
160 return tp->snd_cwnd < tp->snd_ssthresh;
163 static inline bool tcp_is_cwnd_limited(const struct sock *sk)
165 const struct tcp_sock *tp = tcp_sk(sk);
167 /* If in slow start, ensure cwnd grows to twice what was ACKed. */
168 if (tcp_in_slow_start(tp))
169 return tp->snd_cwnd < 2 * tp->max_packets_out;
171 return !!BPF_CORE_READ_BITFIELD(tp, is_cwnd_limited);