From 87fad50310f2bd0dcc990e80e23b09768918cf5b Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Sat, 3 Jan 2015 17:44:01 +0100 Subject: Backport Linux changes for proper TCP EOF handling Notably when remote eagerly sends a RST: we want to return EOF to the application, not EPIPE. * pfinet/linux-src/net/ipv4/tcp_output.c (tcp_connect): Set sk->done to 0. * pfinet/linux-src/net/ipv4/tcp_input.c (tcp_fin): Set RCV_SHUTDOWN, and sk->done to 1. * pfinet/linux-src/net/ipv4/tcp.c (tcp_recv_urg): Only return ENOTCONN when we never actually connect. Always return 0 when reception is closed. (tcp_recvmsg): When any data is available, ignore errors and EOF. When no data is available, first check for reception being closed, then for errors. --- pfinet/linux-src/net/ipv4/tcp_input.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'pfinet/linux-src/net/ipv4/tcp_input.c') diff --git a/pfinet/linux-src/net/ipv4/tcp_input.c b/pfinet/linux-src/net/ipv4/tcp_input.c index e84eaf43..e2dfc156 100644 --- a/pfinet/linux-src/net/ipv4/tcp_input.c +++ b/pfinet/linux-src/net/ipv4/tcp_input.c @@ -1129,6 +1129,9 @@ static void tcp_fin(struct sk_buff *skb, struct sock *sk, struct tcphdr *th) tcp_send_ack(sk); + sk->shutdown |= RCV_SHUTDOWN; + sk->done = 1; + if (!sk->dead) { sk->state_change(sk); sock_wake_async(sk->socket, 1); -- cgit v1.2.3