On Mon, Jul 04, 2011 at 09:47:36AM +0100, Stuart Henderson wrote: :let's try again with this. regenerated diffs because the only :complaints were about whitespace issues, no real changes compared :to the diffs I sent out previously. : :- add sysctl net.inet.tcp.always_keepalive to act as if :SO_KEEPALIVE was set on all TCP connections.
I see good/bad with it. Fixes using apps behind crappy apps, but doesn't fix crappy apps? I have no opinion on this. : :- fix old bug where net.inet.tcp.keepintvl was ignored, :keepalives were instead sent at keepidle/slow_hz seconds. I believe this is correct. Tested it. OK, but get more OKs :) : :OK? : :Index: sys/netinet/tcp_timer.c :=================================================================== :RCS file: /cvs/src/sys/netinet/tcp_timer.c,v :retrieving revision 1.45 :diff -u -p -r1.45 tcp_timer.c :--- sys/netinet/tcp_timer.c 3 Jul 2010 04:44:51 -0000 1.45 :+++ sys/netinet/tcp_timer.c 4 Jul 2011 08:40:04 -0000 :@@ -55,6 +55,7 @@ : #include <netinet/ip_icmp.h> : #include <netinet/tcp_seq.h> : :+int tcp_always_keepalive; : int tcp_keepidle; : int tcp_keepintvl; : int tcp_maxpersistidle; /* max idle time in persist */ :@@ -435,7 +436,8 @@ tcp_timer_keep(void *arg) : tcpstat.tcps_keeptimeo++; : if (TCPS_HAVEESTABLISHED(tp->t_state) == 0) : goto dropit; :- if (tp->t_inpcb->inp_socket->so_options & SO_KEEPALIVE && :+ if ((tcp_always_keepalive || :+ tp->t_inpcb->inp_socket->so_options & SO_KEEPALIVE) && : tp->t_state <= TCPS_CLOSING) { : if ((tcp_maxidle > 0) && : ((tcp_now - tp->t_rcvtime) >= tcp_keepidle + tcp_maxidle)) :Index: sys/netinet/tcp_timer.h :=================================================================== :RCS file: /cvs/src/sys/netinet/tcp_timer.h,v :retrieving revision 1.12 :diff -u -p -r1.12 tcp_timer.h :--- sys/netinet/tcp_timer.h 8 Nov 2008 12:54:58 -0000 1.12 :+++ sys/netinet/tcp_timer.h 4 Jul 2011 08:40:04 -0000 :@@ -145,6 +145,7 @@ typedef void (*tcp_timer_func_t)(void *) : extern const tcp_timer_func_t tcp_timer_funcs[TCPT_NTIMERS]; : : extern int tcptv_keep_init; :+extern int tcp_always_keepalive; /* assume SO_KEEPALIVE is always set */ : extern int tcp_keepidle; /* time before keepalive probes begin */ : extern int tcp_keepintvl; /* time between keepalive probes */ : extern int tcp_maxidle; /* time to drop after starting probes */ :Index: sys/netinet/tcp_var.h :=================================================================== :RCS file: /cvs/src/sys/netinet/tcp_var.h,v :retrieving revision 1.98 :diff -u -p -r1.98 tcp_var.h :--- sys/netinet/tcp_var.h 7 Jan 2011 17:50:42 -0000 1.98 :+++ sys/netinet/tcp_var.h 4 Jul 2011 08:40:04 -0000 :@@ -473,7 +473,8 @@ struct tcpstat { : #define TCPCTL_DROP 19 /* drop tcp connection */ : #define TCPCTL_SACKHOLE_LIMIT 20 /* max entries for tcp sack queues */ : #define TCPCTL_STATS 21 /* TCP statistics */ :-#define TCPCTL_MAXID 22 :+#define TCPCTL_ALWAYS_KEEPALIVE 22 /* assume SO_KEEPALIVE is always set */ :+#define TCPCTL_MAXID 23 : : #define TCPCTL_NAMES { \ : { 0, 0 }, \ :@@ -497,7 +498,8 @@ struct tcpstat { : { "reasslimit", CTLTYPE_INT }, \ : { "drop", CTLTYPE_STRUCT }, \ : { "sackholelimit", CTLTYPE_INT }, \ :- { "stats", CTLTYPE_STRUCT } \ :+ { "stats", CTLTYPE_STRUCT }, \ :+ { "always_keepalive", CTLTYPE_INT } \ : } : : #define TCPCTL_VARS { \ :Index: sys/netinet/tcp_input.c :=================================================================== :RCS file: /cvs/src/sys/netinet/tcp_input.c,v :retrieving revision 1.250 :diff -u -p -r1.250 tcp_input.c :--- sys/netinet/tcp_input.c 13 May 2011 14:31:16 -0000 1.250 :+++ sys/netinet/tcp_input.c 4 Jul 2011 08:40:04 -0000 :@@ -961,8 +961,13 @@ findpcb: : * Reset idle time and keep-alive timer. : */ : tp->t_rcvtime = tcp_now; :- if (TCPS_HAVEESTABLISHED(tp->t_state)) :- TCP_TIMER_ARM(tp, TCPT_KEEP, tcp_keepidle); :+ if (TCPS_HAVEESTABLISHED(tp->t_state)) { :+ if (tcp_always_keepalive || :+ tp->t_inpcb->inp_socket->so_options & SO_KEEPALIVE) :+ TCP_TIMER_ARM(tp, TCPT_KEEP, tcp_keepintvl); :+ else :+ TCP_TIMER_ARM(tp, TCPT_KEEP, tcp_keepidle); :+ } : : #ifdef TCP_SACK : if (tp->sack_enable) :Index: sbin/sysctl/sysctl.8 :=================================================================== :RCS file: /cvs/src/sbin/sysctl/sysctl.8,v :retrieving revision 1.159 :diff -u -p -r1.159 sysctl.8 :--- sbin/sysctl/sysctl.8 24 Jun 2011 19:47:48 -0000 1.159 :+++ sbin/sysctl/sysctl.8 4 Jul 2011 08:40:04 -0000 :@@ -257,6 +257,7 @@ and a few require a kernel compiled with : .It net.inet.tcp.keepinittime integer yes : .It net.inet.tcp.keepidle integer yes : .It net.inet.tcp.keepintvl integer yes :+.It net.inet.tcp.always_keepalive integer yes : .It net.inet.tcp.slowhz integer no : .It net.inet.tcp.baddynamic array yes : .It net.inet.tcp.sack integer yes : -- Think big. Pollute the Mississippi.