From 96fd393d2934af2a6cdcbf6bf32b4377a3d55863 Mon Sep 17 00:00:00 2001 From: Viktor Dukhovni Date: Sat, 21 Sep 2019 18:29:12 -0400 Subject: [PATCH] Disable Nagle in iprop master and slave --- configure.ac | 1 + include/config.h.w32 | 3 +++ lib/kadm5/ipropd_master.c | 14 ++++++++++++++ lib/kadm5/ipropd_slave.c | 9 +++++++++ lib/kadm5/kadm5_locl.h | 6 ++++++ 5 files changed, 33 insertions(+) diff --git a/configure.ac b/configure.ac index e7611d2de..d07fd8a01 100644 --- a/configure.ac +++ b/configure.ac @@ -355,6 +355,7 @@ AC_CHECK_HEADERS([\ maillock.h \ netgroup.h \ netinet/in6_machtypes.h \ + netinet/tcp.h \ pthread.h \ pty.h \ sac.h \ diff --git a/include/config.h.w32 b/include/config.h.w32 index 0d6e6a3ef..c6c71d537 100644 --- a/include/config.h.w32 +++ b/include/config.h.w32 @@ -653,6 +653,9 @@ static const char *const rcsid[] = { (const char *)rcsid, "@(#)" msg } /* Define to 1 if you have the header file. */ /* #define HAVE_NETINET_IN_H 1 */ +/* Define to 1 if you have the header file. */ +/* #define HAVE_NETINET_TCP_H 1 */ + /* Define to 1 if you have the header file. */ /* #define HAVE_NETINET_IN_SYSTM_H 1 */ diff --git a/lib/kadm5/ipropd_master.c b/lib/kadm5/ipropd_master.c index 053d45754..8639af66e 100644 --- a/lib/kadm5/ipropd_master.c +++ b/lib/kadm5/ipropd_master.c @@ -319,6 +319,20 @@ add_slave (krb5_context context, krb5_keytab keytab, slave **root, * own krb5_recvauth(). */ socket_set_nonblocking(s->fd, 1); + + /* + * We write message lengths separately from the payload, and may do + * back-to-back small writes when flushing pending input and then a new + * update. Avoid Nagle delays. + */ +#if defined(IPPROTO_TCP) && defined(TCP_NODELAY) + { + int nodelay = 1; + (void) setsockopt(s->fd, IPPROTO_TCP, TCP_NODELAY, + (void *)&nodelay, sizeof(nodelay)); + } +#endif + krb5_free_principal (context, server); if (ret) { krb5_warn (context, ret, "krb5_recvauth"); diff --git a/lib/kadm5/ipropd_slave.c b/lib/kadm5/ipropd_slave.c index 9f0b38d0a..933ce32e3 100644 --- a/lib/kadm5/ipropd_slave.c +++ b/lib/kadm5/ipropd_slave.c @@ -99,6 +99,15 @@ connect_to_master (krb5_context context, const char *master, if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof(one)) < 0) krb5_warn(context, errno, "setsockopt(SO_KEEPALIVE) failed"); + /* + * We write message lengths separately from the payload, avoid Nagle + * delays. + */ +#if defined(IPPROTO_TCP) && defined(TCP_NODELAY) + (void) setsockopt(s, IPPROTO_TCP, TCP_NODELAY, + (void *)&one, sizeof(one)); +#endif + return s; } diff --git a/lib/kadm5/kadm5_locl.h b/lib/kadm5/kadm5_locl.h index ef5b83ee4..cb0b1b4cb 100644 --- a/lib/kadm5/kadm5_locl.h +++ b/lib/kadm5/kadm5_locl.h @@ -67,6 +67,12 @@ #ifdef HAVE_SYS_SOCKET_H #include #endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_TCP_H +#include +#endif #ifdef HAVE_SYS_UN_H #include #endif