On Thu, Jun 18, 2009 at 04:06:40PM +0200, Daniel Veillard wrote:
On Thu, Jun 18, 2009 at 10:46:45AM +0100, Daniel P. Berrange wrote:
> > > I was thinking of sugesting an attribute
> > >
> > > <ip type="ipv6" address="2001:23::2"
prefix="24"/>
> > >
> > > but I think its possibly better to have a different element name
> > >
> > > <ip6 address="2001:23::2" prefix="24"/>
> > >
> > > since the former would not work if we ever needed to worry about
> > > non-IP based addresses.
> >
> > Either works for me, with a slight preference for the first version, on
> > purely esthetic grounds. And even if we go with that, there's nothing
> > keeping us from adding an <ipx> element as an alternative to the
<ip>
> > element in the future.
>
> Or a 3rd option is to group addresses by family
>
>
> <addresses family='ipv4'>
> <ip address='122.0.0.3' prefix='24'/>
> <ip address='24.24.224.4' prefix='24'/>
> </addresses>
> <addresses family='ipv6'>
> <ip address='2001:23::2' prefix='48'/>
> <ip address='fe:33:55::33' prefix='64'/>
> </addresses>
> <adddresses family='ipx'>
> <ipx address='2423.4521.66.3.252.'/>
> </address>
Hum, right now the syntax is far more restrictive for addressing,
there is one address, period, with an optional route we need to extend
that IMHO.
[...]
The problem with the propsal is that it opens the door to a variety of
errors like using the same familly twice, which I would like to avoid
at the RNG level but it's not trivial.
We should allow standalone IPv4 and IPv6, or both. Each could either
use DHCP or allow one or more IP address and routes.
You need to have allow for IP adddresses & routes to be present even
when doing DHCP, because you need to discover what was auto-configured.
I think if we have routes, at most one need to be a gateway and
the
other ones having destination + prefix.
So I suggest the following rewrite of interface-addressing
<!-- Assignment of IP address to an interface -->
<define name="interface-addressing">
<choice>
<ref name="interface-addr-ipv4"/>
<ref name="interface-addr-ipv6"/>
<group>
<ref name="interface-addr-ipv4"/>
<ref name="interface-addr-ipv6"/>
</group>
</choice>
</define>
This allows one or 2 blocks of addresses ipv4, ipv6 or both
This is overly strict, because it does not allow for an interface
without any addresses - something you want todo if configuring a
bridge device just for guest traffic and do not want any IP on it
for the host. So just need to make both optional
<define name="interface-addressing">
<group>
<optional>
<ref name="interface-addr-ipv4"/>
<optional>
<optional>
<ref name="interface-addr-ipv6"/>
<optional>
</group>
</define>
<define name="interface-addr-ipv4">
<element name="addresses">
<attribute name="family">
<value>ipv4</value>
</attribute>
<choice>
<ref name="interface-addr-static"/>
<ref name="interface-addr-dhcp"/>
</choice>
</element>
</define>
An IPv4 addresses block, allows for either static or dhcp
<define name="interface-addr-ipv6">
<element name="addresses">
<attribute name="family">
<value>ipv6</value>
</attribute>
<choice>
<ref name="interface-addr-static"/>
<ref name="interface-addr-dhcp"/>
</choice>
</element>
</define>
same for IPv6
Not quite - IPv6 needs to allow for more options
- static - fully manual setup
- autoconf - auto assign addresses/routes. Assume DNS etc via dhcpv4 or
manual
- autoconf + statless dhcp - auto assign addresses/routes. DNS etc via dhcpv6
- statefull dhcp - everything via dhcpv6
Check out this preso for an overview if you dare.
http://lacnic.net/documentos/lacnicxi/presentaciones/autoconf_and_dhcpv6.pdf
In all cases we need to include <ip> tags to show the manual, or
automatically configured addresses/routes.
<define name="interface-addr-static">
<oneOrMore>
<element name="ip">
<attribute name="address"><ref
name="ip-addr"/></attribute>
<attribute name="prefix"><ref
name="prefix-pattern"/></attribute>
</element>
</oneOrMore>
<optional>
<ref name="interface-addr-routes"/>
</optional>
</define>
A static addressing scheme is made of one or more <ip> elements with
address and prefix followed by optional routing info
<define name="interface-addr-dhcp">
<element name="dhcp">
<optional>
<attribute name="peerdns">
<ref name="yes-or-no"/>
</attribute>
</optional>
</element>
</define>
For DHCP the only option is the peerdns yes/no attribute
<define name="interface-addr-routes">
<element name="route">
<attribute name="destination">
<value>default</value>
</attribute>
<attribute name="gateway"><ref
name="ip-addr"/></attribute>
</element>
<zeroOrMore>
<element name="route">
<attribute name="destination"><ref
name="ip-addr"/></attribute>
<attribute name="prefix"><ref
name="prefix-pattern"/></attribute>
<optional>
<attribute name="gateway"><ref
name="ip-addr"/></attribute>
</optional>
</element>
</zeroOrMore>
</define>
And for routes we have at least one default route and
then an optional set of routes with prefixes and optional gateways for
that device. To note all the ip/dhcp/route constructs are similar for
IPv4 and IPv6 as we don't check content precisely here. I assume it's
sufficient.
The 'ip-addr' match rule will need separate rules for IPv4 vs IP6
addresses, since the former use '.' as a seprator, while the latter
use ':'. The 'prefix-pattern' can be same, since its just a number
<interface type="ethernet" startmode="onboot">
<name>eth1</name>
<mtu size="1500"/>
<mac address="00:1A:A0:8F:39:A6"/>
<addresses family='ipv4'>
<dhcp peerdns="no"/>
..... possible <ip> tag(s)
here if interface is active
</addresses>
</interface>
<interface type="ethernet" startmode="none">
<name>eth2</name>
<addresses family='ipv4'>
<dhcp/>
</addresses>
<addresses family='ipv6'>
<dhcp/>
This also needs to indicate whether 'autoconf' is on vs off.
Probably just want an <autoconf/> element for that with
any combo of '<dhcp/>' and '<autoconf/>' allowed, including
neither.
</addresses>
</interface>
<interface type="ethernet" startmode="hotplug">
<name>eth3</name>
<mac address="00:1A:A0:8F:50:B7"/>
<addresses family='ipv4'>
<ip address="192.168.0.15" prefix="24"/>
<ip address="192.168.1.10" prefix="24"/>
<route destination="default" gateway="192.168.0.1"/>
<route destination="192.168.1.0" prefix="24"
gateway="192.168.1.1"/>
</addresses>
</interface>
This makes parsing a bit heavier, and I didn't checked if this really
affected bridging and bonding interfaces in a wrong way, but I think
that at least at an ethernet level definition this looks more complete.
That said I have no idea how much of a problem it would be on the netcf
impletmentation side.
Daniel
P.S.: full rng attached, double check the prefix-pattern definition
I have no idea if it's sufficient for Ipv6
The prefix is fine. the ip address rule needs to allow ':' for IPv6.
<!-- A Relax NG schema for network interfaces -->
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<choice>
<ref name="ethernet-interface"/>
<ref name="bridge-interface"/>
<ref name="bond-interface"/>
</choice>
</start>
<!--
FIXME: How do we handle VLAN's ? Should they be their own interface
or should we treat them as an option on the base interface ? For
example, for vlan eth0.42, it would make sense to make that part of
the definition of the eth0 interface.
-->
VLANs are tricky, because you can define VLANs on a physical
inteface or a bond interface, and you then may want to also
add a bridge on top of a VLAN, eg take 2 physical NICs, eth0
and eth1, here are some possible combes
- One NIC for storage, another for host mgmt, and put
the guests all on VLANs
eth0 -> br0 IP addr used for storage
eth1 -> br1 IP addr used for host mgmt
eth1.42 -> br1.42 IP addr, used to talk to guests
eth1.43 -> br1.43 No IP, guest traffic only
eth1.44 -> br1.44 No IP, guest traffic only
- Bonded NICs, used for everything
eth0 + eth1 -> bond0 -> br0 IP addr used for all
- Bonded NICs, and VLANs for guests
eth0 + eth1 -> bond0 IP addr used for host admin+storage
bond0.42 -> br0.42 IP addr, used to talk to guests
bond0.43 -> br0.43 No IP, guest traffic only
- Bonded NICs, and VLANs for host and for guests
eth0 + eth1 -> bond0 No IP, not used directly.
bond0.42 IP addr, Host mgmt traffic
bond0.43 -> br0.43 No IP, guest traffic only
I think the currently approach of modelling bond, bridges and NICs
makes this a little hard, particularly if the netcf API only exposes
'connections' and not interfaces, because some of these setups are
not really connections, only building blocks for 'n' other connections
Daniel
--
|: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://ovirt.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|