Commit 9872a4bd authored by Lawrence Brakmo's avatar Lawrence Brakmo Committed by David S. Miller

bpf: Add TCP connection BPF callbacks

Added callbacks to BPF SOCK_OPS type program before an active
connection is intialized and after a passive or active connection is
established.

The following patch demostrates how they can be used to set send and
receive buffer sizes.
Signed-off-by: default avatarLawrence Brakmo <brakmo@fb.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8c4b4c7e
...@@ -767,6 +767,17 @@ enum { ...@@ -767,6 +767,17 @@ enum {
* window (in packets) or -1 if default * window (in packets) or -1 if default
* value should be used * value should be used
*/ */
BPF_SOCK_OPS_TCP_CONNECT_CB, /* Calls BPF program right before an
* active connection is initialized
*/
BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, /* Calls BPF program when an
* active connection is
* established
*/
BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, /* Calls BPF program when a
* passive connection is
* established
*/
}; };
#endif /* _UAPI__LINUX_BPF_H__ */ #endif /* _UAPI__LINUX_BPF_H__ */
...@@ -221,6 +221,7 @@ static struct sock *tcp_fastopen_create_child(struct sock *sk, ...@@ -221,6 +221,7 @@ static struct sock *tcp_fastopen_create_child(struct sock *sk,
tcp_init_congestion_control(child); tcp_init_congestion_control(child);
tcp_mtup_init(child); tcp_mtup_init(child);
tcp_init_metrics(child); tcp_init_metrics(child);
tcp_call_bpf(child, BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB);
tcp_init_buffer_space(child); tcp_init_buffer_space(child);
tp->rcv_nxt = TCP_SKB_CB(skb)->seq + 1; tp->rcv_nxt = TCP_SKB_CB(skb)->seq + 1;
......
...@@ -5571,7 +5571,7 @@ void tcp_finish_connect(struct sock *sk, struct sk_buff *skb) ...@@ -5571,7 +5571,7 @@ void tcp_finish_connect(struct sock *sk, struct sk_buff *skb)
icsk->icsk_af_ops->rebuild_header(sk); icsk->icsk_af_ops->rebuild_header(sk);
tcp_init_metrics(sk); tcp_init_metrics(sk);
tcp_call_bpf(sk, BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB);
tcp_init_congestion_control(sk); tcp_init_congestion_control(sk);
/* Prevent spurious tcp_cwnd_restart() on first data /* Prevent spurious tcp_cwnd_restart() on first data
...@@ -5977,6 +5977,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) ...@@ -5977,6 +5977,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
} else { } else {
/* Make sure socket is routed, for correct metrics. */ /* Make sure socket is routed, for correct metrics. */
icsk->icsk_af_ops->rebuild_header(sk); icsk->icsk_af_ops->rebuild_header(sk);
tcp_call_bpf(sk, BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB);
tcp_init_congestion_control(sk); tcp_init_congestion_control(sk);
tcp_mtup_init(sk); tcp_mtup_init(sk);
......
...@@ -3444,6 +3444,7 @@ int tcp_connect(struct sock *sk) ...@@ -3444,6 +3444,7 @@ int tcp_connect(struct sock *sk)
struct sk_buff *buff; struct sk_buff *buff;
int err; int err;
tcp_call_bpf(sk, BPF_SOCK_OPS_TCP_CONNECT_CB);
tcp_connect_init(sk); tcp_connect_init(sk);
if (unlikely(tp->repair)) { if (unlikely(tp->repair)) {
......
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