diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 93e128c239c4..c4679f343675 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -1367,7 +1367,7 @@ static struct sk_buff *tcp_sacktag_walk(struct sk_buff *skb, struct sock *sk, | |||
| 1367 | * a normal way | 1367 | * a normal way |
| 1368 | */ | 1368 | */ |
| 1369 | static struct sk_buff *tcp_sacktag_skip(struct sk_buff *skb, struct sock *sk, | 1369 | static struct sk_buff *tcp_sacktag_skip(struct sk_buff *skb, struct sock *sk, |
| 1370 | u32 skip_to_seq) | 1370 | u32 skip_to_seq, int *fack_count) |
| 1371 | { | 1371 | { |
| 1372 | tcp_for_write_queue_from(skb, sk) { | 1372 | tcp_for_write_queue_from(skb, sk) { |
| 1373 | if (skb == tcp_send_head(sk)) | 1373 | if (skb == tcp_send_head(sk)) |
| @@ -1375,6 +1375,8 @@ static struct sk_buff *tcp_sacktag_skip(struct sk_buff *skb, struct sock *sk, | |||
| 1375 | 1375 | ||
| 1376 | if (!before(TCP_SKB_CB(skb)->end_seq, skip_to_seq)) | 1376 | if (!before(TCP_SKB_CB(skb)->end_seq, skip_to_seq)) |
| 1377 | break; | 1377 | break; |
| 1378 | |||
| 1379 | *fack_count += tcp_skb_pcount(skb); | ||
| 1378 | } | 1380 | } |
| 1379 | return skb; | 1381 | return skb; |
| 1380 | } | 1382 | } |
| @@ -1390,7 +1392,7 @@ static struct sk_buff *tcp_maybe_skipping_dsack(struct sk_buff *skb, | |||
| 1390 | return skb; | 1392 | return skb; |
| 1391 | 1393 | ||
| 1392 | if (before(next_dup->start_seq, skip_to_seq)) { | 1394 | if (before(next_dup->start_seq, skip_to_seq)) { |
| 1393 | skb = tcp_sacktag_skip(skb, sk, next_dup->start_seq); | 1395 | skb = tcp_sacktag_skip(skb, sk, next_dup->start_seq, fack_count); |
| 1394 | tcp_sacktag_walk(skb, sk, NULL, | 1396 | tcp_sacktag_walk(skb, sk, NULL, |
| 1395 | next_dup->start_seq, next_dup->end_seq, | 1397 | next_dup->start_seq, next_dup->end_seq, |
| 1396 | 1, fack_count, reord, flag); | 1398 | 1, fack_count, reord, flag); |
| @@ -1537,7 +1539,8 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, | |||
| 1537 | 1539 | ||
| 1538 | /* Head todo? */ | 1540 | /* Head todo? */ |
| 1539 | if (before(start_seq, cache->start_seq)) { | 1541 | if (before(start_seq, cache->start_seq)) { |
| 1540 | skb = tcp_sacktag_skip(skb, sk, start_seq); | 1542 | skb = tcp_sacktag_skip(skb, sk, start_seq, |
| 1543 | &fack_count); | ||
| 1541 | skb = tcp_sacktag_walk(skb, sk, next_dup, | 1544 | skb = tcp_sacktag_walk(skb, sk, next_dup, |
| 1542 | start_seq, | 1545 | start_seq, |
| 1543 | cache->start_seq, | 1546 | cache->start_seq, |
| @@ -1565,7 +1568,8 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, | |||
| 1565 | goto walk; | 1568 | goto walk; |
| 1566 | } | 1569 | } |
| 1567 | 1570 | ||
| 1568 | skb = tcp_sacktag_skip(skb, sk, cache->end_seq); | 1571 | skb = tcp_sacktag_skip(skb, sk, cache->end_seq, |
| 1572 | &fack_count); | ||
| 1569 | /* Check overlap against next cached too (past this one already) */ | 1573 | /* Check overlap against next cached too (past this one already) */ |
| 1570 | cache++; | 1574 | cache++; |
| 1571 | continue; | 1575 | continue; |
| @@ -1577,7 +1581,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, | |||
| 1577 | break; | 1581 | break; |
| 1578 | fack_count = tp->fackets_out; | 1582 | fack_count = tp->fackets_out; |
| 1579 | } | 1583 | } |
| 1580 | skb = tcp_sacktag_skip(skb, sk, start_seq); | 1584 | skb = tcp_sacktag_skip(skb, sk, start_seq, &fack_count); |
| 1581 | 1585 | ||
| 1582 | walk: | 1586 | walk: |
| 1583 | skb = tcp_sacktag_walk(skb, sk, next_dup, start_seq, end_seq, | 1587 | skb = tcp_sacktag_walk(skb, sk, next_dup, start_seq, end_seq, |
