[libvirt] [PATCH 2/3] lease time support per host in dnsmasq
Laine Stump
laine at laine.org
Wed Jun 21 16:44:38 UTC 2017
On 06/20/2017 02:00 PM, aruiz at gnome.org wrote:
> From: Alberto Ruiz <aruiz at gnome.org>
>
> ---
> src/network/bridge_driver.c | 56 ++++++++++++++++++++++++++-------------------
> src/util/virdnsmasq.c | 52 +++++++++++++++++++----------------------
> src/util/virdnsmasq.h | 1 +
> 3 files changed, 57 insertions(+), 52 deletions(-)
As far as I can see, this doesn't set a different lease time for each
static host entry (which is what the title implies), but just sets the
single specified leasetime for *all* static host entries.
Aside from that, I'm not sure what is the value of setting a leastime on
a static host entry. An explanation of that in the commit log would be
helpful in determining whether or not there's even a point to doing this.
Also, I forgot to say it wrt to the previous patch, but you need to add
something to docs/formatnetwork.html.in to document the new config knob.
>
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index e51e469c8..1cffd4dcf 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
> @@ -861,30 +861,6 @@ networkKillDaemon(pid_t pid, const char *daemonName, const char *networkName)
> return ret;
> }
>
> -/* the following does not build a file, it builds a list
> - * which is later saved into a file
> - */
> -
> -static int
> -networkBuildDnsmasqDhcpHostsList(dnsmasqContext *dctx,
> - virNetworkIPDefPtr ipdef)
> -{
> - size_t i;
> - bool ipv6 = false;
> -
> - if (VIR_SOCKET_ADDR_IS_FAMILY(&ipdef->address, AF_INET6))
> - ipv6 = true;
> - for (i = 0; i < ipdef->nhosts; i++) {
> - virNetworkDHCPHostDefPtr host = &(ipdef->hosts[i]);
> - if (VIR_SOCKET_ADDR_VALID(&host->ip))
> - if (dnsmasqAddDhcpHost(dctx, host->mac, &host->ip,
> - host->name, host->id, ipv6) < 0)
> - return -1;
> - }
> -
> - return 0;
> -}
> -
> static int
> networkBuildDnsmasqHostsList(dnsmasqContext *dctx,
> virNetworkDNSDefPtr dnsdef)
> @@ -940,6 +916,38 @@ networkDnsmasqConfLeaseValueToString (int64_t leasetime)
> return result;
> }
>
> +/* the following does not build a file, it builds a list
> + * which is later saved into a file
> + */
> +
> +static int
> +networkBuildDnsmasqDhcpHostsList(dnsmasqContext *dctx,
> + virNetworkIPDefPtr ipdef)
> +{
> + int ret = -1;
> + size_t i;
> + bool ipv6 = false;
> + char *leasetime = networkDnsmasqConfLeaseValueToString(ipdef->leasetime);
> +
> + if (!leasetime)
> + goto cleanup;
> +
> + if (VIR_SOCKET_ADDR_IS_FAMILY(&ipdef->address, AF_INET6))
> + ipv6 = true;
> + for (i = 0; i < ipdef->nhosts; i++) {
> + virNetworkDHCPHostDefPtr host = &(ipdef->hosts[i]);
> + if (VIR_SOCKET_ADDR_VALID(&host->ip))
> + if (dnsmasqAddDhcpHost(dctx, host->mac, &host->ip,
> + host->name, host->id, leasetime, ipv6) < 0)
> + goto cleanup;
> + }
> +
> + ret = 0;
> +cleanup:
> + VIR_FREE(leasetime);
> + return ret;
> +}
> +
> int
> networkDnsmasqConfContents(virNetworkObjPtr network,
> const char *pidfile,
> diff --git a/src/util/virdnsmasq.c b/src/util/virdnsmasq.c
> index 1b78c1fad..92f834fe7 100644
> --- a/src/util/virdnsmasq.c
> +++ b/src/util/virdnsmasq.c
> @@ -308,52 +308,47 @@ hostsfileAdd(dnsmasqHostsfile *hostsfile,
> virSocketAddr *ip,
> const char *name,
> const char *id,
> + const char *leasetime,
> bool ipv6)
> {
> + int ret = -1;
> char *ipstr = NULL;
> + virBuffer hostbuf = VIR_BUFFER_INITIALIZER;
> +
> if (VIR_REALLOC_N(hostsfile->hosts, hostsfile->nhosts + 1) < 0)
> goto error;
>
> if (!(ipstr = virSocketAddrFormat(ip)))
> - return -1;
> + goto error;
>
> /* the first test determines if it is a dhcpv6 host */
> if (ipv6) {
> - if (name && id) {
> - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host,
> - "id:%s,%s,[%s]", id, name, ipstr) < 0)
> - goto error;
> - } else if (name && !id) {
> - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host,
> - "%s,[%s]", name, ipstr) < 0)
> - goto error;
> - } else if (!name && id) {
> - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host,
> - "id:%s,[%s]", id, ipstr) < 0)
> - goto error;
> - }
> + if (name && id)
> + virBufferAsprintf(&hostbuf, "id:%s,%s,[%s]", id, name, ipstr);
> + else if (name && !id)
> + virBufferAsprintf(&hostbuf, "%s,[%s]", name, ipstr);
> + else if (!name && id)
> + virBufferAsprintf(&hostbuf, "id:%s,[%s]", id, ipstr);
> } else if (name && mac) {
> - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host, "%s,%s,%s",
> - mac, ipstr, name) < 0)
> - goto error;
> + virBufferAsprintf(&hostbuf, "%s,%s,%s", mac, ipstr, name);
> } else if (name && !mac) {
> - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host, "%s,%s",
> - name, ipstr) < 0)
> - goto error;
> + virBufferAsprintf(&hostbuf, "%s,%s", name, ipstr);
> } else {
> - if (virAsprintf(&hostsfile->hosts[hostsfile->nhosts].host, "%s,%s",
> - mac, ipstr) < 0)
> - goto error;
> + virBufferAsprintf(&hostbuf, "%s,%s", mac, ipstr);
> }
> - VIR_FREE(ipstr);
>
> - hostsfile->nhosts++;
> + /* The leasetime string already includes comma if there's any value at all */
> + virBufferAsprintf(&hostbuf, "%s", leasetime);
>
> - return 0;
> + if (!(hostsfile->hosts[hostsfile->nhosts].host = virBufferContentAndReset (&hostbuf)))
> + goto error;
>
> + hostsfile->nhosts++;
> + ret = 0;
> error:
> + virBufferFreeAndReset(&hostbuf);
> VIR_FREE(ipstr);
> - return -1;
> + return ret;
> }
>
> static dnsmasqHostsfile *
> @@ -524,9 +519,10 @@ dnsmasqAddDhcpHost(dnsmasqContext *ctx,
> virSocketAddr *ip,
> const char *name,
> const char *id,
> + const char *leasetime,
> bool ipv6)
> {
> - return hostsfileAdd(ctx->hostsfile, mac, ip, name, id, ipv6);
> + return hostsfileAdd(ctx->hostsfile, mac, ip, name, id, leasetime, ipv6);
> }
>
> /*
> diff --git a/src/util/virdnsmasq.h b/src/util/virdnsmasq.h
> index f47bea3ab..c3ea271d4 100644
> --- a/src/util/virdnsmasq.h
> +++ b/src/util/virdnsmasq.h
> @@ -88,6 +88,7 @@ int dnsmasqAddDhcpHost(dnsmasqContext *ctx,
> virSocketAddr *ip,
> const char *name,
> const char *id,
> + const char *leastime,
> bool ipv6);
> int dnsmasqAddHost(dnsmasqContext *ctx,
> virSocketAddr *ip,
>
More information about the libvir-list
mailing list