aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/tcp.h2
-rw-r--r--net/ipv4/tcp_input.c9
-rw-r--r--net/ipv4/tcp_metrics.c6
3 files changed, 11 insertions, 6 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h
index e337e05035be..590e01a476ac 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -417,7 +417,7 @@ void tcp_update_metrics(struct sock *sk);
417void tcp_init_metrics(struct sock *sk); 417void tcp_init_metrics(struct sock *sk);
418void tcp_metrics_init(void); 418void tcp_metrics_init(void);
419bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst, 419bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
420 bool paws_check); 420 bool paws_check, bool timestamps);
421bool tcp_remember_stamp(struct sock *sk); 421bool tcp_remember_stamp(struct sock *sk);
422bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw); 422bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);
423void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst); 423void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 1a8e89fdd331..4f6cfbc57775 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -5979,12 +5979,14 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
5979 * timewait bucket, so that all the necessary checks 5979 * timewait bucket, so that all the necessary checks
5980 * are made in the function processing timewait state. 5980 * are made in the function processing timewait state.
5981 */ 5981 */
5982 if (tmp_opt.saw_tstamp && tcp_death_row.sysctl_tw_recycle) { 5982 if (tcp_death_row.sysctl_tw_recycle) {
5983 bool strict; 5983 bool strict;
5984 5984
5985 dst = af_ops->route_req(sk, &fl, req, &strict); 5985 dst = af_ops->route_req(sk, &fl, req, &strict);
5986
5986 if (dst && strict && 5987 if (dst && strict &&
5987 !tcp_peer_is_proven(req, dst, true)) { 5988 !tcp_peer_is_proven(req, dst, true,
5989 tmp_opt.saw_tstamp)) {
5988 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSPASSIVEREJECTED); 5990 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSPASSIVEREJECTED);
5989 goto drop_and_release; 5991 goto drop_and_release;
5990 } 5992 }
@@ -5993,7 +5995,8 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
5993 else if (!sysctl_tcp_syncookies && 5995 else if (!sysctl_tcp_syncookies &&
5994 (sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) < 5996 (sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) <
5995 (sysctl_max_syn_backlog >> 2)) && 5997 (sysctl_max_syn_backlog >> 2)) &&
5996 !tcp_peer_is_proven(req, dst, false)) { 5998 !tcp_peer_is_proven(req, dst, false,
5999 tmp_opt.saw_tstamp)) {
5997 /* Without syncookies last quarter of 6000 /* Without syncookies last quarter of
5998 * backlog is filled with destinations, 6001 * backlog is filled with destinations,
5999 * proven to be alive. 6002 * proven to be alive.
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c
index 0d54e59b9ea8..ed9c9a91851c 100644
--- a/net/ipv4/tcp_metrics.c
+++ b/net/ipv4/tcp_metrics.c
@@ -576,7 +576,8 @@ reset:
576 tp->snd_cwnd_stamp = tcp_time_stamp; 576 tp->snd_cwnd_stamp = tcp_time_stamp;
577} 577}
578 578
579bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst, bool paws_check) 579bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
580 bool paws_check, bool timestamps)
580{ 581{
581 struct tcp_metrics_block *tm; 582 struct tcp_metrics_block *tm;
582 bool ret; 583 bool ret;
@@ -589,7 +590,8 @@ bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst, bool pa
589 if (paws_check) { 590 if (paws_check) {
590 if (tm && 591 if (tm &&
591 (u32)get_seconds() - tm->tcpm_ts_stamp < TCP_PAWS_MSL && 592 (u32)get_seconds() - tm->tcpm_ts_stamp < TCP_PAWS_MSL &&
592 (s32)(tm->tcpm_ts - req->ts_recent) > TCP_PAWS_WINDOW) 593 ((s32)(tm->tcpm_ts - req->ts_recent) > TCP_PAWS_WINDOW ||
594 !timestamps))
593 ret = false; 595 ret = false;
594 else 596 else
595 ret = true; 597 ret = true;