|
@@ -944,9 +944,15 @@ static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,
|
|
/* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV
|
|
/* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV
|
|
* sk->sk_state == TCP_SYN_RECV -> for Fast Open.
|
|
* sk->sk_state == TCP_SYN_RECV -> for Fast Open.
|
|
*/
|
|
*/
|
|
|
|
+ /* RFC 7323 2.3
|
|
|
|
+ * The window field (SEG.WND) of every outgoing segment, with the
|
|
|
|
+ * exception of <SYN> segments, MUST be right-shifted by
|
|
|
|
+ * Rcv.Wind.Shift bits:
|
|
|
|
+ */
|
|
tcp_v6_send_ack(sk, skb, (sk->sk_state == TCP_LISTEN) ?
|
|
tcp_v6_send_ack(sk, skb, (sk->sk_state == TCP_LISTEN) ?
|
|
tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt,
|
|
tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt,
|
|
- tcp_rsk(req)->rcv_nxt, req->rsk_rcv_wnd,
|
|
|
|
|
|
+ tcp_rsk(req)->rcv_nxt,
|
|
|
|
+ req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale,
|
|
tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if,
|
|
tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if,
|
|
tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr),
|
|
tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr),
|
|
0, 0);
|
|
0, 0);
|