From 1debc21e904ea1df13f88525aa9969a43a930dfc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Vavru=C5=A1a?= <marek.vavrusa@nic.cz>
Date: Tue, 20 May 2014 10:25:50 +0200
Subject: [PATCH] Revert "udp: added SO_REUSEPORT support"

This reverts commit f4de548240d911669a193eb813c1e9277a16570e.

refs #239

Conflicts:
	src/knot/server/udp-handler.c
---
 src/knot/server/net.c         |  5 -----
 src/knot/server/udp-handler.c | 33 ++++-----------------------------
 2 files changed, 4 insertions(+), 34 deletions(-)

diff --git a/src/knot/server/net.c b/src/knot/server/net.c
index a55cb89d7..b3054d086 100644
--- a/src/knot/server/net.c
+++ b/src/knot/server/net.c
@@ -81,11 +81,6 @@ int net_bound_socket(int type, struct sockaddr_storage *ss)
 	int flag = 1;
 	(void) setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
 
-	/* Reuse port if available. */
-#if defined(SO_REUSEPORT)
-	(void) setsockopt(socket, SOL_SOCKET, SO_REUSEPORT, &flag, sizeof(flag));
-#endif
-
 	/* Unlink UNIX socket if exists. */
 	if (ss->ss_family == AF_UNIX) {
 		unlink(addr_str);
diff --git a/src/knot/server/udp-handler.c b/src/knot/server/udp-handler.c
index 9223368b0..b4f9a5a83 100644
--- a/src/knot/server/udp-handler.c
+++ b/src/knot/server/udp-handler.c
@@ -451,30 +451,6 @@ void __attribute__ ((constructor)) udp_master_init()
 #endif /* HAVE_RECVMMSG */
 }
 
-static void unbind_ifaces(ifacelist_t *ifaces, fd_set *set, int maxfd)
-{
-	ref_release((ref_t *)ifaces);
-#if defined(SO_REUSEPORT)
-	for (int fd = 0; fd <= maxfd; ++fd) {
-		if (FD_ISSET(fd, set)) {
-			close(fd);
-		}
-	}
-#endif
-	FD_ZERO(set);
-}
-
-static int bind_iface(iface_t *iface, fd_set *set)
-{
-#if defined(SO_REUSEPORT)
-	int fd = net_bound_socket(SOCK_DGRAM, &iface->addr);
-#else
-	int fd = iface->fd[IO_UDP];
-#endif
-	FD_SET(fd, set);
-	return fd;
-}
-
 int udp_master(dthread_t *thread)
 {
 	unsigned cpu = dt_online_cpus();
@@ -530,14 +506,13 @@ int udp_master(dthread_t *thread)
 			FD_ZERO(&fds);
 
 			rcu_read_lock();
-			unbind_ifaces(ref, &fds, maxfd);
-			maxfd = 0;
-			minfd = INT_MAX;
+			ref_release((ref_t *)ref);
 			ref = handler->server->ifaces;
 			if (ref) {
 				iface_t *i = NULL;
 				WALK_LIST(i, ref->l) {
-					int fd = bind_iface(i, &fds);
+					int fd = i->fd[IO_UDP];
+					FD_SET(fd, &fds);
 					maxfd = MAX(fd, maxfd);
 					minfd = MIN(fd, minfd);
 				}
@@ -573,7 +548,7 @@ int udp_master(dthread_t *thread)
 	}
 
 	_udp_deinit(rq);
-	unbind_ifaces(ref, &fds, maxfd);
+	ref_release((ref_t *)ref);
 	mp_delete(udp.query_ctx.mm.ctx);
 	return KNOT_EOK;
 }
-- 
GitLab