diff --git a/include/uapi/linux/tcp.h b/include/uapi/linux/tcp.h index 27d542fa014b613faad3f765ed277c2bc09dd3db..5b5d2ac8242a7fb6688e01f481d5a2a2b5a14066 100644 --- a/include/uapi/linux/tcp.h +++ b/include/uapi/linux/tcp.h @@ -136,9 +136,9 @@ enum { struct tcp_nb_urc { __u8 nb_urc_enabled; - __u8 syn_retries; + __u8 tcp_syn_retries; __u16 tcp_retries2; - __u32 nb_urc_rto; + __u32 nb_urc_rto_ms; }; struct tcp_repair_opt { diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 066c10dfde2ae6e71f325e8d4b213e415b39ceac..efc22f9a46c783d197308e24654e809aa824b9a5 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -3163,6 +3163,10 @@ int tcp_sock_set_keepcnt(struct sock *sk, int val) EXPORT_SYMBOL(tcp_sock_set_keepcnt); #ifdef CONFIG_TCP_NB_URC +#define NB_URC_RTO_MS_MIN 200 // 200ms +#define NB_URC_RTO_MS_MAX (120000) // 12s +#define NB_URC_RTO_MS_TO_HZ 1000 + static int tcp_set_nb_urc(struct sock *sk, sockptr_t optval, int optlen) { int err = 0; @@ -3179,10 +3183,15 @@ static int tcp_set_nb_urc(struct sock *sk, sockptr_t optval, int optlen) return err; } - icsk->icsk_syn_retries = opt.syn_retries; + if (opt.nb_urc_rto_ms < NB_URC_RTO_MS_MIN || opt.nb_urc_rto_ms > NB_URC_RTO_MS_MAX) { + err = -EINVAL; + return err; + } + + icsk->icsk_syn_retries = opt.tcp_syn_retries; tcp_sk(sk)->tcp_retries2 = opt.tcp_retries2; icsk->icsk_nb_urc_enabled = opt.nb_urc_enabled; - icsk->icsk_nb_urc_rto = opt.nb_urc_rto; + icsk->icsk_nb_urc_rto = opt.nb_urc_rto_ms * HZ / NB_URC_RTO_MS_TO_HZ; return err; }