mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-13 16:33:57 -05:00
tcp: accecn: add tcpi_ecn_mode and tcpi_option2 in tcp_info
Add 2-bit tcpi_ecn_mode feild within tcp_info to indicate which ECN mode is negotiated: ECN_MODE_DISABLED, ECN_MODE_RFC3168, ECN_MODE_ACCECN, or ECN_MODE_PENDING. This is done by utilizing available bits from tcpi_accecn_opt_seen (reduced from 16 bits to 2 bits) and tcpi_accecn_fail_mode (reduced from 16 bits to 4 bits). Also, an extra 24-bit tcpi_options2 field is identified to represent newer options and connection features, as all 8 bits of tcpi_options field have been used. Signed-off-by: Chia-Yu Chang <chia-yu.chang@nokia-bell-labs.com> Co-developed-by: Neal Cardwell <ncardwell@google.com> Signed-off-by: Neal Cardwell <ncardwell@google.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Link: https://patch.msgid.link/20260131222515.8485-14-chia-yu.chang@nokia-bell-labs.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
committed by
Paolo Abeni
parent
1247fb19ca
commit
4fa4ac5e58
@@ -67,12 +67,6 @@ static inline void tcp_ecn_withdraw_cwr(struct tcp_sock *tp)
|
||||
tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR;
|
||||
}
|
||||
|
||||
/* tp->accecn_fail_mode */
|
||||
#define TCP_ACCECN_ACE_FAIL_SEND BIT(0)
|
||||
#define TCP_ACCECN_ACE_FAIL_RECV BIT(1)
|
||||
#define TCP_ACCECN_OPT_FAIL_SEND BIT(2)
|
||||
#define TCP_ACCECN_OPT_FAIL_RECV BIT(3)
|
||||
|
||||
static inline bool tcp_accecn_ace_fail_send(const struct tcp_sock *tp)
|
||||
{
|
||||
return tp->accecn_fail_mode & TCP_ACCECN_ACE_FAIL_SEND;
|
||||
@@ -98,11 +92,6 @@ static inline void tcp_accecn_fail_mode_set(struct tcp_sock *tp, u8 mode)
|
||||
tp->accecn_fail_mode |= mode;
|
||||
}
|
||||
|
||||
#define TCP_ACCECN_OPT_NOT_SEEN 0x0
|
||||
#define TCP_ACCECN_OPT_EMPTY_SEEN 0x1
|
||||
#define TCP_ACCECN_OPT_COUNTER_SEEN 0x2
|
||||
#define TCP_ACCECN_OPT_FAIL_SEEN 0x3
|
||||
|
||||
static inline u8 tcp_accecn_ace(const struct tcphdr *th)
|
||||
{
|
||||
return (th->ae << 2) | (th->cwr << 1) | th->ece;
|
||||
|
||||
@@ -226,6 +226,24 @@ enum tcp_ca_state {
|
||||
#define TCPF_CA_Loss (1<<TCP_CA_Loss)
|
||||
};
|
||||
|
||||
/* Values for tcpi_ecn_mode after negotiation */
|
||||
#define TCPI_ECN_MODE_DISABLED 0x0
|
||||
#define TCPI_ECN_MODE_RFC3168 0x1
|
||||
#define TCPI_ECN_MODE_ACCECN 0x2
|
||||
#define TCPI_ECN_MODE_PENDING 0x3
|
||||
|
||||
/* Values for accecn_opt_seen */
|
||||
#define TCP_ACCECN_OPT_NOT_SEEN 0x0
|
||||
#define TCP_ACCECN_OPT_EMPTY_SEEN 0x1
|
||||
#define TCP_ACCECN_OPT_COUNTER_SEEN 0x2
|
||||
#define TCP_ACCECN_OPT_FAIL_SEEN 0x3
|
||||
|
||||
/* Values for accecn_fail_mode */
|
||||
#define TCP_ACCECN_ACE_FAIL_SEND BIT(0)
|
||||
#define TCP_ACCECN_ACE_FAIL_RECV BIT(1)
|
||||
#define TCP_ACCECN_OPT_FAIL_SEND BIT(2)
|
||||
#define TCP_ACCECN_OPT_FAIL_RECV BIT(3)
|
||||
|
||||
struct tcp_info {
|
||||
__u8 tcpi_state;
|
||||
__u8 tcpi_ca_state;
|
||||
@@ -316,15 +334,17 @@ struct tcp_info {
|
||||
* in milliseconds, including any
|
||||
* unfinished recovery.
|
||||
*/
|
||||
__u32 tcpi_received_ce; /* # of CE marks received */
|
||||
__u32 tcpi_received_ce; /* # of CE marked segments received */
|
||||
__u32 tcpi_delivered_e1_bytes; /* Accurate ECN byte counters */
|
||||
__u32 tcpi_delivered_e0_bytes;
|
||||
__u32 tcpi_delivered_ce_bytes;
|
||||
__u32 tcpi_received_e1_bytes;
|
||||
__u32 tcpi_received_e0_bytes;
|
||||
__u32 tcpi_received_ce_bytes;
|
||||
__u16 tcpi_accecn_fail_mode;
|
||||
__u16 tcpi_accecn_opt_seen;
|
||||
__u32 tcpi_ecn_mode:2,
|
||||
tcpi_accecn_opt_seen:2,
|
||||
tcpi_accecn_fail_mode:4,
|
||||
tcpi_options2:24;
|
||||
};
|
||||
|
||||
/* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
|
||||
|
||||
@@ -4373,6 +4373,14 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info)
|
||||
if (tp->rto_stamp)
|
||||
info->tcpi_total_rto_time += tcp_clock_ms() - tp->rto_stamp;
|
||||
|
||||
if (tcp_ecn_disabled(tp))
|
||||
info->tcpi_ecn_mode = TCPI_ECN_MODE_DISABLED;
|
||||
else if (tcp_ecn_mode_rfc3168(tp))
|
||||
info->tcpi_ecn_mode = TCPI_ECN_MODE_RFC3168;
|
||||
else if (tcp_ecn_mode_accecn(tp))
|
||||
info->tcpi_ecn_mode = TCPI_ECN_MODE_ACCECN;
|
||||
else if (tcp_ecn_mode_pending(tp))
|
||||
info->tcpi_ecn_mode = TCPI_ECN_MODE_PENDING;
|
||||
info->tcpi_accecn_fail_mode = tp->accecn_fail_mode;
|
||||
info->tcpi_accecn_opt_seen = tp->saw_accecn_opt;
|
||||
info->tcpi_received_ce = tp->received_ce;
|
||||
|
||||
Reference in New Issue
Block a user