History

tcp: add dsack blocks received stats

Introduce a new TCP stat to record the number of DSACK blocks received (RFC4989 tcpEStatsStackDSACKDups) and expose it in both tcp_info (TCP_INFO) and opt_stats (SOF_TIMESTAMPING_OPT_STATS).

Wei Wang committed 8 years ago

Commit 7e10b651 parent fb31c9b4 files · +10 −0Browse files

Unified · Split

4 files
  1. include/linux/tcp.h +3 −0
  2. include/uapi/linux/tcp.h +2 −0
  3. net/ipv4/tcp.c +4 −0
  4. net/ipv4/tcp_input.c +1 −0
include/linux/tcp.h+3−0
@@ -188,6 +188,9 @@ struct tcp_sock { · 187 unmodified lines
188 * sum(delta(snd_una)), or how many bytes188 * sum(delta(snd_una)), or how many bytes
189 * were acked.189 * were acked.
190 */190 */
191 u32 dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups
192 * total number of DSACK blocks received
193 */
191 u32 snd_una; /* First byte we want an ack for */194 u32 snd_una; /* First byte we want an ack for */
192 u32 snd_sml; /* Last byte of the most recently transmitted small packet */195 u32 snd_sml; /* Last byte of the most recently transmitted small packet */
193 u32 rcv_tstamp; /* timestamp of last received ACK (for keepalives) */196 u32 rcv_tstamp; /* timestamp of last received ACK (for keepalives) */
include/uapi/linux/tcp.h+2−0
@@ -238,6 +238,7 @@ struct tcp_info { · 237 unmodified lines
238 238
239 __u64 tcpi_bytes_sent; /* RFC4898 tcpEStatsPerfHCDataOctetsOut */239 __u64 tcpi_bytes_sent; /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
240 __u64 tcpi_bytes_retrans; /* RFC4898 tcpEStatsPerfOctetsRetrans */240 __u64 tcpi_bytes_retrans; /* RFC4898 tcpEStatsPerfOctetsRetrans */
241 __u32 tcpi_dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups */
241};242};
242 243
243/* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */244/* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
@@ -262,6 +263,7 @@ enum { · 18 unmodified lines
262 TCP_NLA_DELIVERED_CE, /* Like above but only ones w/ CE marks */263 TCP_NLA_DELIVERED_CE, /* Like above but only ones w/ CE marks */
263 TCP_NLA_BYTES_SENT, /* Data bytes sent including retransmission */264 TCP_NLA_BYTES_SENT, /* Data bytes sent including retransmission */
264 TCP_NLA_BYTES_RETRANS, /* Data bytes retransmitted */265 TCP_NLA_BYTES_RETRANS, /* Data bytes retransmitted */
266 TCP_NLA_DSACK_DUPS, /* DSACK blocks received */
265};267};
266 268
267/* for TCP_MD5SIG socket option */269/* for TCP_MD5SIG socket option */
net/ipv4/tcp.c+4−0
@@ -2596,6 +2596,7 @@ int tcp_disconnect(struct sock *sk, int flags) · 2595 unmodified lines
2596 tp->compressed_ack = 0;2596 tp->compressed_ack = 0;
2597 tp->bytes_sent = 0;2597 tp->bytes_sent = 0;
2598 tp->bytes_retrans = 0;2598 tp->bytes_retrans = 0;
2599 tp->dsack_dups = 0;
2599 2600
2600 /* Clean up fastopen related fields */2601 /* Clean up fastopen related fields */
2601 tcp_free_fastopen_req(tp);2602 tcp_free_fastopen_req(tp);
@@ -3205,6 +3206,7 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info) · 603 unmodified lines
3205 info->tcpi_delivered_ce = tp->delivered_ce;3206 info->tcpi_delivered_ce = tp->delivered_ce;
3206 info->tcpi_bytes_sent = tp->bytes_sent;3207 info->tcpi_bytes_sent = tp->bytes_sent;
3207 info->tcpi_bytes_retrans = tp->bytes_retrans;3208 info->tcpi_bytes_retrans = tp->bytes_retrans;
3209 info->tcpi_dsack_dups = tp->dsack_dups;
3208 unlock_sock_fast(sk, slow);3210 unlock_sock_fast(sk, slow);
3209}3211}
3210EXPORT_SYMBOL_GPL(tcp_get_info);3212EXPORT_SYMBOL_GPL(tcp_get_info);
@@ -3231,6 +3233,7 @@ static size_t tcp_opt_stats_get_size(void) · 20 unmodified lines
3231 nla_total_size(sizeof(u32)) + /* TCP_NLA_DELIVERED_CE */3233 nla_total_size(sizeof(u32)) + /* TCP_NLA_DELIVERED_CE */
3232 nla_total_size_64bit(sizeof(u64)) + /* TCP_NLA_BYTES_SENT */3234 nla_total_size_64bit(sizeof(u64)) + /* TCP_NLA_BYTES_SENT */
3233 nla_total_size_64bit(sizeof(u64)) + /* TCP_NLA_BYTES_RETRANS */3235 nla_total_size_64bit(sizeof(u64)) + /* TCP_NLA_BYTES_RETRANS */
3236 nla_total_size(sizeof(u32)) + /* TCP_NLA_DSACK_DUPS */
3234 0;3237 0;
3235}3238}
3236 3239
@@ -3282,6 +3285,7 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk) · 45 unmodified lines
3282 TCP_NLA_PAD);3285 TCP_NLA_PAD);
3283 nla_put_u64_64bit(stats, TCP_NLA_BYTES_RETRANS, tp->bytes_retrans,3286 nla_put_u64_64bit(stats, TCP_NLA_BYTES_RETRANS, tp->bytes_retrans,
3284 TCP_NLA_PAD);3287 TCP_NLA_PAD);
3288 nla_put_u32(stats, TCP_NLA_DSACK_DUPS, tp->dsack_dups);
3285 3289
3286 return stats;3290 return stats;
3287}3291}
net/ipv4/tcp_input.c+1−0
@@ -874,6 +874,7 @@ static void tcp_dsack_seen(struct tcp_sock *tp) · 873 unmodified lines
874{874{
875 tp->rx_opt.sack_ok |= TCP_DSACK_SEEN;875 tp->rx_opt.sack_ok |= TCP_DSACK_SEEN;
876 tp->rack.dsack_seen = 1;876 tp->rack.dsack_seen = 1;
877 tp->dsack_dups++;
877}878}
878 879
879/* It's reordering when higher sequence was delivered (i.e. sacked) before880/* It's reordering when higher sequence was delivered (i.e. sacked) before