tcp: avoid tcp loop connection on lo device
Subsystems (3)
PATCH 1/1 tcp: avoid tcp loop connection on lo device
Tcp supports simultaneous Connection, but we meat odd phenomenon that tcp client can receive what send by itself. tcp client and tcp server communicate through loop device. tcp server selects port 40000 to listen which is in local port range. But after tcp server program is killed, tcp client still can connect successfully.
Client Server
connect <-----OK---------> listen:127.0.0.1,port:40000 send(d1) -----------------> recv recv(d2) <----------------- send(d2)
----------------- killed(40000 not listened)
connect <-----OK--------->
send(d1) ----------------->
recv(d1) <-----------------
The simultaneous connection has no meaning for lo device, and for this case, tcp client don't know whether server is listen on port 40000. Just fix it sending reset to keep consistent state machine.
Reproduced step:
1. while true ; do nc 127.0.0.1 40001 ;done
2. ss -nt dst 127.0.0.1
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 127.0.0.1:40001 127.0.0.1:40001
--- net/ipv4/tcp_input.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)
net/ipv4/tcp_input.c +7 -1
@@ -5659,6 +5659,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,struct tcp_cookie_values *cvp = tp->cookie_values;struct tcp_fastopen_cookie foc = { .len =-1 };int saved_clamp = tp->rx_opt.mss_clamp; +struct inet_sock *isk =inet_sk (sk);tcp_parse_options (skb, &tp->rx_opt, &hash_location,0 , &foc);
@@ -5832,8 +5833,13 @@ discard:if (th->syn) {/* We see SYN without ACK. It is attempt of * simultaneous connect with crossed SYNs. -* Particularly, it can be connect to self. +* But, avoid tcp loop connection on single socket. */ + +if (isk->inet_dport == isk->inet_sport && + isk->inet_saddr == isk->inet_daddr) + goto reset_and_undo; +tcp_set_state (sk,TCP_SYN_RECV );if (tp->rx_opt.saw_tstamp) {
Signature · 1 line
1.7.1
David Miller
maintainerFrom: Shan Wei <[email protected]>
Date: Tue, 25 Sep 2012 16:12:34 +0800
Quoted 5 lines
Tcp supports simultaneous Connection, but we meat odd phenomenon that tcp client can receive what send by itself. tcp client and tcp server communicate through loop device. tcp server selects port 40000 to listen which is in local port range. But after tcp server program is killed, tcp client still can connect successfully.
This is expected behavior and we're not special casing this after it being this way for 20+ years.