TCP - Remove net.inet.tcp.minmssoverload
authorMatthew Dillon <dillon@apollo.backplane.com>
Tue, 28 Jul 2009 00:44:49 +0000 (17:44 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Tue, 28 Jul 2009 00:44:49 +0000 (17:44 -0700)
This feature is horribly broken and has been removed.  It immediately breaks
NFS over TCP, it makes major assumptions about how TCP connections are used
which break standards, particular with regards to imposing a minimum data
size for synchronous communications, and the algorithm does not scale to
network speed AT ALL.

sys/netinet/tcp.h
sys/netinet/tcp_input.c
sys/netinet/tcp_subr.c
sys/netinet/tcp_usrreq.c
sys/netinet/tcp_var.h

index a8b7586..c2be451 100644 (file)
@@ -135,14 +135,6 @@ struct tcphdr {
  * Setting this to "0" disables the minmss check.
  */
 #define        TCP_MINMSS 256
-/*
- * TCP_MINMSSOVERLOAD is defined to be 1000 which should cover any type
- * of interactive TCP session.
- * See tcp_subr.c tcp_minmssoverload SYSCTL declaration and tcp_input.c
- * for more comments.
- * Setting this to "0" disables the minmssoverload check.
- */
-#define        TCP_MINMSSOVERLOAD 1000
 
 /*
  * Default maximum segment size for TCP6.
index bf8b3d1..77b141a 100644 (file)
@@ -1075,55 +1075,10 @@ after_listen:
         * minmss on the sending side) and it deals with too many too small
         * tcp packets in a too short timeframe (1 second).
         *
-        * For every full second we count the number of received packets
-        * and bytes. If we get a lot of packets per second for this connection
-        * (tcp_minmssoverload) we take a closer look at it and compute the
-        * average packet size for the past second. If that is less than
-        * tcp_minmss we get too many packets with very small payload which
-        * is not good and burdens our system (and every packet generates
-        * a wakeup to the process connected to our socket). We can reasonable
-        * expect this to be small packet DoS attack to exhaust our CPU
-        * cycles.
-        *
-        * Care has to be taken for the minimum packet overload value. This
-        * value defines the minimum number of packets per second before we
-        * start to worry. This must not be too low to avoid killing for
-        * example interactive connections with many small packets like
-        * telnet or SSH.
-        *
-        * Setting either tcp_minmssoverload or tcp_minmss to "0" disables
-        * this check.
-        *
-        * Account for packet if payload packet, skip over ACK, etc.
+        * XXX Removed.  This code was crap.  It does not scale to network
+        *     speed, and default values break NFS.  Gone.
         */
-       if (tcp_minmss && tcp_minmssoverload &&
-           tp->t_state == TCPS_ESTABLISHED && tlen > 0) {
-               if (tp->rcv_second > ticks) {
-                       tp->rcv_pps++;
-                       tp->rcv_byps += tlen + off;
-                       if (tp->rcv_pps > tcp_minmssoverload) {
-                               if ((tp->rcv_byps / tp->rcv_pps) < tcp_minmss) {
-                                       kprintf("too many small tcp packets from "
-                                              "%s:%u, av. %lubyte/packet, "
-                                              "dropping connection\n",
-#ifdef INET6
-                                               isipv6 ?
-                                               ip6_sprintf(&inp->inp_inc.inc6_faddr) :
-#endif
-                                               inet_ntoa(inp->inp_inc.inc_faddr),
-                                               inp->inp_inc.inc_fport,
-                                               tp->rcv_byps / tp->rcv_pps);
-                                       tp = tcp_drop(tp, ECONNRESET);
-                                       tcpstat.tcps_minmssdrops++;
-                                       goto drop;
-                               }
-                       }
-               } else {
-                       tp->rcv_second = ticks + hz;
-                       tp->rcv_pps = 1;
-                       tp->rcv_byps = tlen + off;
-               }
-       }
+       /* REMOVED */
 
        /*
         * Segment received on connection.
index 2dc92af..8d3d640 100644 (file)
@@ -189,18 +189,6 @@ SYSCTL_INT(_net_inet_tcp, TCPCTL_V6MSSDFLT, v6mssdflt, CTLFLAG_RW,
 int tcp_minmss = TCP_MINMSS;
 SYSCTL_INT(_net_inet_tcp, OID_AUTO, minmss, CTLFLAG_RW,
     &tcp_minmss , 0, "Minmum TCP Maximum Segment Size");
-/*
- * Number of TCP segments per second we accept from remote host
- * before we start to calculate average segment size. If average
- * segment size drops below the minimum TCP MSS we assume a DoS
- * attack and reset+drop the connection. Care has to be taken not to
- * set this value too small to not kill interactive type connections
- * (telnet, SSH) which send many small packets.
- */
-int tcp_minmssoverload = TCP_MINMSSOVERLOAD;
-SYSCTL_INT(_net_inet_tcp, OID_AUTO, minmssoverload, CTLFLAG_RW,
-    &tcp_minmssoverload , 0, "Number of TCP Segments per Second allowed to"
-    "be under the MINMSS Size");
 
 #if 0
 static int tcp_rttdflt = TCPTV_SRTTDFLT / PR_SLOWHZ;
index 4e92941..a2e78c0 100644 (file)
@@ -1239,11 +1239,23 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
                        break;
 
                case TCP_MAXSEG:
-                       if (optval > 0 && optval <= tp->t_maxseg &&
-                           optval + 40 >= tcp_minmss)
+                       /*
+                        * Must be between 0 and maxseg.  If the requested
+                        * maxseg is too small to satisfy the desired minmss,
+                        * pump it up (silently so sysctl modifications of
+                        * minmss do not create unexpected program failures).
+                        * Handle degenerate cases.
+                        */
+                       if (optval > 0 && optval <= tp->t_maxseg) {
+                               if (optval + 40 < tcp_minmss) {
+                                       optval = tcp_minmss - 40;
+                                       if (optval < 0)
+                                               optval = 1;
+                               }
                                tp->t_maxseg = optval;
-                       else
+                       } else {
                                error = EINVAL;
+                       }
                        break;
 
                default:
index 9f6c34f..31bf046 100644 (file)
@@ -574,7 +574,6 @@ extern      struct tcpcbackqhead tcpcbackq[];
 
 extern int tcp_mssdflt;        /* XXX */
 extern int tcp_minmss;
-extern int tcp_minmssoverload;
 extern int tcp_delack_enabled;
 extern int path_mtu_discovery;