aboutsummaryrefslogtreecommitdiff
path: root/pfinet/linux-src/net/ipv4/tcp_input.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2015-01-03 17:44:01 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2015-01-03 17:44:01 +0100
commit87fad50310f2bd0dcc990e80e23b09768918cf5b (patch)
tree68550f66228a82a37f6efdbb02ae864fd15cbc07 /pfinet/linux-src/net/ipv4/tcp_input.c
parent29a30c44bb8cecb341df211bcb3b330f515c9003 (diff)
downloadhurd-87fad50310f2bd0dcc990e80e23b09768918cf5b.tar.gz
hurd-87fad50310f2bd0dcc990e80e23b09768918cf5b.tar.bz2
hurd-87fad50310f2bd0dcc990e80e23b09768918cf5b.zip
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.
Diffstat (limited to 'pfinet/linux-src/net/ipv4/tcp_input.c')
-rw-r--r--pfinet/linux-src/net/ipv4/tcp_input.c3
1 files changed, 3 insertions, 0 deletions
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);