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

Michal Privoznik mprivozn at redhat.com
Thu Dec 9 16:17:52 UTC 2021


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




More information about the libvir-list mailing list