diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r-- | net/ipv4/tcp_output.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index e48e28e7d539..4f8a8a17891a 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -1295,6 +1295,7 @@ static int tcp_mtu_probe(struct sock *sk) | |||
1295 | struct sk_buff *skb, *nskb, *next; | 1295 | struct sk_buff *skb, *nskb, *next; |
1296 | int len; | 1296 | int len; |
1297 | int probe_size; | 1297 | int probe_size; |
1298 | int size_needed; | ||
1298 | unsigned int pif; | 1299 | unsigned int pif; |
1299 | int copy; | 1300 | int copy; |
1300 | int mss_now; | 1301 | int mss_now; |
@@ -1313,6 +1314,7 @@ static int tcp_mtu_probe(struct sock *sk) | |||
1313 | /* Very simple search strategy: just double the MSS. */ | 1314 | /* Very simple search strategy: just double the MSS. */ |
1314 | mss_now = tcp_current_mss(sk, 0); | 1315 | mss_now = tcp_current_mss(sk, 0); |
1315 | probe_size = 2*tp->mss_cache; | 1316 | probe_size = 2*tp->mss_cache; |
1317 | size_needed = probe_size + (tp->reordering + 1) * tp->mss_cache; | ||
1316 | if (probe_size > tcp_mtu_to_mss(sk, icsk->icsk_mtup.search_high)) { | 1318 | if (probe_size > tcp_mtu_to_mss(sk, icsk->icsk_mtup.search_high)) { |
1317 | /* TODO: set timer for probe_converge_event */ | 1319 | /* TODO: set timer for probe_converge_event */ |
1318 | return -1; | 1320 | return -1; |
@@ -1322,18 +1324,15 @@ static int tcp_mtu_probe(struct sock *sk) | |||
1322 | len = 0; | 1324 | len = 0; |
1323 | if ((skb = tcp_send_head(sk)) == NULL) | 1325 | if ((skb = tcp_send_head(sk)) == NULL) |
1324 | return -1; | 1326 | return -1; |
1325 | while ((len += skb->len) < probe_size && !tcp_skb_is_last(sk, skb)) | 1327 | while ((len += skb->len) < size_needed && !tcp_skb_is_last(sk, skb)) |
1326 | skb = tcp_write_queue_next(sk, skb); | 1328 | skb = tcp_write_queue_next(sk, skb); |
1327 | if (len < probe_size) | 1329 | if (len < size_needed) |
1328 | return -1; | 1330 | return -1; |
1329 | 1331 | ||
1330 | /* Receive window check. */ | 1332 | if (tp->snd_wnd < size_needed) |
1331 | if (after(TCP_SKB_CB(skb)->seq + probe_size, tp->snd_una + tp->snd_wnd)) { | 1333 | return -1; |
1332 | if (tp->snd_wnd < probe_size) | 1334 | if (after(tp->snd_nxt + size_needed, tp->snd_una + tp->snd_wnd)) |
1333 | return -1; | 1335 | return 0; |
1334 | else | ||
1335 | return 0; | ||
1336 | } | ||
1337 | 1336 | ||
1338 | /* Do we need to wait to drain cwnd? */ | 1337 | /* Do we need to wait to drain cwnd? */ |
1339 | pif = tcp_packets_in_flight(tp); | 1338 | pif = tcp_packets_in_flight(tp); |