}
isc_result_t
-isc__nm_socket_reuse(uv_os_sock_t fd) {
+isc__nm_socket_reuse(uv_os_sock_t fd, int val) {
/*
* Generally, the SO_REUSEADDR socket option allows reuse of
* local addresses.
*/
#if defined(SO_REUSEPORT) && !defined(__linux__)
- if (setsockopt_on(fd, SOL_SOCKET, SO_REUSEPORT) == -1) {
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val)) == -1) {
return (ISC_R_FAILURE);
}
return (ISC_R_SUCCESS);
#elif defined(SO_REUSEADDR)
- if (setsockopt_on(fd, SOL_SOCKET, SO_REUSEADDR) == -1) {
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) == -1) {
return (ISC_R_FAILURE);
}
return (ISC_R_SUCCESS);
/* FIXME: set mss */
- result = isc__nm_socket_reuse(sock);
+ result = isc__nm_socket_reuse(sock, 1);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if (mgr->load_balance_sockets) {
(void)isc__nm_socket_disable_pmtud(sock, sa_family);
(void)isc__nm_socket_v6only(sock, sa_family);
- result = isc__nm_socket_reuse(sock);
+ result = isc__nm_socket_reuse(sock, 1);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
if (mgr->load_balance_sockets) {
static isc_result_t
udp_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
- int uv_bind_flags = UV_UDP_REUSEADDR;
+ int uv_bind_flags = 0;
int r;
isc__networker_t *worker = sock->worker;
+ isc_result_t result;
r = uv_udp_init(&worker->loop->loop, &sock->uv_handle.udp);
UV_RUNTIME_CHECK(uv_udp_init, r);
}
isc__nm_incstats(sock, STATID_OPEN);
+ /*
+ * uv_udp_open() enables REUSE_ADDR, we need to disable it again.
+ */
+ result = isc__nm_socket_reuse(sock->fd, 0);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
if (sock->iface.type.sa.sa_family == AF_INET6) {
uv_bind_flags |= UV_UDP_IPV6ONLY;
}
sock->client = true;
sock->fd = fd;
- result = isc__nm_socket_reuse(sock->fd);
- RUNTIME_CHECK(result == ISC_R_SUCCESS ||
- result == ISC_R_NOTIMPLEMENTED);
(void)isc__nm_socket_disable_pmtud(sock->fd, sa_family);
return (r);
}
- result = isc__nm_socket_reuse(fd);
+ result = isc__nm_socket_reuse(fd, 1);
if (result != ISC_R_SUCCESS && result != ISC_R_NOTIMPLEMENTED) {
fprintf(stderr,
"setup_ephemeral_port: isc__nm_socket_reuse(): %s",