Blame SOURCES/dnsmasq-2.76-dns-sleep-resume.patch

e87dd3
From 2675f2061525bc954be14988d64384b74aa7bf8b Mon Sep 17 00:00:00 2001
e87dd3
From: Beniamino Galvani <bgalvani@redhat.com>
e87dd3
Date: Sun, 28 Aug 2016 20:44:05 +0100
e87dd3
Subject: [PATCH] Handle binding upstream servers to an interface
e87dd3
 (--server=1.2.3.4@eth0) when the named interface is destroyed and recreated
e87dd3
 in the kernel.
e87dd3
e87dd3
---
e87dd3
 CHANGELOG     |  5 +++++
e87dd3
 src/dnsmasq.h |  1 +
e87dd3
 src/network.c | 31 +++++++++++++++++++++++++++++--
e87dd3
 3 files changed, 35 insertions(+), 2 deletions(-)
e87dd3
e87dd3
diff --git a/src/dnsmasq.h b/src/dnsmasq.h
e87dd3
index 27385a9..f239ce5 100644
e87dd3
--- a/src/dnsmasq.h
e87dd3
+++ b/src/dnsmasq.h
e87dd3
@@ -488,6 +488,7 @@ struct serverfd {
e87dd3
   int fd;
e87dd3
   union mysockaddr source_addr;
e87dd3
   char interface[IF_NAMESIZE+1];
e87dd3
+  unsigned int ifindex, used;
e87dd3
   struct serverfd *next;
e87dd3
 };
e87dd3
 
e87dd3
diff --git a/src/network.c b/src/network.c
e87dd3
index e7722fd..ddf8d31 100644
e87dd3
--- a/src/network.c
e87dd3
+++ b/src/network.c
e87dd3
@@ -1204,6 +1204,7 @@ int local_bind(int fd, union mysockaddr *addr, char *intname, int is_tcp)
e87dd3
 static struct serverfd *allocate_sfd(union mysockaddr *addr, char *intname)
e87dd3
 {
e87dd3
   struct serverfd *sfd;
e87dd3
+  unsigned int ifindex = 0;
e87dd3
   int errsave;
e87dd3
 
e87dd3
   /* when using random ports, servers which would otherwise use
e87dd3
@@ -1224,11 +1225,15 @@ static struct serverfd *allocate_sfd(union mysockaddr *addr, char *intname)
e87dd3
 	return NULL;
e87dd3
 #endif
e87dd3
     }
e87dd3
+
e87dd3
+  if (intname && strlen(intname) != 0)
e87dd3
+    ifindex = if_nametoindex(intname); /* index == 0 when not binding to an interface */
e87dd3
       
e87dd3
   /* may have a suitable one already */
e87dd3
   for (sfd = daemon->sfds; sfd; sfd = sfd->next )
e87dd3
     if (sockaddr_isequal(&sfd->source_addr, addr) &&
e87dd3
-	strcmp(intname, sfd->interface) == 0)
e87dd3
+	strcmp(intname, sfd->interface) == 0 &&
e87dd3
+	ifindex == sfd->ifindex) 
e87dd3
       return sfd;
e87dd3
   
e87dd3
   /* need to make a new one. */
e87dd3
@@ -1250,11 +1255,13 @@ static struct serverfd *allocate_sfd(union mysockaddr *addr, char *intname)
e87dd3
       errno = errsave;
e87dd3
       return NULL;
e87dd3
     }
e87dd3
-    
e87dd3
+
e87dd3
   strcpy(sfd->interface, intname); 
e87dd3
   sfd->source_addr = *addr;
e87dd3
   sfd->next = daemon->sfds;
e87dd3
+  sfd->ifindex = ifindex;
e87dd3
   daemon->sfds = sfd;
e87dd3
+
e87dd3
   return sfd; 
e87dd3
 }
e87dd3
 
e87dd3
@@ -1429,12 +1436,16 @@ void check_servers(void)
e87dd3
 {
e87dd3
   struct irec *iface;
e87dd3
   struct server *serv;
e87dd3
+  struct serverfd *sfd, *tmp, **up;
e87dd3
   int port = 0, count;
e87dd3
 
e87dd3
   /* interface may be new since startup */
e87dd3
   if (!option_bool(OPT_NOWILD))
e87dd3
     enumerate_interfaces(0);
e87dd3
   
e87dd3
+  for (sfd = daemon->sfds; sfd; sfd = sfd->next)
e87dd3
+    sfd->used = 0;
e87dd3
+
e87dd3
 #ifdef HAVE_DNSSEC
e87dd3
  /* Disable DNSSEC validation when using server=/domain/.... servers
e87dd3
     unless there's a configured trust anchor. */
e87dd3
@@ -1505,6 +1516,8 @@ void check_servers(void)
e87dd3
 	      serv->flags |= SERV_MARK;
e87dd3
 	      continue;
e87dd3
 	    }
e87dd3
+
e87dd3
+	  serv->sfd->used = 1;
e87dd3
 	}
e87dd3
       
e87dd3
       if (!(serv->flags & SERV_NO_REBIND) && !(serv->flags & SERV_LITERAL_ADDRESS))
e87dd3
@@ -1547,6 +1560,20 @@ void check_servers(void)
e87dd3
   if (count - 1 > SERVERS_LOGGED)
e87dd3
     my_syslog(LOG_INFO, _("using %d more nameservers"), count - SERVERS_LOGGED - 1);
e87dd3
 
e87dd3
+  /* Remove unused sfds */
e87dd3
+  for (sfd = daemon->sfds, up = &daemon->sfds; sfd; sfd = tmp)
e87dd3
+    {
e87dd3
+       tmp = sfd->next;
e87dd3
+       if (!sfd->used) 
e87dd3
+	{
e87dd3
+	  *up = sfd->next;
e87dd3
+	  close(sfd->fd);
e87dd3
+	  free(sfd);
e87dd3
+	} 
e87dd3
+      else
e87dd3
+	up = &sfd->next;
e87dd3
+    }
e87dd3
+  
e87dd3
   cleanup_servers();
e87dd3
 }
e87dd3
 
e87dd3
-- 
e87dd3
2.7.4
e87dd3