aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Langley <agl@imperialviolet.org>2008-07-19 03:07:02 -0400
committerDavid S. Miller <davem@davemloft.net>2008-07-19 03:07:02 -0400
commit4389dded7767d24290463f2a8302ba3253ebdd56 (patch)
treeed34a2084c47c6c707e0ce6b4eab8d442f20c4c3
parent33ad798c924b4a1afad3593f2796d465040aadd5 (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.h6
-rw-r--r--net/ipv4/tcp_input.c25
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
227struct tcp_request_sock { 233struct 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.