diff options
Diffstat (limited to 'tools/testing/selftests/bpf/progs/bpf_dctcp.c')
| -rw-r--r-- | tools/testing/selftests/bpf/progs/bpf_dctcp.c | 62 | 
1 files changed, 34 insertions, 28 deletions
diff --git a/tools/testing/selftests/bpf/progs/bpf_dctcp.c b/tools/testing/selftests/bpf/progs/bpf_dctcp.c index 460682759aed..3c9ffe340312 100644 --- a/tools/testing/selftests/bpf/progs/bpf_dctcp.c +++ b/tools/testing/selftests/bpf/progs/bpf_dctcp.c @@ -6,15 +6,23 @@   * the kernel BPF logic.   */ -#include <stddef.h> -#include <linux/bpf.h> -#include <linux/types.h> -#include <linux/stddef.h> -#include <linux/tcp.h> -#include <errno.h> +#include "bpf_tracing_net.h"  #include <bpf/bpf_helpers.h>  #include <bpf/bpf_tracing.h> -#include "bpf_tcp_helpers.h" + +#ifndef EBUSY +#define EBUSY 16 +#endif +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) +#define min_not_zero(x, y) ({			\ +	typeof(x) __x = (x);			\ +	typeof(y) __y = (y);			\ +	__x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); }) +static bool before(__u32 seq1, __u32 seq2) +{ +	return (__s32)(seq1-seq2) < 0; +}  char _license[] SEC("license") = "GPL"; @@ -35,7 +43,7 @@ struct {  #define DCTCP_MAX_ALPHA	1024U -struct dctcp { +struct bpf_dctcp {  	__u32 old_delivered;  	__u32 old_delivered_ce;  	__u32 prior_rcv_nxt; @@ -48,8 +56,7 @@ struct dctcp {  static unsigned int dctcp_shift_g = 4; /* g = 1/2^4 */  static unsigned int dctcp_alpha_on_init = DCTCP_MAX_ALPHA; -static __always_inline void dctcp_reset(const struct tcp_sock *tp, -					struct dctcp *ca) +static void dctcp_reset(const struct tcp_sock *tp, struct bpf_dctcp *ca)  {  	ca->next_seq = tp->snd_nxt; @@ -57,11 +64,11 @@ static __always_inline void dctcp_reset(const struct tcp_sock *tp,  	ca->old_delivered_ce = tp->delivered_ce;  } -SEC("struct_ops/dctcp_init") +SEC("struct_ops")  void BPF_PROG(dctcp_init, struct sock *sk)  {  	const struct tcp_sock *tp = tcp_sk(sk); -	struct dctcp *ca = inet_csk_ca(sk); +	struct bpf_dctcp *ca = inet_csk_ca(sk);  	int *stg;  	if (!(tp->ecn_flags & TCP_ECN_OK) && fallback[0]) { @@ -104,21 +111,21 @@ void BPF_PROG(dctcp_init, struct sock *sk)  	dctcp_reset(tp, ca);  } -SEC("struct_ops/dctcp_ssthresh") +SEC("struct_ops")  __u32 BPF_PROG(dctcp_ssthresh, struct sock *sk)  { -	struct dctcp *ca = inet_csk_ca(sk); +	struct bpf_dctcp *ca = inet_csk_ca(sk);  	struct tcp_sock *tp = tcp_sk(sk);  	ca->loss_cwnd = tp->snd_cwnd;  	return max(tp->snd_cwnd - ((tp->snd_cwnd * ca->dctcp_alpha) >> 11U), 2U);  } -SEC("struct_ops/dctcp_update_alpha") +SEC("struct_ops")  void BPF_PROG(dctcp_update_alpha, struct sock *sk, __u32 flags)  {  	const struct tcp_sock *tp = tcp_sk(sk); -	struct dctcp *ca = inet_csk_ca(sk); +	struct bpf_dctcp *ca = inet_csk_ca(sk);  	/* Expired RTT */  	if (!before(tp->snd_una, ca->next_seq)) { @@ -144,16 +151,16 @@ void BPF_PROG(dctcp_update_alpha, struct sock *sk, __u32 flags)  	}  } -static __always_inline void dctcp_react_to_loss(struct sock *sk) +static void dctcp_react_to_loss(struct sock *sk)  { -	struct dctcp *ca = inet_csk_ca(sk); +	struct bpf_dctcp *ca = inet_csk_ca(sk);  	struct tcp_sock *tp = tcp_sk(sk);  	ca->loss_cwnd = tp->snd_cwnd;  	tp->snd_ssthresh = max(tp->snd_cwnd >> 1U, 2U);  } -SEC("struct_ops/dctcp_state") +SEC("struct_ops")  void BPF_PROG(dctcp_state, struct sock *sk, __u8 new_state)  {  	if (new_state == TCP_CA_Recovery && @@ -164,7 +171,7 @@ void BPF_PROG(dctcp_state, struct sock *sk, __u8 new_state)  	 */  } -static __always_inline void dctcp_ece_ack_cwr(struct sock *sk, __u32 ce_state) +static void dctcp_ece_ack_cwr(struct sock *sk, __u32 ce_state)  {  	struct tcp_sock *tp = tcp_sk(sk); @@ -179,9 +186,8 @@ static __always_inline void dctcp_ece_ack_cwr(struct sock *sk, __u32 ce_state)   * S:	0 <- last pkt was non-CE   *	1 <- last pkt was CE   */ -static __always_inline -void dctcp_ece_ack_update(struct sock *sk, enum tcp_ca_event evt, -			  __u32 *prior_rcv_nxt, __u32 *ce_state) +static void dctcp_ece_ack_update(struct sock *sk, enum tcp_ca_event evt, +				 __u32 *prior_rcv_nxt, __u32 *ce_state)  {  	__u32 new_ce_state = (evt == CA_EVENT_ECN_IS_CE) ? 1 : 0; @@ -201,10 +207,10 @@ void dctcp_ece_ack_update(struct sock *sk, enum tcp_ca_event evt,  	dctcp_ece_ack_cwr(sk, new_ce_state);  } -SEC("struct_ops/dctcp_cwnd_event") +SEC("struct_ops")  void BPF_PROG(dctcp_cwnd_event, struct sock *sk, enum tcp_ca_event ev)  { -	struct dctcp *ca = inet_csk_ca(sk); +	struct bpf_dctcp *ca = inet_csk_ca(sk);  	switch (ev) {  	case CA_EVENT_ECN_IS_CE: @@ -220,17 +226,17 @@ void BPF_PROG(dctcp_cwnd_event, struct sock *sk, enum tcp_ca_event ev)  	}  } -SEC("struct_ops/dctcp_cwnd_undo") +SEC("struct_ops")  __u32 BPF_PROG(dctcp_cwnd_undo, struct sock *sk)  { -	const struct dctcp *ca = inet_csk_ca(sk); +	const struct bpf_dctcp *ca = inet_csk_ca(sk);  	return max(tcp_sk(sk)->snd_cwnd, ca->loss_cwnd);  }  extern void tcp_reno_cong_avoid(struct sock *sk, __u32 ack, __u32 acked) __ksym; -SEC("struct_ops/dctcp_reno_cong_avoid") +SEC("struct_ops")  void BPF_PROG(dctcp_cong_avoid, struct sock *sk, __u32 ack, __u32 acked)  {  	tcp_reno_cong_avoid(sk, ack, acked);  |