Commit 70772c90 authored by Neil Jerram's avatar Neil Jerram Committed by Simon Kelley

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.
parent 10d8540f
...@@ -1550,6 +1550,7 @@ Treat DHCP request packets arriving at any of the <alias> interfaces ...@@ -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
......
...@@ -1659,7 +1659,7 @@ Traiter les requêtes DHCP arrivant sur n'importe laquelle des interfaces <alias ...@@ -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
......
...@@ -232,7 +232,7 @@ void dhcp_packet(time_t now, int pxe_fd) ...@@ -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)))
{ {
......
...@@ -1150,6 +1150,7 @@ void bump_maxfd(int fd, int *max); ...@@ -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);
......
...@@ -602,3 +602,22 @@ int wildcard_match(const char* wildcard, const char* match) ...@@ -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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment