summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorLawrence Brakmo <brakmo@fb.com>2018-01-26 01:14:14 +0100
committerAlexei Starovoitov <ast@kernel.org>2018-01-26 01:41:14 +0100
commita31ad29e6a30cb0b9084a9425b819cdcd97273ce (patch)
tree33ed37e633027ebf8b53a289eaddc687b1756368 /net
parentbpf: Add sock_ops R/W access to tclass (diff)
downloadlinux-a31ad29e6a30cb0b9084a9425b819cdcd97273ce.tar.xz
linux-a31ad29e6a30cb0b9084a9425b819cdcd97273ce.zip
bpf: Add BPF_SOCK_OPS_RETRANS_CB
Adds support for calling sock_ops BPF program when there is a retransmission. Three arguments are used; one for the sequence number, another for the number of segments retransmitted, and the last one for the return value of tcp_transmit_skb (0 => success). Does not include syn-ack retransmissions. New op: BPF_SOCK_OPS_RETRANS_CB. Signed-off-by: Lawrence Brakmo <brakmo@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/tcp_output.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index d12f7f71c1c4..e9f985e42405 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -2905,6 +2905,10 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs)
err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);
}
+ if (BPF_SOCK_OPS_TEST_FLAG(tp, BPF_SOCK_OPS_RETRANS_CB_FLAG))
+ tcp_call_bpf_3arg(sk, BPF_SOCK_OPS_RETRANS_CB,
+ TCP_SKB_CB(skb)->seq, segs, err);
+
if (likely(!err)) {
TCP_SKB_CB(skb)->sacked |= TCPCB_EVER_RETRANS;
trace_tcp_retransmit_skb(sk, skb);