network: Generate TFTP config regardless of DHCP

We already allow users to provide TFTP root path in network XML
and not specify any DHCP. This makes sense, because dnsmasq is
not only DHCP server but also TFTP server and users might have
a DHCP server configured on their own, outside of libvirt's
control and want just the TFTP part.

By moving TFTP config generator out of DHCP generator and calling
it for every IPv4 range, users can finally enable just TFTP.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2026765
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Michal Privoznik 2021-12-09 16:47:04 +01:00
parent bab462db6e
commit 12be42ee7e
8 changed files with 50 additions and 10 deletions

View File

@ -1088,11 +1088,6 @@ networkDnsmasqConfDHCP(virBuffer *buf,
virBufferAddLit(buf, "dhcp-authoritative\n");
}
if (ipdef->tftproot) {
virBufferAddLit(buf, "enable-tftp\n");
virBufferAsprintf(buf, "tftp-root=%s\n", ipdef->tftproot);
}
if (ipdef->bootfile) {
if (VIR_SOCKET_ADDR_VALID(&ipdef->bootserver)) {
g_autofree char *bootserver = virSocketAddrFormat(&ipdef->bootserver);
@ -1111,6 +1106,22 @@ networkDnsmasqConfDHCP(virBuffer *buf,
}
static void
networkDnsmasqConfTFTP(virBuffer *buf,
virNetworkIPDef *ipdef,
bool *enableTFTP)
{
if (!ipdef->tftproot)
return;
if (!*enableTFTP) {
virBufferAddLit(buf, "enable-tftp\n");
*enableTFTP = true;
}
virBufferAsprintf(buf, "tftp-root=%s\n", ipdef->tftproot);
}
int
networkDnsmasqConfContents(virNetworkObj *obj,
const char *pidfile,
@ -1129,6 +1140,7 @@ networkDnsmasqConfContents(virNetworkObj *obj,
virNetworkIPDef *ipv4def = NULL;
virNetworkIPDef *ipv6def = NULL;
bool ipv6SLAAC = false;
bool enableTFTP = false;
*configstr = NULL;
@ -1339,6 +1351,8 @@ networkDnsmasqConfContents(virNetworkObj *obj,
ipv4def = ipdef;
}
}
networkDnsmasqConfTFTP(&configbuf, ipdef, &enableTFTP);
}
if (VIR_SOCKET_ADDR_IS_FAMILY(&ipdef->address, AF_INET6)) {
if (ipdef->nranges || ipdef->nhosts) {
@ -1500,7 +1514,7 @@ networkStartDhcpDaemon(virNetworkDriverState *driver,
i = 0;
while ((ipdef = virNetworkDefGetIPByIndex(def, AF_UNSPEC, i))) {
i++;
if (ipdef->nranges || ipdef->nhosts)
if (ipdef->nranges || ipdef->nhosts || ipdef->tftproot)
needDnsmasq = true;
}
@ -3255,7 +3269,7 @@ networkUpdate(virNetworkPtr net,
for (i = 0;
(ipdef = virNetworkDefGetIPByIndex(def, AF_INET, i));
i++) {
if (ipdef->nranges || ipdef->nhosts) {
if (ipdef->nranges || ipdef->nhosts || ipdef->tftproot) {
oldDhcpActive = true;
break;
}
@ -3370,7 +3384,7 @@ networkUpdate(virNetworkPtr net,
for (i = 0; (ipdef = virNetworkDefGetIPByIndex(def, AF_INET, i));
i++) {
if (ipdef->nranges || ipdef->nhosts) {
if (ipdef->nranges || ipdef->nhosts || ipdef->tftproot) {
newDhcpActive = true;
break;
}

View File

@ -10,11 +10,11 @@ expand-hosts
except-interface=lo
bind-dynamic
interface=virbr1
enable-tftp
tftp-root=/var/lib/tftproot
dhcp-range=192.168.122.2,192.168.122.254,255.255.255.0
dhcp-no-override
dhcp-authoritative
enable-tftp
tftp-root=/var/lib/tftproot
dhcp-boot=pxeboot.img
dhcp-lease-max=253
dhcp-hostsfile=/var/lib/libvirt/dnsmasq/netboot.hostsfile

View File

@ -0,0 +1,13 @@
##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
## virsh net-edit tftp-only
## or other application using the libvirt API.
##
## dnsmasq conf file created by libvirt
strict-order
except-interface=lo
bind-dynamic
interface=virbr0
enable-tftp
tftp-root=/var/lib/tftproot
addn-hosts=/var/lib/libvirt/dnsmasq/tftp-only.addnhosts

View File

@ -0,0 +1,9 @@
<network>
<name>tftp-only</name>
<uuid>eb486e5c-4df5-42ee-ae4a-ad8557998d00</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='off' delay='1'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<tftp root='/var/lib/tftproot'/>
</ip>
</network>

View File

@ -168,6 +168,7 @@ mymain(void)
DO_TEST("isolated-network", full);
DO_TEST("netboot-network", full);
DO_TEST("netboot-proxy-network", full);
DO_TEST("netboot-tftp", full);
DO_TEST("nat-network-dns-srv-record-minimal", full);
DO_TEST("nat-network-name-with-quotes", full);
DO_TEST("routed-network", full);

View File

@ -0,0 +1 @@
../networkxml2confdata/netboot-tftp.xml

View File

@ -0,0 +1 @@
../networkxml2confdata/netboot-tftp.xml

View File

@ -127,6 +127,7 @@ mymain(void)
DO_TEST("nat-network");
DO_TEST("netboot-network");
DO_TEST("netboot-proxy-network");
DO_TEST("netboot-tftp");
DO_TEST("nat-network-dns-txt-record");
DO_TEST("nat-network-dns-srv-record");
DO_TEST("nat-network-dns-srv-records");