Adding OpenConfig YANG models.

Change-Id: I0a2fdd5826e80933cf4b9ae939ff3051acec02aa
diff --git a/models/openconfig/src/main/yang/lldp/openconfig-lldp.yang b/models/openconfig/src/main/yang/lldp/openconfig-lldp.yang
new file mode 100644
index 0000000..9c1d87c
--- /dev/null
+++ b/models/openconfig/src/main/yang/lldp/openconfig-lldp.yang
@@ -0,0 +1,635 @@
+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;
+
+
+}