Skip to content

Commit 1e21530

Browse files
Nikita V. Shirokovborkmann
authored andcommitted
bpf: add TCP_SAVE_SYN/TCP_SAVED_SYN options for bpf_(set|get)sockopt
Adding support for two new bpf get/set sockopts: TCP_SAVE_SYN (set) and TCP_SAVED_SYN (get). This would allow for bpf program to build logic based on data from ingress SYN packet (e.g. doing tcp's tos/ tclass reflection (see sample prog)) and do it transparently from userspace program point of view. Signed-off-by: Nikita V. Shirokov <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]>
1 parent 7296216 commit 1e21530

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

net/core/filter.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4007,6 +4007,12 @@ BPF_CALL_5(bpf_setsockopt, struct bpf_sock_ops_kern *, bpf_sock,
40074007
tp->snd_ssthresh = val;
40084008
}
40094009
break;
4010+
case TCP_SAVE_SYN:
4011+
if (val < 0 || val > 1)
4012+
ret = -EINVAL;
4013+
else
4014+
tp->save_syn = val;
4015+
break;
40104016
default:
40114017
ret = -EINVAL;
40124018
}
@@ -4032,21 +4038,32 @@ static const struct bpf_func_proto bpf_setsockopt_proto = {
40324038
BPF_CALL_5(bpf_getsockopt, struct bpf_sock_ops_kern *, bpf_sock,
40334039
int, level, int, optname, char *, optval, int, optlen)
40344040
{
4041+
struct inet_connection_sock *icsk;
40354042
struct sock *sk = bpf_sock->sk;
4043+
struct tcp_sock *tp;
40364044

40374045
if (!sk_fullsock(sk))
40384046
goto err_clear;
4039-
40404047
#ifdef CONFIG_INET
40414048
if (level == SOL_TCP && sk->sk_prot->getsockopt == tcp_getsockopt) {
4042-
if (optname == TCP_CONGESTION) {
4043-
struct inet_connection_sock *icsk = inet_csk(sk);
4049+
switch (optname) {
4050+
case TCP_CONGESTION:
4051+
icsk = inet_csk(sk);
40444052

40454053
if (!icsk->icsk_ca_ops || optlen <= 1)
40464054
goto err_clear;
40474055
strncpy(optval, icsk->icsk_ca_ops->name, optlen);
40484056
optval[optlen - 1] = 0;
4049-
} else {
4057+
break;
4058+
case TCP_SAVED_SYN:
4059+
tp = tcp_sk(sk);
4060+
4061+
if (optlen <= 0 || !tp->saved_syn ||
4062+
optlen > tp->saved_syn[0])
4063+
goto err_clear;
4064+
memcpy(optval, tp->saved_syn + 1, optlen);
4065+
break;
4066+
default:
40504067
goto err_clear;
40514068
}
40524069
} else if (level == SOL_IP) {

0 commit comments

Comments
 (0)