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(a)redhat.com>
---
src/network/bridge_driver.c | 30 ++++++++++++++-----
.../networkxml2confdata/netboot-network.conf | 4 +--
tests/networkxml2confdata/netboot-tftp.conf | 13 ++++++++
tests/networkxml2confdata/netboot-tftp.xml | 9 ++++++
tests/networkxml2conftest.c | 1 +
tests/networkxml2xmlin/netboot-tftp.xml | 1 +
tests/networkxml2xmlout/netboot-tftp.xml | 1 +
tests/networkxml2xmltest.c | 1 +
8 files changed, 50 insertions(+), 10 deletions(-)
create mode 100644 tests/networkxml2confdata/netboot-tftp.conf
create mode 100644 tests/networkxml2confdata/netboot-tftp.xml
create mode 120000 tests/networkxml2xmlin/netboot-tftp.xml
create mode 120000 tests/networkxml2xmlout/netboot-tftp.xml
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 0338ef502f..b26b44ac01 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -1141,11 +1141,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);
@@ -1164,6 +1159,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,
@@ -1182,6 +1193,7 @@ networkDnsmasqConfContents(virNetworkObj *obj,
virNetworkIPDef *ipv4def = NULL;
virNetworkIPDef *ipv6def = NULL;
bool ipv6SLAAC = false;
+ bool enableTFTP = false;
*configstr = NULL;
@@ -1441,6 +1453,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) {
@@ -1619,7 +1633,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;
}
@@ -3667,7 +3681,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;
}
@@ -3782,7 +3796,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;
}
diff --git a/tests/networkxml2confdata/netboot-network.conf
b/tests/networkxml2confdata/netboot-network.conf
index 99272b9d68..a429663f8b 100644
--- a/tests/networkxml2confdata/netboot-network.conf
+++ b/tests/networkxml2confdata/netboot-network.conf
@@ -10,11 +10,11 @@ expand-hosts
except-interface=lo
bind-interfaces
listen-address=192.168.122.1
+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
diff --git a/tests/networkxml2confdata/netboot-tftp.conf
b/tests/networkxml2confdata/netboot-tftp.conf
new file mode 100644
index 0000000000..45615f3c33
--- /dev/null
+++ b/tests/networkxml2confdata/netboot-tftp.conf
@@ -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
diff --git a/tests/networkxml2confdata/netboot-tftp.xml
b/tests/networkxml2confdata/netboot-tftp.xml
new file mode 100644
index 0000000000..297f5a7ba1
--- /dev/null
+++ b/tests/networkxml2confdata/netboot-tftp.xml
@@ -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>
diff --git a/tests/networkxml2conftest.c b/tests/networkxml2conftest.c
index b76d72793a..a19449ea2b 100644
--- a/tests/networkxml2conftest.c
+++ b/tests/networkxml2conftest.c
@@ -137,6 +137,7 @@ mymain(void)
DO_TEST("isolated-network", restricted);
DO_TEST("netboot-network", restricted);
DO_TEST("netboot-proxy-network", restricted);
+ DO_TEST("netboot-tftp", full);
DO_TEST("nat-network-dns-srv-record-minimal", restricted);
DO_TEST("nat-network-name-with-quotes", restricted);
DO_TEST("routed-network", full);
diff --git a/tests/networkxml2xmlin/netboot-tftp.xml
b/tests/networkxml2xmlin/netboot-tftp.xml
new file mode 120000
index 0000000000..1487de558b
--- /dev/null
+++ b/tests/networkxml2xmlin/netboot-tftp.xml
@@ -0,0 +1 @@
+../networkxml2confdata/netboot-tftp.xml
\ No newline at end of file
diff --git a/tests/networkxml2xmlout/netboot-tftp.xml
b/tests/networkxml2xmlout/netboot-tftp.xml
new file mode 120000
index 0000000000..1487de558b
--- /dev/null
+++ b/tests/networkxml2xmlout/netboot-tftp.xml
@@ -0,0 +1 @@
+../networkxml2confdata/netboot-tftp.xml
\ No newline at end of file
diff --git a/tests/networkxml2xmltest.c b/tests/networkxml2xmltest.c
index ca24305ace..9e8d675a10 100644
--- a/tests/networkxml2xmltest.c
+++ b/tests/networkxml2xmltest.c
@@ -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");
--
2.32.0