aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib/iomgr/socket_utils_common_posix.cc
diff options
context:
space:
mode:
authorGravatar Yash Tibrewal <yashkt@google.com>2018-08-21 11:59:24 -0700
committerGravatar Yash Tibrewal <yashkt@google.com>2018-08-21 11:59:24 -0700
commit2f8e60a7737293a3e44f555ac9de92267785e91f (patch)
treed23eac902eea669821f4002ee905d1bb50161bf8 /src/core/lib/iomgr/socket_utils_common_posix.cc
parentccc6ee3db0924e6f6e9aa1c8ccd60d7e562e6615 (diff)
Set TCP_USER_TIMEOUT socket option
Diffstat (limited to 'src/core/lib/iomgr/socket_utils_common_posix.cc')
-rw-r--r--src/core/lib/iomgr/socket_utils_common_posix.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/core/lib/iomgr/socket_utils_common_posix.cc b/src/core/lib/iomgr/socket_utils_common_posix.cc
index c4b991c94d..8b8e303ef7 100644
--- a/src/core/lib/iomgr/socket_utils_common_posix.cc
+++ b/src/core/lib/iomgr/socket_utils_common_posix.cc
@@ -222,6 +222,30 @@ grpc_error* grpc_set_socket_low_latency(int fd, int low_latency) {
return GRPC_ERROR_NONE;
}
+#define DEFAULT_TCP_USER_TIMEOUT 20000 /* 20 seconds */
+
+/* Set TCP_USER_TIMEOUT */
+grpc_error* grpc_set_socket_tcp_user_timeout(int fd, int val) {
+#ifdef GPR_LINUX
+ int newval;
+ socklen_t len;
+ if (val == 0) {
+ val = DEFAULT_TCP_USER_TIMEOUT;
+ }
+ if (0 != setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &val, sizeof(val))) {
+ return GRPC_OS_ERROR(errno, "setsockopt(TCP_USER_TIMEOUT)");
+ }
+ if (0 != getsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
+ return GRPC_OS_ERROR(errno, "getsockopt(TCP_USER_TIMEOUT)");
+ }
+ if (newval != val) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "Failed to set TCP_USER_TIMEOUT");
+ }
+#endif /* GPR_LINUX */
+ return GRPC_ERROR_NONE;
+}
+
/* set a socket using a grpc_socket_mutator */
grpc_error* grpc_set_socket_with_mutator(int fd, grpc_socket_mutator* mutator) {
GPR_ASSERT(mutator);