mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	[NET]: Introduce SO_{SND,RCV}BUFFORCE socket options
Allows overriding of sysctl_{wmem,rmrm}_max
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									f9e815b376
								
							
						
					
					
						commit
						b0573dea1f
					
				
					 22 changed files with 58 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -25,6 +25,8 @@
 | 
			
		|||
#define SO_ERROR	0x1007
 | 
			
		||||
#define SO_SNDBUF	0x1001
 | 
			
		||||
#define SO_RCVBUF	0x1002
 | 
			
		||||
#define SO_SNDBUFFORCE	0x100a
 | 
			
		||||
#define SO_RCVBUFFORCE	0x100b
 | 
			
		||||
#define	SO_RCVLOWAT	0x1010
 | 
			
		||||
#define	SO_SNDLOWAT	0x1011
 | 
			
		||||
#define	SO_RCVTIMEO	0x1012
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,8 @@ To add: #define SO_REUSEPORT 0x0200	/* Allow local address and port reuse.  */
 | 
			
		|||
#define SO_ERROR	0x1007	/* get error status and clear */
 | 
			
		||||
#define SO_SNDBUF	0x1001	/* Send buffer size. */
 | 
			
		||||
#define SO_RCVBUF	0x1002	/* Receive buffer. */
 | 
			
		||||
#define SO_SNDBUFFORCE	0x100a
 | 
			
		||||
#define SO_RCVBUFFORCE	0x100b
 | 
			
		||||
#define SO_SNDLOWAT	0x1003	/* send low-water mark */
 | 
			
		||||
#define SO_RCVLOWAT	0x1004	/* receive low-water mark */
 | 
			
		||||
#define SO_SNDTIMEO	0x1005	/* send timeout */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,8 @@
 | 
			
		|||
/* To add :#define SO_REUSEPORT 0x0200 */
 | 
			
		||||
#define SO_SNDBUF	0x1001
 | 
			
		||||
#define SO_RCVBUF	0x1002
 | 
			
		||||
#define SO_SNDBUFFORCE	0x100a
 | 
			
		||||
#define SO_RCVBUFFORCE	0x100b
 | 
			
		||||
#define SO_SNDLOWAT	0x1003
 | 
			
		||||
#define SO_RCVLOWAT	0x1004
 | 
			
		||||
#define SO_SNDTIMEO	0x1005
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,6 +21,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_RCVBUFFORCE	32
 | 
			
		||||
#define SO_SNDBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,8 @@
 | 
			
		|||
 | 
			
		||||
#define SO_SNDBUF	0x1001
 | 
			
		||||
#define SO_RCVBUF	0x1002
 | 
			
		||||
#define SO_SNDBUFFORCE	0x100a
 | 
			
		||||
#define SO_RCVBUFFORCE	0x100b
 | 
			
		||||
#define SO_ERROR	0x1007
 | 
			
		||||
#define SO_TYPE		0x1008
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,8 @@
 | 
			
		|||
 | 
			
		||||
#define SO_SNDBUF	0x1001
 | 
			
		||||
#define SO_RCVBUF	0x1002
 | 
			
		||||
#define SO_SNDBUFFORCE	0x100a
 | 
			
		||||
#define SO_RCVBUFFORCE	0x100b
 | 
			
		||||
#define SO_ERROR	0x1007
 | 
			
		||||
#define SO_TYPE		0x1008
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,6 +24,8 @@
 | 
			
		|||
#define SO_BROADCAST	6
 | 
			
		||||
#define SO_SNDBUF	7
 | 
			
		||||
#define SO_RCVBUF	8
 | 
			
		||||
#define SO_SNDBUFFORCE	32
 | 
			
		||||
#define SO_RCVBUFFORCE	33
 | 
			
		||||
#define SO_KEEPALIVE	9
 | 
			
		||||
#define SO_OOBINLINE	10
 | 
			
		||||
#define SO_NO_CHECK	11
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -260,7 +260,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 | 
			
		|||
			   
 | 
			
		||||
			if (val > sysctl_wmem_max)
 | 
			
		||||
				val = sysctl_wmem_max;
 | 
			
		||||
 | 
			
		||||
set_sndbuf:
 | 
			
		||||
			sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
 | 
			
		||||
			if ((val * 2) < SOCK_MIN_SNDBUF)
 | 
			
		||||
				sk->sk_sndbuf = SOCK_MIN_SNDBUF;
 | 
			
		||||
| 
						 | 
				
			
			@ -274,6 +274,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 | 
			
		|||
			sk->sk_write_space(sk);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case SO_SNDBUFFORCE:
 | 
			
		||||
			if (!capable(CAP_NET_ADMIN)) {
 | 
			
		||||
				ret = -EPERM;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			goto set_sndbuf;
 | 
			
		||||
 | 
			
		||||
		case SO_RCVBUF:
 | 
			
		||||
			/* Don't error on this BSD doesn't and if you think
 | 
			
		||||
			   about it this is right. Otherwise apps have to
 | 
			
		||||
| 
						 | 
				
			
			@ -282,7 +289,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 | 
			
		|||
			  
 | 
			
		||||
			if (val > sysctl_rmem_max)
 | 
			
		||||
				val = sysctl_rmem_max;
 | 
			
		||||
 | 
			
		||||
set_rcvbuf:
 | 
			
		||||
			sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
 | 
			
		||||
			/* FIXME: is this lower bound the right one? */
 | 
			
		||||
			if ((val * 2) < SOCK_MIN_RCVBUF)
 | 
			
		||||
| 
						 | 
				
			
			@ -291,6 +298,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 | 
			
		|||
				sk->sk_rcvbuf = val * 2;
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case SO_RCVBUFFORCE:
 | 
			
		||||
			if (!capable(CAP_NET_ADMIN)) {
 | 
			
		||||
				ret = -EPERM;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			goto set_rcvbuf;
 | 
			
		||||
 | 
			
		||||
		case SO_KEEPALIVE:
 | 
			
		||||
#ifdef CONFIG_INET
 | 
			
		||||
			if (sk->sk_protocol == IPPROTO_TCP)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue