aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r--net/ipv4/tcp_output.c10
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