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.0.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.";
    }

    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 time of the last state change
        of the interface (e.g., up-to-down transition). This
        corresponds to the ifLastChange object in the standard
        interface MIB.

        The value is the timestamp in nanoseconds relative to
        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
      reference
        "RFC 2863: The Interfaces Group MIB - ifLastChange";
    }

  }


  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;


}
