+#ifdef HAVE_KERNEL_SETSOCKOPT
+ /* open-coded version doesn't work in all kernels, and
+ * there is no helper function, so call kernel_setsockopt()
+ * directly.
+ */
+ {
+ int option = (do_keepalive ? 1 : 0);
+ kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
+ (char *)&option, sizeof(option));
+ }
+#else
+ if (sock->sk->sk_prot->keepalive)
+ sock->sk->sk_prot->keepalive(sock->sk, do_keepalive);
+ if (do_keepalive)
+ sock_set_flag(sock->sk, SOCK_KEEPOPEN);
+ else
+ sock_reset_flag(sock->sk, SOCK_KEEPOPEN);
+#endif /* HAVE_KERNEL_SETSOCKOPT */
+
+ if (!do_keepalive)
+ return (0);
+
+ rc = tcp_sock_set_keepidle(sock->sk, keep_idle);
+ if (rc != 0) {
+ CERROR("Can't set TCP_KEEPIDLE: %d\n", rc);
+ return rc;
+ }