All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH bpf-next 1/2] bpf: allow to retrieve sol_socket opts from sock_addr progs
@ 2021-01-11 16:17 Daniel Borkmann
  2021-01-11 20:03 ` Yonghong Song
  0 siblings, 1 reply; 3+ messages in thread
From: Daniel Borkmann @ 2021-01-11 16:17 UTC (permalink / raw)
  To: ast; +Cc: yhs, bpf, netdev, Daniel Borkmann

The _bpf_setsockopt() is able to set some of the SOL_SOCKET level options,
however, _bpf_getsockopt() has little support to actually retrieve them.
This small patch adds few misc options such as SO_MARK, SO_PRIORITY and
SO_BINDTOIFINDEX. For the latter getter and setter are added. The mark and
priority in particular allow to retrieve the options from BPF cgroup hooks
to then implement custom behavior / settings on the syscall hooks compared
to other sockets that stick to the defaults, for example.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
---
 net/core/filter.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/net/core/filter.c b/net/core/filter.c
index 255aeee72402..9ab94e90d660 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -4770,6 +4770,10 @@ static int _bpf_setsockopt(struct sock *sk, int level, int optname,
 				ifindex = dev->ifindex;
 				dev_put(dev);
 			}
+			fallthrough;
+		case SO_BINDTOIFINDEX:
+			if (optname == SO_BINDTOIFINDEX)
+				ifindex = val;
 			ret = sock_bindtoindex(sk, ifindex, false);
 			break;
 		case SO_KEEPALIVE:
@@ -4932,8 +4936,25 @@ static int _bpf_getsockopt(struct sock *sk, int level, int optname,
 
 	sock_owned_by_me(sk);
 
+	if (level == SOL_SOCKET) {
+		if (optlen != sizeof(int))
+			goto err_clear;
+
+		switch (optname) {
+		case SO_MARK:
+			*((int *)optval) = sk->sk_mark;
+			break;
+		case SO_PRIORITY:
+			*((int *)optval) = sk->sk_priority;
+			break;
+		case SO_BINDTOIFINDEX:
+			*((int *)optval) = sk->sk_bound_dev_if;
+			break;
+		default:
+			goto err_clear;
+		}
 #ifdef CONFIG_INET
-	if (level == SOL_TCP && sk->sk_prot->getsockopt == tcp_getsockopt) {
+	} else if (level == SOL_TCP && sk->sk_prot->getsockopt == tcp_getsockopt) {
 		struct inet_connection_sock *icsk;
 		struct tcp_sock *tp;
 
@@ -4986,12 +5007,12 @@ static int _bpf_getsockopt(struct sock *sk, int level, int optname,
 		default:
 			goto err_clear;
 		}
+#endif
 #endif
 	} else {
 		goto err_clear;
 	}
 	return 0;
-#endif
 err_clear:
 	memset(optval, 0, optlen);
 	return -EINVAL;
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH bpf-next 1/2] bpf: allow to retrieve sol_socket opts from sock_addr progs
  2021-01-11 16:17 Daniel Borkmann
@ 2021-01-11 20:03 ` Yonghong Song
  0 siblings, 0 replies; 3+ messages in thread
From: Yonghong Song @ 2021-01-11 20:03 UTC (permalink / raw)
  To: Daniel Borkmann, ast; +Cc: bpf, netdev



On 1/11/21 8:17 AM, Daniel Borkmann wrote:
> The _bpf_setsockopt() is able to set some of the SOL_SOCKET level options,
> however, _bpf_getsockopt() has little support to actually retrieve them.
> This small patch adds few misc options such as SO_MARK, SO_PRIORITY and
> SO_BINDTOIFINDEX. For the latter getter and setter are added. The mark and
> priority in particular allow to retrieve the options from BPF cgroup hooks
> to then implement custom behavior / settings on the syscall hooks compared
> to other sockets that stick to the defaults, for example.
> 
> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>

Acked-by: Yonghong Song <yhs@fb.com>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH bpf-next 1/2] bpf: allow to retrieve sol_socket opts from sock_addr progs
@ 2021-01-11 21:51 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-01-11 21:51 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 22162 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <9dbbf51e7f6868b3e9c8610a8d49b4493fb1b50f.1610381606.git.daniel@iogearbox.net>
References: <9dbbf51e7f6868b3e9c8610a8d49b4493fb1b50f.1610381606.git.daniel@iogearbox.net>
TO: Daniel Borkmann <daniel@iogearbox.net>
TO: ast(a)kernel.org
CC: yhs(a)fb.com
CC: bpf(a)vger.kernel.org
CC: netdev(a)vger.kernel.org
CC: Daniel Borkmann <daniel@iogearbox.net>

Hi Daniel,

I love your patch! Perhaps something to improve:

[auto build test WARNING on bpf-next/master]

url:    https://github.com/0day-ci/linux/commits/Daniel-Borkmann/bpf-allow-to-retrieve-sol_socket-opts-from-sock_addr-progs/20210112-002246
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
:::::: branch date: 5 hours ago
:::::: commit date: 5 hours ago
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


"cppcheck warnings: (new ones prefixed by >>)"
   net/core/filter.c:612:12: warning: Pointer addition with NULL pointer. [nullPointerArithmetic]
     new_insn += 3;
              ^
   net/core/filter.c:560:43: note: Assignment 'first_insn=NULL', assigned value is 0
    struct bpf_insn *new_insn, *first_insn = NULL;
                                             ^
   net/core/filter.c:580:13: note: Assignment 'new_insn=first_insn', assigned value is 0
    new_insn = first_insn;
               ^
   net/core/filter.c:612:3: note: Compound assignment '+=', assigned value is 3
     new_insn += 3;
     ^
   net/core/filter.c:612:12: note: Null pointer addition
     new_insn += 3;
              ^

cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

   net/core/filter.c:8419:7: warning: Return value of function offsetof() is not used. [ignoredReturnValue]
    case offsetof(struct __sk_buff, cb[0]) ...
         ^
   net/core/filter.c:8544:7: warning: Return value of function offsetof() is not used. [ignoredReturnValue]
    case offsetof(struct __sk_buff, remote_ip6[0]) ...
         ^
   net/core/filter.c:8564:7: warning: Return value of function offsetof() is not used. [ignoredReturnValue]
    case offsetof(struct __sk_buff, local_ip6[0]) ...
         ^
   net/core/filter.c:9231:7: warning: Return value of function offsetof() is not used. [ignoredReturnValue]
    case offsetof(struct bpf_sock_ops, replylong[0]) ...
         ^
   net/core/filter.c:9283:7: warning: Return value of function offsetof() is not used. [ignoredReturnValue]
    case offsetof(struct bpf_sock_ops, remote_ip6[0]) ...
         ^
   net/core/filter.c:9304:7: warning: Return value of function offsetof() is not used. [ignoredReturnValue]
    case offsetof(struct bpf_sock_ops, local_ip6[0]) ...
         ^
   net/core/filter.c:9591:7: warning: Return value of function offsetof() is not used. [ignoredReturnValue]
    case offsetof(struct sk_msg_md, remote_ip6[0]) ...
         ^
   net/core/filter.c:9612:7: warning: Return value of function offsetof() is not used. [ignoredReturnValue]
    case offsetof(struct sk_msg_md, local_ip6[0]) ...
         ^
>> net/core/filter.c:4777:8: warning: Variable 'ret' is reassigned a value before the old one has been used. 'break;' missing? [redundantAssignInSwitch]
      ret = sock_bindtoindex(sk, ifindex, false);
          ^
   net/core/filter.c:4764:9: note: Variable 'ret' is reassigned a value before the old one has been used. 'break;' missing?
       ret = -ENODEV;
           ^
   net/core/filter.c:4777:8: note: Variable 'ret' is reassigned a value before the old one has been used. 'break;' missing?
      ret = sock_bindtoindex(sk, ifindex, false);
          ^

vim +4777 net/core/filter.c

6acc5c2910689fc6 Chenbo Feng        2017-03-22  4696  
beecf11bc2188067 Stanislav Fomichev 2020-04-30  4697  static int _bpf_setsockopt(struct sock *sk, int level, int optname,
5cdc744caab7cb0d Neal Cardwell      2020-09-10  4698  			   char *optval, int optlen)
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4699  {
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4700  	char devname[IFNAMSIZ];
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4701  	int val, valbool;
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4702  	struct net *net;
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4703  	int ifindex;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4704  	int ret = 0;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4705  
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4706  	if (!sk_fullsock(sk))
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4707  		return -EINVAL;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4708  
beecf11bc2188067 Stanislav Fomichev 2020-04-30  4709  	sock_owned_by_me(sk);
beecf11bc2188067 Stanislav Fomichev 2020-04-30  4710  
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4711  	if (level == SOL_SOCKET) {
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4712  		if (optlen != sizeof(int) && optname != SO_BINDTODEVICE)
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4713  			return -EINVAL;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4714  		val = *((int *)optval);
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4715  		valbool = val ? 1 : 0;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4716  
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4717  		/* Only some socketops are supported */
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4718  		switch (optname) {
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4719  		case SO_RCVBUF:
c9e4576743eeda8d Yafang Shao        2019-01-23  4720  			val = min_t(u32, val, sysctl_rmem_max);
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4721  			sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
ebb3b78db7bf8422 Eric Dumazet       2019-10-10  4722  			WRITE_ONCE(sk->sk_rcvbuf,
ebb3b78db7bf8422 Eric Dumazet       2019-10-10  4723  				   max_t(int, val * 2, SOCK_MIN_RCVBUF));
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4724  			break;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4725  		case SO_SNDBUF:
c9e4576743eeda8d Yafang Shao        2019-01-23  4726  			val = min_t(u32, val, sysctl_wmem_max);
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4727  			sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
e292f05e0df73f9f Eric Dumazet       2019-10-10  4728  			WRITE_ONCE(sk->sk_sndbuf,
e292f05e0df73f9f Eric Dumazet       2019-10-10  4729  				   max_t(int, val * 2, SOCK_MIN_SNDBUF));
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4730  			break;
76a9ebe811fb3d06 Eric Dumazet       2018-10-15  4731  		case SO_MAX_PACING_RATE: /* 32bit version */
e224c390a6259c52 Yuchung Cheng      2019-01-17  4732  			if (val != ~0U)
e224c390a6259c52 Yuchung Cheng      2019-01-17  4733  				cmpxchg(&sk->sk_pacing_status,
e224c390a6259c52 Yuchung Cheng      2019-01-17  4734  					SK_PACING_NONE,
e224c390a6259c52 Yuchung Cheng      2019-01-17  4735  					SK_PACING_NEEDED);
700465fd338fe5df Ke Li              2020-10-22  4736  			sk->sk_max_pacing_rate = (val == ~0U) ?
700465fd338fe5df Ke Li              2020-10-22  4737  						 ~0UL : (unsigned int)val;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4738  			sk->sk_pacing_rate = min(sk->sk_pacing_rate,
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4739  						 sk->sk_max_pacing_rate);
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4740  			break;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4741  		case SO_PRIORITY:
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4742  			sk->sk_priority = val;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4743  			break;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4744  		case SO_RCVLOWAT:
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4745  			if (val < 0)
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4746  				val = INT_MAX;
eac66402d1c342f0 Eric Dumazet       2019-10-09  4747  			WRITE_ONCE(sk->sk_rcvlowat, val ? : 1);
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4748  			break;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4749  		case SO_MARK:
f4924f24da8c7ef6 Peter Oskolkov     2019-01-16  4750  			if (sk->sk_mark != val) {
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4751  				sk->sk_mark = val;
f4924f24da8c7ef6 Peter Oskolkov     2019-01-16  4752  				sk_dst_reset(sk);
f4924f24da8c7ef6 Peter Oskolkov     2019-01-16  4753  			}
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4754  			break;
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4755  		case SO_BINDTODEVICE:
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4756  			optlen = min_t(long, optlen, IFNAMSIZ - 1);
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4757  			strncpy(devname, optval, optlen);
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4758  			devname[optlen] = 0;
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4759  
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4760  			ifindex = 0;
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4761  			if (devname[0] != '\0') {
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4762  				struct net_device *dev;
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4763  
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4764  				ret = -ENODEV;
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4765  
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4766  				net = sock_net(sk);
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4767  				dev = dev_get_by_name(net, devname);
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4768  				if (!dev)
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4769  					break;
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4770  				ifindex = dev->ifindex;
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4771  				dev_put(dev);
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4772  			}
03f510703daae949 Daniel Borkmann    2021-01-11  4773  			fallthrough;
03f510703daae949 Daniel Borkmann    2021-01-11  4774  		case SO_BINDTOIFINDEX:
03f510703daae949 Daniel Borkmann    2021-01-11  4775  			if (optname == SO_BINDTOIFINDEX)
03f510703daae949 Daniel Borkmann    2021-01-11  4776  				ifindex = val;
70c58997c1e864c9 Ferenc Fejes       2020-05-30 @4777  			ret = sock_bindtoindex(sk, ifindex, false);
70c58997c1e864c9 Ferenc Fejes       2020-05-30  4778  			break;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4779  		case SO_KEEPALIVE:
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4780  			if (sk->sk_prot->keepalive)
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4781  				sk->sk_prot->keepalive(sk, valbool);
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4782  			sock_valbool_flag(sk, SOCK_KEEPOPEN, valbool);
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4783  			break;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4784  		default:
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4785  			ret = -EINVAL;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4786  		}
a5192c52377e6d28 Lawrence Brakmo    2017-07-02  4787  #ifdef CONFIG_INET
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4788  	} else if (level == SOL_IP) {
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4789  		if (optlen != sizeof(int) || sk->sk_family != AF_INET)
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4790  			return -EINVAL;
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4791  
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4792  		val = *((int *)optval);
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4793  		/* Only some options are supported */
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4794  		switch (optname) {
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4795  		case IP_TOS:
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4796  			if (val < -1 || val > 0xff) {
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4797  				ret = -EINVAL;
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4798  			} else {
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4799  				struct inet_sock *inet = inet_sk(sk);
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4800  
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4801  				if (val == -1)
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4802  					val = 0;
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4803  				inet->tos = val;
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4804  			}
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4805  			break;
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4806  		default:
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4807  			ret = -EINVAL;
6f5c39fa5cd4a78c Nikita V. Shirokov 2018-03-26  4808  		}
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4809  #if IS_ENABLED(CONFIG_IPV6)
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4810  	} else if (level == SOL_IPV6) {
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4811  		if (optlen != sizeof(int) || sk->sk_family != AF_INET6)
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4812  			return -EINVAL;
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4813  
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4814  		val = *((int *)optval);
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4815  		/* Only some options are supported */
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4816  		switch (optname) {
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4817  		case IPV6_TCLASS:
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4818  			if (val < -1 || val > 0xff) {
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4819  				ret = -EINVAL;
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4820  			} else {
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4821  				struct ipv6_pinfo *np = inet6_sk(sk);
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4822  
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4823  				if (val == -1)
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4824  					val = 0;
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4825  				np->tclass = val;
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4826  			}
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4827  			break;
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4828  		default:
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4829  			ret = -EINVAL;
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4830  		}
6f9bd3d731aac0d2 Lawrence Brakmo    2018-01-25  4831  #endif
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4832  	} else if (level == SOL_TCP &&
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4833  		   sk->sk_prot->setsockopt == tcp_setsockopt) {
91b5b21c7c16899a Lawrence Brakmo    2017-06-30  4834  		if (optname == TCP_CONGESTION) {
91b5b21c7c16899a Lawrence Brakmo    2017-06-30  4835  			char name[TCP_CA_NAME_MAX];
91b5b21c7c16899a Lawrence Brakmo    2017-06-30  4836  
91b5b21c7c16899a Lawrence Brakmo    2017-06-30  4837  			strncpy(name, optval, min_t(long, optlen,
91b5b21c7c16899a Lawrence Brakmo    2017-06-30  4838  						    TCP_CA_NAME_MAX-1));
91b5b21c7c16899a Lawrence Brakmo    2017-06-30  4839  			name[TCP_CA_NAME_MAX-1] = 0;
29a949325c6c90f1 Neal Cardwell      2020-09-10  4840  			ret = tcp_set_congestion_control(sk, name, false, true);
91b5b21c7c16899a Lawrence Brakmo    2017-06-30  4841  		} else {
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4842  			struct inet_connection_sock *icsk = inet_csk(sk);
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4843  			struct tcp_sock *tp = tcp_sk(sk);
2b8ee4f05d4f6a6c Martin KaFai Lau   2020-08-20  4844  			unsigned long timeout;
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4845  
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4846  			if (optlen != sizeof(int))
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4847  				return -EINVAL;
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4848  
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4849  			val = *((int *)optval);
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4850  			/* Only some options are supported */
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4851  			switch (optname) {
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4852  			case TCP_BPF_IW:
31aa6503a15ba001 Yuchung Cheng      2019-01-08  4853  				if (val <= 0 || tp->data_segs_out > tp->syn_data)
91b5b21c7c16899a Lawrence Brakmo    2017-06-30  4854  					ret = -EINVAL;
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4855  				else
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4856  					tp->snd_cwnd = val;
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4857  				break;
13bf96411ad2bd16 Lawrence Brakmo    2017-06-30  4858  			case TCP_BPF_SNDCWND_CLAMP:
13bf96411ad2bd16 Lawrence Brakmo    2017-06-30  4859  				if (val <= 0) {
13bf96411ad2bd16 Lawrence Brakmo    2017-06-30  4860  					ret = -EINVAL;
13bf96411ad2bd16 Lawrence Brakmo    2017-06-30  4861  				} else {
13bf96411ad2bd16 Lawrence Brakmo    2017-06-30  4862  					tp->snd_cwnd_clamp = val;
13bf96411ad2bd16 Lawrence Brakmo    2017-06-30  4863  					tp->snd_ssthresh = val;
13bf96411ad2bd16 Lawrence Brakmo    2017-06-30  4864  				}
6d3f06a0042ebd59 Colin Ian King     2017-07-04  4865  				break;
2b8ee4f05d4f6a6c Martin KaFai Lau   2020-08-20  4866  			case TCP_BPF_DELACK_MAX:
2b8ee4f05d4f6a6c Martin KaFai Lau   2020-08-20  4867  				timeout = usecs_to_jiffies(val);
2b8ee4f05d4f6a6c Martin KaFai Lau   2020-08-20  4868  				if (timeout > TCP_DELACK_MAX ||
2b8ee4f05d4f6a6c Martin KaFai Lau   2020-08-20  4869  				    timeout < TCP_TIMEOUT_MIN)
2b8ee4f05d4f6a6c Martin KaFai Lau   2020-08-20  4870  					return -EINVAL;
2b8ee4f05d4f6a6c Martin KaFai Lau   2020-08-20  4871  				inet_csk(sk)->icsk_delack_max = timeout;
2b8ee4f05d4f6a6c Martin KaFai Lau   2020-08-20  4872  				break;
ca584ba070864c60 Martin KaFai Lau   2020-08-20  4873  			case TCP_BPF_RTO_MIN:
ca584ba070864c60 Martin KaFai Lau   2020-08-20  4874  				timeout = usecs_to_jiffies(val);
ca584ba070864c60 Martin KaFai Lau   2020-08-20  4875  				if (timeout > TCP_RTO_MIN ||
ca584ba070864c60 Martin KaFai Lau   2020-08-20  4876  				    timeout < TCP_TIMEOUT_MIN)
ca584ba070864c60 Martin KaFai Lau   2020-08-20  4877  					return -EINVAL;
ca584ba070864c60 Martin KaFai Lau   2020-08-20  4878  				inet_csk(sk)->icsk_rto_min = timeout;
ca584ba070864c60 Martin KaFai Lau   2020-08-20  4879  				break;
1e215300f1384072 Nikita V. Shirokov 2018-08-30  4880  			case TCP_SAVE_SYN:
1e215300f1384072 Nikita V. Shirokov 2018-08-30  4881  				if (val < 0 || val > 1)
1e215300f1384072 Nikita V. Shirokov 2018-08-30  4882  					ret = -EINVAL;
1e215300f1384072 Nikita V. Shirokov 2018-08-30  4883  				else
1e215300f1384072 Nikita V. Shirokov 2018-08-30  4884  					tp->save_syn = val;
1e215300f1384072 Nikita V. Shirokov 2018-08-30  4885  				break;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4886  			case TCP_KEEPIDLE:
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4887  				ret = tcp_sock_set_keepidle_locked(sk, val);
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4888  				break;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4889  			case TCP_KEEPINTVL:
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4890  				if (val < 1 || val > MAX_TCP_KEEPINTVL)
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4891  					ret = -EINVAL;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4892  				else
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4893  					tp->keepalive_intvl = val * HZ;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4894  				break;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4895  			case TCP_KEEPCNT:
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4896  				if (val < 1 || val > MAX_TCP_KEEPCNT)
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4897  					ret = -EINVAL;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4898  				else
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4899  					tp->keepalive_probes = val;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4900  				break;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4901  			case TCP_SYNCNT:
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4902  				if (val < 1 || val > MAX_TCP_SYNCNT)
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4903  					ret = -EINVAL;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4904  				else
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4905  					icsk->icsk_syn_retries = val;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4906  				break;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4907  			case TCP_USER_TIMEOUT:
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4908  				if (val < 0)
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4909  					ret = -EINVAL;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4910  				else
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4911  					icsk->icsk_user_timeout = val;
f9bcf96837f158db Dmitry Yakunin     2020-06-20  4912  				break;
eca43ee6c46db92d Nikita V. Shirokov 2020-10-09  4913  			case TCP_NOTSENT_LOWAT:
eca43ee6c46db92d Nikita V. Shirokov 2020-10-09  4914  				tp->notsent_lowat = val;
eca43ee6c46db92d Nikita V. Shirokov 2020-10-09  4915  				sk->sk_write_space(sk);
eca43ee6c46db92d Nikita V. Shirokov 2020-10-09  4916  				break;
cb81110997d1f509 Prankur gupta      2020-12-02  4917  			case TCP_WINDOW_CLAMP:
cb81110997d1f509 Prankur gupta      2020-12-02  4918  				ret = tcp_set_window_clamp(sk, val);
cb81110997d1f509 Prankur gupta      2020-12-02  4919  				break;
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4920  			default:
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4921  				ret = -EINVAL;
fc7478103c84af43 Lawrence Brakmo    2017-06-30  4922  			}
91b5b21c7c16899a Lawrence Brakmo    2017-06-30  4923  		}
91b5b21c7c16899a Lawrence Brakmo    2017-06-30  4924  #endif
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4925  	} else {
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4926  		ret = -EINVAL;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4927  	}
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4928  	return ret;
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4929  }
8c4b4c7e9ff04479 Lawrence Brakmo    2017-06-30  4930  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-01-11 21:51 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-11 21:51 [PATCH bpf-next 1/2] bpf: allow to retrieve sol_socket opts from sock_addr progs kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2021-01-11 16:17 Daniel Borkmann
2021-01-11 20:03 ` Yonghong Song

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.