[libvirt] [RFC PATCH] network: add an option to disable dnsmasq's bind-dynamic
Michal Privoznik
mprivozn at redhat.com
Thu May 7 09:58:39 UTC 2015
On 06.05.2015 15:29, Cédric Bosdonnat wrote:
> When building vlans on top of veth networks, dnsmasq doesn't catch
> DNS requests on the vlans interfaces. Allowing to disable the
> bind-dynamic helps this use case.
> ---
>
> src/conf/network_conf.c | 12 ++++++++++++
> src/conf/network_conf.h | 1 +
> src/network/bridge_driver.c | 3 ++-
> 3 files changed, 15 insertions(+), 1 deletion(-)
I know this is patch just to demonstrate the idea, so I will not point
out obvious (e.g. missing RNG schema and documentation).
>
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index f4a9df0..63e26e1 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -1987,6 +1987,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
> xmlNodePtr forwardNode = NULL;
> char *ipv6nogwStr = NULL;
> char *trustGuestRxFilters = NULL;
> + char *binddynamicStr = NULL;
> xmlNodePtr save = ctxt->node;
> xmlNodePtr bandwidthNode = NULL;
> xmlNodePtr vlanNode;
> @@ -2049,6 +2050,16 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
> VIR_FREE(trustGuestRxFilters);
> }
>
> + /* Default for binddynamic is on */
> + def->binddynamic = true;
> + binddynamicStr = virXPathString("string(./@binddynamic)", ctxt);
> + if (binddynamicStr) {
> + if (STRNEQ(binddynamicStr, "no")) {
s/STRNEQ/STREQ/ or even better virTristateSwitchTypeFromString().
Moreover, I'm curious if we can come up with not so dnsmasq specific
attribute name. But that's just cosmetics.
> + def->binddynamic = false;
> + }
> + VIR_FREE(binddynamicStr);
> + }
> +
> /* Parse network domain information */
> def->domain = virXPathString("string(./domain[1]/@name)", ctxt);
> tmp = virXPathString("string(./domain[1]/@localOnly)", ctxt);
> @@ -2326,6 +2337,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
> VIR_FREE(ipNodes);
> VIR_FREE(portGroupNodes);
> VIR_FREE(ipv6nogwStr);
> + VIR_FREE(binddynamicStr);
> VIR_FREE(trustGuestRxFilters);
> ctxt->node = save;
> return NULL;
> diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
> index f69d999..163581e 100644
> --- a/src/conf/network_conf.h
> +++ b/src/conf/network_conf.h
> @@ -253,6 +253,7 @@ struct _virNetworkDef {
> virNetDevBandwidthPtr bandwidth;
> virNetDevVlan vlan;
> int trustGuestRxFilters; /* enum virTristateBool */
> + bool binddynamic; /* to force off bind_dynamic option of dnsmasq */
> };
>
> typedef struct _virNetworkObj virNetworkObj;
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index d195085..5dddc4b 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
> @@ -988,7 +988,8 @@ networkDnsmasqConfContents(virNetworkObjPtr network,
> /* dnsmasq will *always* listen on localhost unless told otherwise */
> virBufferAddLit(&configbuf, "except-interface=lo\n");
>
> - if (dnsmasqCapsGet(caps, DNSMASQ_CAPS_BIND_DYNAMIC)) {
> + if (network->def->binddynamic &&
> + dnsmasqCapsGet(caps, DNSMASQ_CAPS_BIND_DYNAMIC)) {
I think the logic should be slightly different, when specifically
requested in XML but not provided by dnsmasq an error must be thrown.
> /* using --bind-dynamic with only --interface (no
> * --listen-address) prevents dnsmasq from responding to dns
> * queries that arrive on some interface other than our bridge
>
Since this is not the first request I see to disable dynamic bind I
think it's really needed. I'm too lazy to dig out the other requests
from history (maybe it was a bugzilla I saw, or an IRC chat, or here on
the list, ...).
So, ACK to the idea.
Michal
More information about the libvir-list
mailing list