aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2012-10-02 13:03:11 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2012-10-02 13:03:11 +0000
commite2668e870ba25ca13ace29ee7c0669582cf458b9 (patch)
tree9cdb559b43ff78ff2cd2d398d8c2b4e55a268c53
parentc953610431edd80ffcd4d343e0d7b49729c7bd0d (diff)
Notes
-rw-r--r--sys/netinet/tcp_usrreq.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index 8a1e31b8480c1..5f7fb0cdf5e82 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -1443,7 +1443,6 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
case TCP_KEEPIDLE:
case TCP_KEEPINTVL:
- case TCP_KEEPCNT:
case TCP_KEEPINIT:
INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &ui, sizeof(ui), sizeof(ui));
@@ -1476,13 +1475,6 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
tcp_timer_activate(tp, TT_2MSL,
TP_MAXIDLE(tp));
break;
- case TCP_KEEPCNT:
- tp->t_keepcnt = ui;
- if ((tp->t_state == TCPS_FIN_WAIT_2) &&
- (TP_MAXIDLE(tp) > 0))
- tcp_timer_activate(tp, TT_2MSL,
- TP_MAXIDLE(tp));
- break;
case TCP_KEEPINIT:
tp->t_keepinit = ui;
if (tp->t_state == TCPS_SYN_RECEIVED ||
@@ -1494,6 +1486,21 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
INP_WUNLOCK(inp);
break;
+ case TCP_KEEPCNT:
+ INP_WUNLOCK(inp);
+ error = sooptcopyin(sopt, &ui, sizeof(ui), sizeof(ui));
+ if (error)
+ return (error);
+
+ INP_WLOCK_RECHECK(inp);
+ tp->t_keepcnt = ui;
+ if ((tp->t_state == TCPS_FIN_WAIT_2) &&
+ (TP_MAXIDLE(tp) > 0))
+ tcp_timer_activate(tp, TT_2MSL,
+ TP_MAXIDLE(tp));
+ INP_WUNLOCK(inp);
+ break;
+
default:
INP_WUNLOCK(inp);
error = ENOPROTOOPT;