module ietf-interfaces {

     namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces";
     prefix if;

     import ietf-yang-types {
       prefix yang;
     }

     organization
       "IETF NETMOD (NETCONF Data Modeling Language) Working Group";

     contact
       "WG Web:   <http://tools.ietf.org/wg/netmod/>
        WG List:  <mailto:netmod@ietf.org>

        WG Chair: Thomas Nadeau
                  <mailto:tnadeau@lucidvision.com>

        WG Chair: Juergen Schoenwaelder
                  <mailto:j.schoenwaelder@jacobs-university.de>

        Editor:   Martin Bjorklund
                  <mailto:mbj@tail-f.com>";

     description
       "This module contains a collection of YANG definitions for
        managing network interfaces.

        Copyright (c) 2014 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).

        This version of this YANG module is part of RFC 7223; see
        the RFC itself for full legal notices.";
     revision 2014-05-08 {
       description
         "Initial revision.";
       reference
         "RFC 7223: A YANG Data Model for Interface Management";
     }

     /*
      * Typedefs
      */

     typedef interface-ref {
       type leafref {
         path "/if:devices/if:device/if:interfaces/if:interface/if:name";
       }
       description
         "This type is used by data models that need to reference
          configured interfaces.";
     }

     typedef interface-state-ref {
       type leafref {
         path "/if:devices/if:device/if:interfaces-state/if:interface/if:name";
       }
       description
         "This type is used by data models that need to reference
          the operationally present interfaces.";
     }

     /*
      * Identities
      */

     identity interface-type {
       description
         "Base identity from which specific interface types are
          derived.";
     }

     /*
      * Features
      */

     feature arbitrary-names {
       description
         "This feature indicates that the device allows user-controlled
          interfaces to be named arbitrarily.";
     }
     feature pre-provisioning {
       description
         "This feature indicates that the device supports
          pre-provisioning of interface configuration, i.e., it is
          possible to configure an interface whose physical interface
          hardware is not present on the device.";
     }

     feature if-mib {
       description
         "This feature indicates that the device implements
          the IF-MIB.";
       reference
         "RFC 2863: The Interfaces Group MIB";
     }

     /*
      * Configuration data nodes
      */
     container devices {
         list device {
             key deviceid;
             leaf deviceid {
                 type string;
             }
             container interfaces {
                 description
                     "Interface configuration parameters.";

                 list interface {
                     key "name";

                     description
                         "The list of configured interfaces on the device.
                         The operational state of an interface is available
                         in the /interfaces-state/interface list.  If the
                         configuration of a system-controlled interface
                         cannot be used by the system (e.g., the interface
                         hardware present does not match the interface type),
                         then the configuration is not applied to the
                         system-controlled interface shown in the of a
                         /interfaces-state/interface list.  If the configuration
                         user-controlled interface cannot be used by the system,
                         the configured interface is not instantiated in the
                         /interfaces-state/interface list.";

                     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-state/interface 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 /interfaces-state/interface 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.

                             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 /interface-state/interface
                             list.";
                     }

                     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 touse some mechanism to handle the
                             differences in sizeand 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 type {
                         type identityref {
                             base 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 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";
                     }

                     leaf link-up-down-trap-enable {
                         if-feature if-mib;
                         type enumeration {
                             enum enabled {
                                 value 1;
                             }
                             enum disabled {
                                 value 2;
                             }
                         }
                         description
                             "Controls whether linkUp/linkDown SNMP
                             notifications should be generated for this
                             interface.

                             If this node is not configured, the value 'enabled'
                             is operationally used by the server for
                             interfaces that do not operate on top of any
                             other interface (i.e., there are no
                             'lower-layer-if' entries), and 'disabled'
                             otherwise.";
                         reference
                             "RFC 2863: The Interfaces Group MIB -
                             ifLinkUpDownTrapEnable";
                     }
                 }
             }
             /*
              * Operational state data nodes
              */

             container interfaces-state {
               config false;
               description
                 "Data nodes for the operational state of interfaces.";

               list interface {
                 key "name";
                 description
                   "The list of interfaces on the device.

                    System-controlled interfaces created by the system are
                    always present in this list, whether they are configured or
                    not.";

                 leaf name {
                   type string;
                   description
                     "The name of the interface.

                      A server implementation MAY map this leaf to the ifName
                      MIB object.  Such an implementation needs to use some
                      mechanism to handle the differences in size and characters
                      allowed between this leaf and ifName.  The definition of
                      such a mechanism is outside the scope of this document.";
                   reference
                     "RFC 2863: The Interfaces Group MIB - ifName";
                 }

                 leaf type {
                   type identityref {
                     base interface-type;
                   }
                   mandatory true;
                   description
                     "The type of the interface.";
                   reference
                     "RFC 2863: The Interfaces Group MIB - ifType";
                 }

                 leaf admin-status {
                   if-feature if-mib;
                   type enumeration {
                     enum up {
                       value 1;
                       description
                         "Ready to pass packets.";
                     }
                     enum down {
                       value 2;
                       description
                         "Not ready to pass packets and not in some test mode.";
                     }
                     enum testing {
                       value 3;
                       description
                         "In some test mode.";
                     }
                   }
                   mandatory true;
                   description
                     "The desired state of the interface.

                      This leaf has the same read semantics as ifAdminStatus.";
                   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).";
                     }
                   }
                   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 yang:date-and-time;
                   description
                     "The time the interface entered its current operational
                      state.  If the current state was entered prior to the
                      last re-initialization of the local network management
                      subsystem, then this node is not present.";
                   reference
                     "RFC 2863: The Interfaces Group MIB - ifLastChange";
                 }

                 leaf if-index {
                   if-feature if-mib;
                   type int32 {
                     range "1..2147483647";
                   }
                   mandatory true;
                   description
                     "The ifIndex value for the ifEntry represented by this
                      interface.";
                   reference
                     "RFC 2863: The Interfaces Group MIB - ifIndex";
                 }

                 leaf phys-address {
                   type yang:phys-address;
                   description
                     "The interface's address at its protocol sub-layer.  For
                      example, for an 802.x interface, this object normally
                      contains a Media Access Control (MAC) address.  The
                      interface's media-specific modules must define the bit

                      and byte ordering and the format of the value of this
                      object.  For interfaces that do not have such an address
                      (e.g., a serial line), this node is not present.";
                   reference
                     "RFC 2863: The Interfaces Group MIB - ifPhysAddress";
                 }

                 leaf-list higher-layer-if {
                   type interface-state-ref;
                   description
                     "A list of references to interfaces layered on top of this
                      interface.";
                   reference
                     "RFC 2863: The Interfaces Group MIB - ifStackTable";
                 }

                 leaf-list lower-layer-if {
                   type interface-state-ref;
                   description
                     "A list of references to interfaces layered underneath this
                      interface.";
                   reference
                     "RFC 2863: The Interfaces Group MIB - ifStackTable";
                 }

                 leaf speed {
                   type yang:gauge64;
                   units "bits/second";
                   description
                       "An estimate of the interface's current bandwidth in bits
                        per second.  For interfaces that do not vary in
                        bandwidth or for those where no accurate estimation can
                        be made, this node should contain the nominal bandwidth.
                        For interfaces that have no concept of bandwidth, this
                        node is not present.";
                   reference
                     "RFC 2863: The Interfaces Group MIB -
                                ifSpeed, ifHighSpeed";
                 }
                 container statistics {
                   description
                     "A collection of interface-related statistics objects.";

                   leaf discontinuity-time {
                     type yang:date-and-time;
                     mandatory true;
                     description
                       "The time on the most recent occasion at which any one or
                        more of this interface's counters suffered a
                        discontinuity.  If no such discontinuities have occurred
                        since the last re-initialization of the local management
                        subsystem, then this node contains the time the local
                        management subsystem re-initialized itself.";
                   }

                   leaf in-octets {
                     type 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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
                   }

                   leaf in-unicast-pkts {
                     type 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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
                   }
                   leaf in-broadcast-pkts {
                     type 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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB -
                                  ifHCInBroadcastPkts";
                   }

                   leaf in-multicast-pkts {
                     type 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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB -
                                  ifHCInMulticastPkts";
                   }

                   leaf in-discards {
                     type yang:counter32;
                     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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB - ifInDiscards";
                   }

                   leaf in-errors {
                     type yang:counter32;
                     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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB - ifInErrors";
                   }

                   leaf in-unknown-protos {
                     type yang:counter32;
                     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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
                   }
                   leaf out-octets {
                     type 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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
                   }

                   leaf out-unicast-pkts {
                     type 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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
                   }

                   leaf out-broadcast-pkts {
                     type 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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB -
                                  ifHCOutBroadcastPkts";
                   }
                   leaf out-multicast-pkts {
                     type 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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB -
                                  ifHCOutMulticastPkts";
                   }

                   leaf out-discards {
                     type yang:counter32;
                     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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
                   }

                   leaf out-errors {
                     type yang:counter32;
                     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
                        'discontinuity-time'.";
                     reference
                       "RFC 2863: The Interfaces Group MIB - ifOutErrors";
                   }
                 }
               }
             }
         }
     }
   }