.. | .. |
---|
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 | } |
---|