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: Lawrence Brakmo <brakmo@fb.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
8c4b4c7e9f
commit
9872a4bde3
@@ -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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
} 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)
|
|||||||
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)) {
|
||||||
|
Reference in New Issue
Block a user