<?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/interface/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>
          <leafNode name="mtu">
            <defaultValue>1476</defaultValue>
          </leafNode>
          #include <include/interface/ipv4-options.xml.i>
          #include <include/interface/ipv6-options.xml.i>
          #include <include/source-address-ipv4-ipv6.xml.i>
          #include <include/interface/tunnel-remote.xml.i>
          #include <include/source-interface.xml.i>
          #include <include/interface/interface-firewall.xml.i>
          #include <include/interface/interface-policy.xml.i>
          <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="encapsulation">
            <properties>
              <help>Encapsulation of this tunnel interface</help>
              <completionHelp>
                <list>erspan gre gretap ip6erspan ip6gre ip6gretap ip6ip6 ipip ipip6 sit</list>
              </completionHelp>
              <valueHelp>
                <format>erspan</format>
                <description>Encapsulated Remote Switched Port Analyzer</description>
              </valueHelp>
              <valueHelp>
                <format>gre</format>
                <description>Generic Routing Encapsulation (network layer)</description>
              </valueHelp>
              <valueHelp>
                <format>gretap</format>
                <description>Generic Routing Encapsulation (datalink layer)</description>
              </valueHelp>
              <valueHelp>
                <format>ip6erspan</format>
                <description>Encapsulated Remote Switched Port Analyzer over IPv6</description>
              </valueHelp>
              <valueHelp>
                <format>ip6gre</format>
                <description>GRE over IPv6 (network layer)</description>
              </valueHelp>
              <valueHelp>
                <format>ip6gretap</format>
                <description>GRE over IPv6 (datalink layer)</description>
              </valueHelp>
              <valueHelp>
                <format>ip6ip6</format>
                <description>IPv6 in IPv6 encapsulation</description>
              </valueHelp>
              <valueHelp>
                <format>ipip</format>
                <description>IPv4 in IPv4 encapsulation</description>
              </valueHelp>
              <valueHelp>
                <format>ipip6</format>
                <description>IPv4 in IP6 encapsulation</description>
              </valueHelp>
              <valueHelp>
                <format>sit</format>
                <description>Simple Internet Transition (IPv6 in IPv4)</description>
              </valueHelp>
              <constraint>
                <regex>^(erspan|gre|gretap|ip6erspan|ip6gre|ip6gretap|ip6ip6|ipip|ipip6|sit)$</regex>
              </constraint>
              <constraintErrorMessage>Invalid encapsulation, must be one of: erspan, gre, gretap, ip6erspan, ip6gre, ip6gretap, ipip, sit, ipip6 or ip6ip6</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="erspan">
                <properties>
                  <help>ERSPAN tunnel parameters</help>
                </properties>
                <children>
                  <leafNode name="direction">
                    <properties>
                      <help>Mirrored traffic direction</help>
                      <completionHelp>
                        <list>ingress egress</list>
                      </completionHelp>
                      <valueHelp>
                        <format>ingress</format>
                        <description>Mirror ingress traffic</description>
                      </valueHelp>
                      <valueHelp>
                        <format>egress</format>
                        <description>Mirror egress traffic</description>
                      </valueHelp>
                      <constraint>
                        <regex>^(ingress|egress)$</regex>
                      </constraint>
                    </properties>
                  </leafNode>
                  <leafNode name="hw-id">
                    <properties>
                      <help>Unique identifier of an ERSPAN engine within a system</help>
                      <valueHelp>
                        <format>u32:0-1048575</format>
                        <description>Unique identifier of an ERSPAN engine</description>
                      </valueHelp>
                      <constraint>
                        <validator name="numeric" argument="--range 0-1048575"/>
                      </constraint>
                    </properties>
                  </leafNode>
                  <leafNode name="index">
                    <properties>
                      <help>ERSPAN version 1 index field</help>
                      <valueHelp>
                        <format>u32:0-63</format>
                        <description>Platform-depedent field for specifying port number and direction</description>
                      </valueHelp>
                      <constraint>
                        <validator name="numeric" argument="--range 0-63"/>
                      </constraint>
                    </properties>
                  </leafNode>
                  <leafNode name="version">
                    <properties>
                      <help>Protocol version</help>
                      <completionHelp>
                        <list>1 2</list>
                      </completionHelp>
                      <valueHelp>
                        <format>1</format>
                        <description>ERSPAN Type II</description>
                      </valueHelp>
                      <valueHelp>
                        <format>2</format>
                        <description>ERSPAN Type III</description>
                      </valueHelp>
                      <constraint>
                        <validator name="numeric" argument="--range 1-2"/>
                      </constraint>
                    </properties>
                    <defaultValue>1</defaultValue>
                  </leafNode>
                </children>
              </node>
              <node name="ip">
                <properties>
                  <help>IPv4-specific tunnel parameters</help>
                </properties>
                <children>
                  <leafNode name="no-pmtu-discovery">
                    <properties>
                      <help>Disable path MTU discovery</help>
                      <valueless/>
                    </properties>
                  </leafNode>
                  <leafNode name="ignore-df">
                    <properties>
                      <help>Ignore the DF (don't fragment) bit</help>
                      <valueless/>
                    </properties>
                  </leafNode>
                  #include <include/interface/parameters-key.xml.i>
                  #include <include/interface/parameters-tos.xml.i>
                  #include <include/interface/parameters-ttl.xml.i>
                  <leafNode name="ttl">
                    <defaultValue>64</defaultValue>
                  </leafNode>
                </children>
              </node>
              <node name="ipv6">
                <properties>
                  <help>IPv6-specific tunnel parameters</help>
                </properties>
                <children>
                  <leafNode name="encaplimit">
                    <properties>
                      <help>Set fixed encapsulation limit</help>
                      <completionHelp>
                        <list>none</list>
                      </completionHelp>
                      <valueHelp>
                        <format>u32:0-255</format>
                        <description>Encapsulation limit (default: 4)</description>
                      </valueHelp>
                      <valueHelp>
                        <format>none</format>
                        <description>Disable encapsulation limit</description>
                      </valueHelp>
                      <constraint>
                        <regex>^(none)$</regex>
                        <validator name="numeric" argument="--range 0-255"/>
                      </constraint>
                      <constraintErrorMessage>Tunnel encaplimit must be 0-255 or none</constraintErrorMessage>
                    </properties>
                    <defaultValue>4</defaultValue>
                  </leafNode>
                  #include <include/interface/parameters-flowlabel.xml.i>
                  <leafNode name="hoplimit">
                    <properties>
                      <help>Hoplimit</help>
                      <valueHelp>
                        <format>u32:0-255</format>
                        <description>Hop limit (default: 64)</description>
                      </valueHelp>
                      <constraint>
                        <validator name="numeric" argument="--range 0-255"/>
                      </constraint>
                      <constraintErrorMessage>hop limit 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>