Commit b0573dea authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

[NET]: Introduce SO_{SND,RCV}BUFFORCE socket options

Allows overriding of sysctl_{wmem,rmrm}_max
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f9e815b3
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#define SO_ERROR 0x1007 #define SO_ERROR 0x1007
#define SO_SNDBUF 0x1001 #define SO_SNDBUF 0x1001
#define SO_RCVBUF 0x1002 #define SO_RCVBUF 0x1002
#define SO_SNDBUFFORCE 0x100a
#define SO_RCVBUFFORCE 0x100b
#define SO_RCVLOWAT 0x1010 #define SO_RCVLOWAT 0x1010
#define SO_SNDLOWAT 0x1011 #define SO_SNDLOWAT 0x1011
#define SO_RCVTIMEO 0x1012 #define SO_RCVTIMEO 0x1012
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -37,6 +37,8 @@ To add: #define SO_REUSEPORT 0x0200 /* Allow local address and port reuse. */ ...@@ -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_ERROR 0x1007 /* get error status and clear */
#define SO_SNDBUF 0x1001 /* Send buffer size. */ #define SO_SNDBUF 0x1001 /* Send buffer size. */
#define SO_RCVBUF 0x1002 /* Receive buffer. */ #define SO_RCVBUF 0x1002 /* Receive buffer. */
#define SO_SNDBUFFORCE 0x100a
#define SO_RCVBUFFORCE 0x100b
#define SO_SNDLOWAT 0x1003 /* send low-water mark */ #define SO_SNDLOWAT 0x1003 /* send low-water mark */
#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ #define SO_RCVLOWAT 0x1004 /* receive low-water mark */
#define SO_SNDTIMEO 0x1005 /* send timeout */ #define SO_SNDTIMEO 0x1005 /* send timeout */
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
/* To add :#define SO_REUSEPORT 0x0200 */ /* To add :#define SO_REUSEPORT 0x0200 */
#define SO_SNDBUF 0x1001 #define SO_SNDBUF 0x1001
#define SO_RCVBUF 0x1002 #define SO_RCVBUF 0x1002
#define SO_SNDBUFFORCE 0x100a
#define SO_RCVBUFFORCE 0x100b
#define SO_SNDLOWAT 0x1003 #define SO_SNDLOWAT 0x1003
#define SO_RCVLOWAT 0x1004 #define SO_RCVLOWAT 0x1004
#define SO_SNDTIMEO 0x1005 #define SO_SNDTIMEO 0x1005
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_RCVBUFFORCE 32
#define SO_SNDBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
#define SO_SNDBUF 0x1001 #define SO_SNDBUF 0x1001
#define SO_RCVBUF 0x1002 #define SO_RCVBUF 0x1002
#define SO_SNDBUFFORCE 0x100a
#define SO_RCVBUFFORCE 0x100b
#define SO_ERROR 0x1007 #define SO_ERROR 0x1007
#define SO_TYPE 0x1008 #define SO_TYPE 0x1008
......
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
#define SO_SNDBUF 0x1001 #define SO_SNDBUF 0x1001
#define SO_RCVBUF 0x1002 #define SO_RCVBUF 0x1002
#define SO_SNDBUFFORCE 0x100a
#define SO_RCVBUFFORCE 0x100b
#define SO_ERROR 0x1007 #define SO_ERROR 0x1007
#define SO_TYPE 0x1008 #define SO_TYPE 0x1008
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#define SO_BROADCAST 6 #define SO_BROADCAST 6
#define SO_SNDBUF 7 #define SO_SNDBUF 7
#define SO_RCVBUF 8 #define SO_RCVBUF 8
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_KEEPALIVE 9 #define SO_KEEPALIVE 9
#define SO_OOBINLINE 10 #define SO_OOBINLINE 10
#define SO_NO_CHECK 11 #define SO_NO_CHECK 11
......
...@@ -260,7 +260,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, ...@@ -260,7 +260,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
if (val > sysctl_wmem_max) if (val > sysctl_wmem_max)
val = sysctl_wmem_max; val = sysctl_wmem_max;
set_sndbuf:
sk->sk_userlocks |= SOCK_SNDBUF_LOCK; sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
if ((val * 2) < SOCK_MIN_SNDBUF) if ((val * 2) < SOCK_MIN_SNDBUF)
sk->sk_sndbuf = SOCK_MIN_SNDBUF; sk->sk_sndbuf = SOCK_MIN_SNDBUF;
...@@ -274,6 +274,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname, ...@@ -274,6 +274,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
sk->sk_write_space(sk); sk->sk_write_space(sk);
break; break;
case SO_SNDBUFFORCE:
if (!capable(CAP_NET_ADMIN)) {
ret = -EPERM;
break;
}
goto set_sndbuf;
case SO_RCVBUF: case SO_RCVBUF:
/* Don't error on this BSD doesn't and if you think /* Don't error on this BSD doesn't and if you think
about it this is right. Otherwise apps have to about it this is right. Otherwise apps have to
...@@ -282,7 +289,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, ...@@ -282,7 +289,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
if (val > sysctl_rmem_max) if (val > sysctl_rmem_max)
val = sysctl_rmem_max; val = sysctl_rmem_max;
set_rcvbuf:
sk->sk_userlocks |= SOCK_RCVBUF_LOCK; sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
/* FIXME: is this lower bound the right one? */ /* FIXME: is this lower bound the right one? */
if ((val * 2) < SOCK_MIN_RCVBUF) if ((val * 2) < SOCK_MIN_RCVBUF)
...@@ -291,6 +298,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname, ...@@ -291,6 +298,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
sk->sk_rcvbuf = val * 2; sk->sk_rcvbuf = val * 2;
break; break;
case SO_RCVBUFFORCE:
if (!capable(CAP_NET_ADMIN)) {
ret = -EPERM;
break;
}
goto set_rcvbuf;
case SO_KEEPALIVE: case SO_KEEPALIVE:
#ifdef CONFIG_INET #ifdef CONFIG_INET
if (sk->sk_protocol == IPPROTO_TCP) if (sk->sk_protocol == IPPROTO_TCP)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment