diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r-- | net/ipv4/tcp_output.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 896e9dfbdb5c..f57b5aa51b59 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -2529,8 +2529,9 @@ static void tcp_collapse_retrans(struct sock *sk, struct sk_buff *skb) | |||
2529 | 2529 | ||
2530 | tcp_unlink_write_queue(next_skb, sk); | 2530 | tcp_unlink_write_queue(next_skb, sk); |
2531 | 2531 | ||
2532 | skb_copy_from_linear_data(next_skb, skb_put(skb, next_skb_size), | 2532 | if (next_skb_size) |
2533 | next_skb_size); | 2533 | skb_copy_bits(next_skb, 0, skb_put(skb, next_skb_size), |
2534 | next_skb_size); | ||
2534 | 2535 | ||
2535 | if (next_skb->ip_summed == CHECKSUM_PARTIAL) | 2536 | if (next_skb->ip_summed == CHECKSUM_PARTIAL) |
2536 | skb->ip_summed = CHECKSUM_PARTIAL; | 2537 | skb->ip_summed = CHECKSUM_PARTIAL; |
@@ -2567,14 +2568,11 @@ static bool tcp_can_collapse(const struct sock *sk, const struct sk_buff *skb) | |||
2567 | { | 2568 | { |
2568 | if (tcp_skb_pcount(skb) > 1) | 2569 | if (tcp_skb_pcount(skb) > 1) |
2569 | return false; | 2570 | return false; |
2570 | /* TODO: SACK collapsing could be used to remove this condition */ | ||
2571 | if (skb_shinfo(skb)->nr_frags != 0) | ||
2572 | return false; | ||
2573 | if (skb_cloned(skb)) | 2571 | if (skb_cloned(skb)) |
2574 | return false; | 2572 | return false; |
2575 | if (skb == tcp_send_head(sk)) | 2573 | if (skb == tcp_send_head(sk)) |
2576 | return false; | 2574 | return false; |
2577 | /* Some heurestics for collapsing over SACK'd could be invented */ | 2575 | /* Some heuristics for collapsing over SACK'd could be invented */ |
2578 | if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED) | 2576 | if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED) |
2579 | return false; | 2577 | return false; |
2580 | 2578 | ||