[libvirt] [PATCH] add <bootp server="...">
Cole Robinson
crobinso at redhat.com
Thu Oct 22 17:55:07 UTC 2009
On 10/22/2009 12:20 PM, Paolo Bonzini wrote:
> This patch adds an optional attribute to the <bootp> tag, that
> allows to specify a TFTP server address other than the address of
> the DHCP server itself.
>
> This can be used to forward the BOOTP settings of the host down to the
> guest. This is something that configurations such as Xen's default
> network achieve naturally, but must be done manually for NAT.
>
> 2009-10-22 Paolo Bonzini <pbonzini at redhat.com>
>
> * docs/formatnetwork.html.in: Document new attribute.
> * docs/schemas/network.rng: Add it to schema.
> * src/conf/network_conf.h: Add it to struct.
> * src/conf/network_conf.c: Add it to parser and pretty printer.
> * src/network/bridge_driver.c: Put it in the dnsmasq command line.
>
> * tests/networkxml2xmlin/netboot-proxy-network.xml: New.
> * tests/networkxml2xmlout/netboot-proxy-network.xml: New.
> * tests/networkxml2xmltest.c: Add the new test.
> ---
> docs/formatnetwork.html.in | 15 ++++++++++-----
> docs/schemas/network.rng | 3 +++
> src/conf/network_conf.c | 9 ++++++++-
> src/conf/network_conf.h | 1 +
> src/network/bridge_driver.c | 9 +++++++--
> tests/networkxml2xmlin/netboot-proxy-network.xml | 13 +++++++++++++
> tests/networkxml2xmlout/netboot-proxy-network.xml | 13 +++++++++++++
> tests/networkxml2xmltest.c | 1 +
> 8 files changed, 56 insertions(+), 8 deletions(-)
> create mode 100644 tests/networkxml2xmlin/netboot-proxy-network.xml
> create mode 100644 tests/networkxml2xmlout/netboot-proxy-network.xml
>
> diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in
> index e471385..eb61f15 100644
> --- a/docs/formatnetwork.html.in
> +++ b/docs/formatnetwork.html.in
> @@ -142,11 +142,16 @@
> name to be given that host by the DHCP server (via the
> <code>name</code> attribute). <span class="since">Since 0.4.5</span>
> </dd><dt><code>bootp</code></dt><dd>The optional <code>bootp</code>
> - element specifies BOOTP options to be provided by the DHCP server.
> - Only one attribute is supported, <code>file</code>, giving the file
> - to be used for the boot image). The BOOTP options currently have to
> - be the same for all address ranges and statically assigned addresses.<span
> - class="since">Since 0.7.1.</span>
> + element specifies BOOTP options to be provided by the DHCP server.
> + Two attributes are supported: <code>file</code> is mandatory and
> + gives the file to be used for the boot image; <code>server</code> is
> + optional and gives the address of the TFTP server from which the boot
> + image will be fetched. <code>server</code> defaults to the same host
> + that runs the DHCP server, as is the case when the <code>tftp</code>
> + element is used. The BOOTP options currently have to be the same
> + for all address ranges and statically assigned addresses.<span
> + class="since">Since 0.7.1 (<code>server</code> since 0.7.3).</span>
> + </dd>
> </dl>
>
> <h2><a name="examples">Example configuration</a></h2>
> diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
> index 7a2d7d4..adef792 100644
> --- a/docs/schemas/network.rng
> +++ b/docs/schemas/network.rng
> @@ -109,6 +109,9 @@
> <optional>
> <element name="bootp">
> <attribute name="file"><text/></attribute>
> + <optional>
> + <attribute name="server"><text/></attribute>
> + </optional>
> </element>
> </optional>
> </element>
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index 40f5fdd..fd8efb0 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -117,6 +117,7 @@ void virNetworkDefFree(virNetworkDefPtr def)
>
> VIR_FREE(def->tftproot);
> VIR_FREE(def->bootfile);
> + VIR_FREE(def->bootserver);
>
> VIR_FREE(def);
> }
> @@ -313,6 +314,7 @@ virNetworkDHCPRangeDefParseXML(virConnectPtr conn,
> }
>
> def->bootfile = (char *)file;
> + def->bootserver = (char *) xmlGetProp(cur, BAD_CAST "server");
> }
>
> cur = cur->next;
> @@ -671,8 +673,13 @@ char *virNetworkDefFormat(virConnectPtr conn,
> virBufferAddLit(&buf, "/>\n");
> }
> if (def->bootfile) {
> - virBufferEscapeString(&buf, " <bootp file='%s' />\n",
> + virBufferEscapeString(&buf, " <bootp file='%s' ",
> def->bootfile);
> + if (def->bootserver) {
> + virBufferEscapeString(&buf, "server='%s' ",
> + def->bootserver);
> + }
> + virBufferAddLit(&buf, "/>\n");
> }
>
> virBufferAddLit(&buf, " </dhcp>\n");
> diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
> index e983a01..6175b0f 100644
> --- a/src/conf/network_conf.h
> +++ b/src/conf/network_conf.h
> @@ -81,6 +81,7 @@ struct _virNetworkDef {
>
> char *tftproot;
> char *bootfile;
> + char *bootserver;
> };
>
> typedef struct _virNetworkObj virNetworkObj;
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index 95bc810..bc241ef 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
> @@ -402,7 +402,7 @@ networkBuildDnsmasqArgv(virConnectPtr conn,
> (2 * network->def->nhosts) +
> /* --enable-tftp --tftp-root /srv/tftp */
> (network->def->tftproot ? 3 : 0) +
> - /* --dhcp-boot pxeboot.img */
> + /* --dhcp-boot pxeboot.img[,,12.34.56.78] */
> (network->def->bootfile ? 2 : 0) +
> 1; /* NULL */
>
> @@ -488,8 +488,13 @@ networkBuildDnsmasqArgv(virConnectPtr conn,
> APPEND_ARG(*argv, i++, network->def->tftproot);
> }
> if (network->def->bootfile) {
> + snprintf(buf, sizeof(buf), "%s%s%s",
> + network->def->bootfile,
> + network->def->bootserver ? ",," : "",
> + network->def->bootserver ? network->def->bootserver : "");
> +
> APPEND_ARG(*argv, i++, "--dhcp-boot");
> - APPEND_ARG(*argv, i++, network->def->bootfile);
> + APPEND_ARG(*argv, i++, buf);
> }
>
> #undef APPEND_ARG
> diff --git a/tests/networkxml2xmlin/netboot-proxy-network.xml b/tests/networkxml2xmlin/netboot-proxy-network.xml
> new file mode 100644
> index 0000000..ecb6738
> --- /dev/null
> +++ b/tests/networkxml2xmlin/netboot-proxy-network.xml
> @@ -0,0 +1,13 @@
> +<network>
> + <name>netboot</name>
> + <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
> + <bridge name="virbr1" stp='off' delay='1'/>
> + <domain name="example.com"/>
> + <forward/>
> + <ip address="192.168.122.1" netmask="255.255.255.0">
> + <dhcp>
> + <range start="192.168.122.2" end="192.168.122.254" />
> + <bootp file="pxeboot.img" server="10.20.30.40" />
> + </dhcp>
> + </ip>
> +</network>
> diff --git a/tests/networkxml2xmlout/netboot-proxy-network.xml b/tests/networkxml2xmlout/netboot-proxy-network.xml
> new file mode 100644
> index 0000000..e11c50b
> --- /dev/null
> +++ b/tests/networkxml2xmlout/netboot-proxy-network.xml
> @@ -0,0 +1,13 @@
> +<network>
> + <name>netboot</name>
> + <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
> + <forward mode='nat'/>
> + <bridge name='virbr1' stp='off' delay='1' />
> + <domain name='example.com'/>
> + <ip address='192.168.122.1' netmask='255.255.255.0'>
> + <dhcp>
> + <range start='192.168.122.2' end='192.168.122.254' />
> + <bootp file='pxeboot.img' server='10.20.30.40' />
> + </dhcp>
> + </ip>
> +</network>
> diff --git a/tests/networkxml2xmltest.c b/tests/networkxml2xmltest.c
> index b02d735..957e64b 100644
> --- a/tests/networkxml2xmltest.c
> +++ b/tests/networkxml2xmltest.c
> @@ -89,6 +89,7 @@ mymain(int argc, char **argv)
> DO_TEST("routed-network");
> DO_TEST("nat-network");
> DO_TEST("netboot-network");
> + DO_TEST("netboot-proxy-network");
>
> return (ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
> }
ACK, looks good to me.
- Cole
More information about the libvir-list
mailing list