aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/tcp.c12
-rw-r--r--net/ipv4/tcp_input.c99
-rw-r--r--net/ipv4/tcp_metrics.c10
-rw-r--r--net/ipv4/tcp_minisocks.c5
-rw-r--r--net/ipv4/tcp_output.c4
-rw-r--r--net/ipv4/tcp_timer.c3
6 files changed, 84 insertions, 49 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index f7567a3698eb..1fa15beb8380 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -457,18 +457,6 @@ void tcp_init_sock(struct sock *sk)
457} 457}
458EXPORT_SYMBOL(tcp_init_sock); 458EXPORT_SYMBOL(tcp_init_sock);
459 459
460void tcp_init_transfer(struct sock *sk, int bpf_op)
461{
462 struct inet_connection_sock *icsk = inet_csk(sk);
463
464 tcp_mtup_init(sk);
465 icsk->icsk_af_ops->rebuild_header(sk);
466 tcp_init_metrics(sk);
467 tcp_call_bpf(sk, bpf_op, 0, NULL);
468 tcp_init_congestion_control(sk);
469 tcp_init_buffer_space(sk);
470}
471
472static void tcp_tx_timestamp(struct sock *sk, u16 tsflags) 460static void tcp_tx_timestamp(struct sock *sk, u16 tsflags)
473{ 461{
474 struct sk_buff *skb = tcp_write_queue_tail(sk); 462 struct sk_buff *skb = tcp_write_queue_tail(sk);
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 97671bff597a..077d9abdfcf5 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -2252,7 +2252,7 @@ static bool tcp_skb_spurious_retrans(const struct tcp_sock *tp,
2252 */ 2252 */
2253static inline bool tcp_packet_delayed(const struct tcp_sock *tp) 2253static inline bool tcp_packet_delayed(const struct tcp_sock *tp)
2254{ 2254{
2255 return !tp->retrans_stamp || 2255 return tp->retrans_stamp &&
2256 tcp_tsopt_ecr_before(tp, tp->retrans_stamp); 2256 tcp_tsopt_ecr_before(tp, tp->retrans_stamp);
2257} 2257}
2258 2258
@@ -3521,7 +3521,7 @@ static void tcp_xmit_recovery(struct sock *sk, int rexmit)
3521{ 3521{
3522 struct tcp_sock *tp = tcp_sk(sk); 3522 struct tcp_sock *tp = tcp_sk(sk);
3523 3523
3524 if (rexmit == REXMIT_NONE) 3524 if (rexmit == REXMIT_NONE || sk->sk_state == TCP_SYN_SENT)
3525 return; 3525 return;
3526 3526
3527 if (unlikely(rexmit == 2)) { 3527 if (unlikely(rexmit == 2)) {
@@ -5647,6 +5647,32 @@ discard:
5647} 5647}
5648EXPORT_SYMBOL(tcp_rcv_established); 5648EXPORT_SYMBOL(tcp_rcv_established);
5649 5649
5650void tcp_init_transfer(struct sock *sk, int bpf_op)
5651{
5652 struct inet_connection_sock *icsk = inet_csk(sk);
5653 struct tcp_sock *tp = tcp_sk(sk);
5654
5655 tcp_mtup_init(sk);
5656 icsk->icsk_af_ops->rebuild_header(sk);
5657 tcp_init_metrics(sk);
5658
5659 /* Initialize the congestion window to start the transfer.
5660 * Cut cwnd down to 1 per RFC5681 if SYN or SYN-ACK has been
5661 * retransmitted. In light of RFC6298 more aggressive 1sec
5662 * initRTO, we only reset cwnd when more than 1 SYN/SYN-ACK
5663 * retransmission has occurred.
5664 */
5665 if (tp->total_retrans > 1 && tp->undo_marker)
5666 tp->snd_cwnd = 1;
5667 else
5668 tp->snd_cwnd = tcp_init_cwnd(tp, __sk_dst_get(sk));
5669 tp->snd_cwnd_stamp = tcp_jiffies32;
5670
5671 tcp_call_bpf(sk, bpf_op, 0, NULL);
5672 tcp_init_congestion_control(sk);
5673 tcp_init_buffer_space(sk);
5674}
5675
5650void tcp_finish_connect(struct sock *sk, struct sk_buff *skb) 5676void tcp_finish_connect(struct sock *sk, struct sk_buff *skb)
5651{ 5677{
5652 struct tcp_sock *tp = tcp_sk(sk); 5678 struct tcp_sock *tp = tcp_sk(sk);
@@ -5748,6 +5774,21 @@ static void smc_check_reset_syn(struct tcp_sock *tp)
5748#endif 5774#endif
5749} 5775}
5750 5776
5777static void tcp_try_undo_spurious_syn(struct sock *sk)
5778{
5779 struct tcp_sock *tp = tcp_sk(sk);
5780 u32 syn_stamp;
5781
5782 /* undo_marker is set when SYN or SYNACK times out. The timeout is
5783 * spurious if the ACK's timestamp option echo value matches the
5784 * original SYN timestamp.
5785 */
5786 syn_stamp = tp->retrans_stamp;
5787 if (tp->undo_marker && syn_stamp && tp->rx_opt.saw_tstamp &&
5788 syn_stamp == tp->rx_opt.rcv_tsecr)
5789 tp->undo_marker = 0;
5790}
5791
5751static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, 5792static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
5752 const struct tcphdr *th) 5793 const struct tcphdr *th)
5753{ 5794{
@@ -5815,6 +5856,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
5815 tcp_ecn_rcv_synack(tp, th); 5856 tcp_ecn_rcv_synack(tp, th);
5816 5857
5817 tcp_init_wl(tp, TCP_SKB_CB(skb)->seq); 5858 tcp_init_wl(tp, TCP_SKB_CB(skb)->seq);
5859 tcp_try_undo_spurious_syn(sk);
5818 tcp_ack(sk, skb, FLAG_SLOWPATH); 5860 tcp_ack(sk, skb, FLAG_SLOWPATH);
5819 5861
5820 /* Ok.. it's good. Set up sequence numbers and 5862 /* Ok.. it's good. Set up sequence numbers and
@@ -5973,6 +6015,27 @@ reset_and_undo:
5973 return 1; 6015 return 1;
5974} 6016}
5975 6017
6018static void tcp_rcv_synrecv_state_fastopen(struct sock *sk)
6019{
6020 tcp_try_undo_loss(sk, false);
6021 inet_csk(sk)->icsk_retransmits = 0;
6022
6023 /* Once we leave TCP_SYN_RECV or TCP_FIN_WAIT_1,
6024 * we no longer need req so release it.
6025 */
6026 reqsk_fastopen_remove(sk, tcp_sk(sk)->fastopen_rsk, false);
6027
6028 /* Re-arm the timer because data may have been sent out.
6029 * This is similar to the regular data transmission case
6030 * when new data has just been ack'ed.
6031 *
6032 * (TFO) - we could try to be more aggressive and
6033 * retransmitting any data sooner based on when they
6034 * are sent out.
6035 */
6036 tcp_rearm_rto(sk);
6037}
6038
5976/* 6039/*
5977 * This function implements the receiving procedure of RFC 793 for 6040 * This function implements the receiving procedure of RFC 793 for
5978 * all states except ESTABLISHED and TIME_WAIT. 6041 * all states except ESTABLISHED and TIME_WAIT.
@@ -6069,22 +6132,11 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
6069 if (!tp->srtt_us) 6132 if (!tp->srtt_us)
6070 tcp_synack_rtt_meas(sk, req); 6133 tcp_synack_rtt_meas(sk, req);
6071 6134
6072 /* Once we leave TCP_SYN_RECV, we no longer need req
6073 * so release it.
6074 */
6075 if (req) { 6135 if (req) {
6076 inet_csk(sk)->icsk_retransmits = 0; 6136 tcp_rcv_synrecv_state_fastopen(sk);
6077 reqsk_fastopen_remove(sk, req, false);
6078 /* Re-arm the timer because data may have been sent out.
6079 * This is similar to the regular data transmission case
6080 * when new data has just been ack'ed.
6081 *
6082 * (TFO) - we could try to be more aggressive and
6083 * retransmitting any data sooner based on when they
6084 * are sent out.
6085 */
6086 tcp_rearm_rto(sk);
6087 } else { 6137 } else {
6138 tcp_try_undo_spurious_syn(sk);
6139 tp->retrans_stamp = 0;
6088 tcp_init_transfer(sk, BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB); 6140 tcp_init_transfer(sk, BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB);
6089 tp->copied_seq = tp->rcv_nxt; 6141 tp->copied_seq = tp->rcv_nxt;
6090 } 6142 }
@@ -6119,16 +6171,9 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
6119 case TCP_FIN_WAIT1: { 6171 case TCP_FIN_WAIT1: {
6120 int tmo; 6172 int tmo;
6121 6173
6122 /* If we enter the TCP_FIN_WAIT1 state and we are a 6174 if (req)
6123 * Fast Open socket and this is the first acceptable 6175 tcp_rcv_synrecv_state_fastopen(sk);
6124 * ACK we have received, this would have acknowledged 6176
6125 * our SYNACK so stop the SYNACK timer.
6126 */
6127 if (req) {
6128 /* We no longer need the request sock. */
6129 reqsk_fastopen_remove(sk, req, false);
6130 tcp_rearm_rto(sk);
6131 }
6132 if (tp->snd_una != tp->write_seq) 6177 if (tp->snd_una != tp->write_seq)
6133 break; 6178 break;
6134 6179
@@ -6303,7 +6348,7 @@ static void tcp_openreq_init(struct request_sock *req,
6303 req->cookie_ts = 0; 6348 req->cookie_ts = 0;
6304 tcp_rsk(req)->rcv_isn = TCP_SKB_CB(skb)->seq; 6349 tcp_rsk(req)->rcv_isn = TCP_SKB_CB(skb)->seq;
6305 tcp_rsk(req)->rcv_nxt = TCP_SKB_CB(skb)->seq + 1; 6350 tcp_rsk(req)->rcv_nxt = TCP_SKB_CB(skb)->seq + 1;
6306 tcp_rsk(req)->snt_synack = tcp_clock_us(); 6351 tcp_rsk(req)->snt_synack = 0;
6307 tcp_rsk(req)->last_oow_ack_time = 0; 6352 tcp_rsk(req)->last_oow_ack_time = 0;
6308 req->mss = rx_opt->mss_clamp; 6353 req->mss = rx_opt->mss_clamp;
6309 req->ts_recent = rx_opt->saw_tstamp ? rx_opt->rcv_tsval : 0; 6354 req->ts_recent = rx_opt->saw_tstamp ? rx_opt->rcv_tsval : 0;
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c
index f262f2cace29..c4848e7a0aad 100644
--- a/net/ipv4/tcp_metrics.c
+++ b/net/ipv4/tcp_metrics.c
@@ -512,16 +512,6 @@ reset:
512 512
513 inet_csk(sk)->icsk_rto = TCP_TIMEOUT_FALLBACK; 513 inet_csk(sk)->icsk_rto = TCP_TIMEOUT_FALLBACK;
514 } 514 }
515 /* Cut cwnd down to 1 per RFC5681 if SYN or SYN-ACK has been
516 * retransmitted. In light of RFC6298 more aggressive 1sec
517 * initRTO, we only reset cwnd when more than 1 SYN/SYN-ACK
518 * retransmission has occurred.
519 */
520 if (tp->total_retrans > 1)
521 tp->snd_cwnd = 1;
522 else
523 tp->snd_cwnd = tcp_init_cwnd(tp, dst);
524 tp->snd_cwnd_stamp = tcp_jiffies32;
525} 515}
526 516
527bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst) 517bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst)
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
index 79900f783e0d..9c2a0d36fb20 100644
--- a/net/ipv4/tcp_minisocks.c
+++ b/net/ipv4/tcp_minisocks.c
@@ -522,6 +522,11 @@ struct sock *tcp_create_openreq_child(const struct sock *sk,
522 newtp->rx_opt.ts_recent_stamp = 0; 522 newtp->rx_opt.ts_recent_stamp = 0;
523 newtp->tcp_header_len = sizeof(struct tcphdr); 523 newtp->tcp_header_len = sizeof(struct tcphdr);
524 } 524 }
525 if (req->num_timeout) {
526 newtp->undo_marker = treq->snt_isn;
527 newtp->retrans_stamp = div_u64(treq->snt_synack,
528 USEC_PER_SEC / TCP_TS_HZ);
529 }
525 newtp->tsoffset = treq->ts_off; 530 newtp->tsoffset = treq->ts_off;
526#ifdef CONFIG_TCP_MD5SIG 531#ifdef CONFIG_TCP_MD5SIG
527 newtp->md5sig_info = NULL; /*XXX*/ 532 newtp->md5sig_info = NULL; /*XXX*/
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 32061928b054..0c4ed66dc1bf 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -3247,7 +3247,11 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst,
3247 skb->skb_mstamp_ns = cookie_init_timestamp(req); 3247 skb->skb_mstamp_ns = cookie_init_timestamp(req);
3248 else 3248 else
3249#endif 3249#endif
3250 {
3250 skb->skb_mstamp_ns = tcp_clock_ns(); 3251 skb->skb_mstamp_ns = tcp_clock_ns();
3252 if (!tcp_rsk(req)->snt_synack) /* Timestamp first SYNACK */
3253 tcp_rsk(req)->snt_synack = tcp_skb_timestamp_us(skb);
3254 }
3251 3255
3252#ifdef CONFIG_TCP_MD5SIG 3256#ifdef CONFIG_TCP_MD5SIG
3253 rcu_read_lock(); 3257 rcu_read_lock();
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
index f0c86398e6a7..2ac23da42dd2 100644
--- a/net/ipv4/tcp_timer.c
+++ b/net/ipv4/tcp_timer.c
@@ -393,6 +393,9 @@ static void tcp_fastopen_synack_timer(struct sock *sk)
393 tcp_write_err(sk); 393 tcp_write_err(sk);
394 return; 394 return;
395 } 395 }
396 /* Lower cwnd after certain SYNACK timeout like tcp_init_transfer() */
397 if (icsk->icsk_retransmits == 1)
398 tcp_enter_loss(sk);
396 /* XXX (TFO) - Unlike regular SYN-ACK retransmit, we ignore error 399 /* XXX (TFO) - Unlike regular SYN-ACK retransmit, we ignore error
397 * returned from rtx_syn_ack() to make it more persistent like 400 * returned from rtx_syn_ack() to make it more persistent like
398 * regular retransmit because if the child socket has been accepted 401 * regular retransmit because if the child socket has been accepted