module openconfig-lldp {

  yang-version "1";

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

  prefix "oc-lldp";

  import openconfig-lldp-types { prefix oc-lldp-types; }
  import openconfig-interfaces { prefix oc-if; }
  import ietf-yang-types { prefix yang; }
  import openconfig-extensions { prefix oc-ext; }


  // meta
  organization "OpenConfig working group";

  contact
    "OpenConfig working group
    www.openconfig.net";

  description
    "This module defines configuration and operational state data
    for the LLDP protocol.";

  oc-ext:openconfig-version "0.1.0";

  revision "2016-05-16" {
    description
      "Initial public revision";
    reference "0.1.0";
  }


  // identity statements


  // grouping statements

  grouping lldp-common-counters {
    description
      "Definition of global and per-interface counters";

    leaf frame-in {
      type yang:counter64;
      description
        "The number of lldp frames received.";
    }

    leaf frame-out {
      type yang:counter64;
      description
        "The number of frames transmitted out.";
    }

    leaf frame-error-in {
      type yang:counter64;
      description
        "The number of LLDP frames received with errors.";
    }

    leaf frame-discard {
      type yang:counter64;
      description
        "The number of LLDP frames received and discarded.";
    }

    leaf tlv-discard {
      type yang:counter64;
      description
        "The number of TLV frames received and discarded.";
    }

    leaf tlv-unknown {
      type yang:counter64;
      description
        "The number of frames received with unknown TLV.";
    }

    leaf last-clear {
      type yang:date-and-time;
      description
        "Indicates the last time the counters were
        cleared.";
    }
  }

  grouping lldp-global-counters {
    description
      "Definition of global LLDP counters";

    uses lldp-common-counters;

    leaf tlv-accepted {
      type yang:counter64;
      description
        "The number of valid TLVs received.";
    }

    leaf entries-aged-out {
      type yang:counter64;
      description
        "The number of entries aged out due to timeout.";
    }

  }

  grouping lldp-interface-counters {
    description
      "Definition of per-interface LLDP counters";

      uses lldp-common-counters;

      leaf frame-error-out {
        type yang:counter64;
        description
          "The number of frame transmit errors on the
          interface.";
      }
  }

  grouping lldp-system-info-config {
    description
      "Configuration data for system-level local and remote
      LLDP information";

    leaf system-name {
      type string {
        length 0..255;
      }
      description
        "The system name field shall contain an alpha-numeric string
        that indicates the system's administratively assigned name.
        The system name should be the system's fully qualified domain
        name. If implementations support IETF RFC 3418, the sysName
        object should be used for this field.";
    }

    leaf system-description {
      type string {
        length 0..255;
      }
      description
        "The system description field shall contain an alpha-numeric
        string that is the textual description of the network entity.
        The system description should include the full name and
        version identification of the system's hardware type,
        software operating system, and networking software. If
        implementations support IETF RFC 3418, the sysDescr object
        should be used for this field.";
    }

    leaf chassis-id {
      type string;
      description
        "The Chassis ID is a mandatory TLV which identifies the
        chassis component of the endpoint identifier associated with
        the transmitting LLDP agent";
    }

    leaf chassis-id-type {
      type oc-lldp-types:chassis-id-type;
      description
        "This field identifies the format and source of the chassis
        identifier string. It is an enumerator defined by the
        LldpChassisIdSubtype object from IEEE 802.1AB MIB.";
    }
  }

  grouping lldp-system-info-state {
    description
      "Operational state data reported for the local and remote
      systems";

  }

  grouping lldp-neighbor-config {
    description
      "Configuration data for LLDP neighbors";

  }

  grouping lldp-neighbor-state {
    description
      "Operational state data for LLDP neighbors";

    leaf id {
      type string;
      description
        "System generated identifier for the neighbor on the
        interface.";
    }

    leaf age {
      type uint64;
      units "seconds";
      description
        "Age since discovery";
    }

    leaf last-update {
      type int64;
      description
        "Seconds since last update received.";
    }

    leaf port-id {
      type string;
      description
        "The Port ID is a mandatory TLV which identifies the port
        component of the endpoint identifier associated with the
        transmitting LLDP agent. If the specified port is an IEEE
        802.3 Repeater port, then this TLV is optional.";
    }

    leaf port-id-type {
      type oc-lldp-types:port-id-type;
      description
        "This field identifies the format and source of the port
        identifier string. It is an enumerator defined by the
        PtopoPortIdType object from RFC2922.";
    }

    leaf port-description {
      type string;
      description
        "The binary string containing the actual port identifier for
        the port which this LLDP PDU was transmitted. The source and
        format of this field is defined by PtopoPortId from
        RFC2922.";
    }

    leaf management-address {
      type string;
      description
        "The Management Address is a mandatory TLV which identifies a
        network address associated with the local LLDP agent, which
        can be used to reach the agent on the port identified in the
        Port ID TLV.";
    }

    leaf management-address-type {
      type string;
      description
        "The enumerated value for the network address type
        identified in this TLV. This enumeration is defined in the
        'Assigned Numbers' RFC [RFC3232] and the
        ianaAddressFamilyNumbers object.";
    }
  }

  grouping lldp-capabilities-config {
    description
      "Configuration data for LLDP capabilities";
  }

  grouping lldp-capabilities-state {
    description
      "Operational state data for LLDP capabilities";

    leaf name {
      type identityref {
        base oc-lldp-types:LLDP_SYSTEM_CAPABILITY;
      }
      description
        "Name of the system capability advertised by the neighbor.
        Capabilities are represented in a bitmap that defines the
        primary functions of the system. The capabilities are
        defined in IEEE 802.1AB.";
    }

    leaf enabled {
      type boolean;
      description
        "Indicates whether the corresponding system capability is
        enabled on the neighbor.";
      reference
        "Sec 8.5.8.2 of IEEE 802.1AB-2009";
    }
  }

  grouping lldp-capabilities-top {
    description
      "Top-level grouping for LLDP capabilities";

    container capabilities {
      config false;
      description
        "Enclosing container for list of LLDP capabilities";

      list capability {
        key "name";
        description
          "List of LLDP system capabilities advertised by the
          neighbor";

        leaf name {
          type leafref {
            path "../state/name";
          }
          description
            "Reference to capabilities list key";
        }

        container config {
          description
            "Configuration data for LLDP capabilities";

          uses lldp-capabilities-config;
        }

        container state {

          config false;

          description
            "Operational state data for LLDP capabilities";

          uses lldp-capabilities-config;
          uses lldp-capabilities-state;
        }
      }
    }
  }

  grouping lldp-custom-tlv-config {
    description
      "Configuration data for custom LLDP TLVs";
  }

  grouping lldp-custom-tlv-state {
    description
      "Operational state data for custom LLDP TLVs";

    leaf type {
      type int32;
      description
        "The integer value identifying the type of information
        contained in the value field.";
    }

    leaf oui {
      type string;
      description
        "The organizationally unique identifier field shall contain
        the organization's OUI as defined in Clause 9 of IEEE Std
        802. The high-order octet is 0 and the low-order 3 octets
        are the SMI Network Management Private Enterprise Code of
        the Vendor in network byte order, as defined in the
        'Assigned Numbers' RFC [RFC3232].";
    }

    leaf oui-subtype {
      type string;
      description
        "The organizationally defined subtype field shall contain a
        unique subtype value assigned by the defining organization.";
    }

    // TODO: consider making this string type
    leaf value {
      type binary;
      description
        "A variable-length octet-string containing the
        instance-specific information for this TLV.";
    }
  }

  grouping lldp-custom-tlv-top {
    description
      "Top-level grouping for custom LLDP TLVs";

    container custom-tlvs {
      config false;
      description
        "Enclosing container for list of custom TLVs from a
        neighbor";

      list tlv {
        key "type oui oui-subtype";
        description
          "List of custom LLDP TLVs from a neighbor";

        leaf type {
          type leafref {
            path "../state/type";
          }
          description
            "Reference to type list key";
        }

        leaf oui {
          type leafref {
            path "../state/oui";
          }
          description
            "Reference to oui list key";
        }

        leaf oui-subtype {
          type leafref {
            path "../state/oui-subtype";
          }
          description
            "Reference to oui-subtype list key";
        }

        container config {
          description
            "Configuration data ";

          uses lldp-custom-tlv-config;
        }

        container state {

          config false;

          description
            "Operational state data ";

          uses lldp-custom-tlv-config;
          uses lldp-custom-tlv-state;
        }
      }
    }
  }

  grouping lldp-neighbor-top {
    description
      "Top-level grouping for the LLDP neighbor list";

    container neighbors {
      config false;
      description
        "Enclosing container for list of LLDP neighbors on an
        interface";

      list neighbor {
        key "id";
        description
          "List of LLDP neighbors";

        leaf id {
          type leafref {
            path "../state/id";
          }
          description
            " ";
        }

        container config {
          description
            "Configuration data ";

          uses lldp-neighbor-config;
        }

        container state {

          config false;

          description
            "Operational state data ";

          uses lldp-system-info-config;
          uses lldp-system-info-state;
          uses lldp-neighbor-config;
          uses lldp-neighbor-state;
        }

        uses lldp-custom-tlv-top;
        uses lldp-capabilities-top;
      }
    }
  }

  grouping lldp-interface-config {
    description
      "Configuration data for LLDP on each interface";

    leaf name {
      type oc-if:base-interface-ref;
      description
        "Reference to the LLDP Ethernet interface";
    }

    leaf enabled {
      type boolean;
      default "true";
      description
        "Enable or disable the LLDP protocol on the interface.";
    }
  }

  grouping lldp-interface-state {
    description
      "Operational state data for LLDP on each interface";

    container counters {
      description
        "LLDP counters on each interface";

      uses lldp-interface-counters;
    }
  }

  grouping lldp-interface-top {
    description
      "Top-level grouping ";

    container interfaces {
      description
        "Enclosing container ";

      list interface {
        key "name";
        description
          "List of interfaces on which LLDP is enabled / available";

        leaf name {
          type leafref {
            path "../config/name";
          }
          description
            "Reference to the list key";
        }

        container config {
          description
            "Configuration data for LLDP on each interface";

          uses lldp-interface-config;
        }

        container state {

          config false;

          description
            "Operational state data ";

          uses lldp-interface-config;
          uses lldp-interface-state;
        }

        uses lldp-neighbor-top;
      }
    }
  }


  grouping lldp-config {
    description
      "Configuration data for global LLDP parameters";

    leaf enabled {
      type boolean;
      default "true";
      description
        "System level state of the LLDP protocol.";
    }

    leaf hello-timer {
      type uint64;
      units "seconds";
      description
        "System level hello timer for the LLDP protocol.";
    }

    leaf-list suppress-tlv-advertisement {
      type identityref {
        base oc-lldp-types:LLDP_TLV;
      }
      description
        "Indicates whether the local system should suppress the
        advertisement of particular TLVs with the LLDP PDUs that it
        transmits. Where a TLV type is specified within this list, it
        should not be included in any LLDP PDU transmitted by the
        local agent.";
    }
  }

  grouping lldp-state {
    description
      "Operational state data for global LLDP parameters";

    container counters {
      description
        "Global LLDP counters";

      uses lldp-global-counters;
    }
  }

  grouping lldp-top {
    description
      "Top-level grouping for LLDP model";

    container lldp {
      description
        "Top-level container for LLDP configuration and state data";

      container config {
        description
          "Configuration data ";

        uses lldp-config;
        uses lldp-system-info-config;
      }

      container state {

        config false;

        description
          "Operational state data ";

        uses lldp-config;
        uses lldp-system-info-config;
        uses lldp-system-info-state;
        uses lldp-state;
      }

      uses lldp-interface-top;
    }
  }

  // data definition statements

  uses lldp-top;


}
