Message ID | 20240530131308.59737-2-kerneljasonxing@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | tcp/mptcp: count CLOSE-WAIT for CurrEstab | expand |
On Thu, May 30, 2024 at 3:13 PM Jason Xing <kerneljasonxing@gmail.com> wrote: > > From: Jason Xing <kernelxing@tencent.com> > > According to RFC 1213, we should also take CLOSE-WAIT sockets into > consideration: > > "tcpCurrEstab OBJECT-TYPE > ... > The number of TCP connections for which the current state > is either ESTABLISHED or CLOSE- WAIT." > > After this, CurrEstab counter will display the total number of > ESTABLISHED and CLOSE-WAIT sockets. > > The logic of counting > When we increment the counter? > a) if we change the state to ESTABLISHED. > b) if we change the state from SYN-RECEIVED to CLOSE-WAIT. > > When we decrement the counter? > a) if the socket leaves ESTABLISHED and will never go into CLOSE-WAIT, > say, on the client side, changing from ESTABLISHED to FIN-WAIT-1. > b) if the socket leaves CLOSE-WAIT, say, on the server side, changing > from CLOSE-WAIT to LAST-ACK. > > Please note: there are two chances that old state of socket can be changed > to CLOSE-WAIT in tcp_fin(). One is SYN-RECV, the other is ESTABLISHED. > So we have to take care of the former case. > > Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") > Signed-off-by: Jason Xing <kernelxing@tencent.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Thanks.
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 5fa68e7f6ddb..902266146d0e 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -2646,6 +2646,10 @@ void tcp_set_state(struct sock *sk, int state) if (oldstate != TCP_ESTABLISHED) TCP_INC_STATS(sock_net(sk), TCP_MIB_CURRESTAB); break; + case TCP_CLOSE_WAIT: + if (oldstate == TCP_SYN_RECV) + TCP_INC_STATS(sock_net(sk), TCP_MIB_CURRESTAB); + break; case TCP_CLOSE: if (oldstate == TCP_CLOSE_WAIT || oldstate == TCP_ESTABLISHED) @@ -2657,7 +2661,7 @@ void tcp_set_state(struct sock *sk, int state) inet_put_port(sk); fallthrough; default: - if (oldstate == TCP_ESTABLISHED) + if (oldstate == TCP_ESTABLISHED || oldstate == TCP_CLOSE_WAIT) TCP_DEC_STATS(sock_net(sk), TCP_MIB_CURRESTAB); }