summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--net/mptcp/protocol.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index ec874d2ead6a..8f074d757743 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -581,17 +581,23 @@ static bool mptcp_pending_data_fin(struct sock *sk, u64 *seq)
static void mptcp_set_datafin_timeout(struct sock *sk)
{
struct inet_connection_sock *icsk = inet_csk(sk);
+ u32 rto_min = READ_ONCE(icsk->icsk_rto_min);
+ u32 rto_max = READ_ONCE(icsk->icsk_rto_max);
u32 retransmits;
+ /* The sysctls are validated independently: rto_min > rto_max is
+ * possible, guard against ilog2(0).
+ */
retransmits = min_t(u32, icsk->icsk_retransmits,
- ilog2(TCP_RTO_MAX / TCP_RTO_MIN));
+ ilog2(max_t(u32, rto_max / rto_min, 1)));
- mptcp_sk(sk)->timer_ival = TCP_RTO_MIN << retransmits;
+ mptcp_sk(sk)->timer_ival = rto_min << retransmits;
}
static void __mptcp_set_timeout(struct sock *sk, long tout)
{
- mptcp_sk(sk)->timer_ival = tout > 0 ? tout : TCP_RTO_MIN;
+ mptcp_sk(sk)->timer_ival = tout > 0 ? tout :
+ READ_ONCE(inet_csk(sk)->icsk_rto_min);
}
static long mptcp_timeout_from_subflow(const struct mptcp_subflow_context *subflow)
@@ -3161,7 +3167,9 @@ unlock:
static void __mptcp_init_sock(struct sock *sk)
{
+ struct inet_connection_sock *icsk = inet_csk(sk);
struct mptcp_sock *msk = mptcp_sk(sk);
+ struct net *net = sock_net(sk);
INIT_LIST_HEAD(&msk->conn_list);
INIT_LIST_HEAD(&msk->join_list);
@@ -3170,7 +3178,13 @@ static void __mptcp_init_sock(struct sock *sk)
INIT_WORK(&msk->work, mptcp_worker);
msk->out_of_order_queue = RB_ROOT;
msk->first_pending = NULL;
- msk->timer_ival = TCP_RTO_MIN;
+
+ /* msk does not go through tcp_init_sock(); seed RTO bounds. */
+ icsk->icsk_rto_min =
+ usecs_to_jiffies(READ_ONCE(net->ipv4.sysctl_tcp_rto_min_us));
+ icsk->icsk_rto_max =
+ msecs_to_jiffies(READ_ONCE(net->ipv4.sysctl_tcp_rto_max_ms));
+ msk->timer_ival = icsk->icsk_rto_min;
msk->scaling_ratio = TCP_DEFAULT_SCALING_RATIO;
msk->backlog_len = 0;
mptcp_init_rtt_est(msk);