<?xml version="1.0"?>
<!-- A Relax NG schema for the libvirt network XML format -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start>
    <ref name="network"/>
  </start>

  <include href="basictypes.rng"/>
  <include href="networkcommon.rng"/>

  <define name="network">

    <element name="network">
      <optional>
        <attribute name="connections">
          <data type="unsignedInt"/>
        </attribute>
      </optional>
      <!-- Enables IPv6 guest-to-guest communications on a network
           with no gateways addresses specified -->
      <optional>
        <attribute name="ipv6">
          <ref name="virYesNo"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="trustGuestRxFilters">
          <ref name="virYesNo"/>
        </attribute>
      </optional>
      <interleave>

        <!-- The name of the network, used to refer to it through the API
             and in virsh -->
        <element name="name">
          <text/>
        </element>

        <!-- <metadata> element -->
        <optional>
          <ref name="metadata"/>
        </optional>

        <!-- <uuid> element -->
        <optional>
          <element name="uuid"><ref name="UUID"/></element>
        </optional>

        <!-- <bridge> element -->
        <optional>
          <!-- The name of the network to be set up; this will back
               the network on the host -->
          <element name="bridge">
            <optional>
              <attribute name="name">
                <ref name="deviceName"/>
              </attribute>
            </optional>

            <optional>
              <attribute name="zone">
                <ref name="zoneName"/>
              </attribute>
            </optional>

            <optional>
              <attribute name="stp">
                <ref name="virOnOff"/>
              </attribute>
            </optional>

            <optional>
              <attribute name="delay">
                <data type="unsignedLong"/>
              </attribute>
            </optional>

            <optional>
              <attribute name="macTableManager">
                <ref name="macTableManager"/>
              </attribute>
            </optional>

          </element>
        </optional>

        <!-- <mtu> element -->
        <optional>
          <ref name="mtu"/>
        </optional>

        <!-- <mac> element -->
        <optional>
          <element name="mac">
            <attribute name="address"><ref name="uniMacAddr"/></attribute>
            <empty/>
          </element>
        </optional>

        <!-- <forward> element -->
        <optional>
          <!-- The device through which the bridge is connected to the
               rest of the network -->
          <element name="forward">
            <optional>
              <attribute name="dev">
                <ref name="deviceName"/>
              </attribute>
            </optional>

            <optional>
              <attribute name="mode">
                <choice>
                  <value>nat</value>
                  <value>route</value>
                  <value>open</value>
                  <value>bridge</value>
                  <value>passthrough</value>
                  <value>private</value>
                  <value>vepa</value>
                  <value>hostdev</value>
                </choice>
              </attribute>
            </optional>

            <optional>
              <attribute name="managed">
                <ref name="virYesNo"/>
              </attribute>
            </optional>
            <interleave>
              <choice>
                <group>
                  <zeroOrMore>
                    <element name="interface">
                      <attribute name="dev">
                        <ref name="deviceName"/>
                      </attribute>
                      <optional>
                        <attribute name="connections">
                          <data type="unsignedInt"/>
                        </attribute>
                      </optional>
                    </element>
                  </zeroOrMore>
                </group>
                <group>
                  <zeroOrMore>
                    <element name="address">
                      <attribute name="type">
                        <value>pci</value>
                      </attribute>
                      <ref name="pciaddress"/>
                      <optional>
                        <attribute name="connections">
                          <data type="unsignedInt"/>
                        </attribute>
                      </optional>
                    </element>
                  </zeroOrMore>
                </group>
              </choice>
              <optional>
                <element name="pf">
                  <attribute name="dev">
                    <ref name="deviceName"/>
                  </attribute>
                </element>
              </optional>
              <optional>
                <element name="driver">
                  <attribute name="name">
                    <choice>
                      <value>kvm</value>
                      <value>vfio</value>
                    </choice>
                  </attribute>
                  <empty/>
                </element>
              </optional>
              <optional>
                <element name="nat">
                  <optional>
                    <attribute name="ipv6">
                      <ref name="virYesNo"/>
                    </attribute>
                  </optional>
                  <interleave>
                    <optional>
                      <element name="address">
                        <attribute name="start">
                          <ref name="ipv4Addr"/>
                        </attribute>
                        <attribute name="end">
                          <ref name="ipv4Addr"/>
                        </attribute>
                      </element>
                    </optional>
                    <optional>
                      <element name="port">
                        <attribute name="start">
                          <ref name="port"/>
                        </attribute>
                        <attribute name="end">
                          <ref name="port"/>
                        </attribute>
                      </element>
                    </optional>
                  </interleave>
                </element>
              </optional>
            </interleave>
          </element>
        </optional>

        <!-- <virtualport> element -->
        <optional>
          <ref name="virtualPortProfile"/>
        </optional>

        <!-- <portgroup> elements -->
        <zeroOrMore>
          <element name="portgroup">
            <attribute name="name">
              <ref name="deviceName"/>
            </attribute>
            <optional>
              <attribute name="default">
                <ref name="virYesNo"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="trustGuestRxFilters">
                <ref name="virYesNo"/>
              </attribute>
            </optional>
            <interleave>
              <optional>
                <ref name="virtualPortProfile"/>
              </optional>
              <optional>
                <ref name="bandwidth"/>
              </optional>
              <optional>
                <ref name="vlan"/>
              </optional>
            </interleave>
          </element>
        </zeroOrMore>

        <!-- <domain> element -->
        <optional>
          <element name="domain">
            <attribute name="name"><ref name="dnsName"/></attribute>
            <optional>
              <attribute name="localOnly"><ref name="virYesNo"/></attribute>
            </optional>
          </element>
        </optional>

        <!-- Define the DNS related elements like TXT records
             and other features in the <dns> element -->
        <optional>
          <element name="dns">
            <optional>
              <attribute name="enable">
                <ref name="virYesNo"/>
              </attribute>
            </optional>
            <optional>
              <attribute name="forwardPlainNames">
                <ref name="virYesNo"/>
              </attribute>
            </optional>
            <interleave>
              <zeroOrMore>
                <element name="forwarder">
                  <optional>
                    <attribute name="addr"><ref name="ipAddr"/></attribute>
                  </optional>
                  <optional>
                    <attribute name="domain"><ref name="dnsName"/></attribute>
                  </optional>
                  <empty/>
                </element>
              </zeroOrMore>
              <zeroOrMore>
                <element name="txt">
                  <attribute name="name"><ref name="dnsName"/></attribute>
                  <attribute name="value"><text/></attribute>
                </element>
              </zeroOrMore>
              <zeroOrMore>
                <element name="srv">
                  <attribute name="service"><text/></attribute>
                  <attribute name="protocol">
                    <ref name="protocol"/>
                  </attribute>
                  <optional>
                    <attribute name="domain"><ref name="dnsName"/></attribute>
                  </optional>
                  <optional>
                    <attribute name="target"><text/></attribute>
                  </optional>
                  <optional>
                    <attribute name="port">
                      <ref name="unsignedShort"/>
                    </attribute>
                  </optional>
                  <optional>
                    <attribute name="priority">
                      <ref name="unsignedShort"/>
                    </attribute>
                  </optional>
                  <optional>
                    <attribute name="weight">
                      <ref name="unsignedShort"/>
                    </attribute>
                  </optional>
                </element>
              </zeroOrMore>
              <zeroOrMore>
                <element name="host">
                  <attribute name="ip"><ref name="ipAddr"/></attribute>
                  <oneOrMore>
                    <element name="hostname"><ref name="dnsName"/></element>
                  </oneOrMore>
                </element>
              </zeroOrMore>
            </interleave>
          </element>
        </optional>
        <optional>
          <ref name="bandwidth"/>
        </optional>
        <optional>
          <ref name="vlan"/>
        </optional>
        <optional>
          <ref name="portOptions"/>
        </optional>

        <!-- <ip> element -->
        <zeroOrMore>
          <!-- The IP element sets up NAT'ing and an optional DHCP server
               local to the host. -->
          <element name="ip">
            <optional>
              <attribute name="address"><ref name="ipAddr"/></attribute>
            </optional>
            <optional>
              <choice>
                <attribute name="netmask"><ref name="ipv4Addr"/></attribute>
                <attribute name="prefix"><ref name="ipPrefix"/></attribute>
              </choice>
            </optional>
            <optional>
              <attribute name="family"><ref name="addr-family"/></attribute>
            </optional>
            <optional>
              <attribute name="localPtr"><ref name="virYesNo"/></attribute>
            </optional>
            <interleave>
              <optional>
                <element name="tftp">
                  <attribute name="root"><text/></attribute>
                </element>
              </optional>
              <optional>
                <!-- Define the range(s) of IP addresses that the DHCP
                     server should hand out -->
                <element name="dhcp">
                  <interleave>
                    <zeroOrMore>
                      <element name="range">
                        <attribute name="start"><ref name="ipAddr"/></attribute>
                        <attribute name="end"><ref name="ipAddr"/></attribute>
                        <interleave>
                          <optional>
                            <element name="lease">
                              <attribute name="expiry"><ref name="unsignedLong"/></attribute>
                              <optional>
                                <attribute name="unit"><ref name="leaseUnit"/></attribute>
                              </optional>
                            </element>
                          </optional>
                        </interleave>
                      </element>
                    </zeroOrMore>
                    <zeroOrMore>
                      <element name="host">
                        <choice>
                          <group>
                            <choice>
                              <attribute name="mac"><ref name="uniMacAddr"/></attribute>
                              <attribute name="id"><ref name="DUID"/></attribute>
                            </choice>
                            <optional>
                              <attribute name="name"><text/></attribute>
                            </optional>
                          </group>
                          <attribute name="name"><text/></attribute>
                        </choice>
                        <attribute name="ip"><ref name="ipAddr"/></attribute>
                        <interleave>
                          <optional>
                            <element name="lease">
                              <attribute name="expiry"><ref name="unsignedLong"/></attribute>
                              <optional>
                                <attribute name="unit"><ref name="leaseUnit"/></attribute>
                              </optional>
                            </element>
                          </optional>
                        </interleave>
                      </element>
                    </zeroOrMore>
                    <optional>
                      <element name="bootp">
                        <attribute name="file"><ref name="filePath"/></attribute>
                        <optional>
                          <attribute name="server"><ref name="dnsName"/></attribute>
                        </optional>
                      </element>
                    </optional>
                  </interleave>
                </element>
              </optional>
            </interleave>
          </element>
        </zeroOrMore>
        <!-- <route> element -->
        <zeroOrMore>
          <ref name="route"/>
        </zeroOrMore>

      <!-- <dnsmasq:options> -->
      <optional>
        <element name="options" ns="http://libvirt.org/schemas/network/dnsmasq/1.0">
          <zeroOrMore>
            <element name="option">
              <attribute name="value"/>
            </element>
          </zeroOrMore>
        </element>
      </optional>
      </interleave>
    </element>
  </define>
</grammar>
