[PATCH 3/3] network: Generate TFTP config regardless of DHCP

Michal Privoznik mprivozn at redhat.com
Mon May 23 13:17:02 UTC 2022


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 at 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



More information about the libvir-list mailing list