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". --- Changes from V1: * add forgotten addition to RNG * add forgotten addition to virNetworkIpDefFormat * add networkxml2xml test (which would have caught the above) docs/formatnetwork.html.in | 21 +++++++++++++++++++++ docs/schemas/network.rng | 8 ++++++++ src/conf/network_conf.c | 16 ++++++++++++++++ src/conf/network_conf.h | 3 ++- src/network/bridge_driver.c | 3 ++- tests/networkxml2confdata/nat-network.conf | 2 +- tests/networkxml2confdata/nat-network.xml | 2 +- tests/networkxml2xmlin/nat-network.xml | 5 +++++ tests/networkxml2xmlout/nat-network.xml | 5 +++++ 9 files changed, 61 insertions(+), 4 deletions(-) diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in index 41a83fa..97e3bd4 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/docs/schemas/network.rng b/docs/schemas/network.rng index da7d8ad..ed6964a 100644 --- a/docs/schemas/network.rng +++ b/docs/schemas/network.rng @@ -305,6 +305,14 @@ <element name="option"> <attribute name="number"><ref name="uint8range"/></attribute> <attribute name="value"><text/></attribute> + <optional> + <attribute name="force"> + <choice> + <value>yes</value> + <value>no</value> + </choice> + </attribute> + </optional> </element> </zeroOrMore> </element> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 8b57242..4d07bac 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -796,6 +796,7 @@ virNetworkDHCPOptionDefParseXML(const char *networkName, virNetworkDHCPOptionDefPtr option) { char *number = NULL; + char *force = NULL; int ret = -1; if (!(number = virXMLPropString(node, "number"))) { @@ -811,12 +812,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; } @@ -2233,6 +2247,8 @@ virNetworkIpDefFormat(virBufferPtr buf, virBufferAsprintf(buf, "<option number='%u'", def->options[ii].number); virBufferEscapeString(buf, " value='%s'", def->options[ii].value); + if (def->options[ii].force) + virBufferAddLit(buf, " force='yes'"); virBufferAddLit(buf, "/>\n"); } diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index c509915..93ea371 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 @@ -76,6 +76,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 0932cf8..3f271d9 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -929,7 +929,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> diff --git a/tests/networkxml2xmlin/nat-network.xml b/tests/networkxml2xmlin/nat-network.xml index 23f7fcb..d6a174b 100644 --- a/tests/networkxml2xmlin/nat-network.xml +++ b/tests/networkxml2xmlin/nat-network.xml @@ -8,6 +8,11 @@ <range start="192.168.122.2" end="192.168.122.254" /> <host mac="00:16:3e:77:e2:ed" name="a.example.com" ip="192.168.122.10" /> <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' force='yes'/> + <option number='252' value='\n'/> + <option number='253' value=' leading and trailing spaces '/> </dhcp> </ip> <ip family="ipv4" address="192.168.123.1" netmask="255.255.255.0"> diff --git a/tests/networkxml2xmlout/nat-network.xml b/tests/networkxml2xmlout/nat-network.xml index 02d6849..55c051e 100644 --- a/tests/networkxml2xmlout/nat-network.xml +++ b/tests/networkxml2xmlout/nat-network.xml @@ -10,6 +10,11 @@ <range start='192.168.122.2' end='192.168.122.254' /> <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' /> <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' force='yes'/> + <option number='252' value='\n'/> + <option number='253' value=' leading and trailing spaces '/> </dhcp> </ip> <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'> -- 1.7.11.7 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list