Hi Stephane,

could you try again with attached patch?

O.

On Sat, Oct 18, 2014, at 17:41, Stephane Bortzmeyer wrote:
> Someone suggested to modify the nsd.service file this way:
> 
> Wants=network-online.target
> After=network-online.target
> 
> But it did not help.


-- 
Ondřej Surý <ond...@sury.org>
Knot DNS (https://www.knot-dns.cz/) – a high-performance DNS server
--- nsd.orig/server.c
+++ nsd/server.c
@@ -378,7 +378,7 @@ int
 server_init(struct nsd *nsd)
 {
 	size_t i;
-#if defined(SO_REUSEADDR) || (defined(INET6) && (defined(IPV6_V6ONLY) || defined(IPV6_USE_MIN_MTU) || defined(IPV6_MTU) || defined(IP_TRANSPARENT)))
+#if defined(SO_REUSEADDR) || (defined(INET6) && (defined(IPV6_V6ONLY) || defined(IPV6_USE_MIN_MTU) || defined(IPV6_MTU) || defined(IP_TRANSPARENT) || defined(IP_FREEBIND))
 	int on = 1;
 #endif
 
@@ -542,6 +542,13 @@ server_init(struct nsd *nsd)
 #endif /* IP_TRANSPARENT */
 		}
 
+#ifdef IP_FREEBIND
+		if (setsockopt(nsd->udp[i].s, IPPROTO_IP, IP_FREEBIND, &on, sizeof(on)) < 0) {
+			log_msg(LOG_ERR, "setsockopt(...,IP_FREEBIND, ...) failed for udp: %s",
+				strerror(errno));
+		}
+#endif /* IP_FREEBIND */
+
 		if (bind(nsd->udp[i].s, (struct sockaddr *) nsd->udp[i].addr->ai_addr, nsd->udp[i].addr->ai_addrlen) != 0) {
 			log_msg(LOG_ERR, "can't bind udp socket: %s", strerror(errno));
 			return -1;
@@ -626,6 +633,13 @@ server_init(struct nsd *nsd)
 #endif /* IP_TRANSPARENT */
 		}
 
+#ifdef IP_FREEBIND
+		if (setsockopt(nsd->tcp[i].s, IPPROTO_IP, IP_FREEBIND, &on, sizeof(on)) < 0) {
+			log_msg(LOG_ERR, "setsockopt(...,IP_FREEBIND, ...) failed for udp: %s",
+				strerror(errno));
+		}
+#endif /* IP_FREEBIND */
+
 		if (bind(nsd->tcp[i].s, (struct sockaddr *) nsd->tcp[i].addr->ai_addr, nsd->tcp[i].addr->ai_addrlen) != 0) {
 			log_msg(LOG_ERR, "can't bind tcp socket: %s", strerror(errno));
 			return -1;

Reply via email to