]> git.ipfire.org Git - people/ms/dnsmasq.git/commitdiff
Allow wildcard aliases in --bridge-interface option
authorNeil Jerram <nj@metaswitch.com>
Wed, 11 Jun 2014 20:22:40 +0000 (21:22 +0100)
committerSimon Kelley <simon@thekelleys.org.uk>
Wed, 11 Jun 2014 20:22:40 +0000 (21:22 +0100)
This is useful when using dnsmasq as DHCP server for a set of VMs
whose data is routed by the host instead of being bridged.  In this
scenario:

- There is an unbounded set of TAP interfaces that have no IP address
  at the host end.

- DHCP allocation is done from an IPv4 address range associated with a
  dummy interface.

- We run dnsmasq with --interface dummy --interface tap*
  --bind-dynamic, so that it listens on all the TAP interfaces, and
  --bridge-interface=dummy,tap*, so that it will allocate IP addresses
  via the TAP interfaces from the range associated with the dummy
  interface.

man/dnsmasq.8
man/fr/dnsmasq.8
src/dhcp.c
src/dnsmasq.h
src/util.c

index f25119d1c0668222342307691c402bb8d490611f..0530a19772639a9095190e187754d450332ecbf5 100644 (file)
@@ -1550,6 +1550,7 @@ Treat DHCP request packets arriving at any of the <alias> interfaces
 as if they had arrived at <interface>. This option is necessary when
 using "old style" bridging on BSD platforms, since
 packets arrive at tap interfaces which don't have an IP address.
+A trailing '*' wildcard can be used in each <alias>.
 .TP
 .B \-s, --domain=<domain>[,<address range>[,local]]
 Specifies DNS domains for the DHCP server. Domains may be be given 
index 2f329ee10346c02395a8fc43745223fc3618e9f3..e0d1e9ad92e5c694718fdf62c4e958ff5ef012bf 100644 (file)
@@ -1659,7 +1659,7 @@ Traiter les requêtes DHCP arrivant sur n'importe laquelle des interfaces <alias
 comme si elles arrivaient de l'interface <interface>. Cette option est
 nécessaire lors de l'utilisation de pont ethernet "ancien mode" sur plate-forme
 BSD, puisque dans ce cas les paquets arrivent sur des interfaces "tap" n'ont
-pas d'adresse IP.
+pas d'adresse IP.  Chaque <alias> peut finir avec un simple '*' joker.
 .TP
 .B \-s, --domain=<domaine>[,<gamme d'adresses>[,local]]
 Spécifie le domaine du serveur DHCP. Le domaine peut être donné de manière
index 9463e2328311fa6f71c4ed36e8b578bc7c0e8f1a..7acf2c4311a94474b63f4729ebf85ac623ee69d8 100644 (file)
@@ -232,7 +232,7 @@ void dhcp_packet(time_t now, int pxe_fd)
   for (bridge = daemon->bridges; bridge; bridge = bridge->next)
     {
       for (alias = bridge->alias; alias; alias = alias->next)
-       if (strncmp(ifr.ifr_name, alias->iface, IF_NAMESIZE) == 0)
+       if (wildcard_matchn(alias->iface, ifr.ifr_name, IF_NAMESIZE))
          {
            if (!(iface_index = if_nametoindex(bridge->iface)))
              {
index de989563c0b2aa2c953f8ea26a50d3962d8f3a28..dfa97734068fd80a062727bb992c36e535494f3b 100644 (file)
@@ -1150,6 +1150,7 @@ void bump_maxfd(int fd, int *max);
 int read_write(int fd, unsigned char *packet, int size, int rw);
 
 int wildcard_match(const char* wildcard, const char* match);
+int wildcard_matchn(const char* wildcard, const char* match, int num);
 
 /* log.c */
 void die(char *message, char *arg1, int exit_code);
index 7c46d407b5596ff9a38af741868432237b8b527b..a5030821d3e36dbcdb0ae480404fc99fdaaeb452 100644 (file)
@@ -602,3 +602,22 @@ int wildcard_match(const char* wildcard, const char* match)
 
   return *wildcard == *match;
 }
+
+/* The same but comparing a maximum of NUM characters, like strncmp.  */
+int wildcard_matchn(const char* wildcard, const char* match, int num)
+{
+  while (*wildcard && *match && num)
+    {
+      if (*wildcard == '*')
+        return 1;
+
+      if (*wildcard != *match)
+        return 0; 
+
+      ++wildcard;
+      ++match;
+      --num;
+    }
+
+  return (!num) || (*wildcard == *match);
+}