Enthusiastic logging when interface goes away

Eric Luehrsen ericluehrsen at gmail.com
Fri Oct 5 03:32:47 UTC 2018


Reduce log noise when an interface goes missing during
reconfiguration. It is a crude patch requiring quality control
but it demonstrates the concept.

Index: services/listen_dnsport.c
===================================================================
--- a/services/listen_dnsport.c
+++ b/services/listen_dnsport.c
@@ -600,6 +600,7 @@ int
  create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
  	int* reuseport, int transparent, int mss, int freebind, int use_systemd)
  {
+	static time_t bindlogtime = 0;
  	int s;
  #if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || 
defined(IPV6_V6ONLY) || defined(IP_TRANSPARENT) || defined(IP_BINDANY) 
|| defined(IP_FREEBIND) || defined(SO_BINDANY)
  	int on = 1;
@@ -762,10 +763,11 @@ create_tcp_accept_sock(struct addrinfo *addr, int 
v6only, int* noproto,
  		/* detect freebsd jail with no ipv6 permission */
  		if(addr->ai_family==AF_INET6 && errno==EINVAL)
  			*noproto = 1;
-		else {
+		else if (difftime(time(NULL), bindlogtime) > 300.0F) {
+			bindlogtime = time(NULL);
  			log_err_addr("can't bind socket", strerror(errno),
  				(struct sockaddr_storage*)addr->ai_addr,
  				addr->ai_addrlen);
  		}
  		close(s);
  #else
Index: util/netevent.c
===================================================================
--- a/util/netevent.c
+++ b/util/netevent.c
@@ -331,8 +331,9 @@ int tcp_connect_errno_needs_log(struct sockaddr* 
addr, socklen_t addrlen)
  /* send a UDP reply */
  int
  comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet,
-	struct sockaddr* addr, socklen_t addrlen)
+	struct sockaddr* addr, socklen_t addrlen)
  {
+	static time_t sendlogtime = 0;
  	ssize_t sent;
  	log_assert(c->fd != -1);
  #ifdef UNBOUND_DEBUG
@@ -371,17 +372,20 @@ comm_point_send_udp_msg(struct comm_point *c, 
sldns_buffer* packet,
  	if(sent == -1) {
  		if(!udp_send_errno_needs_log(addr, addrlen))
  			return 0;
+		if (difftime(time(NULL), sendlogtime) > 300.0F) {
+			sendlogtime = time(NULL);
  #ifndef USE_WINSOCK
-		verbose(VERB_OPS, "sendto failed: %s", strerror(errno));
+			verbose(VERB_OPS, "sendto failed: %s", strerror(errno));
  #else
-		verbose(VERB_OPS, "sendto failed: %s",
-			wsa_strerror(WSAGetLastError()));
+			verbose(VERB_OPS, "sendto failed: %s",
+				wsa_strerror(WSAGetLastError()));
  #endif
-		log_addr(VERB_OPS, "remote address is",
-			(struct sockaddr_storage*)addr, addrlen);
+			log_addr(VERB_OPS, "remote address is",
+				(struct sockaddr_storage*)addr, addrlen);
+		}
  		return 0;
  	} else if((size_t)sent != sldns_buffer_remaining(packet)) {
-		log_err("sent %d in place of %d bytes",
+		log_err("sent %d in place of %d bytes",
  			(int)sent, (int)sldns_buffer_remaining(packet));
  		return 0;
  	}




More information about the Unbound-users mailing list