diff options
Diffstat (limited to 'tools/testing/selftests/bpf/progs/bind4_prog.c')
| -rw-r--r-- | tools/testing/selftests/bpf/progs/bind4_prog.c | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/progs/bind4_prog.c b/tools/testing/selftests/bpf/progs/bind4_prog.c index 115a3b0ad984..474c6a62078a 100644 --- a/tools/testing/selftests/bpf/progs/bind4_prog.c +++ b/tools/testing/selftests/bpf/progs/bind4_prog.c @@ -57,6 +57,27 @@ static __inline int bind_to_device(struct bpf_sock_addr *ctx)  	return 0;  } +static __inline int bind_reuseport(struct bpf_sock_addr *ctx) +{ +	int val = 1; + +	if (bpf_setsockopt(ctx, SOL_SOCKET, SO_REUSEPORT, +			   &val, sizeof(val))) +		return 1; +	if (bpf_getsockopt(ctx, SOL_SOCKET, SO_REUSEPORT, +			   &val, sizeof(val)) || !val) +		return 1; +	val = 0; +	if (bpf_setsockopt(ctx, SOL_SOCKET, SO_REUSEPORT, +			   &val, sizeof(val))) +		return 1; +	if (bpf_getsockopt(ctx, SOL_SOCKET, SO_REUSEPORT, +			   &val, sizeof(val)) || val) +		return 1; + +	return 0; +} +  static __inline int misc_opts(struct bpf_sock_addr *ctx, int opt)  {  	int old, tmp, new = 0xeb9f; @@ -127,6 +148,10 @@ int bind_v4_prog(struct bpf_sock_addr *ctx)  	if (misc_opts(ctx, SO_MARK) || misc_opts(ctx, SO_PRIORITY))  		return 0; +	/* Set reuseport and unset */ +	if (bind_reuseport(ctx)) +		return 0; +  	ctx->user_ip4 = bpf_htonl(SERV4_REWRITE_IP);  	ctx->user_port = bpf_htons(SERV4_REWRITE_PORT);  |