diff options
| -rw-r--r-- | include/linux/tcp.h | 3 | ||||
| -rw-r--r-- | include/uapi/linux/tcp.h | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 4 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 1 |
4 files changed, 10 insertions, 0 deletions
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index fb67f9a51b95..da6281c549a5 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
| @@ -188,6 +188,9 @@ struct tcp_sock { | |||
| 188 | * sum(delta(snd_una)), or how many bytes | 188 | * 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) */ |
diff --git a/include/uapi/linux/tcp.h b/include/uapi/linux/tcp.h index c31f5100b744..0e1c0aec0153 100644 --- a/include/uapi/linux/tcp.h +++ b/include/uapi/linux/tcp.h | |||
| @@ -238,6 +238,7 @@ struct tcp_info { | |||
| 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 { | |||
| 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 */ |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 5ed1be88e922..d6232b598cae 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -2596,6 +2596,7 @@ int tcp_disconnect(struct sock *sk, int flags) | |||
| 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) | |||
| 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 | } |
| 3210 | EXPORT_SYMBOL_GPL(tcp_get_info); | 3212 | EXPORT_SYMBOL_GPL(tcp_get_info); |
| @@ -3231,6 +3233,7 @@ static size_t tcp_opt_stats_get_size(void) | |||
| 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) | |||
| 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 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index d51fa358b2b1..fbc85ff7d71d 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -874,6 +874,7 @@ static void tcp_dsack_seen(struct tcp_sock *tp) | |||
| 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) before | 880 | /* It's reordering when higher sequence was delivered (i.e. sacked) before |
