diff options
Diffstat (limited to 'sys/netinet')
-rw-r--r-- | sys/netinet/tcp_subr.c | 6 | ||||
-rw-r--r-- | sys/netinet/tcp_timewait.c | 6 |
2 files changed, 10 insertions, 2 deletions
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index f8b0707..6a3068a 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -2150,6 +2150,7 @@ sysctl_drop(SYSCTL_HANDLER_ARGS) struct sockaddr_storage addrs[2]; struct inpcb *inp; struct tcpcb *tp; + struct tcptw *tw; struct sockaddr_in *fin, *lin; #ifdef INET6 struct sockaddr_in6 *fin6, *lin6; @@ -2224,7 +2225,10 @@ sysctl_drop(SYSCTL_HANDLER_ARGS) } if (inp != NULL) { INP_LOCK(inp); - if ((tp = intotcpcb(inp)) && + if ((tw = intotw(inp)) && + (inp->inp_vflag & INP_TIMEWAIT) != 0) { + (void) tcp_twclose(tw, 0); + } else if ((tp = intotcpcb(inp)) && ((inp->inp_socket->so_options & SO_ACCEPTCONN) == 0)) { tp = tcp_drop(tp, ECONNABORTED); if (tp != NULL) diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c index f8b0707..6a3068a 100644 --- a/sys/netinet/tcp_timewait.c +++ b/sys/netinet/tcp_timewait.c @@ -2150,6 +2150,7 @@ sysctl_drop(SYSCTL_HANDLER_ARGS) struct sockaddr_storage addrs[2]; struct inpcb *inp; struct tcpcb *tp; + struct tcptw *tw; struct sockaddr_in *fin, *lin; #ifdef INET6 struct sockaddr_in6 *fin6, *lin6; @@ -2224,7 +2225,10 @@ sysctl_drop(SYSCTL_HANDLER_ARGS) } if (inp != NULL) { INP_LOCK(inp); - if ((tp = intotcpcb(inp)) && + if ((tw = intotw(inp)) && + (inp->inp_vflag & INP_TIMEWAIT) != 0) { + (void) tcp_twclose(tw, 0); + } else if ((tp = intotcpcb(inp)) && ((inp->inp_socket->so_options & SO_ACCEPTCONN) == 0)) { tp = tcp_drop(tp, ECONNABORTED); if (tp != NULL) |