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@xxxxxxxxxx> > > * 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 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list