[libvirt] [PATCH 2/2] network: add force attribute for dhcp options

Laine Stump laine at laine.org
Mon Feb 25 04:37:49 UTC 2013


If a dhcp option has "force='yes'", the dhcp server will send that
option back to every client regardless of whether or not the client
requests that option (without "force='yes'", an option will only be
sent to those clients that ask for it in their request packet). For example:

  <option number='40' value='libvirt' force='yes'/>

This information is relayed to dnsmasq by using the
"dhcp-option-force" option, rather than "dhcp-option".
---
 docs/formatnetwork.html.in                 | 21 +++++++++++++++++++++
 src/conf/network_conf.c                    | 14 ++++++++++++++
 src/conf/network_conf.h                    |  3 ++-
 src/network/bridge_driver.c                |  3 ++-
 tests/networkxml2confdata/nat-network.conf |  2 +-
 tests/networkxml2confdata/nat-network.xml  |  2 +-
 6 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in
index f7c483d..4b4c47b 100644
--- a/docs/formatnetwork.html.in
+++ b/docs/formatnetwork.html.in
@@ -557,6 +557,10 @@
             <range start="192.168.122.100" end="192.168.122.254" />
             <host mac="00:16:3e:77:e2:ed" name="foo.example.com" ip="192.168.122.10" />
             <host mac="00:16:3e:3e:a9:1a" name="bar.example.com" ip="192.168.122.11" />
+            <option number='252' value='\n'/>
+            <option number='4' value='192.168.122.11'/>
+            <option number='6' value='192.168.145.23'/>
+            <option number='23' value='64' force='yes'/>
           </dhcp>
         </ip>
         <ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" />
@@ -699,6 +703,23 @@
                 for all address ranges and statically assigned addresses.<span
                 class="since">Since 0.7.1 (<code>server</code> since 0.7.3).</span>
               </dd>
+              <dt><code>option</code></dt>
+              <dd>The optional <code>option</code> element (which can
+                be repeated for multiple DHCP options) specifies
+                generic DHCP options (as defined in RFC 2132, or later
+                RFCs in some cases) that will be sent by the DHCP
+                server to requesting clients (IPv4 only).  There are
+                three possible attributes: <code>number</code> is
+                mandatory and gives the standard option
+                number; <code>value</code> is optional and gives the
+                value of that option to be provided to the client
+                <code>force</code> is also optional, and defaults to
+                "no"; if <code>force</code> is "yes", the option will
+                be sent to all DHCP clients regardless of whether or
+                not the client requests it (usually only options
+                specifically requested by the client are sent in the
+                DHCP response).<span class="since">Since 1.0.3</span>
+              </dd>
             </dl>
           </dd>
         </dl>
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index b3e2858..8434dc4 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -782,6 +782,7 @@ virNetworkDHCPOptionDefParseXML(const char *networkName,
                                 virNetworkDHCPOptionDefPtr option)
 {
     char *number = NULL;
+    char *force = NULL;
     int ret = -1;
 
     if (!(number = virXMLPropString(node, "number"))) {
@@ -797,12 +798,25 @@ virNetworkDHCPOptionDefParseXML(const char *networkName,
                        number);
         goto cleanup;
     }
+
     option->value = virXMLPropString(node, "value");
 
+    if ((force = virXMLPropString(node, "force"))) {
+       if (STRCASEEQ(force, "yes")) {
+          option->force = true;
+       } else if (STRCASENEQ(force, "no")) {
+           virReportError(VIR_ERR_XML_ERROR,
+                          _("Invalid <option> force attribute %s "
+                            "in network '%s'"), force, networkName);
+           goto cleanup;
+       }
+    }
+
     ret = 0;
 
 cleanup:
     VIR_FREE(number);
+    VIR_FREE(force);
     return ret;
 }
 
diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
index e7a4f95..fd7a03c 100644
--- a/src/conf/network_conf.h
+++ b/src/conf/network_conf.h
@@ -1,7 +1,7 @@
 /*
  * network_conf.h: network XML handling
  *
- * Copyright (C) 2006-2008, 2012 Red Hat, Inc.
+ * Copyright (C) 2006-2013 Red Hat, Inc.
  * Copyright (C) 2006-2008 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
@@ -75,6 +75,7 @@ typedef virNetworkDHCPOptionDef *virNetworkDHCPOptionDefPtr;
 struct _virNetworkDHCPOptionDef {
     unsigned int number;
     char *value;
+    bool force;
 };
 
 typedef struct _virNetworkDNSTxtDef virNetworkDNSTxtDef;
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 0c3f778..e66a55d 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -928,7 +928,8 @@ networkDnsmasqConfContents(virNetworkObjPtr network,
             }
 
             for (r = 0 ; r < ipdef->noptions ; r++) {
-                virBufferAsprintf(&configbuf, "dhcp-option=%u",
+                virBufferAsprintf(&configbuf, "dhcp-option%s=%u",
+                                  ipdef->options[r].force ? "-force" : "",
                                   ipdef->options[r].number);
                 /* value is optional, and only needs quoting if it contains spaces */
                 if (ipdef->options[r].value) {
diff --git a/tests/networkxml2confdata/nat-network.conf b/tests/networkxml2confdata/nat-network.conf
index ee41e2a..2e855f4 100644
--- a/tests/networkxml2confdata/nat-network.conf
+++ b/tests/networkxml2confdata/nat-network.conf
@@ -14,7 +14,7 @@ dhcp-range=192.168.122.2,192.168.122.254
 dhcp-no-override
 dhcp-option=42,192.168.122.20
 dhcp-option=23,50
-dhcp-option=40,libvirt
+dhcp-option-force=40,libvirt
 dhcp-option=252,"\n"
 dhcp-option=253," leading and trailing spaces "
 dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases
diff --git a/tests/networkxml2confdata/nat-network.xml b/tests/networkxml2confdata/nat-network.xml
index 22ec533..0062cb4 100644
--- a/tests/networkxml2confdata/nat-network.xml
+++ b/tests/networkxml2confdata/nat-network.xml
@@ -10,7 +10,7 @@
       <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
       <option number='42' value='192.168.122.20'/>
       <option number='23' value='50'/>
-      <option number='40' value='libvirt'/>
+      <option number='40' value='libvirt' force='yes'/>
       <option number='252' value='\n'/>
       <option number='253' value=' leading and trailing spaces '/>
     </dhcp>
-- 
1.7.11.7




More information about the libvir-list mailing list