Author: glebius
Date: Thu Sep 27 07:13:21 2012
New Revision: 240985
URL: http://svn.freebsd.org/changeset/base/240985

Log:
  Fix bug in TCP_KEEPCNT setting, which slipped in in the last round
  of reviewing of r231025.
  
  Unlike other options from this family TCP_KEEPCNT doesn't specify
  time interval, but a count, thus parameter supplied doesn't need
  to be multiplied by hz.
  
  Reported & tested by: amdmi3

Modified:
  head/sys/netinet/tcp_usrreq.c

Modified: head/sys/netinet/tcp_usrreq.c
==============================================================================
--- head/sys/netinet/tcp_usrreq.c       Thu Sep 27 06:05:54 2012        
(r240984)
+++ head/sys/netinet/tcp_usrreq.c       Thu Sep 27 07:13:21 2012        
(r240985)
@@ -1473,7 +1473,6 @@ unlock_and_done:
 
                case TCP_KEEPIDLE:
                case TCP_KEEPINTVL:
-               case TCP_KEEPCNT:
                case TCP_KEEPINIT:
                        INP_WUNLOCK(inp);
                        error = sooptcopyin(sopt, &ui, sizeof(ui), sizeof(ui));
@@ -1506,13 +1505,6 @@ unlock_and_done:
                                        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 ||
@@ -1523,6 +1515,20 @@ unlock_and_done:
                        }
                        goto unlock_and_done;
 
+               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));
+                       goto unlock_and_done;
+
                default:
                        INP_WUNLOCK(inp);
                        error = ENOPROTOOPT;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to