Allow wildcard aliases in --bridge-interface option

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.
This commit is contained in:
Neil Jerram
2014-06-11 21:22:40 +01:00
committed by Simon Kelley
parent 10d8540f62
commit 70772c9091
5 changed files with 23 additions and 2 deletions

View 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 as if they had arrived at <interface>. This option is necessary when
using "old style" bridging on BSD platforms, since using "old style" bridging on BSD platforms, since
packets arrive at tap interfaces which don't have an IP address. packets arrive at tap interfaces which don't have an IP address.
A trailing '*' wildcard can be used in each <alias>.
.TP .TP
.B \-s, --domain=<domain>[,<address range>[,local]] .B \-s, --domain=<domain>[,<address range>[,local]]
Specifies DNS domains for the DHCP server. Domains may be be given Specifies DNS domains for the DHCP server. Domains may be be given

View 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 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 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 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 .TP
.B \-s, --domain=<domaine>[,<gamme d'adresses>[,local]] .B \-s, --domain=<domaine>[,<gamme d'adresses>[,local]]
Spécifie le domaine du serveur DHCP. Le domaine peut être donné de manière Spécifie le domaine du serveur DHCP. Le domaine peut être donné de manière

View File

@@ -232,7 +232,7 @@ void dhcp_packet(time_t now, int pxe_fd)
for (bridge = daemon->bridges; bridge; bridge = bridge->next) for (bridge = daemon->bridges; bridge; bridge = bridge->next)
{ {
for (alias = bridge->alias; alias; alias = alias->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))) if (!(iface_index = if_nametoindex(bridge->iface)))
{ {

View 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 read_write(int fd, unsigned char *packet, int size, int rw);
int wildcard_match(const char* wildcard, const char* match); int wildcard_match(const char* wildcard, const char* match);
int wildcard_matchn(const char* wildcard, const char* match, int num);
/* log.c */ /* log.c */
void die(char *message, char *arg1, int exit_code); void die(char *message, char *arg1, int exit_code);

View File

@@ -602,3 +602,22 @@ int wildcard_match(const char* wildcard, const char* match)
return *wildcard == *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);
}