| .. | .. |
|---|
| 2 | 2 | #include <linux/tcp.h> |
|---|
| 3 | 3 | #include <net/tcp.h> |
|---|
| 4 | 4 | |
|---|
| 5 | | -void tcp_mark_skb_lost(struct sock *sk, struct sk_buff *skb) |
|---|
| 6 | | -{ |
|---|
| 7 | | - struct tcp_sock *tp = tcp_sk(sk); |
|---|
| 8 | | - |
|---|
| 9 | | - tcp_skb_mark_lost_uncond_verify(tp, skb); |
|---|
| 10 | | - if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_RETRANS) { |
|---|
| 11 | | - /* Account for retransmits that are lost again */ |
|---|
| 12 | | - TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS; |
|---|
| 13 | | - tp->retrans_out -= tcp_skb_pcount(skb); |
|---|
| 14 | | - NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPLOSTRETRANSMIT, |
|---|
| 15 | | - tcp_skb_pcount(skb)); |
|---|
| 16 | | - } |
|---|
| 17 | | -} |
|---|
| 18 | | - |
|---|
| 19 | 5 | static bool tcp_rack_sent_after(u64 t1, u64 t2, u32 seq1, u32 seq2) |
|---|
| 20 | 6 | { |
|---|
| 21 | 7 | return t1 > t2 || (t1 == t2 && after(seq1, seq2)); |
|---|
| .. | .. |
|---|
| 33 | 19 | return 0; |
|---|
| 34 | 20 | |
|---|
| 35 | 21 | if (tp->sacked_out >= tp->reordering && |
|---|
| 36 | | - !(sock_net(sk)->ipv4.sysctl_tcp_recovery & TCP_RACK_NO_DUPTHRESH)) |
|---|
| 22 | + !(READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_recovery) & |
|---|
| 23 | + TCP_RACK_NO_DUPTHRESH)) |
|---|
| 37 | 24 | return 0; |
|---|
| 38 | 25 | } |
|---|
| 39 | 26 | |
|---|
| .. | .. |
|---|
| 50 | 37 | s32 tcp_rack_skb_timeout(struct tcp_sock *tp, struct sk_buff *skb, u32 reo_wnd) |
|---|
| 51 | 38 | { |
|---|
| 52 | 39 | return tp->rack.rtt_us + reo_wnd - |
|---|
| 53 | | - tcp_stamp_us_delta(tp->tcp_mstamp, skb->skb_mstamp); |
|---|
| 40 | + tcp_stamp_us_delta(tp->tcp_mstamp, tcp_skb_timestamp_us(skb)); |
|---|
| 54 | 41 | } |
|---|
| 55 | 42 | |
|---|
| 56 | 43 | /* RACK loss detection (IETF draft draft-ietf-tcpm-rack-01): |
|---|
| .. | .. |
|---|
| 91 | 78 | !(scb->sacked & TCPCB_SACKED_RETRANS)) |
|---|
| 92 | 79 | continue; |
|---|
| 93 | 80 | |
|---|
| 94 | | - if (!tcp_rack_sent_after(tp->rack.mstamp, skb->skb_mstamp, |
|---|
| 81 | + if (!tcp_rack_sent_after(tp->rack.mstamp, |
|---|
| 82 | + tcp_skb_timestamp_us(skb), |
|---|
| 95 | 83 | tp->rack.end_seq, scb->end_seq)) |
|---|
| 96 | 84 | break; |
|---|
| 97 | 85 | |
|---|
| .. | .. |
|---|
| 203 | 191 | { |
|---|
| 204 | 192 | struct tcp_sock *tp = tcp_sk(sk); |
|---|
| 205 | 193 | |
|---|
| 206 | | - if (sock_net(sk)->ipv4.sysctl_tcp_recovery & TCP_RACK_STATIC_REO_WND || |
|---|
| 194 | + if ((READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_recovery) & |
|---|
| 195 | + TCP_RACK_STATIC_REO_WND) || |
|---|
| 207 | 196 | !rs->prior_delivered) |
|---|
| 208 | 197 | return; |
|---|
| 209 | 198 | |
|---|
| .. | .. |
|---|
| 246 | 235 | tcp_fragment(sk, TCP_FRAG_IN_RTX_QUEUE, skb, |
|---|
| 247 | 236 | mss, mss, GFP_ATOMIC); |
|---|
| 248 | 237 | |
|---|
| 249 | | - tcp_skb_mark_lost_uncond_verify(tp, skb); |
|---|
| 238 | + tcp_mark_skb_lost(sk, skb); |
|---|
| 250 | 239 | } |
|---|
| 251 | 240 | } |
|---|