diff options
author | Adam Langley <agl@imperialviolet.org> | 2008-07-19 03:07:02 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-19 03:07:02 -0400 |
commit | 4389dded7767d24290463f2a8302ba3253ebdd56 (patch) | |
tree | ed34a2084c47c6c707e0ce6b4eab8d442f20c4c3 | |
parent | 33ad798c924b4a1afad3593f2796d465040aadd5 (diff) |
tcp: Remove redundant checks when setting eff_sacks
Remove redundant checks when setting eff_sacks and make the number of SACKs a
compile time constant. Now that the options code knows how many SACK blocks can
fit in the header, we don't need to have the SACK code guessing at it.
Signed-off-by: Adam Langley <agl@imperialviolet.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/tcp.h | 6 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 25 |
2 files changed, 16 insertions, 15 deletions
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 07e79bdb9cdf..2e2557388e36 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h | |||
@@ -224,6 +224,12 @@ struct tcp_options_received { | |||
224 | u16 mss_clamp; /* Maximal mss, negotiated at connection setup */ | 224 | u16 mss_clamp; /* Maximal mss, negotiated at connection setup */ |
225 | }; | 225 | }; |
226 | 226 | ||
227 | /* This is the max number of SACKS that we'll generate and process. It's safe | ||
228 | * to increse this, although since: | ||
229 | * size = TCPOLEN_SACK_BASE_ALIGNED (4) + n * TCPOLEN_SACK_PERBLOCK (8) | ||
230 | * only four options will fit in a standard TCP header */ | ||
231 | #define TCP_NUM_SACKS 4 | ||
232 | |||
227 | struct tcp_request_sock { | 233 | struct tcp_request_sock { |
228 | struct inet_request_sock req; | 234 | struct inet_request_sock req; |
229 | #ifdef CONFIG_TCP_MD5SIG | 235 | #ifdef CONFIG_TCP_MD5SIG |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 88810bc01370..1f5e6049883e 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -1423,10 +1423,10 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, | |||
1423 | unsigned char *ptr = (skb_transport_header(ack_skb) + | 1423 | unsigned char *ptr = (skb_transport_header(ack_skb) + |
1424 | TCP_SKB_CB(ack_skb)->sacked); | 1424 | TCP_SKB_CB(ack_skb)->sacked); |
1425 | struct tcp_sack_block_wire *sp_wire = (struct tcp_sack_block_wire *)(ptr+2); | 1425 | struct tcp_sack_block_wire *sp_wire = (struct tcp_sack_block_wire *)(ptr+2); |
1426 | struct tcp_sack_block sp[4]; | 1426 | struct tcp_sack_block sp[TCP_NUM_SACKS]; |
1427 | struct tcp_sack_block *cache; | 1427 | struct tcp_sack_block *cache; |
1428 | struct sk_buff *skb; | 1428 | struct sk_buff *skb; |
1429 | int num_sacks = (ptr[1] - TCPOLEN_SACK_BASE) >> 3; | 1429 | int num_sacks = min(TCP_NUM_SACKS, (ptr[1] - TCPOLEN_SACK_BASE) >> 3); |
1430 | int used_sacks; | 1430 | int used_sacks; |
1431 | int reord = tp->packets_out; | 1431 | int reord = tp->packets_out; |
1432 | int flag = 0; | 1432 | int flag = 0; |
@@ -3735,8 +3735,7 @@ static void tcp_dsack_set(struct sock *sk, u32 seq, u32 end_seq) | |||
3735 | tp->rx_opt.dsack = 1; | 3735 | tp->rx_opt.dsack = 1; |
3736 | tp->duplicate_sack[0].start_seq = seq; | 3736 | tp->duplicate_sack[0].start_seq = seq; |
3737 | tp->duplicate_sack[0].end_seq = end_seq; | 3737 | tp->duplicate_sack[0].end_seq = end_seq; |
3738 | tp->rx_opt.eff_sacks = min(tp->rx_opt.num_sacks + 1, | 3738 | tp->rx_opt.eff_sacks = tp->rx_opt.num_sacks + 1; |
3739 | 4 - tp->rx_opt.tstamp_ok); | ||
3740 | } | 3739 | } |
3741 | } | 3740 | } |
3742 | 3741 | ||
@@ -3791,9 +3790,8 @@ static void tcp_sack_maybe_coalesce(struct tcp_sock *tp) | |||
3791 | * Decrease num_sacks. | 3790 | * Decrease num_sacks. |
3792 | */ | 3791 | */ |
3793 | tp->rx_opt.num_sacks--; | 3792 | tp->rx_opt.num_sacks--; |
3794 | tp->rx_opt.eff_sacks = min(tp->rx_opt.num_sacks + | 3793 | tp->rx_opt.eff_sacks = tp->rx_opt.num_sacks + |
3795 | tp->rx_opt.dsack, | 3794 | tp->rx_opt.dsack; |
3796 | 4 - tp->rx_opt.tstamp_ok); | ||
3797 | for (i = this_sack; i < tp->rx_opt.num_sacks; i++) | 3795 | for (i = this_sack; i < tp->rx_opt.num_sacks; i++) |
3798 | sp[i] = sp[i + 1]; | 3796 | sp[i] = sp[i + 1]; |
3799 | continue; | 3797 | continue; |
@@ -3843,7 +3841,7 @@ static void tcp_sack_new_ofo_skb(struct sock *sk, u32 seq, u32 end_seq) | |||
3843 | * | 3841 | * |
3844 | * If the sack array is full, forget about the last one. | 3842 | * If the sack array is full, forget about the last one. |
3845 | */ | 3843 | */ |
3846 | if (this_sack >= 4) { | 3844 | if (this_sack >= TCP_NUM_SACKS) { |
3847 | this_sack--; | 3845 | this_sack--; |
3848 | tp->rx_opt.num_sacks--; | 3846 | tp->rx_opt.num_sacks--; |
3849 | sp--; | 3847 | sp--; |
@@ -3856,8 +3854,7 @@ new_sack: | |||
3856 | sp->start_seq = seq; | 3854 | sp->start_seq = seq; |
3857 | sp->end_seq = end_seq; | 3855 | sp->end_seq = end_seq; |
3858 | tp->rx_opt.num_sacks++; | 3856 | tp->rx_opt.num_sacks++; |
3859 | tp->rx_opt.eff_sacks = min(tp->rx_opt.num_sacks + tp->rx_opt.dsack, | 3857 | tp->rx_opt.eff_sacks = tp->rx_opt.num_sacks + tp->rx_opt.dsack; |
3860 | 4 - tp->rx_opt.tstamp_ok); | ||
3861 | } | 3858 | } |
3862 | 3859 | ||
3863 | /* RCV.NXT advances, some SACKs should be eaten. */ | 3860 | /* RCV.NXT advances, some SACKs should be eaten. */ |
@@ -3894,9 +3891,8 @@ static void tcp_sack_remove(struct tcp_sock *tp) | |||
3894 | } | 3891 | } |
3895 | if (num_sacks != tp->rx_opt.num_sacks) { | 3892 | if (num_sacks != tp->rx_opt.num_sacks) { |
3896 | tp->rx_opt.num_sacks = num_sacks; | 3893 | tp->rx_opt.num_sacks = num_sacks; |
3897 | tp->rx_opt.eff_sacks = min(tp->rx_opt.num_sacks + | 3894 | tp->rx_opt.eff_sacks = tp->rx_opt.num_sacks + |
3898 | tp->rx_opt.dsack, | 3895 | tp->rx_opt.dsack; |
3899 | 4 - tp->rx_opt.tstamp_ok); | ||
3900 | } | 3896 | } |
3901 | } | 3897 | } |
3902 | 3898 | ||
@@ -3975,8 +3971,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) | |||
3975 | 3971 | ||
3976 | if (tp->rx_opt.dsack) { | 3972 | if (tp->rx_opt.dsack) { |
3977 | tp->rx_opt.dsack = 0; | 3973 | tp->rx_opt.dsack = 0; |
3978 | tp->rx_opt.eff_sacks = min_t(unsigned int, tp->rx_opt.num_sacks, | 3974 | tp->rx_opt.eff_sacks = tp->rx_opt.num_sacks; |
3979 | 4 - tp->rx_opt.tstamp_ok); | ||
3980 | } | 3975 | } |
3981 | 3976 | ||
3982 | /* Queue data for delivery to the user. | 3977 | /* Queue data for delivery to the user. |