mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 10:18:25 +00:00
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:
committed by
Simon Kelley
parent
10d8540f62
commit
70772c9091
@@ -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
|
|||||||
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)
|
|||||||
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);
|
|||||||
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);
|
||||||
|
|||||||
19
src/util.c
19
src/util.c
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user