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
188188 * sum(delta(snd_una)), or how many bytes
189189 * were acked.
190190 */
191+ u32 dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups
192+ * total number of DSACK blocks received
193+ */
191194 u32 snd_una; /* First byte we want an ack for */
192195 u32 snd_sml; /* Last byte of the most recently transmitted small packet */
193196 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
238238
239239 __u64 tcpi_bytes_sent; /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
240240 __u64 tcpi_bytes_retrans; /* RFC4898 tcpEStatsPerfOctetsRetrans */
241+ __u32 tcpi_dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups */
241242 };
242243
243244 /* netlink attributes types for SCM_TIMESTAMPING_OPT_STATS */
@@ -262,6 +263,7 @@ enum { · 18 unmodified lines
262263 TCP_NLA_DELIVERED_CE, /* Like above but only ones w/ CE marks */
263264 TCP_NLA_BYTES_SENT, /* Data bytes sent including retransmission */
264265 TCP_NLA_BYTES_RETRANS, /* Data bytes retransmitted */
266+ TCP_NLA_DSACK_DUPS, /* DSACK blocks received */
265267 };
266268
267269 /* 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
25962596 tp->compressed_ack = 0;
25972597 tp->bytes_sent = 0;
25982598 tp->bytes_retrans = 0;
2599+ tp->dsack_dups = 0;
25992600
26002601 /* Clean up fastopen related fields */
26012602 tcp_free_fastopen_req(tp);
@@ -3205,6 +3206,7 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info) · 603 unmodified lines
32053206 info->tcpi_delivered_ce = tp->delivered_ce;
32063207 info->tcpi_bytes_sent = tp->bytes_sent;
32073208 info->tcpi_bytes_retrans = tp->bytes_retrans;
3209+ info->tcpi_dsack_dups = tp->dsack_dups;
32083210 unlock_sock_fast(sk, slow);
32093211 }
32103212 EXPORT_SYMBOL_GPL(tcp_get_info);
@@ -3231,6 +3233,7 @@ static size_t tcp_opt_stats_get_size(void) · 20 unmodified lines
32313233 nla_total_size(sizeof(u32)) + /* TCP_NLA_DELIVERED_CE */
32323234 nla_total_size_64bit(sizeof(u64)) + /* TCP_NLA_BYTES_SENT */
32333235 nla_total_size_64bit(sizeof(u64)) + /* TCP_NLA_BYTES_RETRANS */
3236+ nla_total_size(sizeof(u32)) + /* TCP_NLA_DSACK_DUPS */
32343237 0;
32353238 }
32363239
@@ -3282,6 +3285,7 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk) · 45 unmodified lines
32823285 TCP_NLA_PAD);
32833286 nla_put_u64_64bit(stats, TCP_NLA_BYTES_RETRANS, tp->bytes_retrans,
32843287 TCP_NLA_PAD);
3288+ nla_put_u32(stats, TCP_NLA_DSACK_DUPS, tp->dsack_dups);
32853289
32863290 return stats;
32873291 }
net/ipv4/tcp_input.c+1−0
@@ -874,6 +874,7 @@ static void tcp_dsack_seen(struct tcp_sock *tp) · 873 unmodified lines
874874 {
875875 tp->rx_opt.sack_ok |= TCP_DSACK_SEEN;
876876 tp->rack.dsack_seen = 1;
877+ tp->dsack_dups++;
877878 }
878879
879880 /* It's reordering when higher sequence was delivered (i.e. sacked) before