diff --git a/adsbus/incoming.c b/adsbus/incoming.c index ffb9b52..845d656 100644 --- a/adsbus/incoming.c +++ b/adsbus/incoming.c @@ -65,7 +65,7 @@ static void incoming_handler(struct peer *peer) { local_hbuf, local_sbuf, peer_hbuf, peer_sbuf); - socket_init(fd); + socket_connected_init(fd); incoming->handler(fd, incoming->passthrough, NULL); } @@ -99,6 +99,8 @@ static void incoming_listen(struct incoming *incoming) { continue; } + socket_bound_init(incoming->peer.fd); + assert(listen(incoming->peer.fd, 255) == 0); break; } diff --git a/adsbus/outgoing.c b/adsbus/outgoing.c index 77f8f50..9bd4e06 100644 --- a/adsbus/outgoing.c +++ b/adsbus/outgoing.c @@ -60,7 +60,8 @@ static void outgoing_connect_next(struct outgoing *outgoing) { outgoing->peer.fd = socket(outgoing->addr->ai_family, outgoing->addr->ai_socktype | SOCK_NONBLOCK | SOCK_CLOEXEC, outgoing->addr->ai_protocol); assert(outgoing->peer.fd >= 0); - int result = connect(outgoing->peer.fd, outgoing->addr->ai_addr, outgoing->addr->ai_addrlen); + char buf[1]; + int result = (int) sendto(outgoing->peer.fd, buf, 0, MSG_FASTOPEN, outgoing->addr->ai_addr, outgoing->addr->ai_addrlen); outgoing_connect_result(outgoing, result == 0 ? result : errno); } @@ -91,7 +92,7 @@ static void outgoing_connect_result(struct outgoing *outgoing, int result) { case 0: fprintf(stderr, "O %s: Connected to %s/%s\n", outgoing->id, hbuf, sbuf); freeaddrinfo(outgoing->addrs); - socket_init(outgoing->peer.fd); + socket_connected_init(outgoing->peer.fd); outgoing->attempt = 0; int fd = outgoing->peer.fd; outgoing->peer.fd = -1; diff --git a/adsbus/socket.c b/adsbus/socket.c index 60a3104..19e3ce1 100644 --- a/adsbus/socket.c +++ b/adsbus/socket.c @@ -7,7 +7,12 @@ #include "socket.h" -void socket_init(int fd) { +void socket_bound_init(int fd) { + int qlen = 5; + assert(!setsockopt(fd, SOL_TCP, TCP_FASTOPEN, &qlen, sizeof(qlen))); +} + +void socket_connected_init(int fd) { int optval = 1; assert(!setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval))); optval = 30; diff --git a/adsbus/socket.h b/adsbus/socket.h index 9993af3..a7e6e27 100644 --- a/adsbus/socket.h +++ b/adsbus/socket.h @@ -1,3 +1,4 @@ #pragma once -void socket_init(int); +void socket_bound_init(int); +void socket_connected_init(int);