diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tcp_input.c | 8 | ||||
-rw-r--r-- | src/tcp_subr.c | 10 | ||||
-rw-r--r-- | src/tcp_timer.c | 2 | ||||
-rw-r--r-- | src/util.c | 32 |
4 files changed, 31 insertions, 21 deletions
diff --git a/src/tcp_input.c b/src/tcp_input.c index 5f5701a..0fe0075 100644 --- a/src/tcp_input.c +++ b/src/tcp_input.c @@ -449,8 +449,8 @@ findso: * Reset idle time and keep-alive timer. */ tp->t_idle = 0; - if (slirp_do_keepalive) - tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL; + if (tp->t_state < TCPS_ESTABLISHED) + tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT; else tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE; @@ -1139,8 +1139,8 @@ findso: * specification, but if we don't get a FIN * we'll hang forever. */ - if (so->so_state & SS_FCANTRCVMORE) { - tp->t_timer[TCPT_2MSL] = TCP_MAXIDLE; + if (so->so_state & (SS_FCANTRCVMORE | SS_NOFDREF)) { + tp->t_timer[TCPT_2MSL] = TCP_LINGERTIME; } tp->t_state = TCPS_FIN_WAIT_2; } diff --git a/src/tcp_subr.c b/src/tcp_subr.c index c474a2d..8251c76 100644 --- a/src/tcp_subr.c +++ b/src/tcp_subr.c @@ -362,6 +362,16 @@ void tcp_sockclosed(struct tcpcb *tp) case TCPS_CLOSE_WAIT: tp->t_state = TCPS_LAST_ACK; break; + case TCPS_FIN_WAIT_2: + /* + * If we can't receive any more + * data, then closing user can proceed. + * Starting the timer is contrary to the + * specification, but if we don't get a FIN + * we'll hang forever. + */ + tp->t_timer[TCPT_2MSL] = TCP_LINGERTIME; + break; } tcp_output(tp); } diff --git a/src/tcp_timer.c b/src/tcp_timer.c index aeb610f..1d4bcc1 100644 --- a/src/tcp_timer.c +++ b/src/tcp_timer.c @@ -126,7 +126,7 @@ static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer) * control block. Otherwise, check again in a bit. */ case TCPT_2MSL: - if (tp->t_state != TCPS_TIME_WAIT && tp->t_idle <= TCP_MAXIDLE) + if (tp->t_state != TCPS_TIME_WAIT && tp->t_idle <= TCP_LINGERTIME) tp->t_timer[TCPT_2MSL] = TCPTV_KEEPINTVL; else tp = tcp_close(tp); @@ -252,7 +252,7 @@ int slirp_ioctlsocket_wrap(slirp_os_socket fd, int req, void *val) { int ret; ret = ioctlsocket(fd, req, val); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -263,7 +263,7 @@ int slirp_closesocket_wrap(slirp_os_socket fd) { int ret; ret = closesocket(fd); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -274,7 +274,7 @@ int slirp_connect_wrap(slirp_os_socket sockfd, const struct sockaddr *addr, int { int ret; ret = connect(sockfd, addr, addrlen); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -285,7 +285,7 @@ int slirp_listen_wrap(slirp_os_socket sockfd, int backlog) { int ret; ret = listen(sockfd, backlog); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -296,7 +296,7 @@ int slirp_bind_wrap(slirp_os_socket sockfd, const struct sockaddr *addr, int add { int ret; ret = bind(sockfd, addr, addrlen); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -307,7 +307,7 @@ slirp_os_socket slirp_socket_wrap(int domain, int type, int protocol) { slirp_os_socket ret; ret = socket(domain, type, protocol); - if (ret < 0) { + if (ret == INVALID_SOCKET) { errno = win32_socket_error(); } return ret; @@ -318,7 +318,7 @@ slirp_os_socket slirp_accept_wrap(slirp_os_socket sockfd, struct sockaddr *addr, { slirp_os_socket ret; ret = accept(sockfd, addr, addrlen); - if (ret < 0) { + if (ret == INVALID_SOCKET) { errno = win32_socket_error(); } return ret; @@ -329,7 +329,7 @@ int slirp_shutdown_wrap(slirp_os_socket sockfd, int how) { int ret; ret = shutdown(sockfd, how); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -341,7 +341,7 @@ int slirp_getsockopt_wrap(slirp_os_socket sockfd, int level, int optname, void * { int ret; ret = getsockopt(sockfd, level, optname, optval, optlen); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -353,7 +353,7 @@ int slirp_setsockopt_wrap(slirp_os_socket sockfd, int level, int optname, { int ret; ret = setsockopt(sockfd, level, optname, optval, optlen); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -364,7 +364,7 @@ int slirp_getpeername_wrap(slirp_os_socket sockfd, struct sockaddr *addr, int *a { int ret; ret = getpeername(sockfd, addr, addrlen); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -375,7 +375,7 @@ int slirp_getsockname_wrap(slirp_os_socket sockfd, struct sockaddr *addr, int *a { int ret; ret = getsockname(sockfd, addr, addrlen); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -387,7 +387,7 @@ slirp_ssize_t slirp_send_wrap(slirp_os_socket sockfd, const void *buf, size_t le int ret; ret = send(sockfd, buf, len, flags); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -399,7 +399,7 @@ slirp_ssize_t slirp_sendto_wrap(slirp_os_socket sockfd, const void *buf, size_t { int ret; ret = sendto(sockfd, buf, len, flags, addr, addrlen); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -410,7 +410,7 @@ slirp_ssize_t slirp_recv_wrap(slirp_os_socket sockfd, void *buf, size_t len, int { int ret; ret = recv(sockfd, buf, len, flags); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; @@ -422,7 +422,7 @@ slirp_ssize_t slirp_recvfrom_wrap(slirp_os_socket sockfd, void *buf, size_t len, { int ret; ret = recvfrom(sockfd, buf, len, flags, addr, addrlen); - if (ret < 0) { + if (ret == SOCKET_ERROR) { errno = win32_socket_error(); } return ret; |