--- /dev/null
+diff -ru linux-2.2.17-cut-tcp_rto/include/linux/sysctl.h linux-2.2.17c/include/linux/sysctl.h
+--- linux-2.2.17-cut-tcp_rto/include/linux/sysctl.h Sat Jul 22 05:31:27 2000
++++ linux-2.2.17c/include/linux/sysctl.h Fri Sep 22 15:29:18 2000
+@@ -228,7 +228,8 @@
+ NET_IPV4_ICMP_IGNORE_BOGUS_ERROR_RESPONSES=64,
+ NET_IPV4_IGMP_MAX_MEMBERSHIPS=65,
+ NET_IPV4_ALWAYS_DEFRAG=67,
+- NET_IPV4_IP_MASQ_UDP_DLOOSE=68
++ NET_IPV4_IP_MASQ_UDP_DLOOSE=68,
++ NET_TCP_RTO_MAX=69,
+ };
+
+ enum {
+diff -ru linux-2.2.17-cut-tcp_rto/include/net/tcp.h linux-2.2.17c/include/net/tcp.h
+--- linux-2.2.17-cut-tcp_rto/include/net/tcp.h Fri May 5 22:25:17 2000
++++ linux-2.2.17c/include/net/tcp.h Fri Sep 22 16:08:55 2000
+@@ -558,6 +558,10 @@
+ extern __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb,
+ __u16 *mss);
+
++/* tcp_input.c */
++
++extern int sysctl_tcp_rto_max;
++
+ /* tcp_output.c */
+
+ extern void tcp_read_wakeup(struct sock *);
+diff -ru linux-2.2.17-cut-tcp_rto/net/ipv4/sysctl_net_ipv4.c linux-2.2.17c/net/ipv4/sysctl_net_ipv4.c
+--- linux-2.2.17-cut-tcp_rto/net/ipv4/sysctl_net_ipv4.c Sat Jul 22 05:31:27 2000
++++ linux-2.2.17c/net/ipv4/sysctl_net_ipv4.c Fri Sep 22 15:33:55 2000
+@@ -207,6 +207,8 @@
+ {NET_IPV4_IGMP_MAX_MEMBERSHIPS, "igmp_max_memberships",
+ &sysctl_igmp_max_memberships, sizeof(int), 0644, NULL, &proc_dointvec},
+ #endif
++ {NET_TCP_RTO_MAX, "tcp_rto_max",
++ &sysctl_tcp_rto_max, sizeof(int), 0644, NULL, &proc_dointvec},
+ {0}
+ };
+
+diff -ru linux-2.2.17-cut-tcp_rto/net/ipv4/tcp_input.c linux-2.2.17c/net/ipv4/tcp_input.c
+--- linux-2.2.17-cut-tcp_rto/net/ipv4/tcp_input.c Fri Sep 22 15:44:20 2000
++++ linux-2.2.17c/net/ipv4/tcp_input.c Fri Sep 22 15:42:44 2000
+@@ -83,6 +83,8 @@
+ int sysctl_tcp_stdurg;
+ int sysctl_tcp_rfc1337;
+
++int sysctl_tcp_rto_max = 120*HZ;
++
+ static int prune_queue(struct sock *sk);
+
+ /* There is something which you must keep in mind when you analyze the
+@@ -204,8 +206,8 @@
+ */
+ static __inline__ void tcp_bound_rto(struct tcp_opt *tp)
+ {
+- if (tp->rto > 120*HZ)
+- tp->rto = 120*HZ;
++ if (tp->rto > sysctl_tcp_rto_max)
++ tp->rto = sysctl_tcp_rto_max;
+ if (tp->rto < HZ/5)
+ tp->rto = HZ/5;
+ }
+@@ -682,7 +684,7 @@
+ tcp_clear_xmit_timer(sk, TIME_PROBE0);
+ } else {
+ tcp_reset_xmit_timer(sk, TIME_PROBE0,
+- min(tp->rto << tp->backoff, 120*HZ));
++ min(tp->rto << tp->backoff, sysctl_tcp_rto_max));
+ }
+ }
+
+diff -ru linux-2.2.17-cut-tcp_rto/net/ipv4/tcp_output.c linux-2.2.17c/net/ipv4/tcp_output.c
+--- linux-2.2.17-cut-tcp_rto/net/ipv4/tcp_output.c Fri Sep 22 15:44:20 2000
++++ linux-2.2.17c/net/ipv4/tcp_output.c Fri Sep 22 15:42:44 2000
+@@ -1174,5 +1174,5 @@
+ tp->backoff++;
+ tp->probes_out++;
+ tcp_reset_xmit_timer (sk, TIME_PROBE0,
+- min(tp->rto << tp->backoff, 120*HZ));
++ min(tp->rto << tp->backoff, sysctl_tcp_rto_max));
+ }
+diff -ru linux-2.2.17-cut-tcp_rto/net/ipv4/tcp_timer.c linux-2.2.17c/net/ipv4/tcp_timer.c
+--- linux-2.2.17-cut-tcp_rto/net/ipv4/tcp_timer.c Sat Jul 22 05:31:27 2000
++++ linux-2.2.17c/net/ipv4/tcp_timer.c Fri Sep 22 15:33:32 2000
+@@ -501,7 +501,7 @@
+ * the 120 second clamps though!
+ */
+ tp->backoff++;
+- tp->rto = min(tp->rto << 1, 120*HZ);
++ tp->rto = min(tp->rto << 1, sysctl_tcp_rto_max);
+ tcp_reset_xmit_timer(sk, TIME_RETRANS, tp->rto);
+
+ tcp_write_timeout(sk);
+@@ -566,7 +566,7 @@
+ #endif
+ timeo = min((TCP_TIMEOUT_INIT
+ << conn->retrans),
+- 120*HZ);
++ sysctl_tcp_rto_max);
+ conn->expires = now + timeo;
+ op = prev->dl_next;
+ tcp_synq_queue(tp, conn);
--- /dev/null
+diff -ru linux-2.4.0-test8-cut-tcp_rto/include/linux/sysctl.h linux-2.4.0-test8c/include/linux/sysctl.h
+--- linux-2.4.0-test8-cut-tcp_rto/include/linux/sysctl.h Fri Sep 22 16:17:46 2000
++++ linux-2.4.0-test8c/include/linux/sysctl.h Fri Sep 22 17:30:12 2000
+@@ -269,6 +269,7 @@
+ NET_TCP_RMEM=85,
+ NET_TCP_APP_WIN=86,
+ NET_TCP_ADV_WIN_SCALE=87,
++ NET_TCP_RTO_MAX=88,
+ };
+
+ enum {
+diff -ru linux-2.4.0-test8-cut-tcp_rto/include/net/tcp.h linux-2.4.0-test8c/include/net/tcp.h
+--- linux-2.4.0-test8-cut-tcp_rto/include/net/tcp.h Fri Sep 22 16:17:46 2000
++++ linux-2.4.0-test8c/include/net/tcp.h Fri Sep 22 16:19:55 2000
+@@ -299,7 +299,8 @@
+ #define TCP_DELACK_MIN (2) /* minimal time to delay before sending an ACK,
+ * 2 scheduler ticks, not depending on HZ. */
+ #define TCP_ATO_MIN 2
+-#define TCP_RTO_MAX (120*HZ)
++#define TCP_RTO_MAX_init (120*HZ)
++extern int TCP_RTO_MAX;
+ #define TCP_RTO_MIN (HZ/5)
+ #define TCP_TIMEOUT_INIT (3*HZ) /* RFC 1122 initial RTO value */
+
+diff -ru linux-2.4.0-test8-cut-tcp_rto/net/ipv4/sysctl_net_ipv4.c linux-2.4.0-test8c/net/ipv4/sysctl_net_ipv4.c
+--- linux-2.4.0-test8-cut-tcp_rto/net/ipv4/sysctl_net_ipv4.c Fri Sep 22 16:17:55 2000
++++ linux-2.4.0-test8c/net/ipv4/sysctl_net_ipv4.c Fri Sep 22 17:30:29 2000
+@@ -229,6 +229,8 @@
+ &sysctl_tcp_app_win, sizeof(int), 0644, NULL, &proc_dointvec},
+ {NET_TCP_ADV_WIN_SCALE, "tcp_adv_win_scale",
+ &sysctl_tcp_adv_win_scale, sizeof(int), 0644, NULL, &proc_dointvec},
++ {NET_TCP_RTO_MAX, "tcp_rto_max",
++ &TCP_RTO_MAX, sizeof(int), 0644, NULL, &proc_dointvec},
+ {0}
+ };
+
+diff -ru linux-2.4.0-test8-cut-tcp_rto/net/ipv4/tcp_timer.c linux-2.4.0-test8c/net/ipv4/tcp_timer.c
+--- linux-2.4.0-test8-cut-tcp_rto/net/ipv4/tcp_timer.c Fri Sep 22 16:17:47 2000
++++ linux-2.4.0-test8c/net/ipv4/tcp_timer.c Fri Sep 22 16:22:09 2000
+@@ -30,6 +30,7 @@
+ int sysctl_tcp_retries1 = TCP_RETR1;
+ int sysctl_tcp_retries2 = TCP_RETR2;
+ int sysctl_tcp_orphan_retries = 0;
++int TCP_RTO_MAX = TCP_RTO_MAX_init;
+
+ static void tcp_write_timer(unsigned long);
+ static void tcp_delack_timer(unsigned long);