History

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.

Chia-Yu Chang committed 9 months ago

Commit 4fa4ac51 parent 1247fb13 files · +31 −14Browse files

Unified · Split

3 files
  1. include/net/tcp_ecn.h +0 −11
  2. include/uapi/linux/tcp.h +23 −3
  3. net/ipv4/tcp.c +8 −0
include/net/tcp_ecn.h+0−11
@@ -67,12 +67,6 @@ static inline void tcp_ecn_withdraw_cwr(struct tcp_sock *tp) · 66 unmodified lines
67 tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR;67 tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR;
68}68}
69 69
70/* tp->accecn_fail_mode */
71#define TCP_ACCECN_ACE_FAIL_SEND BIT(0)
72#define TCP_ACCECN_ACE_FAIL_RECV BIT(1)
73#define TCP_ACCECN_OPT_FAIL_SEND BIT(2)
74#define TCP_ACCECN_OPT_FAIL_RECV BIT(3)
75
76static inline bool tcp_accecn_ace_fail_send(const struct tcp_sock *tp)70static inline bool tcp_accecn_ace_fail_send(const struct tcp_sock *tp)
77{71{
78 return tp->accecn_fail_mode & TCP_ACCECN_ACE_FAIL_SEND;72 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) · 19 unmodified lines
98 tp->accecn_fail_mode |= mode;92 tp->accecn_fail_mode |= mode;
99}93}
100 94
101#define TCP_ACCECN_OPT_NOT_SEEN 0x0
102#define TCP_ACCECN_OPT_EMPTY_SEEN 0x1
103#define TCP_ACCECN_OPT_COUNTER_SEEN 0x2
104#define TCP_ACCECN_OPT_FAIL_SEEN 0x3
105
106static inline u8 tcp_accecn_ace(const struct tcphdr *th)95static inline u8 tcp_accecn_ace(const struct tcphdr *th)
107{96{
108 return (th->ae << 2) | (th->cwr << 1) | th->ece;97 return (th->ae << 2) | (th->cwr << 1) | th->ece;
include/uapi/linux/tcp.h+23−3
@@ -226,6 +226,24 @@ enum tcp_ca_state { · 225 unmodified lines
226#define TCPF_CA_Loss (1<<TCP_CA_Loss)226#define TCPF_CA_Loss (1<<TCP_CA_Loss)
227};227};
228 228
229/* Values for tcpi_ecn_mode after negotiation */
230#define TCPI_ECN_MODE_DISABLED 0x0
231#define TCPI_ECN_MODE_RFC3168 0x1
232#define TCPI_ECN_MODE_ACCECN 0x2
233#define TCPI_ECN_MODE_PENDING 0x3
234
235/* Values for accecn_opt_seen */
236#define TCP_ACCECN_OPT_NOT_SEEN 0x0
237#define TCP_ACCECN_OPT_EMPTY_SEEN 0x1
238#define TCP_ACCECN_OPT_COUNTER_SEEN 0x2
239#define TCP_ACCECN_OPT_FAIL_SEEN 0x3
240
241/* Values for accecn_fail_mode */
242#define TCP_ACCECN_ACE_FAIL_SEND BIT(0)
243#define TCP_ACCECN_ACE_FAIL_RECV BIT(1)
244#define TCP_ACCECN_OPT_FAIL_SEND BIT(2)
245#define TCP_ACCECN_OPT_FAIL_RECV BIT(3)
246
229struct tcp_info {247struct tcp_info {
230 __u8 tcpi_state;248 __u8 tcpi_state;
231 __u8 tcpi_ca_state;249 __u8 tcpi_ca_state;
@@ -316,15 +334,17 @@ struct tcp_info { · 84 unmodified lines
316 * in milliseconds, including any334 * in milliseconds, including any
317 * unfinished recovery.335 * unfinished recovery.
318 */336 */
319 __u32 tcpi_received_ce; /* # of CE marks received */337 __u32 tcpi_received_ce; /* # of CE marked segments received */
320 __u32 tcpi_delivered_e1_bytes; /* Accurate ECN byte counters */338 __u32 tcpi_delivered_e1_bytes; /* Accurate ECN byte counters */
321 __u32 tcpi_delivered_e0_bytes;339 __u32 tcpi_delivered_e0_bytes;
322 __u32 tcpi_delivered_ce_bytes;340 __u32 tcpi_delivered_ce_bytes;
323 __u32 tcpi_received_e1_bytes;341 __u32 tcpi_received_e1_bytes;
324 __u32 tcpi_received_e0_bytes;342 __u32 tcpi_received_e0_bytes;
325 __u32 tcpi_received_ce_bytes;343 __u32 tcpi_received_ce_bytes;
326 __u16 tcpi_accecn_fail_mode;344 __u32 tcpi_ecn_mode:2,
327 __u16 tcpi_accecn_opt_seen;345 tcpi_accecn_opt_seen:2,
346 tcpi_accecn_fail_mode:4,
347 tcpi_options2:24;
328};348};
329 349
330/* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */350/* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
net/ipv4/tcp.c+8−0
@@ -4373,6 +4373,14 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info) · 4372 unmodified lines
4373 if (tp->rto_stamp)4373 if (tp->rto_stamp)
4374 info->tcpi_total_rto_time += tcp_clock_ms() - tp->rto_stamp;4374 info->tcpi_total_rto_time += tcp_clock_ms() - tp->rto_stamp;
4375 4375
4376 if (tcp_ecn_disabled(tp))
4377 info->tcpi_ecn_mode = TCPI_ECN_MODE_DISABLED;
4378 else if (tcp_ecn_mode_rfc3168(tp))
4379 info->tcpi_ecn_mode = TCPI_ECN_MODE_RFC3168;
4380 else if (tcp_ecn_mode_accecn(tp))
4381 info->tcpi_ecn_mode = TCPI_ECN_MODE_ACCECN;
4382 else if (tcp_ecn_mode_pending(tp))
4383 info->tcpi_ecn_mode = TCPI_ECN_MODE_PENDING;
4376 info->tcpi_accecn_fail_mode = tp->accecn_fail_mode;4384 info->tcpi_accecn_fail_mode = tp->accecn_fail_mode;
4377 info->tcpi_accecn_opt_seen = tp->saw_accecn_opt;4385 info->tcpi_accecn_opt_seen = tp->saw_accecn_opt;
4378 info->tcpi_received_ce = tp->received_ce;4386 info->tcpi_received_ce = tp->received_ce;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t