diff --git a/include/net/nata.h b/include/net/nata.h index 2e18c0e86aa9c72b31d2604762050c2b60fb92aa..973bc3efe9285f60bcf071528b51bfca114cc998 100644 --- a/include/net/nata.h +++ b/include/net/nata.h @@ -11,6 +11,7 @@ #include #include +#define PUSH_PORT_CNT_MAX 10 #define NATA_DATA_RETRIES_MAX 50 #define NATA_SYN_RETRIES_MAX 50 #define BITS_PRE_BYTE 8 @@ -29,6 +30,7 @@ enum nata_retries_type_t { #define NATA_URC_RTO_MS_MAX 120000 // 120s #define NATA_URC_RTO_MS_TO_HZ 1000 int tcp_set_nata_urc(struct sock *sk, sockptr_t optval, int optlen); +void tcp_set_nata_push_urc(struct sock *sk); #endif /* CONFIG_TCP_NATA_URC */ #ifdef CONFIG_TCP_NATA_STL diff --git a/net/ipv4/nata.c b/net/ipv4/nata.c index 3c663146ce6129a994e7a27f4c4f24c3edba556a..095c10e7e1e75269b2fc23a0a450a1a74a2f3a77 100644 --- a/net/ipv4/nata.c +++ b/net/ipv4/nata.c @@ -26,6 +26,64 @@ bool nata_thin_stream_check(struct sock *sk) } #ifdef CONFIG_TCP_NATA_URC +int na_push_rto_ms __read_mostly = 200; +module_param(na_push_rto_ms, int, 0644); +MODULE_PARM_DESC(na_push_rto_ms, "config the max rto, default 200ms, < 150 means disable"); +EXPORT_SYMBOL(na_push_rto_ms); + +int na_push_data_retries __read_mostly = 10; +module_param(na_push_data_retries, int, 0644); +MODULE_PARM_DESC(na_push_data_retries, "config the data-pkt fast retransmit change times, default 10, 0 means disable, cannot greater than 50"); +EXPORT_SYMBOL(na_push_data_retries); + +int na_push_syn_retries __read_mostly = 16; +module_param(na_push_syn_retries, int, 0644); +MODULE_PARM_DESC(na_push_syn_retries, "config the syn-pkt max reties, default 16, 0 means disable, cannot greater than 50"); +EXPORT_SYMBOL(na_push_syn_retries); + +static int na_push_port_list[PUSH_PORT_CNT_MAX] __read_mostly = {0}; +static int na_push_port_count = PUSH_PORT_CNT_MAX; +module_param_array(na_push_port_list, int, &na_push_port_count, 0644); +MODULE_PARM_DESC(na_push_port_list, "config listen port list, up to 10 elms"); + +bool na_push_port_check(__u16 port) +{ + int i; + for (i = 0; i < na_push_port_count; i++) { + if (na_push_port_list[i] && na_push_port_list[i] == port) + return true; + } + + return false; +} + +void tcp_set_nata_push_urc(struct sock *sk) +{ + struct inet_connection_sock *icsk = inet_csk(sk); + + if (!na_push_port_check(ntohs(icsk->icsk_inet.inet_dport))) + return ; + + if (na_push_rto_ms < NATA_URC_RTO_MS_MIN) { + na_push_rto_ms = NATA_URC_RTO_MS_MIN; + } else if (na_push_rto_ms > NATA_URC_RTO_MS_MAX) { + na_push_rto_ms = NATA_URC_RTO_MS_MAX; + } + + if (na_push_data_retries > NATA_DATA_RETRIES_MAX) + na_push_data_retries = NATA_DATA_RETRIES_MAX; + + if (na_push_syn_retries > NATA_SYN_RETRIES_MAX) + na_push_syn_retries = NATA_SYN_RETRIES_MAX; + + icsk->nata_retries_enabled = true; + icsk->nata_retries_type = NATA_URC; + icsk->icsk_syn_retries = na_push_syn_retries; + icsk->nata_data_retries = na_push_data_retries; + icsk->nata_data_rto = na_push_rto_ms * HZ / NATA_URC_RTO_MS_TO_HZ; + icsk->nata_syn_rto = na_push_rto_ms; +} + int tcp_set_nata_urc(struct sock *sk, sockptr_t optval, int optlen) { int err = -EINVAL; diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 85d8688933f3cf1ebf6f84734ae34a13254106b6..4b395d0b3a7213be1efc5dbe64fe11eeac18af90 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -69,6 +69,9 @@ #include #include #include +#ifdef CONFIG_TCP_NATA_URC +#include +#endif #include #include @@ -279,6 +282,9 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) * lock select source port, enter ourselves into the hash tables and * complete initialization after this. */ +#ifdef CONFIG_TCP_NATA_URC + tcp_set_nata_push_urc(sk); +#endif /* CONFIG_TCP_NATA_URC */ tcp_set_state(sk, TCP_SYN_SENT); err = inet_hash_connect(tcp_death_row, sk); if (err)