<?xml version="1.0"?>
<interfaceDefinition>
  <node name="interfaces">
    <children>
      <tagNode name="tunnel" owner="${vyos_conf_scripts_dir}/interfaces-tunnel.py">
        <properties>
          <help>Tunnel interface</help>
          <priority>380</priority>
          <constraint>
            <regex>^tun[0-9]+$</regex>
          </constraint>
          <constraintErrorMessage>tunnel interface must be named tunN</constraintErrorMessage>
          <valueHelp>
            <format>tunN</format>
            <description>Tunnel interface name</description>
          </valueHelp>
        </properties>
        <children>
          #include <include/interface-description.xml.i>
          #include <include/address-ipv4-ipv6.xml.i>
          #include <include/interface-disable.xml.i>
          #include <include/interface-disable-link-detect.xml.i>
          #include <include/interface-vrf.xml.i>
          #include <include/interface-mtu-64-8024.xml.i>
          #include <include/interface-ipv4-options.xml.i>
          #include <include/interface-ipv6-options.xml.i>
          <leafNode name="local-ip">
            <properties>
              <help>Local IP address for this tunnel</help>
              <valueHelp>
                <format>ipv4</format>
                <description>Local IPv4 address for this tunnel</description>
              </valueHelp>
              <valueHelp>
                <format>ipv6</format>
                <description>Local IPv6 address for this tunnel [NOTICE: unavailable for mGRE tunnels]</description>
              </valueHelp>
              <completionHelp>
                <script>${vyos_completion_dir}/list_local.py</script>
              </completionHelp>
              <constraint>
                <validator name="ip-address"/>
              </constraint>
            </properties>
          </leafNode>
          <leafNode name="remote-ip">
            <properties>
              <help>Remote IP address for this tunnel</help>
              <valueHelp>
                <format>ipv4</format>
                <description>Remote IPv4 address for this tunnel</description>
              </valueHelp>
              <valueHelp>
                <format>ipv6</format>
                <description>Remote IPv6 address for this tunnel</description>
              </valueHelp>
              <constraint>
                <!-- does it need fixing/changing to be more restrictive ? -->
                <validator name="ip-address"/>
              </constraint>
            </properties>
          </leafNode>
          <leafNode name="source-interface">
            <properties>
              <help>Physical Interface used for underlaying traffic</help>
              <completionHelp>
                <script>${vyos_completion_dir}/list_interfaces.py</script>
              </completionHelp>
            </properties>
          </leafNode>
          <leafNode name="6rd-prefix">
            <properties>
              <help>6rd network prefix</help>
              <valueHelp>
                <format>ipv6</format>
                <description>IPv6 address and prefix length</description>
              </valueHelp>
              <constraint>
                <validator name="ipv6-prefix"/>
              </constraint>
            </properties>
          </leafNode>
          <leafNode name="6rd-relay-prefix">
            <properties>
              <help>6rd relay prefix</help>
              <valueHelp>
                <format>ipv4net</format>
                <description>IPv4 prefix of interface for 6rd</description>
              </valueHelp>
              <constraint>
                <validator name="ipv4-prefix"/>
              </constraint>
            </properties>
          </leafNode>
          <leafNode name="dhcp-interface">
            <properties>
              <help>dhcp interface</help>
              <valueHelp>
                <format>interface</format>
                <description>DHCP interface that supplies the local IP address for this tunnel</description>
              </valueHelp>
              <completionHelp>
                <script>${vyos_completion_dir}/list_interfaces.py</script>
              </completionHelp>
              <constraint>
                <regex>^(en|eth|br|bond|gnv|vxlan|wg|tun)[0-9]+$</regex>
              </constraint>
            </properties>
          </leafNode>
          <leafNode name="encapsulation">
            <properties>
              <help>Encapsulation of this tunnel interface</help>
              <completionHelp>
                <list>gre gre-bridge ip6gre ip6ip6 ipip ipip6 sit</list>
              </completionHelp>
              <valueHelp>
                <format>gre</format>
                <description>Generic Routing Encapsulation</description>
              </valueHelp>
              <valueHelp>
                <format>gre-bridge</format>
                <description>Generic Routing Encapsulation bridge interface</description>
              </valueHelp>
              <valueHelp>
                <format>ip6gre</format>
                <description>GRE over IPv6 network</description>
              </valueHelp>
              <valueHelp>
                <format>ip6ip6</format>
                <description>IP6 in IP6 encapsulation</description>
              </valueHelp>
              <valueHelp>
                <format>ipip</format>
                <description>IP in IP encapsulation</description>
              </valueHelp>
              <valueHelp>
                <format>ipip6</format>
                <description>IP in IP6 encapsulation</description>
              </valueHelp>
              <valueHelp>
                <format>sit</format>
                <description>Simple Internet Transition encapsulation</description>
              </valueHelp>
              <constraint>
                <regex>^(gre|gre-bridge|ip6gre|ip6ip6|ipip|ipip6|sit)$</regex>
              </constraint>
              <constraintErrorMessage>Invalid encapsulation, must be one of: gre, gre-bridge, ipip, sit, ipip6, ip6ip6, ip6gre</constraintErrorMessage>
            </properties>
          </leafNode>
          <leafNode name="multicast">
            <properties>
              <help>Multicast operation over tunnel</help>
              <completionHelp>
                <list>enable disable</list>
              </completionHelp>
              <valueHelp>
                <format>enable</format>
                <description>Enable Multicast</description>
              </valueHelp>
              <valueHelp>
                <format>disable</format>
                <description>Disable Multicast (default)</description>
              </valueHelp>
              <constraint>
                <regex>^(enable|disable)$</regex>
              </constraint>
              <constraintErrorMessage>Must be 'disable' or 'enable'</constraintErrorMessage>
            </properties>
          </leafNode>
          <node name="parameters">
            <properties>
              <help>Tunnel parameters</help>
            </properties>
            <children>
              <node name="ip">
                <properties>
                  <help>IPv4 specific tunnel parameters</help>
                </properties>
                <children>
                  <leafNode name="ttl">
                    <properties>
                      <help>Time to live field</help>
                      <valueHelp>
                        <format>0-255</format>
                        <description>Time to live (default 255)</description>
                      </valueHelp>
                      <constraint>
                        <validator name="numeric" argument="--range 0-255"/>
                      </constraint>
                      <constraintErrorMessage>TTL must be between 0 and 255</constraintErrorMessage>
                    </properties>
                    <defaultValue>255</defaultValue>
                  </leafNode>
                  <leafNode name="tos">
                    <properties>
                      <help>Type of Service (TOS)</help>
                      <valueHelp>
                        <format>0-99</format>
                        <description>Type of Service (TOS)</description>
                      </valueHelp>
                      <constraint>
                        <validator name="numeric" argument="--range 0-99"/>
                      </constraint>
                      <constraintErrorMessage>TOS must be between 0 and 99</constraintErrorMessage>
                    </properties>
                    <defaultValue>inherit</defaultValue>
                  </leafNode>
                  <leafNode name="key">
                    <properties>
                      <help>Tunnel key</help>
                      <valueHelp>
                        <format>0-4294967295</format>
                        <description>Tunnel key</description>
                      </valueHelp>
                      <constraint>
                        <validator name="numeric" argument="--range 0-4294967295"/>
                      </constraint>
                      <constraintErrorMessage>key must be between 0-4294967295</constraintErrorMessage>
                    </properties>
                  </leafNode>
                </children>
              </node>
              <node name="ipv6">
                <properties>
                  <help>IPv6 specific tunnel parameters</help>
                </properties>
                <children>
                  <leafNode name="encaplimit">
                    <properties>
                      <help>Encaplimit field</help>
                      <valueHelp>
                        <format>0-255</format>
                        <description>Encaplimit (default 4)</description>
                      </valueHelp>
                      <constraint>
                        <validator name="numeric" argument="--range 0-255"/>
                      </constraint>
                      <constraintErrorMessage>key must be between 0-255</constraintErrorMessage>
                    </properties>
                    <defaultValue>4</defaultValue>
                  </leafNode>
                  <leafNode name="flowlabel">
                    <properties>
                      <help>Flowlabel</help>
                      <valueHelp>
                        <format>0x0-0x0FFFFF</format>
                        <description>Tunnel key, 'inherit' or hex value</description>
                      </valueHelp>
                      <constraint>
                        <regex>(0x){0,1}(0?[0-9A-Fa-f]{1,5})</regex>
                      </constraint>
                      <constraintErrorMessage>Must be 'inherit' or a number</constraintErrorMessage>
                    </properties>
                    <defaultValue>inherit</defaultValue>
                  </leafNode>
                  <leafNode name="hoplimit">
                    <properties>
                      <help>Hoplimit</help>
                      <valueHelp>
                        <format>0-255</format>
                        <description>Hoplimit (default 64)</description>
                      </valueHelp>
                      <constraint>
                        <validator name="numeric" argument="--range 0-255"/>
                      </constraint>
                      <constraintErrorMessage>hoplimit must be between 0-255</constraintErrorMessage>
                    </properties>
                    <defaultValue>64</defaultValue>
                  </leafNode>
                  <leafNode name="tclass">
                    <properties>
                      <help>Traffic class (Tclass)</help>
                      <valueHelp>
                        <format>0x0-0x0FFFFF</format>
                        <description>Traffic class, 'inherit' or hex value</description>
                      </valueHelp>
                      <constraint>
                        <regex>(0x){0,1}(0?[0-9A-Fa-f]{1,2})</regex>
                      </constraint>
                      <constraintErrorMessage>Must be 'inherit' or a number</constraintErrorMessage>
                    </properties>
                    <defaultValue>inherit</defaultValue>
                  </leafNode>
                </children>
              </node>
            </children>
          </node>
        </children>
      </tagNode>
    </children>
  </node>
</interfaceDefinition>