include listenq max/backlog in tcp_info and related reports - correct version/signorder
Subsystems (4)
PATCH 1/1 include listenq max/backlog in tcp_info and related reports - correct version/signorder
Return some useful information such as the maximum listen backlog and the current listen backlog in the tcp_info structure and have that match what one can see in /proc/net/tcp, /proc/net/tcp6, and INET_DIAG_INFO.
---
Documentation/networking/proc_net_tcp.txt +2 -2
@@ -20,8 +20,8 @@ up into 3 parts because of the length of | | | | |--> number of unrecovered RTO timeouts | | | |----------> number of jiffies until timer expires | | |----------------> timer_active (see below) - | |----------------------> receive-queue - |-------------------------------> transmit-queue + | |----------------------> receive-queue or connection backlog + |-------------------------------> transmit-queue or connection limit 1000 0 54165785 4 cd1e6040 25 4 27 3 -1 | | | | | | | | | |--> slow start size threshold,
net/ipv4/tcp.c +8 -2
@@ -2030,8 +2030,14 @@ void tcp_get_info(struct sock *sk, struc info->tcpi_snd_mss = tp->mss_cache; info->tcpi_rcv_mss = icsk->icsk_ack.rcv_mss; - info->tcpi_unacked = tp->packets_out; - info->tcpi_sacked = tp->sacked_out; +if (sk->sk_state ==TCP_LISTEN ) { + info->tcpi_unacked = sk->sk_ack_backlog; + info->tcpi_sacked = sk->sk_max_ack_backlog; + } +else { + info->tcpi_unacked = tp->packets_out; + info->tcpi_sacked = tp->sacked_out; + } info->tcpi_lost = tp->lost_out; info->tcpi_retrans = tp->retrans_out; info->tcpi_fackets = tp->fackets_out;
net/ipv4/tcp_diag.c +6 -3
@@ -25,11 +25,14 @@ static void tcp_diag_get_info(struct socconst struct tcp_sock *tp =tcp_sk (sk);struct tcp_info *info = _info; -if (sk->sk_state ==TCP_LISTEN ) +if (sk->sk_state ==TCP_LISTEN ) { r->idiag_rqueue = sk->sk_ack_backlog; -else + r->idiag_wqueue = sk->sk_max_ack_backlog; + } +else { r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq; - r->idiag_wqueue = tp->write_seq - tp->snd_una; + r->idiag_wqueue = tp->write_seq - tp->snd_una; + }if (info !=NULL )tcp_get_info (sk, info); }
net/ipv4/tcp_ipv4.c +2 -1
@@ -2320,7 +2320,8 @@ static void get_tcp4_sock(struct sock *s sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " "%08X %5d %8d %lu %d %p %u %u %u %u %d", i, src, srcp, dest, destp, sk->sk_state, - tp->write_seq - tp->snd_una, + sk->sk_state == TCP_LISTEN ? sk->sk_max_ack_backlog : + (tp->write_seq - tp->snd_una), sk->sk_state == TCP_LISTEN ? sk->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), timer_active,
net/ipv6/tcp_ipv6.c +4 -2
@@ -2005,8 +2005,10 @@ static void get_tcp6_sock(struct seq_fil dest->s6_addr32[0 ], dest->s6_addr32[1 ], dest->s6_addr32[2 ], dest->s6_addr32[3 ], destp, sp->sk_state, - tp->write_seq-tp->snd_una, - (sp->sk_state ==TCP_LISTEN ) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), + (sp->sk_state ==TCP_LISTEN ) ? sp->sk_max_ack_backlog: + tp->write_seq-tp->snd_una, + (sp->sk_state ==TCP_LISTEN ) ? sp->sk_ack_backlog : + (tp->rcv_nxt - tp->copied_seq), timer_active,jiffies_to_clock_t (timer_expires - jiffies), icsk->icsk_retransmits,
Any reason you're overloading tcpi_unacked and tcpi_sacked? It seems that setting idiag_rqueue and idiag_wqueue are sufficient.
-John
Quoted 96 lines · Rick Jones
Return some useful information such as the maximum listen backlog and the current listen backlog in the
tcp_infostructure and have that match what one can see in/proc/net/tcp,/proc/net/tcp6, andINET_DIAG_INFO.Signed-off-by Rick Jones <[email protected]>Signed-off-by Eric Dumazet <[email protected]>---
diff -r
bdcdd0e1ee9dDocumentation/networking/proc_net_tcp.txtDocumentation/networking/proc_net_tcp.txt +2
-2@@ -20,8 +20,8 @@ up into 3 parts because of the length of | | | | |--> number of unrecovered RTO timeouts | | | |----------> number of jiffies until timer expires | | |----------------> timer_active (see below) - | |----------------------> receive-queue - |-------------------------------> transmit-queue + | |----------------------> receive-queue or connection backlog + |-------------------------------> transmit-queue or connection limit 1000 0 54165785 4 cd1e6040 25 4 27 3 -1 | | | | | | | | | |--> slow start size threshold,diff -r
bdcdd0e1ee9dnet/ipv4/tcp.cnet/ipv4/tcp.c +8
-2@@ -2030,8 +2030,14 @@ void tcp_get_info(struct sock *sk, struc info->tcpi_snd_mss = tp->mss_cache; info->tcpi_rcv_mss = icsk->icsk_ack.rcv_mss; - info->tcpi_unacked = tp->packets_out; - info->tcpi_sacked = tp->sacked_out; +if (sk->sk_state ==TCP_LISTEN ) { + info->tcpi_unacked = sk->sk_ack_backlog; + info->tcpi_sacked = sk->sk_max_ack_backlog; + } +else { + info->tcpi_unacked = tp->packets_out; + info->tcpi_sacked = tp->sacked_out; + } info->tcpi_lost = tp->lost_out; info->tcpi_retrans = tp->retrans_out; info->tcpi_fackets = tp->fackets_out;diff -r
bdcdd0e1ee9dnet/ipv4/tcp_diag.cnet/ipv4/tcp_diag.c +6
-3@@ -25,11 +25,14 @@ static void tcp_diag_get_info(struct socconst struct tcp_sock *tp =tcp_sk (sk);struct tcp_info *info = _info; -if (sk->sk_state ==TCP_LISTEN ) +if (sk->sk_state ==TCP_LISTEN ) { r->idiag_rqueue = sk->sk_ack_backlog; -else + r->idiag_wqueue = sk->sk_max_ack_backlog; + } +else { r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq; - r->idiag_wqueue = tp->write_seq - tp->snd_una; + r->idiag_wqueue = tp->write_seq - tp->snd_una; + }if (info !=NULL )tcp_get_info (sk, info); }diff -r
bdcdd0e1ee9dnet/ipv4/tcp_ipv4.cnet/ipv4/tcp_ipv4.c +2
-1@@ -2320,7 +2320,8 @@ static void get_tcp4_sock(struct sock *s sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " "%08X %5d %8d %lu %d %p %u %u %u %u %d", i, src, srcp, dest, destp, sk->sk_state, - tp->write_seq - tp->snd_una, + sk->sk_state == TCP_LISTEN ? sk->sk_max_ack_backlog : + (tp->write_seq - tp->snd_una), sk->sk_state == TCP_LISTEN ? sk->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), timer_active,diff -r
bdcdd0e1ee9dnet/ipv6/tcp_ipv6.cnet/ipv6/tcp_ipv6.c +4
-3@@ -2005,8 +2005,10 @@ static void get_tcp6_sock(struct seq_fil dest->s6_addr32[0 ], dest->s6_addr32[1 ], dest->s6_addr32[2 ], dest->s6_addr32[3 ], destp, sp->sk_state, - tp->write_seq-tp->snd_una, - (sp->sk_state ==TCP_LISTEN ) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), + (sp->sk_state ==TCP_LISTEN ) ? sp->sk_max_ack_backlog: + tp->write_seq-tp->snd_una, + (sp->sk_state ==TCP_LISTEN ) ? sp->sk_ack_backlog : + (tp->rcv_nxt - tp->copied_seq), timer_active,jiffies_to_clock_t (timer_expires - jiffies), icsk->icsk_retransmits, -To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 1 line · John Heffner
Any reason you're overloading
tcpi_unackedandtcpi_sacked? It seems that settingidiag_rqueueandidiag_wqueueare sufficient.
Different fields for different structures. The tcp_info struct doesn't have the idiag_mumble, so to get the two values shown in /proc/net/tcp I use tcpi_unacked and tcpi_sacked.
For the INET_DIAG_INFO stuff the idiag_mumble fields are used and that then covers ss.
rick
Quoted 110 lines
-John
Quoted 104 lines · Rick Jones
Return some useful information such as the maximum listen backlog and the current listen backlog in the
tcp_infostructure and have that match what one can see in/proc/net/tcp,/proc/net/tcp6, andINET_DIAG_INFO.Signed-off-by Rick Jones <[email protected]>Signed-off-by Eric Dumazet <[email protected]>---
diff -r
bdcdd0e1ee9dDocumentation/networking/proc_net_tcp.txt
---a/Documentation/networking/proc_net_tcp.txtSat Sep 01 07:00:31
2007 +0000
+++b/Documentation/networking/proc_net_tcp.txtTue Sep 11 10:38:23
2007 -0700(quoted diff) +0
-0@@ -20,8 +20,8 @@ up into 3 parts because of the length of | | | | |--> number of unrecovered RTOtimeouts
| | | |----------> number of jiffies until timer expires | | |----------------> timer_active (see below)Documentation/networking/proc_net_tcp.txt +1
-2- | |----------------------> receive-queue - |-------------------------------> transmit-queue + | |----------------------> receive-queue or connectionbacklog
+ |-------------------------------> transmit-queue or connection
limit1000 0 54165785 4 cd1e6040 25 4 27 3 -1 | | | | | | | | | |--> slow start sizethreshold, diff -r
bdcdd0e1ee9dnet/ipv4/tcp.cnet/ipv4/tcp.c Tue Sep 11 10:38:23 2007 -0700 renamed from net/ipv4/tcp.c Sat Sep 01 07:00:31 2007 +0000 +8
-2@@ -2030,8 +2030,14 @@ void tcp_get_info(struct sock *sk, struc info->tcpi_snd_mss = tp->mss_cache; info->tcpi_rcv_mss = icsk->icsk_ack.rcv_mss; - info->tcpi_unacked = tp->packets_out; - info->tcpi_sacked = tp->sacked_out; + if (sk->sk_state == TCP_LISTEN) { + info->tcpi_unacked = sk->sk_ack_backlog; + info->tcpi_sacked = sk->sk_max_ack_backlog; + } + else { + info->tcpi_unacked = tp->packets_out; + info->tcpi_sacked = tp->sacked_out; + } info->tcpi_lost = tp->lost_out; info->tcpi_retrans = tp->retrans_out; info->tcpi_fackets = tp->fackets_out;diff -r
bdcdd0e1ee9dnet/ipv4/tcp_diag.cnet/ipv4/tcp_diag.c Tue Sep 11 10:38:23 2007 -0700 renamed from net/ipv4/tcp_diag.c Sat Sep 01 07:00:31 2007 +0000 +6
-3@@ -25,11 +25,14 @@ static void tcp_diag_get_info(struct soc const struct tcp_sock *tp = tcp_sk(sk); struct tcp_info *info = _info; - if (sk->sk_state == TCP_LISTEN) + if (sk->sk_state == TCP_LISTEN) { r->idiag_rqueue = sk->sk_ack_backlog; - else + r->idiag_wqueue = sk->sk_max_ack_backlog; + } + else { r->idiag_rqueue = tp->rcv_nxt - tp->copied_seq; - r->idiag_wqueue = tp->write_seq - tp->snd_una; + r->idiag_wqueue = tp->write_seq - tp->snd_una; + } if (info != NULL) tcp_get_info(sk, info); }diff -r
bdcdd0e1ee9dnet/ipv4/tcp_ipv4.cnet/ipv4/tcp_ipv4.c Tue Sep 11 10:38:23 2007 -0700 renamed from net/ipv4/tcp_ipv4.c Sat Sep 01 07:00:31 2007 +0000 +0
-0@@ -2320,7 +2320,8 @@ static void get_tcp4_sock(struct sock *s sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X%02X:%08lX "
"%08X %5d %8d %lu %d %p %u %u %u %u %d", i, src, srcp, dest, destp, sk->sk_state,net/ipv4/tcp_ipv4.c Tue Sep 11 10:38:23 2007 -0700 renamed from net/ipv4/tcp_ipv4.c Sat Sep 01 07:00:31 2007 +0000 +2
-1- tp->write_seq - tp->snd_una, + sk->sk_state == TCP_LISTEN ? sk->sk_max_ack_backlog : + (tp->write_seq - tp->snd_una), sk->sk_state == TCP_LISTEN ? sk->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), timer_active,diff -r
bdcdd0e1ee9dnet/ipv6/tcp_ipv6.cnet/ipv6/tcp_ipv6.c Tue Sep 11 10:38:23 2007 -0700 renamed from net/ipv6/tcp_ipv6.c Sat Sep 01 07:00:31 2007 +0000 +4
-2@@ -2005,8 +2005,10 @@ static void get_tcp6_sock(struct seq_fil dest->s6_addr32[0], dest->s6_addr32[1], dest->s6_addr32[2], dest->s6_addr32[3], destp, sp->sk_state, - tp->write_seq-tp->snd_una, - (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq), + (sp->sk_state == TCP_LISTEN) ? sp->sk_max_ack_backlog: + tp->write_seq-tp->snd_una, + (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : + (tp->rcv_nxt - tp->copied_seq), timer_active, jiffies_to_clock_t(timer_expires - jiffies),icsk->icsk_retransmits,-
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 6 lines · Rick Jones
Quoted 1 line · John Heffner
Any reason you're overloading
tcpi_unackedandtcpi_sacked? It seems that settingidiag_rqueueandidiag_wqueueare sufficient.Different fields for different structures. The
tcp_infostruct doesn't have theidiag_mumble, so to get the two values shown in/proc/net/tcpI usetcpi_unackedandtcpi_sacked.For the
INET_DIAG_INFOstuff theidiag_mumblefields are used and that then covers ss.
Maybe I'm missing something. get_tcp[46]_sock() does not use struct tcp_info. The only way I see using this is by doing getsockopt(TCP_INFO) on your listen socket. Is this the intention?
-John
Quoted 7 lines · John Heffner
Quoted 5 lines · Rick Jones
Quoted 1 line · John Heffner
Any reason you're overloading
tcpi_unackedandtcpi_sacked? It seems that settingidiag_rqueueandidiag_wqueueare sufficient.
Quoted 6 lines
Quoted 3 lines
Different fields for different structures. The
tcp_infostruct doesn't have theidiag_mumble, so to get the two values shown in/proc/net/tcpI usetcpi_unackedandtcpi_sacked.For the
INET_DIAG_INFOstuff theidiag_mumblefields are used and that then covers ss.Maybe I'm missing something. get_tcp[46]_sock() does not use struct
tcp_info. The only way I see using this is by doinggetsockopt(TCP_INFO)on your listen socket. Is this the intention?
Yes. Sorry I got a triffle turned-around there.
rick
David Miller
maintainerFrom: Rick Jones <[email protected]>
Date: Mon, 17 Sep 2007 13:30:12 -0700
Quoted 6 lines
Different fields for different structures. The
tcp_infostruct doesn't
have theidiag_mumble, so to get the two values shown in/proc/net/tcpI usetcpi_unackedandtcpi_sacked.For the
INET_DIAG_INFOstuff theidiag_mumblefields are used and that then covers ss.
I want to reiterate what has been stated earlier in reply to this patch in that we shouldn't be modifying /proc/net/tcp* at all, any change can break some application parsing the strings it spits out.
Therefore only the inet_diag thing can have the fields added in a backward compatible manner.
Actually, this is why I initially deleted this patch from my inbox without applying it, I didn't see you remove the procfs code based upon the feedback you got stating that was necessary.