module openconfig-interfaces {

  yang-version "1";

  // namespace
  namespace "http://openconfig.net/yang/interfaces";

  prefix "oc-if";

  // import some basic types
  import ietf-interfaces { prefix ietf-if; }
  import openconfig-yang-types { prefix oc-yang; }
  import openconfig-types { prefix oc-types; }
  import openconfig-extensions { prefix oc-ext; }

  // meta
  organization "OpenConfig working group";

  contact
    "OpenConfig working group
    netopenconfig@googlegroups.com";

  description
    "Model for managing network interfaces and subinterfaces.  This
    module also defines convenience types / groupings for other
    models to create references to interfaces:

      base-interface-ref (type) -  reference to a base interface
      interface-ref (grouping) -  container for reference to a
        interface + subinterface
      interface-ref-state (grouping) - container for read-only
        (opstate) reference to interface + subinterface

    This model reuses data items defined in the IETF YANG model for
    interfaces described by RFC 7223 with an alternate structure
    (particularly for operational state data) and with
    additional configuration items.

    Portions of this code were derived from IETF RFC 7223.
    Please reproduce this note if possible.

    IETF code is subject to the following copyright and license:
    Copyright (c) IETF Trust and the persons identified as authors of
    the code.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, is permitted pursuant to, and subject to the license
    terms contained in, the Simplified BSD License set forth in
    Section 4.c of the IETF Trust's Legal Provisions Relating
    to IETF Documents (http://trustee.ietf.org/license-info).";

  oc-ext:openconfig-version "2.3.1";

  revision "2018-04-24" {
    description
      "Clarified behavior of last-change state leaf";
    reference "2.3.1";
  }

  revision "2018-01-05" {
    description
      "Add logical loopback to interface.";
    reference "2.3.0";
  }

  revision "2017-12-22" {
    description
      "Add IPv4 proxy ARP configuration.";
    reference "2.2.0";
  }

  revision "2017-12-21" {
    description
      "Added IPv6 router advertisement configuration.";
    reference "2.1.0";
  }

  revision "2017-07-14" {
    description
      "Added Ethernet/IP state data; Add dhcp-client;
      migrate to OpenConfig types modules; Removed or
      renamed opstate values";
    reference "2.0.0";
  }

  revision "2017-04-03" {
    description
      "Update copyright notice.";
    reference "1.1.1";
  }

  revision "2016-12-22" {
    description
      "Fixes to Ethernet interfaces model";
    reference "1.1.0";
  }


  // typedef statements

  typedef base-interface-ref {
    type leafref {
      path "/oc-if:interfaces/oc-if:interface/oc-if:name";
    }
    description
      "Reusable type for by-name reference to a base interface.
      This type may be used in cases where ability to reference
      a subinterface is not required.";
  }

  typedef interface-id {
    type string;
    description
      "User-defined identifier for an interface, generally used to
      name a interface reference.  The id can be arbitrary but a
      useful convention is to use a combination of base interface
      name and subinterface index.";
  }

  // grouping statements

  grouping interface-ref-common {
    description
      "Reference leafrefs to interface / subinterface";

    leaf interface {
      type leafref {
        path "/oc-if:interfaces/oc-if:interface/oc-if:name";
      }
      description
        "Reference to a base interface.  If a reference to a
        subinterface is required, this leaf must be specified
        to indicate the base interface.";
    }

    leaf subinterface {
      type leafref {
        path "/oc-if:interfaces/" +
          "oc-if:interface[oc-if:name=current()/../interface]/" +
          "oc-if:subinterfaces/oc-if:subinterface/oc-if:index";
      }
      description
        "Reference to a subinterface -- this requires the base
        interface to be specified using the interface leaf in
        this container.  If only a reference to a base interface
        is requuired, this leaf should not be set.";
    }
  }

  grouping interface-ref-state-container {
    description
      "Reusable opstate w/container for a reference to an
      interface or subinterface";

    container state {
      config false;
      description
        "Operational state for interface-ref";

      uses interface-ref-common;
    }
  }

  grouping interface-ref {
    description
      "Reusable definition for a reference to an interface or
      subinterface";

    container interface-ref {
      description
        "Reference to an interface or subinterface";

      container config {
        description
          "Configured reference to interface / subinterface";

        uses interface-ref-common;
      }

      uses interface-ref-state-container;
    }
  }

  grouping interface-ref-state {
    description
      "Reusable opstate w/container for a reference to an
      interface or subinterface";

    container interface-ref {
      description
        "Reference to an interface or subinterface";

      uses interface-ref-state-container;
    }
  }

  grouping base-interface-ref-state {
    description
      "Reusable opstate w/container for a reference to a
      base interface (no subinterface).";

      container state {
        config false;
        description
          "Operational state for base interface reference";

        leaf interface {
          type base-interface-ref;
          description
            "Reference to a base interface.";
        }
      }
  }


  grouping interface-common-config {
    description
      "Configuration data data nodes common to physical interfaces
      and subinterfaces";

    leaf description {
      type string;
      description
        "A textual description of the interface.

        A server implementation MAY map this leaf to the ifAlias
        MIB object.  Such an implementation needs to use some
        mechanism to handle the differences in size and characters
        allowed between this leaf and ifAlias.  The definition of
        such a mechanism is outside the scope of this document.

        Since ifAlias is defined to be stored in non-volatile
        storage, the MIB implementation MUST map ifAlias to the
        value of 'description' in the persistently stored
        datastore.

        Specifically, if the device supports ':startup', when
        ifAlias is read the device MUST return the value of
        'description' in the 'startup' datastore, and when it is
        written, it MUST be written to the 'running' and 'startup'
        datastores.  Note that it is up to the implementation to

        decide whether to modify this single leaf in 'startup' or
        perform an implicit copy-config from 'running' to
        'startup'.

        If the device does not support ':startup', ifAlias MUST
        be mapped to the 'description' leaf in the 'running'
        datastore.";
      reference
        "RFC 2863: The Interfaces Group MIB - ifAlias";
    }

    leaf enabled {
      type boolean;
      default "true";
      description
        "This leaf contains the configured, desired state of the
        interface.

        Systems that implement the IF-MIB use the value of this
        leaf in the 'running' datastore to set
        IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
        has been initialized, as described in RFC 2863.

        Changes in this leaf in the 'running' datastore are
        reflected in ifAdminStatus, but if ifAdminStatus is
        changed over SNMP, this leaf is not affected.";
      reference
        "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
    }

  }

  grouping interface-phys-config {
    description
      "Configuration data for physical interfaces";

    leaf name {
      type string;
      description
        "The name of the interface.

        A device MAY restrict the allowed values for this leaf,
        possibly depending on the type of the interface.
        For system-controlled interfaces, this leaf is the
        device-specific name of the interface.  The 'config false'
        list interfaces/interface[name]/state contains the currently
        existing interfaces on the device.

        If a client tries to create configuration for a
        system-controlled interface that is not present in the
        corresponding state list, the server MAY reject
        the request if the implementation does not support
        pre-provisioning of interfaces or if the name refers to
        an interface that can never exist in the system.  A
        NETCONF server MUST reply with an rpc-error with the
        error-tag 'invalid-value' in this case.

        The IETF model in RFC 7223 provides YANG features for the
        following (i.e., pre-provisioning and arbitrary-names),
        however they are omitted here:

          If the device supports pre-provisioning of interface
          configuration, the 'pre-provisioning' feature is
          advertised.

          If the device allows arbitrarily named user-controlled
          interfaces, the 'arbitrary-names' feature is advertised.

        When a configured user-controlled interface is created by
        the system, it is instantiated with the same name in the
        /interfaces/interface[name]/state list.";
    }

    leaf type {
      type identityref {
        base ietf-if:interface-type;
      }
      mandatory true;
      description
        "The type of the interface.

        When an interface entry is created, a server MAY
        initialize the type leaf with a valid value, e.g., if it
        is possible to derive the type from the name of the
        interface.

        If a client tries to set the type of an interface to a
        value that can never be used by the system, e.g., if the
        type is not supported or if the type does not match the
        name of the interface, the server MUST reject the request.
        A NETCONF server MUST reply with an rpc-error with the
        error-tag 'invalid-value' in this case.";
      reference
        "RFC 2863: The Interfaces Group MIB - ifType";
    }

    leaf mtu {
      type uint16;
      description
        "Set the max transmission unit size in octets
        for the physical interface.  If this is not set, the mtu is
        set to the operational default -- e.g., 1514 bytes on an
        Ethernet interface.";
    }

    leaf loopback-mode {
      type boolean;
      default false;
      description
        "When set to true, the interface is logically looped back,
        such that packets that are forwarded via the interface
        are received on the same interface.";
    }

    uses interface-common-config;
  }

  grouping interface-phys-holdtime-config {
    description
      "Configuration data for interface hold-time settings --
      applies to physical interfaces.";

    leaf up {
      type uint32;
      units milliseconds;
      default 0;
      description
        "Dampens advertisement when the interface
        transitions from down to up.  A zero value means dampening
        is turned off, i.e., immediate notification.";
    }

    leaf down {
      type uint32;
      units milliseconds;
      default 0;
      description
        "Dampens advertisement when the interface transitions from
        up to down.  A zero value means dampening is turned off,
        i.e., immediate notification.";
    }
  }

  grouping interface-phys-holdtime-state {
    description
      "Operational state data for interface hold-time.";
  }

  grouping interface-phys-holdtime-top {
    description
      "Top-level grouping for setting link transition
      dampening on physical and other types of interfaces.";

    container hold-time {
      description
        "Top-level container for hold-time settings to enable
        dampening advertisements of interface transitions.";

      container config {
        description
          "Configuration data for interface hold-time settings.";

        uses interface-phys-holdtime-config;
      }

      container state {

        config false;

        description
          "Operational state data for interface hold-time.";

        uses interface-phys-holdtime-config;
        uses interface-phys-holdtime-state;
      }
    }
  }

  grouping interface-common-state {
    description
      "Operational state data (in addition to intended configuration)
      at the global level for this interface";

    leaf ifindex {
      type uint32;
      description
        "System assigned number for each interface.  Corresponds to
        ifIndex object in SNMP Interface MIB";
      reference
        "RFC 2863 - The Interfaces Group MIB";
    }

    leaf admin-status {
      type enumeration {
        enum UP {
          description
            "Ready to pass packets.";
        }
        enum DOWN {
          description
            "Not ready to pass packets and not in some test mode.";
        }
        enum TESTING {
          //TODO: This is generally not supported as a configured
          //admin state, though it's in the standard interfaces MIB.
          //Consider removing it.
          description
            "In some test mode.";
        }
      }
      //TODO:consider converting to an identity to have the
      //flexibility to remove some values defined by RFC 7223 that
      //are not used or not implemented consistently.
      mandatory true;
      description
        "The desired state of the interface.  In RFC 7223 this leaf
        has the same read semantics as ifAdminStatus.  Here, it
        reflects the administrative state as set by enabling or
        disabling the interface.";
      reference
        "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
    }

    leaf oper-status {
      type enumeration {
        enum UP {
          value 1;
          description
            "Ready to pass packets.";
        }
        enum DOWN {
          value 2;
          description
            "The interface does not pass any packets.";
        }
        enum TESTING {
          value 3;
          description
            "In some test mode.  No operational packets can
             be passed.";
        }
        enum UNKNOWN {
          value 4;
          description
            "Status cannot be determined for some reason.";
        }
        enum DORMANT {
          value 5;
          description
            "Waiting for some external event.";
        }
        enum NOT_PRESENT {
          value 6;
          description
            "Some component (typically hardware) is missing.";
        }
        enum LOWER_LAYER_DOWN {
          value 7;
          description
            "Down due to state of lower-layer interface(s).";
        }
      }
      //TODO:consider converting to an identity to have the
      //flexibility to remove some values defined by RFC 7223 that
      //are not used or not implemented consistently.
      mandatory true;
      description
        "The current operational state of the interface.

         This leaf has the same semantics as ifOperStatus.";
      reference
        "RFC 2863: The Interfaces Group MIB - ifOperStatus";
    }

    leaf last-change {
      type oc-types:timeticks64;
      units nanoseconds;
      description
        "This timestamp indicates the absolute time of the last
        state change of the interface (e.g., up-to-down transition).
        This is different than the SNMP ifLastChange object in the
        standard interface MIB in that it is not relative to the
        system boot time (i.e,. sysUpTime).

        The value is the timestamp in nanoseconds relative to
        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
    }

  }


  grouping interface-counters-state {
    description
      "Operational state representing interface counters
      and statistics.";

      //TODO: we may need to break this list of counters into those
      //that would appear for physical vs. subinterface or logical
      //interfaces.  For now, just replicating the full stats
      //grouping to both interface and subinterface.

    container counters {
      description
        "A collection of interface-related statistics objects.";

      leaf in-octets {
        type oc-yang:counter64;
        description
          "The total number of octets received on the interface,
          including framing characters.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
      }

      leaf in-unicast-pkts {
        type oc-yang:counter64;
        description
          "The number of packets, delivered by this sub-layer to a
          higher (sub-)layer, that were not addressed to a
          multicast or broadcast address at this sub-layer.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
      }

      leaf in-broadcast-pkts {
        type oc-yang:counter64;
        description
          "The number of packets, delivered by this sub-layer to a
          higher (sub-)layer, that were addressed to a broadcast
          address at this sub-layer.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB -
                     ifHCInBroadcastPkts";
      }

      leaf in-multicast-pkts {
        type oc-yang:counter64;
        description
          "The number of packets, delivered by this sub-layer to a
          higher (sub-)layer, that were addressed to a multicast
          address at this sub-layer.  For a MAC-layer protocol,
          this includes both Group and Functional addresses.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB -
                     ifHCInMulticastPkts";
      }

      leaf in-discards {
        type oc-yang:counter64;
        description
          "The number of inbound packets that were chosen to be
          discarded even though no errors had been detected to
          prevent their being deliverable to a higher-layer
          protocol.  One possible reason for discarding such a
          packet could be to free up buffer space.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";


        reference
          "RFC 2863: The Interfaces Group MIB - ifInDiscards";
      }

      leaf in-errors {
        type oc-yang:counter64;
        description
          "For packet-oriented interfaces, the number of inbound
          packets that contained errors preventing them from being
          deliverable to a higher-layer protocol.  For character-
          oriented or fixed-length interfaces, the number of
          inbound transmission units that contained errors
          preventing them from being deliverable to a higher-layer
          protocol.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB - ifInErrors";
      }

      leaf in-unknown-protos {
        type oc-yang:counter64;
        description
          "For packet-oriented interfaces, the number of packets
          received via the interface that were discarded because
          of an unknown or unsupported protocol.  For
          character-oriented or fixed-length interfaces that
          support protocol multiplexing, the number of
          transmission units received via the interface that were
          discarded because of an unknown or unsupported protocol.
          For any interface that does not support protocol
          multiplexing, this counter is not present.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
      }

      leaf in-fcs-errors {
        type oc-yang:counter64;
        description
          "Number of received packets which had errors in the
          frame check sequence (FCS), i.e., framing errors.

          Discontinuities in the value of this counter can occur
          when the device is re-initialization as indicated by the
          value of 'last-clear'.";
      }

      leaf out-octets {
        type oc-yang:counter64;
        description
          "The total number of octets transmitted out of the
          interface, including framing characters.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
      }

      leaf out-unicast-pkts {
        type oc-yang:counter64;
        description
          "The total number of packets that higher-level protocols
          requested be transmitted, and that were not addressed
          to a multicast or broadcast address at this sub-layer,
          including those that were discarded or not sent.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
      }

      leaf out-broadcast-pkts {
        type oc-yang:counter64;
        description
          "The total number of packets that higher-level protocols
          requested be transmitted, and that were addressed to a
          broadcast address at this sub-layer, including those
          that were discarded or not sent.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB -
                     ifHCOutBroadcastPkts";
      }


      leaf out-multicast-pkts {
        type oc-yang:counter64;
        description
          "The total number of packets that higher-level protocols
          requested be transmitted, and that were addressed to a
          multicast address at this sub-layer, including those
          that were discarded or not sent.  For a MAC-layer
          protocol, this includes both Group and Functional
          addresses.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB -
                     ifHCOutMulticastPkts";
      }

      leaf out-discards {
        type oc-yang:counter64;
        description
          "The number of outbound packets that were chosen to be
          discarded even though no errors had been detected to
          prevent their being transmitted.  One possible reason
          for discarding such a packet could be to free up buffer
          space.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
      }

      leaf out-errors {
        type oc-yang:counter64;
        description
          "For packet-oriented interfaces, the number of outbound
          packets that could not be transmitted because of errors.
          For character-oriented or fixed-length interfaces, the
          number of outbound transmission units that could not be
          transmitted because of errors.

          Discontinuities in the value of this counter can occur
          at re-initialization of the management system, and at
          other times as indicated by the value of
          'last-clear'.";
        reference
          "RFC 2863: The Interfaces Group MIB - ifOutErrors";
      }

      leaf carrier-transitions {
        type oc-yang:counter64;
        description
          "Number of times the interface state has transitioned
          between up and down since the time the device restarted
          or the last-clear time, whichever is most recent.";
      }

      leaf last-clear {
        type oc-types:timeticks64;
        units nanoseconds;
        description
          "Timestamp of the last time the interface counters were
          cleared.

          The value is the timestamp in nanoseconds relative to
          the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
      }
    }
  }

  // data definition statements

  grouping sub-unnumbered-config {
    description
      "Configuration data for unnumbered subinterfaces";

    leaf enabled {
      type boolean;
      default false;
      description
        "Indicates that the subinterface is unnumbered.  By default
        the subinterface is numbered, i.e., expected to have an
        IP address configuration.";
    }
  }

  grouping sub-unnumbered-state {
    description
      "Operational state data unnumbered subinterfaces";
  }

  grouping sub-unnumbered-top {
    description
      "Top-level grouping unnumbered subinterfaces";

    container unnumbered {
      description
        "Top-level container for setting unnumbered interfaces.
        Includes reference the interface that provides the
        address information";

      container config {
        description
          "Configuration data for unnumbered interface";

        uses sub-unnumbered-config;
      }

      container state {

        config false;

        description
          "Operational state data for unnumbered interfaces";

        uses sub-unnumbered-config;
        uses sub-unnumbered-state;
      }

      uses oc-if:interface-ref;
    }
  }

  grouping subinterfaces-config {
    description
      "Configuration data for subinterfaces";

    leaf index {
      type uint32;
      default 0;
      description
        "The index of the subinterface, or logical interface number.
        On systems with no support for subinterfaces, or not using
        subinterfaces, this value should default to 0, i.e., the
        default subinterface.";
    }

    uses interface-common-config;

  }

  grouping subinterfaces-state {
    description
      "Operational state data for subinterfaces";

    leaf name {
      type string;
      description
        "The system-assigned name for the sub-interface.  This MAY
        be a combination of the base interface name and the
        subinterface index, or some other convention used by the
        system.";
    }

    uses interface-common-state;
    uses interface-counters-state;
  }

  grouping subinterfaces-top {
    description
      "Subinterface data for logical interfaces associated with a
      given interface";

    container subinterfaces {
      description
        "Enclosing container for the list of subinterfaces associated
        with a physical interface";

      list subinterface {
        key "index";

        description
          "The list of subinterfaces (logical interfaces) associated
          with a physical interface";

        leaf index {
          type leafref {
            path "../config/index";
          }
          description
            "The index number of the subinterface -- used to address
            the logical interface";
        }

        container config {
          description
            "Configurable items at the subinterface level";

          uses subinterfaces-config;
        }

        container state {

          config false;
          description
            "Operational state data for logical interfaces";

          uses subinterfaces-config;
          uses subinterfaces-state;
        }
      }
    }
  }

  grouping interfaces-top {
    description
      "Top-level grouping for interface configuration and
      operational state data";

    container interfaces {
      description
        "Top level container for interfaces, including configuration
        and state data.";


      list interface {
        key "name";

        description
          "The list of named interfaces on the device.";

        leaf name {
          type leafref {
            path "../config/name";
          }
          description
            "References the configured name of the interface";
            //TODO: need to consider whether this should actually
            //reference the name in the state subtree, which
            //presumably would be the system-assigned name, or the
            //configured name.  Points to the config/name now
            //because of YANG 1.0 limitation that the list
            //key must have the same "config" as the list, and
            //also can't point to a non-config node.
        }

        container config {
          description
            "Configurable items at the global, physical interface
            level";

          uses interface-phys-config;
        }

        container state {

          config false;
          description
            "Operational state data at the global interface level";

          uses interface-phys-config;
          uses interface-common-state;
          uses interface-counters-state;
        }

        uses interface-phys-holdtime-top;
        uses subinterfaces-top;
      }
    }
  }

  uses interfaces-top;


}
