Merge branch 'tcp-trace-next'
Philo Lu says: ==================== tcp: update TCPCB_EVER_RETRANS after trace_tcp_retransmit_skb() Move TCPCB_EVER_RETRANS updating after the trace_tcp_retransmit_skb() in __tcp_retransmit_skb(), and then we are aware of whether the skb has ever been retransmitted in this tracepoint. This can be used, e.g., to get retransmission efficiency by counting skbs w/ and w/o TCPCB_EVER_RETRANS (through bpf tracing programs). For this purpose, TCPCB_EVER_RETRANS is also needed to be exposed to bpf. Previously, the flags are defined as macros in struct tcp_skb_cb. I moved them out into a new enum, and then they can be accessed with vmlinux.h. We have discussed to achieve this with BPF_SOCK_OPS in [0], and using tracepoint is thought to be a better solution. [0] https://lore.kernel.org/all/20240417124622.35333-1-lulie@linux.alibaba.com/ ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
+13
-9
@@ -928,6 +928,19 @@ static inline u32 tcp_rsk_tsval(const struct tcp_request_sock *treq)
|
||||
|
||||
#define TCPHDR_SYN_ECN (TCPHDR_SYN | TCPHDR_ECE | TCPHDR_CWR)
|
||||
|
||||
/* State flags for sacked in struct tcp_skb_cb */
|
||||
enum tcp_skb_cb_sacked_flags {
|
||||
TCPCB_SACKED_ACKED = (1 << 0), /* SKB ACK'd by a SACK block */
|
||||
TCPCB_SACKED_RETRANS = (1 << 1), /* SKB retransmitted */
|
||||
TCPCB_LOST = (1 << 2), /* SKB is lost */
|
||||
TCPCB_TAGBITS = (TCPCB_SACKED_ACKED | TCPCB_SACKED_RETRANS |
|
||||
TCPCB_LOST), /* All tag bits */
|
||||
TCPCB_REPAIRED = (1 << 4), /* SKB repaired (no skb_mstamp_ns) */
|
||||
TCPCB_EVER_RETRANS = (1 << 7), /* Ever retransmitted frame */
|
||||
TCPCB_RETRANS = (TCPCB_SACKED_RETRANS | TCPCB_EVER_RETRANS |
|
||||
TCPCB_REPAIRED),
|
||||
};
|
||||
|
||||
/* This is what the send packet queuing engine uses to pass
|
||||
* TCP per-packet control information to the transmission code.
|
||||
* We also store the host-order sequence numbers in here too.
|
||||
@@ -950,15 +963,6 @@ struct tcp_skb_cb {
|
||||
__u8 tcp_flags; /* TCP header flags. (tcp[13]) */
|
||||
|
||||
__u8 sacked; /* State flags for SACK. */
|
||||
#define TCPCB_SACKED_ACKED 0x01 /* SKB ACK'd by a SACK block */
|
||||
#define TCPCB_SACKED_RETRANS 0x02 /* SKB retransmitted */
|
||||
#define TCPCB_LOST 0x04 /* SKB is lost */
|
||||
#define TCPCB_TAGBITS 0x07 /* All tag bits */
|
||||
#define TCPCB_REPAIRED 0x10 /* SKB repaired (no skb_mstamp_ns) */
|
||||
#define TCPCB_EVER_RETRANS 0x80 /* Ever retransmitted frame */
|
||||
#define TCPCB_RETRANS (TCPCB_SACKED_RETRANS|TCPCB_EVER_RETRANS| \
|
||||
TCPCB_REPAIRED)
|
||||
|
||||
__u8 ip_dsfield; /* IPv4 tos or IPv6 dsfield */
|
||||
__u8 txstamp_ack:1, /* Record TX timestamp for ack? */
|
||||
eor:1, /* Is skb MSG_EOR marked? */
|
||||
|
||||
@@ -3418,11 +3418,6 @@ start:
|
||||
err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
/* To avoid taking spuriously low RTT samples based on a timestamp
|
||||
* for a transmit that never happened, always mark EVER_RETRANS
|
||||
*/
|
||||
TCP_SKB_CB(skb)->sacked |= TCPCB_EVER_RETRANS;
|
||||
|
||||
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);
|
||||
@@ -3432,6 +3427,12 @@ start:
|
||||
} else if (err != -EBUSY) {
|
||||
NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPRETRANSFAIL, segs);
|
||||
}
|
||||
|
||||
/* To avoid taking spuriously low RTT samples based on a timestamp
|
||||
* for a transmit that never happened, always mark EVER_RETRANS
|
||||
*/
|
||||
TCP_SKB_CB(skb)->sacked |= TCPCB_EVER_RETRANS;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user