- patches.fixes/ipv6-don-t-call-fib6_run_gc-until-routing-is-ready.patch:
[opensuse:kernel-source.git] / patches.kabi / revert-tcp-call-tcp_replace_ts_recent-from-tcp_ack.patch
1 From: Jiri Slaby <jslaby@suse.cz>
2 Date: Thu, 2 May 2013 11:31:30 +0200
3 Subject: Revert "tcp: call tcp_replace_ts_recent() from tcp_ack()"
4 Patch-mainline: never, kabi fix
5
6 This reverts commit 7c79dac82743cab718a07520617810eb5fb8eb56, upstream
7 commit 12fb3dd9dc3c64ba7d64cec977cca9b5fb7b1d4e. It was meant to fix
8 bd090dfc634ddd711a5fbd0cadc6e0ab4, but we revert that one in SP2.
9
10 SP3 needs the fix, so remember to remove this revert from SP3!
11
12 Signed-off-by: Jiri Slaby <jslaby@suse.cz>
13 ---
14  net/ipv4/tcp_input.c | 65 ++++++++++++++++++++++++++--------------------------
15  1 file changed, 33 insertions(+), 32 deletions(-)
16
17 diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
18 index b1172b4..ab44f9d 100644
19 --- a/net/ipv4/tcp_input.c
20 +++ b/net/ipv4/tcp_input.c
21 @@ -115,7 +115,6 @@ int sysctl_tcp_abc __read_mostly;
22  #define FLAG_DSACKING_ACK      0x800 /* SACK blocks contained D-SACK info */
23  #define FLAG_NONHEAD_RETRANS_ACKED     0x1000 /* Non-head rexmitted data was ACKed */
24  #define FLAG_SACK_RENEGING     0x2000 /* snd_una advanced to a sacked seq */
25 -#define FLAG_UPDATE_TS_RECENT  0x4000 /* tcp_replace_ts_recent() */
26  
27  #define FLAG_ACKED             (FLAG_DATA_ACKED|FLAG_SYN_ACKED)
28  #define FLAG_NOT_DUP           (FLAG_DATA|FLAG_WIN_UPDATE|FLAG_ACKED)
29 @@ -3657,27 +3656,6 @@ static void tcp_send_challenge_ack(struct sock *sk)
30         }
31  }
32  
33 -static void tcp_store_ts_recent(struct tcp_sock *tp)
34 -{
35 -       tp->rx_opt.ts_recent = tp->rx_opt.rcv_tsval;
36 -       tp->rx_opt.ts_recent_stamp = get_seconds();
37 -}
38 -
39 -static void tcp_replace_ts_recent(struct tcp_sock *tp, u32 seq)
40 -{
41 -       if (tp->rx_opt.saw_tstamp && !after(seq, tp->rcv_wup)) {
42 -               /* PAWS bug workaround wrt. ACK frames, the PAWS discard
43 -                * extra check below makes sure this can only happen
44 -                * for pure ACK frames.  -DaveM
45 -                *
46 -                * Not only, also it occurs for expired timestamps.
47 -                */
48 -
49 -               if (tcp_paws_check(&tp->rx_opt, 0))
50 -                       tcp_store_ts_recent(tp);
51 -       }
52 -}
53 -
54  /* This routine deals with incoming acks, but not outgoing ones. */
55  static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag)
56  {
57 @@ -3724,12 +3702,6 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag)
58         prior_fackets = tp->fackets_out;
59         prior_in_flight = tcp_packets_in_flight(tp);
60  
61 -       /* ts_recent update must be made after we are sure that the packet
62 -        * is in window.
63 -        */
64 -       if (flag & FLAG_UPDATE_TS_RECENT)
65 -               tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
66 -
67         if (!(flag & FLAG_SLOWPATH) && after(ack, prior_snd_una)) {
68                 /* Window is constant, pure forward advance.
69                  * No more checks are required.
70 @@ -4016,6 +3988,27 @@ u8 *tcp_parse_md5sig_option(struct tcphdr *th)
71  EXPORT_SYMBOL(tcp_parse_md5sig_option);
72  #endif
73  
74 +static inline void tcp_store_ts_recent(struct tcp_sock *tp)
75 +{
76 +       tp->rx_opt.ts_recent = tp->rx_opt.rcv_tsval;
77 +       tp->rx_opt.ts_recent_stamp = get_seconds();
78 +}
79 +
80 +static inline void tcp_replace_ts_recent(struct tcp_sock *tp, u32 seq)
81 +{
82 +       if (tp->rx_opt.saw_tstamp && !after(seq, tp->rcv_wup)) {
83 +               /* PAWS bug workaround wrt. ACK frames, the PAWS discard
84 +                * extra check below makes sure this can only happen
85 +                * for pure ACK frames.  -DaveM
86 +                *
87 +                * Not only, also it occurs for expired timestamps.
88 +                */
89 +
90 +               if (tcp_paws_check(&tp->rx_opt, 0))
91 +                       tcp_store_ts_recent(tp);
92 +       }
93 +}
94 +
95  /* Sorry, PAWS as specified is broken wrt. pure-ACKs -DaveM
96   *
97   * It is not fatal. If this ACK does _not_ change critical state (seqs, window)
98 @@ -5484,10 +5477,14 @@ slow_path:
99                 return 0;
100  
101  step5:
102 -       if (th->ack &&
103 -           tcp_ack(sk, skb, FLAG_SLOWPATH | FLAG_UPDATE_TS_RECENT) < 0)
104 +       if (th->ack && tcp_ack(sk, skb, FLAG_SLOWPATH) < 0)
105                 goto discard;
106  
107 +       /* ts_recent update must be made after we are sure that the packet
108 +        * is in window.
109 +        */
110 +       tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
111 +
112         tcp_rcv_rtt_measure_ts(sk, skb);
113  
114         /* Process urgent data. */
115 @@ -5851,8 +5848,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
116  
117         /* step 5: check the ACK field */
118         if (th->ack) {
119 -               int acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH |
120 -                                                 FLAG_UPDATE_TS_RECENT) > 0;
121 +               int acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH) > 0;
122  
123                 switch (sk->sk_state) {
124                 case TCP_SYN_RECV:
125 @@ -5965,6 +5961,11 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
126         } else
127                 goto discard;
128  
129 +       /* ts_recent update must be made after we are sure that the packet
130 +        * is in window.
131 +        */
132 +       tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
133 +
134         /* step 6: check the URG bit */
135         tcp_urg(sk, skb, th);
136  
137 -- 
138 1.8.2.1
139