return 1;
}
+ // Set socket buffer sizes
+ flags = SOCKET_SEND_BUFFER_SIZE;
+ r = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (void*)&flags, sizeof(flags));
+ if (r) {
+ ERROR(conf, "Could not set send buffer size on socket %d: %s\n",
+ fd, strerror(errno));
+ return 1;
+ }
+
// Set keepalive interval
if (conf->keepalive_interval) {
DEBUG(conf, "Setting keepalive interval to %d\n", conf->keepalive_interval);
DEBUG(conf, "Setting keepalive idle interval to %d\n", conf->keepalive_interval);
+ flags = 1;
r = setsockopt(fd, SOL_TCP, TCP_KEEPIDLE,
(void*)&flags, sizeof(flags));
if (r) {
// Set the size of the read/write buffer to 1 MiB
#define BUFFER_SIZE 1048576
+// Socket buffer configuration
+#define SOCKET_BUFFER_SIZE (64 * 1024)
+#define SOCKET_RECV_BUFFER_SIZE SOCKET_BUFFER_SIZE
+#define SOCKET_SEND_BUFFER_SIZE SOCKET_BUFFER_SIZE
+
#define EPOLL_MAX_EVENTS 128
struct fireperf_config {
}
static int create_socket(struct fireperf_config* conf) {
+ int r;
+
// Open a new socket
int fd = socket(AF_INET6, SOCK_STREAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0);
if (fd < 0) {
goto ERROR;
}
+ // Set receive buffer size
+ int flags = SOCKET_RECV_BUFFER_SIZE;
+ r = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&flags, sizeof(flags));
+ if (r) {
+ ERROR(conf, "Could not set receive buffer size on socket %d: %s\n",
+ fd, strerror(errno));
+ goto ERROR;
+ }
+
struct sockaddr_in6 addr = {
.sin6_family = AF_INET6,
.sin6_port = htons(conf->port),
};
// Bind it to the selected port
- int r = bind(fd, &addr, sizeof(addr));
+ r = bind(fd, &addr, sizeof(addr));
if (r) {
ERROR(conf, "Could not bind socket: %s\n", strerror(errno));
goto ERROR;