Skip to content
Snippets Groups Projects
Commit 3f30e634 authored by Robbie Shade's avatar Robbie Shade
Browse files

Adds functions to set snd/rcv socket buffer sizes.

Used for non-default 1 MB UDP socket buffers.
parent 2c57371b
No related branches found
No related tags found
No related merge requests found
...@@ -111,6 +111,16 @@ int grpc_set_socket_ipv6_recvpktinfo_if_possible(int fd) { ...@@ -111,6 +111,16 @@ int grpc_set_socket_ipv6_recvpktinfo_if_possible(int fd) {
#endif #endif
} }
int grpc_set_socket_sndbuf(int fd, int buffer_size_bytes) {
return 0 == setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &buffer_size_bytes,
sizeof(buffer_size_bytes));
}
int grpc_set_socket_rcvbuf(int fd, int buffer_size_bytes) {
return 0 == setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &buffer_size_bytes,
sizeof(buffer_size_bytes));
}
/* set a socket to close on exec */ /* set a socket to close on exec */
int grpc_set_socket_cloexec(int fd, int close_on_exec) { int grpc_set_socket_cloexec(int fd, int close_on_exec) {
int oldflags = fcntl(fd, F_GETFD, 0); int oldflags = fcntl(fd, F_GETFD, 0);
... ...
......
...@@ -78,6 +78,14 @@ int grpc_set_socket_ip_pktinfo_if_possible(int fd); ...@@ -78,6 +78,14 @@ int grpc_set_socket_ip_pktinfo_if_possible(int fd);
If IPV6_RECVPKTINFO is not available, returns 1. */ If IPV6_RECVPKTINFO is not available, returns 1. */
int grpc_set_socket_ipv6_recvpktinfo_if_possible(int fd); int grpc_set_socket_ipv6_recvpktinfo_if_possible(int fd);
/* Tries to set the socket's send buffer to given size.
Returns 1 on success, 0 on failure. */
int grpc_set_socket_sndbuf(int fd, int buffer_size_bytes);
/* Tries to set the socket's receive buffer to given size.
Returns 1 on success, 0 on failure. */
int grpc_set_socket_rcvbuf(int fd, int buffer_size_bytes);
/* An enum to keep track of IPv4/IPv6 socket modes. /* An enum to keep track of IPv4/IPv6 socket modes.
Currently, this information is only used when a socket is first created, but Currently, this information is only used when a socket is first created, but
... ...
......
...@@ -210,6 +210,8 @@ static int prepare_socket(int fd, const struct sockaddr *addr, ...@@ -210,6 +210,8 @@ static int prepare_socket(int fd, const struct sockaddr *addr,
size_t addr_len) { size_t addr_len) {
struct sockaddr_storage sockname_temp; struct sockaddr_storage sockname_temp;
socklen_t sockname_len; socklen_t sockname_len;
/* Set send/receive socket buffers to 1 MB */
int buffer_size_bytes = 1024 * 1024;
if (fd < 0) { if (fd < 0) {
goto error; goto error;
...@@ -239,6 +241,18 @@ static int prepare_socket(int fd, const struct sockaddr *addr, ...@@ -239,6 +241,18 @@ static int prepare_socket(int fd, const struct sockaddr *addr,
goto error; goto error;
} }
if (!grpc_set_socket_sndbuf(fd, buffer_size_bytes)) {
gpr_log(GPR_ERROR, "Failed to set send buffer size to %d bytes",
buf_size_bytes);
goto error;
}
if (!grpc_set_socket_rcvbuf(fd, buffer_size_bytes)) {
gpr_log(GPR_ERROR, "Failed to set receive buffer size to %d bytes",
buf_size_bytes);
goto error;
}
return grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp); return grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp);
error: error:
... ...
......
...@@ -68,17 +68,15 @@ static void create_test_socket(int port, int *socket_fd, ...@@ -68,17 +68,15 @@ static void create_test_socket(int port, int *socket_fd,
struct sockaddr_in *sin) { struct sockaddr_in *sin) {
int fd; int fd;
int one = 1; int one = 1;
int buf_size = BUF_SIZE; int buffer_size_bytes = BUF_SIZE;
int flags; int flags;
fd = socket(AF_INET, SOCK_STREAM, 0); fd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
/* Reset the size of socket send buffer to the minimal value to facilitate /* Reset the size of socket send buffer to the minimal value to facilitate
buffer filling up and triggering notify_on_write */ buffer filling up and triggering notify_on_write */
GPR_ASSERT( GPR_ASSERT(grpc_set_socket_sndbuf(fd, buffer_size_bytes));
setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &buf_size, sizeof(buf_size)) != -1); GPR_ASSERT(grpc_set_socket_rcvbuf(fd, buffer_size_bytes));
GPR_ASSERT(
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &buf_size, sizeof(buf_size)) != -1);
/* Make fd non-blocking */ /* Make fd non-blocking */
flags = fcntl(fd, F_GETFL, 0); flags = fcntl(fd, F_GETFL, 0);
GPR_ASSERT(fcntl(fd, F_SETFL, flags | O_NONBLOCK) == 0); GPR_ASSERT(fcntl(fd, F_SETFL, flags | O_NONBLOCK) == 0);
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment