diff options
| author | Stephen Hemminger <shemminger@osdl.org> | 2005-11-10 20:09:53 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2005-11-10 20:09:53 -0500 |
| commit | 9772efb970780aeed488c19d8b4afd46c3b484af (patch) | |
| tree | de016aaa29c8a95e98c7abaa70c8b590160e2886 /include/net | |
| parent | 7faffa1c7fb9b8e8917e3225d4e2638270c0a48b (diff) | |
[TCP]: Appropriate Byte Count support
This is an updated version of the RFC3465 ABC patch originally
for Linux 2.6.11-rc4 by Yee-Ting Li. ABC is a way of counting
bytes ack'd rather than packets when updating congestion control.
The orignal ABC described in the RFC applied to a Reno style
algorithm. For advanced congestion control there is little
change after leaving slow start.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
| -rw-r--r-- | include/net/tcp.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h index 54c399886275..44ba4a21cbdc 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -218,6 +218,7 @@ extern int sysctl_tcp_low_latency; | |||
| 218 | extern int sysctl_tcp_nometrics_save; | 218 | extern int sysctl_tcp_nometrics_save; |
| 219 | extern int sysctl_tcp_moderate_rcvbuf; | 219 | extern int sysctl_tcp_moderate_rcvbuf; |
| 220 | extern int sysctl_tcp_tso_win_divisor; | 220 | extern int sysctl_tcp_tso_win_divisor; |
| 221 | extern int sysctl_tcp_abc; | ||
| 221 | 222 | ||
| 222 | extern atomic_t tcp_memory_allocated; | 223 | extern atomic_t tcp_memory_allocated; |
| 223 | extern atomic_t tcp_sockets_allocated; | 224 | extern atomic_t tcp_sockets_allocated; |
| @@ -770,6 +771,23 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk) | |||
| 770 | */ | 771 | */ |
| 771 | static inline void tcp_slow_start(struct tcp_sock *tp) | 772 | static inline void tcp_slow_start(struct tcp_sock *tp) |
| 772 | { | 773 | { |
| 774 | if (sysctl_tcp_abc) { | ||
| 775 | /* RFC3465: Slow Start | ||
| 776 | * TCP sender SHOULD increase cwnd by the number of | ||
| 777 | * previously unacknowledged bytes ACKed by each incoming | ||
| 778 | * acknowledgment, provided the increase is not more than L | ||
| 779 | */ | ||
| 780 | if (tp->bytes_acked < tp->mss_cache) | ||
| 781 | return; | ||
| 782 | |||
| 783 | /* We MAY increase by 2 if discovered delayed ack */ | ||
| 784 | if (sysctl_tcp_abc > 1 && tp->bytes_acked > 2*tp->mss_cache) { | ||
| 785 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) | ||
| 786 | tp->snd_cwnd++; | ||
| 787 | } | ||
| 788 | } | ||
| 789 | tp->bytes_acked = 0; | ||
| 790 | |||
| 773 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) | 791 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) |
| 774 | tp->snd_cwnd++; | 792 | tp->snd_cwnd++; |
| 775 | } | 793 | } |
| @@ -804,6 +822,7 @@ static inline void tcp_enter_cwr(struct sock *sk) | |||
| 804 | struct tcp_sock *tp = tcp_sk(sk); | 822 | struct tcp_sock *tp = tcp_sk(sk); |
| 805 | 823 | ||
| 806 | tp->prior_ssthresh = 0; | 824 | tp->prior_ssthresh = 0; |
| 825 | tp->bytes_acked = 0; | ||
| 807 | if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) { | 826 | if (inet_csk(sk)->icsk_ca_state < TCP_CA_CWR) { |
| 808 | __tcp_enter_cwr(sk); | 827 | __tcp_enter_cwr(sk); |
| 809 | tcp_set_ca_state(sk, TCP_CA_CWR); | 828 | tcp_set_ca_state(sk, TCP_CA_CWR); |
