From 0563d476dea35a60a59857cc8bd26ef276d78799 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Tue, 12 Jul 2005 00:41:55 +0000 Subject: [PATCH] 1899. [func] Raise the UDP recieve buffer size to 32k if it is less than 32k. [RT #14953] --- CHANGES | 3 +++ lib/isc/unix/socket.c | 37 ++++++++++++++++++++++++++++++++++--- lib/isc/win32/socket.c | 28 +++++++++++++++++++++++++--- 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 3d1983b762..7b005257ed 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +1899. [func] Raise the UDP recieve buffer size to 32k if it is + less than 32k. [RT #14953] + 1898. [port] sunos: non blocking i/o support. [RT #14951] 1897. [func] Support for IPSECKEY rdata type. [RT #14967] diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 26e34b9cd5..fbed68406c 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.251 2005/07/08 04:30:22 marka Exp $ */ +/* $Id: socket.c,v 1.252 2005/07/12 00:41:54 marka Exp $ */ /*! \file */ @@ -132,6 +132,11 @@ typedef isc_event_t intev_t; #endif #endif +/*% + * The size to raise the recieve buffer to (from BIND 8). + */ +#define RCVBUFSIZE (32*1024) + /*% * The number of times a send operation is repeated if the result is EINTR. */ @@ -1365,6 +1370,10 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, isc_result_t ret; #if defined(USE_CMSG) || defined(SO_BSDCOMPAT) int on = 1; +#endif +#if defined(SO_RCVBUF) + ISC_SOCKADDR_LEN_T optlen; + int size; #endif char strbuf[ISC_STRERRORSIZE]; const char *err = "socket"; @@ -1468,9 +1477,10 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, } #endif -#if defined(USE_CMSG) +#if defined(USE_CMSG) || defined(SO_RCVBUF) if (type == isc_sockettype_udp) { +#if defined(USE_CMSG) #if defined(SO_TIMESTAMP) if (setsockopt(sock->fd, SOL_SOCKET, SO_TIMESTAMP, (void *)&on, sizeof(on)) < 0 @@ -1540,9 +1550,30 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, } #endif #endif /* ISC_PLATFORM_HAVEIPV6 */ +#endif /* defined(USE_CMSG) */ +#if defined(SO_RCVBUF) + optlen = sizeof(size); + if (getsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, + (void *)&size, &optlen) >= 0 && + size < RCVBUFSIZE) { + size = RCVBUFSIZE; + if (setsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, + (void *)&size, sizeof(size)) == -1) { + isc__strerror(errno, strbuf, sizeof(strbuf)); + UNEXPECTED_ERROR(__FILE__, __LINE__, + "setsockopt(%d, SO_RCVBUF, %d) %s: %s", + sock->fd, size, + isc_msgcat_get(isc_msgcat, + ISC_MSGSET_GENERAL, + ISC_MSG_FAILED, + "failed"), + strbuf); + } + } +#endif } -#endif /* USE_CMSG */ +#endif /* defined(USE_CMSG) || defined(SO_RCVBUF) */ sock->references = 1; *socketp = sock; diff --git a/lib/isc/win32/socket.c b/lib/isc/win32/socket.c index 65766cca6f..96f65e0e16 100644 --- a/lib/isc/win32/socket.c +++ b/lib/isc/win32/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.38 2005/06/08 01:04:30 marka Exp $ */ +/* $Id: socket.c,v 1.39 2005/07/12 00:41:55 marka Exp $ */ /* This code has been rewritten to take advantage of Windows Sockets * I/O Completion Ports and Events. I/O Completion Ports is ONLY @@ -191,6 +191,11 @@ struct msghdr { int msg_flags; /* flags on received message */ } msghdr; +/*% + * The size to raise the recieve buffer to. + */ +#define RCVBUFSIZE (32*1024) + /* * The number of times a send operation is repeated if the result is EINTR. */ @@ -1833,6 +1838,10 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, isc_result_t result; #if defined(USE_CMSG) || defined(SO_BSDCOMPAT) int on = 1; +#endif +#if defined(SO_RCVBUF) + ISC_SOCKADDR_LEN_T optlen; + int size; #endif int socket_errno; char strbuf[ISC_STRERRORSIZE]; @@ -1896,9 +1905,10 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, } -#if defined(USE_CMSG) +#if defined(USE_CMSG) || defined(SO_RCVBUF) if (type == isc_sockettype_udp) { +#if defined(USE_CMSG) #if defined(ISC_PLATFORM_HAVEIPV6) #ifdef IPV6_RECVPKTINFO /* 2292bis */ @@ -1940,9 +1950,21 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, } #endif #endif /* ISC_PLATFORM_HAVEIPV6 */ +#endif /* definef(USE_CMSG) */ + +#if defined(SO_RCVBUF) + optlen = sizeof(size); + if (getsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, + (void *)&size, &optlen) >= 0 && + size < RCVBUFSIZE) { + size = RCVBUFSIZE; + (void)setsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, + (void *)&size, sizeof(size)); + } +#endif } -#endif /* USE_CMSG */ +#endif /* defined(USE_CMSG) || defined(SO_RCVBUF) */ sock->references = 1; *socketp = sock;