<?xml version="1.0"?>
<interfaceDefinition>
  <node name="interfaces">
    <children>
      <tagNode name="bonding" owner="${vyos_conf_scripts_dir}/interfaces-bonding.py">
        <properties>
          <help>Bonding Interface/Link Aggregation</help>
          <priority>320</priority>
          <constraint>
            <regex>^bond[0-9]+$</regex>
          </constraint>
          <constraintErrorMessage>Bonding interface must be named bondN</constraintErrorMessage>
          <valueHelp>
            <format>bondN</format>
            <description>Bonding interface name</description>
          </valueHelp>
        </properties>
        <children>
          #include <include/interface/address-ipv4-ipv6-dhcp.xml.i>
          <node name="arp-monitor">
            <properties>
              <help>ARP link monitoring parameters</help>
            </properties>
            <children>
              <leafNode name="interval">
                <properties>
                  <help>ARP link monitoring interval</help>
                  <valueHelp>
                    <format>u32</format>
                    <description>Specifies the ARP link monitoring frequency in milliseconds</description>
                  </valueHelp>
                  <constraint>
                    <validator name="numeric" argument="--range 0-4294967295"/>
                  </constraint>
                </properties>
              </leafNode>
              <leafNode name="target">
                <properties>
                  <help>IP address used for ARP monitoring</help>
                  <valueHelp>
                    <format>ipv4</format>
                    <description>Specify IPv4 address of ARP requests when interval is enabled</description>
                  </valueHelp>
                  <constraint>
                    <validator name="ipv4-address"/>
                  </constraint>
                  <multi/>
                </properties>
              </leafNode>
            </children>
          </node>
          #include <include/interface/interface-description.xml.i>
          #include <include/interface/dhcp-options.xml.i>
          #include <include/interface/dhcpv6-options.xml.i>
          #include <include/interface/interface-disable-link-detect.xml.i>
          #include <include/interface/interface-disable.xml.i>
          #include <include/interface/interface-vrf.xml.i>
          #include <include/interface/interface-mirror.xml.i>
          <leafNode name="hash-policy">
            <properties>
              <help>Bonding transmit hash policy</help>
              <completionHelp>
                <list>layer2 layer2+3 layer3+4 encap2+3 encap3+4</list>
              </completionHelp>
              <valueHelp>
                <format>layer2</format>
                <description>use MAC addresses to generate the hash (802.3ad, default)</description>
              </valueHelp>
              <valueHelp>
                <format>layer2+3</format>
                <description>combine MAC address and IP address to make hash</description>
              </valueHelp>
              <valueHelp>
                <format>layer3+4</format>
                <description>combine IP address and port to make hash</description>
              </valueHelp>
              <valueHelp>
                <format>encap2+3</format>
                <description>combine encapsulated MAC address and IP address to make hash</description>
              </valueHelp>
              <valueHelp>
                <format>encap3+4</format>
                <description>combine encapsulated IP address and port to make hash</description>
              </valueHelp>
              <constraint>
                <regex>^(layer2\+3|layer3\+4|layer2|encap2\+3|encap3\+4)$</regex>
              </constraint>
              <constraintErrorMessage>hash-policy must be layer2 layer2+3 layer3+4 encap2+3 or encap3+4</constraintErrorMessage>
            </properties>
            <defaultValue>layer2</defaultValue>
          </leafNode>
          #include <include/interface/interface-ipv4-options.xml.i>
          #include <include/interface/interface-ipv6-options.xml.i>
          #include <include/interface/interface-mac.xml.i>
          <leafNode name="min-links">
            <properties>
              <help>Minimum number of member interfaces required up before enabling bond</help>
              <valueHelp>
                <format>u32:0-16</format>
                <description>Minimum number of member interfaces required up before enabling bond</description>
              </valueHelp>
              <constraint>
                <validator name="numeric" argument="--range 0-16"/>
              </constraint>
            </properties>
            <defaultValue>0</defaultValue>
          </leafNode>
          <leafNode name="lacp-rate">
            <properties>
              <help>Rate in which we will ask our link partner to transmit LACPDU packets</help>
              <completionHelp>
                <list>slow fast</list>
              </completionHelp>
              <valueHelp>
                <format>slow</format>
                <description>Request partner to transmit LACPDUs every 30 seconds (default)</description>
              </valueHelp>
              <valueHelp>
                <format>fast</format>
                <description>Request partner to transmit LACPDUs every 1 second</description>
              </valueHelp>
              <constraint>
                <regex>^(slow|fast)$</regex>
              </constraint>
            </properties>
            <defaultValue>slow</defaultValue>
          </leafNode>
          <leafNode name="mode">
            <properties>
              <help>Bonding mode</help>
              <completionHelp>
                <list>802.3ad active-backup broadcast round-robin transmit-load-balance adaptive-load-balance xor-hash</list>
              </completionHelp>
              <valueHelp>
                <format>802.3ad</format>
                <description>IEEE 802.3ad Dynamic link aggregation (Default)</description>
              </valueHelp>
              <valueHelp>
                <format>active-backup</format>
                <description>Fault tolerant: only one slave in the bond is active</description>
              </valueHelp>
              <valueHelp>
                <format>broadcast</format>
                <description>Fault tolerant: transmits everything on all slave interfaces</description>
              </valueHelp>
              <valueHelp>
                <format>round-robin</format>
                <description>Load balance: transmit packets in sequential order</description>
              </valueHelp>
              <valueHelp>
                <format>transmit-load-balance</format>
                <description>Load balance: adapts based on transmit load and speed</description>
              </valueHelp>
              <valueHelp>
                <format>adaptive-load-balance</format>
                <description>Load balance: adapts based on transmit and receive plus ARP</description>
              </valueHelp>
              <valueHelp>
                <format>xor-hash</format>
                <description>Distribute based on MAC address</description>
              </valueHelp>
              <constraint>
                <regex>^(802.3ad|active-backup|broadcast|round-robin|transmit-load-balance|adaptive-load-balance|xor-hash)$</regex>
              </constraint>
              <constraintErrorMessage>mode must be 802.3ad, active-backup, broadcast, round-robin, transmit-load-balance, adaptive-load-balance, or xor</constraintErrorMessage>
            </properties>
            <defaultValue>802.3ad</defaultValue>
          </leafNode>
          <node name="member">
            <properties>
              <help>Bridge member interfaces</help>
            </properties>
            <children>
              <leafNode name="interface">
                <properties>
                  <help>Member interface name</help>
                  <completionHelp>
                    <script>${vyos_completion_dir}/list_interfaces.py --bondable</script>
                  </completionHelp>
                  <multi/>
                </properties>
              </leafNode>
            </children>
          </node>
          #include <include/interface/interface-mtu-68-16000.xml.i>
          <leafNode name="primary">
            <properties>
              <help>Primary device interface</help>
              <completionHelp>
                <script>${vyos_completion_dir}/list_interfaces.py --bondable</script>
              </completionHelp>
            </properties>
          </leafNode>
          #include <include/interface/vif-s.xml.i>
          #include <include/interface/vif.xml.i>
          #include <include/interface/interface-xdp.xml.i>
        </children>
      </tagNode>
    </children>
  </node>
</interfaceDefinition>