bpf: Add tcp_notsent_lowat bpf setsockopt
Adding support for TCP_NOTSENT_LOWAT sockoption (https://lwn.net/Articles/560082/) in tcp bpf programs. Signed-off-by: Nikita V. Shirokov <tehnerd@tehnerd.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/bpf/20201009070325.226855-1-tehnerd@tehnerd.com
This commit is contained in:
		
							parent
							
								
									c3f01fdced
								
							
						
					
					
						commit
						eca43ee6c4
					
				| @ -1698,7 +1698,7 @@ union bpf_attr { | ||||
|  * 		  **TCP_CONGESTION**, **TCP_BPF_IW**, | ||||
|  * 		  **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**, | ||||
|  * 		  **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**, | ||||
|  * 		  **TCP_SYNCNT**, **TCP_USER_TIMEOUT**. | ||||
|  *		  **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**. | ||||
|  * 		* **IPPROTO_IP**, which supports *optname* **IP_TOS**. | ||||
|  * 		* **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**. | ||||
|  * 	Return | ||||
|  | ||||
| @ -4827,6 +4827,10 @@ static int _bpf_setsockopt(struct sock *sk, int level, int optname, | ||||
| 				else | ||||
| 					icsk->icsk_user_timeout = val; | ||||
| 				break; | ||||
| 			case TCP_NOTSENT_LOWAT: | ||||
| 				tp->notsent_lowat = val; | ||||
| 				sk->sk_write_space(sk); | ||||
| 				break; | ||||
| 			default: | ||||
| 				ret = -EINVAL; | ||||
| 			} | ||||
|  | ||||
| @ -1698,7 +1698,7 @@ union bpf_attr { | ||||
|  * 		  **TCP_CONGESTION**, **TCP_BPF_IW**, | ||||
|  * 		  **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**, | ||||
|  * 		  **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**, | ||||
|  * 		  **TCP_SYNCNT**, **TCP_USER_TIMEOUT**. | ||||
|  *		  **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**. | ||||
|  * 		* **IPPROTO_IP**, which supports *optname* **IP_TOS**. | ||||
|  * 		* **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**. | ||||
|  * 	Return | ||||
|  | ||||
| @ -23,6 +23,10 @@ | ||||
| #define TCP_CA_NAME_MAX 16 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef TCP_NOTSENT_LOWAT | ||||
| #define TCP_NOTSENT_LOWAT 25 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef IFNAMSIZ | ||||
| #define IFNAMSIZ 16 | ||||
| #endif | ||||
| @ -128,6 +132,18 @@ static __inline int set_keepalive(struct bpf_sock_addr *ctx) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static __inline int set_notsent_lowat(struct bpf_sock_addr *ctx) | ||||
| { | ||||
| 	int lowat = 65535; | ||||
| 
 | ||||
| 	if (ctx->type == SOCK_STREAM) { | ||||
| 		if (bpf_setsockopt(ctx, SOL_TCP, TCP_NOTSENT_LOWAT, &lowat, sizeof(lowat))) | ||||
| 			return 1; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| SEC("cgroup/connect4") | ||||
| int connect_v4_prog(struct bpf_sock_addr *ctx) | ||||
| { | ||||
| @ -148,6 +164,9 @@ int connect_v4_prog(struct bpf_sock_addr *ctx) | ||||
| 	if (set_keepalive(ctx)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (set_notsent_lowat(ctx)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (ctx->type != SOCK_STREAM && ctx->type != SOCK_DGRAM) | ||||
| 		return 0; | ||||
| 	else if (ctx->type == SOCK_STREAM) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user