diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/tcp_input.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index ca9590f4f520..0f757578f3bd 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -1403,8 +1403,6 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
1403 | if (in_sack < 0) | 1403 | if (in_sack < 0) |
1404 | break; | 1404 | break; |
1405 | 1405 | ||
1406 | fack_count += tcp_skb_pcount(skb); | ||
1407 | |||
1408 | sacked = TCP_SKB_CB(skb)->sacked; | 1406 | sacked = TCP_SKB_CB(skb)->sacked; |
1409 | 1407 | ||
1410 | /* Account D-SACK for retransmitted packet. */ | 1408 | /* Account D-SACK for retransmitted packet. */ |
@@ -1427,11 +1425,14 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
1427 | } | 1425 | } |
1428 | 1426 | ||
1429 | /* Nothing to do; acked frame is about to be dropped. */ | 1427 | /* Nothing to do; acked frame is about to be dropped. */ |
1428 | fack_count += tcp_skb_pcount(skb); | ||
1430 | continue; | 1429 | continue; |
1431 | } | 1430 | } |
1432 | 1431 | ||
1433 | if (!in_sack) | 1432 | if (!in_sack) { |
1433 | fack_count += tcp_skb_pcount(skb); | ||
1434 | continue; | 1434 | continue; |
1435 | } | ||
1435 | 1436 | ||
1436 | if (!(sacked&TCPCB_SACKED_ACKED)) { | 1437 | if (!(sacked&TCPCB_SACKED_ACKED)) { |
1437 | if (sacked & TCPCB_SACKED_RETRANS) { | 1438 | if (sacked & TCPCB_SACKED_RETRANS) { |
@@ -1480,6 +1481,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
1480 | flag |= FLAG_DATA_SACKED; | 1481 | flag |= FLAG_DATA_SACKED; |
1481 | tp->sacked_out += tcp_skb_pcount(skb); | 1482 | tp->sacked_out += tcp_skb_pcount(skb); |
1482 | 1483 | ||
1484 | fack_count += tcp_skb_pcount(skb); | ||
1483 | if (fack_count > tp->fackets_out) | 1485 | if (fack_count > tp->fackets_out) |
1484 | tp->fackets_out = fack_count; | 1486 | tp->fackets_out = fack_count; |
1485 | 1487 | ||
@@ -1490,6 +1492,8 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
1490 | } else { | 1492 | } else { |
1491 | if (dup_sack && (sacked&TCPCB_RETRANS)) | 1493 | if (dup_sack && (sacked&TCPCB_RETRANS)) |
1492 | reord = min(fack_count, reord); | 1494 | reord = min(fack_count, reord); |
1495 | |||
1496 | fack_count += tcp_skb_pcount(skb); | ||
1493 | } | 1497 | } |
1494 | 1498 | ||
1495 | /* D-SACK. We can detect redundant retransmission | 1499 | /* D-SACK. We can detect redundant retransmission |
@@ -1515,7 +1519,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_ | |||
1515 | 1519 | ||
1516 | if ((reord < tp->fackets_out) && icsk->icsk_ca_state != TCP_CA_Loss && | 1520 | if ((reord < tp->fackets_out) && icsk->icsk_ca_state != TCP_CA_Loss && |
1517 | (!tp->frto_highmark || after(tp->snd_una, tp->frto_highmark))) | 1521 | (!tp->frto_highmark || after(tp->snd_una, tp->frto_highmark))) |
1518 | tcp_update_reordering(sk, ((tp->fackets_out + 1) - reord), 0); | 1522 | tcp_update_reordering(sk, tp->fackets_out - reord, 0); |
1519 | 1523 | ||
1520 | #if FASTRETRANS_DEBUG > 0 | 1524 | #if FASTRETRANS_DEBUG > 0 |
1521 | BUG_TRAP((int)tp->sacked_out >= 0); | 1525 | BUG_TRAP((int)tp->sacked_out >= 0); |