diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r-- | net/ipv4/tcp_output.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 7d2dc015cd19..441ae9da3a23 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -2441,6 +2441,20 @@ u32 __tcp_select_window(struct sock *sk) | |||
2441 | return window; | 2441 | return window; |
2442 | } | 2442 | } |
2443 | 2443 | ||
2444 | void tcp_skb_collapse_tstamp(struct sk_buff *skb, | ||
2445 | const struct sk_buff *next_skb) | ||
2446 | { | ||
2447 | const struct skb_shared_info *next_shinfo = skb_shinfo(next_skb); | ||
2448 | u8 tsflags = next_shinfo->tx_flags & SKBTX_ANY_TSTAMP; | ||
2449 | |||
2450 | if (unlikely(tsflags)) { | ||
2451 | struct skb_shared_info *shinfo = skb_shinfo(skb); | ||
2452 | |||
2453 | shinfo->tx_flags |= tsflags; | ||
2454 | shinfo->tskey = next_shinfo->tskey; | ||
2455 | } | ||
2456 | } | ||
2457 | |||
2444 | /* Collapses two adjacent SKB's during retransmission. */ | 2458 | /* Collapses two adjacent SKB's during retransmission. */ |
2445 | static void tcp_collapse_retrans(struct sock *sk, struct sk_buff *skb) | 2459 | static void tcp_collapse_retrans(struct sock *sk, struct sk_buff *skb) |
2446 | { | 2460 | { |
@@ -2484,6 +2498,8 @@ static void tcp_collapse_retrans(struct sock *sk, struct sk_buff *skb) | |||
2484 | 2498 | ||
2485 | tcp_adjust_pcount(sk, next_skb, tcp_skb_pcount(next_skb)); | 2499 | tcp_adjust_pcount(sk, next_skb, tcp_skb_pcount(next_skb)); |
2486 | 2500 | ||
2501 | tcp_skb_collapse_tstamp(skb, next_skb); | ||
2502 | |||
2487 | sk_wmem_free_skb(sk, next_skb); | 2503 | sk_wmem_free_skb(sk, next_skb); |
2488 | } | 2504 | } |
2489 | 2505 | ||