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 f087e07c52..7449c7e02a 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -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;
}
diff --git a/tests/networkxml2confdata/netboot-network.conf
b/tests/networkxml2confdata/netboot-network.conf
index a13239a54f..32ef25b05f 100644
--- a/tests/networkxml2confdata/netboot-network.conf
+++ b/tests/networkxml2confdata/netboot-network.conf
@@ -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
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 0bc9e128e3..a062ff9c3c 100644
--- a/tests/networkxml2conftest.c
+++ b/tests/networkxml2conftest.c
@@ -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);
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.35.1