aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorIlpo Järvinen <ilpo.jarvinen@helsinki.fi>2008-09-21 00:21:54 -0400
committerDavid S. Miller <davem@davemloft.net>2008-09-21 00:21:54 -0400
commitb5afe7bc71a1689376c9b547376d17568469f3b3 (patch)
tree30a790da358ea20c790e16f87a4dcddc83cdb316 /net
parent184d68b2b0b836587f92887b14baea41033ffeef (diff)
tcp: add tcp_can_forward_retransmit
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/tcp_output.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index cfae61b40c44..957c4e3d2176 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -1992,6 +1992,33 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
1992 return err; 1992 return err;
1993} 1993}
1994 1994
1995static int tcp_can_forward_retransmit(struct sock *sk)
1996{
1997 const struct inet_connection_sock *icsk = inet_csk(sk);
1998 struct tcp_sock *tp = tcp_sk(sk);
1999
2000 /* Forward retransmissions are possible only during Recovery. */
2001 if (icsk->icsk_ca_state != TCP_CA_Recovery)
2002 return 0;
2003
2004 /* No forward retransmissions in Reno are possible. */
2005 if (tcp_is_reno(tp))
2006 return 0;
2007
2008 /* Yeah, we have to make difficult choice between forward transmission
2009 * and retransmission... Both ways have their merits...
2010 *
2011 * For now we do not retransmit anything, while we have some new
2012 * segments to send. In the other cases, follow rule 3 for
2013 * NextSeg() specified in RFC3517.
2014 */
2015
2016 if (tcp_may_send_now(sk))
2017 return 0;
2018
2019 return 1;
2020}
2021
1995/* This gets called after a retransmit timeout, and the initially 2022/* This gets called after a retransmit timeout, and the initially
1996 * retransmitted data is acknowledged. It tries to continue 2023 * retransmitted data is acknowledged. It tries to continue
1997 * resending the rest of the retransmit queue, until either 2024 * resending the rest of the retransmit queue, until either
@@ -2057,24 +2084,7 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
2057 } 2084 }
2058 2085
2059 /* OK, demanded retransmission is finished. */ 2086 /* OK, demanded retransmission is finished. */
2060 2087 if (!tcp_can_forward_retransmit(sk))
2061 /* Forward retransmissions are possible only during Recovery. */
2062 if (icsk->icsk_ca_state != TCP_CA_Recovery)
2063 return;
2064
2065 /* No forward retransmissions in Reno are possible. */
2066 if (tcp_is_reno(tp))
2067 return;
2068
2069 /* Yeah, we have to make difficult choice between forward transmission
2070 * and retransmission... Both ways have their merits...
2071 *
2072 * For now we do not retransmit anything, while we have some new
2073 * segments to send. In the other cases, follow rule 3 for
2074 * NextSeg() specified in RFC3517.
2075 */
2076
2077 if (tcp_may_send_now(sk))
2078 return; 2088 return;
2079 2089
2080 /* If nothing is SACKed, highest_sack in the loop won't be valid */ 2090 /* If nothing is SACKed, highest_sack in the loop won't be valid */