X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fsessiond-comm%2Finet.c;h=2e5c470899c76b5bb09856bf2e7158cc7a054d10;hb=cb5f6f148a62583d11520d2b6502214386edd75e;hp=b2bd65d9029672efb47a4469ef3632b30a649740;hpb=47cb9d4ae03d03fe37467df4c3f0d807e81ff06c;p=lttng-tools.git diff --git a/src/common/sessiond-comm/inet.c b/src/common/sessiond-comm/inet.c index b2bd65d90..2e5c47089 100644 --- a/src/common/sessiond-comm/inet.c +++ b/src/common/sessiond-comm/inet.c @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -43,6 +44,8 @@ static const struct lttcomm_proto_ops inet_ops = { .sendmsg = lttcomm_sendmsg_inet_sock, }; +unsigned long lttcomm_inet_tcp_timeout; + /* * Creates an PF_INET socket. */ @@ -302,3 +305,68 @@ int lttcomm_close_inet_sock(struct lttcomm_sock *sock) return ret; } + +/* + * Return value read from /proc or else 0 if value is not found. + */ +static unsigned long read_proc_value(const char *path) +{ + int ret, fd; + long r_val; + unsigned long val = 0; + char buf[64]; + + fd = open(path, O_RDONLY); + if (fd < 0) { + goto error; + } + + ret = read(fd, buf, sizeof(buf)); + if (ret < 0) { + PERROR("read proc failed"); + goto error_close; + } + + errno = 0; + r_val = strtol(buf, NULL, 10); + if (errno != 0 || r_val < -1L) { + val = 0; + goto error_close; + } else { + if (r_val > 0) { + val = r_val; + } + } + +error_close: + ret = close(fd); + if (ret) { + PERROR("close /proc value"); + } +error: + return val; +} + +LTTNG_HIDDEN +void lttcomm_inet_init(void) +{ + unsigned long syn_retries, fin_timeout, syn_timeout; + + /* Assign default value and see if we can change it. */ + lttcomm_inet_tcp_timeout = DEFAULT_INET_TCP_TIMEOUT; + + syn_retries = read_proc_value(LTTCOMM_INET_PROC_SYN_RETRIES_PATH); + fin_timeout = read_proc_value(LTTCOMM_INET_PROC_FIN_TIMEOUT_PATH); + + syn_timeout = syn_retries * LTTCOMM_INET_SYN_TIMEOUT_FACTOR; + + /* + * Get the maximum between the two possible timeout value and use that to + * get the maximum with the default timeout. + */ + lttcomm_inet_tcp_timeout = max_t(unsigned long, + max_t(unsigned long, syn_timeout, fin_timeout), + lttcomm_inet_tcp_timeout); + + DBG("TCP inet operation timeout set to %lu sec", lttcomm_inet_tcp_timeout); +}