From c484d1a38cbf46c75f1db8dab66aca38eee93edf Mon Sep 17 00:00:00 2001 From: Jonathan Lemon Date: Fri, 23 Feb 2001 21:07:06 +0000 Subject: [PATCH] When converting soft error into a hard error, drop the connection. The error will be passed up to the user, who will close the connection, so it does not appear to make a sense to leave the connection open. This also fixes a bug with kqueue, where the filter does not set EOF on the connection, because the connection is still open. Also remove calls to so{rw}wakeup, as we aren't doing anything with them at the moment anyway. Reviewed by: alfred, jesper --- sys/netinet/tcp_subr.c | 10 +++++++--- sys/netinet/tcp_timewait.c | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index b58005d260dd..c1505974a4fb 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -752,14 +752,16 @@ tcp_drain() * Notify a tcp user of an asynchronous error; * store error as soft error, but wake up user * (for now, won't do anything until can select for soft error). + * + * Do not wake up user since there currently is no mechanism for + * reporting soft errors (yet - a kqueue filter may be added). */ static void tcp_notify(inp, error) struct inpcb *inp; int error; { - register struct tcpcb *tp = (struct tcpcb *)inp->inp_ppcb; - register struct socket *so = inp->inp_socket; + struct tcpcb *tp = (struct tcpcb *)inp->inp_ppcb; /* * Ignore some errors if we are hooked up. @@ -774,12 +776,14 @@ tcp_notify(inp, error) return; } else if (tp->t_state < TCPS_ESTABLISHED && tp->t_rxtshift > 3 && tp->t_softerror) - so->so_error = error; + tcp_drop(tp, error); else tp->t_softerror = error; +#if 0 wakeup((caddr_t) &so->so_timeo); sorwakeup(so); sowwakeup(so); +#endif } static int diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c index b58005d260dd..c1505974a4fb 100644 --- a/sys/netinet/tcp_timewait.c +++ b/sys/netinet/tcp_timewait.c @@ -752,14 +752,16 @@ tcp_drain() * Notify a tcp user of an asynchronous error; * store error as soft error, but wake up user * (for now, won't do anything until can select for soft error). + * + * Do not wake up user since there currently is no mechanism for + * reporting soft errors (yet - a kqueue filter may be added). */ static void tcp_notify(inp, error) struct inpcb *inp; int error; { - register struct tcpcb *tp = (struct tcpcb *)inp->inp_ppcb; - register struct socket *so = inp->inp_socket; + struct tcpcb *tp = (struct tcpcb *)inp->inp_ppcb; /* * Ignore some errors if we are hooked up. @@ -774,12 +776,14 @@ tcp_notify(inp, error) return; } else if (tp->t_state < TCPS_ESTABLISHED && tp->t_rxtshift > 3 && tp->t_softerror) - so->so_error = error; + tcp_drop(tp, error); else tp->t_softerror = error; +#if 0 wakeup((caddr_t) &so->so_timeo); sorwakeup(so); sowwakeup(so); +#endif } static int