aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/yang/openconfig
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/yang/openconfig')
-rw-r--r--src/plugins/yang/openconfig/ietf-interfaces.yang1123
-rw-r--r--src/plugins/yang/openconfig/openconfig-aaa-radius.yang180
-rw-r--r--src/plugins/yang/openconfig/openconfig-aaa-tacacs.yang136
-rw-r--r--src/plugins/yang/openconfig/openconfig-aaa-types.yang162
-rw-r--r--src/plugins/yang/openconfig/openconfig-aaa.yang811
-rw-r--r--src/plugins/yang/openconfig/openconfig-access-points.yang168
-rw-r--r--src/plugins/yang/openconfig/openconfig-acl.yang837
-rw-r--r--src/plugins/yang/openconfig/openconfig-aft-common.yang385
-rw-r--r--src/plugins/yang/openconfig/openconfig-aft-ethernet.yang93
-rw-r--r--src/plugins/yang/openconfig/openconfig-aft-ipv4.yang94
-rw-r--r--src/plugins/yang/openconfig/openconfig-aft-ipv6.yang94
-rw-r--r--src/plugins/yang/openconfig/openconfig-aft-mpls.yang111
-rw-r--r--src/plugins/yang/openconfig/openconfig-aft-network-instance.yang98
-rw-r--r--src/plugins/yang/openconfig/openconfig-aft-pf.yang172
-rw-r--r--src/plugins/yang/openconfig/openconfig-aft-types.yang58
-rw-r--r--src/plugins/yang/openconfig/openconfig-aft.yang144
-rw-r--r--src/plugins/yang/openconfig/openconfig-alarm-types.yang139
-rw-r--r--src/plugins/yang/openconfig/openconfig-alarms.yang221
-rw-r--r--src/plugins/yang/openconfig/openconfig-ap-manager.yang220
-rw-r--r--src/plugins/yang/openconfig/openconfig-bfd.yang738
-rw-r--r--src/plugins/yang/openconfig/openconfig-bgp-common-multiprotocol.yang518
-rw-r--r--src/plugins/yang/openconfig/openconfig-bgp-common-structure.yang196
-rw-r--r--src/plugins/yang/openconfig/openconfig-bgp-common.yang665
-rw-r--r--src/plugins/yang/openconfig/openconfig-bgp-errors.yang421
-rw-r--r--src/plugins/yang/openconfig/openconfig-bgp-global.yang389
-rw-r--r--src/plugins/yang/openconfig/openconfig-bgp-neighbor.yang704
-rw-r--r--src/plugins/yang/openconfig/openconfig-bgp-peer-group.yang271
-rw-r--r--src/plugins/yang/openconfig/openconfig-bgp-policy.yang1210
-rw-r--r--src/plugins/yang/openconfig/openconfig-bgp-types.yang604
-rw-r--r--src/plugins/yang/openconfig/openconfig-bgp.yang155
-rw-r--r--src/plugins/yang/openconfig/openconfig-catalog-types.yang242
-rw-r--r--src/plugins/yang/openconfig/openconfig-channel-monitor.yang330
-rw-r--r--src/plugins/yang/openconfig/openconfig-extensions.yang91
-rw-r--r--src/plugins/yang/openconfig/openconfig-if-aggregate.yang223
-rw-r--r--src/plugins/yang/openconfig/openconfig-if-ethernet-ext.yang106
-rw-r--r--src/plugins/yang/openconfig/openconfig-if-ethernet.yang428
-rw-r--r--src/plugins/yang/openconfig/openconfig-if-ip-ext.yang169
-rw-r--r--src/plugins/yang/openconfig/openconfig-if-ip.yang1312
-rw-r--r--src/plugins/yang/openconfig/openconfig-if-poe.yang99
-rw-r--r--src/plugins/yang/openconfig/openconfig-if-tunnel.yang109
-rw-r--r--src/plugins/yang/openconfig/openconfig-if-types.yang98
-rw-r--r--src/plugins/yang/openconfig/openconfig-igmp-types.yang53
-rw-r--r--src/plugins/yang/openconfig/openconfig-igmp.yang356
-rw-r--r--src/plugins/yang/openconfig/openconfig-inet-types.yang332
-rw-r--r--src/plugins/yang/openconfig/openconfig-interfaces.yang1040
-rw-r--r--src/plugins/yang/openconfig/openconfig-isis-lsdb-types.yang686
-rw-r--r--src/plugins/yang/openconfig/openconfig-isis-lsp.yang3592
-rw-r--r--src/plugins/yang/openconfig/openconfig-isis-policy.yang189
-rw-r--r--src/plugins/yang/openconfig/openconfig-isis-routing.yang384
-rw-r--r--src/plugins/yang/openconfig/openconfig-isis-types.yang339
-rw-r--r--src/plugins/yang/openconfig/openconfig-isis.yang2059
-rw-r--r--src/plugins/yang/openconfig/openconfig-lacp.yang461
-rw-r--r--src/plugins/yang/openconfig/openconfig-lldp-types.yang296
-rw-r--r--src/plugins/yang/openconfig/openconfig-lldp.yang650
-rw-r--r--src/plugins/yang/openconfig/openconfig-local-routing.yang408
-rw-r--r--src/plugins/yang/openconfig/openconfig-module-catalog.yang786
-rw-r--r--src/plugins/yang/openconfig/openconfig-mpls-igp.yang129
-rw-r--r--src/plugins/yang/openconfig/openconfig-mpls-ldp.yang873
-rw-r--r--src/plugins/yang/openconfig/openconfig-mpls-rsvp.yang1446
-rw-r--r--src/plugins/yang/openconfig/openconfig-mpls-sr.yang138
-rw-r--r--src/plugins/yang/openconfig/openconfig-mpls-static.yang312
-rw-r--r--src/plugins/yang/openconfig/openconfig-mpls-te.yang1381
-rw-r--r--src/plugins/yang/openconfig/openconfig-mpls-types.yang426
-rw-r--r--src/plugins/yang/openconfig/openconfig-mpls.yang746
-rw-r--r--src/plugins/yang/openconfig/openconfig-network-instance-l2.yang339
-rw-r--r--src/plugins/yang/openconfig/openconfig-network-instance-l3.yang234
-rw-r--r--src/plugins/yang/openconfig/openconfig-network-instance-policy.yang115
-rw-r--r--src/plugins/yang/openconfig/openconfig-network-instance-types.yang261
-rw-r--r--src/plugins/yang/openconfig/openconfig-network-instance.yang1093
-rw-r--r--src/plugins/yang/openconfig/openconfig-openflow-types.yang93
-rw-r--r--src/plugins/yang/openconfig/openconfig-openflow.yang314
-rw-r--r--src/plugins/yang/openconfig/openconfig-optical-amplifier.yang474
-rw-r--r--src/plugins/yang/openconfig/openconfig-ospf-policy.yang188
-rw-r--r--src/plugins/yang/openconfig/openconfig-ospf-types.yang784
-rw-r--r--src/plugins/yang/openconfig/openconfig-ospfv2-area-interface.yang472
-rw-r--r--src/plugins/yang/openconfig/openconfig-ospfv2-area.yang169
-rw-r--r--src/plugins/yang/openconfig/openconfig-ospfv2-common.yang91
-rw-r--r--src/plugins/yang/openconfig/openconfig-ospfv2-global.yang509
-rw-r--r--src/plugins/yang/openconfig/openconfig-ospfv2-lsdb.yang2355
-rw-r--r--src/plugins/yang/openconfig/openconfig-ospfv2.yang98
-rw-r--r--src/plugins/yang/openconfig/openconfig-packet-match-types.yang297
-rw-r--r--src/plugins/yang/openconfig/openconfig-packet-match.yang360
-rw-r--r--src/plugins/yang/openconfig/openconfig-pf-forwarding-policies.yang385
-rw-r--r--src/plugins/yang/openconfig/openconfig-pf-interfaces.yang121
-rw-r--r--src/plugins/yang/openconfig/openconfig-pf-path-groups.yang125
-rw-r--r--src/plugins/yang/openconfig/openconfig-pf-srte.yang280
-rw-r--r--src/plugins/yang/openconfig/openconfig-pim-types.yang74
-rw-r--r--src/plugins/yang/openconfig/openconfig-pim.yang464
-rw-r--r--src/plugins/yang/openconfig/openconfig-platform-cpu.yang61
-rw-r--r--src/plugins/yang/openconfig/openconfig-platform-ext.yang72
-rw-r--r--src/plugins/yang/openconfig/openconfig-platform-fan.yang65
-rw-r--r--src/plugins/yang/openconfig/openconfig-platform-linecard.yang118
-rw-r--r--src/plugins/yang/openconfig/openconfig-platform-port.yang149
-rw-r--r--src/plugins/yang/openconfig/openconfig-platform-psu.yang135
-rw-r--r--src/plugins/yang/openconfig/openconfig-platform-transceiver.yang492
-rw-r--r--src/plugins/yang/openconfig/openconfig-platform-types.yang271
-rw-r--r--src/plugins/yang/openconfig/openconfig-platform.yang762
-rw-r--r--src/plugins/yang/openconfig/openconfig-policy-forwarding.yang119
-rw-r--r--src/plugins/yang/openconfig/openconfig-policy-types.yang220
-rw-r--r--src/plugins/yang/openconfig/openconfig-probes-types.yang75
-rw-r--r--src/plugins/yang/openconfig/openconfig-probes.yang569
-rw-r--r--src/plugins/yang/openconfig/openconfig-procmon.yang165
-rw-r--r--src/plugins/yang/openconfig/openconfig-qos-elements.yang1304
-rw-r--r--src/plugins/yang/openconfig/openconfig-qos-interfaces.yang660
-rw-r--r--src/plugins/yang/openconfig/openconfig-qos-types.yang148
-rw-r--r--src/plugins/yang/openconfig/openconfig-qos.yang90
-rw-r--r--src/plugins/yang/openconfig/openconfig-relay-agent.yang815
-rw-r--r--src/plugins/yang/openconfig/openconfig-rib-bgp-attributes.yang907
-rw-r--r--src/plugins/yang/openconfig/openconfig-rib-bgp-ext.yang166
-rw-r--r--src/plugins/yang/openconfig/openconfig-rib-bgp-shared-attributes.yang171
-rw-r--r--src/plugins/yang/openconfig/openconfig-rib-bgp-table-attributes.yang113
-rw-r--r--src/plugins/yang/openconfig/openconfig-rib-bgp-tables.yang883
-rw-r--r--src/plugins/yang/openconfig/openconfig-rib-bgp-types.yang244
-rw-r--r--src/plugins/yang/openconfig/openconfig-rib-bgp.yang209
-rw-r--r--src/plugins/yang/openconfig/openconfig-routing-policy.yang1097
-rw-r--r--src/plugins/yang/openconfig/openconfig-rsvp-sr-ext.yang400
-rw-r--r--src/plugins/yang/openconfig/openconfig-segment-routing.yang780
-rw-r--r--src/plugins/yang/openconfig/openconfig-spanning-tree-types.yang225
-rw-r--r--src/plugins/yang/openconfig/openconfig-spanning-tree.yang823
-rw-r--r--src/plugins/yang/openconfig/openconfig-system-logging.yang492
-rw-r--r--src/plugins/yang/openconfig/openconfig-system-management.yang126
-rw-r--r--src/plugins/yang/openconfig/openconfig-system-terminal.yang239
-rw-r--r--src/plugins/yang/openconfig/openconfig-system.yang978
-rw-r--r--src/plugins/yang/openconfig/openconfig-telemetry-types.yang115
-rw-r--r--src/plugins/yang/openconfig/openconfig-telemetry.yang771
-rw-r--r--src/plugins/yang/openconfig/openconfig-terminal-device.yang1370
-rw-r--r--src/plugins/yang/openconfig/openconfig-transport-line-common.yang317
-rw-r--r--src/plugins/yang/openconfig/openconfig-transport-line-protection.yang612
-rw-r--r--src/plugins/yang/openconfig/openconfig-transport-types.yang834
-rw-r--r--src/plugins/yang/openconfig/openconfig-types.yang455
-rw-r--r--src/plugins/yang/openconfig/openconfig-vlan-types.yang195
-rw-r--r--src/plugins/yang/openconfig/openconfig-vlan.yang438
-rw-r--r--src/plugins/yang/openconfig/openconfig-wavelength-router.yang360
-rw-r--r--src/plugins/yang/openconfig/openconfig-wifi-mac.yang1482
-rw-r--r--src/plugins/yang/openconfig/openconfig-wifi-phy.yang393
-rw-r--r--src/plugins/yang/openconfig/openconfig-wifi-types.yang295
-rw-r--r--src/plugins/yang/openconfig/openconfig-yang-types.yang180
137 files changed, 63061 insertions, 0 deletions
diff --git a/src/plugins/yang/openconfig/ietf-interfaces.yang b/src/plugins/yang/openconfig/ietf-interfaces.yang
new file mode 100644
index 0000000..f66c205
--- /dev/null
+++ b/src/plugins/yang/openconfig/ietf-interfaces.yang
@@ -0,0 +1,1123 @@
+module ietf-interfaces {
+ yang-version 1.1;
+ namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces";
+ prefix if;
+
+ import ietf-yang-types {
+ prefix yang;
+ }
+
+ organization
+ "IETF NETMOD (Network Modeling) Working Group";
+
+ contact
+ "WG Web: <https://datatracker.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+
+ Editor: Martin Bjorklund
+ <mailto:mbj@tail-f.com>";
+
+ description
+ "This module contains a collection of YANG definitions for
+ managing network interfaces.
+
+ Copyright (c) 2018 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
+ (https://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 8343; see
+ the RFC itself for full legal notices.";
+
+ revision 2018-02-20 {
+ description
+ "Updated to support NMDA.";
+ reference
+ "RFC 8343: A YANG Data Model for Interface Management";
+ }
+
+ 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:interfaces/if:interface/if:name";
+ }
+ description
+ "This type is used by data models that need to reference
+ 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";
+ }
+
+ /*
+ * Data nodes
+ */
+
+ container interfaces {
+ description
+ "Interface parameters.";
+
+ list interface {
+ key "name";
+
+ description
+ "The list of interfaces on the device.
+
+ The status of an interface is available in this list in the
+ operational state. 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 operational
+ state. If the configuration of a user-controlled interface
+ cannot be used by the system, the configured interface is
+ not instantiated in the operational state.
+
+ System-controlled interfaces created by the system are
+ always present in this list in the operational state,
+ whether or not they are configured.";
+
+ 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.
+
+ If a client tries to create configuration for a
+ system-controlled interface that is not present in the
+ operational state, 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 Network Configuration
+ Protocol (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
+ operational state.
+
+ 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 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
+ configuration.";
+ 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 intended configuration 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 intended configuration are
+ reflected in ifAdminStatus.";
+ reference
+ "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+ }
+
+ leaf link-up-down-trap-enable {
+ if-feature if-mib;
+ type enumeration {
+ enum enabled {
+ value 1;
+ description
+ "The device will generate linkUp/linkDown SNMP
+ notifications for this interface.";
+ }
+ enum disabled {
+ value 2;
+ description
+ "The device will not generate linkUp/linkDown SNMP
+ notifications for this interface.";
+ }
+ }
+ 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";
+ }
+
+ 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.";
+ }
+ }
+ config false;
+ 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).";
+ }
+ }
+ config false;
+ 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;
+ config false;
+ 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";
+ }
+ config false;
+ 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;
+ config false;
+ 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-ref;
+ config false;
+ 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-ref;
+ config false;
+
+ 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";
+ config false;
+ 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 {
+ config false;
+ 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";
+ }
+ }
+
+ }
+ }
+
+ /*
+ * Legacy typedefs
+ */
+
+ typedef interface-state-ref {
+ type leafref {
+ path "/if:interfaces-state/if:interface/if:name";
+ }
+ status deprecated;
+ description
+ "This type is used by data models that need to reference
+ the operationally present interfaces.";
+ }
+
+ /*
+ * Legacy operational state data nodes
+ */
+
+ container interfaces-state {
+ config false;
+ status deprecated;
+ description
+ "Data nodes for the operational state of interfaces.";
+
+ list interface {
+ key "name";
+ status deprecated;
+
+ description
+ "The list of interfaces on the device.
+
+ System-controlled interfaces created by the system are
+ always present in this list, whether or not they are
+ configured.";
+
+ leaf name {
+ type string;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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";
+ status deprecated;
+ 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 {
+ status deprecated;
+ description
+ "A collection of interface-related statistics objects.";
+
+ leaf discontinuity-time {
+ type yang:date-and-time;
+ mandatory true;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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;
+ status deprecated;
+ 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";
+ }
+ }
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aaa-radius.yang b/src/plugins/yang/openconfig/openconfig-aaa-radius.yang
new file mode 100644
index 0000000..8f82bd4
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aaa-radius.yang
@@ -0,0 +1,180 @@
+submodule openconfig-aaa-radius {
+
+ yang-version "1";
+
+ belongs-to "openconfig-aaa" {
+ prefix "oc-aaa";
+ }
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-aaa-types { prefix oc-aaa-types; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-yang-types { prefix oc-yang; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and operational state data
+ related to the RADIUS protocol for authentication,
+ authorization, and accounting.";
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2017-09-18" {
+ description
+ "Updated to use OpenConfig types modules";
+ reference "0.3.0";
+ }
+
+ revision "2017-07-06" {
+ description
+ "Move to oc-inet types, add IETF attribution, add RADIUS
+ counters, changed password leaf names to indicate hashed";
+ reference "0.2.0";
+ }
+
+ revision "2017-01-29" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ identity RADIUS {
+ base oc-aaa-types:AAA_SERVER_TYPE;
+ description
+ "Remote Authentication Dial In User Service (RADIUS) AAA
+ server";
+ reference
+ "RFC 2865 - Remote Authentication Dial In User Service
+ (RADIUS)";
+ }
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping aaa-radius-server-config {
+ description
+ "Configuration data for a RADIUS server";
+
+ leaf auth-port {
+ type oc-inet:port-number;
+ default 1812;
+ description
+ "Port number for authentication requests";
+ }
+
+ leaf acct-port {
+ type oc-inet:port-number;
+ default 1813;
+ description
+ "Port number for accounting requests";
+ }
+
+ leaf secret-key {
+ type oc-types:routing-password;
+ description
+ "The unencrypted shared key used between the authentication
+ server and the device.";
+ }
+
+ leaf source-address {
+ type oc-inet:ip-address;
+ description
+ "Source IP address to use in messages to the RADIUS server";
+ }
+
+ leaf retransmit-attempts {
+ type uint8;
+ description
+ "Number of times the system may resend a request to the
+ RADIUS server when it is unresponsive";
+ }
+ }
+
+ grouping aaa-radius-server-state {
+ description
+ "Operational state data for a RADIUS server";
+
+ container counters {
+ description
+ "A collection of RADIUS related state objects.";
+
+ leaf retried-access-requests {
+ type oc-yang:counter64;
+ description
+ "Retransmitted Access-Request messages.";
+ }
+
+ leaf access-accepts {
+ type oc-yang:counter64;
+ description
+ "Received Access-Accept messages.";
+ }
+
+ leaf access-rejects {
+ type oc-yang:counter64;
+ description
+ "Received Access-Reject messages.";
+ }
+
+ leaf timeout-access-requests {
+ type oc-yang:counter64;
+ description
+ "Access-Request messages that have timed-out,
+ requiring retransmission.";
+ }
+ }
+ }
+
+ grouping aaa-radius-server-top {
+ description
+ "Top-level grouping for RADIUS server data";
+
+ container radius {
+ description
+ "Top-level container for RADIUS server data";
+
+ container config {
+ description
+ "Configuration data for RADIUS servers";
+
+ uses aaa-radius-server-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for RADIUS servers";
+
+ uses aaa-radius-server-config;
+ uses aaa-radius-server-state;
+ }
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aaa-tacacs.yang b/src/plugins/yang/openconfig/openconfig-aaa-tacacs.yang
new file mode 100644
index 0000000..21d0f4a
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aaa-tacacs.yang
@@ -0,0 +1,136 @@
+submodule openconfig-aaa-tacacs {
+
+ yang-version "1";
+
+ belongs-to "openconfig-aaa" {
+ prefix "oc-aaa";
+ }
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-aaa-types { prefix oc-aaa-types; }
+ import openconfig-types { prefix oc-types; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and operational state data
+ related to the TACACS+ protocol for authentication,
+ authorization, and accounting.";
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2017-09-18" {
+ description
+ "Updated to use OpenConfig types modules";
+ reference "0.3.0";
+ }
+
+ revision "2017-07-06" {
+ description
+ "Move to oc-inet types, add IETF attribution, add RADIUS
+ counters, changed password leaf names to indicate hashed";
+ reference "0.2.0";
+ }
+
+ revision "2017-01-29" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ identity TACACS {
+ base oc-aaa-types:AAA_SERVER_TYPE;
+ description
+ "Terminal Access Controller Access Control System (TACACS+)
+ AAA server";
+ reference
+ "The TACACS+ Protocol (draft-ietf-opsawg-tacacs-05)
+ RFC 1492 - An Access Control Protocol, Sometimes Called
+ TACACS";
+ }
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping aaa-tacacs-server-config {
+ description
+ "Configuration data for a TACACS+ server";
+
+ leaf port {
+ type oc-inet:port-number;
+ default 49;
+ description
+ "The port number on which to contact the TACACS server";
+ }
+
+ leaf secret-key {
+ type oc-types:routing-password;
+ description
+ "The unencrypted shared key used between the authentication
+ server and the device.";
+ }
+
+ leaf source-address {
+ type oc-inet:ip-address;
+ description
+ "Source IP address to use in messages to the TACACS server";
+ }
+ }
+
+ grouping aaa-tacacs-server-state {
+ description
+ "Operational state data for a TACACS+ server";
+ }
+
+ grouping aaa-tacacs-server-top {
+ description
+ "Top-level grouping for TACACS+ sever data";
+
+ container tacacs {
+ description
+ "Top-level container for TACACS+ server data";
+
+ container config {
+ description
+ "Configuration data for TACACS+ server";
+
+ uses aaa-tacacs-server-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for TACACS+ server";
+
+ uses aaa-tacacs-server-config;
+ uses aaa-tacacs-server-state;
+ }
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-aaa-types.yang b/src/plugins/yang/openconfig/openconfig-aaa-types.yang
new file mode 100644
index 0000000..41bd5d9
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aaa-types.yang
@@ -0,0 +1,162 @@
+module openconfig-aaa-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/aaa/types";
+
+ prefix "oc-aaa-types";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines shared types for data related to AAA
+ (authentication, authorization, accounting).";
+
+ oc-ext:openconfig-version "0.4.0";
+
+ revision "2018-04-12" {
+ description
+ "Add when conditions, correct identities";
+ reference "0.4.0";
+ }
+
+ revision "2017-09-18" {
+ description
+ "Updated to use OpenConfig types modules";
+ reference "0.3.0";
+ }
+
+ revision "2017-07-06" {
+ description
+ "Move to oc-inet types, add IETF attribution, add RADIUS
+ counters, changed password leaf names to indicate hashed";
+ reference "0.2.0";
+ }
+
+ revision "2017-01-29" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+
+ // identity statements
+
+ identity AAA_SERVER_TYPE {
+ description
+ "Base identity for types of AAA servers";
+ }
+
+
+ identity SYSTEM_DEFINED_ROLES {
+ description
+ "Base identity for system_defined roles that can be assigned
+ to users.";
+ }
+
+ identity SYSTEM_ROLE_ADMIN {
+ base SYSTEM_DEFINED_ROLES;
+ description
+ "Built-in role that allows the equivalent of superuser
+ permission for all configuration and operational commands
+ on the device.";
+ }
+
+ identity AAA_ACCOUNTING_EVENT_TYPE {
+ description
+ "Base identity for specifying events types that should be
+ sent to AAA server for accounting";
+ }
+
+ identity AAA_ACCOUNTING_EVENT_COMMAND {
+ base AAA_ACCOUNTING_EVENT_TYPE;
+ description
+ "Specifies interactive command events for AAA accounting";
+ }
+
+ identity AAA_ACCOUNTING_EVENT_LOGIN {
+ base AAA_ACCOUNTING_EVENT_TYPE;
+ description
+ "Specifies login events for AAA accounting";
+ }
+
+ identity AAA_AUTHORIZATION_EVENT_TYPE {
+ description
+ "Base identity for specifying activities that should be
+ sent to AAA server for authorization";
+ }
+
+ identity AAA_AUTHORIZATION_EVENT_COMMAND {
+ base AAA_AUTHORIZATION_EVENT_TYPE;
+ description
+ "Specifies interactive command events for AAA authorization";
+ }
+
+ identity AAA_AUTHORIZATION_EVENT_CONFIG {
+ base AAA_AUTHORIZATION_EVENT_TYPE;
+ description
+ "Specifies configuration (e.g., EXEC) events for AAA
+ authorization";
+ }
+
+ identity AAA_METHOD_TYPE {
+ description
+ "Base identity to define well-known methods for AAA
+ operations";
+ }
+
+ identity TACACS_ALL {
+ base AAA_METHOD_TYPE;
+ description
+ "The group of all TACACS+ servers.";
+ }
+
+ identity RADIUS_ALL {
+ base AAA_METHOD_TYPE;
+ description
+ "The group of all RADIUS servers.";
+ }
+
+ identity LOCAL {
+ base AAA_METHOD_TYPE;
+ description
+ "Locally configured method for AAA operations.";
+ }
+
+
+ // typedef statements
+
+ typedef crypt-password-type {
+ type string;
+ description
+ "A password that is hashed based on the hash algorithm
+ indicated by the prefix in the string. The string
+ takes the following form, based on the Unix crypt function:
+
+ $<id>[$<param>=<value>(,<param>=<value>)*][$<salt>[$<hash>]]
+
+ Common hash functions include:
+
+ id | hash function
+ ---+---------------
+ 1 | MD5
+ 2a| Blowfish
+ 2y| Blowfish (correct handling of 8-bit chars)
+ 5 | SHA-256
+ 6 | SHA-512
+
+ These may not all be supported by a target device.";
+ }
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aaa.yang b/src/plugins/yang/openconfig/openconfig-aaa.yang
new file mode 100644
index 0000000..18a00c5
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aaa.yang
@@ -0,0 +1,811 @@
+module openconfig-aaa {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/aaa";
+
+ prefix "oc-aaa";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-yang-types { prefix oc-yang; }
+ import openconfig-aaa-types { prefix oc-aaa-types; }
+
+ include openconfig-aaa-tacacs;
+ include openconfig-aaa-radius;
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and operational state data
+ related to authorization, authentication, and accounting (AAA)
+ management.
+
+ Portions of this model reuse data definitions or structure from
+ RFC 7317 - A YANG Data Model for System Management";
+
+ oc-ext:openconfig-version "0.4.0";
+
+ revision "2018-04-12" {
+ description
+ "Add when conditions, correct identities";
+ reference "0.4.0";
+ }
+
+ revision "2017-09-18" {
+ description
+ "Updated to use OpenConfig types modules";
+ reference "0.3.0";
+ }
+
+ revision "2017-07-06" {
+ description
+ "Move to oc-inet types, add IETF attribution, add RADIUS
+ counters, changed password leaf names to indicate hashed";
+ reference "0.2.0";
+ }
+
+ revision "2017-01-29" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+ // identity statements
+
+ // grouping statements
+ grouping aaa-servergroup-common-config {
+ description
+ "Configuration data for AAA server groups";
+
+ leaf name {
+ type string;
+ description
+ "Name for the server group";
+ }
+
+ leaf type {
+ type identityref {
+ base oc-aaa-types:AAA_SERVER_TYPE;
+ }
+ description
+ "AAA server type -- all servers in the group must be of this
+ type";
+ }
+ }
+
+ grouping aaa-servergroup-common-state {
+ description
+ "Operational state data for AAA server groups";
+
+ //TODO: add list of group members as opstate
+ }
+
+ grouping aaa-servergroup-common-top {
+ description
+ "Top-level grouping for AAA server groups";
+
+ container server-groups {
+ description
+ "Enclosing container for AAA server groups";
+
+ list server-group {
+ key "name";
+ description
+ "List of AAA server groups. All servers in a group
+ must have the same type as indicated by the server
+ type.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to configured name of the server group";
+ }
+
+ container config {
+ description
+ "Configuration data for each server group";
+
+ uses aaa-servergroup-common-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for each server group";
+
+ uses aaa-servergroup-common-config;
+ uses aaa-servergroup-common-state;
+ }
+
+ uses aaa-server-top;
+ }
+ }
+ }
+
+ grouping aaa-server-config {
+ description
+ "Common configuration data for AAA servers";
+
+ leaf name {
+ type string;
+ description
+ "Name assigned to the server";
+ }
+
+
+ leaf address {
+ type oc-inet:ip-address;
+ description "Address of the authentication server";
+ }
+
+ leaf timeout {
+ type uint16;
+ units seconds;
+ description
+ "Set the timeout in seconds on responses from the AAA
+ server";
+ }
+ }
+
+ grouping aaa-server-state {
+ description
+ "Common operational state data for AAA servers";
+
+ leaf connection-opens {
+ type oc-yang:counter64;
+ description
+ "Number of new connection requests sent to the server, e.g.
+ socket open";
+ }
+
+ leaf connection-closes {
+ type oc-yang:counter64;
+ description
+ "Number of connection close requests sent to the server, e.g.
+ socket close";
+ }
+
+ leaf connection-aborts {
+ type oc-yang:counter64;
+ description
+ "Number of aborted connections to the server. These do
+ not include connections that are close gracefully.";
+ }
+
+ leaf connection-failures {
+ type oc-yang:counter64;
+ description
+ "Number of connection failures to the server";
+ }
+
+ leaf connection-timeouts {
+ type oc-yang:counter64;
+ description
+ "Number of connection timeouts to the server";
+ }
+
+ leaf messages-sent {
+ type oc-yang:counter64;
+ description
+ "Number of messages sent to the server";
+ }
+
+ leaf messages-received {
+ type oc-yang:counter64;
+ description
+ "Number of messages received by the server";
+ }
+
+ leaf errors-received {
+ type oc-yang:counter64;
+ description
+ "Number of error messages received from the server";
+ }
+
+ }
+
+ grouping aaa-server-top {
+ description
+ "Top-level grouping for list of AAA servers";
+
+ container servers {
+ description
+ "Enclosing container the list of servers";
+
+ list server {
+ key "address";
+ description
+ "List of AAA servers";
+
+ leaf address {
+ type leafref {
+ path "../config/address";
+ }
+ description
+ "Reference to the configured address of the AAA server";
+ }
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses aaa-server-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses aaa-server-config;
+ uses aaa-server-state;
+ }
+
+ uses aaa-tacacs-server-top {
+ when "../../config/type = 'oc-aaa-types:TACACS'";
+ }
+
+ uses aaa-radius-server-top {
+ when "../../config/type = 'oc-aaa-types:RADIUS'";
+ }
+ }
+ }
+ }
+
+ grouping aaa-admin-config {
+ description
+ "Configuration data for the system built-in
+ administrator / root user account";
+
+ leaf admin-password {
+ type string;
+ oc-ext:openconfig-hashed-value;
+ description
+ "The admin/root password, supplied as a cleartext string.
+ The system should hash and only store the password as a
+ hashed value.";
+ }
+
+ leaf admin-password-hashed {
+ type oc-aaa-types:crypt-password-type;
+ description
+ "The admin/root password, supplied as a hashed value
+ using the notation described in the definition of the
+ crypt-password-type.";
+ }
+ }
+
+ grouping aaa-admin-state {
+ description
+ "Operational state data for the root user";
+
+ leaf admin-username {
+ type string;
+ description
+ "Name of the administrator user account, e.g., admin, root,
+ etc.";
+ }
+ }
+
+ grouping aaa-authentication-admin-top {
+ description
+ "Top-level grouping for root user configuration and state
+ data";
+
+ container admin-user {
+ description
+ "Top-level container for the system root or admin user
+ configuration and operational state";
+
+ container config {
+ description
+ "Configuration data for the root user account";
+
+ uses aaa-admin-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for the root user account";
+
+ uses aaa-admin-config;
+ uses aaa-admin-state;
+ }
+ }
+ }
+ grouping aaa-authentication-user-config {
+ description
+ "Configuration data for local users";
+
+ leaf username {
+ type string;
+ description
+ "Assigned username for this user";
+ }
+
+ leaf password {
+ type string;
+ oc-ext:openconfig-hashed-value;
+ description
+ "The user password, supplied as cleartext. The system
+ must hash the value and only store the hashed value.";
+ }
+
+ leaf password-hashed {
+ type oc-aaa-types:crypt-password-type;
+ description
+ "The user password, supplied as a hashed value
+ using the notation described in the definition of the
+ crypt-password-type.";
+ }
+
+ leaf ssh-key {
+ type string;
+ description
+ "SSH public key for the user (RSA or DSA)";
+ }
+
+ leaf role {
+ type union {
+ type string;
+ type identityref {
+ base oc-aaa-types:SYSTEM_DEFINED_ROLES;
+ }
+ }
+ description
+ "Role assigned to the user. The role may be supplied
+ as a string or a role defined by the SYSTEM_DEFINED_ROLES
+ identity.";
+ }
+ }
+
+ grouping aaa-authentication-user-state {
+ description
+ "Operational state data for local users";
+ }
+
+ grouping aaa-authentication-user-top {
+ description
+ "Top-level grouping for local users";
+
+ container users {
+ description
+ "Enclosing container list of local users";
+
+ list user {
+ key "username";
+ description
+ "List of local users on the system";
+
+ leaf username {
+ type leafref {
+ path "../config/username";
+ }
+ description
+ "References the configured username for the user";
+ }
+
+ container config {
+ description
+ "Configuration data for local users";
+
+ uses aaa-authentication-user-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for local users";
+
+ uses aaa-authentication-user-config;
+ uses aaa-authentication-user-state;
+ }
+ }
+
+ }
+ }
+
+ grouping aaa-accounting-methods-common {
+ description
+ "Common definitions for accounting methods";
+
+ leaf-list accounting-method {
+ type union {
+ type identityref {
+ base oc-aaa-types:AAA_METHOD_TYPE;
+ }
+ type string;
+ //TODO: in YANG 1.1 this should be converted to a leafref to
+ //point to the server group name.
+ }
+ ordered-by user;
+ description
+ "An ordered list of methods used for AAA accounting for this
+ event type. The method is defined by the destination for
+ accounting data, which may be specified as the group of
+ all TACACS+/RADIUS servers, a defined server group, or
+ the local system.";
+ }
+ }
+
+
+ grouping aaa-accounting-events-config {
+ description
+ "Configuration data for AAA accounting events";
+
+ leaf event-type {
+ type identityref {
+ base oc-aaa-types:AAA_ACCOUNTING_EVENT_TYPE;
+ }
+ description
+ "The type of activity to record at the AAA accounting
+ server";
+ }
+
+ leaf record {
+ type enumeration {
+ enum START_STOP {
+ description
+ "Send START record to the accounting server at the
+ beginning of the activity, and STOP record at the
+ end of the activity.";
+ }
+ enum STOP {
+ description
+ "Send STOP record to the accounting server when the
+ user activity completes";
+ }
+ }
+ description
+ "Type of record to send to the accounting server for this
+ activity type";
+ }
+ }
+
+ grouping aaa-accounting-events-state {
+ description
+ "Operational state data for accounting events";
+ }
+
+ grouping aaa-accounting-events-top {
+ description
+ "Top-level grouping for accounting events";
+
+ container events {
+ description
+ "Enclosing container for defining handling of events
+ for accounting";
+
+ list event {
+ key "event-type";
+ description
+ "List of events subject to accounting";
+
+ leaf event-type {
+ type leafref {
+ path "../config/event-type";
+ }
+ description
+ "Reference to the event-type being logged at the
+ accounting server";
+ }
+
+ container config {
+ description
+ "Configuration data for accounting events";
+
+ uses aaa-accounting-events-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for accounting events";
+
+ uses aaa-accounting-events-config;
+ uses aaa-accounting-events-state;
+ }
+ }
+ }
+ }
+
+ grouping aaa-accounting-config {
+ description
+ "Configuration data for event accounting";
+
+ uses aaa-accounting-methods-common;
+
+ }
+
+ grouping aaa-accounting-state {
+ description
+ "Operational state data for event accounting services";
+ }
+
+ grouping aaa-accounting-top {
+ description
+ "Top-level grouping for user activity accounting";
+
+ container accounting {
+ description
+ "Top-level container for AAA accounting";
+
+ container config {
+ description
+ "Configuration data for user activity accounting.";
+
+ uses aaa-accounting-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for user accounting.";
+
+ uses aaa-accounting-config;
+ uses aaa-accounting-state;
+ }
+
+ uses aaa-accounting-events-top;
+
+ }
+ }
+
+ grouping aaa-authorization-methods-config {
+ description
+ "Common definitions for authorization methods for global
+ and per-event type";
+
+ leaf-list authorization-method {
+ type union {
+ type identityref {
+ base oc-aaa-types:AAA_METHOD_TYPE;
+ }
+ type string;
+ }
+ ordered-by user;
+ description
+ "Ordered list of methods for authorizing commands. The first
+ method that provides a response (positive or negative) should
+ be used. The list may contain a well-defined method such
+ as the set of all TACACS or RADIUS servers, or the name of
+ a defined AAA server group. The system must validate
+ that the named server group exists.";
+ }
+ }
+
+ grouping aaa-authorization-events-config {
+ description
+ "Configuration data for AAA authorization events";
+
+ leaf event-type {
+ type identityref {
+ base oc-aaa-types:AAA_AUTHORIZATION_EVENT_TYPE;
+ }
+ description
+ "The type of event to record at the AAA authorization
+ server";
+ }
+ }
+
+ grouping aaa-authorization-events-state {
+ description
+ "Operational state data for AAA authorization events";
+ }
+
+ grouping aaa-authorization-events-top {
+ description
+ "Top-level grouping for authorization events";
+
+ container events {
+ description
+ "Enclosing container for the set of events subject
+ to authorization";
+
+ list event {
+ key "event-type";
+ description
+ "List of events subject to AAA authorization";
+
+ leaf event-type {
+ type leafref {
+ path "../config/event-type";
+ }
+ description
+ "Reference to the event-type list key";
+ }
+
+ container config {
+ description
+ "Configuration data for each authorized event";
+
+ uses aaa-authorization-events-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for each authorized activity";
+
+ uses aaa-authorization-events-config;
+ uses aaa-authorization-events-state;
+ }
+ }
+ }
+ }
+
+ grouping aaa-authorization-config {
+ description
+ "Configuration data for AAA authorization";
+
+ uses aaa-authorization-methods-config;
+ }
+
+ grouping aaa-authorization-state {
+ description
+ "Operational state data for AAA authorization";
+ }
+
+ grouping aaa-authorization-top {
+ description
+ "Top-level grouping for AAA authorization";
+
+ container authorization {
+ description
+ "Top-level container for AAA authorization configuration
+ and operational state data";
+
+ container config {
+ description
+ "Configuration data for authorization based on AAA
+ methods";
+
+ uses aaa-authorization-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for authorization based on AAA";
+
+ uses aaa-authorization-config;
+ uses aaa-authorization-state;
+ }
+
+ uses aaa-authorization-events-top;
+
+ }
+ }
+
+ grouping aaa-authentication-config {
+ description
+ "Configuration data for global authentication";
+
+ leaf-list authentication-method {
+ type union {
+ type identityref {
+ base oc-aaa-types:AAA_METHOD_TYPE;
+ }
+ type string;
+ //TODO: string should be a leafref to a defined
+ //server group. this will be possible in YANG 1.1
+ //type leafref {
+ //path "/aaa/server-groups/server-group/config/name";
+ //}
+ }
+ ordered-by user;
+ description
+ "Ordered list of authentication methods for users. This
+ can be either a reference to a server group, or a well-
+ defined designation in the AAA_METHOD_TYPE identity. If
+ authentication fails with one method, the next defined
+ method is tried -- failure of all methods results in the
+ user being denied access.";
+ }
+ }
+
+ grouping aaa-authentication-state {
+ description
+ "Operational state data for global authentication";
+ }
+
+ grouping aaa-authentication-top {
+ description
+ "Top-level grouping for top-level authentication";
+
+ container authentication {
+ description
+ "Top-level container for global authentication data";
+
+ container config {
+ description
+ "Configuration data for global authentication services";
+
+ uses aaa-authentication-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for global authentication
+ services";
+
+ uses aaa-authentication-config;
+ uses aaa-authentication-state;
+ }
+
+ uses aaa-authentication-admin-top;
+ uses aaa-authentication-user-top;
+ }
+ }
+
+ grouping aaa-config {
+ description
+ "Configuration data for top level AAA";
+ }
+
+ grouping aaa-state {
+ description
+ "Operational state data for top level AAA";
+ }
+
+ grouping aaa-top {
+ description
+ "Top-level grouping for AAA services";
+
+ container aaa {
+ description
+ "Top-level container for AAA services";
+
+ container config {
+ description
+ "Configuration data for top level AAA services";
+
+ uses aaa-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for top level AAA services ";
+
+ uses aaa-config;
+ uses aaa-state;
+ }
+
+ uses aaa-authentication-top;
+ uses aaa-authorization-top;
+ uses aaa-accounting-top;
+ uses aaa-servergroup-common-top;
+
+ }
+ }
+
+
+
+ // data definition statements
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-access-points.yang b/src/plugins/yang/openconfig/openconfig-access-points.yang
new file mode 100644
index 0000000..7665814
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-access-points.yang
@@ -0,0 +1,168 @@
+module openconfig-access-points {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/wifi/access-points";
+
+ // Assign this module a prefix to be used by other modules, when imported.
+ prefix "access-points";
+
+ // Imports
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-wifi-phy { prefix wifi-phy; }
+ import openconfig-wifi-mac { prefix wifi-mac; }
+ import openconfig-system { prefix oc-sys; }
+
+ // Meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines the top level WiFi Configurations for a list of
+ Access Points.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-02-14" {
+ description
+ "Initial version";
+ reference "0.1.0";
+ }
+
+ grouping assigned-ap-managers-config {
+ description
+ "AP Manager(s) an AP may join. If cloud manager, this will be
+ the cloud instance(s). This is often referred to as 'Controller'.";
+
+ leaf id {
+ type string;
+ description
+ "The unique reference for the AP manager described in the list entry.";
+ }
+
+ leaf fqdn {
+ type oc-inet:domain-name;
+ description
+ "The FQDN of a manager this AP is assigned to. The list should be
+ ordered, according to priority. eg Primary first,
+ Secondary second, Tertiary third etc.";
+ }
+
+ leaf ap-manager-ipv4-address {
+ type oc-inet:ipv4-address;
+ description
+ "IPv4 address of a manager for this AP. The list should be
+ ordered, according to priority. eg. Primary first, Secondary second,
+ Tertiary third etc.";
+ }
+
+ leaf-list ap-manager-ipv6-address {
+ type oc-inet:ipv6-address;
+ description
+ "IPv6 address of a manager for this AP. The list should be
+ ordered, according to priority. eg. Primary first, Secondary second,
+ Tertiary third etc.";
+ }
+ }
+
+ grouping assigned-ap-managers-state {
+ description
+ "Manager(s) an AP may join. If cloud manager, this will be
+ the cloud instance(s).";
+
+ leaf joined {
+ type boolean;
+ description
+ "True only if this AP is currently joined to a manager. If this AP
+ is configured to join manager(s), however is not currently joined
+ to any manager, this MUST return False.";
+ }
+ }
+
+ grouping manager-ap-parameters-top {
+ description
+ "Top-level grouping for assigning AP's to manager(s).";
+
+ container assigned-ap-managers {
+ description
+ "Wireless manager(s) this AP is assigned to. eg. Primary
+ Secondary, Tertiary etc.";
+
+ list ap-manager {
+ key "id";
+ description
+ "Manager(s) this AP is assinged to, referenced by id.";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "id serves as a reference point to the [1-n] manager(s) this AP
+ is assigned to.";
+ }
+
+ container config {
+ description
+ "Config. container for assigning APs to managers.";
+
+ uses assigned-ap-managers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State container for APs assigned to managers.";
+
+ uses assigned-ap-managers-config;
+ uses assigned-ap-managers-state;
+ }
+ }
+ }
+ }
+
+ grouping access-points-top {
+ description
+ "Top-level grouping for AP configuration & state data.";
+
+ container access-points {
+ description
+ "Top most container for configuration and state data for Access
+ Points.";
+
+ list access-point {
+ key "hostname";
+ description
+ "Configuration and state data for the access point referenced in the
+ list entry.";
+
+ leaf hostname {
+ type oc-inet:domain-name;
+ description
+ "AP FQDN";
+ }
+
+ uses wifi-phy:radio-top;
+ uses wifi-mac:ssid-top;
+ uses wifi-mac:bssid-counters-top;
+ uses oc-sys:system-top;
+ uses manager-ap-parameters-top;
+ }
+ }
+ }
+ uses access-points-top;
+
+ // hostname is set using openconfig-wifi-aps model.
+ deviation /oc-sys:system/oc-sys:config/oc-sys:hostname {
+ deviate not-supported;
+ }
+
+ deviation /oc-sys:system/oc-sys:state/oc-sys:hostname {
+ deviate not-supported;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-acl.yang b/src/plugins/yang/openconfig/openconfig-acl.yang
new file mode 100644
index 0000000..aa069cd
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-acl.yang
@@ -0,0 +1,837 @@
+module openconfig-acl {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/acl";
+
+ prefix "oc-acl";
+
+ import openconfig-packet-match { prefix oc-match; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-yang-types { prefix oc-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 network access control lists (i.e., filters, rules,
+ etc.). ACLs are organized into ACL sets, with each set
+ containing one or more ACL entries. ACL sets are identified
+ by a unique name, while each entry within a set is assigned
+ a sequence-id that determines the order in which the ACL
+ rules are applied to a packet. Note that ACLs are evaluated
+ in ascending order based on the sequence-id (low to high).
+
+ Individual ACL rules specify match criteria based on fields in
+ the packet, along with an action that defines how matching
+ packets should be handled. Entries have a type that indicates
+ the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc.";
+
+ oc-ext:openconfig-version "1.0.1";
+
+ revision "2018-04-24" {
+ description
+ "Clarified order of ACL evaluation";
+ reference "1.0.1";
+ }
+
+ revision "2017-05-26" {
+ description
+ "Separated ACL entries by type";
+ reference "1.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+ revision "2016-01-22" {
+ description
+ "Initial revision";
+ reference "TBD";
+ }
+
+
+ identity ACL_TYPE {
+ description
+ "Base identity for types of ACL sets";
+ }
+
+ identity ACL_IPV4 {
+ base ACL_TYPE;
+ description
+ "IP-layer ACLs with IPv4 addresses";
+ }
+
+ identity ACL_IPV6 {
+ base ACL_TYPE;
+ description
+ "IP-layer ACLs with IPv6 addresses";
+ }
+
+ identity ACL_L2 {
+ base ACL_TYPE;
+ description
+ "MAC-layer ACLs";
+ }
+
+ identity ACL_MIXED {
+ base ACL_TYPE;
+ description
+ "Mixed-mode ACL that specifies L2 and L3 protocol
+ fields. This ACL type is not implemented by many
+ routing/switching devices.";
+ }
+
+ // ACL action type
+
+ identity FORWARDING_ACTION {
+ description
+ "Base identity for actions in the forwarding category";
+ }
+
+ identity ACCEPT {
+ base FORWARDING_ACTION;
+ description
+ "Accept the packet";
+ }
+
+ identity DROP {
+ base FORWARDING_ACTION;
+ description
+ "Drop packet without sending any ICMP error message";
+ }
+
+ identity REJECT {
+ base FORWARDING_ACTION;
+ description
+ "Drop the packet and send an ICMP error message to the source";
+ }
+
+ identity LOG_ACTION {
+ description
+ "Base identity for defining the destination for logging
+ actions";
+ }
+
+ identity LOG_SYSLOG {
+ base LOG_ACTION;
+ description
+ "Log the packet in Syslog";
+ }
+
+ identity LOG_NONE {
+ base LOG_ACTION;
+ description
+ "No logging";
+ }
+
+ identity ACL_COUNTER_CAPABILITY {
+ description
+ "Base identity for system to indicate how it is able to report
+ counters";
+ }
+
+ identity INTERFACE_ONLY {
+ base ACL_COUNTER_CAPABILITY;
+ description
+ "ACL counters are available and reported only per interface";
+ }
+
+ identity AGGREGATE_ONLY {
+ base ACL_COUNTER_CAPABILITY;
+ description
+ "ACL counters are aggregated over all interfaces, and reported
+ only per ACL entry";
+ }
+
+ identity INTERFACE_AGGREGATE {
+ base ACL_COUNTER_CAPABILITY;
+ description
+ "ACL counters are reported per interface, and also aggregated
+ and reported per ACL entry.";
+ }
+
+ // grouping statements
+
+ // input interface
+ grouping input-interface-config {
+ description
+ "Config of interface";
+
+ }
+
+ grouping input-interface-state {
+ description
+ "State information of interface";
+ }
+
+ grouping input-interface-top {
+ description
+ "Input interface top level container";
+
+ container input-interface {
+ description
+ "Input interface container";
+
+ container config {
+ description
+ "Config data";
+ uses input-interface-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information";
+ uses input-interface-config;
+ uses input-interface-state;
+ }
+
+ uses oc-if:interface-ref;
+
+ }
+ }
+
+ // Action Type
+ grouping action-config {
+ description
+ "Config of action type";
+
+
+ leaf forwarding-action {
+ type identityref {
+ base FORWARDING_ACTION;
+ }
+ mandatory true;
+ description
+ "Specifies the forwarding action. One forwarding action
+ must be specified for each ACL entry";
+ }
+
+ leaf log-action {
+ type identityref {
+ base LOG_ACTION;
+ }
+ default LOG_NONE;
+ description
+ "Specifies the log action and destination for
+ matched packets. The default is not to log the
+ packet.";
+ }
+
+
+ }
+
+ grouping action-state {
+ description
+ "State information of action type";
+
+ }
+
+ grouping action-top {
+ description
+ "ACL action type top level container";
+
+ container actions {
+ description
+ "Enclosing container for list of ACL actions associated
+ with an entry";
+
+ container config {
+ description
+ "Config data for ACL actions";
+ uses action-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information for ACL actions";
+ uses action-config;
+ uses action-state;
+ }
+ }
+ }
+
+ grouping acl-counters-state {
+ description
+ "Common grouping for ACL counters";
+
+ leaf matched-packets {
+ type oc-yang:counter64;
+ description
+ "Count of the number of packets matching the current ACL
+ entry.
+
+ An implementation should provide this counter on a
+ per-interface per-ACL-entry if possible.
+
+ If an implementation only supports ACL counters per entry
+ (i.e., not broken out per interface), then the value
+ should be equal to the aggregate count across all interfaces.
+
+ An implementation that provides counters per entry per
+ interface is not required to also provide an aggregate count,
+ e.g., per entry -- the user is expected to be able implement
+ the required aggregation if such a count is needed.";
+ }
+
+ leaf matched-octets {
+ type oc-yang:counter64;
+ description
+ "Count of the number of octets (bytes) matching the current
+ ACL entry.
+
+ An implementation should provide this counter on a
+ per-interface per-ACL-entry if possible.
+
+ If an implementation only supports ACL counters per entry
+ (i.e., not broken out per interface), then the value
+ should be equal to the aggregate count across all interfaces.
+
+ An implementation that provides counters per entry per
+ interface is not required to also provide an aggregate count,
+ e.g., per entry -- the user is expected to be able implement
+ the required aggregation if such a count is needed.";
+ }
+
+ }
+
+ // Access List Entries
+ grouping access-list-entries-config {
+ description
+ "Access List Entries (ACE) config.";
+
+ leaf sequence-id {
+ type uint32;
+ description
+ "The sequence id determines the order in which ACL entries
+ are applied. The sequence id must be unique for each entry
+ in an ACL set. Target devices should apply the ACL entry
+ rules in ascending order determined by sequence id (low to
+ high), rather than the relying only on order in the list.";
+ }
+
+ leaf description {
+ type string;
+ description
+ "A user-defined description, or comment, for this Access List
+ Entry.";
+ }
+
+ }
+
+ grouping access-list-entries-state {
+ description
+ "Access List Entries state.";
+
+ uses acl-counters-state;
+
+ }
+
+ grouping access-list-entries-top {
+ description
+ "Access list entries to level container";
+
+ container acl-entries {
+ description
+ "Access list entries container";
+
+ list acl-entry {
+ key "sequence-id";
+ description
+ "List of ACL entries comprising an ACL set";
+
+ leaf sequence-id {
+ type leafref {
+ path "../config/sequence-id";
+ }
+ description
+ "references the list key";
+ }
+
+ container config {
+ description
+ "Access list entries config";
+ uses access-list-entries-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information for ACL entries";
+ uses access-list-entries-config;
+ uses access-list-entries-state;
+ }
+
+ uses oc-match:ethernet-header-top {
+ when "../../config/type='ACL_L2'" {
+ description
+ "MAC-layer fields are valid when the ACL type is L2";
+ }
+ }
+ uses oc-match:ipv4-protocol-fields-top {
+ when "../../config/type='ACL_IPV4'" {
+ description
+ "IPv4-layer fields are valid when the ACL type is
+ IPv4";
+ }
+ }
+ uses oc-match:ipv6-protocol-fields-top {
+ when "../../config/type='ACL_IPV6'" {
+ description
+ "IPv6-layer fields are valid when the ACL type is
+ IPv6";
+ }
+ }
+ uses oc-match:transport-fields-top {
+ when "../../config/type='ACL_IPV6' or " +
+ "../../config/type='ACL_IPV4'" {
+ description
+ "Transport-layer fields are valid when specifying
+ L3 ACL types";
+ }
+ }
+ uses input-interface-top;
+
+ uses action-top;
+ }
+ }
+ }
+
+ grouping acl-set-config {
+ description
+ "Access Control List config";
+
+ leaf name {
+ type string;
+ description
+ "The name of the access-list set";
+ }
+
+ leaf type {
+ type identityref {
+ base ACL_TYPE;
+ }
+ description
+ "The type determines the fields allowed in the ACL entries
+ belonging to the ACL set (e.g., IPv4, IPv6, etc.)";
+ }
+
+ leaf description {
+ type string;
+ description
+ "Description, or comment, for the ACL set";
+ }
+
+ }
+
+ grouping acl-set-state {
+ description
+ "Access Control List state";
+ }
+
+ grouping acl-set-top {
+ description
+ "Access list entries variables top level container";
+
+ container acl-sets {
+ description
+ "Access list entries variables enclosing container";
+
+ list acl-set {
+ key "name type";
+ description
+ "List of ACL sets, each comprising of a list of ACL
+ entries";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the name list key";
+ }
+
+ leaf type {
+ type leafref {
+ path "../config/type";
+ }
+ description
+ "Reference to the type list key";
+ }
+
+ container config {
+ description
+ "Access list config";
+ uses acl-set-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Access list state information";
+ uses acl-set-config;
+ uses acl-set-state;
+ }
+ uses access-list-entries-top;
+ }
+ }
+ }
+
+ grouping interface-acl-entries-config {
+ description
+ "Configuration data for per-interface ACLs";
+
+ }
+
+ grouping interface-acl-entries-state {
+ description
+ "Operational state data for per-interface ACL entries";
+
+ leaf sequence-id {
+ type leafref {
+ path "/acl/acl-sets/" +
+ "acl-set[name=current()/../../../../set-name]" +
+ "[type=current()/../../../../type]/" +
+ "acl-entries/acl-entry/sequence-id";
+ }
+ description
+ "Reference to an entry in the ACL set applied to an
+ interface";
+ }
+
+ uses acl-counters-state;
+
+ }
+
+ grouping interface-acl-entries-top {
+ description
+ "Top-level grouping for per-interface ACL entries";
+
+ container acl-entries {
+ config false;
+ description
+ "Enclosing container for list of references to ACLs";
+
+ list acl-entry {
+ key "sequence-id";
+ description
+ "List of ACL entries assigned to an interface";
+
+ leaf sequence-id {
+ type leafref {
+ path "../state/sequence-id";
+ }
+ description
+ "Reference to per-interface acl entry key";
+ }
+
+ // no config container since the enclosing container is
+ // read-only
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for per-interface ACL entries";
+
+ uses interface-acl-entries-config;
+ uses interface-acl-entries-state;
+ }
+ }
+ }
+ }
+
+ grouping interface-ingress-acl-config {
+ description
+ "Configuration data for per-interface ingress ACLs";
+
+ leaf set-name {
+ type leafref {
+ path "../../../../../../acl-sets/acl-set/config/name";
+ }
+ description
+ "Reference to the ACL set name applied on ingress";
+ }
+
+ leaf type {
+ type leafref {
+ path "../../../../../../acl-sets/acl-set[name=current()/../set-name]" +
+ "/config/type";
+ }
+ description
+ "Reference to the ACL set type applied on ingress";
+ }
+ }
+
+ grouping interface-ingress-acl-state {
+ description
+ "Operational state data for the per-interface ingress ACL";
+ }
+
+ grouping interface-ingress-acl-top {
+ description
+ "Top-level grouping for per-interface ingress ACL data";
+
+ container ingress-acl-sets {
+ description
+ "Enclosing container the list of ingress ACLs on the
+ interface";
+
+ list ingress-acl-set {
+ key "set-name type";
+ description
+ "List of ingress ACLs on the interface";
+
+ leaf set-name {
+ type leafref {
+ path "../config/set-name";
+ }
+ description
+ "Reference to set name list key";
+ }
+
+ leaf type {
+ type leafref {
+ path "../config/type";
+ }
+ description
+ "Reference to type list key";
+ }
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses interface-ingress-acl-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for interface ingress ACLs";
+
+ uses interface-ingress-acl-config;
+ uses interface-ingress-acl-state;
+ }
+
+ uses interface-acl-entries-top;
+ }
+ }
+ }
+
+ grouping interface-egress-acl-config {
+ description
+ "Configuration data for per-interface egress ACLs";
+
+ leaf set-name {
+ type leafref {
+ path "../../../../../../acl-sets/acl-set/config/name";
+ }
+ description
+ "Reference to the ACL set name applied on egress";
+ }
+
+ leaf type {
+ type leafref {
+ path "../../../../../../acl-sets/acl-set[name=current()/../set-name]" +
+ "/config/type";
+ }
+ description
+ "Reference to the ACL set type applied on egress.";
+ }
+ }
+
+ grouping interface-egress-acl-state {
+ description
+ "Operational state data for the per-interface egress ACL";
+ }
+
+ grouping interface-egress-acl-top {
+ description
+ "Top-level grouping for per-interface egress ACL data";
+
+ container egress-acl-sets {
+ description
+ "Enclosing container the list of egress ACLs on the
+ interface";
+
+ list egress-acl-set {
+ key "set-name type";
+ description
+ "List of egress ACLs on the interface";
+
+ leaf set-name {
+ type leafref {
+ path "../config/set-name";
+ }
+ description
+ "Reference to set name list key";
+ }
+
+ leaf type {
+ type leafref {
+ path "../config/type";
+ }
+ description
+ "Reference to type list key";
+ }
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses interface-egress-acl-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for interface egress ACLs";
+
+ uses interface-egress-acl-config;
+ uses interface-egress-acl-state;
+ }
+
+ uses interface-acl-entries-top;
+ }
+ }
+ }
+
+ grouping acl-interfaces-config {
+ description
+ "Configuration data for interface references";
+
+ leaf id {
+ type oc-if:interface-id;
+ description
+ "User-defined identifier for the interface -- a common
+ convention could be '<if name>.<subif index>'";
+ }
+ }
+
+ grouping acl-interfaces-state {
+ description
+ "Operational state data for interface references";
+ }
+
+ grouping acl-interfaces-top {
+ description
+ "Top-level grouping for interface-specific ACL data";
+
+ container interfaces {
+ description
+ "Enclosing container for the list of interfaces on which
+ ACLs are set";
+
+ list interface {
+ key "id";
+ description
+ "List of interfaces on which ACLs are set";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "Reference to the interface id list key";
+ }
+
+ container config {
+ description
+ "Configuration for ACL per-interface data";
+
+ uses acl-interfaces-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state for ACL per-interface data";
+
+ uses acl-interfaces-config;
+ uses acl-interfaces-state;
+ }
+
+ uses oc-if:interface-ref;
+ uses interface-ingress-acl-top;
+ uses interface-egress-acl-top;
+ }
+ }
+ }
+
+ grouping acl-config {
+ description
+ "Global configuration data for ACLs";
+ }
+
+ grouping acl-state {
+ description
+ "Global operational state data for ACLs";
+
+ leaf counter-capability {
+ type identityref {
+ base ACL_COUNTER_CAPABILITY;
+ }
+ description
+ "System reported indication of how ACL counters are reported
+ by the target";
+ }
+ }
+ grouping acl-top {
+ description
+ "Top level grouping for ACL data and structure";
+
+ container acl {
+ description
+ "Top level enclosing container for ACL model config
+ and operational state data";
+
+ container config {
+ description
+ "Global config data for ACLs";
+
+ uses acl-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Global operational state data for ACLs";
+
+ uses acl-config;
+ uses acl-state;
+ }
+
+ uses acl-set-top;
+ uses acl-interfaces-top;
+ }
+ }
+
+ // data definition statements
+ uses acl-top;
+
+ // augment statements
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aft-common.yang b/src/plugins/yang/openconfig/openconfig-aft-common.yang
new file mode 100644
index 0000000..c2b884f
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aft-common.yang
@@ -0,0 +1,385 @@
+submodule openconfig-aft-common {
+ belongs-to "openconfig-aft" {
+ prefix "oc-aft";
+ }
+
+ import openconfig-interfaces { prefix "oc-if"; }
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-yang-types { prefix "oc-yang"; }
+ import openconfig-inet-types { prefix "oc-inet"; }
+ import openconfig-mpls-types { prefix "oc-mplst"; }
+ import openconfig-policy-types { prefix "oc-pol-types"; }
+ import openconfig-aft-types { prefix "oc-aftt"; }
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Submodule containing definitions of groupings that are re-used
+ across multiple contexts within the AFT model.";
+
+ oc-ext:openconfig-version "0.3.1";
+
+ revision 2017-08-24 {
+ description
+ "Formatting fixes";
+ reference "0.3.1";
+ }
+
+ revision 2017-05-10 {
+ description
+ "Refactor to provide concretised per-AF schemas per AFT.";
+ reference "0.3.0";
+ }
+
+ grouping aft-nhop-structural {
+ description
+ "Structural grouping describing a next-hop entry.";
+
+ container next-hops {
+ description
+ "The list of next-hops that are to be used for entry within
+ the AFT table. The structure of each next-hop is address
+ family independent, such that it is possible to resolve fully
+ how the next-hop is treated. For example:
+
+ - Where ingress IPv4 unicast packets are to be forwarded via
+ an MPLS LSP, the next-hop list should indicate the MPLS
+ label stack that is used to the next-hop.
+ - Where ingress MPLS labelled packets are to be forwarded to
+ an IPv6 nexthop (for example, a CE within a VPN, then the
+ popped label stack, and IPv6 next-hop address should be
+ indicated).";
+
+ list next-hop {
+ key "index";
+
+ description
+ "A next-hop associated with the forwarding instance.";
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+ description
+ "A unique index identifying the next-hop entry for the
+ AFT entry";
+
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the AFT next-hop
+ entry";
+
+ uses aft-common-entry-nexthop-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the AFT
+ next-hop entry";
+
+ uses aft-common-entry-nexthop-config;
+ uses aft-common-entry-nexthop-state;
+ }
+
+ uses oc-if:interface-ref;
+ }
+ }
+ }
+
+ grouping aft-common-entry-state {
+ description
+ "Operational state parameters relating to a forwarding entry";
+
+ leaf packets-forwarded {
+ type oc-yang:counter64;
+ description
+ "The number of packets which have matched, and been forwarded,
+ based on the AFT entry.";
+ }
+
+ leaf octets-forwarded {
+ type oc-yang:counter64;
+ description
+ "The number of octets which have matched, and been forwarded,
+ based on the AFT entry";
+ }
+
+ // We are at $afi/$entry/state/next-hop-group
+ leaf next-hop-group {
+ type leafref {
+ path "../../../../next-hop-groups/next-hop-group/state/id";
+ }
+ description
+ "A reference to the next-hop-group that is in use for the entry
+ within the AFT. Traffic is distributed across the set of next-hops
+ within the next-hop group according to the weight.";
+ }
+ }
+
+ grouping aft-common-entry-nexthop-config {
+ description
+ "Configuration parameters relating to a next-hop entry for a AFT
+ entry";
+
+ leaf index {
+ type uint64;
+ description
+ "A unique entry for the next-hop.";
+ }
+ }
+
+ grouping aft-common-entry-nexthop-state {
+ description
+ "Parameters relating to a next-hop.";
+
+ leaf ip-address {
+ type oc-inet:ip-address;
+ description
+ "The IP address of the next-hop system.";
+ }
+
+ leaf mac-address {
+ type oc-yang:mac-address;
+ description
+ "The MAC address of the next-hop if resolved by the local
+ network instance.";
+ }
+
+ leaf-list pushed-mpls-label-stack {
+ type oc-mplst:mpls-label;
+ ordered-by user;
+ description
+ "The MPLS label stack imposed when forwarding packets to the
+ next-hop
+ - the stack is encoded as a leaf list whereby the order of the
+ entries is such that the first entry in the list is the
+ label at the bottom of the stack to be pushed.
+
+ To this end, a packet which is to forwarded to a device using
+ a service label of 42, and a transport label of 8072 will be
+ represented with a label stack list of [42, 8072].
+
+ The MPLS label stack list is ordered by the user, such that no
+ system re-ordering of leaves is permitted by the system.
+
+ A swap operation is reflected by entries in the
+ popped-mpls-label-stack and pushed-mpls-label-stack nodes.";
+
+ }
+
+ leaf encapsulate-header {
+ type oc-aftt:encapsulation-header-type;
+ description
+ "When forwarding a packet to the specified next-hop the local
+ system performs an encapsulation of the packet - adding the
+ specified header type.";
+ }
+
+ leaf origin-protocol {
+ type identityref {
+ base "oc-pol-types:INSTALL_PROTOCOL_TYPE";
+ }
+ description
+ "The protocol from which the AFT entry was learned.";
+ }
+ }
+
+ grouping aft-common-ip-state {
+ description
+ "Common parameters across IP address families";
+
+ leaf decapsulate-header {
+ type oc-aftt:encapsulation-header-type;
+ description
+ "When forwarding a packet to the specified next-hop, the local
+ system performs a decapsulation of the packet - removing the
+ specified header type. In the case that no next-hop is
+ specified, the packet header is removed, and a subsequent
+ forwarding lookup is performed on the packet encapsulated
+ within the header, matched within the relevant AFT within the
+ specified network-instance.";
+ }
+ }
+
+ grouping aft-next-hop-groups-structural {
+ description
+ "Logical grouping for groups of next-hops.";
+
+ container next-hop-groups {
+ description
+ "Surrounding container for groups of next-hops.";
+
+ list next-hop-group {
+ key "id";
+
+ description
+ "An individual set of next-hops grouped into a common group.
+ Each entry within an abstract forwarding table points to a
+ next-hop-group. Entries in the next-hop-group are forwarded to
+ according to the weights specified for each next-hop group.
+
+ If an entry within the next-hop group becomes unusable, for
+ example due to an interface failure, the remaining entries
+ are used until all entries become unusable - at which point
+ the backup next-hop-group (if specified) is used.";
+
+ leaf id {
+ description
+ "A reference to a unique identifier for the next-hop-group.";
+
+ type leafref {
+ path "../config/id";
+ }
+ }
+
+ container config {
+ description
+ "Configuration parameters related to the next-hop-group.";
+ uses aft-nhg-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to next-hop-groups.";
+ uses aft-nhg-config;
+ uses aft-nhg-state;
+ }
+
+ container next-hops {
+ description
+ "Surrounding container for the list of next-hops within
+ the next-hop-group.";
+
+ list next-hop {
+ key "index";
+
+ description
+ "An individual next-hop within the next-hop-group. Each
+ next-hop is a reference to an entry within the next-hop
+ list.";
+
+ leaf index {
+ description
+ "A reference to the index for the next-hop within the
+ the next-hop-group.";
+ type leafref {
+ path "../config/index";
+ }
+ }
+
+ container config {
+ description
+ "Configuration parameters related to a next-hop within
+ the next-hop-group.";
+ uses aft-nhg-nh-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters related to a next-hop
+ within the next-hop-group.";
+ uses aft-nhg-nh-config;
+ uses aft-nhg-nh-state;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ grouping aft-nhg-config {
+ description
+ "Configuration parameters related to a next-hop-group.";
+
+ leaf id {
+ type uint64;
+ description
+ "A unique identifier for the next-hop-group. This index
+ is not expected to be consistent across reboots, or
+ reprogramming of the next-hop-group. When updating
+ a next-hop-group, if the group is removed by the system
+ or assigned an alternate identifier, the system should
+ send telemetry notifications deleting the previous
+ identifier. If the identifier of the next-hop-group
+ is changed, all AFT entries that reference it must
+ also be updated.";
+ }
+ }
+
+ grouping aft-nhg-state {
+ description
+ "Operational state parameters related to a next-hop-group.";
+
+ leaf color {
+ type uint64;
+ description
+
+ "An arbitrary colour that is used as an identifier for the next-hop
+ group. Some next-hop resolutions may utilise the colour to select
+ the particular next-hop-group that a routing entry should be resolved
+ to. In this case, next-hop-group selection may be based on colour
+ matches rather than the protocol specified next-hop.
+
+ Regardless of whether the next-hop-group's specified colour is
+ used to select an AFT's active forwarding entry, the next-hop-group
+ referenced by an entry should be the currently active value.
+
+ Next-hop-groups that are installed on the system through a protocol
+ that allows injection of such entries (e.g., BGP using the SR-TE
+ Policy SAFI, or gRPC-based RIB programming) should have the colour
+ specified in the injecting protocol within this leaf.";
+ }
+
+ leaf backup-next-hop-group {
+ // We are at afts/next-hop-groups/next-hop-group/config/backup-next-hop-group
+ type leafref {
+ path "../../../next-hop-group/state/id";
+ }
+ description
+ "The backup next-hop-group for the current group. When all
+ entries within the next-hop group become unusable, the backup
+ next-hop group is used if specified.";
+ }
+ }
+
+ grouping aft-nhg-nh-config {
+ description
+ "Configuration parameters relating to an individual next-hop within
+ a next-hop-group.";
+
+ leaf index {
+ type leafref {
+ // We are at afts/next-hop-groups/next-hop-group/next-hops/next-hop/config/id
+ path "../../../../../../next-hops/next-hop/config/index";
+ }
+ description
+ "A reference to the identifier for the next-hop to which
+ the entry in the next-hop group corresponds.";
+ }
+ }
+
+ grouping aft-nhg-nh-state {
+ description
+ "Operational state parameters relating to an individual next-hop
+ within the next-hop-group.";
+
+ leaf weight {
+ type uint64;
+ description
+ "The weight applied to the next-hop within the group. Traffic
+ is balanced across the next-hops within the group in the
+ proportion of weight/(sum of weights of the next-hops within
+ the next-hop group).";
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aft-ethernet.yang b/src/plugins/yang/openconfig/openconfig-aft-ethernet.yang
new file mode 100644
index 0000000..714a059
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aft-ethernet.yang
@@ -0,0 +1,93 @@
+submodule openconfig-aft-ethernet {
+ belongs-to "openconfig-aft" {
+ prefix "oc-aft";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-yang-types { prefix "oc-yang"; }
+
+ // Include common cross-AFT groupings from the common submodule.
+ include openconfig-aft-common;
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Submodule containing definitions of groupings for the abstract
+ forwarding tables for Ethernet.";
+
+ oc-ext:openconfig-version "0.3.1";
+
+ revision 2017-08-24 {
+ description
+ "Formatting fixes";
+ reference "0.3.1";
+ }
+
+ revision 2017-05-10 {
+ description
+ "Refactor to provide concretised per-AF schemas per AFT.";
+ reference "0.3.0";
+ }
+
+ grouping aft-ethernet-structural {
+ description
+ "Structural grouping defining the schema for the Ethernet
+ abstract forwarding table.";
+
+ list mac-entry {
+ key "mac-address";
+
+ description
+ "List of the Ethernet entries within the abstract
+ forwarding table. This list is keyed by the outer MAC address
+ of the Ethernet frame.";
+
+ leaf mac-address {
+ type leafref {
+ path "../config/mac-address";
+ }
+ description
+ "Reference to the outer MAC address matched by the
+ entry.";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the Ethernet AFT entry.";
+ uses aft-ethernet-entry-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for the Ethernet AFT
+ entry.";
+ uses aft-ethernet-entry-config;
+ uses aft-ethernet-entry-state;
+ }
+ }
+ }
+
+ grouping aft-ethernet-entry-config {
+ description
+ "Configuration parameters for the Ethernet AFT entry.";
+
+ leaf mac-address {
+ type oc-yang:mac-address;
+ description
+ "The outer MAC address of the Ethernet frame that must
+ be matched for the AFT entry to be utilised.";
+ }
+ }
+
+ grouping aft-ethernet-entry-state {
+ description
+ "Operational state parameters for the Ethernet AFT entry.";
+ uses aft-common-entry-state;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aft-ipv4.yang b/src/plugins/yang/openconfig/openconfig-aft-ipv4.yang
new file mode 100644
index 0000000..20f8992
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aft-ipv4.yang
@@ -0,0 +1,94 @@
+submodule openconfig-aft-ipv4 {
+ belongs-to "openconfig-aft" {
+ prefix "oc-aft";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-inet-types { prefix "oc-inet"; }
+
+ // Include common cross-AFT groupings from the common submodule.
+ include openconfig-aft-common;
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Submodule containing definitions of groupings for the abstract
+ forwarding tables for IPv4.";
+
+ oc-ext:openconfig-version "0.3.1";
+
+ revision 2017-08-24 {
+ description
+ "Formatting fixes";
+ reference "0.3.1";
+ }
+
+ revision 2017-05-10 {
+ description
+ "Refactor to provide concretised per-AF schemas per AFT.";
+ reference "0.3.0";
+ }
+
+ grouping aft-ipv4-unicast-structural {
+ description
+ "Structural grouping defining the schema for the IPv4 unicast
+ abstract forwarding table.";
+
+ list ipv4-entry {
+ key "prefix";
+
+ description
+ "List of the IPv4 unicast entries within the abstract
+ forwarding table. This list is keyed by the destination IPv4
+ prefix.";
+
+ leaf prefix {
+ type leafref {
+ path "../config/prefix";
+ }
+ description
+ "Reference to the IPv4 unicast destination prefix which
+ must be matched to utilise the AFT entry.";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the IPv4 unicast AFT entry.";
+ uses aft-ipv4-unicast-entry-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for the IPv4 unicast AFT
+ entry.";
+ uses aft-ipv4-unicast-entry-config;
+ uses aft-ipv4-unicast-entry-state;
+ }
+ }
+ }
+
+ grouping aft-ipv4-unicast-entry-config {
+ description
+ "Configuration parameters for the IPv4 unicast entry.";
+
+ leaf prefix {
+ type oc-inet:ipv4-prefix;
+ description
+ "The IPv4 destination prefix that should be matched to
+ utilise the AFT entry.";
+ }
+ }
+
+ grouping aft-ipv4-unicast-entry-state {
+ description
+ "Operational state parameters for the IPv4 unicast entry.";
+ uses aft-common-entry-state;
+ uses aft-common-ip-state;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aft-ipv6.yang b/src/plugins/yang/openconfig/openconfig-aft-ipv6.yang
new file mode 100644
index 0000000..3a8f934
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aft-ipv6.yang
@@ -0,0 +1,94 @@
+submodule openconfig-aft-ipv6 {
+ belongs-to "openconfig-aft" {
+ prefix "oc-aft";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-inet-types { prefix "oc-inet"; }
+
+ // Include common cross-AFT groupings from the common submodule.
+ include openconfig-aft-common;
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Submodule containing definitions of groupings for the abstract
+ forwarding tables for IPv6.";
+
+ oc-ext:openconfig-version "0.3.1";
+
+ revision 2017-08-24 {
+ description
+ "Formatting fixes";
+ reference "0.3.1";
+ }
+
+ revision 2017-05-10 {
+ description
+ "Refactor to provide concretised per-AF schemas per AFT.";
+ reference "0.3.0";
+ }
+
+ grouping aft-ipv6-unicast-structural {
+ description
+ "Structural grouping defining the schema for the IPv6 unicast
+ abstract forwarding table.";
+
+ list ipv6-entry {
+ key "prefix";
+
+ description
+ "List of the IPv6 unicast entries within the abstract
+ forwarding table. This list is keyed by the destination IPv6
+ prefix.";
+
+ leaf prefix {
+ type leafref {
+ path "../config/prefix";
+ }
+ description
+ "Reference to the IPv6 unicast destination prefix which
+ must be matched to utilise the AFT entry.";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the IPv6 unicast AFT entry.";
+ uses aft-ipv6-unicast-entry-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for the IPv6 unicast AFT
+ entry.";
+ uses aft-ipv6-unicast-entry-config;
+ uses aft-ipv6-unicast-entry-state;
+ }
+ }
+ }
+
+ grouping aft-ipv6-unicast-entry-config {
+ description
+ "Configuration parameters for the IPv6 unicast entry.";
+
+ leaf prefix {
+ type oc-inet:ipv6-prefix;
+ description
+ "The IPv6 destination prefix that should be matched to
+ utilise the AFT entry.";
+ }
+ }
+
+ grouping aft-ipv6-unicast-entry-state {
+ description
+ "Operational state parameters for the IPv6 unicast entry.";
+ uses aft-common-entry-state;
+ uses aft-common-ip-state;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aft-mpls.yang b/src/plugins/yang/openconfig/openconfig-aft-mpls.yang
new file mode 100644
index 0000000..1772fe0
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aft-mpls.yang
@@ -0,0 +1,111 @@
+submodule openconfig-aft-mpls {
+ belongs-to "openconfig-aft" {
+ prefix "oc-aft";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-mpls-types { prefix "oc-mplst"; }
+
+ // Include common cross-AFT groupings from the common submodule.
+ include openconfig-aft-common;
+
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Submodule containing definitions of groupings for the abstract
+ forwarding table for MPLS label forwarding.";
+
+ oc-ext:openconfig-version "0.3.1";
+
+ revision 2017-08-24 {
+ description
+ "Formatting fixes";
+ reference "0.3.1";
+ }
+
+ revision 2017-05-10 {
+ description
+ "Refactor to provide concretised per-AF schemas per AFT.";
+ reference "0.3.0";
+ }
+
+ grouping aft-mpls-structural {
+ description
+ "Structural grouping defining the schema for the MPLS
+ abstract forwarding table.";
+
+ list label-entry {
+ key "label";
+
+ description
+ "List of the MPLS entries within the abstract
+ forwarding table. This list is keyed by the top-most MPLS
+ label.";
+
+ leaf label {
+ type leafref {
+ path "../config/label";
+ }
+ description
+ "Reference to the top-most MPLS label matched by the
+ entry.";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the MPLS AFT entry.";
+ uses aft-mpls-entry-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for the MPLS AFT
+ entry.";
+ uses aft-mpls-entry-config;
+ uses aft-mpls-entry-state;
+ }
+ }
+ }
+
+ grouping aft-mpls-entry-config {
+ description
+ "Configuration parameters for the MPLS entry.";
+
+ leaf label {
+ type oc-mplst:mpls-label;
+ description
+ "The top-most MPLS label that should be matched to
+ utilise the AFT entry.";
+ }
+ }
+
+ grouping aft-mpls-entry-state {
+ description
+ "Operational state parameters for the MPLS entry.";
+ uses aft-common-entry-state;
+
+ leaf-list popped-mpls-label-stack {
+ type oc-mplst:mpls-label;
+ description
+ "The MPLS label stack to be popped from the packet when
+ switched by the system. The stack is encoded as a leaf-list
+ such that the first entry is the label that is outer-most (i.e.,
+ furthest from the bottom of the stack).
+
+ If the local system pops the outer-most label 400, then the
+ value of this list is [400,]. If the local system removes two
+ labels, the outer-most being 500, and the second of which is
+ 400, then the value of the list is [500, 400].
+
+ A swap operation is reflected by entries in the
+ popped-mpls-label-stack and pushed-mpls-label-stack nodes.";
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aft-network-instance.yang b/src/plugins/yang/openconfig/openconfig-aft-network-instance.yang
new file mode 100644
index 0000000..aed74cf
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aft-network-instance.yang
@@ -0,0 +1,98 @@
+module openconfig-aft-network-instance {
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/aft/ni";
+ prefix "oc-aftni";
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-network-instance { prefix "oc-ni"; }
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module provides augmentations that are utilized
+ when building the OpenConfig network instance model to
+ add per-NI AFTs.";
+
+ oc-ext:openconfig-version "0.2.2";
+
+ revision 2017-08-24 {
+ description
+ "Formatting fixes";
+ reference "0.2.2";
+ }
+
+ revision 2017-01-13 {
+ description
+ "Updated revision for external review";
+ reference "0.2.1";
+ }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+ "oc-ni:afts/oc-ni:next-hops/oc-ni:next-hop/oc-ni:state" {
+
+ description
+ "Add leaves that require referencing of a network instance to the
+ operational state parameters of a next-hop within the AFT for IPv4
+ unicast.";
+
+ uses aft-nexthop-ni-state;
+ }
+
+ grouping aft-nexthop-ni-state {
+ description
+ "Operational state parameters relating to a next-hop which reference a
+ network instance.";
+
+ leaf network-instance {
+ type oc-ni:network-instance-ref;
+ description
+ "The network-instance within which the next-hop should be resolved.
+ When this leaf is unspecified, the next-hop is resolved within
+ the local instance.";
+ }
+ }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+ "oc-ni:afts/oc-ni:ipv4-unicast/oc-ni:ipv4-entry/oc-ni:state" {
+ description
+ "Add leaves that require referencing of a network instance to the
+ operational state parameters of an entry within the IPv4 unicast AFT.";
+
+ uses aft-entry-ni-state;
+ }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+ "oc-ni:afts/oc-ni:ipv6-unicast/oc-ni:ipv6-entry/oc-ni:state" {
+ description
+ "Add leaves that require referencing of a network instance to the
+ operational state parameters of an entry within the IPv6 unicast AFT.";
+
+ uses aft-entry-ni-state;
+ }
+
+ grouping aft-entry-ni-state {
+ description
+ "Operational state parameters relating to an AFT entry which reference
+ a network instance.";
+
+ leaf origin-network-instance {
+ type oc-ni:network-instance-ref;
+ description
+ "If the AFT entry was imported from another network instance (e.g., it
+ corresponds to a L3 forwarding entry which was learned within another
+ network-instance), the value of this leaf reflects the network-instance
+ from which it was learned.
+
+ For example, if the local network-instance corresponds to a L3VRF, and
+ routes are imported from the VPNv4 address-family of the BGP instance
+ in the DEFAULT_INSTANCE, then this value would reflect the
+ DEFAULT_INSTANCE as the origin-network-instance.";
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aft-pf.yang b/src/plugins/yang/openconfig/openconfig-aft-pf.yang
new file mode 100644
index 0000000..839f9e5
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aft-pf.yang
@@ -0,0 +1,172 @@
+submodule openconfig-aft-pf {
+ belongs-to "openconfig-aft" {
+ prefix "oc-aft";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-inet-types { prefix "oc-inet"; }
+ import openconfig-yang-types { prefix "oc-yang"; }
+ import openconfig-mpls-types { prefix "oc-mplst"; }
+ import openconfig-packet-match-types {
+ prefix "oc-pkt-match-types";
+ }
+
+ // Include common cross-AFT groupings from the common submodule.
+ include openconfig-aft-common;
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Submodule containing definitions of groupings for the abstract
+ forwarding table(s) for policy forwarding entries. These are
+ defined to be forwarding tables that allow matches on
+ fields other than the destination address that is used in
+ other forwarding tables.";
+
+ oc-ext:openconfig-version "0.3.1";
+
+ revision 2017-08-24 {
+ description
+ "Formatting fixes";
+ reference "0.3.1";
+ }
+
+ revision 2017-05-10 {
+ description
+ "Refactor to provide concretised per-AF schemas per AFT.";
+ reference "0.3.0";
+ }
+
+ grouping aft-pf-structural {
+ description
+ "Structural grouping defining the schema for the policy
+ forwarding abstract forwarding table.";
+
+ list policy-forwarding-entry {
+ key "index";
+
+ description
+ "List of the policy forwarding entries within the abstract
+ forwarding table. Each entry is uniquely identified by an
+ index on the system, due to the arbitrary match conditions
+ that may be implemented within the policy forwarding AFT.
+ The index may change upon changes of the entry if, and only
+ if, the device exporting the AFT replaces the entire entry
+ by removing the previous entry and replacing it with a
+ subsequent updated version.";
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+ description
+ "Reference to the arbitary index for the policy forwarding
+ AFT entry.";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the Policy forwarding
+ AFT entry.";
+ uses aft-pf-entry-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for the Policy Forwarding
+ AFT entry.";
+ uses aft-pf-entry-config;
+ uses aft-pf-entry-state;
+ }
+ }
+ }
+
+ grouping aft-pf-entry-config {
+ description
+ "Configuration parameters for the Policy Forwarding
+ AFT entry.";
+
+ leaf index {
+ type uint64;
+ description
+ "An arbitrary 64-bit index identifying the policy forwarding
+ AFT entry.";
+ }
+
+ leaf ip-prefix {
+ type oc-inet:ip-prefix;
+ description
+ "The IP prefix that the forwarding entry matches.";
+ }
+
+ leaf mac-address {
+ type oc-yang:mac-address;
+ description
+ "The MAC address that the forwarding entry matches. Used for
+ Layer 2 forwarding entries, e.g., within a VSI instance.";
+ }
+
+ leaf mpls-label {
+ type oc-mplst:mpls-label;
+ description
+ "The MPLS label that the forwarding entry matches. Used for
+ MPLS forwarding entries, whereby the local device acts as an
+ LSR.";
+ }
+
+ leaf mpls-tc {
+ type oc-mplst:mpls-tc;
+ description
+ "The value of the MPLS Traffic Class bits (formerly known as
+ the MPLS experimental bits) that are to be matched by the AFT
+ entry.";
+ reference
+ "RFC5462: Multiprotocol Label Switching (MPLS) Label Stack
+ Entry: 'EXP' Field Renamed to 'Traffic Class' Field"; }
+
+ leaf ip-dscp {
+ type oc-inet:dscp;
+ description
+ "The value of the differentiated services code point (DSCP) to
+ be matched for the forwarding entry. The value is specified in
+ cases where specific class-based forwarding based on IP is
+ implemented by the device.";
+ }
+
+ leaf ip-protocol {
+ type oc-pkt-match-types:ip-protocol-type;
+ description
+ "The value of the IP protocol field of an IPv4 packet, or the
+ next-header field of an IPv6 packet which is to be matched by
+ the AFT entry. This field is utilised where forwarding is
+ performed based on L4 information.";
+ }
+
+ leaf l4-src-port {
+ type oc-inet:port-number;
+ description
+ "The value of the source port field of the transport header
+ that is to be matched by the AFT entry.";
+ }
+
+ leaf l4-dst-port {
+ type oc-inet:port-number;
+ description
+ "The value of the destination port field of the transport
+ header that is to be matched by the AFT entry.";
+ }
+ }
+
+ grouping aft-pf-entry-state {
+ description
+ "Operational state parameters for the Policy Forwarding
+ AFT entry.";
+ uses aft-common-entry-state;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aft-types.yang b/src/plugins/yang/openconfig/openconfig-aft-types.yang
new file mode 100644
index 0000000..7af2744
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aft-types.yang
@@ -0,0 +1,58 @@
+module openconfig-aft-types {
+
+ namespace "http://openconfig.net/yang/fib-types";
+ prefix "oc-aftt";
+
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ organization
+ "OpenConfig Working Group";
+
+ contact
+ "OpenConfig Working Group
+ www.openconfig.net";
+
+ description
+ "Types related to the OpenConfig Abstract Forwarding
+ Table (AFT) model";
+
+ oc-ext:openconfig-version "0.3.1";
+
+ revision 2017-08-24 {
+ description
+ "Formatting fixes";
+ reference "0.3.1";
+ }
+
+ revision 2017-05-10 {
+ description
+ "Refactor to provide concretised per-AF schemas per AFT.";
+ reference "0.3.0";
+ }
+
+ typedef encapsulation-header-type {
+ type enumeration {
+ enum GRE {
+ description
+ "The encapsulation header is a Generic Routing Encapsulation
+ header.";
+ }
+ enum IPV4 {
+ description
+ "The encapsulation header is an IPv4 packet header";
+ }
+ enum IPV6 {
+ description
+ "The encapsulation header is an IPv6 packet header";
+ }
+ enum MPLS {
+ description
+ "The encapsulation header is one or more MPLS labels indicated
+ by the pushed and popped label stack lists.";
+ }
+ }
+ description
+ "Types of tunnel encapsulation that are supported by systems as either
+ head- or tail-end.";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-aft.yang b/src/plugins/yang/openconfig/openconfig-aft.yang
new file mode 100644
index 0000000..ef3374d
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-aft.yang
@@ -0,0 +1,144 @@
+module openconfig-aft {
+
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/aft";
+
+ prefix "oc-aft";
+
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ // Include IPv4 AFT submodule.
+ include openconfig-aft-ipv4;
+ // Include IPv6 AFT submodule.
+ include openconfig-aft-ipv6;
+ // Include MPLS AFT submodule.
+ include openconfig-aft-mpls;
+ // Include policy forwarding AFT submodule.
+ include openconfig-aft-pf;
+ // Include the ethernet AFT submodule.
+ include openconfig-aft-ethernet;
+ // Include the common cross-AFT entities.
+ include openconfig-aft-common;
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "A model describing the forwarding entries installed on a network
+ element. It should be noted that this model is not expected to
+ align 1:1 with the underlying structure used directly by a
+ forwarding element (e.g., linecard), but rather provide an
+ abstraction that can be consumed by an NMS to observe, and in some
+ cases manipulate, the internal forwarding database in a simplified
+ manner. Since the underlying model of the forwarding table is not
+ expected to align with this model, the structure described herein
+ is referred to as an Abstract Forwarding Table (AFT), rather than
+ the FIB.";
+
+ oc-ext:openconfig-version "0.3.1";
+
+ revision 2017-08-24 {
+ description
+ "Formatting fixes";
+ reference "0.3.1";
+ }
+
+ revision 2017-05-10 {
+ description
+ "Refactor to provide concretised per-AF schemas per AFT.";
+ reference "0.3.0";
+ }
+
+ // config + state groupings
+
+ // structural groupings
+
+ grouping aft-top {
+ description
+ "Top-level grouping allowing per-protocol instantiation of the
+ AFT.";
+
+ container afts {
+ description
+ "The abstract forwarding tables (AFTs) that are associated
+ with the network instance. An AFT is instantiated per-protocol
+ running within the network-instance - such that one exists for
+ IPv4 Unicast, IPv6 Unicast, MPLS, L2 forwarding entries, etc.
+ A forwarding entry within the FIB has a set of next-hops,
+ which may be a reference to an entry within another table -
+ e.g., where a Layer 3 next-hop has an associated Layer 2
+ forwarding entry.";
+
+ container ipv4-unicast {
+ description
+ "The abstract forwarding table for IPv4 unicast. Entries
+ within this table are uniquely keyed on the IPv4 unicast
+ destination prefix which is matched by ingress packets.
+
+ The data set represented by the IPv4 Unicast AFT is the set
+ of entries from the IPv4 unicast RIB that have been selected
+ for installation into the FIB of the device exporting the
+ data structure.";
+
+ uses aft-ipv4-unicast-structural;
+ }
+
+ container ipv6-unicast {
+ description
+ "The abstract forwarding table for IPv6 unicast. Entries
+ within this table are uniquely keyed on the IPv6 unicast
+ destination prefix which is matched by ingress packets.
+
+ The data set represented by the IPv6 Unicast AFTis the set
+ of entries within the IPv6 RIB that ";
+
+ uses aft-ipv6-unicast-structural;
+
+ }
+
+ container policy-forwarding {
+ description
+ "The abstract forwarding table for policy-based forwarding
+ entries. Since multiple match criteria can be utilised
+ within a policy-based forwarding rule, this AFT provides a
+ flexible match criteria, and is indexed based on an
+ arbitrary 64-bit index. Entries within the AFT may match on
+ multiple field types (e.g., L4 header fields, as well as L2
+ fields).
+
+ Examples of entries within this table are:
+ - IPv4 policy-based routing based on DSCP.
+ - MPLS policy-based forwarding entries.";
+
+ uses aft-pf-structural;
+ }
+
+ container mpls {
+ description
+ "The abstract forwarding table for MPLS label based
+ forwarding entries. Entries within the table are keyed based
+ on the top-most MPLS label in the stack on the ingress
+ packet.";
+
+ uses aft-mpls-structural;
+ }
+
+ container ethernet {
+ description
+ "The abstract forwarding table for Ethernet based forwarding
+ entries. Entries within the table are keyed based on the
+ destination MAC address on the ingress packet.";
+
+ uses aft-ethernet-structural;
+ }
+
+ uses aft-next-hop-groups-structural;
+ uses aft-nhop-structural;
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-alarm-types.yang b/src/plugins/yang/openconfig/openconfig-alarm-types.yang
new file mode 100644
index 0000000..7ec8665
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-alarm-types.yang
@@ -0,0 +1,139 @@
+module openconfig-alarm-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/alarms/types";
+
+ prefix "oc-alarm-types";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines operational state data related to alarms
+ that the device is reporting.
+
+ This model reuses some data items defined in the draft IETF
+ YANG Alarm Module:
+ https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02
+
+ Portions of this code were derived from the draft IETF YANG Alarm
+ Module. 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 "0.2.0";
+
+ revision "2018-01-16" {
+ description
+ "Moved alarm identities into separate types module";
+ reference "0.2.0";
+ }
+
+ // identity statements
+ identity OPENCONFIG_ALARM_TYPE_ID {
+ description
+ "Base identity for alarm type ID profiles";
+ }
+
+ identity AIS {
+ base OPENCONFIG_ALARM_TYPE_ID;
+ description
+ "Defines an alarm indication signal type of alarm";
+ }
+
+ identity EQPT {
+ base OPENCONFIG_ALARM_TYPE_ID;
+ description
+ "Defines an equipment related type of alarm that is specific
+ to the physical hardware";
+ }
+
+ identity LOS {
+ base OPENCONFIG_ALARM_TYPE_ID;
+ description
+ "Defines a loss of signal type of alarm";
+ }
+
+ identity OTS {
+ base OPENCONFIG_ALARM_TYPE_ID;
+ description
+ "Defines a optical transport signal type of alarm";
+ }
+
+ identity OPENCONFIG_ALARM_SEVERITY {
+ description
+ "Base identity for alarm severity profiles. Derived
+ identities are based on contents of the draft
+ IETF YANG Alarm Module";
+ reference
+ "IETF YANG Alarm Module: Draft - typedef severity
+ https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02";
+
+ }
+
+ identity UNKNOWN {
+ base OPENCONFIG_ALARM_SEVERITY;
+ description
+ "Indicates that the severity level could not be determined.
+ This level SHOULD be avoided.";
+ }
+
+ identity MINOR {
+ base OPENCONFIG_ALARM_SEVERITY;
+ description
+ "Indicates the existence of a non-service affecting fault
+ condition and that corrective action should be taken in
+ order to prevent a more serious (for example, service
+ affecting) fault. Such a severity can be reported, for
+ example, when the detected alarm condition is not currently
+ degrading the capacity of the resource";
+ }
+
+ identity WARNING {
+ base OPENCONFIG_ALARM_SEVERITY;
+ description
+ "Indicates the detection of a potential or impending service
+ affecting fault, before any significant effects have been felt.
+ Action should be taken to further diagnose (if necessary) and
+ correct the problem in order to prevent it from becoming a more
+ serious service affecting fault.";
+ }
+
+ identity MAJOR {
+ base OPENCONFIG_ALARM_SEVERITY;
+ description
+ "Indicates that a service affecting condition has developed
+ and an urgent corrective action is required. Such a severity
+ can be reported, for example, when there is a severe
+ degradation in the capability of the resource and its full
+ capability must be restored.";
+ }
+
+ identity CRITICAL {
+ base OPENCONFIG_ALARM_SEVERITY;
+ description
+ "Indicates that a service affecting condition has occurred
+ and an immediate corrective action is required. Such a
+ severity can be reported, for example, when a resource becomes
+ totally out of service and its capability must be restored.";
+ }
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-alarms.yang b/src/plugins/yang/openconfig/openconfig-alarms.yang
new file mode 100644
index 0000000..f1ca587
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-alarms.yang
@@ -0,0 +1,221 @@
+module openconfig-alarms {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/alarms";
+
+ prefix "oc-alarms";
+
+ // import some basic types
+ import openconfig-alarm-types { prefix oc-alarm-types; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-platform { prefix oc-platform; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines operational state data related to alarms
+ that the device is reporting.
+
+ This model reuses some data items defined in the draft IETF
+ YANG Alarm Module:
+ https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02
+
+ Portions of this code were derived from the draft IETF YANG Alarm
+ Module. 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 "0.3.0";
+
+ revision "2018-01-16" {
+ description
+ "Moved alarm identities into separate types module";
+ reference "0.3.0";
+ }
+
+ revision "2018-01-10" {
+ description
+ "Make alarms list read only";
+ reference "0.2.0";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+
+ // grouping statements
+
+ grouping alarm-state {
+ description
+ "Operational state data for device alarms";
+
+ leaf id {
+ type string;
+ description
+ "Unique ID for the alarm -- this will not be a
+ configurable parameter on many implementations";
+ }
+
+ leaf resource {
+ type string;
+ description
+ "The item that is under alarm within the device. The
+ resource may be a reference to an item which is
+ defined elsewhere in the model. For example, it
+ may be a platform/component, interfaces/interface,
+ terminal-device/logical-channels/channel, etc. In this
+ case the system should match the name of the referenced
+ item exactly. The referenced item could alternatively be
+ the path of the item within the model.";
+ reference
+ "IETF YANG Alarm Module: Draft - typedef resource
+ https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02";
+ }
+
+ leaf text {
+ type string;
+ description
+ "The string used to inform operators about the alarm. This
+ MUST contain enough information for an operator to be able
+ to understand the problem. If this string contains structure,
+ this format should be clearly documented for programs to be
+ able to parse that information";
+ reference
+ "IETF YANG Alarm Module: Draft - typedef alarm-text
+ https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02";
+ }
+
+ leaf time-created {
+ type oc-types:timeticks64;
+ description
+ "The time at which the alarm was raised by the system.
+ This value is expressed as nanoseconds since the Unix Epoch";
+ }
+
+ leaf severity {
+ type identityref {
+ base oc-alarm-types:OPENCONFIG_ALARM_SEVERITY;
+ }
+ description
+ "The severity level indicating the criticality and impact
+ of the alarm";
+ reference
+ "IETF YANG Alarm Module: Draft - typedef severity
+ https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02";
+ }
+
+ leaf type-id {
+ type union {
+ type string;
+ type identityref {
+ base oc-alarm-types:OPENCONFIG_ALARM_TYPE_ID;
+ }
+ }
+ description
+ "The abbreviated name of the alarm, for example LOS,
+ EQPT, or OTS. Also referred to in different systems as
+ condition type, alarm identifier, or alarm mnemonic. It
+ is recommended to use the OPENCONFIG_ALARM_TYPE_ID
+ identities where possible and only use the string type
+ when the desired identityref is not yet defined";
+ reference
+ "IETF YANG Alarm Module: Draft - typedef alarm-type-id
+ https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02";
+ }
+ }
+
+ grouping alarm-config {
+ description
+ "Configuration data for device alarms";
+ }
+
+ grouping alarms-top {
+ description
+ "Top-level grouping for device alarms";
+
+ container alarms {
+ description
+ "Top-level container for device alarms";
+
+ config false;
+
+ list alarm {
+ key "id";
+ description
+ "List of alarms, keyed by a unique id";
+
+ leaf id {
+ type leafref {
+ path "../state/id";
+ }
+
+ description
+ "References the unique alarm id";
+ }
+
+ container config {
+ description
+ "Configuration data for each alarm";
+
+ uses alarm-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for a device alarm";
+
+ uses alarm-config;
+ uses alarm-state;
+ }
+ }
+ }
+ }
+
+
+ // augments
+
+ augment "/oc-platform:components/oc-platform:component/oc-platform:state" {
+ description
+ "Adds specific alarms related to a component.";
+
+ leaf equipment-failure {
+ type boolean;
+ default "false";
+ description
+ "If true, the hardware indicates that the component's physical equipment
+ has failed";
+ }
+
+ leaf equipment-mismatch {
+ type boolean;
+ default "false";
+ description
+ "If true, the hardware indicates that the component inserted into the
+ affected component's physical location is of a different type than what
+ is configured";
+ }
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-ap-manager.yang b/src/plugins/yang/openconfig/openconfig-ap-manager.yang
new file mode 100644
index 0000000..6fb3f8f
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-ap-manager.yang
@@ -0,0 +1,220 @@
+module openconfig-ap-manager {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/wifi/ap-manager";
+
+ // Assign this module a prefix to be used by other modules, when imported.
+ prefix "ap-manager";
+
+ // Imports
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-yang-types { prefix oc-yang; }
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-wifi-types { prefix oc-wifi; }
+
+ // Meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines the top level configuration and state data for a
+ system which manages Access Points.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-02-14" {
+ description
+ "Initial version";
+ reference "0.1.0";
+ }
+
+ grouping provision-aps-config {
+ description
+ "Assignment of hostname to an Access Point.";
+
+ leaf mac {
+ type oc-yang:mac-address;
+ description
+ "MAC address of the AP primary Ethernet interface. If AP
+ has multiple Ethernet interfaces, this would be the MAC printed
+ on the unit label and referenced within the management system.
+ Vendors MUST reject attempts to configure this leaf.";
+ }
+
+ leaf hostname {
+ type oc-inet:domain-name;
+ description
+ "Hostname of the Access Point.";
+ }
+
+ leaf country-code {
+ type string {
+ pattern '[A-Z]{2}';
+ }
+ description
+ "Country code where the AP operates in ISO 3166-1 alpha-2
+ format.";
+ }
+ }
+
+ grouping controller-aps-system-state {
+ description
+ "Grouping for a Controller & AP system state data.";
+
+ leaf mac {
+ type oc-yang:mac-address;
+ description
+ "MAC address of the AP primary Ethernet interface. If AP
+ has multiple Ethernet interfaces, this would be the MAC printed
+ on the unit label and referenced within the management system.
+ Vendors MUST reject attempts to configure this leaf.";
+ }
+
+ leaf hostname {
+ type oc-inet:domain-name;
+ description
+ "Hostname of the Access Point.";
+ }
+
+ leaf opstate {
+ type identityref {
+ base oc-wifi:AP_STATE;
+ }
+ description
+ "The current operational state of the AP.";
+ }
+
+ leaf uptime {
+ type uint32;
+ units seconds;
+ description
+ "Seconds this AP has been in the op-state of 'UP'.";
+ }
+
+ leaf enabled {
+ type boolean;
+ description
+ "Wheather the AP is enabled or disabled.";
+ }
+
+ leaf serial {
+ type string;
+ description
+ "Serial number of the Access Point.";
+ }
+
+ leaf model {
+ type string;
+ description
+ "Model number of the Access Point.";
+ }
+
+ leaf ipv4 {
+ type oc-inet:ipv4-address;
+ description
+ "The IPv4 address of the Access Point.";
+ }
+
+ leaf ipv6 {
+ type oc-inet:ipv6-address;
+ description
+ "The IPv6 address of the Access Point.";
+ }
+
+ leaf power-source {
+ type enumeration {
+ enum AT {
+ description "Powered using 802.3at.";
+ }
+ enum AF {
+ description "Powered using 802.3af.";
+ }
+ enum PLUG {
+ description "Powered using local source, not PoE.";
+ }
+ }
+ description
+ "Enumerate how the AP is being powered.";
+ }
+ }
+
+ grouping provision-ap-top {
+ description
+ "Top-level grouping for assigning hostnames to APs.";
+
+ container provision-aps {
+ description
+ "Top most container for assigning hostnames to APs.";
+
+ list provision-ap {
+ key "mac";
+ description
+ "List of MAC addresses that will have hostnames assigned.";
+
+ leaf mac {
+ type leafref {
+ path "../config/mac";
+ }
+ description
+ "Reference to the MAC address list key. This leaf is a reference
+ only and not to be configured.";
+ }
+
+ container config {
+ description
+ "Config container for assigning hostnames to APs.";
+
+ uses provision-aps-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State container for assigning hostnames to APs.";
+
+ uses provision-aps-config;
+ }
+ }
+ }
+ }
+
+ grouping joined-aps-top {
+ description
+ "Top-level grouping for APs assigned to controller(s).";
+
+ container joined-aps {
+ description
+ "Top most container for joined-aps.";
+
+ list joined-ap {
+ key "hostname";
+ config false;
+ description
+ "List of access points that have joined the controller.";
+
+ leaf hostname {
+ type leafref {
+ path "../state/hostname";
+ }
+ description
+ "Reference to the MAC address list key.";
+ }
+
+ container state {
+ config false;
+ description
+ "State container for Joined APs.";
+
+ uses controller-aps-system-state;
+ }
+ }
+ }
+ }
+ uses provision-ap-top;
+ uses joined-aps-top;
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bfd.yang b/src/plugins/yang/openconfig/openconfig-bfd.yang
new file mode 100644
index 0000000..fc573e5
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bfd.yang
@@ -0,0 +1,738 @@
+module openconfig-bfd {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/bfd";
+
+ prefix "oc-bfd";
+
+ // import some basic types
+ import openconfig-extensions { prefix "ocext"; }
+ import openconfig-types { prefix "oc-types"; }
+ import openconfig-interfaces { prefix "oc-if"; }
+ import openconfig-inet-types { prefix "oc-inet"; }
+ import openconfig-if-types { prefix "oc-ift"; }
+ import openconfig-network-instance { prefix "oc-ni"; }
+ import openconfig-policy-types { prefix "oc-pol-types"; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "An OpenConfig model of Bi-Directional Forwarding Detection (BFD)
+ configuration and operational state.";
+
+ ocext:openconfig-version "0.1.0";
+
+ revision "2017-11-17" {
+ description
+ "Update version number for initial sharing.";
+ reference "0.1.0";
+ }
+
+ revision "2017-10-19" {
+ description
+ "Adopt OpenConfig types models, type corrections";
+ reference "0.0.2";
+ }
+
+ revision "2016-06-24" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ typedef bfd-session-state {
+ type enumeration {
+ enum UP {
+ description
+ "The BFD session is perceived to be up by the system.";
+ }
+ enum DOWN {
+ description
+ "The BFD session is perceived to be down by the system.";
+ }
+ enum ADMIN_DOWN {
+ description
+ "The BFD session is administratively disabled.";
+ }
+ enum INIT {
+ description
+ "The BFD session is perceived to be initialising by the
+ system.";
+ }
+ }
+ description
+ "The state of the BFD session according to the system referred
+ to by the context of the leaf.";
+ reference
+ "RFC5880 - Bidirectional Forwarding Detection, Section
+ 4.1";
+ }
+
+ typedef bfd-diagnostic-code {
+ type enumeration {
+ enum NO_DIAGNOSTIC {
+ value 0;
+ description
+ "No diagnostic code was specified, or the session has not
+ changed state.";
+ }
+ enum DETECTION_TIMEOUT {
+ value 1;
+ description
+ "The control detection time expired: no BFD packet was
+ received within the required period.";
+ }
+ enum ECHO_FAILED {
+ value 2;
+ description
+ "The BFD echo function failed - echo packets have not been
+ received for the required period of time.";
+ }
+ enum FORWARDING_RESET {
+ value 3;
+ description
+ "The forwarding plane in the local system was reset - such
+ that the remote system cannot rely on the forwarding state of
+ the device specifying this error code.";
+ }
+ enum PATH_DOWN {
+ value 4;
+ description
+ "Signalling outside of BFD specified that the path underlying
+ this session has failed.";
+ }
+ enum CONCATENATED_PATH_DOWN {
+ value 5;
+ description
+ "When a BFD session runs over a series of path segments, this
+ error code indicates that a subsequent path segment (i.e.,
+ one in the transmit path between the source and destination
+ of the session) has failed.";
+ }
+ enum ADMIN_DOWN {
+ value 6;
+ description
+ "The BFD session has been administratively disabled by the
+ peer.";
+ }
+ enum REVERSE_CONCATENATED_PATH_DOWN {
+ value 7;
+ description
+ "In the case that a BFD session is running over a series of
+ path segments, this error code indicates that a path segment
+ on the reverse path (i.e., in the transmit direction from the
+ destination to the source of the session) has failed.";
+ }
+ }
+ description
+ "Diagnostic codes defined by BFD. These typically indicate the
+ reason for a change of session state.";
+ reference
+ "RFC5880 - Bidirectional Forwarding Detection, Section
+ 4.1";
+ }
+
+
+ grouping bfd-interface-config {
+ description
+ "Top-level per-interface configuration parameters for BFD.";
+
+ leaf id {
+ type string;
+ description
+ "A unique identifier for the interface.";
+ }
+
+ leaf enabled {
+ type boolean;
+ description
+ "When this leaf is set to true then the BFD session is enabled
+ on the specified interface - if it is set to false, it is
+ administratively disabled.";
+ }
+
+ leaf local-address {
+ type oc-inet:ip-address;
+ description
+ "The source IP address to be used for BFD sessions over this
+ interface.";
+ }
+
+ leaf desired-minimum-tx-interval {
+ type uint32;
+ units microseconds;
+ description
+ "The minimum interval between transmission of BFD control
+ packets that the operator desires. This value is advertised to
+ the peer, however the actual interval used is specified by
+ taking the maximum of desired-minimum-tx-interval and the
+ value of the remote required-minimum-receive interval value.
+
+ This value is specified as an integer number of microseconds.";
+ }
+
+ leaf required-minimum-receive {
+ type uint32;
+ units microseconds;
+ description
+ "The minimum interval between received BFD control packets that
+ this system should support. This value is advertised to the
+ remote peer to indicate the maximum frequency (i.e., minimum
+ inter-packet interval) between BFD control packets that is
+ acceptable to the local system.";
+ }
+
+ // rjs: Could have required-minimum-echo-receive here, but this is
+ // generally not configurable.
+
+ leaf detection-multiplier {
+ type uint16 {
+ range "1..max";
+ }
+ description
+ "The number of packets that must be missed to declare this
+ session as down. The detection interval for the BFD session
+ is calculated by multiplying the value of the negotiated
+ transmission interval by this value.";
+ }
+
+ leaf enable-per-member-link {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to true - BFD will be enabled on
+ each member interface of the aggregated Ethernet bundle.";
+
+ when "/oc-if:interfaces/oc-if:interface" +
+ "[name=current()/../../interface-ref/config/interface]/" +
+ "oc-if:state/oc-if:type = 'oc-ift:IF_AGGREGATE'" {
+ description
+ "Include per-member link BFD only when the type of
+ interface is a link aggregate.";
+ }
+ }
+ }
+
+ grouping bfd-interface-state {
+ // placeholder
+ description
+ "Operational state parameters relating to BFD running on an
+ interface.";
+ }
+
+ grouping bfd-session-state-mode-timers-common {
+ description
+ "Common operational state parameters that are re-used across
+ both asynchronous and echo modes of BFD.";
+
+ leaf last-packet-transmitted {
+ type uint64;
+ description
+ "The date and time at which the last BFD packet
+ was transmitted for this session, expressed as the number
+ of nanoseconds since the Unix Epoch (January 1, 1970,
+ 00:00 UTC).";
+ }
+
+ leaf last-packet-received {
+ type uint64;
+ description
+ "The date and time at which the last BFD packet
+ was received for this session, expressed as the number
+ of nanoseconds since the Unix Epoch (January 1, 1970,
+ 00:00 UTC).";
+ }
+
+ leaf transmitted-packets {
+ // TODO: looks to be unsupported on JUNOS
+ type uint64;
+ description
+ "The number of packets that have been transmitted
+ by the local system.";
+ }
+
+ leaf received-packets {
+ // TODO: looks to be unsupported on JUNOS
+ type uint64;
+ description
+ "The number of packets that have been received by the
+ local system from the remote neighbour.";
+ }
+
+ leaf up-transitions {
+ // TODO: looks to only be supported in SROS
+ type uint64;
+ description
+ "The number of times that the adjacency with the neighbor
+ has transitioned into the up state.";
+ }
+ }
+
+ grouping bfd-session-state-sessiondetails-common {
+ description
+ "Common session details for a BFD session.";
+
+ leaf session-state {
+ type bfd-session-state;
+ description
+ "The state of the BFD session perceived by the local system.";
+
+ }
+
+ leaf remote-session-state {
+ type bfd-session-state;
+ description
+ "The reported state of the BFD session according to the remote
+ system. This state reflects the last state reported in a BFD
+ control packet.";
+ }
+
+ leaf last-failure-time {
+ type oc-types:timeticks64;
+ description
+ "The time of the last transition of the BFD session out of
+ the UP state, expressed as the number of nanoseconds since
+ the Unix epoch.";
+ }
+
+ leaf failure-transitions {
+ type uint64;
+ description
+ "The number of times that the BFD session has transitioned
+ out of the UP state.";
+ }
+
+ leaf local-discriminator {
+ type string;
+ description
+ "A unique identifier used by the local system to identify this
+ BFD session.";
+ }
+
+ leaf remote-discriminator {
+ type string;
+ description
+ "A unique identified used by the remote system to identify this
+ BFD session.";
+ }
+
+ leaf local-diagnostic-code {
+ type bfd-diagnostic-code;
+ description
+ "The local BFD diagnostic code indicating the most recent
+ reason for failure of this BFD session.";
+ }
+
+ leaf remote-diagnostic-code {
+ type bfd-diagnostic-code;
+ description
+ "The remote BFD diagnostic code indicating the remote system's
+ reason for failure of the BFD session";
+ }
+
+ leaf remote-minimum-receive-interval {
+ type uint32;
+ description
+ "The value of the minimum receive interval that was specified
+ in the most recent BFD control packet received from the peer.";
+ }
+
+ leaf demand-mode-requested {
+ type boolean;
+ description
+ "This leaf is set to true when the remote system has requested
+ demand mode be run for this session.";
+ }
+
+ leaf remote-authentication-enabled {
+ type boolean;
+ description
+ "This leaf is set to true when the remote system has specified
+ that authentication is present for the BFD session.";
+ }
+
+ leaf remote-control-plane-independent {
+ type boolean;
+ description
+ "This leaf is set to true when the remote system has specified
+ that the hardware implementing this BFD session is independent
+ of the control plane's liveliness.";
+ }
+ }
+
+
+ grouping bfd-session-state-async-common {
+ description
+ "Common parameters for asynchronous BFD sessions";
+
+ container async {
+ description
+ "Operational state parameters specifically relating to
+ asynchronous mode of BFD.";
+
+ uses bfd-session-state-mode-timers-common;
+ }
+ }
+
+ grouping bfd-session-state-echo-common {
+ description
+ "Common parameters for echo-mode BFD sessions.";
+
+ container echo {
+ description
+ "Operational state parameters specifically relating to the
+ echo mode of BFD.";
+
+ leaf active {
+ type boolean;
+ description
+ "This leaf is set to true when echo mode is running between
+ the local and remote system. When it is set to false, solely
+ asynchronous mode is active.";
+ }
+
+ uses bfd-session-state-mode-timers-common;
+ }
+ }
+
+
+ grouping bfd-session-state-common {
+ description
+ "Common operational state parameters that may be re-used across
+ multiple BFD session contexts.";
+
+ leaf local-address {
+ type oc-inet:ip-address;
+ description
+ "The IP address used by the local system for this BFD session.";
+ }
+
+ leaf remote-address {
+ type oc-inet:ip-address;
+ description
+ "The IP address used by the remote system for this BFD session.";
+ }
+
+ leaf-list subscribed-protocols {
+ type identityref {
+ base "oc-pol-types:INSTALL_PROTOCOL_TYPE";
+ }
+ description
+ "Indicates the set of protocols that currently use
+ this BFD session for liveliness detection.";
+ }
+
+ uses bfd-session-state-sessiondetails-common;
+ uses bfd-session-state-echo-common;
+ uses bfd-session-state-async-common;
+ }
+
+ grouping bfd-session-microbfd-common {
+ description
+ "BFD session parameters utilised only for micro-BFD sessions.";
+
+ uses bfd-session-state-sessiondetails-common;
+ uses bfd-session-state-async-common;
+ }
+
+ grouping bfd-interface-peer-state {
+ description
+ "Per-peer, per-interface operational state parameters for BFD.";
+
+ uses bfd-session-state-common;
+ }
+
+ grouping bfd-interface-microbfd-config {
+ description
+ "Configuration parameters for a microBFD session on an
+ interface.";
+
+ leaf local-address {
+ type oc-inet:ip-address;
+ description
+ "The local IP address used by the system for the micro-BFD session
+ specified.";
+ }
+
+ leaf remote-address {
+ type oc-inet:ip-address;
+ description
+ "The remote IP destination that should be used by the system for
+ the micro-BFD session specified.";
+ }
+
+ leaf member-interface {
+ type leafref {
+ path "/oc-if:interfaces/" +
+ "oc-if:interface/oc-if:config/oc-if:name";
+ }
+ // rjs: Note that this does not restrict to only interfaces that
+ // are part of the current LAG. An implementation should return
+ // NOK if such an interface is specified.
+ description
+ "Reference to a member link of the aggregate interface being
+ described.";
+ }
+ }
+
+ grouping bfd-interface-microbfd-state {
+ description
+ "Operational state parameters relating to a micro-BFD session on
+ an interface.";
+
+ uses bfd-session-microbfd-common;
+ }
+
+ grouping bfd-interface-microbfd-structural {
+ description
+ "Structural grouping for micro-bfd configuration and state
+ parameters.";
+
+ container micro-bfd-sessions {
+ description
+ "Parameters relating to micro-BFD sessions associated
+ with the interface.";
+
+ list micro-bfd-session {
+ description
+ "This list contains configuration and state parameters
+ relating to micro-BFD session.";
+ reference
+ "RFC7130 - Bidirectional Forwarding Detection (BFD)
+ on Link Aggregation Group (LAG) Interfaces.";
+
+ key "member-interface";
+
+ leaf member-interface {
+ type leafref {
+ path "../config/member-interface";
+ }
+ description
+ "A reference to the member interface of the link
+ aggregate.";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the micro-BFD session.";
+ uses bfd-interface-microbfd-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for the micro-BFD session.";
+ uses bfd-interface-microbfd-config;
+ uses bfd-interface-microbfd-state;
+ }
+ }
+ when "/oc-if:interfaces/oc-if:interface" +
+ "[name=current()/../interface-ref/config/interface]/" +
+ "oc-if:state/oc-if:type = 'oc-ift:IF_AGGREGATE'" {
+ description
+ "Include per-member link BFD only when the type of
+ interface is a link aggregate.";
+ }
+ }
+ }
+
+ grouping bfd-interface-peer-structural {
+ description
+ "Structural grouping for BFD peers (in the context of an interface).";
+
+ container peers {
+ description
+ "Parameters relating to the BFD peers which are seen
+ over this interface.";
+
+ list peer {
+ key "local-discriminator";
+ config false;
+
+ description
+ "Parameters relating to the BFD peer specified by the
+ remote address.";
+
+ leaf local-discriminator {
+ type leafref {
+ path "../state/local-discriminator";
+ }
+ description
+ "The local discriminator, which is unique for the
+ session on the system.";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for the BFD session.";
+
+ uses bfd-interface-peer-state;
+ }
+ }
+ }
+ }
+
+ grouping bfd-top {
+ description
+ "Structural grouping for Bidirectional Forwarding Detection (BFD).";
+
+ container bfd {
+ description
+ "Configuration and operational state parameters for BFD.";
+ reference "RFC5880, RFC5881";
+
+ container interfaces {
+ description
+ "Interfaces on which BFD sessions are to be enabled.";
+
+ list interface {
+ key "id";
+
+ description
+ "Per-interface configuration and state parameters for BFD.";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "A reference to an identifier for the interface on which
+ BFD is enabled.";
+ }
+
+ container config {
+ description
+ "Configuration parameters for BFD on the specified
+ interface.";
+ uses bfd-interface-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for BFD on the specified
+ interface.";
+ uses bfd-interface-config;
+ uses bfd-interface-state;
+ }
+
+ uses oc-if:interface-ref;
+
+ uses bfd-interface-microbfd-structural;
+ uses bfd-interface-peer-structural;
+ }
+ }
+ }
+ }
+
+ grouping enable-bfd-config {
+ description
+ "Configuration parameters relating to enabling BFD.";
+
+ leaf enabled {
+ type boolean;
+ description
+ "When this leaf is set to true, BFD is used to detect the
+ liveliness of the remote peer or next-hop.";
+ }
+ }
+
+ grouping enable-bfd-state {
+ description
+ "Operational state parameters relating to enabling BFD.";
+
+ leaf associated-session {
+ // TODO: this is a leafref to something unique, but seems
+ // like it might be expensive for the NMS to find out since
+ // it will need to cycle through all interfaces looking for
+ // the associated local-discriminator.
+ type leafref {
+ path "/bfd/interfaces/interface/peers/peer/local-discriminator";
+ }
+ description
+ "A reference to the BFD session that is tracking the liveliness
+ of the remote entity.";
+ }
+
+ //
+ // A fix to the above is to have the following leaf to show which
+ // interface is associated.
+ //
+ // leaf associated-interface {
+ // type leafref {
+ // path "/bfd/interfaces/interface/config/id";
+ // }
+ // }
+ }
+
+ grouping bfd-enable {
+ description
+ "Grouping which can be included in a protocol wishing to enable
+ BFD.";
+
+ container enable-bfd {
+ description
+ "Enable BFD for liveliness detection to the next-hop or
+ neighbour.";
+
+ container config {
+ description
+ "Configuration parameters relating to enabling BFD.";
+
+ uses enable-bfd-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to enabing BFD.";
+
+ uses enable-bfd-config;
+ uses enable-bfd-state;
+ }
+ }
+ }
+
+ // rjs - TODO - should these be specified within each model? The
+ // answer here is probably yes, since otherwise openconfig
+ // network-instance ends up with a circular reference.
+ augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+ "oc-ni:protocols/oc-ni:protocol/oc-ni:bgp/" +
+ "oc-ni:neighbors/oc-ni:neighbor" {
+ description
+ "Augment the BGP routing protocol to add a link to BFD for
+ neighbour detection.";
+
+ uses bfd-enable;
+ }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+ "oc-ni:protocols/oc-ni:protocol/oc-ni:bgp/" +
+ "oc-ni:peer-groups/oc-ni:peer-group" {
+ description
+ "Augment the BGP routing protocol to add a link to BFD for
+ neighbor detection when specified within a peer-group.";
+
+ uses bfd-enable;
+ }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+ "oc-ni:protocols/oc-ni:protocol/oc-ni:static-routes/" +
+ "oc-ni:static/oc-ni:next-hops/oc-ni:next-hop" {
+ description
+ "Augment the static route configuration to allow a next-hop
+ to be tracked by BFD.";
+
+ uses bfd-enable;
+ }
+
+ uses bfd-top;
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bgp-common-multiprotocol.yang b/src/plugins/yang/openconfig/openconfig-bgp-common-multiprotocol.yang
new file mode 100644
index 0000000..6149a7c
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bgp-common-multiprotocol.yang
@@ -0,0 +1,518 @@
+submodule openconfig-bgp-common-multiprotocol {
+
+ belongs-to openconfig-bgp {
+ prefix "oc-bgp";
+ }
+
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-bgp-types { prefix oc-bgp-types; }
+ import openconfig-routing-policy { prefix oc-rpol; }
+ import openconfig-types { prefix oc-types; }
+
+ include openconfig-bgp-common;
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This sub-module contains groupings that are related to support
+ for multiple protocols in BGP. The groupings are common across
+ multiple contexts.";
+
+ oc-ext:openconfig-version "5.0.1";
+
+ revision "2018-08-20" {
+ description
+ "Correct description of AFI-SAFI enabled leaf.";
+ reference "5.0.1";
+ }
+
+ revision "2018-04-11" {
+ description
+ "Correct naming of BGP maximum prefix warning percentage leaf.";
+ reference "5.0.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added SR-TE policy SAFI";
+ reference "4.1.0";
+ }
+
+ revision "2017-07-30" {
+ description
+ "Clarification of add-paths send-max leaf";
+ reference "4.0.1";
+ }
+
+ revision "2017-07-10" {
+ description
+ "Add error notifications; moved add-paths config; add AS
+ prepend policy features; removed unneeded config leaves";
+ reference "4.0.0";
+ }
+
+ revision "2017-02-02" {
+ description
+ "Bugfix to remove remaining global-level policy data";
+ reference "3.0.1";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add dynamic neighbor support, migrate to OpenConfig types";
+ reference "3.0.0";
+ }
+
+ revision "2016-06-21" {
+ description
+ "OpenConfig BGP refactor";
+ reference "2.1.1";
+ }
+
+ grouping bgp-common-mp-afi-safi-graceful-restart-config {
+ description
+ "BGP graceful restart parameters that apply on a per-AFI-SAFI
+ basis";
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "This leaf indicates whether graceful-restart is enabled for
+ this AFI-SAFI";
+ }
+ }
+
+ grouping bgp-common-mp-afi-safi-config {
+ description
+ "Configuration parameters used for all BGP AFI-SAFIs";
+
+ leaf afi-safi-name {
+ type identityref {
+ base oc-bgp-types:AFI_SAFI_TYPE;
+ }
+ description "AFI,SAFI";
+ }
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "This leaf indicates whether the AFI-SAFI is
+ enabled for the neighbour or group";
+ }
+ }
+
+ grouping bgp-common-mp-all-afi-safi-list-contents {
+ description
+ "A common grouping used for contents of the list that is used
+ for AFI-SAFI entries";
+
+ // import and export policy included for the afi/safi
+ uses oc-rpol:apply-policy-group;
+
+ uses bgp-common-mp-ipv4-unicast-group;
+ uses bgp-common-mp-ipv6-unicast-group;
+ uses bgp-common-mp-ipv4-labeled-unicast-group;
+ uses bgp-common-mp-ipv6-labeled-unicast-group;
+ uses bgp-common-mp-l3vpn-ipv4-unicast-group;
+ uses bgp-common-mp-l3vpn-ipv6-unicast-group;
+ uses bgp-common-mp-l3vpn-ipv4-multicast-group;
+ uses bgp-common-mp-l3vpn-ipv6-multicast-group;
+ uses bgp-common-mp-l2vpn-vpls-group;
+ uses bgp-common-mp-l2vpn-evpn-group;
+ uses bgp-common-mp-srte-policy-ipv4-group;
+ uses bgp-common-mp-srte-policy-ipv6-group;
+ }
+
+ // Groupings relating to each address family
+ grouping bgp-common-mp-ipv4-unicast-group {
+ description
+ "Group for IPv4 Unicast configuration options";
+
+ container ipv4-unicast {
+ when "../afi-safi-name = 'oc-bgp-types:IPV4_UNICAST'" {
+ description
+ "Include this container for IPv4 Unicast specific
+ configuration";
+ }
+
+ description "IPv4 unicast configuration options";
+
+ // include common IPv[46] unicast options
+ uses bgp-common-mp-ipv4-ipv6-unicast-common;
+
+ // placeholder for IPv4 unicast specific configuration
+ }
+ }
+
+ grouping bgp-common-mp-ipv6-unicast-group {
+ description
+ "Group for IPv6 Unicast configuration options";
+
+ container ipv6-unicast {
+ when "../afi-safi-name = 'oc-bgp-types:IPV6_UNICAST'" {
+ description
+ "Include this container for IPv6 Unicast specific
+ configuration";
+ }
+
+ description "IPv6 unicast configuration options";
+
+ // include common IPv[46] unicast options
+ uses bgp-common-mp-ipv4-ipv6-unicast-common;
+
+ // placeholder for IPv6 unicast specific configuration
+ // options
+ }
+ }
+
+ grouping bgp-common-mp-ipv4-labeled-unicast-group {
+ description
+ "Group for IPv4 Labeled Unicast configuration options";
+
+ container ipv4-labeled-unicast {
+ when "../afi-safi-name = 'oc-bgp-types:IPV4_LABELED_UNICAST'" {
+ description
+ "Include this container for IPv4 Labeled Unicast specific
+ configuration";
+ }
+
+ description "IPv4 Labeled Unicast configuration options";
+
+ uses bgp-common-mp-all-afi-safi-common;
+
+ // placeholder for IPv4 Labeled Unicast specific config
+ // options
+ }
+ }
+
+ grouping bgp-common-mp-ipv6-labeled-unicast-group {
+ description
+ "Group for IPv6 Labeled Unicast configuration options";
+
+ container ipv6-labeled-unicast {
+ when "../afi-safi-name = 'oc-bgp-types:IPV6_LABELED_UNICAST'" {
+ description
+ "Include this container for IPv6 Labeled Unicast specific
+ configuration";
+ }
+
+ description "IPv6 Labeled Unicast configuration options";
+
+ uses bgp-common-mp-all-afi-safi-common;
+
+ // placeholder for IPv6 Labeled Unicast specific config
+ // options.
+ }
+ }
+
+ grouping bgp-common-mp-l3vpn-ipv4-unicast-group {
+ description
+ "Group for IPv4 Unicast L3VPN configuration options";
+
+ container l3vpn-ipv4-unicast {
+ when "../afi-safi-name = 'oc-bgp-types:L3VPN_IPV4_UNICAST'" {
+ description
+ "Include this container for IPv4 Unicast L3VPN specific
+ configuration";
+ }
+
+ description "Unicast IPv4 L3VPN configuration options";
+
+ // include common L3VPN configuration options
+ uses bgp-common-mp-l3vpn-ipv4-ipv6-unicast-common;
+
+ // placeholder for IPv4 Unicast L3VPN specific config options.
+ }
+ }
+
+ grouping bgp-common-mp-l3vpn-ipv6-unicast-group {
+ description
+ "Group for IPv6 Unicast L3VPN configuration options";
+
+ container l3vpn-ipv6-unicast {
+ when "../afi-safi-name = 'oc-bgp-types:L3VPN_IPV6_UNICAST'" {
+ description
+ "Include this container for unicast IPv6 L3VPN specific
+ configuration";
+ }
+
+ description "Unicast IPv6 L3VPN configuration options";
+
+ // include common L3VPN configuration options
+ uses bgp-common-mp-l3vpn-ipv4-ipv6-unicast-common;
+
+ // placeholder for IPv6 Unicast L3VPN specific configuration
+ // options
+ }
+ }
+
+ grouping bgp-common-mp-l3vpn-ipv4-multicast-group {
+ description
+ "Group for IPv4 L3VPN multicast configuration options";
+
+ container l3vpn-ipv4-multicast {
+ when "../afi-safi-name = 'oc-bgp-types:L3VPN_IPV4_MULTICAST'" {
+ description
+ "Include this container for multicast IPv6 L3VPN specific
+ configuration";
+ }
+
+ description "Multicast IPv4 L3VPN configuration options";
+
+ // include common L3VPN multicast options
+ uses bgp-common-mp-l3vpn-ipv4-ipv6-multicast-common;
+
+ // placeholder for IPv4 Multicast L3VPN specific configuration
+ // options
+ }
+ }
+
+ grouping bgp-common-mp-l3vpn-ipv6-multicast-group {
+ description
+ "Group for IPv6 L3VPN multicast configuration options";
+
+ container l3vpn-ipv6-multicast {
+ when "../afi-safi-name = 'oc-bgp-types:L3VPN_IPV6_MULTICAST'" {
+ description
+ "Include this container for multicast IPv6 L3VPN specific
+ configuration";
+ }
+
+ description "Multicast IPv6 L3VPN configuration options";
+
+ // include common L3VPN multicast options
+ uses bgp-common-mp-l3vpn-ipv4-ipv6-multicast-common;
+
+ // placeholder for IPv6 Multicast L3VPN specific configuration
+ // options
+ }
+ }
+
+ grouping bgp-common-mp-l2vpn-vpls-group {
+ description
+ "Group for BGP-signalled VPLS configuration options";
+
+ container l2vpn-vpls {
+ when "../afi-safi-name = 'oc-bgp-types:L2VPN_VPLS'" {
+ description
+ "Include this container for BGP-signalled VPLS specific
+ configuration";
+ }
+
+ description "BGP-signalled VPLS configuration options";
+
+ // include common L2VPN options
+ uses bgp-common-mp-l2vpn-common;
+
+ // placeholder for BGP-signalled VPLS specific configuration
+ // options
+ }
+ }
+
+ grouping bgp-common-mp-l2vpn-evpn-group {
+ description
+ "Group for BGP EVPN configuration options";
+
+ container l2vpn-evpn {
+ when "../afi-safi-name = 'oc-bgp-types:L2VPN_EVPN'" {
+ description
+ "Include this container for BGP EVPN specific
+ configuration";
+ }
+
+ description "BGP EVPN configuration options";
+
+ // include common L2VPN options
+ uses bgp-common-mp-l2vpn-common;
+
+ // placeholder for BGP EVPN specific configuration options
+ }
+ }
+
+ // Common groupings across multiple AFI,SAFIs
+ grouping bgp-common-mp-all-afi-safi-common {
+ description
+ "Grouping for configuration common to all AFI,SAFI";
+
+ container prefix-limit {
+ description
+ "Configure the maximum number of prefixes that will be
+ accepted from a peer";
+
+ container config {
+ description
+ "Configuration parameters relating to the prefix
+ limit for the AFI-SAFI";
+ uses bgp-common-mp-all-afi-safi-common-prefix-limit-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information relating to the prefix-limit for the
+ AFI-SAFI";
+ uses bgp-common-mp-all-afi-safi-common-prefix-limit-config;
+ }
+ }
+ }
+
+ grouping bgp-common-mp-ipv4-ipv6-unicast-common {
+ description
+ "Common configuration that is applicable for IPv4 and IPv6
+ unicast";
+
+ // include common afi-safi options.
+ uses bgp-common-mp-all-afi-safi-common;
+
+ // configuration options that are specific to IPv[46] unicast
+ container config {
+ description
+ "Configuration parameters for common IPv4 and IPv6 unicast
+ AFI-SAFI options";
+ uses bgp-common-mp-ipv4-ipv6-unicast-common-config;
+ }
+ container state {
+ config false;
+ description
+ "State information for common IPv4 and IPv6 unicast
+ parameters";
+ uses bgp-common-mp-ipv4-ipv6-unicast-common-config;
+ }
+ }
+
+ grouping bgp-common-mp-l3vpn-ipv4-ipv6-unicast-common {
+ description
+ "Common configuration applied across L3VPN for IPv4
+ and IPv6";
+
+ // placeholder -- specific configuration options that are generic
+ // across IPv[46] unicast address families.
+ uses bgp-common-mp-all-afi-safi-common;
+ }
+
+ grouping bgp-common-mp-l3vpn-ipv4-ipv6-multicast-common {
+ description
+ "Common configuration applied across L3VPN for IPv4
+ and IPv6";
+
+ // placeholder -- specific configuration options that are
+ // generic across IPv[46] multicast address families.
+ uses bgp-common-mp-all-afi-safi-common;
+ }
+
+ grouping bgp-common-mp-l2vpn-common {
+ description
+ "Common configuration applied across L2VPN address
+ families";
+
+ // placeholder -- specific configuration options that are
+ // generic across L2VPN address families
+ uses bgp-common-mp-all-afi-safi-common;
+ }
+
+ grouping bgp-common-mp-srte-policy-ipv4-group {
+ description
+ "Grouping for SR-TE for AFI 1";
+
+ container srte-policy-ipv4 {
+ when "../afi-safi-name = 'oc-bgp-types:SRTE_POLICY_IPV4'" {
+ description
+ "Only include this container when the address family is
+ specified to be SR-TE Policy SAFI for the IPv4 unicast
+ address family.";
+ }
+
+ description
+ "Configuration and operational state parameters relating to
+ the SR-TE Policy SAFI for IPv4 Unicast.";
+
+ uses bgp-common-mp-all-afi-safi-common;
+ }
+ }
+
+ grouping bgp-common-mp-srte-policy-ipv6-group {
+ description
+ "Grouping for SR-TE for AFI 2";
+
+ container srte-policy-ipv6 {
+ when "../afi-safi-name = 'oc-bgp-types:SRTE_POLICY_IPV6'" {
+ description
+ "Only include this container when the address family is
+ specified to be SR-TE Policy SAFI for the IPv6 unicast
+ address family.";
+ }
+
+ description
+ "Configuration and operational state parameters relating to
+ the SR-TE Policy SAFI for IPv6 Unicast.";
+
+ uses bgp-common-mp-all-afi-safi-common;
+ }
+ }
+
+ // Config groupings for common groups
+ grouping bgp-common-mp-all-afi-safi-common-prefix-limit-config {
+ description
+ "Configuration parameters relating to prefix-limits for an
+ AFI-SAFI";
+
+ leaf max-prefixes {
+ type uint32;
+ description
+ "Maximum number of prefixes that will be accepted
+ from the neighbour";
+ }
+
+ leaf prevent-teardown {
+ type boolean;
+ default false;
+ description
+ "Do not tear down the BGP session when the maximum
+ prefix limit is exceeded, but rather only log a
+ warning. The default of this leaf is false, such
+ that when it is not specified, the session is torn
+ down.";
+ }
+
+ leaf warning-threshold-pct {
+ type oc-types:percentage;
+ description
+ "Threshold on number of prefixes that can be received
+ from a neighbour before generation of warning messages
+ or log entries. Expressed as a percentage of
+ max-prefixes";
+ }
+
+ leaf restart-timer {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units "seconds";
+ description
+ "Time interval in seconds after which the BGP session
+ is re-established after being torn down due to exceeding
+ the max-prefix limit.";
+ }
+ }
+
+ grouping bgp-common-mp-ipv4-ipv6-unicast-common-config {
+ description
+ "Common configuration parameters for IPv4 and IPv6 Unicast
+ address families";
+
+ leaf send-default-route {
+ type boolean;
+ default "false";
+ description
+ "If set to true, send the default-route to the neighbour(s)";
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bgp-common-structure.yang b/src/plugins/yang/openconfig/openconfig-bgp-common-structure.yang
new file mode 100644
index 0000000..ad11db4
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bgp-common-structure.yang
@@ -0,0 +1,196 @@
+submodule openconfig-bgp-common-structure {
+
+ belongs-to openconfig-bgp {
+ prefix "oc-bgp";
+ }
+
+ import openconfig-extensions { prefix oc-ext; }
+
+ include openconfig-bgp-common-multiprotocol;
+ include openconfig-bgp-common;
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This sub-module contains groupings that are common across multiple BGP
+ contexts and provide structure around other primitive groupings.";
+
+ oc-ext:openconfig-version "5.0.1";
+
+ revision "2018-08-20" {
+ description
+ "Correct description of AFI-SAFI enabled leaf.";
+ reference "5.0.1";
+ }
+
+ revision "2018-04-11" {
+ description
+ "Correct naming of BGP maximum prefix warning percentage leaf.";
+ reference "5.0.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added SR-TE policy SAFI";
+ reference "4.1.0";
+ }
+
+ revision "2017-07-30" {
+ description
+ "Clarification of add-paths send-max leaf";
+ reference "4.0.1";
+ }
+
+ revision "2017-07-10" {
+ description
+ "Add error notifications; moved add-paths config; add AS
+ prepend policy features; removed unneeded config leaves";
+ reference "4.0.0";
+ }
+
+ revision "2017-02-02" {
+ description
+ "Bugfix to remove remaining global-level policy data";
+ reference "3.0.1";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add dynamic neighbor support, migrate to OpenConfig types";
+ reference "3.0.0";
+ }
+
+ revision "2016-06-21" {
+ description
+ "OpenConfig BGP refactor";
+ reference "2.1.1";
+ }
+
+ grouping bgp-common-structure-neighbor-group-logging-options {
+ description
+ "Structural grouping used to include error handling configuration and
+ state for both BGP neighbors and groups";
+
+ container logging-options {
+ description
+ "Logging options for events related to the BGP neighbor or
+ group";
+ container config {
+ description
+ "Configuration parameters enabling or modifying logging
+ for events relating to the BGPgroup";
+ uses bgp-common-neighbor-group-logging-options-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to logging for the BGP neighbor
+ or group";
+ uses bgp-common-neighbor-group-logging-options-config;
+ }
+ }
+ }
+
+ grouping bgp-common-structure-neighbor-group-ebgp-multihop {
+ description
+ "Structural grouping used to include eBGP multihop configuration and
+ state for both BGP neighbors and peer groups";
+
+ container ebgp-multihop {
+ description
+ "eBGP multi-hop parameters for the BGPgroup";
+ container config {
+ description
+ "Configuration parameters relating to eBGP multihop for the
+ BGP group";
+ uses bgp-common-neighbor-group-multihop-config;
+ }
+ container state {
+ config false;
+ description
+ "State information for eBGP multihop, for the BGP neighbor
+ or group";
+ uses bgp-common-neighbor-group-multihop-config;
+ }
+ }
+ }
+
+ grouping bgp-common-structure-neighbor-group-route-reflector {
+ description
+ "Structural grouping used to include route reflector configuration and
+ state for both BGP neighbors and peer groups";
+
+ container route-reflector {
+ description
+ "Route reflector parameters for the BGPgroup";
+ container config {
+ description
+ "Configuraton parameters relating to route reflection
+ for the BGPgroup";
+ uses bgp-common-neighbor-group-route-reflector-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to route reflection for the
+ BGPgroup";
+ uses bgp-common-neighbor-group-route-reflector-config;
+ }
+ }
+ }
+
+ grouping bgp-common-structure-neighbor-group-as-path-options {
+ description
+ "Structural grouping used to include AS_PATH manipulation configuration
+ and state for both BGP neighbors and peer groups";
+
+ container as-path-options {
+ description
+ "AS_PATH manipulation parameters for the BGP neighbor or
+ group";
+ container config {
+ description
+ "Configuration parameters relating to AS_PATH manipulation
+ for the BGP peer or group";
+ uses bgp-common-neighbor-group-as-path-options-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the AS_PATH manipulation
+ mechanisms for the BGP peer or group";
+ uses bgp-common-neighbor-group-as-path-options-config;
+ }
+ }
+ }
+
+ grouping bgp-common-structure-neighbor-group-add-paths {
+ description
+ "Structural grouping used to include ADD-PATHs configuration and state
+ for both BGP neighbors and peer groups";
+
+ container add-paths {
+ description
+ "Parameters relating to the advertisement and receipt of
+ multiple paths for a single NLRI (add-paths)";
+ container config {
+ description
+ "Configuration parameters relating to ADD_PATHS";
+ uses bgp-common-neighbor-group-add-paths-config;
+ }
+ container state {
+ config false;
+ description
+ "State information associated with ADD_PATHS";
+ uses bgp-common-neighbor-group-add-paths-config;
+ }
+ }
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bgp-common.yang b/src/plugins/yang/openconfig/openconfig-bgp-common.yang
new file mode 100644
index 0000000..5194266
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bgp-common.yang
@@ -0,0 +1,665 @@
+submodule openconfig-bgp-common {
+
+ belongs-to openconfig-bgp {
+ prefix "oc-bgp";
+ }
+
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-bgp-types { prefix oc-bgp-types; }
+ import openconfig-routing-policy { prefix oc-rpol; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-inet-types { prefix oc-inet; }
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This sub-module contains common groupings that are common across
+ multiple contexts within the BGP module. That is to say that they
+ may be application to a subset of global, peer-group or neighbor
+ contexts.";
+
+ oc-ext:openconfig-version "5.0.1";
+
+ revision "2018-08-20" {
+ description
+ "Correct description of AFI-SAFI enabled leaf.";
+ reference "5.0.1";
+ }
+
+ revision "2018-04-11" {
+ description
+ "Correct naming of BGP maximum prefix warning percentage leaf.";
+ reference "5.0.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added SR-TE policy SAFI";
+ reference "4.1.0";
+ }
+
+ revision "2017-07-30" {
+ description
+ "Clarification of add-paths send-max leaf";
+ reference "4.0.1";
+ }
+
+ revision "2017-07-10" {
+ description
+ "Add error notifications; moved add-paths config; add AS
+ prepend policy features; removed unneeded config leaves";
+ reference "4.0.0";
+ }
+
+ revision "2017-02-02" {
+ description
+ "Bugfix to remove remaining global-level policy data";
+ reference "3.0.1";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add dynamic neighbor support, migrate to OpenConfig types";
+ reference "3.0.0";
+ }
+
+ revision "2016-06-21" {
+ description
+ "OpenConfig BGP refactor";
+ reference "2.1.1";
+ }
+
+ grouping bgp-common-neighbor-group-timers-config {
+ description
+ "Config parameters related to timers associated with the BGP
+ peer";
+
+ leaf connect-retry {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ default 30;
+ description
+ "Time interval in seconds between attempts to establish a
+ session with the peer.";
+ }
+
+ leaf hold-time {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ default 90;
+ description
+ "Time interval in seconds that a BGP session will be
+ considered active in the absence of keepalive or other
+ messages from the peer. The hold-time is typically
+ set to 3x the keepalive-interval.";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4, Sec. 10";
+ }
+
+ leaf keepalive-interval {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ default 30;
+ description
+ "Time interval in seconds between transmission of keepalive
+ messages to the neighbor. Typically set to 1/3 the
+ hold-time.";
+ }
+
+ leaf minimum-advertisement-interval {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ default 30;
+ description
+ "Minimum time which must elapse between subsequent UPDATE
+ messages relating to a common set of NLRI being transmitted
+ to a peer. This timer is referred to as
+ MinRouteAdvertisementIntervalTimer by RFC 4721 and serves to
+ reduce the number of UPDATE messages transmitted when a
+ particular set of NLRI exhibit instability.";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4, Sec 9.2.1.1";
+ }
+ }
+
+ grouping bgp-common-neighbor-group-config {
+ description
+ "Neighbor level configuration items.";
+
+ leaf peer-as {
+ type oc-inet:as-number;
+ description
+ "AS number of the peer.";
+ }
+
+ leaf local-as {
+ type oc-inet:as-number;
+ description
+ "The local autonomous system number that is to be used
+ when establishing sessions with the remote peer or peer
+ group, if this differs from the global BGP router
+ autonomous system number.";
+ }
+
+ leaf peer-type {
+ type oc-bgp-types:peer-type;
+ description
+ "Explicitly designate the peer or peer group as internal
+ (iBGP) or external (eBGP).";
+ }
+
+ leaf auth-password {
+ type oc-types:routing-password;
+ description
+ "Configures an MD5 authentication password for use with
+ neighboring devices.";
+ }
+
+ leaf remove-private-as {
+ // could also make this a container with a flag to enable
+ // remove-private and separate option. here, option implies
+ // remove-private is enabled.
+ type oc-bgp-types:remove-private-as-option;
+ description
+ "Remove private AS numbers from updates sent to peers - when
+ this leaf is not specified, the AS_PATH attribute should be
+ sent to the peer unchanged";
+ }
+
+ leaf route-flap-damping {
+ type boolean;
+ default false;
+ description
+ "Enable route flap damping.";
+ }
+
+ leaf send-community {
+ type oc-bgp-types:community-type;
+ default "NONE";
+ description
+ "Specify which types of community should be sent to the
+ neighbor or group. The default is to not send the
+ community attribute";
+ }
+
+ leaf description {
+ type string;
+ description
+ "An optional textual description (intended primarily for use
+ with a peer or group";
+ }
+ }
+
+ grouping bgp-common-neighbor-group-transport-config {
+ description
+ "Configuration parameters relating to the transport protocol
+ used by the BGP session to the peer";
+
+ leaf tcp-mss {
+ type uint16;
+ description
+ "Sets the max segment size for BGP TCP sessions.";
+ }
+
+ leaf mtu-discovery {
+ type boolean;
+ default false;
+ description
+ "Turns path mtu discovery for BGP TCP sessions on (true)
+ or off (false)";
+ }
+
+ leaf passive-mode {
+ type boolean;
+ default false;
+ description
+ "Wait for peers to issue requests to open a BGP session,
+ rather than initiating sessions from the local router.";
+ }
+
+ leaf local-address {
+ type union {
+ type oc-inet:ip-address;
+ type string;
+ }
+ //TODO: the string should be converted to a leafref type
+ //to point to an interface when YANG 1.1 is available with
+ //leafrefs in union types.
+ description
+ "Set the local IP (either IPv4 or IPv6) address to use
+ for the session when sending BGP update messages. This
+ may be expressed as either an IP address or reference
+ to the name of an interface.";
+ }
+ }
+
+ grouping bgp-common-neighbor-group-error-handling-config {
+ description
+ "Configuration parameters relating to enhanced error handling
+ behaviours for BGP";
+
+ leaf treat-as-withdraw {
+ type boolean;
+ default "false";
+ description
+ "Specify whether erroneous UPDATE messages for which the
+ NLRI can be extracted are reated as though the NLRI is
+ withdrawn - avoiding session reset";
+ reference "draft-ietf-idr-error-handling-16";
+ }
+ }
+
+ grouping bgp-common-neighbor-group-logging-options-config {
+ description
+ "Configuration parameters specifying the logging behaviour for
+ BGP sessions to the peer";
+
+ leaf log-neighbor-state-changes {
+ type boolean;
+ default "true";
+ description
+ "Configure logging of peer state changes. Default is
+ to enable logging of peer state changes.";
+ }
+ }
+
+ grouping bgp-common-neighbor-group-multihop-config {
+ description
+ "Configuration parameters specifying the multihop behaviour for
+ BGP sessions to the peer";
+
+ leaf enabled {
+ type boolean;
+ default "false";
+ description
+ "When enabled the referenced group or neighbors are permitted
+ to be indirectly connected - including cases where the TTL
+ can be decremented between the BGP peers";
+ }
+
+ leaf multihop-ttl {
+ type uint8;
+ description
+ "Time-to-live value to use when packets are sent to the
+ referenced group or neighbors and ebgp-multihop is enabled";
+ }
+ }
+
+ grouping bgp-common-neighbor-group-route-reflector-config {
+ description
+ "Configuration parameters determining whether the behaviour of
+ the local system when acting as a route-reflector";
+
+ leaf route-reflector-cluster-id {
+ type oc-bgp-types:rr-cluster-id-type;
+ description
+ "route-reflector cluster id to use when local router is
+ configured as a route reflector. Commonly set at the group
+ level, but allows a different cluster
+ id to be set for each neighbor.";
+ }
+
+ leaf route-reflector-client {
+ type boolean;
+ default "false";
+ description
+ "Configure the neighbor as a route reflector client.";
+ }
+ }
+
+ grouping bgp-common-neighbor-group-as-path-options-config {
+ description
+ "Configuration parameters allowing manipulation of the AS_PATH
+ attribute";
+
+ leaf allow-own-as {
+ type uint8;
+ default 0;
+ description
+ "Specify the number of occurrences of the local BGP speaker's
+ AS that can occur within the AS_PATH before it is rejected.";
+ }
+
+ leaf replace-peer-as {
+ type boolean;
+ default "false";
+ description
+ "Replace occurrences of the peer's AS in the AS_PATH
+ with the local autonomous system number";
+ }
+
+ leaf disable-peer-as-filter {
+ type boolean;
+ default "false";
+ description
+ "When set to true, the system advertises routes to a peer
+ even if the peer's AS was in the AS path. The default
+ behavior (false) suppresses advertisements to peers if
+ their AS number is in the AS path of the route.";
+ }
+ }
+
+ grouping bgp-common-neighbor-group-add-paths-config {
+ description
+ "Configuration parameters specfying whether the local system
+ will send or receive multiple paths using ADD_PATHS";
+
+ leaf receive {
+ type boolean;
+ default false;
+ description
+ "Enable capability negotiation to receive multiple path
+ advertisements for an NLRI from the neighbor or group";
+ reference
+ "RFC 7911 - Advertisement of Multiple Paths in BGP";
+ }
+
+ leaf send {
+ type boolean;
+ default false;
+ description
+ "Enable capability negotiation to send multiple path
+ advertisements for an NLRI from the neighbor or group";
+ reference
+ "RFC 7911 - Advertisement of Multiple Paths in BGP";
+ }
+
+ leaf send-max {
+ type uint8;
+ description
+ "The maximum total number of paths to advertise to neighbors
+ for a single NLRI. This includes the single best path as
+ well as additional paths advertised when add-paths is
+ enabled.";
+ }
+
+ leaf eligible-prefix-policy {
+ type leafref {
+ path "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+ "oc-rpol:policy-definition/oc-rpol:name";
+ }
+ description
+ "A reference to a routing policy which can be used to
+ restrict the prefixes for which add-paths is enabled";
+ }
+ }
+
+ grouping bgp-common-graceful-restart-config {
+ description
+ "Configuration parameters relating to BGP graceful restart.";
+
+ leaf enabled {
+ type boolean;
+ description
+ "Enable or disable the graceful-restart capability.";
+ }
+
+ leaf restart-time {
+ type uint16 {
+ range 0..4096;
+ }
+ description
+ "Estimated time (in seconds) for the local BGP speaker to
+ restart a session. This value is advertise in the graceful
+ restart BGP capability. This is a 12-bit value, referred to
+ as Restart Time in RFC4724. Per RFC4724, the suggested
+ default value is <= the hold-time value.";
+ }
+
+ leaf stale-routes-time {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ description
+ "An upper-bound on the time thate stale routes will be
+ retained by a router after a session is restarted. If an
+ End-of-RIB (EOR) marker is received prior to this timer
+ expiring stale-routes will be flushed upon its receipt - if
+ no EOR is received, then when this timer expires stale paths
+ will be purged. This timer is referred to as the
+ Selection_Deferral_Timer in RFC4724";
+ }
+
+ leaf helper-only {
+ type boolean;
+ description
+ "Enable graceful-restart in helper mode only. When this
+ leaf is set, the local system does not retain forwarding
+ its own state during a restart, but supports procedures
+ for the receiving speaker, as defined in RFC4724.";
+ }
+ }
+
+ grouping bgp-common-use-multiple-paths-config {
+ description
+ "Generic configuration options relating to use of multiple
+ paths for a referenced AFI-SAFI, group or neighbor";
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "Whether the use of multiple paths for the same NLRI is
+ enabled for the neighbor. This value is overridden by
+ any more specific configuration value.";
+ }
+ }
+
+ grouping bgp-common-use-multiple-paths-ebgp-as-options-config {
+ description
+ "Configuration parameters specific to eBGP multipath applicable
+ to all contexts";
+
+ leaf allow-multiple-as {
+ type boolean;
+ default "false";
+ description
+ "Allow multipath to use paths from different neighbouring
+ ASes. The default is to only consider multiple paths from
+ the same neighbouring AS.";
+ }
+ }
+
+ grouping bgp-common-global-group-use-multiple-paths {
+ description
+ "Common grouping used for both global and groups which provides
+ configuration and state parameters relating to use of multiple
+ paths";
+
+ container use-multiple-paths {
+ description
+ "Parameters related to the use of multiple paths for the
+ same NLRI";
+
+ container config {
+ description
+ "Configuration parameters relating to multipath";
+ uses bgp-common-use-multiple-paths-config;
+ }
+ container state {
+ config false;
+ description
+ "State parameters relating to multipath";
+ uses bgp-common-use-multiple-paths-config;
+ }
+
+ container ebgp {
+ description
+ "Multipath parameters for eBGP";
+ container config {
+ description
+ "Configuration parameters relating to eBGP multipath";
+ uses bgp-common-use-multiple-paths-ebgp-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to eBGP multipath";
+ uses bgp-common-use-multiple-paths-ebgp-config;
+ }
+ }
+
+ container ibgp {
+ description
+ "Multipath parameters for iBGP";
+ container config {
+ description
+ "Configuration parameters relating to iBGP multipath";
+ uses bgp-common-use-multiple-paths-ibgp-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to iBGP multipath";
+ uses bgp-common-use-multiple-paths-ibgp-config;
+ }
+ }
+ }
+ }
+
+ grouping bgp-common-use-multiple-paths-ebgp-config {
+ description
+ "Configuration parameters relating to multipath for eBGP";
+
+ leaf allow-multiple-as {
+ type boolean;
+ default "false";
+ description
+ "Allow multipath to use paths from different neighbouring
+ ASes. The default is to only consider multiple paths from
+ the same neighbouring AS.";
+ }
+
+ leaf maximum-paths {
+ type uint32;
+ default 1;
+ description
+ "Maximum number of parallel paths to consider when using
+ BGP multipath. The default is use a single path.";
+ }
+ }
+
+ grouping bgp-common-use-multiple-paths-ibgp-config {
+ description
+ "Configuration parmaeters relating to multipath for iBGP";
+
+ leaf maximum-paths {
+ type uint32;
+ default 1;
+ description
+ "Maximum number of parallel paths to consider when using
+ iBGP multipath. The default is to use a single path";
+ }
+ }
+
+ grouping bgp-common-route-selection-options-config {
+ description
+ "Set of configuration options that govern best
+ path selection.";
+
+ leaf always-compare-med {
+ type boolean;
+ default "false";
+ description
+ "Compare multi-exit discriminator (MED) value from
+ different ASes when selecting the best route. The
+ default behavior is to only compare MEDs for paths
+ received from the same AS.";
+ }
+
+ leaf ignore-as-path-length {
+ type boolean;
+ default "false";
+ description
+ "Ignore the AS path length when selecting the best path.
+ The default is to use the AS path length and prefer paths
+ with shorter length.";
+ }
+
+ leaf external-compare-router-id {
+ type boolean;
+ default "true";
+ description
+ "When comparing similar routes received from external
+ BGP peers, use the router-id as a criterion to select
+ the active path.";
+ }
+
+ leaf advertise-inactive-routes {
+ type boolean;
+ default "false";
+ description
+ "Advertise inactive routes to external peers. The
+ default is to only advertise active routes.";
+ }
+
+ leaf enable-aigp {
+ type boolean;
+ default false;
+ description
+ "Flag to enable sending / receiving accumulated IGP
+ attribute in routing updates";
+ }
+
+ leaf ignore-next-hop-igp-metric {
+ type boolean;
+ default "false";
+ description
+ "Ignore the IGP metric to the next-hop when calculating
+ BGP best-path. The default is to select the route for
+ which the metric to the next-hop is lowest";
+ }
+ }
+
+ grouping bgp-common-route-selection-options {
+ description
+ "Configuration and state relating to route selection options";
+
+ container route-selection-options {
+ description
+ "Parameters relating to options for route selection";
+ container config {
+ description
+ "Configuration parameters relating to route selection
+ options";
+ uses bgp-common-route-selection-options-config;
+ }
+ container state {
+ config false;
+ description
+ "State information for the route selection options";
+ uses bgp-common-route-selection-options-config;
+ }
+ }
+ }
+
+ grouping bgp-common-state {
+ description
+ "Grouping containing common counters relating to prefixes and
+ paths";
+
+ leaf total-paths {
+ type uint32;
+ description
+ "Total number of BGP paths within the context";
+ }
+
+ leaf total-prefixes {
+ type uint32;
+ description
+ "Total number of BGP prefixes received within the context";
+ }
+ }
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bgp-errors.yang b/src/plugins/yang/openconfig/openconfig-bgp-errors.yang
new file mode 100644
index 0000000..f53a932
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bgp-errors.yang
@@ -0,0 +1,421 @@
+submodule openconfig-bgp-errors {
+
+ belongs-to openconfig-bgp-types {
+ prefix "oc-bgp-types";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module defines BGP NOTIFICATION message error codes
+ and subcodes";
+
+ oc-ext:openconfig-version "5.0.1";
+
+ revision "2018-08-20" {
+ description
+ "Correct description of AFI-SAFI enabled leaf.";
+ reference "5.0.1";
+ }
+
+ revision "2018-04-11" {
+ description
+ "Correct naming of BGP maximum prefix warning percentage leaf.";
+ reference "5.0.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added SR-TE policy SAFI";
+ reference "4.1.0";
+ }
+
+ revision "2017-07-30" {
+ description
+ "Clarification of add-paths send-max leaf";
+ reference "4.0.1";
+ }
+
+ revision "2017-07-10" {
+ description
+ "Add error notifications; moved add-paths config; add AS
+ prepend policy features; removed unneeded config leaves";
+ reference "4.0.0";
+ }
+
+ identity BGP_ERROR_CODE {
+ description
+ "Indicates the error type in a BGP NOTIFICATION message";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+ }
+
+ identity BGP_ERROR_SUBCODE {
+ description
+ "Provides more specific information about the nature of the
+ error reported in a NOTIFICATION message. Each Error
+ Code may have one or more Error Subcodes associated with it.";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+ }
+
+
+ identity UNSPECIFIC {
+ base BGP_ERROR_SUBCODE;
+ description
+ "The error subcode field is unspecific when the NOTIFICATION
+ message does not include any specific error subcode (i.e..,
+ value 0).";
+ }
+
+ identity MESSAGE_HEADER_ERROR {
+ base BGP_ERROR_CODE;
+ description
+ "Errors detected while processing the Message Header";
+ }
+
+ identity OPEN_MESSAGE_ERROR {
+ base BGP_ERROR_CODE;
+ description
+ "Errors detected while processing the OPEN message";
+ }
+
+ identity UPDATE_MESSAGE_ERROR {
+ base BGP_ERROR_CODE;
+ description
+ "Errors detected while processing the UPDATE message";
+ }
+
+ identity HOLD_TIMER_EXPIRED {
+ base BGP_ERROR_CODE;
+ description
+ "Indicates that the system did not receive successive
+ KEEPALIVE, UPDATE, and/or NOTIFICATION messages within the
+ period specified in the Hold Time field of the OPEN message";
+ }
+
+ identity FINITE_STATE_MACHINE_ERROR {
+ base BGP_ERROR_CODE;
+ description
+ "Error detected by the BGP Finite State Machine
+ (e.g., receipt of an unexpected event)";
+ }
+
+ identity CEASE {
+ base BGP_ERROR_CODE;
+ description
+ "Sent by a BGP peer to close its BGP connection in absence of
+ any fatal errors. If the BGP speaker terminates its
+ connection with a neihbor because the number of prefixes
+ received exceeds the configured upper bound, the speaker must
+ send the neighbor a NOTIFICATION message with the Cease
+ error code.";
+ }
+
+ identity ROUTE_REFRESH_MESSAGE_ERROR {
+ base BGP_ERROR_CODE;
+ description
+ "The length, excluding the fixed-size message header, of the
+ received ROUTE-REFRESH message with Message Subtype 1 and 2 is
+ not 4. Applicable only when a BGP speaker has received the
+ 'Enhanced Route Refresh Capability' from a peer";
+ reference
+ "RFC 7313 - Enhanced Route Refresh Capability for BGP-4";
+ }
+
+ identity MESSAGE_HEADER_SUBCODE {
+ base BGP_ERROR_SUBCODE;
+ description
+ "Error subcode definitions for Message Header error
+ notifications";
+ }
+
+ identity CONNECTION_NOT_SYNCHRONIZED {
+ base MESSAGE_HEADER_SUBCODE;
+ description
+ "Marker field of the message header is not all ones as
+ expected";
+ }
+
+ identity BAD_MESSAGE_LENGTH {
+ base MESSAGE_HEADER_SUBCODE;
+ description
+ "Indicates the message has an erroneous length with one
+ or more of the following:
+
+ - the Length field of the message header is less than 19 or
+ greater than 4096
+
+ - the Length field of an OPEN message is less than the minimum
+ length of the OPEN message
+
+ - the Length field of an UPDATE message is less than the
+ minimum length of the UPDATE message
+
+ - the Length field of a KEEPALIVE message is not equal to 19
+
+ - the Length field of a NOTIFICATION message is less than the
+ minimum length of the NOTIFICATION message
+
+ The erroneous Length field must be reported in the
+ NOTIFICATION data.";
+ }
+
+ identity BAD_MESSAGE_TYPE {
+ base MESSAGE_HEADER_SUBCODE;
+ description
+ "Type field of the message header is not recognized. The
+ erroneous type field must be reported in the NOTIFICATION
+ data";
+ }
+
+ identity OPEN_MESSAGE_SUBCODE {
+ base BGP_ERROR_SUBCODE;
+ description
+ "Error subcode definitions for OPEN message error
+ notifications";
+ }
+
+ identity UNSUPPORTED_VERSION_NUMBER {
+ base OPEN_MESSAGE_SUBCODE;
+ description
+ "Version number in the Version field of the received OPEN
+ message is not supported";
+ }
+
+ identity BAD_PEER_AS {
+ base OPEN_MESSAGE_SUBCODE;
+ description
+ "Autonomous System field of the OPEN message is unacceptable";
+ }
+
+ identity BAD_BGP_IDENTIFIER {
+ base OPEN_MESSAGE_SUBCODE;
+ description
+ "BGP Identifier field of the OPEN message is syntactically
+ incorrect";
+ }
+
+ identity UNSUPPORTED_OPTIONAL_PARAMETER {
+ base OPEN_MESSAGE_SUBCODE;
+ description
+ "One of the Optional Parameters in the OPEN message is not
+ recognized";
+ }
+
+ identity UNACCEPTABLE_HOLD_TIME {
+ base OPEN_MESSAGE_SUBCODE;
+ description
+ "Hold Time field of the OPEN message is unacceptable";
+ }
+
+ identity UNSUPPORTED_CAPABILITY {
+ base OPEN_MESSAGE_SUBCODE;
+ description
+ "Inidicates that the peer does not support capabilities
+ advertisement -- the peer may send this subcode in response to
+ an OPEN message that carries the Capabilities Optional
+ Parameter";
+ reference
+ "RFC 5492 - Capabilities Advertisement with BGP-4";
+ }
+
+ identity UPDATE_MESSAGE_SUBCODE {
+ base BGP_ERROR_SUBCODE;
+ description
+ "Error subcode definitions for UPDATE message error
+ notifications";
+ }
+
+ identity MALFORMED_ATTRIBUTE_LIST {
+ base UPDATE_MESSAGE_SUBCODE;
+ description
+ "Inidicates Withdrawn Routes Length or Total Attribute Length
+ is too large, or
+
+ An attribute appears more than once in the UPDATE message";
+ }
+
+ identity UNRECOGNIZED_WELL_KNOWN_ATTRIBUTE {
+ base UPDATE_MESSAGE_SUBCODE;
+ description
+ "One or more of the well-known mandatory attributes are not
+ recognized";
+ }
+
+ identity MISSING_WELL_KNOWN_ATTRIBUTE {
+ base UPDATE_MESSAGE_SUBCODE;
+ description
+ "One or more of the well-known mandatory attributes are not
+ present";
+ }
+
+ identity ATTRIBUTE_FLAGS_ERROR {
+ base UPDATE_MESSAGE_SUBCODE;
+ description
+ "Attribute has Attribute Flags that conflict with the
+ Attribute Type Code";
+ }
+
+ identity ATTRIBUTE_LENGTH_ERROR {
+ base UPDATE_MESSAGE_SUBCODE;
+ description
+ "Attribute has an Attribute Length that conflicts with the
+ expected length (based on the attribute type code)";
+ }
+
+ identity INVALID_ORIGIN_ATTRIBUTE {
+ base UPDATE_MESSAGE_SUBCODE;
+ description
+ "ORIGIN attribute has an undefined value";
+ }
+
+ identity INVALID_NEXT_HOP_ATTRIBUTE {
+ base UPDATE_MESSAGE_SUBCODE;
+ description
+ "The NEXT_HOP attribute field is syntactically incorrect";
+ }
+
+ identity OPTIONAL_ATTRIBUTE_ERROR {
+ base UPDATE_MESSAGE_SUBCODE;
+ description
+ "An error is detected in the value of a recognized optional
+ attribute (such an attribute must be discarded)";
+ }
+
+ identity INVALID_NETWORK_FIELD {
+ base UPDATE_MESSAGE_SUBCODE;
+ description
+ "The NLRI field in the UPDATE message is syntactically
+ incorrect";
+ }
+
+ identity MALFORMED_AS_PATH {
+ base UPDATE_MESSAGE_SUBCODE;
+ description
+ "The AS_PATH attribute is syntactically incorrect";
+ }
+
+ identity FINITE_STATE_MACHINE_SUBCODE {
+ base BGP_ERROR_SUBCODE;
+ description
+ "Error subcode definitions for BGP finite state machine
+ errors.";
+ reference
+ "RFC 6608 - Subcodes for BGP Finite State Machine Error";
+ }
+
+ identity RECEIVE_UNEXPECTED_MESSAGE_OPENSENT {
+ base FINITE_STATE_MACHINE_SUBCODE;
+ description
+ "The peer BGP speaker received an unexpected message from
+ the local system while the peer speaker session was in the
+ OpenSent state";
+ }
+
+ identity RECEIVE_UNEXPECTED_MESSAGE_OPENCONFIRM {
+ base FINITE_STATE_MACHINE_SUBCODE;
+ description
+ "The peer BGP speaker received an unexpected message from
+ the local system while the peer speaker session was in the
+ OpenConfirm state";
+ }
+
+ identity RECEIVE_UNEXPECTED_MESSAGE_ESTABLISHED {
+ base FINITE_STATE_MACHINE_SUBCODE;
+ description
+ "The peer BGP speaker received an unexpected message from
+ the local system while the peer speaker session was in the
+ Established state";
+ }
+
+ identity CEASE_SUBCODE {
+ base BGP_ERROR_SUBCODE;
+ description
+ "Error subcode definitions for Cease notification messages";
+ reference
+ "RFC 4486 - Subcodes for BGP Cease Notification Message";
+ }
+
+ identity MAX_NUM_PREFIXES_REACHED {
+ base CEASE_SUBCODE;
+ description
+ "The peer BGP speaker terminated its peering with the local
+ system because the number of address prefixes received
+ exceeds a locally configured upper bound";
+ }
+
+ identity ADMINISTRATIVE_SHUTDOWN {
+ base CEASE_SUBCODE;
+ description
+ "The peer BGP speaker administratively shut down its peering
+ with the local system";
+ }
+
+ identity PEER_DE_CONFIGURED {
+ base CEASE_SUBCODE;
+ description
+ "The peer BGP speaker de-configure the peering with the local
+ system";
+ }
+
+ identity ADMINISTRATIVE_RESET {
+ base CEASE_SUBCODE;
+ description
+ "The peer BGP speaker administratively reset the peering with
+ the local system";
+ }
+
+ identity CONNECTION_REJECTED {
+ base CEASE_SUBCODE;
+ description
+ "The peer BGP speaker disallowed the BGP connection to the
+ local system after the peer speaker accepted a transport
+ protocol connection";
+ }
+
+ identity OTHER_CONFIG_CHANGE {
+ base CEASE_SUBCODE;
+ description
+ "The peer BGP speaker administratively reset the peering with
+ the local sytem due to a configuration change that is not
+ covered by another subcode.";
+ }
+
+ identity CONN_COLLISION_RESOLUTION {
+ base CEASE_SUBCODE;
+ description
+ "The peer BGP speaker sent a CEASE NOTIFICATION as a result of
+ the collision resolution procedure described in RFC 4271";
+ }
+
+ identity OUT_OF_RESOURCES {
+ base CEASE_SUBCODE;
+ description
+ "The peer BGP speaker ran out of resources (e.g., memory) and
+ reset the session with the local system";
+ }
+
+ identity ROUTE_REFRESH_SUBCODE {
+ base BGP_ERROR_SUBCODE;
+ description
+ "Error subcode definitions for the ROUTE-REFRESH message
+ error";
+ }
+
+ identity INVALID_MESSAGE_LENGTH {
+ base ROUTE_REFRESH_SUBCODE;
+ description
+ "The length, excluding the fixed-size message header, of the
+ received ROUTE-REFRESH message with Message Subtype 1 and 2
+ is not 4";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bgp-global.yang b/src/plugins/yang/openconfig/openconfig-bgp-global.yang
new file mode 100644
index 0000000..643fba1
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bgp-global.yang
@@ -0,0 +1,389 @@
+submodule openconfig-bgp-global {
+
+ belongs-to openconfig-bgp {
+ prefix "oc-bgp";
+ }
+
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-yang-types { prefix oc-yang; }
+ import openconfig-inet-types { prefix oc-inet; }
+
+ // Include common submodules
+ include openconfig-bgp-common;
+ include openconfig-bgp-common-multiprotocol;
+ include openconfig-bgp-peer-group;
+ include openconfig-bgp-common-structure;
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This sub-module contains groupings that are specific to the
+ global context of the OpenConfig BGP module";
+
+ oc-ext:openconfig-version "5.0.1";
+
+ revision "2018-08-20" {
+ description
+ "Correct description of AFI-SAFI enabled leaf.";
+ reference "5.0.1";
+ }
+
+ revision "2018-04-11" {
+ description
+ "Correct naming of BGP maximum prefix warning percentage leaf.";
+ reference "5.0.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added SR-TE policy SAFI";
+ reference "4.1.0";
+ }
+
+ revision "2017-07-10" {
+ description
+ "Add error notifications; moved add-paths config; add AS
+ prepend policy features; removed unneeded config leaves";
+ reference "4.0.0";
+ }
+
+ revision "2017-02-02" {
+ description
+ "Bugfix to remove remaining global-level policy data";
+ reference "3.0.1";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add dynamic neighbor support, migrate to OpenConfig types";
+ reference "3.0.0";
+ }
+
+ revision "2016-06-21" {
+ description
+ "OpenConfig BGP refactor";
+ reference "2.1.1";
+ }
+
+ grouping bgp-global-config {
+ description
+ "Global configuration options for the BGP router.";
+
+ leaf as {
+ type oc-inet:as-number;
+// mandatory true;
+ description
+ "Local autonomous system number of the router. Uses
+ the 32-bit as-number type from the model in RFC 6991.";
+ }
+
+ leaf router-id {
+ type oc-yang:dotted-quad;
+ description
+ "Router id of the router - an unsigned 32-bit integer
+ expressed in dotted quad notation.";
+ reference
+ "RFC4271 - A Border Gateway Protocol 4 (BGP-4),
+ Section 4.2";
+ }
+ }
+
+ grouping bgp-global-state {
+ description
+ "Operational state parameters for the BGP neighbor";
+
+ uses bgp-common-state;
+ }
+
+ grouping bgp-global-default-route-distance-config {
+ description
+ "Configuration options relating to the administrative distance
+ (or preference) assigned to routes received from different
+ sources (external, internal, and local).";
+
+ leaf external-route-distance {
+ type uint8 {
+ range "1..255";
+ }
+ description
+ "Administrative distance for routes learned from external
+ BGP (eBGP).";
+ }
+ leaf internal-route-distance {
+ type uint8 {
+ range "1..255";
+ }
+ description
+ "Administrative distance for routes learned from internal
+ BGP (iBGP).";
+ }
+ }
+
+ grouping bgp-global-confederation-config {
+ description
+ "Configuration options specifying parameters when the local
+ router is within an autonomous system which is part of a BGP
+ confederation.";
+
+ leaf identifier {
+ type oc-inet:as-number;
+ description
+ "Confederation identifier for the autonomous system.
+ Setting the identifier indicates that the local-AS is part
+ of a BGP confederation.";
+ }
+
+ leaf-list member-as {
+ type oc-inet:as-number;
+ description
+ "Remote autonomous systems that are to be treated
+ as part of the local confederation.";
+ }
+ }
+
+ grouping bgp-global-dynamic-neighbors {
+ description
+ "Grouping containing configuration relating to dynamic peers.";
+
+ container dynamic-neighbor-prefixes {
+ description
+ "A list of IP prefixes from which the system should:
+ - Accept connections to the BGP daemon
+ - Dynamically configure a BGP neighbor corresponding to the
+ source address of the remote system, using the parameters
+ of the specified peer-group.
+ For such neighbors, an entry within the neighbor list should
+ be created, indicating that the peer was dynamically
+ configured, and referencing the peer-group from which the
+ configuration was derived.";
+
+ list dynamic-neighbor-prefix {
+ key "prefix";
+ description
+ "An individual prefix from which dynamic neighbor
+ connections are allowed.";
+
+ leaf prefix {
+ type leafref {
+ path "../config/prefix";
+ }
+ description
+ "Reference to the IP prefix from which source connections
+ are allowed for the dynamic neighbor group.";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the source prefix
+ for the dynamic BGP neighbor connections.";
+
+ uses bgp-global-dynamic-neighbor-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the source
+ prefix for the dynamic BGP neighbor connections.";
+
+ uses bgp-global-dynamic-neighbor-config;
+ }
+ }
+ }
+ }
+
+ grouping bgp-global-dynamic-neighbor-config {
+ description
+ "Configuration parameters relating to an individual prefix from
+ which dynamic neighbors are accepted.";
+
+ leaf prefix {
+ type oc-inet:ip-prefix;
+ description
+ "The IP prefix within which the source address of the remote
+ BGP speaker must fall to be considered eligible to the
+ dynamically configured."; }
+
+ leaf peer-group {
+ type leafref {
+ // At bgp/global/dynamic-neighbor-prefixes/dynamic-neighbor
+ // prefix/config/peer-group
+ path "../../../../../peer-groups/peer-group/config/" +
+ "peer-group-name";
+ }
+ description
+ "The peer-group within which the dynamic neighbor will be
+ configured. The configuration parameters used for the dynamic
+ neighbor are those specified within the referenced peer
+ group.";
+ }
+ }
+
+ grouping bgp-global-mp-all-afi-safi-list-contents {
+ description
+ "A grouping used for contents of the list of AFI-SAFI
+ entries at the global BGP level.";
+
+ // import and export policy included for the afi/safi
+
+ uses bgp-common-mp-ipv4-unicast-group;
+ uses bgp-common-mp-ipv6-unicast-group;
+ uses bgp-common-mp-ipv4-labeled-unicast-group;
+ uses bgp-common-mp-ipv6-labeled-unicast-group;
+ uses bgp-common-mp-l3vpn-ipv4-unicast-group;
+ uses bgp-common-mp-l3vpn-ipv6-unicast-group;
+ uses bgp-common-mp-l3vpn-ipv4-multicast-group;
+ uses bgp-common-mp-l3vpn-ipv6-multicast-group;
+ uses bgp-common-mp-l2vpn-vpls-group;
+ uses bgp-common-mp-l2vpn-evpn-group;
+ uses bgp-common-mp-srte-policy-ipv4-group;
+ uses bgp-common-mp-srte-policy-ipv6-group;
+ }
+
+ grouping bgp-global-afi-safi-list {
+ description
+ "List of address-families associated with the BGP instance";
+
+ list afi-safi {
+ key "afi-safi-name";
+
+ description
+ "AFI,SAFI configuration available for the
+ neighbour or group";
+
+ leaf afi-safi-name {
+ type leafref {
+ path "../config/afi-safi-name";
+ }
+ description
+ "Reference to the AFI-SAFI name used as a key
+ for the AFI-SAFI list";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the AFI-SAFI";
+ uses bgp-common-mp-afi-safi-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the AFI-SAFI";
+ uses bgp-common-mp-afi-safi-config;
+ uses bgp-common-state;
+ }
+
+ container graceful-restart {
+ description
+ "Parameters relating to BGP graceful-restart";
+ container config {
+ description
+ "Configuration options for BGP graceful-restart";
+ uses bgp-common-mp-afi-safi-graceful-restart-config;
+ }
+ container state {
+ config false;
+ description
+ "State information for BGP graceful-restart";
+ uses bgp-common-mp-afi-safi-graceful-restart-config;
+ }
+ }
+
+ uses bgp-common-route-selection-options;
+ uses bgp-common-global-group-use-multiple-paths;
+ uses bgp-common-structure-neighbor-group-add-paths;
+ uses bgp-global-mp-all-afi-safi-list-contents;
+ }
+ }
+
+ // Structural groupings
+ grouping bgp-global-base {
+ description
+ "Global configuration parameters for the BGP router";
+
+ container config {
+ description
+ "Configuration parameters relating to the global BGP router";
+ uses bgp-global-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the global BGP router";
+ uses bgp-global-config;
+ uses bgp-global-state;
+ }
+
+ container default-route-distance {
+ description
+ "Administrative distance (or preference) assigned to
+ routes received from different sources
+ (external, internal, and local).";
+
+ container config {
+ description
+ "Configuration parameters relating to the default route
+ distance";
+ uses bgp-global-default-route-distance-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the default route distance";
+ uses bgp-global-default-route-distance-config;
+ }
+ }
+
+ container confederation {
+ description
+ "Parameters indicating whether the local system acts as part
+ of a BGP confederation";
+
+ container config {
+ description
+ "Configuration parameters relating to BGP confederations";
+ uses bgp-global-confederation-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the BGP confederations";
+ uses bgp-global-confederation-config;
+ }
+ }
+
+ container graceful-restart {
+ description
+ "Parameters relating the graceful restart mechanism for BGP";
+ container config {
+ description
+ "Configuration parameters relating to graceful-restart";
+ uses bgp-common-graceful-restart-config;
+ }
+ container state {
+ config false;
+ description
+ "State information associated with graceful-restart";
+ uses bgp-common-graceful-restart-config;
+ }
+ }
+
+ uses bgp-common-global-group-use-multiple-paths;
+ uses bgp-common-route-selection-options;
+
+ container afi-safis {
+ description
+ "Address family specific configuration";
+ uses bgp-global-afi-safi-list;
+ }
+
+ uses bgp-global-dynamic-neighbors;
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bgp-neighbor.yang b/src/plugins/yang/openconfig/openconfig-bgp-neighbor.yang
new file mode 100644
index 0000000..f7ae33b
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bgp-neighbor.yang
@@ -0,0 +1,704 @@
+submodule openconfig-bgp-neighbor {
+
+ belongs-to openconfig-bgp {
+ prefix "oc-bgp";
+ }
+
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-routing-policy { prefix oc-rpol; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-bgp-types { prefix oc-bgp-types; }
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-yang-types { prefix oc-yang; }
+
+ // Include the common submodule
+ include openconfig-bgp-common;
+ include openconfig-bgp-common-multiprotocol;
+ include openconfig-bgp-peer-group;
+ include openconfig-bgp-common-structure;
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This sub-module contains groupings that are specific to the
+ neighbor context of the OpenConfig BGP module.";
+
+ oc-ext:openconfig-version "5.0.1";
+
+ revision "2018-08-20" {
+ description
+ "Correct description of AFI-SAFI enabled leaf.";
+ reference "5.0.1";
+ }
+
+ revision "2018-04-11" {
+ description
+ "Correct naming of BGP maximum prefix warning percentage leaf.";
+ reference "5.0.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added SR-TE policy SAFI";
+ reference "4.1.0";
+ }
+
+ revision "2017-07-30" {
+ description
+ "Clarification of add-paths send-max leaf";
+ reference "4.0.1";
+ }
+
+ revision "2017-07-10" {
+ description
+ "Add error notifications; moved add-paths config; add AS
+ prepend policy features; removed unneeded config leaves";
+ reference "4.0.0";
+ }
+
+ revision "2017-02-02" {
+ description
+ "Bugfix to remove remaining global-level policy data";
+ reference "3.0.1";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add dynamic neighbor support, migrate to OpenConfig types";
+ reference "3.0.0";
+ }
+
+ revision "2016-06-21" {
+ description
+ "OpenConfig BGP refactor";
+ reference "2.1.1";
+ }
+
+ grouping bgp-neighbor-config {
+ description
+ "Configuration parameters relating to a base BGP neighbor that
+ are not also applicable to any other context
+ (e.g., peer group)";
+
+ leaf peer-group {
+ type leafref {
+ path "../../../../peer-groups/peer-group/peer-group-name";
+ }
+ description
+ "The peer-group with which this neighbor is associated";
+ }
+
+ leaf neighbor-address {
+ type oc-inet:ip-address;
+ description
+ "Address of the BGP peer, either in IPv4 or IPv6";
+ }
+
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Whether the BGP peer is enabled. In cases where the
+ enabled leaf is set to false, the local system should not
+ initiate connections to the neighbor, and should not
+ respond to TCP connections attempts from the neighbor. If
+ the state of the BGP session is ESTABLISHED at the time
+ that this leaf is set to false, the BGP session should be
+ ceased.";
+ }
+ }
+
+ grouping bgp-neighbor-use-multiple-paths {
+ description
+ "Multipath configuration and state applicable to a BGP
+ neighbor";
+
+ container use-multiple-paths {
+ description
+ "Parameters related to the use of multiple-paths for the same
+ NLRI when they are received only from this neighbor";
+
+ container config {
+ description
+ "Configuration parameters relating to multipath";
+ uses bgp-common-use-multiple-paths-config;
+ }
+ container state {
+ config false;
+ description
+ "State parameters relating to multipath";
+ uses bgp-common-use-multiple-paths-config;
+ }
+
+ container ebgp {
+ description
+ "Multipath configuration for eBGP";
+ container config {
+ description
+ "Configuration parameters relating to eBGP multipath";
+ uses bgp-common-use-multiple-paths-ebgp-as-options-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to eBGP multipath";
+ uses bgp-common-use-multiple-paths-ebgp-as-options-config;
+ }
+ }
+ }
+ }
+
+ grouping bgp-neighbor-state {
+ description
+ "Operational state parameters relating only to a BGP neighbor";
+
+ leaf session-state {
+ type enumeration {
+ enum IDLE {
+ description
+ "neighbor is down, and in the Idle state of the
+ FSM";
+ }
+ enum CONNECT {
+ description
+ "neighbor is down, and the session is waiting for
+ the underlying transport session to be established";
+ }
+ enum ACTIVE {
+ description
+ "neighbor is down, and the local system is awaiting
+ a conncetion from the remote peer";
+ }
+ enum OPENSENT {
+ description
+ "neighbor is in the process of being established.
+ The local system has sent an OPEN message";
+ }
+ enum OPENCONFIRM {
+ description
+ "neighbor is in the process of being established.
+ The local system is awaiting a NOTIFICATION or
+ KEEPALIVE message";
+ }
+ enum ESTABLISHED {
+ description
+ "neighbor is up - the BGP session with the peer is
+ established";
+ }
+ }
+ description
+ "Operational state of the BGP peer";
+ }
+
+ leaf last-established {
+ type oc-types:timeticks64;
+ description
+ "This timestamp indicates the time that the
+ BGP session last transitioned in or out of the Established
+ state. The value is the timestamp in seconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).
+
+ The BGP session uptime can be computed by clients as the
+ difference between this value and the current time in UTC
+ (assuming the session is in the ESTABLISHED state, per the
+ session-state leaf).";
+ }
+
+ leaf established-transitions {
+ type oc-yang:counter64;
+ description
+ "Number of transitions to the Established state for
+ the neighbor session. This value is analogous to the
+ bgpPeerFsmEstablishedTransitions object from the standard
+ BGP-4 MIB";
+ reference
+ "RFC 4273 - Definitions of Managed Objects for BGP-4";
+ }
+
+ leaf-list supported-capabilities {
+ type identityref {
+ base oc-bgp-types:BGP_CAPABILITY;
+ }
+ description
+ "BGP capabilities negotiated as supported with the peer";
+ }
+
+ container messages {
+ description
+ "Counters for BGP messages sent and received from the
+ neighbor";
+ container sent {
+ description
+ "Counters relating to BGP messages sent to the neighbor";
+ uses bgp-neighbor-counters-message-types-state;
+ }
+
+ container received {
+ description
+ "Counters for BGP messages received from the neighbor";
+ uses bgp-neighbor-counters-message-types-state;
+ }
+ }
+
+ container queues {
+ description
+ "Counters related to queued messages associated with the
+ BGP neighbor";
+ uses bgp-neighbor-queue-counters-state;
+ }
+
+ leaf dynamically-configured {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to true, the peer was configured dynamically
+ due to an inbound connection request from a specified source prefix
+ within a dynamic-neighbor-prefix.";
+ }
+ }
+
+ grouping bgp-neighbor-counters-message-types-state {
+ description
+ "Grouping of BGP message types, included for re-use
+ across counters";
+
+ leaf UPDATE {
+ type uint64;
+ description
+ "Number of BGP UPDATE messages announcing, withdrawing
+ or modifying paths exchanged.";
+ }
+
+ leaf NOTIFICATION {
+ type uint64;
+ description
+ "Number of BGP NOTIFICATION messages indicating an
+ error condition has occurred exchanged.";
+ }
+
+ leaf last-notification-time {
+ type oc-types:timeticks64;
+ description
+ "This timestamp indicates the time that a NOTIFICATION
+ message was sent or received on the peering session
+ (based on whether this leaf is associated with
+ sent or received messages).
+
+ The value is the timestamp in seconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+
+ leaf last-notification-error-code {
+ type identityref {
+ base oc-bgp-types:BGP_ERROR_CODE;
+ }
+ description
+ "Indicates the last BGP error sent or received on the peering
+ session (based on whether this leaf is associated with
+ sent or received messages).";
+ }
+
+ leaf last-notification-error-subcode {
+ type identityref {
+ base oc-bgp-types:BGP_ERROR_SUBCODE;
+ }
+ description
+ "Indicates the last BGP error subcode sent or received on
+ the peering session (based on whether this leaf is associated
+ with sent or received messages)";
+ }
+ }
+
+ grouping bgp-neighbor-queue-counters-state {
+ description
+ "Counters relating to the message queues associated with the
+ BGP peer";
+
+ leaf input {
+ type uint32;
+ description
+ "The number of messages received from the peer currently
+ queued";
+ }
+
+ leaf output {
+ type uint32;
+ description
+ "The number of messages queued to be sent to the peer";
+ }
+ }
+
+ grouping bgp-neighbor-transport-state {
+ description
+ "Operational state parameters relating to the transport session
+ used for the BGP session";
+
+ leaf local-port {
+ type oc-inet:port-number;
+ description
+ "Local TCP port being used for the TCP session supporting
+ the BGP session";
+ }
+
+ leaf remote-address {
+ type oc-inet:ip-address;
+ description
+ "Remote address to which the BGP session has been
+ established";
+ }
+
+ leaf remote-port {
+ type oc-inet:port-number;
+ description
+ "Remote port being used by the peer for the TCP session
+ supporting the BGP session";
+ }
+ }
+
+ grouping bgp-neighbor-error-handling-state {
+ description
+ "Operational state parameters relating to enhanced error
+ error handling for BGP";
+
+ leaf erroneous-update-messages {
+ type uint32;
+ description
+ "The number of BGP UPDATE messages for which the
+ treat-as-withdraw mechanism has been applied based
+ on erroneous message contents";
+ }
+ }
+
+ grouping bgp-neighbor-timers-state {
+ description
+ "Operational state parameters relating to BGP timers associated
+ with the BGP session";
+
+ leaf negotiated-hold-time {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ description
+ "The negotiated hold-time for the BGP session";
+ }
+ }
+
+ grouping bgp-neighbor-afi-safi-graceful-restart-state {
+ description
+ "Operational state variables relating to the graceful-restart
+ mechanism on a per-AFI-SAFI basis";
+
+ leaf received {
+ type boolean;
+ description
+ "This leaf indicates whether the neighbor advertised the
+ ability to support graceful-restart for this AFI-SAFI";
+ }
+
+ leaf advertised {
+ type boolean;
+ description
+ "This leaf indicates whether the ability to support
+ graceful-restart has been advertised to the peer";
+ }
+ }
+
+ grouping bgp-neighbor-graceful-restart-state {
+ description
+ "Operational state information relevant to graceful restart
+ for BGP";
+
+ leaf peer-restart-time {
+ type uint16 {
+ range 0..4096;
+ }
+ description
+ "The period of time (advertised by the peer) that
+ the peer expects a restart of a BGP session to
+ take";
+ }
+
+ leaf peer-restarting {
+ type boolean;
+ description
+ "This flag indicates whether the remote neighbor is currently
+ in the process of restarting, and hence received routes are
+ currently stale";
+ }
+
+ leaf local-restarting {
+ type boolean;
+ description
+ "This flag indicates whether the local neighbor is currently
+ restarting. The flag is unset after all NLRI have been
+ advertised to the peer, and the End-of-RIB (EOR) marker has
+ been unset";
+ }
+
+ leaf mode {
+ type enumeration {
+ enum HELPER_ONLY {
+ description
+ "The local router is operating in helper-only mode, and
+ hence will not retain forwarding state during a local
+ session restart, but will do so during a restart of the
+ remote peer";
+ }
+ enum BILATERAL {
+ description
+ "The local router is operating in both helper mode, and
+ hence retains forwarding state during a remote restart,
+ and also maintains forwarding state during local session
+ restart";
+ }
+ enum REMOTE_HELPER {
+ description
+ "The local system is able to retain routes during restart
+ but the remote system is only able to act as a helper";
+ }
+ }
+ description
+ "Ths leaf indicates the mode of operation of BGP graceful
+ restart with the peer";
+ }
+ }
+
+ grouping bgp-neighbor-afi-safi-state {
+ description
+ "Operational state parameters relating to an individual AFI,
+ SAFI for a neighbor";
+
+ leaf active {
+ type boolean;
+ description
+ "This value indicates whether a particular AFI-SAFI has
+ been succesfully negotiated with the peer. An AFI-SAFI
+ may be enabled in the current running configuration, but a
+ session restart may be required in order to negotiate the new
+ capability.";
+ }
+
+ container prefixes {
+ description "Prefix counters for the BGP session";
+ leaf received {
+ type uint32;
+ description
+ "The number of prefixes received from the neighbor";
+ }
+
+ leaf sent {
+ type uint32;
+ description
+ "The number of prefixes advertised to the neighbor";
+ }
+
+ leaf installed {
+ type uint32;
+ description
+ "The number of advertised prefixes installed in the
+ Loc-RIB";
+ }
+ }
+ }
+
+ grouping bgp-neighbor-afi-safi-list {
+ description
+ "List of address-families associated with the BGP neighbor";
+
+ list afi-safi {
+ key "afi-safi-name";
+
+ description
+ "AFI,SAFI configuration available for the
+ neighbour or group";
+
+
+ leaf afi-safi-name {
+ type leafref {
+ path "../config/afi-safi-name";
+ }
+ description
+ "Reference to the AFI-SAFI name used as a key
+ for the AFI-SAFI list";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the AFI-SAFI";
+ uses bgp-common-mp-afi-safi-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the AFI-SAFI";
+ uses bgp-common-mp-afi-safi-config;
+ uses bgp-neighbor-afi-safi-state;
+ }
+
+
+ container graceful-restart {
+ description
+ "Parameters relating to BGP graceful-restart";
+ container config {
+ description
+ "Configuration options for BGP graceful-restart";
+ uses bgp-common-mp-afi-safi-graceful-restart-config;
+ }
+ container state {
+ config false;
+ description
+ "State information for BGP graceful-restart";
+ uses bgp-common-mp-afi-safi-graceful-restart-config;
+ uses bgp-neighbor-afi-safi-graceful-restart-state;
+ }
+ }
+
+ uses bgp-common-structure-neighbor-group-add-paths;
+ uses bgp-common-mp-all-afi-safi-list-contents;
+ uses bgp-neighbor-use-multiple-paths;
+ }
+ }
+
+ grouping bgp-neighbor-base {
+ description
+ "Parameters related to a BGP neighbor";
+
+ container config {
+ description
+ "Configuration parameters relating to the BGP neighbor or
+ group";
+ uses bgp-neighbor-config;
+ uses bgp-common-neighbor-group-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the BGP neighbor";
+ uses bgp-neighbor-config;
+ uses bgp-common-neighbor-group-config;
+ uses bgp-neighbor-state;
+ }
+
+ container timers {
+ description
+ "Timers related to a BGP neighbor";
+ container config {
+ description
+ "Configuration parameters relating to timers used for the
+ BGP neighbor";
+ uses bgp-common-neighbor-group-timers-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the timers used for the BGP
+ neighbor";
+ uses bgp-common-neighbor-group-timers-config;
+ uses bgp-neighbor-timers-state;
+ }
+ }
+
+ container transport {
+ description
+ "Transport session parameters for the BGP neighbor";
+ container config {
+ description
+ "Configuration parameters relating to the transport
+ session(s) used for the BGP neighbor";
+ uses bgp-common-neighbor-group-transport-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the transport session(s)
+ used for the BGP neighbor";
+ uses bgp-common-neighbor-group-transport-config;
+ uses bgp-neighbor-transport-state;
+ }
+ }
+
+ container error-handling {
+ description
+ "Error handling parameters used for the BGP neighbor or
+ group";
+ container config {
+ description
+ "Configuration parameters enabling or modifying the
+ behavior or enhanced error handling mechanisms for the BGP
+ neighbor";
+ uses bgp-common-neighbor-group-error-handling-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to enhanced error handling
+ mechanisms for the BGP neighbor";
+ uses bgp-common-neighbor-group-error-handling-config;
+ uses bgp-neighbor-error-handling-state;
+ }
+ }
+
+ container graceful-restart {
+ description
+ "Parameters relating the graceful restart mechanism for BGP";
+ container config {
+ description
+ "Configuration parameters relating to graceful-restart";
+ uses bgp-common-graceful-restart-config;
+ }
+ container state {
+ config false;
+ description
+ "State information associated with graceful-restart";
+ uses bgp-common-graceful-restart-config;
+ uses bgp-neighbor-graceful-restart-state;
+ }
+ }
+
+ uses bgp-common-structure-neighbor-group-logging-options;
+ uses bgp-common-structure-neighbor-group-ebgp-multihop;
+ uses bgp-common-structure-neighbor-group-route-reflector;
+ uses bgp-common-structure-neighbor-group-as-path-options;
+ uses bgp-neighbor-use-multiple-paths;
+ uses oc-rpol:apply-policy-group;
+
+ container afi-safis {
+ description
+ "Per-address-family configuration parameters associated with
+ the neighbor";
+ uses bgp-neighbor-afi-safi-list;
+ }
+ }
+
+ grouping bgp-neighbor-list {
+ description
+ "The list of BGP neighbors";
+
+ list neighbor {
+ key "neighbor-address";
+ description
+ "List of BGP neighbors configured on the local system,
+ uniquely identified by peer IPv[46] address";
+
+ leaf neighbor-address {
+ type leafref {
+ path "../config/neighbor-address";
+ }
+ description
+ "Reference to the address of the BGP neighbor used as
+ a key in the neighbor list";
+ }
+
+ uses bgp-neighbor-base;
+ }
+
+ }
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bgp-peer-group.yang b/src/plugins/yang/openconfig/openconfig-bgp-peer-group.yang
new file mode 100644
index 0000000..b1ba986
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bgp-peer-group.yang
@@ -0,0 +1,271 @@
+submodule openconfig-bgp-peer-group {
+
+ belongs-to openconfig-bgp {
+ prefix "oc-bgp";
+ }
+
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-routing-policy { prefix oc-rpol; }
+
+ // Include the common submodule
+ include openconfig-bgp-common;
+ include openconfig-bgp-common-multiprotocol;
+ include openconfig-bgp-common-structure;
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This sub-module contains groupings that are specific to the
+ peer-group context of the OpenConfig BGP module.";
+
+ oc-ext:openconfig-version "5.0.1";
+
+ revision "2018-08-20" {
+ description
+ "Correct description of AFI-SAFI enabled leaf.";
+ reference "5.0.1";
+ }
+
+ revision "2018-04-11" {
+ description
+ "Correct naming of BGP maximum prefix warning percentage leaf.";
+ reference "5.0.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added SR-TE policy SAFI";
+ reference "4.1.0";
+ }
+
+ revision "2017-07-10" {
+ description
+ "Add error notifications; moved add-paths config; add AS
+ prepend policy features; removed unneeded config leaves";
+ reference "4.0.0";
+ }
+
+ revision "2017-02-02" {
+ description
+ "Bugfix to remove remaining global-level policy data";
+ reference "3.0.1";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add dynamic neighbor support, migrate to OpenConfig types";
+ reference "3.0.0";
+ }
+
+ revision "2016-06-21" {
+ description
+ "OpenConfig BGP refactor";
+ reference "2.1.1";
+ }
+
+ grouping bgp-peer-group-config {
+ description
+ "Configuration parameters relating to a base BGP peer group that
+ are not also applicable to any other context (e.g., neighbor)";
+
+ leaf peer-group-name {
+ type string;
+ description
+ "Name of the BGP peer-group";
+ }
+
+ }
+
+ grouping bgp-peer-group-afi-safi-list {
+ description
+ "List of address-families associated with the BGP peer-group";
+
+ list afi-safi {
+ key "afi-safi-name";
+
+ description
+ "AFI,SAFI configuration available for the
+ neighbour or group";
+
+ leaf afi-safi-name {
+ type leafref {
+ path "../config/afi-safi-name";
+ }
+ description
+ "Reference to the AFI-SAFI name used as a key
+ for the AFI-SAFI list";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the AFI-SAFI";
+ uses bgp-common-mp-afi-safi-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the AFI-SAFI";
+ uses bgp-common-mp-afi-safi-config;
+ }
+
+ container graceful-restart {
+ description
+ "Parameters relating to BGP graceful-restart";
+ container config {
+ description
+ "Configuration options for BGP graceful-restart";
+ uses bgp-common-mp-afi-safi-graceful-restart-config;
+ }
+ container state {
+ config false;
+ description
+ "State information for BGP graceful-restart";
+ uses bgp-common-mp-afi-safi-graceful-restart-config;
+ }
+ }
+
+ uses bgp-common-structure-neighbor-group-add-paths;
+ uses bgp-common-global-group-use-multiple-paths;
+ uses bgp-common-mp-all-afi-safi-list-contents;
+ }
+ }
+
+ grouping bgp-peer-group-base {
+ description
+ "Parameters related to a BGP group";
+
+ container config {
+ description
+ "Configuration parameters relating to the BGP neighbor or
+ group";
+ uses bgp-peer-group-config;
+ uses bgp-common-neighbor-group-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the BGP peer-group";
+ uses bgp-peer-group-config;
+ uses bgp-common-neighbor-group-config;
+ uses bgp-common-state;
+ }
+
+ container timers {
+ description
+ "Timers related to a BGP peer-group";
+
+ container config {
+ description
+ "Configuration parameters relating to timers used for the
+ BGP neighbor or peer group";
+ uses bgp-common-neighbor-group-timers-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the timers used for the BGP
+ group";
+ uses bgp-common-neighbor-group-timers-config;
+ }
+ }
+
+ container transport {
+ description
+ "Transport session parameters for the BGP peer-group";
+
+ container config {
+ description
+ "Configuration parameters relating to the transport
+ session(s) used for the BGP neighbor or group";
+ uses bgp-common-neighbor-group-transport-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to the transport session(s)
+ used for the BGP neighbor or group";
+ uses bgp-common-neighbor-group-transport-config;
+ }
+ }
+
+ container error-handling {
+ description
+ "Error handling parameters used for the BGP peer-group";
+
+ container config {
+ description
+ "Configuration parameters enabling or modifying the
+ behavior or enhanced error handling mechanisms for the BGP
+ group";
+ uses bgp-common-neighbor-group-error-handling-config;
+ }
+ container state {
+ config false;
+ description
+ "State information relating to enhanced error handling
+ mechanisms for the BGP group";
+ uses bgp-common-neighbor-group-error-handling-config;
+ }
+ }
+
+ container graceful-restart {
+ description
+ "Parameters relating the graceful restart mechanism for BGP";
+ container config {
+ description
+ "Configuration parameters relating to graceful-restart";
+ uses bgp-common-graceful-restart-config;
+ }
+ container state {
+ config false;
+ description
+ "State information associated with graceful-restart";
+ uses bgp-common-graceful-restart-config;
+ }
+ }
+
+ uses bgp-common-structure-neighbor-group-logging-options;
+ uses bgp-common-structure-neighbor-group-ebgp-multihop;
+ uses bgp-common-structure-neighbor-group-route-reflector;
+ uses bgp-common-structure-neighbor-group-as-path-options;
+ uses bgp-common-global-group-use-multiple-paths;
+ uses oc-rpol:apply-policy-group;
+
+ container afi-safis {
+ description
+ "Per-address-family configuration parameters associated with
+ thegroup";
+ uses bgp-peer-group-afi-safi-list;
+ }
+ }
+
+ grouping bgp-peer-group-list {
+ description
+ "The list of BGP peer groups";
+
+ list peer-group {
+ key "peer-group-name";
+ description
+ "List of BGP peer-groups configured on the local system -
+ uniquely identified by peer-group name";
+
+ leaf peer-group-name {
+ type leafref {
+ path "../config/peer-group-name";
+ }
+ description
+ "Reference to the name of the BGP peer-group used as a
+ key in the peer-group list";
+ }
+
+ uses bgp-peer-group-base;
+ }
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bgp-policy.yang b/src/plugins/yang/openconfig/openconfig-bgp-policy.yang
new file mode 100644
index 0000000..23db9f7
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bgp-policy.yang
@@ -0,0 +1,1210 @@
+module openconfig-bgp-policy {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/bgp-policy";
+
+ prefix "oc-bgp-pol";
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-routing-policy {prefix oc-rpol; }
+ import openconfig-policy-types { prefix oc-pol-types; }
+ import openconfig-bgp-types { prefix oc-bgp-types; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module contains data definitions for BGP routing policy.
+ It augments the base routing-policy module with BGP-specific
+ options for conditions and actions.";
+
+ oc-ext:openconfig-version "5.0.1";
+
+ revision "2018-08-20" {
+ description
+ "Correct description of AFI-SAFI enabled leaf.";
+ reference "5.0.1";
+ }
+
+ revision "2018-04-11" {
+ description
+ "Correct naming of BGP maximum prefix warning percentage leaf.";
+ reference "5.0.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added SR-TE policy SAFI";
+ reference "4.1.0";
+ }
+
+ revision "2017-07-10" {
+ description
+ "Add error notifications; moved add-paths config; add AS
+ prepend policy features; removed unneeded config leaves";
+ reference "4.0.0";
+ }
+
+ revision "2017-02-02" {
+ description
+ "Bugfix to remove remaining global-level policy data";
+ reference "3.0.1";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add dynamic neighbor support, migrate to OpenConfig types";
+ reference "3.0.0";
+ }
+
+ revision "2016-06-21" {
+ description
+ "OpenConfig BGP refactor";
+ reference "2.1.1";
+ }
+
+
+ // typedef statements
+
+ typedef bgp-set-community-option-type {
+ type enumeration {
+ enum ADD {
+ description
+ "add the specified communities to the existing
+ community attribute";
+ }
+ enum REMOVE {
+ description
+ "remove the specified communities from the
+ existing community attribute";
+ }
+ enum REPLACE {
+ description
+ "replace the existing community attribute with
+ the specified communities. If an empty set is
+ specified, this removes the community attribute
+ from the route.";
+ }
+ }
+ description
+ "Type definition for options when setting the community
+ attribute in a policy action";
+ }
+
+ typedef bgp-next-hop-type {
+ type union {
+ type oc-inet:ip-address;
+ type enumeration {
+ enum SELF {
+ description "special designation for local router's own
+ address, i.e., next-hop-self";
+ }
+ }
+ }
+ description
+ "type definition for specifying next-hop in policy actions";
+ }
+
+ typedef bgp-set-med-type {
+ type union {
+ type uint32;
+ type string {
+ pattern '^[+-][0-9]+$';
+ }
+ type enumeration {
+ enum IGP {
+ description "set the MED value to the IGP cost toward the
+ next hop for the route";
+ }
+ }
+ }
+ description
+ "Type definition for specifying how the BGP MED can
+ be set in BGP policy actions. The three choices are to set
+ the MED directly, increment/decrement using +/- notation,
+ and setting it to the IGP cost (predefined value).";
+ }
+
+ // grouping statements
+
+ grouping match-community-config {
+ description
+ "Configuration data for match conditions on communities";
+
+ leaf community-set {
+ type leafref {
+ path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
+ "oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:community-sets/" +
+ "oc-bgp-pol:community-set/oc-bgp-pol:community-set-name";
+ }
+ description
+ "References a defined community set";
+ }
+
+ uses oc-rpol:match-set-options-group;
+ }
+
+ grouping match-community-state {
+ description
+ "Operational state data for match conditions on communities";
+ }
+
+ grouping match-community-top {
+ description
+ "Top-level grouping for match conditions on communities";
+
+ container match-community-set {
+ description
+ "Top-level container for match conditions on communities.
+ Match a referenced community-set according to the logic
+ defined in the match-set-options leaf";
+
+ container config {
+ description
+ "Configuration data for match conditions on communities";
+
+ uses match-community-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses match-community-config;
+ uses match-community-state;
+ }
+ }
+ }
+
+ grouping match-ext-community-config {
+ description
+ "Configuration data for match conditions on extended
+ communities";
+
+ leaf ext-community-set {
+ type leafref {
+ path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
+ "oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:ext-community-sets/" +
+ "oc-bgp-pol:ext-community-set/" +
+ "oc-bgp-pol:ext-community-set-name";
+ }
+ description "References a defined extended community set";
+ }
+
+ uses oc-rpol:match-set-options-group;
+ }
+
+ grouping match-ext-community-state {
+ description
+ "Operational state data for match conditions on extended
+ communities";
+ }
+
+ grouping match-ext-community-top {
+ description
+ "Top-level grouping for match conditions on extended
+ communities";
+
+ container match-ext-community-set {
+ description
+ "Match a referenced extended community-set according to the
+ logic defined in the match-set-options leaf";
+
+ container config {
+ description
+ "Configuration data for match conditions on extended
+ communities";
+
+ uses match-ext-community-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for match conditions on extended
+ communities";
+
+ uses match-ext-community-config;
+ uses match-ext-community-state;
+ }
+ }
+ }
+
+ grouping match-as-path-config {
+ description
+ "Configuration data for match conditions on AS path set";
+
+ leaf as-path-set {
+ type leafref {
+ path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
+ "oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:as-path-sets/" +
+ "oc-bgp-pol:as-path-set/oc-bgp-pol:as-path-set-name";
+ }
+ description "References a defined AS path set";
+ }
+ uses oc-rpol:match-set-options-group;
+ }
+
+ grouping match-as-path-state {
+ description
+ "Operational state data for match conditions on AS path set";
+ }
+
+ grouping match-as-path-top {
+ description
+ "Top-level grouping for match conditions on AS path set";
+
+ container match-as-path-set {
+ description
+ "Match a referenced as-path set according to the logic
+ defined in the match-set-options leaf";
+
+ container config {
+ description
+ "Configuration data for match conditions on AS path set";
+
+ uses match-as-path-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for match conditions on AS
+ path set";
+
+ uses match-as-path-config;
+ uses match-as-path-state;
+ }
+ }
+ }
+
+ grouping bgp-match-set-conditions {
+ description
+ "Condition statement definitions for checking membership in a
+ defined set";
+
+ uses match-community-top;
+ uses match-ext-community-top;
+ uses match-as-path-top;
+ }
+
+ grouping community-count-config {
+ description
+ "Configuration data for community count condition";
+
+ uses oc-pol-types:attribute-compare-operators;
+ }
+
+ grouping community-count-state {
+ description
+ "Operational state data for community count condition";
+ }
+
+ grouping community-count-top {
+ description
+ "Top-level grouping for community count condition";
+
+ container community-count {
+ description
+ "Value and comparison operations for conditions based on the
+ number of communities in the route update";
+
+ container config {
+ description
+ "Configuration data for community count condition";
+
+ uses community-count-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for community count condition";
+
+ uses community-count-config;
+ uses community-count-state;
+ }
+ }
+ }
+
+ grouping as-path-length-config {
+ description
+ "Configuration data for AS path length condition";
+
+ uses oc-pol-types:attribute-compare-operators;
+ }
+
+ grouping as-path-length-state {
+ description
+ "Operational state data for AS path length condition";
+ }
+
+ grouping as-path-length-top {
+ description
+ "Top-level grouping for AS path length condition";
+
+ container as-path-length {
+ description
+ "Value and comparison operations for conditions based on the
+ length of the AS path in the route update";
+
+ container config {
+ description
+ "Configuration data for AS path length condition";
+
+ uses as-path-length-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for AS path length condition";
+
+ uses as-path-length-config;
+ uses as-path-length-state;
+ }
+ }
+ }
+
+ grouping bgp-conditions-config {
+ description
+ "Configuration data for BGP-specific policy conditions";
+
+ leaf med-eq {
+ type uint32;
+ description
+ "Condition to check if the received MED value is equal to
+ the specified value";
+ }
+
+ leaf origin-eq {
+ type oc-bgp-types:bgp-origin-attr-type;
+ description
+ "Condition to check if the route origin is equal to the
+ specified value";
+ }
+
+ leaf-list next-hop-in {
+ type oc-inet:ip-address;
+ description
+ "List of next hop addresses to check for in the route
+ update";
+ }
+
+ leaf-list afi-safi-in {
+ type identityref {
+ base oc-bgp-types:AFI_SAFI_TYPE;
+ }
+ description
+ "List of address families which the NLRI may be
+ within";
+ }
+
+ leaf local-pref-eq {
+ type uint32;
+ // TODO: add support for other comparisons if needed
+ description
+ "Condition to check if the local pref attribute is equal to
+ the specified value";
+ }
+
+ leaf route-type {
+ // TODO: verify extent of vendor support for this comparison
+ type enumeration {
+ enum INTERNAL {
+ description "route type is internal";
+ }
+ enum EXTERNAL {
+ description "route type is external";
+ }
+ }
+ description
+ "Condition to check the route type in the route update";
+ }
+ }
+
+ grouping bgp-conditions-state {
+ description
+ "Operational state data for BGP-specific policy conditions";
+ }
+
+ grouping bgp-conditions-top {
+ description
+ "Top-level grouping for BGP-specific policy conditions";
+
+ container bgp-conditions {
+ description
+ "Top-level container ";
+
+ container config {
+ description
+ "Configuration data for BGP-specific policy conditions";
+
+ uses bgp-conditions-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for BGP-specific policy
+ conditions";
+
+ uses bgp-conditions-config;
+ uses bgp-conditions-state;
+ }
+
+ uses community-count-top;
+ uses as-path-length-top;
+ uses bgp-match-set-conditions;
+ }
+ }
+
+ grouping community-set-config {
+ description
+ "Configuration data for BGP community sets";
+
+ leaf community-set-name {
+ type string;
+ mandatory true;
+ description
+ "name / label of the community set -- this is used to
+ reference the set in match conditions";
+ }
+
+ leaf-list community-member {
+ type union {
+ type oc-bgp-types:bgp-std-community-type;
+ type oc-bgp-types:bgp-community-regexp-type;
+ type oc-bgp-types:bgp-well-known-community-type;
+ }
+ description
+ "members of the community set";
+ }
+ }
+
+ grouping community-set-state {
+ description
+ "Operational state data for BGP community sets";
+ }
+
+ grouping community-set-top {
+ description
+ "Top-level grouping for BGP community sets";
+
+ container community-sets {
+ description
+ "Enclosing container for list of defined BGP community sets";
+
+ list community-set {
+ key "community-set-name";
+ description
+ "List of defined BGP community sets";
+
+ leaf community-set-name {
+ type leafref {
+ path "../config/community-set-name";
+ }
+ description
+ "Reference to list key";
+ }
+
+ container config {
+ description
+ "Configuration data for BGP community sets";
+
+ uses community-set-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for BGP community sets";
+
+ uses community-set-config;
+ uses community-set-state;
+ }
+ }
+ }
+ }
+
+ grouping ext-community-set-config {
+ description
+ "Configuration data for extended BGP community sets";
+
+ leaf ext-community-set-name {
+ type string;
+ description
+ "name / label of the extended community set -- this is
+ used to reference the set in match conditions";
+ }
+
+ leaf-list ext-community-member {
+ type union {
+ type oc-bgp-types:bgp-ext-community-type;
+ type oc-bgp-types:bgp-community-regexp-type;
+ }
+ description
+ "members of the extended community set";
+ }
+ }
+
+ grouping ext-community-set-state {
+ description
+ "Operational state data for extended BGP community sets";
+ }
+
+ grouping ext-community-set-top {
+ description
+ "Top-level grouping for extended BGP community sets";
+
+ container ext-community-sets {
+ description
+ "Enclosing container for list of extended BGP community
+ sets";
+
+ list ext-community-set {
+ key "ext-community-set-name";
+ description
+ "List of defined extended BGP community sets";
+
+ leaf ext-community-set-name {
+ type leafref {
+ path "../config/ext-community-set-name";
+ }
+ description
+ "Reference to list key";
+ }
+
+ container config {
+ description
+ "Configuration data for extended BGP community sets";
+
+ uses ext-community-set-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for extended BGP community sets";
+
+ uses ext-community-set-config;
+ uses ext-community-set-state;
+ }
+ }
+ }
+ }
+
+ grouping as-path-set-config {
+ description
+ "Configuration data for AS path sets";
+
+ leaf as-path-set-name {
+ type string;
+ description
+ "name of the AS path set -- this is used to reference
+ the set in match conditions";
+ }
+
+ leaf-list as-path-set-member {
+ // TODO: need to refine typedef for AS path expressions
+ type string;
+ description
+ "AS path expression -- list of ASes in the set";
+ }
+ }
+
+ grouping as-path-set-state {
+ description
+ "Operational state data for AS path sets";
+ }
+
+ grouping as-path-set-top {
+ description
+ "Top-level grouping for AS path sets";
+
+ container as-path-sets {
+ description
+ "Enclosing container for list of define AS path sets";
+
+ list as-path-set {
+ key "as-path-set-name";
+ description
+ "List of defined AS path sets";
+
+ leaf as-path-set-name {
+ type leafref {
+ path "../config/as-path-set-name";
+ }
+ description
+ "Reference to list key";
+ }
+
+ container config {
+ description
+ "Configuration data for AS path sets";
+
+ uses as-path-set-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for AS path sets";
+
+ uses as-path-set-config;
+ uses as-path-set-state;
+ }
+ }
+ }
+ }
+
+ // augment statements
+
+ augment "/oc-rpol:routing-policy/oc-rpol:defined-sets" {
+ description "adds BGP defined sets container to routing policy
+ model";
+
+ container bgp-defined-sets {
+ description
+ "BGP-related set definitions for policy match conditions";
+
+ uses community-set-top;
+ uses ext-community-set-top;
+ uses as-path-set-top;
+ }
+ }
+
+ grouping as-path-prepend-config {
+ description
+ "Configuration data for the AS path prepend action";
+
+ leaf repeat-n {
+ type uint8 {
+ range 1..max;
+ }
+ description
+ "Number of times to prepend the value specified in the asn
+ leaf to the AS path. If no value is specified by the asn
+ leaf, the local AS number of the system is used. The value
+ should be between 1 and the maximum supported by the
+ implementation.";
+ }
+
+ leaf asn {
+ type oc-inet:as-number;
+ description
+ "The AS number to prepend to the AS path. If this leaf is
+ not specified and repeat-n is set, then the local AS
+ number will be used for prepending.";
+ }
+ }
+
+ grouping as-path-prepend-state {
+ description
+ "Operational state data for the AS path prepend action";
+ }
+
+ grouping as-path-prepend-top {
+ description
+ "Top-level grouping for the AS path prepend action";
+
+ container set-as-path-prepend {
+ description
+ "Action to prepend the specified AS number to the AS-path a
+ specified number of times";
+
+ container config {
+ description
+ "Configuration data for the AS path prepend action";
+
+ uses as-path-prepend-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the AS path prepend action";
+
+ uses as-path-prepend-config;
+ uses as-path-prepend-state;
+ }
+ }
+ }
+
+ grouping set-community-action-common {
+ description
+ "Common leaves for set-community and set-ext-community
+ actions";
+
+ leaf method {
+ type enumeration {
+ enum INLINE {
+ description
+ "The extended communities are specified inline as a
+ list";
+ }
+ enum REFERENCE {
+ description
+ "The extended communities are specified by referencing a
+ defined ext-community set";
+ }
+ }
+ description
+ "Indicates the method used to specify the extended
+ communities for the set-ext-community action";
+ }
+
+ leaf options {
+ type bgp-set-community-option-type;
+ description
+ "Options for modifying the community attribute with
+ the specified values. These options apply to both
+ methods of setting the community attribute.";
+ }
+ }
+
+ grouping set-community-inline-config {
+ description
+ "Configuration data for inline specification of set-community
+ action";
+
+ leaf-list communities {
+ type union {
+ type oc-bgp-types:bgp-std-community-type;
+ type oc-bgp-types:bgp-well-known-community-type;
+ }
+ description
+ "Set the community values for the update inline with
+ a list.";
+ }
+ }
+
+ grouping set-community-inline-state {
+ description
+ "Operational state data or inline specification of
+ set-community action";
+ }
+
+ grouping set-community-inline-top {
+ description
+ "Top-level grouping or inline specification of set-community
+ action";
+
+ container inline {
+ when "../config/method=INLINE" {
+ description
+ "Active only when the set-community method is INLINE";
+ }
+ description
+ "Set the community values for the action inline with
+ a list.";
+
+ container config {
+ description
+ "Configuration data or inline specification of set-community
+ action";
+
+ uses set-community-inline-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data or inline specification of
+ set-community action";
+
+ uses set-community-inline-config;
+ uses set-community-inline-state;
+ }
+ }
+ }
+
+ grouping set-community-reference-config {
+ description
+ "Configuration data for referening a community-set in the
+ set-community action";
+
+ leaf community-set-ref {
+ type leafref {
+ path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
+ "oc-bgp-pol:bgp-defined-sets/" +
+ "oc-bgp-pol:community-sets/oc-bgp-pol:community-set/" +
+ "oc-bgp-pol:community-set-name";
+ }
+ description
+ "References a defined community set by name";
+ }
+ }
+
+ grouping set-community-reference-state {
+ description
+ "Operational state data for referening a community-set in the
+ set-community action";
+ }
+
+ grouping set-community-reference-top {
+ description
+ "Top-level grouping for referening a community-set in the
+ set-community action";
+
+ container reference {
+ when "../config/method=REFERENCE" {
+ description
+ "Active only when the set-community method is REFERENCE";
+ }
+ description
+ "Provide a reference to a defined community set for the
+ set-community action";
+
+ container config {
+ description
+ "Configuration data for referening a community-set in the
+ set-community action";
+
+ uses set-community-reference-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for referening a community-set
+ in the set-community action";
+
+ uses set-community-reference-config;
+ uses set-community-reference-state;
+ }
+ }
+ }
+
+ grouping set-community-action-config {
+ description
+ "Configuration data for the set-community action";
+
+ uses set-community-action-common;
+ }
+
+ grouping set-community-action-state {
+ description
+ "Operational state data for the set-community action";
+ }
+
+ grouping set-community-action-top {
+ description
+ "Top-level grouping for the set-community action";
+
+ container set-community {
+ description
+ "Action to set the community attributes of the route, along
+ with options to modify how the community is modified.
+ Communities may be set using an inline list OR
+ reference to an existing defined set (not both).";
+
+ container config {
+ description
+ "Configuration data for the set-community action";
+
+ uses set-community-action-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the set-community action";
+
+ uses set-community-action-config;
+ uses set-community-action-state;
+ }
+
+ uses set-community-inline-top;
+ uses set-community-reference-top;
+ }
+ }
+
+ grouping set-ext-community-inline-config {
+ description
+ "Configuration data for inline specification of
+ set-ext-community action";
+
+ leaf-list communities {
+ type union {
+ type oc-bgp-types:bgp-ext-community-type;
+ type oc-bgp-types:bgp-well-known-community-type;
+ }
+ description
+ "Set the extended community values for the update inline
+ with a list.";
+ }
+ }
+
+ grouping set-ext-community-inline-state {
+ description
+ "Operational state data or inline specification of
+ set-ext-community action";
+ }
+
+ grouping set-ext-community-inline-top {
+ description
+ "Top-level grouping or inline specification of set-ext-community
+ action";
+
+ container inline {
+ when "../config/method=INLINE" {
+ description
+ "Active only when the set-community method is INLINE";
+ }
+ description
+ "Set the extended community values for the action inline with
+ a list.";
+
+ container config {
+ description
+ "Configuration data or inline specification of
+ set-ext-community action";
+
+ uses set-ext-community-inline-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data or inline specification of
+ set-ext-community action";
+
+ uses set-ext-community-inline-config;
+ uses set-ext-community-inline-state;
+ }
+ }
+ }
+
+ grouping set-ext-community-reference-config {
+ description
+ "Configuration data for referening a extended community-set
+ in the set-ext-community action";
+
+ leaf ext-community-set-ref {
+ type leafref {
+ path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
+ "oc-bgp-pol:bgp-defined-sets/" +
+ "oc-bgp-pol:ext-community-sets/" +
+ "oc-bgp-pol:ext-community-set/" +
+ "oc-bgp-pol:ext-community-set-name";
+ }
+ description
+ "References a defined extended community set by
+ name";
+ }
+ }
+
+ grouping set-ext-community-reference-state {
+ description
+ "Operational state data for referening an extended
+ community-set in the set-ext-community action";
+ }
+
+ grouping set-ext-community-reference-top {
+ description
+ "Top-level grouping for referening an extended community-set
+ in the set-community action";
+
+ container reference {
+ when "../config/method=REFERENCE" {
+ description
+ "Active only when the set-community method is REFERENCE";
+ }
+ description
+ "Provide a reference to an extended community set for the
+ set-ext-community action";
+
+ container config {
+ description
+ "Configuration data for referening an extended
+ community-set in the set-ext-community action";
+
+ uses set-ext-community-reference-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for referening an extended
+ community-set in the set-ext-community action";
+
+ uses set-ext-community-reference-config;
+ uses set-ext-community-reference-state;
+ }
+ }
+ }
+
+ grouping set-ext-community-action-config {
+ description
+ "Configuration data for the set-ext-community action";
+
+ uses set-community-action-common;
+ }
+
+ grouping set-ext-community-action-state {
+ description
+ "Operational state data for the set-ext-community action";
+ }
+
+ grouping set-ext-community-action-top {
+ description
+ "Top-level grouping for the set-ext-community action";
+
+ container set-ext-community {
+ description
+ "Action to set the extended community attributes of the
+ route, along with options to modify how the community is
+ modified. Extended communities may be set using an inline
+ list OR a reference to an existing defined set (but not
+ both).";
+
+ container config {
+ description
+ "Configuration data for the set-ext-community action";
+
+ uses set-ext-community-action-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the set-ext-community action";
+
+ uses set-ext-community-action-config;
+ uses set-ext-community-action-state;
+ }
+ uses set-ext-community-inline-top;
+ uses set-ext-community-reference-top;
+ }
+ }
+
+ grouping bgp-actions-config {
+ description
+ "Configuration data for BGP-specific actions";
+
+ leaf set-route-origin {
+ type oc-bgp-types:bgp-origin-attr-type;
+ description "set the origin attribute to the specified
+ value";
+ }
+
+ leaf set-local-pref {
+ type uint32;
+ description "set the local pref attribute on the route
+ update";
+ }
+
+ leaf set-next-hop {
+ type bgp-next-hop-type;
+ description "set the next-hop attribute in the route update";
+ }
+
+ leaf set-med {
+ type bgp-set-med-type;
+ description "set the med metric attribute in the route
+ update";
+ }
+ }
+
+ grouping bgp-actions-state {
+ description
+ "Operational state data for BGP-specific actions";
+ }
+
+ grouping bgp-actions-top {
+ description
+ "Top-level grouping for BGP-specific actions";
+
+ container bgp-actions {
+ description
+ "Top-level container for BGP-specific actions";
+
+ container config {
+ description
+ "Configuration data for BGP-specific actions";
+
+ uses bgp-actions-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for BGP-specific actions";
+
+ uses bgp-actions-config;
+ uses bgp-actions-state;
+ }
+ uses as-path-prepend-top;
+ uses set-community-action-top;
+ uses set-ext-community-action-top;
+ }
+ }
+
+ augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+ "oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
+ "oc-rpol:conditions" {
+ description
+ "BGP policy conditions added to routing policy module";
+
+ uses bgp-conditions-top;
+ }
+
+ augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+ "oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
+ "oc-rpol:actions" {
+ description "BGP policy actions added to routing policy
+ module";
+
+ uses bgp-actions-top;
+ }
+
+ // rpc statements
+
+ // notification statements
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bgp-types.yang b/src/plugins/yang/openconfig/openconfig-bgp-types.yang
new file mode 100644
index 0000000..0b57480
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bgp-types.yang
@@ -0,0 +1,604 @@
+module openconfig-bgp-types {
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/bgp-types";
+
+ prefix "oc-bgp-types";
+
+ import openconfig-types { prefix "oc-types"; }
+ import openconfig-inet-types { prefix "oc-inet"; }
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ // Include definitions of BGP error notifications
+ include openconfig-bgp-errors;
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module contains general data definitions for use in BGP
+ policy. It can be imported by modules that make use of BGP
+ attributes";
+
+ oc-ext:openconfig-version "5.0.1";
+
+ revision "2018-08-20" {
+ description
+ "Correct description of AFI-SAFI enabled leaf.";
+ reference "5.0.1";
+ }
+
+ revision "2018-04-11" {
+ description
+ "Correct naming of BGP maximum prefix warning percentage leaf.";
+ reference "5.0.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added SR-TE policy SAFI";
+ reference "4.1.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added color extended community";
+ reference "4.0.2";
+ }
+
+ revision "2017-07-30" {
+ description
+ "Clarification of add-paths send-max leaf";
+ reference "4.0.1";
+ }
+
+ revision "2017-07-10" {
+ description
+ "Add error notifications; moved add-paths config; add AS
+ prepend policy features; removed unneeded config leaves";
+ reference "4.0.0";
+ }
+
+ revision "2017-02-02" {
+ description
+ "Bugfix to remove remaining global-level policy data";
+ reference "3.0.1";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add dynamic neighbor support, migrate to OpenConfig types";
+ reference "3.0.0";
+ }
+
+ revision "2016-06-21" {
+ description
+ "OpenConfig BGP refactor";
+ reference "2.1.1";
+ }
+
+
+ identity BGP_CAPABILITY {
+ description "Base identity for a BGP capability";
+ }
+
+ identity MPBGP {
+ base BGP_CAPABILITY;
+ description
+ "Multi-protocol extensions to BGP";
+ reference "RFC2858";
+ }
+
+ identity ROUTE_REFRESH {
+ base BGP_CAPABILITY;
+ description
+ "The BGP route-refresh functionality";
+ reference "RFC2918";
+ }
+
+ identity ASN32 {
+ base BGP_CAPABILITY;
+ description
+ "4-byte (32-bit) AS number functionality";
+ reference "RFC6793";
+ }
+
+ identity GRACEFUL_RESTART {
+ base BGP_CAPABILITY;
+ description
+ "Graceful restart functionality";
+ reference "RFC4724";
+ }
+
+ identity ADD_PATHS {
+ base BGP_CAPABILITY;
+ description
+ "BGP add-paths";
+ reference "draft-ietf-idr-add-paths";
+ }
+
+ identity AFI_SAFI_TYPE {
+ description
+ "Base identity type for AFI,SAFI tuples for BGP-4";
+ reference "RFC4760 - multiprotocol extensions for BGP-4";
+ }
+
+ identity IPV4_UNICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "IPv4 unicast (AFI,SAFI = 1,1)";
+ reference "RFC4760";
+ }
+
+ identity IPV6_UNICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "IPv6 unicast (AFI,SAFI = 2,1)";
+ reference "RFC4760";
+ }
+
+ identity IPV4_LABELED_UNICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "Labeled IPv4 unicast (AFI,SAFI = 1,4)";
+ reference "RFC3107";
+ }
+
+ identity IPV6_LABELED_UNICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "Labeled IPv6 unicast (AFI,SAFI = 2,4)";
+ reference "RFC3107";
+ }
+
+ identity L3VPN_IPV4_UNICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "Unicast IPv4 MPLS L3VPN (AFI,SAFI = 1,128)";
+ reference "RFC4364";
+ }
+
+ identity L3VPN_IPV6_UNICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "Unicast IPv6 MPLS L3VPN (AFI,SAFI = 2,128)";
+ reference "RFC4659";
+ }
+
+ identity L3VPN_IPV4_MULTICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "Multicast IPv4 MPLS L3VPN (AFI,SAFI = 1,129)";
+ reference "RFC6514";
+ }
+
+ identity L3VPN_IPV6_MULTICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "Multicast IPv6 MPLS L3VPN (AFI,SAFI = 2,129)";
+ reference "RFC6514";
+ }
+
+ identity L2VPN_VPLS {
+ base AFI_SAFI_TYPE;
+ description
+ "BGP-signalled VPLS (AFI,SAFI = 25,65)";
+ reference "RFC4761";
+ }
+
+ identity L2VPN_EVPN {
+ base AFI_SAFI_TYPE;
+ description
+ "BGP MPLS Based Ethernet VPN (AFI,SAFI = 25,70)";
+ }
+
+ identity SRTE_POLICY_IPV4 {
+ base AFI_SAFI_TYPE;
+ description
+ "Segment Routing Traffic Engineering (SRTE) Policy
+ for IPv4 (AFI,SAFI = 1,73)";
+ }
+
+ identity SRTE_POLICY_IPV6 {
+ base AFI_SAFI_TYPE;
+ description
+ "Segment Routing Traffic Engineering (SRTE) Policy
+ for IPv6 (AFI,SAFI = 2,73)";
+ }
+
+ identity BGP_WELL_KNOWN_STD_COMMUNITY {
+ description
+ "Reserved communities within the standard community space
+ defined by RFC1997. These communities must fall within the
+ range 0x00000000 to 0xFFFFFFFF";
+ reference "RFC1997";
+ }
+
+ identity NO_EXPORT {
+ base BGP_WELL_KNOWN_STD_COMMUNITY;
+ description
+ "Do not export NLRI received carrying this community outside
+ the bounds of this autonomous system, or this confederation if
+ the local autonomous system is a confederation member AS. This
+ community has a value of 0xFFFFFF01.";
+ reference "RFC1997";
+ }
+
+ identity NO_ADVERTISE {
+ base BGP_WELL_KNOWN_STD_COMMUNITY;
+ description
+ "All NLRI received carrying this community must not be
+ advertised to other BGP peers. This community has a value of
+ 0xFFFFFF02.";
+ reference "RFC1997";
+ }
+
+ identity NO_EXPORT_SUBCONFED {
+ base BGP_WELL_KNOWN_STD_COMMUNITY;
+ description
+ "All NLRI received carrying this community must not be
+ advertised to external BGP peers - including over confederation
+ sub-AS boundaries. This community has a value of 0xFFFFFF03.";
+ reference "RFC1997";
+ }
+
+ identity NOPEER {
+ base BGP_WELL_KNOWN_STD_COMMUNITY;
+ description
+ "An autonomous system receiving NLRI tagged with this community
+ is advised not to readvertise the NLRI to external bi-lateral
+ peer autonomous systems. An AS may also filter received NLRI
+ from bilateral peer sessions when they are tagged with this
+ community value";
+ reference "RFC3765";
+ }
+
+ typedef bgp-session-direction {
+ type enumeration {
+ enum INBOUND {
+ description
+ "Refers to all NLRI received from the BGP peer";
+ }
+ enum OUTBOUND {
+ description
+ "Refers to all NLRI advertised to the BGP peer";
+ }
+ }
+ description
+ "Type to describe the direction of NLRI transmission";
+ }
+
+ typedef bgp-well-known-community-type {
+ type identityref {
+ base BGP_WELL_KNOWN_STD_COMMUNITY;
+ }
+ description
+ "Type definition for well-known IETF community attribute
+ values";
+ reference
+ "IANA Border Gateway Protocol (BGP) Well Known Communities";
+ }
+
+
+ typedef bgp-std-community-type {
+ // TODO: further refine restrictions and allowed patterns
+ // 4-octet value:
+ // <as number> 2 octets
+ // <community value> 2 octets
+ type union {
+ type uint32 {
+ // per RFC 1997, 0x00000000 - 0x0000FFFF and 0xFFFF0000 -
+ // 0xFFFFFFFF are reserved
+ }
+ type string {
+ pattern '^(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]):' +
+ '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+ }
+ }
+ description
+ "Type definition for standard commmunity attributes represented as
+ a integer value, or a string of the form N:M where N and M are
+ integers between 0 and 65535.";
+ reference "RFC 1997 - BGP Communities Attribute";
+ }
+
+ typedef bgp-ext-community-type {
+ type union {
+ type string {
+ // Type 1: 2-octet global and 4-octet local
+ // (AS number) (Integer)
+ pattern '^(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]):' +
+ '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}' +
+ '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+ '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|' +
+ '[1-9][0-9]{1,8}|[0-9])$';
+ }
+ type string {
+ // Type 2: 4-octet global and 2-octet local
+ // (ipv4-address) (integer)
+ pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|' +
+ '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|' +
+ '2[0-4][0-9]|25[0-5]):' +
+ '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+ }
+ type string {
+ // RFC5668: 4-octet global and 2-octet local
+ // (AS number) (integer)
+ pattern '^(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}' +
+ '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+ '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|' +
+ '[1-9][0-9]{1,8}|[0-9]):' +
+ '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+ }
+ type string {
+ // route-target with Type 1
+ // route-target:(ASN):(local-part)
+ pattern '^route\-target:' +
+ '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]):' +
+ '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}' +
+ '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+ '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|' +
+ '[1-9][0-9]{1,8}|[0-9])$';
+ }
+ type string {
+ // route-target with Type 2
+ // route-target:(IPv4):(local-part)
+ pattern '^route\-target:' +
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|' +
+ '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|' +
+ '2[0-4][0-9]|25[0-5]):' +
+ '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+ }
+ type string {
+ // 4-byte AS Type 1 route-target
+ pattern '^route\-target:' +
+ '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}' +
+ '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+ '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|' +
+ '[1-9][0-9]{1,8}|[0-9]):' +
+ '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+ }
+ type string {
+ // route-origin with Type 1
+ pattern '^route\-origin:' +
+ '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]):' +
+ '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}' +
+ '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+ '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|' +
+ '[1-9][0-9]{1,8}|[0-9])$';
+ }
+ type string {
+ // route-origin with Type 2
+ pattern '^route\-origin:' +
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|' +
+ '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|' +
+ '2[0-4][0-9]|25[0-5]):' +
+ '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+ }
+ type string {
+ // 4-byte AS Type 1 route-origin
+ pattern '^route\-origin:' +
+ '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}' +
+ '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+ '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|' +
+ '[1-9][0-9]{1,8}|[0-9]):' +
+ '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+ '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+ }
+ type string {
+ // Extended Color Community
+ pattern '^color:' +
+ '[0-1]{2}:' +
+ '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}' +
+ '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+ '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|' +
+ '[1-9][0-9]{1,8}|[0-9])$';
+ }
+ }
+ description
+ "Type definition for extended community attributes. In the case that
+ common communities are utilised, they are represented as a string
+ of the form:
+ - <2b AS>:<4b value> per RFC4360 section 3.1
+ - <4b IPv4>:<2b value> per RFC4360 section 3.2
+ - <4b AS>:<2b value> per RFC5668 section 2.
+ - route-target:<2b AS>:<4b value> per RFC4360 section 4
+ - route-target:<4b IPv4>:<2b value> per RFC4360 section 4
+ - route-origin:<2b ASN>:<4b value> per RFC4360 section 5
+ - route-origin:<4b IPv4>:<2b value> per RFC4360 section 5
+ - color:<CO bits>:<4b value> per draft-ietf-idr-segment-routing-te-policy
+ section 3";
+ reference
+ "RFC 4360 - BGP Extended Communities Attribute
+ RFC 5668 - 4-Octet AS Specific BGP Extended Community
+ draft-ietf-idr-segment-routing-te-policy";
+ }
+
+ typedef bgp-ext-community-recv-type {
+ type union {
+ type bgp-ext-community-type;
+ type binary {
+ length 8;
+ }
+ }
+ description
+ "A type definition utilised to define the extended community
+ in a context where the system is receiving the extended
+ community from an external source, such that the value may be
+ unknown. In the case that the received extended community is
+ unknown it is defined to be a 8-octet quantity formatted
+ according to RFC4360:
+
+ Type Field: 1 or 2 octets.
+ Value Field: Remaining octets.
+
+ The high-order octet of the type field is encoded such that
+ bit 0 indicates whether the extended community type is IANA
+ assigned; and bit 1 indicates whether the extended community
+ is transitive. The remaining bits of the high-order type
+ field must be interpreted to determine whether the low-order
+ type field should be parsed, or whether the entire remainder
+ of the extended community is a value.";
+ reference
+ "RFC 4360 - BGP Extended Communities Attribute
+ RFC 5668 - 4-Octet AS Specific BGP Extended Community";
+ }
+
+ typedef bgp-community-regexp-type {
+ // TODO: needs more work to decide what format these regexps can
+ // take.
+ type oc-types:std-regexp;
+ description
+ "Type definition for communities specified as regular
+ expression patterns";
+ }
+
+ typedef bgp-origin-attr-type {
+ type enumeration {
+ enum IGP {
+ description
+ "Origin of the NLRI is internal";
+ }
+ enum EGP {
+ description
+ "Origin of the NLRI is EGP";
+ }
+ enum INCOMPLETE {
+ description
+ "Origin of the NLRI is neither IGP or EGP";
+ }
+ }
+ description
+ "Type definition for standard BGP origin attribute";
+ reference "RFC 4271 - A Border Gateway Protocol 4 (BGP-4),
+ Sec 4.3";
+ }
+
+ typedef peer-type {
+ type enumeration {
+ enum INTERNAL {
+ description
+ "Internal (iBGP) peer";
+ }
+ enum EXTERNAL {
+ description
+ "External (eBGP) peer";
+ }
+ }
+ description
+ "Labels a peer or peer group as explicitly internal or
+ external";
+ }
+
+ identity REMOVE_PRIVATE_AS_OPTION {
+ description
+ "Base identity for options for removing private autonomous
+ system numbers from the AS_PATH attribute";
+ }
+
+ identity PRIVATE_AS_REMOVE_ALL {
+ base REMOVE_PRIVATE_AS_OPTION;
+ description
+ "Strip all private autonmous system numbers from the AS_PATH.
+ This action is performed regardless of the other content of the
+ AS_PATH attribute, and for all instances of private AS numbers
+ within that attribute.";
+ }
+
+ identity PRIVATE_AS_REPLACE_ALL {
+ base REMOVE_PRIVATE_AS_OPTION;
+ description
+ "Replace all instances of private autonomous system numbers in
+ the AS_PATH with the local BGP speaker's autonomous system
+ number. This action is performed regardless of the other
+ content of the AS_PATH attribute, and for all instances of
+ private AS number within that attribute.";
+ }
+
+ typedef remove-private-as-option {
+ type identityref {
+ base REMOVE_PRIVATE_AS_OPTION;
+ }
+ description
+ "Set of options for configuring how private AS path numbers
+ are removed from advertisements";
+ }
+
+ typedef rr-cluster-id-type {
+ type union {
+ type uint32;
+ type oc-inet:ipv4-address;
+ }
+ description
+ "Union type for route reflector cluster ids:
+ option 1: 4-byte number
+ option 2: IP address";
+ }
+
+ typedef community-type {
+ type enumeration {
+ enum STANDARD {
+ description "Send only standard communities";
+ }
+ enum EXTENDED {
+ description "Send only extended communities";
+ }
+ enum BOTH {
+ description "Send both standard and extended communities";
+ }
+ enum NONE {
+ description "Do not send any community attribute";
+ }
+ }
+ description
+ "type describing variations of community attributes:
+ STANDARD: standard BGP community [rfc1997]
+ EXTENDED: extended BGP community [rfc4360]
+ BOTH: both standard and extended community";
+ }
+
+
+ typedef as-path-segment-type {
+ type enumeration {
+ enum AS_SEQ {
+ description
+ "Ordered set of autonomous systems that a route in
+ the UPDATE message has traversed";
+ }
+ enum AS_SET {
+ description
+ "Unordered set of autonomous systems that a route in
+ the UPDATE message has traversed";
+ }
+ enum AS_CONFED_SEQUENCE {
+ description
+ "Ordered set of Member Autonomous
+ Systems in the local confederation that the UPDATE message
+ has traversed";
+ }
+ enum AS_CONFED_SET {
+ description
+ "Unordered set of Member Autonomous Systems
+ in the local confederation that the UPDATE message has
+ traversed";
+ }
+ }
+ description
+ "Defines the types of BGP AS path segments.";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-bgp.yang b/src/plugins/yang/openconfig/openconfig-bgp.yang
new file mode 100644
index 0000000..9331e9f
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-bgp.yang
@@ -0,0 +1,155 @@
+module openconfig-bgp {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/bgp";
+
+ prefix "oc-bgp";
+
+ // import some basic inet types
+ import openconfig-extensions { prefix oc-ext; }
+
+ // Include the OpenConfig BGP submodules
+ // Common: defines the groupings that are common across more than
+ // one context (where contexts are neighbor, group, global)
+ include openconfig-bgp-common;
+ // Multiprotocol: defines the groupings that are common across more
+ // than one context, and relate to Multiprotocol
+ include openconfig-bgp-common-multiprotocol;
+ // Structure: defines groupings that are shared but are solely used for
+ // structural reasons.
+ include openconfig-bgp-common-structure;
+ // Include peer-group/neighbor/global - these define the groupings
+ // that are specific to one context
+ include openconfig-bgp-peer-group;
+ include openconfig-bgp-neighbor;
+ include openconfig-bgp-global;
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module describes a YANG model for BGP protocol
+ configuration.It is a limited subset of all of the configuration
+ parameters available in the variety of vendor implementations,
+ hence it is expected that it would be augmented with vendor-
+ specific configuration data as needed. Additional modules or
+ submodules to handle other aspects of BGP configuration,
+ including policy, VRFs, VPNs, and additional address families
+ are also expected.
+
+ This model supports the following BGP configuration level
+ hierarchy:
+
+ BGP
+ |
+ +-> [ global BGP configuration ]
+ +-> AFI / SAFI global
+ +-> peer group
+ +-> [ peer group config ]
+ +-> AFI / SAFI [ per-AFI overrides ]
+ +-> neighbor
+ +-> [ neighbor config ]
+ +-> [ optional pointer to peer-group ]
+ +-> AFI / SAFI [ per-AFI overrides ]";
+
+ oc-ext:openconfig-version "5.0.1";
+
+ revision "2018-08-20" {
+ description
+ "Correct description of AFI-SAFI enabled leaf.";
+ reference "5.0.1";
+ }
+
+ revision "2018-04-11" {
+ description
+ "Correct naming of BGP maximum prefix warning percentage leaf.";
+ reference "5.0.0";
+ }
+
+ revision "2018-03-20" {
+ description
+ "Added SR-TE policy SAFI";
+ reference "4.1.0";
+ }
+
+ revision "2017-07-30" {
+ description
+ "Clarification of add-paths send-max leaf";
+ reference "4.0.1";
+ }
+
+ revision "2017-07-10" {
+ description
+ "Add error notifications; moved add-paths config; add AS
+ prepend policy features; removed unneeded config leaves";
+ reference "4.0.0";
+ }
+
+ revision "2017-02-02" {
+ description
+ "Bugfix to remove remaining global-level policy data";
+ reference "3.0.1";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add dynamic neighbor support, migrate to OpenConfig types";
+ reference "3.0.0";
+ }
+
+ revision "2016-06-21" {
+ description
+ "OpenConfig BGP refactor";
+ reference "2.1.1";
+ }
+
+ revision "2016-06-06" {
+ description
+ "OpenConfig public release";
+ reference "2.1.0";
+ }
+
+ revision "2016-03-31" {
+ description
+ "OpenConfig public release";
+ reference "2.0.1";
+ }
+
+ grouping bgp-top {
+ description
+ "Top-level grouping for the BGP model data";
+
+ container bgp {
+ description
+ "Top-level configuration and state for the BGP router";
+
+ container global {
+ description
+ "Global configuration for the BGP router";
+ uses bgp-global-base;
+ }
+
+ container neighbors {
+ description
+ "Configuration for BGP neighbors";
+ uses bgp-neighbor-list;
+ }
+
+ container peer-groups {
+ description
+ "Configuration for BGP peer-groups";
+ uses bgp-peer-group-list;
+ }
+ }
+ }
+
+ uses bgp-top;
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-catalog-types.yang b/src/plugins/yang/openconfig/openconfig-catalog-types.yang
new file mode 100644
index 0000000..bdec31e
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-catalog-types.yang
@@ -0,0 +1,242 @@
+module openconfig-catalog-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/catalog-types";
+
+ prefix "oc-cat-types";
+
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines types and identities used by the OpenConfig
+ YANG module catalog model.";
+
+ oc-ext:openconfig-version "0.2.1";
+
+ revision "2017-05-01" {
+ description
+ "Fix to module dependency list";
+ reference "0.2.1";
+ }
+
+ revision "2017-03-08" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+ revision "2016-02-15" {
+ description
+ "Initial OpenConfig public release";
+ reference "0.1.0";
+ }
+
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ identity CATALOG_MEMBER_TYPE {
+ description
+ "Base identity for elements in the catalog";
+ }
+
+ identity MODULE {
+ base CATALOG_MEMBER_TYPE;
+ description
+ "Module elements in the catalog";
+ }
+
+ identity RELEASE_BUNDLE {
+ base CATALOG_MEMBER_TYPE;
+ description
+ "Release bundle elements in the catalog";
+ }
+
+ identity FEATURE_BUNDLE {
+ base CATALOG_MEMBER_TYPE;
+ description
+ "Feature bundle elements in the catalog";
+ }
+
+
+ identity IMPLEMENTATION_STATUS_TYPE {
+ description
+ "Indications of the status of a module's implementation on a
+ device or server";
+ }
+
+ identity IN_PROGRESS {
+ base IMPLEMENTATION_STATUS_TYPE;
+ description
+ "Implementation is in progress";
+ }
+
+ identity PLANNED {
+ base IMPLEMENTATION_STATUS_TYPE;
+ description
+ "Implementation is planned";
+ }
+
+ identity COMPLETE {
+ base IMPLEMENTATION_STATUS_TYPE;
+ description
+ "Implementation is complete and fully supports the model";
+ }
+
+ identity PARTIAL {
+ base IMPLEMENTATION_STATUS_TYPE;
+ description
+ "Implementation is complete, but only supports the model
+ partially";
+ }
+
+ identity MODULE_STATUS_TYPE {
+ description
+ "Indicates the deployment status of the module";
+ }
+
+ identity EXPERIMENTAL {
+ base MODULE_STATUS_TYPE;
+ description
+ "Module should be considered experimental, not deployed in
+ production settings";
+ }
+
+ identity PRODUCTION {
+ base MODULE_STATUS_TYPE;
+ description
+ "Module is suitable for use in production, or has been
+ deployed in production";
+ }
+
+ identity MODULE_CATEGORY_BASE {
+ description
+ "Base identity for the module category. It is expected that
+ publishing organizations will define additional derived
+ identities to describe their categorization scheme.";
+ }
+
+ identity MODULE_SUBCATEGORY_BASE {
+ description
+ "Base identity for the module subcategory. It is expected that
+ publishing organizations will define additional derived
+ identities to describe their categorization scheme.";
+ }
+
+ identity ORGANIZATION_TYPE {
+ description
+ "Publishing organization type for the set of modules";
+ }
+
+ identity STANDARDS {
+ base ORGANIZATION_TYPE;
+ description
+ "Standards development organization (SDO) publisher type";
+ }
+
+ identity INDUSTRY {
+ base ORGANIZATION_TYPE;
+ description
+ "Industry forum or other industry group";
+ }
+
+ identity COMMERCIAL {
+ base ORGANIZATION_TYPE;
+ description
+ "Commercial entity, company, etc.";
+ }
+
+ identity INDIVIDUAL {
+ base ORGANIZATION_TYPE;
+ description
+ "For modules published by an individual";
+ }
+
+ identity IETF_MODEL_LAYER {
+ base MODULE_CATEGORY_BASE;
+ description
+ "Describes layering of models based on their abstraction
+ level as defined by IETF model classification proposals";
+ reference
+ "IETF draft-ietf-netmod-yang-model-classification";
+ }
+
+ identity IETF_MODEL_TYPE {
+ base MODULE_SUBCATEGORY_BASE;
+ description
+ "IETF proposed classification dimension of YANG model types as
+ standard YANG models, vendor-specific, or user-specific YANG
+ models and extensions";
+ reference
+ "IETF draft-ietf-netmod-yang-model-classification";
+ }
+
+ identity IETF_NETWORK_SERVICE {
+ base IETF_MODEL_LAYER;
+ description
+ "Service-layer model as defined by IETF classification
+ proposal";
+ }
+
+ identity IETF_NETWORK_ELEMENT {
+ base IETF_MODEL_LAYER;
+ description
+ "Network element-layer model as defined by IETF classification
+ proposal";
+ }
+
+ identity IETF_TYPE_STANDARD {
+ base IETF_MODEL_TYPE;
+ description
+ "Models published by standards-defining organizations (SDOs)";
+ }
+
+ identity IETF_TYPE_VENDOR {
+ base IETF_MODEL_TYPE;
+ description
+ "Developed by organizations (e.g., vendors) with the intent
+ to support a specific set of implementations under control of
+ that organization";
+ }
+
+ identity IETF_TYPE_USER {
+ base IETF_MODEL_TYPE;
+ description
+ "Developed by organizations that operate YANG-based
+ infrastructure including devices and orchestrators.
+ The intent of these models is to express the specific needs
+ for a certain implementation, above and beyond what is provided
+ by vendors";
+ }
+
+ typedef module-version-type {
+ type string;
+ description
+ "This type defines acceptable formats for the version of a
+ module. The version may be a semantic version, or a YANG
+ revision statement date, and may include wildcards when
+ included in a bundle compatibility list, e.g.:
+
+ semver format: <major>.<minor>.<patch>
+ examples: 0.1.0, 2.1.0, 1.1.*, 2.*.*
+
+ revision format: YYYY-MM-DD
+ example: 2016-11-31";
+ }
+
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-channel-monitor.yang b/src/plugins/yang/openconfig/openconfig-channel-monitor.yang
new file mode 100644
index 0000000..c898677
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-channel-monitor.yang
@@ -0,0 +1,330 @@
+module openconfig-channel-monitor {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/channel-monitor";
+
+ prefix "oc-chan-monitor";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-transport-types { prefix oc-opt-types; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This model describes operational state data for an optical
+ channel monitor (OCM) for optical transport line system
+ elements such as wavelength routers (ROADMs) and amplifiers.";
+
+ oc-ext:openconfig-version "0.3.1";
+
+ revision "2017-09-08" {
+ description
+ "Correct bug with OSC interfaces";
+ reference "0.3.1";
+ }
+
+ revision "2017-07-08" {
+ description
+ "Support multiple OCMs, add refs to hw ports, ";
+ reference "0.3.0";
+ }
+
+ revision "2017-03-28" {
+ description
+ "Added min/max/avg stats, status for media channels, OCM, APS";
+ reference "0.2.0";
+ }
+
+ revision "2016-09-14" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+
+
+ // grouping statements
+
+ grouping media-channel-port-config {
+ description
+ "Configuration data for a media channel source/dest port";
+
+ leaf port-name {
+ type oc-if:base-interface-ref;
+ description
+ "Reference to the corresponding node interface";
+ }
+ }
+
+ grouping media-channel-port-state {
+ description
+ "Operational state data for a media channel source/dest port";
+ }
+
+ grouping media-channel-source-port-top {
+ description
+ "Top-level grouping for source of the media channel";
+
+ container source {
+ description
+ "Top-level container for media channel source";
+
+ container config {
+ description
+ "Configuration data for the media channel source";
+
+ uses media-channel-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the media channel source";
+
+ uses media-channel-port-config;
+ uses media-channel-port-state;
+ }
+ }
+ }
+
+ grouping media-channel-dest-port-top {
+ description
+ "Top-level grouping for destination of the media channel";
+
+ container dest {
+ description
+ "Top-level container for media channel destination";
+
+ container config {
+ description
+ "Configuration data for the media channel destination";
+
+ uses media-channel-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the media channel destination";
+
+ uses media-channel-port-config;
+ uses media-channel-port-state;
+ }
+ }
+ }
+
+ grouping media-channel-psd-state {
+ description
+ "Operational state data for the media channel PSD";
+
+ leaf lower-frequency {
+ type oc-opt-types:frequency-type;
+ description
+ "Lower frequency of the specified PSD";
+ }
+
+ leaf upper-frequency {
+ type oc-opt-types:frequency-type;
+ description
+ "Upper frequency of the specified PSD";
+ }
+
+ leaf psd {
+ type oc-types:ieeefloat32;
+ units "nW/MHz";
+ description
+ "Power spectral density expressed in nanowatts per
+ megahertz, nW/MHz. These units allow the value to often
+ be greater than 1.0. It also avoids dealing with zero values
+ for 0dBm. For example, a 40GHz wide channel
+ with 0dBm power would be:
+ 0dBm = 1mW = 10^6nW
+ 40GHz = 40,000MHz
+ 0dBm/40GHz = 10^6nW/40,000MHz = 1000/40 = 25";
+ }
+ }
+
+
+ grouping media-channel-psd-top {
+ description
+ "Top-level grouping ";
+
+ container channels {
+ description
+ "Enclosing container for the list of values describing
+ the power spectral density distribution";
+
+ list channel {
+ key "lower-frequency upper-frequency";
+ config false;
+ description
+ "List of tuples describing the PSD distribution";
+
+ leaf lower-frequency {
+ type leafref {
+ path "../state/lower-frequency";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ leaf upper-frequency {
+ type leafref {
+ path "../state/upper-frequency";
+ }
+ description
+ "Reference to the list key";
+ }
+
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for PSD";
+
+ uses media-channel-psd-state;
+ }
+ }
+ }
+ }
+
+ grouping media-channel-config {
+ description
+ "Configuration data for media channel definitions";
+
+ leaf index {
+ type uint32;
+ description
+ "Identifier for the defined media channel";
+ }
+
+ leaf lower-frequency {
+ type oc-opt-types:frequency-type;
+ description
+ "The lower frequency for the spectrum defined by this media
+ channel";
+ }
+
+ leaf upper-frequency {
+ type oc-opt-types:frequency-type;
+ description
+ "The upper frequency for the spectrum defined by this media
+ channel";
+ }
+
+ }
+
+ grouping channel-monitor-config {
+ description
+ "Configuration data for the optical channel monitor";
+
+ leaf name {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ description
+ "Reference to system-supplied name of the port on the
+ optical channel monitor (OCM). If this port is embedded
+ in another card (i.e. an amplifier card) the device
+ should still define a port representing the OCM even if
+ it is internal and not physically present on the
+ faceplate of the card";
+ }
+
+ leaf monitor-port {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ description
+ "Reference to system-supplied name of the port that the
+ channel monitor is physically connected to. This port
+ will be of type MONITOR. This port is a tap off of the
+ monitored-port and would be in the same card as the
+ monitored port. If this port is embedded in another card
+ (i.e. an amplifier card) the device should still define
+ a port representing the monitor port if it is internal
+ and not physically present on the faceplate of the card";
+ }
+ }
+
+ grouping channel-monitor-state {
+ description
+ "Operational state data ";
+ }
+
+ grouping channel-monitor-top {
+ description
+ "Top-level grouping ";
+
+ container channel-monitors {
+ description
+ "Top-level container for optical channel monitors";
+
+ list channel-monitor {
+ key "name";
+ description
+ "List of channel monitors, keyed by channel monitor name.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "References the optical channel monitor name";
+ }
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses channel-monitor-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses channel-monitor-config;
+ uses channel-monitor-state;
+ }
+
+ uses media-channel-psd-top;
+ }
+ }
+ }
+
+ // data definition statements
+
+ uses channel-monitor-top;
+
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-extensions.yang b/src/plugins/yang/openconfig/openconfig-extensions.yang
new file mode 100644
index 0000000..f39ecf6
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-extensions.yang
@@ -0,0 +1,91 @@
+module openconfig-extensions {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/openconfig-ext";
+
+ prefix "oc-ext";
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module provides extensions to the YANG language to allow
+ OpenConfig specific functionality and meta-data to be defined.";
+
+ revision "2017-04-11" {
+ description
+ "rename password type to 'hashed' and clarify description";
+ reference "0.3.0";
+ }
+
+ revision "2017-01-29" {
+ description
+ "Added extension for annotating encrypted values.";
+ reference "0.2.0";
+ }
+
+ revision "2015-10-09" {
+ description
+ "Initial OpenConfig public release";
+ reference "0.1.0";
+ }
+
+
+ // extension statements
+ extension openconfig-version {
+ argument "semver" {
+ yin-element false;
+ }
+ description
+ "The OpenConfig version number for the module. This is
+ expressed as a semantic version number of the form:
+ x.y.z
+ where:
+ * x corresponds to the major version,
+ * y corresponds to a minor version,
+ * z corresponds to a patch version.
+ This version corresponds to the model file within which it is
+ defined, and does not cover the whole set of OpenConfig models.
+ Where several modules are used to build up a single block of
+ functionality, the same module version is specified across each
+ file that makes up the module.
+
+ A major version number of 0 indicates that this model is still
+ in development (whether within OpenConfig or with industry
+ partners), and is potentially subject to change.
+
+ Following a release of major version 1, all modules will
+ increment major revision number where backwards incompatible
+ changes to the model are made.
+
+ The minor version is changed when features are added to the
+ model that do not impact current clients use of the model.
+
+ The patch-level version is incremented when non-feature changes
+ (such as bugfixes or clarifications to human-readable
+ descriptions that do not impact model functionality) are made
+ that maintain backwards compatibility.
+
+ The version number is stored in the module meta-data.";
+ }
+
+ extension openconfig-hashed-value {
+ description
+ "This extension provides an annotation on schema nodes to
+ indicate that the corresponding value should be stored and
+ reported in hashed form.
+
+ Hash algorithms are by definition not reversible. Clients
+ reading the configuration or applied configuration for the node
+ should expect to receive only the hashed value. Values written
+ in cleartext will be hashed. This annotation may be used on
+ nodes such as secure passwords in which the device never reports
+ a cleartext value, even if the input is provided as cleartext.";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-if-aggregate.yang b/src/plugins/yang/openconfig/openconfig-if-aggregate.yang
new file mode 100644
index 0000000..5aa80bb
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-if-aggregate.yang
@@ -0,0 +1,223 @@
+module openconfig-if-aggregate {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/interfaces/aggregate";
+
+ prefix "oc-lag";
+
+ // import some basic types
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-if-ethernet { prefix oc-eth; }
+ import iana-if-type { prefix ift; }
+ import openconfig-if-types { prefix oc-ift; }
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "Model for managing aggregated (aka bundle, LAG) interfaces.";
+
+ oc-ext:openconfig-version "2.3.1";
+
+ revision "2018-03-23" {
+ description
+ "Fix/cleanup when statements in aggregates model.";
+ reference "2.3.1";
+ }
+
+ revision "2018-01-05" {
+ description
+ "Add logical loopback to interface.";
+ reference "2.3.0";
+ }
+
+ revision "2017-12-22" {
+ description
+ "Add IPv4 proxy ARP configuration.";
+ reference "2.2.0";
+ }
+
+ revision "2017-12-21" {
+ description
+ "Added IPv6 router advertisement configuration.";
+ reference "2.1.0";
+ }
+
+ revision "2017-07-14" {
+ description
+ "Added Ethernet/IP state data; Add dhcp-client;
+ migrate to OpenConfig types modules; Removed or
+ renamed opstate values";
+ reference "2.0.0";
+ }
+
+ revision "2016-12-22" {
+ description
+ "Fixes to Ethernet interfaces model";
+ reference "1.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ // typedef statements
+
+
+
+ typedef aggregation-type {
+ type enumeration {
+ enum LACP {
+ description "LAG managed by LACP";
+ }
+ enum STATIC {
+ description "Statically configured bundle / LAG";
+ }
+ }
+ description
+ "Type to define the lag-type, i.e., how the LAG is
+ defined and managed";
+ }
+
+ // grouping statements
+
+
+ grouping aggregation-logical-config {
+ description
+ "Configuration data for aggregate interfaces";
+
+
+ leaf lag-type {
+ type aggregation-type;
+ description
+ "Sets the type of LAG, i.e., how it is
+ configured / maintained";
+ }
+
+ leaf min-links {
+ type uint16;
+ description
+ "Specifies the mininum number of member
+ interfaces that must be active for the aggregate interface
+ to be available";
+ }
+ }
+
+ grouping aggregation-logical-state {
+ description
+ "Operational state data for aggregate interfaces";
+
+ leaf lag-speed {
+ type uint32;
+ units Mbps;
+ description
+ "Reports effective speed of the aggregate interface,
+ based on speed of active member interfaces";
+ }
+
+ leaf-list member {
+ when "../../config/lag-type = 'STATIC'" {
+ description
+ "The simple list of member interfaces is active
+ when the aggregate is statically configured";
+ }
+ type oc-if:base-interface-ref;
+ description
+ "List of current member interfaces for the aggregate,
+ expressed as references to existing interfaces";
+ }
+ }
+
+ grouping aggregation-logical-top {
+ description "Top-level data definitions for LAGs";
+
+ container aggregation {
+
+ description
+ "Options for logical interfaces representing
+ aggregates";
+
+ container config {
+ description
+ "Configuration variables for logical aggregate /
+ LAG interfaces";
+
+ uses aggregation-logical-config;
+ }
+
+ container state {
+
+ config false;
+ description
+ "Operational state variables for logical
+ aggregate / LAG interfaces";
+
+ uses aggregation-logical-config;
+ uses aggregation-logical-state;
+
+ }
+ }
+ }
+
+ grouping ethernet-if-aggregation-config {
+ description
+ "Adds configuration items for Ethernet interfaces
+ belonging to a logical aggregate / LAG";
+
+ leaf aggregate-id {
+ type leafref {
+ path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+ }
+ description
+ "Specify the logical aggregate interface to which
+ this interface belongs";
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ augment "/oc-if:interfaces/oc-if:interface" {
+
+ description "Adds LAG configuration to the interface module";
+
+ uses aggregation-logical-top {
+ when "oc-if:state/oc-if:type = 'ift:ieee8023adLag' or " +
+ "oc-if:state/oc-if:type = 'oc-ift:IF_AGGREGATE'" {
+ description
+ "active when the interface is set to type LAG";
+ }
+ }
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" +
+ "oc-eth:config" {
+ description
+ "Adds LAG settings to individual Ethernet interfaces";
+
+ uses ethernet-if-aggregation-config;
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" +
+ "oc-eth:state" {
+ description
+ "Adds LAG settings to individual Ethernet interfaces";
+
+ uses ethernet-if-aggregation-config;
+ }
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-if-ethernet-ext.yang b/src/plugins/yang/openconfig/openconfig-if-ethernet-ext.yang
new file mode 100644
index 0000000..9329dcd
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-if-ethernet-ext.yang
@@ -0,0 +1,106 @@
+module openconfig-if-ethernet-ext {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/interfaces/ethernet-ext";
+
+ prefix "oc-eth-ext";
+
+ // import some basic types
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-if-ethernet { prefix oc-eth; }
+ import openconfig-yang-types { prefix oc-yang; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module adds extensions to the base ethernet configuration
+ and operational state model to support additional use cases.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-07-10" {
+ description
+ "Initial version of Ethernet extensions module to add frame
+ size distribution stats";
+ reference "0.1.0";
+ }
+
+ grouping ethernet-in-frames-size-dist {
+ description
+ "Grouping for defining the size distribution of the frames
+ received";
+
+ container in-distribution {
+ description
+ "The size distribution of the received frames.";
+
+ leaf in-frames-64-octets {
+ type oc-yang:counter64;
+ description
+ "Number of packets (including bad packets) received that
+ were 64 bytes in length (excluding framing bits but
+ including FCS bytes).";
+ }
+
+ leaf in-frames-65-127-octets {
+ type oc-yang:counter64;
+ description
+ "Number of good and bad packets received that were
+ between 65 and 127 bytes in length (excluding framing bits
+ but including FCS bytes).";
+ }
+
+ leaf in-frames-128-255-octets {
+ type oc-yang:counter64;
+ description
+ "Number of good and bad packets received that were
+ between 128 and 255 bytes in length inclusive
+ (excluding framing bits but including FCS bytes).";
+ }
+
+ leaf in-frames-256-511-octets {
+ type oc-yang:counter64;
+ description
+ "Number of good and bad packets received that were
+ between 256 and 511 bytes in length inclusive
+ (excluding framing bits but including FCS bytes).";
+ }
+
+ leaf in-frames-512-1023-octets {
+ type oc-yang:counter64;
+ description
+ "Number of good and bad packets received that were
+ between 512 and 1023 bytes in length inclusive
+ (excluding framing bits but including FCS bytes).";
+ }
+
+ leaf in-frames-1024-1518-octets {
+ type oc-yang:counter64;
+ description
+ "Number of good and bad packets received that were
+ between 1024 and 1518 bytes in length inclusive
+ (excluding framing bits but including FCS bytes).";
+ }
+ }
+ }
+
+ // augment statements
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" +
+ "oc-eth:state/oc-eth:counters" {
+ description
+ "Adds size distribution to the ethernet counters";
+
+ uses ethernet-in-frames-size-dist;
+ }
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-if-ethernet.yang b/src/plugins/yang/openconfig/openconfig-if-ethernet.yang
new file mode 100644
index 0000000..cd6b526
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-if-ethernet.yang
@@ -0,0 +1,428 @@
+module openconfig-if-ethernet {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/interfaces/ethernet";
+
+ prefix "oc-eth";
+
+ // import some basic types
+ import openconfig-interfaces { prefix oc-if; }
+ import iana-if-type { prefix ift; }
+ import openconfig-yang-types { prefix oc-yang; }
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "Model for managing Ethernet interfaces -- augments the OpenConfig
+ model for interface configuration and state.";
+
+ oc-ext:openconfig-version "2.6.1";
+
+ revision "2018-09-04" {
+ description
+ "Remove in-crc-align-errors as it is a duplicate of
+ in-crc-errors";
+ reference "2.6.1";
+ }
+
+ revision "2018-08-28" {
+ description
+ "Add Ethernet counter in-block-errors";
+ reference "2.6.0";
+ }
+
+ revision "2018-07-02" {
+ description
+ "Add new ethernet counters of in-undersize-frames,
+ in-crc-align-errors and the distribution container";
+ reference "2.5.0";
+ }
+
+ revision "2018-04-10" {
+ description
+ "Add identities for 2.5 and 5 Gbps.";
+ reference "2.4.0";
+ }
+
+ revision "2018-01-05" {
+ description
+ "Add logical loopback to interface.";
+ reference "2.3.0";
+ }
+
+ revision "2017-12-21" {
+ description
+ "Added IPv6 router advertisement configuration.";
+ reference "2.1.0";
+ }
+
+ revision "2017-07-14" {
+ description
+ "Added Ethernet/IP state data; Add dhcp-client;
+ migrate to OpenConfig types modules; Removed or
+ renamed opstate values";
+ reference "2.0.0";
+ }
+
+ revision "2016-12-22" {
+ description
+ "Fixes to Ethernet interfaces model";
+ reference "1.1.0";
+ }
+
+
+ // identity statements
+
+ identity ETHERNET_SPEED {
+ description "base type to specify available Ethernet link
+ speeds";
+ }
+
+ identity SPEED_10MB {
+ base ETHERNET_SPEED;
+ description "10 Mbps Ethernet";
+ }
+
+ identity SPEED_100MB {
+ base ETHERNET_SPEED;
+ description "100 Mbps Ethernet";
+ }
+
+ identity SPEED_1GB {
+ base ETHERNET_SPEED;
+ description "1 Gbps Ethernet";
+ }
+
+ identity SPEED_2500MB {
+ base ETHERNET_SPEED;
+ description "2.5 Gbps Ethernet";
+ }
+
+ identity SPEED_5GB {
+ base ETHERNET_SPEED;
+ description "5 Gbps Ethernet";
+ }
+
+ identity SPEED_10GB {
+ base ETHERNET_SPEED;
+ description "10 Gbps Ethernet";
+ }
+
+ identity SPEED_25GB {
+ base ETHERNET_SPEED;
+ description "25 Gbps Ethernet";
+ }
+
+ identity SPEED_40GB {
+ base ETHERNET_SPEED;
+ description "40 Gbps Ethernet";
+ }
+
+ identity SPEED_50GB {
+ base ETHERNET_SPEED;
+ description "50 Gbps Ethernet";
+ }
+
+ identity SPEED_100GB {
+ base ETHERNET_SPEED;
+ description "100 Gbps Ethernet";
+ }
+
+ identity SPEED_UNKNOWN {
+ base ETHERNET_SPEED;
+ description
+ "Interface speed is unknown. Systems may report
+ speed UNKNOWN when an interface is down or unpopuplated (e.g.,
+ pluggable not present).";
+ }
+
+ // typedef statements
+
+
+ // grouping statements
+
+ grouping ethernet-interface-config {
+ description "Configuration items for Ethernet interfaces";
+
+ leaf mac-address {
+ type oc-yang:mac-address;
+ description
+ "Assigns a MAC address to the Ethernet interface. If not
+ specified, the corresponding operational state leaf is
+ expected to show the system-assigned MAC address.";
+ }
+
+ leaf auto-negotiate {
+ type boolean;
+ default true;
+ description
+ "Set to TRUE to request the interface to auto-negotiate
+ transmission parameters with its peer interface. When
+ set to FALSE, the transmission parameters are specified
+ manually.";
+ reference
+ "IEEE 802.3-2012 auto-negotiation transmission parameters";
+ }
+
+ leaf duplex-mode {
+ type enumeration {
+ enum FULL {
+ description "Full duplex mode";
+ }
+ enum HALF {
+ description "Half duplex mode";
+ }
+ }
+ description
+ "When auto-negotiate is TRUE, this optionally sets the
+ duplex mode that will be advertised to the peer. If
+ unspecified, the interface should negotiate the duplex mode
+ directly (typically full-duplex). When auto-negotiate is
+ FALSE, this sets the duplex mode on the interface directly.";
+ }
+
+ leaf port-speed {
+ type identityref {
+ base ETHERNET_SPEED;
+ }
+ description
+ "When auto-negotiate is TRUE, this optionally sets the
+ port-speed mode that will be advertised to the peer for
+ negotiation. If unspecified, it is expected that the
+ interface will select the highest speed available based on
+ negotiation. When auto-negotiate is set to FALSE, sets the
+ link speed to a fixed value -- supported values are defined
+ by ETHERNET_SPEED identities";
+ }
+
+ leaf enable-flow-control {
+ type boolean;
+ default false;
+ description
+ "Enable or disable flow control for this interface.
+ Ethernet flow control is a mechanism by which a receiver
+ may send PAUSE frames to a sender to stop transmission for
+ a specified time.
+
+ This setting should override auto-negotiated flow control
+ settings. If left unspecified, and auto-negotiate is TRUE,
+ flow control mode is negotiated with the peer interface.";
+ reference
+ "IEEE 802.3x";
+ }
+ }
+
+ grouping ethernet-interface-state-counters {
+ description
+ "Ethernet-specific counters and statistics";
+
+ // ingress counters
+
+ leaf in-mac-control-frames {
+ type oc-yang:counter64;
+ description
+ "MAC layer control frames received on the interface";
+ }
+
+ leaf in-mac-pause-frames {
+ type oc-yang:counter64;
+ description
+ "MAC layer PAUSE frames received on the interface";
+ }
+
+ leaf in-oversize-frames {
+ type oc-yang:counter64;
+ description
+ "The total number of frames received that were
+ longer than 1518 octets (excluding framing bits,
+ but including FCS octets) and were otherwise
+ well formed.";
+ }
+
+ leaf in-undersize-frames {
+ type oc-yang:counter64;
+ description
+ "The total number of frames received that were
+ less than 64 octets long (excluding framing bits,
+ but including FCS octets) and were otherwise well
+ formed.";
+ reference
+ "RFC 2819: Remote Network Monitoring MIB -
+ etherStatsUndersizePkts";
+ }
+
+ leaf in-jabber-frames {
+ type oc-yang:counter64;
+ description
+ "Number of jabber frames received on the
+ interface. Jabber frames are typically defined as oversize
+ frames which also have a bad CRC. Implementations may use
+ slightly different definitions of what constitutes a jabber
+ frame. Often indicative of a NIC hardware problem.";
+ }
+
+ leaf in-fragment-frames {
+ type oc-yang:counter64;
+ description
+ "The total number of frames received that were less than
+ 64 octets in length (excluding framing bits but including
+ FCS octets) and had either a bad Frame Check Sequence
+ (FCS) with an integral number of octets (FCS Error) or a
+ bad FCS with a non-integral number of octets (Alignment
+ Error).";
+ }
+
+ leaf in-8021q-frames {
+ type oc-yang:counter64;
+ description
+ "Number of 802.1q tagged frames received on the interface";
+ }
+
+ leaf in-crc-errors {
+ type oc-yang:counter64;
+ description
+ "The total number of frames received that
+ had a length (excluding framing bits, but
+ including FCS octets) of between 64 and 1518
+ octets, inclusive, but had either a bad
+ Frame Check Sequence (FCS) with an integral
+ number of octets (FCS Error) or a bad FCS with
+ a non-integral number of octets (Alignment Error)";
+ reference
+ "RFC 2819: Remote Network Monitoring MIB -
+ etherStatsCRCAlignErrors";
+ }
+
+ leaf in-block-errors {
+ type oc-yang:counter64;
+ description
+ "The number of received errored blocks. Error detection codes
+ are capable of detecting whether one or more errors have
+ occurred in a given sequence of bits - the block. It is
+ normally not possible to determine the exact number of errored
+ bits within the block";
+ }
+
+ // egress counters
+
+ leaf out-mac-control-frames {
+ type oc-yang:counter64;
+ description
+ "MAC layer control frames sent on the interface";
+ }
+
+ leaf out-mac-pause-frames {
+ type oc-yang:counter64;
+ description
+ "MAC layer PAUSE frames sent on the interface";
+ }
+
+ leaf out-8021q-frames {
+ type oc-yang:counter64;
+ description
+ "Number of 802.1q tagged frames sent on the interface";
+ }
+ }
+
+ grouping ethernet-interface-state {
+ description
+ "Grouping for defining Ethernet-specific operational state";
+
+ leaf hw-mac-address {
+ type oc-yang:mac-address;
+ description
+ "Represenets the 'burned-in', or system-assigned, MAC
+ address for the Ethernet interface.";
+ }
+
+ leaf negotiated-duplex-mode {
+ type enumeration {
+ enum FULL {
+ description "Full duplex mode";
+ }
+ enum HALF {
+ description "Half duplex mode";
+ }
+ }
+ description
+ "When auto-negotiate is set to TRUE, and the interface has
+ completed auto-negotiation with the remote peer, this value
+ shows the duplex mode that has been negotiated.";
+ }
+
+ leaf negotiated-port-speed {
+ type identityref {
+ base ETHERNET_SPEED;
+ }
+ description
+ "When auto-negotiate is set to TRUE, and the interface has
+ completed auto-negotiation with the remote peer, this value
+ shows the interface speed that has been negotiated.";
+ }
+
+ container counters {
+ description "Ethernet interface counters";
+
+ uses ethernet-interface-state-counters;
+
+ }
+
+ }
+
+ // data definition statements
+
+ grouping ethernet-top {
+ description "top-level Ethernet config and state containers";
+
+ container ethernet {
+ description
+ "Top-level container for ethernet configuration
+ and state";
+
+ container config {
+ description "Configuration data for ethernet interfaces";
+
+ uses ethernet-interface-config;
+
+ }
+
+ container state {
+
+ config false;
+ description "State variables for Ethernet interfaces";
+
+ uses ethernet-interface-config;
+ uses ethernet-interface-state;
+
+ }
+
+ }
+ }
+
+ // augment statements
+
+ augment "/oc-if:interfaces/oc-if:interface" {
+ description "Adds addtional Ethernet-specific configuration to
+ interfaces model";
+
+ uses ethernet-top {
+ when "oc-if:state/oc-if:type = 'ift:ethernetCsmacd'" {
+ description "Additional interface configuration parameters when
+ the interface type is Ethernet";
+ }
+ }
+ }
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-if-ip-ext.yang b/src/plugins/yang/openconfig/openconfig-if-ip-ext.yang
new file mode 100644
index 0000000..a5b720b
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-if-ip-ext.yang
@@ -0,0 +1,169 @@
+module openconfig-if-ip-ext {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/interfaces/ip-ext";
+
+ prefix "oc-ip-ext";
+
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-if-ip { prefix oc-ip; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module adds extensions to the base IP configuration and
+ operational state model to support additional use cases.";
+
+ oc-ext:openconfig-version "2.3.0";
+
+ revision "2018-01-05" {
+ description
+ "Add logical loopback to interface.";
+ reference "2.3.0";
+ }
+
+ revision "2017-12-21" {
+ description
+ "Added IPv6 router advertisement configuration.";
+ reference "2.1.0";
+ }
+
+ revision "2017-07-14" {
+ description
+ "Added Ethernet/IP state data; Add dhcp-client;
+ migrate to OpenConfig types modules; Removed or
+ renamed opstate values";
+ reference "2.0.0";
+ }
+
+ revision "2016-12-22" {
+ description
+ "Fixes to Ethernet interfaces model";
+ reference "1.1.0";
+ }
+
+
+ // grouping statements
+
+ grouping ipv6-autoconf-config {
+ description
+ "Configuration data for IPv6 address autoconfiguration";
+
+ leaf create-global-addresses {
+ type boolean;
+ default true;
+ description
+ "[adapted from IETF IP model RFC 7277]
+
+ If enabled, the host creates global addresses as
+ described in RFC 4862.";
+ reference
+ "RFC 4862: IPv6 Stateless Address Autoconfiguration
+ Section 5.5";
+ }
+ leaf create-temporary-addresses {
+ type boolean;
+ default false;
+ description
+ "[adapted from IETF IP model RFC 7277]
+
+ If enabled, the host creates temporary addresses as
+ described in RFC 4941.";
+ reference
+ "RFC 4941: Privacy Extensions for Stateless Address
+ Autoconfiguration in IPv6";
+ }
+
+ leaf temporary-valid-lifetime {
+ type uint32;
+ units "seconds";
+ default 604800;
+ description
+ "[adapted from IETF IP model RFC 7277]
+
+ The time period during which the temporary address
+ is valid.";
+ reference
+ "RFC 4941: Privacy Extensions for Stateless Address
+ Autoconfiguration in IPv6
+ - TEMP_VALID_LIFETIME";
+ }
+
+ leaf temporary-preferred-lifetime {
+ type uint32;
+ units "seconds";
+ default 86400;
+ description
+ "[adapted from IETF IP model RFC 7277]
+
+ The time period during which the temporary address is
+ preferred.";
+ reference
+ "RFC 4941: Privacy Extensions for Stateless Address
+ Autoconfiguration in IPv6
+ - TEMP_PREFERRED_LIFETIME";
+ }
+ }
+
+ grouping ipv6-autoconf-state {
+ description
+ "Operational state data for IPv6 address autoconfiguration";
+
+ //TODO: placeholder for additional opstate for IPv6 autoconf
+ }
+
+ grouping ipv6-autoconf-top {
+ description
+ "Top-level grouping for IPv6 address autoconfiguration";
+
+ container autoconf {
+ description
+ "Top-level container for IPv6 autoconf";
+
+ container config {
+ description
+ "[adapted from IETF IP model RFC 7277]
+
+ Parameters to control the autoconfiguration of IPv6
+ addresses, as described in RFC 4862.";
+ reference
+ "RFC 4862: IPv6 Stateless Address Autoconfiguration";
+
+ uses ipv6-autoconf-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses ipv6-autoconf-config;
+ uses ipv6-autoconf-state;
+ }
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+ "oc-if:subinterface/oc-ip:ipv6" {
+ description
+ "Adds address autoconfiguration to the base IP model";
+
+ uses ipv6-autoconf-top;
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-if-ip.yang b/src/plugins/yang/openconfig/openconfig-if-ip.yang
new file mode 100644
index 0000000..a20e21c
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-if-ip.yang
@@ -0,0 +1,1312 @@
+module openconfig-if-ip {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/interfaces/ip";
+
+ prefix "oc-ip";
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-vlan { prefix oc-vlan; }
+ import openconfig-yang-types { prefix oc-yang; }
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This model defines data for managing configuration and
+ operational state on IP (IPv4 and IPv6) interfaces.
+
+ This model reuses data items defined in the IETF YANG model for
+ interfaces described by RFC 7277 with an alternate structure
+ (particularly for operational state data) and with
+ additional configuration items.
+
+ Portions of this code were derived from IETF RFC 7277.
+ Please reproduce this note if possible.
+
+ IETF code is subject to the following copyright and license:
+ Copyright (c) IETF Trust and the persons identified as authors of
+ the code.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, is permitted pursuant to, and subject to the license
+ terms contained in, the Simplified BSD License set forth in
+ Section 4.c of the IETF Trust's Legal Provisions Relating
+ to IETF Documents (http://trustee.ietf.org/license-info).";
+
+ oc-ext:openconfig-version "2.3.0";
+
+ revision "2018-01-05" {
+ description
+ "Add logical loopback to interface.";
+ reference "2.3.0";
+ }
+
+ revision "2017-12-21" {
+ description
+ "Added IPv6 router advertisement configuration.";
+ reference "2.1.0";
+ }
+
+ revision "2017-07-14" {
+ description
+ "Added Ethernet/IP state data; Add dhcp-client;
+ migrate to OpenConfig types modules; Removed or
+ renamed opstate values";
+ reference "2.0.0";
+ }
+
+ revision "2017-04-03"{
+ description
+ "Update copyright notice.";
+ reference "1.1.1";
+ }
+
+ revision "2016-12-22" {
+ description
+ "Fixes to Ethernet interfaces model";
+ reference "1.1.0";
+ }
+
+
+ // typedef statements
+
+ typedef ip-address-origin {
+ type enumeration {
+ enum OTHER {
+ description
+ "None of the following.";
+ }
+ enum STATIC {
+ description
+ "Indicates that the address has been statically
+ configured - for example, using NETCONF or a Command Line
+ Interface.";
+ }
+ enum DHCP {
+ description
+ "Indicates an address that has been assigned to this
+ system by a DHCP server.";
+ }
+ enum LINK_LAYER {
+ description
+ "Indicates an address created by IPv6 stateless
+ autoconfiguration that embeds a link-layer address in its
+ interface identifier.";
+ }
+ enum RANDOM {
+ description
+ "Indicates an address chosen by the system at
+ random, e.g., an IPv4 address within 169.254/16, an
+ RFC 4941 temporary address, or an RFC 7217 semantically
+ opaque address.";
+ reference
+ "RFC 4941: Privacy Extensions for Stateless Address
+ Autoconfiguration in IPv6
+ RFC 7217: A Method for Generating Semantically Opaque
+ Interface Identifiers with IPv6 Stateless
+ Address Autoconfiguration (SLAAC)";
+ }
+ }
+ description
+ "The origin of an address.";
+ }
+
+ typedef neighbor-origin {
+ type enumeration {
+ enum OTHER {
+ description
+ "None of the following.";
+ }
+ enum STATIC {
+ description
+ "Indicates that the mapping has been statically
+ configured - for example, using NETCONF or a Command Line
+ Interface.";
+ }
+ enum DYNAMIC {
+ description
+ "Indicates that the mapping has been dynamically resolved
+ using, e.g., IPv4 ARP or the IPv6 Neighbor Discovery
+ protocol.";
+ }
+ }
+ description
+ "The origin of a neighbor entry.";
+ }
+
+ // grouping statements
+
+ grouping ip-common-global-config {
+ description
+ "Shared configuration data for IPv4 or IPv6 assigned
+ globally on an interface.";
+
+ leaf dhcp-client {
+ type boolean;
+ default false;
+ description
+ "Enables a DHCP client on the interface in order to request
+ an address";
+ }
+ }
+
+ grouping ip-common-counters-state {
+ description
+ "Operational state for IP traffic statistics for IPv4 and
+ IPv6";
+
+ container counters {
+ description
+ "Packet and byte counters for IP transmission and
+ reception for the address family.";
+
+
+ leaf in-pkts {
+ type oc-yang:counter64;
+ description
+ "The total number of IP packets received for the specified
+ address family, including those received in error";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf in-octets {
+ type oc-yang:counter64;
+ description
+ "The total number of octets received in input IP packets
+ for the specified address family, including those received
+ in error.";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf in-error-pkts {
+ // TODO: this counter combines several error conditions --
+ // could consider breaking them out to separate leaf nodes
+ type oc-yang:counter64;
+ description
+ "Number of IP packets discarded due to errors for the
+ specified address family, including errors in the IP
+ header, no route found to the IP destination, invalid
+ address, unknown protocol, etc.";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf in-forwarded-pkts {
+ type oc-yang:counter64;
+ description
+ "The number of input packets for which the device was not
+ their final IP destination and for which the device
+ attempted to find a route to forward them to that final
+ destination.";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf in-forwarded-octets {
+ type oc-yang:counter64;
+ description
+ "The number of octets received in input IP packets
+ for the specified address family for which the device was
+ not their final IP destination and for which the
+ device attempted to find a route to forward them to that
+ final destination.";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf in-discarded-pkts {
+ type oc-yang:counter64;
+ description
+ "The number of input IP packets for the
+ specified address family, for which no problems were
+ encountered to prevent their continued processing, but
+ were discarded (e.g., for lack of buffer space).";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf out-pkts {
+ type oc-yang:counter64;
+ description
+ "The total number of IP packets for the
+ specified address family that the device supplied
+ to the lower layers for transmission. This includes
+ packets generated locally and those forwarded by the
+ device.";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf out-octets {
+ type oc-yang:counter64;
+ description
+ "The total number of octets in IP packets for the
+ specified address family that the device
+ supplied to the lower layers for transmission. This
+ includes packets generated locally and those forwarded by
+ the device.";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf out-error-pkts {
+ // TODO: this counter combines several error conditions --
+ // could consider breaking them out to separate leaf nodes
+ type oc-yang:counter64;
+ description
+ "Number of IP packets for the specified address family
+ locally generated and discarded due to errors, including
+ no route found to the IP destination.";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf out-forwarded-pkts {
+ type oc-yang:counter64;
+ description
+ "The number of packets for which this entity was not their
+ final IP destination and for which it was successful in
+ finding a path to their final destination.";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf out-forwarded-octets {
+ type oc-yang:counter64;
+ description
+ "The number of octets in packets for which this entity was
+ not their final IP destination and for which it was
+ successful in finding a path to their final destination.";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+
+ leaf out-discarded-pkts {
+ type oc-yang:counter64;
+ description
+ "The number of output IP packets for the
+ specified address family for which no problem was
+ encountered to prevent their transmission to their
+ destination, but were discarded (e.g., for lack of
+ buffer space).";
+ reference
+ "RFC 4293 - Management Information Base for the
+ Internet Protocol (IP)";
+ }
+ }
+
+ }
+
+
+
+ grouping ipv4-global-config {
+ description
+ "Configuration data for IPv4 interfaces across
+ all addresses assigned to the interface";
+
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Controls whether IPv4 is enabled or disabled on this
+ interface. When IPv4 is enabled, this interface is
+ connected to an IPv4 stack, and the interface can send
+ and receive IPv4 packets.";
+ }
+
+ leaf mtu {
+ type uint16 {
+ range "68..max";
+ }
+ units octets;
+ description
+ "The size, in octets, of the largest IPv4 packet that the
+ interface will send and receive.
+
+ The server may restrict the allowed values for this leaf,
+ depending on the interface's type.
+
+ If this leaf is not configured, the operationally used MTU
+ depends on the interface's type.";
+ reference
+ "RFC 791: Internet Protocol";
+ }
+
+ uses ip-common-global-config;
+
+
+ }
+
+ grouping ipv4-address-config {
+
+ description
+ "Per IPv4 adresss configuration data for the
+ interface.";
+
+ leaf ip {
+ type oc-inet:ipv4-address;
+ description
+ "The IPv4 address on the interface.";
+ }
+
+ leaf prefix-length {
+ type uint8 {
+ range "0..32";
+ }
+ description
+ "The length of the subnet prefix.";
+ }
+ }
+
+ grouping ipv4-neighbor-config {
+ description
+ "Per IPv4 neighbor configuration data. Neighbor
+ entries are analagous to static ARP entries, i.e., they
+ create a correspondence between IP and link-layer addresses";
+
+ leaf ip {
+ type oc-inet:ipv4-address;
+ description
+ "The IPv4 address of the neighbor node.";
+ }
+ leaf link-layer-address {
+ type oc-yang:phys-address;
+ mandatory true;
+ description
+ "The link-layer address of the neighbor node.";
+ }
+ }
+
+ grouping ipv4-address-state {
+ description
+ "State variables for IPv4 addresses on the interface";
+
+ leaf origin {
+ type ip-address-origin;
+ description
+ "The origin of this address, e.g., statically configured,
+ assigned by DHCP, etc..";
+ }
+ }
+
+ grouping ipv4-neighbor-state {
+ description
+ "State variables for IPv4 neighbor entries on the interface.";
+
+ leaf origin {
+ type neighbor-origin;
+ description
+ "The origin of this neighbor entry, static or dynamic.";
+ }
+ }
+
+ grouping ipv6-global-config {
+ description
+ "Configuration data at the global level for each
+ IPv6 interface";
+
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Controls whether IPv6 is enabled or disabled on this
+ interface. When IPv6 is enabled, this interface is
+ connected to an IPv6 stack, and the interface can send
+ and receive IPv6 packets.";
+ }
+
+ leaf mtu {
+ type uint32 {
+ range "1280..max";
+ }
+ units octets;
+ description
+ "The size, in octets, of the largest IPv6 packet that the
+ interface will send and receive.
+
+ The server may restrict the allowed values for this leaf,
+ depending on the interface's type.
+
+ If this leaf is not configured, the operationally used MTU
+ depends on the interface's type.";
+ reference
+ "RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ Section 5";
+ }
+
+ leaf dup-addr-detect-transmits {
+ type uint32;
+ default 1;
+ description
+ "The number of consecutive Neighbor Solicitation messages
+ sent while performing Duplicate Address Detection on a
+ tentative address. A value of zero indicates that
+ Duplicate Address Detection is not performed on
+ tentative addresses. A value of one indicates a single
+ transmission with no follow-up retransmissions.";
+ reference
+ "RFC 4862: IPv6 Stateless Address Autoconfiguration";
+ }
+
+ uses ip-common-global-config;
+ }
+
+ grouping ipv6-address-config {
+ description "Per-address configuration data for IPv6 interfaces";
+
+ leaf ip {
+ type oc-inet:ipv6-address;
+ description
+ "The IPv6 address on the interface.";
+ }
+
+ leaf prefix-length {
+ type uint8 {
+ range "0..128";
+ }
+ mandatory true;
+ description
+ "The length of the subnet prefix.";
+ }
+ }
+
+ grouping ipv6-address-state {
+ description
+ "Per-address operational state data for IPv6 interfaces";
+
+ leaf origin {
+ type ip-address-origin;
+ description
+ "The origin of this address, e.g., static, dhcp, etc.";
+ }
+
+ leaf status {
+ type enumeration {
+ enum PREFERRED {
+ description
+ "This is a valid address that can appear as the
+ destination or source address of a packet.";
+ }
+ enum DEPRECATED {
+ description
+ "This is a valid but deprecated address that should
+ no longer be used as a source address in new
+ communications, but packets addressed to such an
+ address are processed as expected.";
+ }
+ enum INVALID {
+ description
+ "This isn't a valid address, and it shouldn't appear
+ as the destination or source address of a packet.";
+ }
+ enum INACCESSIBLE {
+ description
+ "The address is not accessible because the interface
+ to which this address is assigned is not
+ operational.";
+ }
+ enum UNKNOWN {
+ description
+ "The status cannot be determined for some reason.";
+ }
+ enum TENTATIVE {
+ description
+ "The uniqueness of the address on the link is being
+ verified. Addresses in this state should not be
+ used for general communication and should only be
+ used to determine the uniqueness of the address.";
+ }
+ enum DUPLICATE {
+ description
+ "The address has been determined to be non-unique on
+ the link and so must not be used.";
+ }
+ enum OPTIMISTIC {
+ description
+ "The address is available for use, subject to
+ restrictions, while its uniqueness on a link is
+ being verified.";
+ }
+ }
+ description
+ "The status of an address. Most of the states correspond
+ to states from the IPv6 Stateless Address
+ Autoconfiguration protocol.";
+ reference
+ "RFC 4293: Management Information Base for the
+ Internet Protocol (IP)
+ - IpAddressStatusTC
+ RFC 4862: IPv6 Stateless Address Autoconfiguration";
+ }
+ }
+
+ grouping ipv6-neighbor-config {
+ description
+ "Per-neighbor configuration data for IPv6 interfaces";
+
+ leaf ip {
+ type oc-inet:ipv6-address;
+ description
+ "The IPv6 address of the neighbor node.";
+ }
+
+ leaf link-layer-address {
+ type oc-yang:phys-address;
+ mandatory true;
+ description
+ "The link-layer address of the neighbor node.";
+ }
+ }
+
+ grouping ipv6-neighbor-state {
+ description "Per-neighbor state variables for IPv6 interfaces";
+
+ leaf origin {
+ type neighbor-origin;
+ description
+ "The origin of this neighbor entry.";
+ }
+ leaf is-router {
+ type empty;
+ description
+ "Indicates that the neighbor node acts as a router.";
+ }
+ leaf neighbor-state {
+ type enumeration {
+ enum INCOMPLETE {
+ description
+ "Address resolution is in progress, and the link-layer
+ address of the neighbor has not yet been
+ determined.";
+ }
+ enum REACHABLE {
+ description
+ "Roughly speaking, the neighbor is known to have been
+ reachable recently (within tens of seconds ago).";
+ }
+ enum STALE {
+ description
+ "The neighbor is no longer known to be reachable, but
+ until traffic is sent to the neighbor no attempt
+ should be made to verify its reachability.";
+ }
+ enum DELAY {
+ description
+ "The neighbor is no longer known to be reachable, and
+ traffic has recently been sent to the neighbor.
+ Rather than probe the neighbor immediately, however,
+ delay sending probes for a short while in order to
+ give upper-layer protocols a chance to provide
+ reachability confirmation.";
+ }
+ enum PROBE {
+ description
+ "The neighbor is no longer known to be reachable, and
+ unicast Neighbor Solicitation probes are being sent
+ to verify reachability.";
+ }
+ }
+ description
+ "The Neighbor Unreachability Detection state of this
+ entry.";
+ reference
+ "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+ Section 7.3.2";
+ }
+ }
+
+ grouping ip-vrrp-ipv6-config {
+ description
+ "IPv6-specific configuration data for VRRP on IPv6
+ interfaces";
+
+ leaf virtual-link-local {
+ type oc-inet:ip-address;
+ description
+ "For VRRP on IPv6 interfaces, sets the virtual link local
+ address";
+ }
+ }
+
+ grouping ip-vrrp-ipv6-state {
+ description
+ "IPv6-specific operational state for VRRP on IPv6 interfaces";
+
+ uses ip-vrrp-ipv6-config;
+ }
+
+ grouping ip-vrrp-tracking-config {
+ description
+ "Configuration data for tracking interfaces
+ in a VRRP group";
+
+ leaf-list track-interface {
+ type leafref {
+ path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+ }
+ // TODO: we may need to add some restriction to ethernet
+ // or IP interfaces.
+ description
+ "Sets a list of one or more interfaces that should
+ be tracked for up/down events to dynamically change the
+ priority state of the VRRP group, and potentially
+ change the mastership if the tracked interface going
+ down lowers the priority sufficiently. Any of the tracked
+ interfaces going down will cause the priority to be lowered.
+ Some implementations may only support a single
+ tracked interface.";
+ }
+
+ leaf priority-decrement {
+ type uint8 {
+ range 0..254;
+ }
+ default 0;
+ description "Set the value to subtract from priority when
+ the tracked interface goes down";
+ }
+ }
+
+ grouping ip-vrrp-tracking-state {
+ description
+ "Operational state data for tracking interfaces in a VRRP
+ group";
+ }
+
+ grouping ip-vrrp-tracking-top {
+ description
+ "Top-level grouping for VRRP interface tracking";
+
+ container interface-tracking {
+ description
+ "Top-level container for VRRP interface tracking";
+
+ container config {
+ description
+ "Configuration data for VRRP interface tracking";
+
+ uses ip-vrrp-tracking-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for VRRP interface tracking";
+
+ uses ip-vrrp-tracking-config;
+ uses ip-vrrp-tracking-state;
+ }
+ }
+ }
+
+ grouping ip-vrrp-config {
+ description
+ "Configuration data for VRRP on IP interfaces";
+
+ leaf virtual-router-id {
+ type uint8 {
+ range 1..255;
+ }
+ description
+ "Set the virtual router id for use by the VRRP group. This
+ usually also determines the virtual MAC address that is
+ generated for the VRRP group";
+ }
+
+ leaf-list virtual-address {
+ type oc-inet:ip-address;
+ description
+ "Configure one or more virtual addresses for the
+ VRRP group";
+ }
+
+ leaf priority {
+ type uint8 {
+ range 1..254;
+ }
+ default 100;
+ description
+ "Specifies the sending VRRP interface's priority
+ for the virtual router. Higher values equal higher
+ priority";
+ }
+
+ leaf preempt {
+ type boolean;
+ default true;
+ description
+ "When set to true, enables preemption by a higher
+ priority backup router of a lower priority master router";
+ }
+
+ leaf preempt-delay {
+ type uint16 {
+ range 0..3600;
+ }
+ default 0;
+ description
+ "Set the delay the higher priority router waits
+ before preempting";
+ }
+
+ leaf accept-mode {
+ type boolean;
+ // TODO: should we adopt the RFC default given the common
+ // operational practice of setting to true?
+ default false;
+ description
+ "Configure whether packets destined for
+ virtual addresses are accepted even when the virtual
+ address is not owned by the router interface";
+ }
+
+ leaf advertisement-interval {
+ type uint16 {
+ range 1..4095;
+ }
+ // TODO this range is theoretical -- needs to be validated
+ // against major implementations.
+ units "centiseconds";
+ default 100;
+ description
+ "Sets the interval between successive VRRP
+ advertisements -- RFC 5798 defines this as a 12-bit
+ value expressed as 0.1 seconds, with default 100, i.e.,
+ 1 second. Several implementation express this in units of
+ seconds";
+ }
+ }
+
+ grouping ip-vrrp-state {
+ description
+ "Operational state data for VRRP on IP interfaces";
+
+ leaf current-priority {
+ type uint8;
+ description "Operational value of the priority for the
+ interface in the VRRP group";
+ }
+ }
+
+ grouping ip-vrrp-top {
+ description
+ "Top-level grouping for Virtual Router Redundancy Protocol";
+
+ container vrrp {
+ description
+ "Enclosing container for VRRP groups handled by this
+ IP interface";
+
+ reference "RFC 5798 - Virtual Router Redundancy Protocol
+ (VRRP) Version 3 for IPv4 and IPv6";
+
+ list vrrp-group {
+ key "virtual-router-id";
+ description
+ "List of VRRP groups, keyed by virtual router id";
+
+ leaf virtual-router-id {
+ type leafref {
+ path "../config/virtual-router-id";
+ }
+ description
+ "References the configured virtual router id for this
+ VRRP group";
+ }
+
+ container config {
+ description
+ "Configuration data for the VRRP group";
+
+ uses ip-vrrp-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the VRRP group";
+
+ uses ip-vrrp-config;
+ uses ip-vrrp-state;
+ }
+
+ uses ip-vrrp-tracking-top;
+ }
+ }
+ }
+
+ grouping ipv6-ra-config {
+ description
+ "Configuration parameters for IPv6 router advertisements.";
+
+ leaf interval {
+ type uint32;
+ units seconds;
+ description
+ "The interval between periodic router advertisement neighbor
+ discovery messages sent on this interface expressed in
+ seconds.";
+ }
+
+ leaf lifetime {
+ type uint32;
+ units seconds;
+ description
+ "The lifetime advertised in the router advertisement neighbor
+ discovery message on this interface.";
+ }
+
+ leaf suppress {
+ type boolean;
+ default false;
+ description
+ "When set to true, router advertisement neighbor discovery
+ messages are not transmitted on this interface.";
+ }
+ }
+
+ grouping ipv4-proxy-arp-config {
+ description
+ "Configuration parameters for IPv4 proxy ARP";
+
+ leaf mode {
+ type enumeration {
+ enum DISABLE {
+ description
+ "The system should not respond to ARP requests that
+ do not specify an IP address configured on the local
+ subinterface as the target address.";
+ }
+ enum REMOTE_ONLY {
+ description
+ "The system responds to ARP requests only when the
+ sender and target IP addresses are in different
+ subnets.";
+ }
+ enum ALL {
+ description
+ "The system responds to ARP requests where the sender
+ and target IP addresses are in different subnets, as well
+ as those where they are in the same subnet.";
+ }
+ }
+ default "DISABLE";
+ description
+ "When set to a value other than DISABLE, the local system should
+ respond to ARP requests that are for target addresses other than
+ those that are configured on the local subinterface using its own
+ MAC address as the target hardware address. If the REMOTE_ONLY
+ value is specified, replies are only sent when the target address
+ falls outside the locally configured subnets on the interface,
+ whereas with the ALL value, all requests, regardless of their
+ target address are replied to.";
+ reference "RFC1027: Using ARP to Implement Transparent Subnet Gateways";
+ }
+ }
+
+ grouping ipv4-top {
+ description "Top-level configuration and state for IPv4
+ interfaces";
+
+ container ipv4 {
+ description
+ "Parameters for the IPv4 address family.";
+
+ container addresses {
+ description
+ "Enclosing container for address list";
+
+ list address {
+ key "ip";
+ description
+ "The list of configured IPv4 addresses on the interface.";
+
+ leaf ip {
+ type leafref {
+ path "../config/ip";
+ }
+ description "References the configured IP address";
+ }
+
+ container config {
+ description "Configuration data for each configured IPv4
+ address on the interface";
+
+ uses ipv4-address-config;
+
+ }
+
+ container state {
+
+ config false;
+ description "Operational state data for each IPv4 address
+ configured on the interface";
+
+ uses ipv4-address-config;
+ uses ipv4-address-state;
+ }
+
+ }
+ }
+
+ container proxy-arp {
+ description
+ "Configuration and operational state parameters
+ relating to proxy ARP. This functionality allows a
+ system to respond to ARP requests that are not
+ explicitly destined to the local system.";
+
+ container config {
+ description
+ "Configuration parameters for proxy ARP";
+ uses ipv4-proxy-arp-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for proxy ARP";
+ uses ipv4-proxy-arp-config;
+ }
+ }
+
+ container neighbors {
+ description
+ "Enclosing container for neighbor list";
+
+ list neighbor {
+ key "ip";
+ description
+ "A list of mappings from IPv4 addresses to
+ link-layer addresses.
+
+ Entries in this list are used as static entries in the
+ ARP Cache.";
+ reference
+ "RFC 826: An Ethernet Address Resolution Protocol";
+
+ leaf ip {
+ type leafref {
+ path "../config/ip";
+ }
+ description "References the configured IP address";
+ }
+
+ container config {
+ description "Configuration data for each configured IPv4
+ address on the interface";
+
+ uses ipv4-neighbor-config;
+
+ }
+
+ container state {
+
+ config false;
+ description "Operational state data for each IPv4 address
+ configured on the interface";
+
+ uses ipv4-neighbor-config;
+ uses ipv4-neighbor-state;
+ }
+ }
+ }
+
+ uses oc-if:sub-unnumbered-top;
+
+ container config {
+ description
+ "Top-level IPv4 configuration data for the interface";
+
+ uses ipv4-global-config;
+ }
+
+ container state {
+
+ config false;
+ description
+ "Top level IPv4 operational state data";
+
+ uses ipv4-global-config;
+ uses ip-common-counters-state;
+ }
+ }
+ }
+
+ grouping ipv6-top {
+ description
+ "Top-level configuration and state for IPv6 interfaces";
+
+ container ipv6 {
+ description
+ "Parameters for the IPv6 address family.";
+
+ container addresses {
+ description
+ "Enclosing container for address list";
+
+ list address {
+ key "ip";
+ description
+ "The list of configured IPv6 addresses on the interface.";
+
+ leaf ip {
+ type leafref {
+ path "../config/ip";
+ }
+ description "References the configured IP address";
+ }
+
+ container config {
+ description
+ "Configuration data for each IPv6 address on
+ the interface";
+
+ uses ipv6-address-config;
+
+ }
+
+ container state {
+
+ config false;
+ description
+ "State data for each IPv6 address on the
+ interface";
+
+ uses ipv6-address-config;
+ uses ipv6-address-state;
+ }
+ }
+ }
+
+ container router-advertisement {
+ description
+ "Configuration and operational state parameters relating to
+ router advertisements.";
+
+ container config {
+ description
+ "Configuration parameters relating to router advertisements
+ for IPv6.";
+ uses ipv6-ra-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to router
+ advertisements for IPv6.";
+ uses ipv6-ra-config;
+ }
+ }
+
+ container neighbors {
+ description
+ "Enclosing container for list of IPv6 neighbors";
+
+ list neighbor {
+ key "ip";
+ description
+ "List of IPv6 neighbors";
+
+ leaf ip {
+ type leafref {
+ path "../config/ip";
+ }
+ description
+ "References the configured IP neighbor address";
+ }
+
+ container config {
+ description "Configuration data for each IPv6 address on
+ the interface";
+
+ uses ipv6-neighbor-config;
+
+ }
+
+ container state {
+
+ config false;
+ description "State data for each IPv6 address on the
+ interface";
+
+ uses ipv6-neighbor-config;
+ uses ipv6-neighbor-state;
+ }
+ }
+ }
+ uses oc-if:sub-unnumbered-top;
+
+ container config {
+ description "Top-level config data for the IPv6 interface";
+
+ uses ipv6-global-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Top-level operational state data for the IPv6 interface";
+
+ uses ipv6-global-config;
+ uses ip-common-counters-state;
+
+ }
+ }
+ }
+
+ // augment statements
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+ "oc-if:subinterface" {
+ description
+ "IPv4 address family configuration for
+ interfaces";
+
+ uses ipv4-top;
+
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+ "oc-if:subinterface" {
+ description
+ "IPv6 address family configuration for
+ interfaces";
+
+ uses ipv6-top;
+
+ }
+
+ // VRRP for IPv4 interfaces
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+ "oc-if:subinterface/oc-ip:ipv4/oc-ip:addresses/oc-ip:address" {
+
+ description
+ "Additional IP addr family configuration for
+ interfaces";
+
+ uses ip-vrrp-top;
+
+ }
+
+ // VRRP for IPv6 interfaces
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+ "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address" {
+ description
+ "Additional IP addr family configuration for
+ interfaces";
+
+ uses ip-vrrp-top;
+
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+ "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address/" +
+ "vrrp/vrrp-group/config" {
+ description
+ "Additional VRRP data for IPv6 interfaces";
+
+ uses ip-vrrp-ipv6-config;
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+ "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/" +
+ "vrrp-group/state" {
+ description
+ "Additional VRRP data for IPv6 interfaces";
+
+ uses ip-vrrp-ipv6-state;
+ }
+
+ // Augments for for routed VLANs
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan" {
+ description
+ "IPv4 address family configuration for
+ interfaces";
+
+ uses ipv4-top;
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan" {
+ description
+ "IPv6 address family configuration for
+ interfaces";
+
+ uses ipv6-top;
+ }
+
+ // VRRP for routed VLAN interfaces
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+ "oc-ip:ipv4/oc-ip:addresses/oc-ip:address" {
+ description
+ "Additional IP addr family configuration for
+ interfaces";
+
+ uses ip-vrrp-top;
+
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+ "oc-ip:ipv6/oc-ip:addresses/oc-ip:address" {
+ description
+ "Additional IP addr family configuration for
+ interfaces";
+
+ uses ip-vrrp-top;
+
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+ "oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/vrrp-group/config" {
+ description
+ "Additional VRRP data for IPv6 interfaces";
+
+ uses ip-vrrp-ipv6-config;
+ }
+
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+ "oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/vrrp-group/state" {
+ description
+ "Additional VRRP data for IPv6 interfaces";
+
+ uses ip-vrrp-ipv6-state;
+ }
+
+ // rpc statements
+
+ // notification statements
+}
diff --git a/src/plugins/yang/openconfig/openconfig-if-poe.yang b/src/plugins/yang/openconfig/openconfig-if-poe.yang
new file mode 100644
index 0000000..f3c3bf1
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-if-poe.yang
@@ -0,0 +1,99 @@
+module openconfig-if-poe {
+
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/poe";
+
+ prefix "oc-poe";
+
+ import openconfig-if-ethernet { prefix oc-eth; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-extensions { prefix oc-ext; }
+
+ organization "OpenConfig working group";
+
+ contact
+ "Openconfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and state data for
+ Power over Ethernet (PoE) based on the IEEE 802.3af
+ standard.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2017-09-14" {
+ description
+ "Initial public revision";
+ reference "0.1.0";
+ }
+
+ grouping poe-ethernet-config {
+ description
+ "PoE ethernet config grouping";
+
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "Enable or disable PoE in the ethernet interface.";
+ }
+ }
+
+ grouping poe-ethernet-state {
+ description
+ "PoE ethernet state grouping";
+
+ leaf power-used {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units Watts;
+ description
+ "Power used by the ethernet interface in Watts.";
+ }
+
+ leaf power-class {
+ type uint8;
+ description
+ "IEEE 802.3af Power class detected for this ethernet
+ interface.";
+ }
+ }
+
+ grouping poe-ethernet-top {
+ description
+ "Ethernet top level grouping";
+
+ container poe {
+ description
+ "Top-level container for PoE configuration and state data";
+
+ container config {
+ description
+ "Configuration data for PoE";
+
+ uses poe-ethernet-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for PoE";
+
+ uses poe-ethernet-config;
+ uses poe-ethernet-state;
+ }
+ }
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet" {
+ description
+ "Adds PoE to the ethernet model.";
+
+ uses poe-ethernet-top;
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-if-tunnel.yang b/src/plugins/yang/openconfig/openconfig-if-tunnel.yang
new file mode 100644
index 0000000..4efff64
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-if-tunnel.yang
@@ -0,0 +1,109 @@
+module openconfig-if-tunnel {
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/interfaces/tunnel";
+
+ prefix "oc-tun";
+
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-if-ip { prefix oc-ip; }
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This model adds extensions to the OpenConfig interfaces
+ model to configure tunnel interfaces on a network
+ device.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-01-05" {
+ description
+ "Initial tunnel model";
+ reference "0.1.0";
+ }
+
+ grouping tunnel-top {
+ description
+ "Top-level grouping for parameters related to
+ a tunnel interface.";
+
+ container tunnel {
+ description
+ "In the case that the interface is logical tunnel
+ interface, the parameters for the tunnel are
+ specified within this subtree. Tunnel interfaces
+ have only a single logical subinterface associated
+ with them.";
+
+ container config {
+ description
+ "Configuration parameters associated with the
+ tunnel interface";
+ uses tunnel-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters associated with
+ the tunnel interface.";
+ uses tunnel-config;
+ }
+
+ uses oc-ip:ipv4-top;
+ uses oc-ip:ipv6-top;
+ }
+ }
+
+ grouping tunnel-config {
+ description
+ "Configuraton parameters relating to a tunnel
+ interface.";
+
+ leaf src {
+ type oc-inet:ip-address;
+ description
+ "The source address that should be used for the
+ tunnel.";
+ }
+
+ leaf dst {
+ type oc-inet:ip-address;
+ description
+ "The destination address for the tunnel.";
+ }
+
+ leaf ttl {
+ type uint8 {
+ range "1..255";
+ }
+ description
+ "The time-to-live (or hop limit) that should be utilised
+ for the IP packets used for the tunnel transport.";
+ }
+
+ leaf gre-key {
+ type uint32;
+ description
+ "The GRE key to be specified for the tunnel. The
+ key is used to identify a traffic flow within
+ a tunnel.";
+ reference
+ "RFC2890: Key and Sequence Number Extensions to GRE";
+ }
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface" {
+ description
+ "Augment to add tunnel configuration to interfaces";
+ uses tunnel-top;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-if-types.yang b/src/plugins/yang/openconfig/openconfig-if-types.yang
new file mode 100644
index 0000000..3743878
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-if-types.yang
@@ -0,0 +1,98 @@
+module openconfig-if-types {
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/openconfig-if-types";
+
+ prefix "oc-ift";
+
+ // import statements
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module contains a set of interface type definitions that
+ are used across OpenConfig models. These are generally physical
+ or logical interfaces, distinct from hardware ports (which are
+ described by the OpenConfig platform model).";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2018-01-05" {
+ description
+ "Add tunnel types into the INTERFACE_TYPE identity.";
+ reference "0.2.0";
+ }
+
+ revision "2016-11-14" {
+ description
+ "Initial version";
+ reference "0.1.0";
+ }
+
+
+ identity INTERFACE_TYPE {
+ description
+ "Base identity from which interface types are derived.";
+ }
+
+ identity IF_ETHERNET {
+ base INTERFACE_TYPE;
+ description
+ "Ethernet interfaces based on IEEE 802.3 standards, as well
+ as FlexEthernet";
+ reference
+ "IEEE 802.3-2015 - IEEE Standard for Ethernet
+ OIF Flex Ethernet Implementation Agreement 1.0";
+ }
+
+ identity IF_AGGREGATE {
+ base INTERFACE_TYPE;
+ description
+ "An aggregated, or bonded, interface forming a
+ Link Aggregation Group (LAG), or bundle, most often based on
+ the IEEE 802.1AX (or 802.3ad) standard.";
+ reference
+ "IEEE 802.1AX-2008";
+ }
+
+ identity IF_LOOPBACK {
+ base INTERFACE_TYPE;
+ description
+ "A virtual interface designated as a loopback used for
+ various management and operations tasks.";
+ }
+
+ identity IF_ROUTED_VLAN {
+ base INTERFACE_TYPE;
+ description
+ "A logical interface used for routing services on a VLAN.
+ Such interfaces are also known as switch virtual interfaces
+ (SVI) or integrated routing and bridging interfaces (IRBs).";
+ }
+
+ identity IF_SONET {
+ base INTERFACE_TYPE;
+ description
+ "SONET/SDH interface";
+ }
+
+ identity IF_TUNNEL_GRE4 {
+ base INTERFACE_TYPE;
+ description
+ "A GRE tunnel over IPv4 transport.";
+ }
+
+ identity IF_TUNNEL_GRE6 {
+ base INTERFACE_TYPE;
+ description
+ "A GRE tunnel over IPv6 transport.";
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-igmp-types.yang b/src/plugins/yang/openconfig/openconfig-igmp-types.yang
new file mode 100644
index 0000000..5fe22e7
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-igmp-types.yang
@@ -0,0 +1,53 @@
+module openconfig-igmp-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/igmp/types";
+
+ prefix "oc-igmp-types";
+
+ // import some basic types
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines types related to the IGMP protocol model.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-02-19" {
+ description
+ "Initial revision.";
+ reference "0.1.0";
+ }
+
+ // typedef statements
+
+ typedef igmp-version {
+ type uint8 {
+ range 1..3;
+ }
+ description
+ "IGMP Version.";
+ reference "v1 = RFC1112, v2 = RFC2236, v3 = RFC3376";
+ }
+
+ typedef igmp-interval-type {
+ type uint16 {
+ range 1..1024;
+ }
+ units "seconds";
+ description
+ "Interval at which the router sends the IGMP query message toward
+ the upstream neighbor.";
+ reference "RFC3376 8.2 Page 40";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-igmp.yang b/src/plugins/yang/openconfig/openconfig-igmp.yang
new file mode 100644
index 0000000..4668ea1
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-igmp.yang
@@ -0,0 +1,356 @@
+module openconfig-igmp {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/igmp";
+
+ prefix "oc-igmp";
+
+ // import some basic types/interfaces
+ import openconfig-igmp-types { prefix oc-igmp-types; }
+ import openconfig-types { prefix "oc-types"; }
+ import openconfig-acl { prefix "oc-acl"; }
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-interfaces { prefix oc-if; }
+ import ietf-inet-types { prefix "inet"; }
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "An OpenConfig model for Internet Group Management Protocol (IGMP).";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-02-19" {
+ description
+ "Initial revision.";
+ reference "0.1.0";
+ }
+
+ grouping admin-config {
+ description
+ "Re-usable grouping to enable or disable a particular feature.";
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "When set to true, the functionality within which this
+ leaf is defined is enabled, when set to false it is
+ explicitly disabled.";
+ }
+ }
+
+ grouping igmp-interface-config {
+ description
+ "Configuration data for IGMP on each interface.";
+
+ leaf interface-id {
+ type oc-if:interface-id;
+ description
+ "Reference to an interface on which IGMP is enabled.";
+ }
+
+ uses admin-config;
+
+ leaf version {
+ type oc-igmp-types:igmp-version;
+ description
+ "IGMP Version.";
+ }
+
+ leaf query-interval {
+ type oc-igmp-types:igmp-interval-type;
+ description
+ "Interval at which the router sends the IGMP membership
+ queries.";
+ }
+
+ leaf filter-prefixes {
+ type string;
+ // TODO work out what this should be.
+ // On Juniper it's a "policy" and on Cisco a sort of "class map"
+ description
+ "List used to filter joins.";
+ }
+ }
+
+ grouping igmp-counters-per-version {
+ description
+ "Counters for each IGMP protocol version.";
+
+ container state {
+ config false;
+ description
+ "Counters for each IGMP protocol version.";
+
+ leaf v1 {
+ type uint32;
+ description
+ "IGMP v1.";
+ }
+ leaf v2 {
+ type uint32;
+ description
+ "IGMP v2.";
+ }
+ leaf v3 {
+ type uint32;
+ description
+ "IGMP v3.";
+ }
+ }
+ }
+
+ grouping igmp-interface-counters {
+ description
+ "State and session data for IGMP on each interface.";
+
+
+ container counters {
+ description
+ "Counters avaiable on a per interface bases for IGMP.";
+
+ container queries {
+ description
+ "IGMP membership queries.";
+
+ container sent {
+ description
+ "Number of IGMP membership queries sent.";
+ uses igmp-counters-per-version;
+ }
+
+ container received {
+ description
+ "Number of IGMP membership queries received.";
+ uses igmp-counters-per-version;
+ }
+ }
+
+ container reports {
+ description
+ "Number of IGMP membership reports received.";
+ uses igmp-counters-per-version;
+ }
+ }
+ }
+
+ grouping igmp-snooping-state {
+ description
+ "IGMP membership snooping state.";
+
+ leaf group {
+ type inet:ipv4-address;
+ description
+ "Multicast address.";
+ }
+
+ leaf source {
+ type inet:ipv4-address;
+ description
+ "Source address of multicast.";
+ }
+
+ leaf reporter {
+ type inet:ipv4-address;
+ description
+ "Address of the last reporter.";
+ }
+ }
+
+ grouping igmp-snooping-structural {
+ description
+ "IGMP membership information determined through snooping.";
+
+ container membership-groups {
+ description
+ "List of IGMP Membership information.";
+
+ list group {
+ key "group";
+ config false;
+ description
+ "Multicast group membership.";
+
+ leaf group {
+ type leafref {
+ path "../state/group";
+ }
+ description
+ "Multicast address.";
+ }
+
+ container state {
+ config false;
+ description
+ "Multicast group membership.";
+
+ uses igmp-snooping-state;
+ }
+ }
+ }
+ }
+
+ grouping igmp-interface-state {
+ description
+ "IGMP interface state.";
+
+ leaf query-expires {
+ type oc-types:timeticks64;
+ description
+ "This timestamp indicates the time that the next query is sent.
+ The value is the timestamp in seconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+ }
+
+ grouping igmp-interface-top {
+ description
+ "Configuration and state data for IGMP on each interface.";
+
+ container interfaces {
+ description
+ "The interfaces on which IGMP is configured.";
+
+ list interface {
+ key "interface-id";
+ description
+ "This container defines interface IGMP configuration and
+ state information.";
+
+ leaf interface-id {
+ type leafref {
+ path "../config/interface-id";
+ }
+ description
+ "Reference to an interface on which IGMP is enabled.";
+ }
+
+ container config {
+ description
+ "IGMP interface configuration.";
+
+ uses igmp-interface-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state information for IGMP
+ interfaces.";
+
+ uses igmp-interface-state;
+ uses igmp-interface-config;
+ }
+
+ uses igmp-interface-counters;
+ uses igmp-snooping-structural;
+ uses oc-if:interface-ref;
+ }
+ }
+ }
+
+ grouping igmp-ssm-maps-config {
+ description
+ "A Source Specific Multicast (SSM) mapping. This allows
+ IGMP v2 hosts to be able to join in SSM environments
+ by translating IGMP v2 reports into IGMP v3 reports.
+ The request in an IGMP v2 join is sent toward the source
+ address found by matching the multicast address.";
+
+ leaf source {
+ type inet:ipv4-address;
+ description
+ "Multicast source address.";
+ }
+
+ leaf ssm-ranges {
+ type leafref {
+ path "/oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/" +
+ "oc-acl:config/oc-acl:name";
+ }
+ description
+ "List of accepted source specific multicast (SSM) address
+ ranges.";
+ }
+ }
+
+ grouping igmp-global-config {
+ description
+ "This grouping defines global config options for IGMP.";
+
+ }
+
+ grouping igmp-global-top {
+ description
+ "Top level grouping for global IGMP configuration.";
+
+ container ssm {
+ description
+ "Source specific multicast (SSM).";
+
+ container mappings {
+ description
+ "A list of source specific multicast (SSM) mappings.";
+
+ list mapping {
+ key "source";
+ description
+ "A Source Specific Multicast (SSM) mapping. This allows
+ IGMP v2 hosts to be able to join in SSM environments
+ by translating IGMP v2 reports into IGMP v3 reports.
+ The request in an IGMP v2 join is sent toward the source
+ address found by matching the multicast address.";
+
+ leaf source {
+ type leafref {
+ path "../config/source";
+ }
+ description
+ "Multicast source address.";
+ }
+
+ container config {
+ description
+ "Configuration for SSM maps.";
+ uses igmp-ssm-maps-config;
+ }
+ container state {
+ config false;
+ description
+ "State for SSM maps.";
+ uses igmp-ssm-maps-config;
+ }
+ }
+ }
+ }
+ }
+
+ grouping igmp-top {
+ description
+ "Top-level grouping for IGMP.";
+
+ container igmp {
+ description
+ "Top-level IGMP configuration and operational state.";
+
+ container global {
+ description
+ "Global IGMP configuration and operational state.";
+ uses igmp-global-top;
+ }
+
+ uses igmp-interface-top;
+ }
+ }
+
+ // data definition statements
+}
diff --git a/src/plugins/yang/openconfig/openconfig-inet-types.yang b/src/plugins/yang/openconfig/openconfig-inet-types.yang
new file mode 100644
index 0000000..fbb872f
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-inet-types.yang
@@ -0,0 +1,332 @@
+module openconfig-inet-types {
+
+ yang-version "1";
+ namespace "http://openconfig.net/yang/types/inet";
+ prefix "oc-inet";
+
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module contains a set of Internet address related
+ types for use in OpenConfig modules.
+
+ Portions of this code were derived from IETF RFC 6021.
+ 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 "0.3.1";
+
+ revision 2017-08-24 {
+ description
+ "Minor formatting fixes.";
+ reference "0.3.1";
+ }
+
+ revision 2017-07-06 {
+ description
+ "Add domain-name and host typedefs";
+ reference "0.3.0";
+ }
+
+ revision 2017-04-03 {
+ description
+ "Add ip-version typedef.";
+ reference "0.2.0";
+ }
+
+ revision 2017-04-03 {
+ description
+ "Update copyright notice.";
+ reference "0.1.1";
+ }
+
+ revision 2017-01-26 {
+ description
+ "Initial module for inet types";
+ reference "0.1.0";
+ }
+
+ // IPv4 and IPv6 types.
+
+ typedef ipv4-address {
+ type string {
+ pattern '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|' +
+ '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]' +
+ '[0-9]|25[0-5])';
+ }
+ description
+ "An IPv4 address in dotted quad notation using the default
+ zone.";
+ }
+
+ typedef ipv4-address-zoned {
+ type string {
+ pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|' +
+ '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]' +
+ '[0-9]|25[0-5])(%[a-zA-Z0-9_]+)$';
+ }
+ description
+ "An IPv4 address in dotted quad notation. This type allows
+ specification of a zone index to disambiguate identical
+ address values. For link-local addresses, the index is
+ typically the interface index or interface name.";
+ }
+
+ typedef ipv6-address {
+ type string {
+ pattern
+ // Must support compression through different lengths
+ // therefore this regexp is complex.
+ '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' +
+ '([0-9a-fA-F]{1,4}:){1,7}:|' +
+ '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' +
+ '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+ '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+ '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+ '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+ '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' +
+ ':((:[0-9a-fA-F]{1,4}){1,7}|:)' +
+ ')$';
+ }
+ description
+ "An IPv6 address represented as either a full address; shortened
+ or mixed-shortened formats, using the default zone.";
+ }
+
+ typedef ipv6-address-zoned {
+ type string {
+ pattern
+ // Must support compression through different lengths
+ // therefore this regexp is complex.
+ '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' +
+ '([0-9a-fA-F]{1,4}:){1,7}:|' +
+ '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' +
+ '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+ '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+ '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+ '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+ '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' +
+ ':((:[0-9a-fA-F]{1,4}){1,7}|:)' +
+ ')(%[a-zA-Z0-9_]+)$';
+ }
+ description
+ "An IPv6 address represented as either a full address; shortened
+ or mixed-shortened formats. This type allows specification of
+ a zone index to disambiguate identical address values. For
+ link-local addresses, the index is typically the interface
+ index or interface name.";
+ }
+
+ typedef ipv4-prefix {
+ type string {
+ pattern '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|' +
+ '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]' +
+ '[0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "An IPv4 prefix represented in dotted quad notation followed by
+ a slash and a CIDR mask (0 <= mask <= 32).";
+ }
+
+ typedef ipv6-prefix {
+ type string {
+ pattern
+ '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' +
+ '([0-9a-fA-F]{1,4}:){1,7}:|' +
+ '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}' +
+ '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+ '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+ '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+ '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+ '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' +
+ ':((:[0-9a-fA-F]{1,4}){1,7}|:)' +
+ ')/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])$';
+ }
+ description
+ "An IPv6 prefix represented in full, shortened, or mixed
+ shortened format followed by a slash and CIDR mask
+ (0 <= mask <= 128).";
+ }
+
+ typedef ip-address {
+ type union {
+ type ipv4-address;
+ type ipv6-address;
+ }
+ description
+ "An IPv4 or IPv6 address with no prefix specified.";
+ }
+
+ typedef ip-prefix {
+ type union {
+ type ipv4-prefix;
+ type ipv6-prefix;
+ }
+ description
+ "An IPv4 or IPv6 prefix.";
+ }
+
+ typedef ip-version {
+ type enumeration {
+ enum UNKNOWN {
+ value 0;
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum IPV4 {
+ value 4;
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum IPV6 {
+ value 6;
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+ Note that integer representation of the enumerated values
+ are not specified, and are not required to follow the
+ InetVersion textual convention in SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ typedef domain-name {
+ type string {
+ length "1..253";
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' +
+ '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' +
+ '|\.';
+ }
+ description
+ "The domain-name type represents a DNS domain name.
+ Fully quallified left to the models which utilize this type.
+
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be encoded in punycode as described in RFC
+ 3492";
+ }
+
+ typedef host {
+ type union {
+ type ip-address;
+ type domain-name;
+ }
+ description
+ "The host type represents either an unzoned IP address or a DNS
+ domain name.";
+ }
+
+ typedef as-number {
+ type uint32;
+ description
+ "A numeric identifier for an autonomous system (AS). An AS is a
+ single domain, under common administrative control, which forms
+ a unit of routing policy. Autonomous systems can be assigned a
+ 2-byte identifier, or a 4-byte identifier which may have public
+ or private scope. Private ASNs are assigned from dedicated
+ ranges. Public ASNs are assigned from ranges allocated by IANA
+ to the regional internet registries (RIRs).";
+ reference
+ "RFC 1930 Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271 A Border Gateway Protocol 4 (BGP-4)";
+ }
+
+ typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "A differentiated services code point (DSCP) marking within the
+ IP header.";
+ reference
+ "RFC 2474 Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers";
+ }
+
+ typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The IPv6 flow-label is a 20-bit value within the IPv6 header
+ which is optionally used by the source of the IPv6 packet to
+ label sets of packets for which special handling may be
+ required.";
+ reference
+ "RFC 2460 Internet Protocol, Version 6 (IPv6) Specification";
+ }
+
+ typedef port-number {
+ type uint16;
+ description
+ "A 16-bit port number used by a transport protocol such as TCP
+ or UDP.";
+ reference
+ "RFC 768 User Datagram Protocol
+ RFC 793 Transmission Control Protocol";
+ }
+
+ typedef uri {
+ type string;
+ description
+ "An ASCII-encoded Uniform Resource Identifier (URI) as defined
+ in RFC 3986.";
+ reference
+ "RFC 3986 Uniform Resource Identifier (URI): Generic Syntax";
+ }
+
+ typedef url {
+ type string;
+ description
+ "An ASCII-encoded Uniform Resource Locator (URL) as defined
+ in RFC 3986, section 1.1.3";
+ reference
+ "RFC 3986, paragraph 1.1.3";
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-interfaces.yang b/src/plugins/yang/openconfig/openconfig-interfaces.yang
new file mode 100644
index 0000000..d11e0b2
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-interfaces.yang
@@ -0,0 +1,1040 @@
+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.4.0";
+
+ revision "2018-08-07" {
+ description
+ "Add leaf to indicate whether an interface is physical or
+ logical.";
+ reference "2.4.0";
+ }
+
+ revision "2018-07-02" {
+ description
+ "Add in-pkts and out-pkts in counters";
+ reference "2.3.2";
+ }
+
+ revision "2018-04-24" {
+ description
+ "Clarified behavior of last-change state leaf";
+ reference "2.3.1";
+ }
+
+ revision "2018-01-05" {
+ description
+ "Add logical loopback to interface.";
+ reference "2.3.0";
+ }
+
+ revision "2017-12-22" {
+ description
+ "Add IPv4 proxy ARP configuration.";
+ reference "2.2.0";
+ }
+
+ revision "2017-12-21" {
+ description
+ "Added IPv6 router advertisement configuration.";
+ reference "2.1.0";
+ }
+
+ revision "2017-07-14" {
+ description
+ "Added Ethernet/IP state data; Add dhcp-client;
+ migrate to OpenConfig types modules; Removed or
+ renamed opstate values";
+ reference "2.0.0";
+ }
+
+ revision "2017-04-03" {
+ description
+ "Update copyright notice.";
+ reference "1.1.1";
+ }
+
+ revision "2016-12-22" {
+ description
+ "Fixes to Ethernet interfaces model";
+ reference "1.1.0";
+ }
+
+
+ // typedef statements
+
+ typedef base-interface-ref {
+ type leafref {
+ path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+ }
+ description
+ "Reusable type for by-name reference to a base interface.
+ This type may be used in cases where ability to reference
+ a subinterface is not required.";
+ }
+
+ typedef interface-id {
+ type string;
+ description
+ "User-defined identifier for an interface, generally used to
+ name a interface reference. The id can be arbitrary but a
+ useful convention is to use a combination of base interface
+ name and subinterface index.";
+ }
+
+ // grouping statements
+
+ grouping interface-ref-common {
+ description
+ "Reference leafrefs to interface / subinterface";
+
+ leaf interface {
+ type leafref {
+ path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+ }
+ description
+ "Reference to a base interface. If a reference to a
+ subinterface is required, this leaf must be specified
+ to indicate the base interface.";
+ }
+
+ leaf subinterface {
+ type leafref {
+ path "/oc-if:interfaces/" +
+ "oc-if:interface[oc-if:name=current()/../interface]/" +
+ "oc-if:subinterfaces/oc-if:subinterface/oc-if:index";
+ }
+ description
+ "Reference to a subinterface -- this requires the base
+ interface to be specified using the interface leaf in
+ this container. If only a reference to a base interface
+ is requuired, this leaf should not be set.";
+ }
+ }
+
+ grouping interface-ref-state-container {
+ description
+ "Reusable opstate w/container for a reference to an
+ interface or subinterface";
+
+ container state {
+ config false;
+ description
+ "Operational state for interface-ref";
+
+ uses interface-ref-common;
+ }
+ }
+
+ grouping interface-ref {
+ description
+ "Reusable definition for a reference to an interface or
+ subinterface";
+
+ container interface-ref {
+ description
+ "Reference to an interface or subinterface";
+
+ container config {
+ description
+ "Configured reference to interface / subinterface";
+
+ uses interface-ref-common;
+ }
+
+ uses interface-ref-state-container;
+ }
+ }
+
+ grouping interface-ref-state {
+ description
+ "Reusable opstate w/container for a reference to an
+ interface or subinterface";
+
+ container interface-ref {
+ description
+ "Reference to an interface or subinterface";
+
+ uses interface-ref-state-container;
+ }
+ }
+
+ grouping base-interface-ref-state {
+ description
+ "Reusable opstate w/container for a reference to a
+ base interface (no subinterface).";
+
+ container state {
+ config false;
+ description
+ "Operational state for base interface reference";
+
+ leaf interface {
+ type base-interface-ref;
+ description
+ "Reference to a base interface.";
+ }
+ }
+ }
+
+
+ grouping interface-common-config {
+ description
+ "Configuration data data nodes common to physical interfaces
+ and subinterfaces";
+
+ leaf description {
+ type string;
+ description
+ "A textual description of the interface.
+
+ A server implementation MAY map this leaf to the ifAlias
+ MIB object. Such an implementation needs to use some
+ mechanism to handle the differences in size and characters
+ allowed between this leaf and ifAlias. The definition of
+ such a mechanism is outside the scope of this document.
+
+ Since ifAlias is defined to be stored in non-volatile
+ storage, the MIB implementation MUST map ifAlias to the
+ value of 'description' in the persistently stored
+ datastore.
+
+ Specifically, if the device supports ':startup', when
+ ifAlias is read the device MUST return the value of
+ 'description' in the 'startup' datastore, and when it is
+ written, it MUST be written to the 'running' and 'startup'
+ datastores. Note that it is up to the implementation to
+
+ decide whether to modify this single leaf in 'startup' or
+ perform an implicit copy-config from 'running' to
+ 'startup'.
+
+ If the device does not support ':startup', ifAlias MUST
+ be mapped to the 'description' leaf in the 'running'
+ datastore.";
+ reference
+ "RFC 2863: The Interfaces Group MIB - ifAlias";
+ }
+
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "This leaf contains the configured, desired state of the
+ interface.
+
+ Systems that implement the IF-MIB use the value of this
+ leaf in the 'running' datastore to set
+ IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+ has been initialized, as described in RFC 2863.
+
+ Changes in this leaf in the 'running' datastore are
+ reflected in ifAdminStatus, but if ifAdminStatus is
+ changed over SNMP, this leaf is not affected.";
+ reference
+ "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+ }
+
+ }
+
+ grouping interface-phys-config {
+ description
+ "Configuration data for physical interfaces";
+
+ leaf name {
+ type string;
+ description
+ "The name of the interface.
+
+ A device MAY restrict the allowed values for this leaf,
+ possibly depending on the type of the interface.
+ For system-controlled interfaces, this leaf is the
+ device-specific name of the interface. The 'config false'
+ list interfaces/interface[name]/state contains the currently
+ existing interfaces on the device.
+
+ If a client tries to create configuration for a
+ system-controlled interface that is not present in the
+ corresponding state list, the server MAY reject
+ the request if the implementation does not support
+ pre-provisioning of interfaces or if the name refers to
+ an interface that can never exist in the system. A
+ NETCONF server MUST reply with an rpc-error with the
+ error-tag 'invalid-value' in this case.
+
+ The IETF model in RFC 7223 provides YANG features for the
+ following (i.e., pre-provisioning and arbitrary-names),
+ however they are omitted here:
+
+ If the device supports pre-provisioning of interface
+ configuration, the 'pre-provisioning' feature is
+ advertised.
+
+ If the device allows arbitrarily named user-controlled
+ interfaces, the 'arbitrary-names' feature is advertised.
+
+ When a configured user-controlled interface is created by
+ the system, it is instantiated with the same name in the
+ /interfaces/interface[name]/state list.";
+ }
+
+ leaf type {
+ type identityref {
+ base ietf-if:interface-type;
+ }
+ //mandatory true;
+ description
+ "The type of the interface.
+
+ When an interface entry is created, a server MAY
+ initialize the type leaf with a valid value, e.g., if it
+ is possible to derive the type from the name of the
+ interface.
+
+ If a client tries to set the type of an interface to a
+ value that can never be used by the system, e.g., if the
+ type is not supported or if the type does not match the
+ name of the interface, the server MUST reject the request.
+ A NETCONF server MUST reply with an rpc-error with the
+ error-tag 'invalid-value' in this case.";
+ reference
+ "RFC 2863: The Interfaces Group MIB - ifType";
+ }
+
+ leaf mtu {
+ type uint16;
+ description
+ "Set the max transmission unit size in octets
+ for the physical interface. If this is not set, the mtu is
+ set to the operational default -- e.g., 1514 bytes on an
+ Ethernet interface.";
+ }
+
+ leaf loopback-mode {
+ type boolean;
+ default false;
+ description
+ "When set to true, the interface is logically looped back,
+ such that packets that are forwarded via the interface
+ are received on the same interface.";
+ }
+
+ uses interface-common-config;
+ }
+
+ grouping interface-phys-holdtime-config {
+ description
+ "Configuration data for interface hold-time settings --
+ applies to physical interfaces.";
+
+ leaf up {
+ type uint32;
+ units milliseconds;
+ default 0;
+ description
+ "Dampens advertisement when the interface
+ transitions from down to up. A zero value means dampening
+ is turned off, i.e., immediate notification.";
+ }
+
+ leaf down {
+ type uint32;
+ units milliseconds;
+ default 0;
+ description
+ "Dampens advertisement when the interface transitions from
+ up to down. A zero value means dampening is turned off,
+ i.e., immediate notification.";
+ }
+ }
+
+ grouping interface-phys-holdtime-state {
+ description
+ "Operational state data for interface hold-time.";
+ }
+
+ grouping interface-phys-holdtime-top {
+ description
+ "Top-level grouping for setting link transition
+ dampening on physical and other types of interfaces.";
+
+ container hold-time {
+ description
+ "Top-level container for hold-time settings to enable
+ dampening advertisements of interface transitions.";
+
+ container config {
+ description
+ "Configuration data for interface hold-time settings.";
+
+ uses interface-phys-holdtime-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for interface hold-time.";
+
+ uses interface-phys-holdtime-config;
+ uses interface-phys-holdtime-state;
+ }
+ }
+ }
+
+ grouping interface-common-state {
+ description
+ "Operational state data (in addition to intended configuration)
+ at the global level for this interface";
+
+ leaf ifindex {
+ type uint32;
+ description
+ "System assigned number for each interface. Corresponds to
+ ifIndex object in SNMP Interface MIB";
+ reference
+ "RFC 2863 - The Interfaces Group MIB";
+ }
+
+ leaf admin-status {
+ type enumeration {
+ enum UP {
+ description
+ "Ready to pass packets.";
+ }
+ enum DOWN {
+ description
+ "Not ready to pass packets and not in some test mode.";
+ }
+ enum TESTING {
+ //TODO: This is generally not supported as a configured
+ //admin state, though it's in the standard interfaces MIB.
+ //Consider removing it.
+ description
+ "In some test mode.";
+ }
+ }
+ //TODO:consider converting to an identity to have the
+ //flexibility to remove some values defined by RFC 7223 that
+ //are not used or not implemented consistently.
+ mandatory true;
+ description
+ "The desired state of the interface. In RFC 7223 this leaf
+ has the same read semantics as ifAdminStatus. Here, it
+ reflects the administrative state as set by enabling or
+ disabling the interface.";
+ reference
+ "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+ }
+
+ leaf oper-status {
+ type enumeration {
+ enum UP {
+ value 1;
+ description
+ "Ready to pass packets.";
+ }
+ enum DOWN {
+ value 2;
+ description
+ "The interface does not pass any packets.";
+ }
+ enum TESTING {
+ value 3;
+ description
+ "In some test mode. No operational packets can
+ be passed.";
+ }
+ enum UNKNOWN {
+ value 4;
+ description
+ "Status cannot be determined for some reason.";
+ }
+ enum DORMANT {
+ value 5;
+ description
+ "Waiting for some external event.";
+ }
+ enum NOT_PRESENT {
+ value 6;
+ description
+ "Some component (typically hardware) is missing.";
+ }
+ enum LOWER_LAYER_DOWN {
+ value 7;
+ description
+ "Down due to state of lower-layer interface(s).";
+ }
+ }
+ //TODO:consider converting to an identity to have the
+ //flexibility to remove some values defined by RFC 7223 that
+ //are not used or not implemented consistently.
+ mandatory true;
+ description
+ "The current operational state of the interface.
+
+ This leaf has the same semantics as ifOperStatus.";
+ reference
+ "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+ }
+
+ leaf last-change {
+ type oc-types:timeticks64;
+ units nanoseconds;
+ description
+ "This timestamp indicates the absolute time of the last
+ state change of the interface (e.g., up-to-down transition).
+ This is different than the SNMP ifLastChange object in the
+ standard interface MIB in that it is not relative to the
+ system boot time (i.e,. sysUpTime).
+
+ The value is the timestamp in nanoseconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+
+ leaf logical {
+ type boolean;
+ description
+ "When set to true, the interface is a logical interface
+ which does not have an associated physical port or
+ channel on the system.";
+ }
+ }
+
+
+ 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-pkts {
+ type oc-yang:counter64;
+ description
+ "The total number of packets received on the interface,
+ including all unicast, multicast, broadcast and bad packets
+ etc.";
+ reference
+ "RFC 2819: Remote Network Monitoring Management Information
+ Base";
+ }
+
+ 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-pkts {
+ type oc-yang:counter64;
+ description
+ "The total number of packets transmitted out of the
+ interface, including all unicast, multicast, broadcast,
+ and bad packets etc.";
+ reference
+ "RFC 2819: Remote Network Monitoring Management Information
+ Base";
+ }
+
+ 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 string;
+ //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;
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-isis-lsdb-types.yang b/src/plugins/yang/openconfig/openconfig-isis-lsdb-types.yang
new file mode 100644
index 0000000..5e53fd4
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-isis-lsdb-types.yang
@@ -0,0 +1,686 @@
+module openconfig-isis-lsdb-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/isis-lsdb-types";
+
+ prefix "oc-isis-lsdb-types";
+
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module contains general LSDB type definitions for use in
+ ISIS YANG model. ";
+
+ oc-ext:openconfig-version "0.4.0";
+
+ revision "2018-05-14" {
+ description
+ "Update LSDB model to correct Extended IS reach TLV
+ bug. This change is backwards incompatible due to
+ adding an additional level of hierarchy to support
+ multiple instances of the TLV.";
+ reference "0.4.0";
+ }
+
+ revision "2017-07-26" {
+ description
+ "Update LSDB and fix bugs.";
+ reference "0.3.2";
+ }
+
+ revision "2017-05-15" {
+ description
+ "Refactor LSDB.";
+ reference "0.3.0";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Remove top-level /isis container";
+ reference "0.2.1";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add segment routing to IS-IS module";
+ reference "0.2.0";
+ }
+
+ revision "2016-10-18" {
+ description
+ "Initial revision of IS-IS models.";
+ reference "0.1.0";
+ }
+
+ identity ISIS_TLV_TYPE {
+ description
+ "Base identity for an ISIS TLV type.";
+ }
+
+ identity ISIS_SUBTLV_TYPE {
+ description
+ "Base identity for an ISIS SUB-TLV type.";
+ }
+
+ identity IS_REACHABILITY_SUBTLVS_TYPE {
+ base "ISIS_SUBTLV_TYPE";
+ description
+ "Base identity for an ISIS TLV 22, 23, 222, 223, 141 SUB-TLV
+ type.";
+ }
+
+ identity IP_REACHABILITY_SUBTLVS_TYPE {
+ base "ISIS_SUBTLV_TYPE";
+ description
+ "Base identity for an ISIS TLV 135, 235, 236, 237 SUB-TLV
+ type.";
+ }
+
+ identity ROUTER_CAPABILITY_SUBTLVS_TYPE {
+ base "ISIS_SUBTLV_TYPE";
+ description
+ "Base identity for an ISIS TLV 242 SUB-TLV type.";
+ }
+
+ identity AREA_ADDRESSES {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 1. Intermediate System to Intermediate System Intra-
+ Domain Routeing Exchange Protocol for use in Conjunction with
+ the Protocol for Providing the Connectionless-mode Network
+ Service (ISO 8473), International Standard 10589: 2002, Second
+ Edition, 2002.";
+ reference
+ "ISO 10589";
+ }
+
+ identity IIS_NEIGHBORS {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 2. Intermediate System to Intermediate System Intra-
+ Domain Routeing Exchange Protocol for use in Conjunction with
+ the Protocol for Providing the Connectionless-mode Network
+ Service (ISO 8473), International Standard 10589: 2002, Second
+ Edition, 2002.";
+ reference
+ "ISO 10589";
+ }
+
+ identity INSTANCE_ID {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 7. An Instance Identifier (IID) to uniquely
+ identify an IS-IS instance. When the IID = 0, the list of
+ supported ITIDs MUST NOT be present. An IID-TLV with IID = 0
+ MUST NOT appear in an SNP or LSP. When the TLV appears (with a
+ non-zero IID) in an SNP or LSP, exactly one ITID. MUST be
+ present indicating the topology with which the PDU is
+ associated. If no ITIDs or multiple ITIDs are present or the
+ IID is zero, then the PDU MUST be ignored";
+ reference
+ "RFC6822: IS-IS Multi-Instance";
+ }
+
+ identity AUTHENTICATION {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 10.Intermediate System to Intermediate System Intra-
+ Domain Routeing Exchange Protocol for use in Conjunction with
+ the Protocol for Providing the Connectionless-mode Network
+ Service (ISO 8473) International Standard 10589: 2002, Second
+ Edition, 2002.";
+ reference
+ "ISO 10589";
+ }
+
+ identity PURGE_OI {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 13. If an IS generates a purge, it SHOULD include
+ this TLV in the purge with its own system ID. If an IS
+ receives a purge that does not include this TLV, then it SHOULD
+ add this TLV with both its own system ID and the system ID of
+ the IS from which it received the purge. This allows ISs
+ receiving purges to log the system ID of the originator, or the
+ upstream source of the purge.";
+ reference
+ "RFC6232: Purge Originator Identification TLV";
+ }
+
+ identity LSP_BUFFER_SIZE {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 14. The maximum MTU that the advertising system can
+ receive, expressed in bytes.";
+ reference
+ "ISO 10589: LSP Buffer Size TLV";
+ }
+
+ identity EXTENDED_IS_REACHABILITY {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 22. An extended IS reachability TLV that has a
+ different data structure to TLV 2 that introduces the use of
+ sub-TLV object-group.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering";
+ }
+
+ identity IS_NEIGHBOR_ATTRIBUTE {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 23. Identical in format to TLV 22 and included in
+ Original LSPs or Extended LSPs. Regardless of the type of LSP
+ in which the TLVs appear, the information pertains to the
+ neighbor relationship between the Originating System and the IS
+ identified in the TLV";
+ reference
+ "RFC5311: Simplified Extension of Link State PDU (LSP) Space
+ for IS-IS";
+ }
+
+ identity ISIS_ALIAS_ID {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 24. IS-Alias TLV which extension-capable ISs to
+ recognize the Originating System of an Extended LSP set. It
+ identifies the Normal system-id of the Originating System";
+ reference
+ "RFC5311: Simplified Extension of Link State PDU (LSP) Space
+ for IS-IS";
+ }
+
+ identity IPV4_INTERNAL_REACHABILITY {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 128. TLV defines IP addresses within the routing
+ domain reachable directly via one or more interfaces on this
+ Intermediate system";
+ reference
+ "RFC1195: OSI ISIS for IP and Dual Environments. RFC5302:
+ Domain-Wide Prefix Distribution with Two-Level IS-IS";
+ }
+
+ identity NLPID {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 129. TLV defines the set Network Layer Protocol
+ Identifiers for Network Layer protocols that this Intermediate
+ System is capable of relaying";
+ reference
+ "RFC1195: Use of OSI IS-IS for Routing in TCP/IP and
+ Dual Environments";
+ }
+
+ identity IPV4_EXTERNAL_REACHABILITY {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 130. TLV defines IP addresses outside the routing
+ domain reachable via interfaces on this Intermediate system.
+ This is permitted to appear multiple times, and in an LSP with
+ any LSP number. However, this field must not appear in
+ pseudonode LSPs";
+ reference "
+ RFC1195: OSI ISIS for IP and Dual Environments. RFC5302:
+ Domain-Wide Prefix Distribution with Two-Level IS-IS";
+ }
+
+ identity IPV4_INTERFACE_ADDRESSES {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 132. The IP address of one or more interfaces
+ corresponding to the SNPAs enabled on this Intermediate system
+ (i.e., one or more IP addresses of this router). This is
+ permitted to appear multiple times, and in an LSP with any LSP
+ number.";
+ reference
+ "RFC1195: Use of OSI IS-IS for Routing in TCP/IP and Dual
+ Environments";
+ }
+
+ identity IPV4_TE_ROUTER_ID {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 134. Traffic Engineering router ID TLV that contains
+ the 4-octet router ID of the router originating the LSP";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering";
+ }
+
+ identity EXTENDED_IPV4_REACHABILITY {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 135. Extended IP reachability TLV that provides for a
+ 32-bit metric and adds one bit to indicate that a prefix has
+ been redistributed _down_ in the hierarchy";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering";
+ }
+
+ identity DYNAMIC_NAME {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 137. The Dynamic hostname TLV is optional. This TLV
+ may be present in any fragment of a non-pseudonode LSP. The
+ value field identifies the symbolic name of the router
+ originating the LSP. This symbolic name can be the FQDN for the
+ router, it can be a subset of the FQDN, or it can be any string
+ operators want to use for the router.";
+ reference
+ "RFC6233: IS-IS Registry Extension for Purges, RFC 5301: Dynamic
+ Hostname Exchange Mechanism for IS-IS.";
+ }
+
+ identity IPV4_SRLG {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 138. IPv4 Shared Risk Link Group TLV";
+ reference
+ "RFC5307: IS-IS Extensions in Support of Generalized
+ Multi-Protocol Label Switching (GMPLS)";
+ }
+
+ identity IPV6_SRLG {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 139. IPv6 Shared Risk Link Group";
+ reference
+ "RFC6119: IPv6 Traffic Engineering in IS-IS";
+ }
+
+ identity IPV6_TE_ROUTER_ID {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 140. The IPv6 TE Router ID TLV contains a 16-octet
+ IPv6 address. A stable global IPv6 address MUST be used, so that
+ the router ID provides a routable address, regardless of the
+ state of a node's interfaces. If a router does not implement
+ traffic engineering, it MAY include or omit the IPv6 TE Router
+ ID TLV. If a router implements traffic engineering for IPv6, it
+ MUST include this TLV in its LSP. This TLV MUST NOT be included
+ more than once in an LSP.";
+ reference
+ "RFC6119: IPv6 Traffic Engineering in IS-IS.";
+ }
+
+ identity MT_ISN {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 222. TLV is aligned with extended IS reachability TLV
+ type 22 beside an additional two bytes in front at the beginning
+ of the TLV that. indicate MT membership.";
+ reference
+ "RFC5120: M-ISIS: Multi Topology (MT) Routing in Intermediate
+ System to Intermediate Systems (IS-ISs)";
+ }
+
+ identity MT_IS_NEIGHBOR_ATTRIBUTE {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 223. Is is identical in format to TLV 222. In the
+ event that there is a need to advertise in Extended LSPs such
+ information associated with neighbors of the Originating System,
+ it is necessary to define new TLVs to carry the sub-TLV
+ information.";
+ reference
+ "RFC5311: Simplified Extension of Link State PDU (LSP) Space for
+ IS-IS";
+ }
+
+ identity MULTI_TOPOLOGY {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 229. This MT TLV can advertise up to 127 MTs. It is
+ announced in IIHs and LSP fragment 0, and can occur multiple
+ times. The resulting MT set SHOULD be the union of all the MT
+ TLV occurrences in the packet. Any other IS-IS PDU occurrence of
+ this TLV MUST be ignored. Lack of MT TLV in hellos and fragment
+ zero LSPs MUST be interpreted as participation of the
+ advertising interface or router in MT ID #0 only. If a router
+ advertises MT TLV, it has to advertise all the MTs it
+ participates in, specifically including topology ID #0 also.";
+ reference
+ "RFC5120: M-ISIS: Multi Topology (MT) Routing in Intermediate
+ System to Intermediate Systems (IS-ISs)";
+ }
+
+ identity IPV6_INTERFACE_ADDRESSES {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 232. IPv6 Interface Address TLV that maps directly to
+ the IP Interface Address TLV in [RFC1195]. We necessarily modify
+ the contents to be 0-15 16-octet IPv6 interface addresses
+ instead of 0-63 4-octet IPv4 interface addresses";
+ reference "RFC5308: Routing IPv6 with IS-IS.";
+ }
+
+ identity MT_IPV4_REACHABILITY {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 235. TLV is aligned with extended IP reachability TLV
+ type 135 beside an additional two bytes in front to indicate MT
+ membership";
+ reference
+ "RFC5120: M-ISIS: Multi Topology (MT) Routing in Intermediate
+ System to Intermediate Systems (IS-ISs)";
+ }
+
+ identity IPV6_REACHABILITY {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 236. The IPv6 Reachability TLV describes network
+ reachability through the specification of a routing prefix,
+ metric information, a bit to indicate if the prefix is being
+ advertised down from a higher level, a bit to indicate if the
+ prefix is being distributed from another routing protocol, and
+ OPTIONALLY the existence of Sub-TLVs to allow for later
+ extension.";
+ reference
+ "RFC5308: Routing IPv6 with IS-IS";
+ }
+
+ identity MT_IPV6_REACHABILITY {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 237. TLV is aligned with IPv6 Reachability TLV type
+ 236 beside an additional two bytes in front to indicate MT
+ membership.";
+ reference
+ "RFC5120: M-ISIS: Multi Topology (MT) Routing in Intermediate
+ System to Intermediate Systems (IS-ISs).";
+ }
+
+ identity ROUTER_CAPABILITY {
+ base "ISIS_TLV_TYPE";
+ description
+ "ISIS TLV 242. IS-IS TLV named CAPABILITY, formed of multiple
+ sub-TLVs, which allows a router to announce its capabilities
+ within an IS-IS level or the entire routing domain.";
+ reference
+ "RFC4971: Intermediate System to Intermediate System (IS-IS)
+ Extensions for Advertising Router Information.";
+ }
+
+ //sub-TLVs for TLVs 22, 23, 141, 222, 223
+
+ identity IS_REACHABILITY_ADMIN_GROUP {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 3. Administrative group(color).";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering";
+ }
+
+ identity IS_REACHABILITY_LINK_ID {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 4. Link Local/Remote Identifiers.";
+ reference
+ "RFC5307: IS-IS Extensions in Support of Generalized
+ Multi-Protocol Label Switching (GMPLS)";
+ }
+
+ identity IS_REACHABILITY_IPV4_INTERFACE_ADDRESS {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 6. IPv4 Interface Address.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.";
+ }
+
+ identity IS_REACHABILITY_IPV4_NEIGHBOR_ADDRESS {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 8. IPv4 Neighbor Address.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.";
+ }
+
+ identity IS_REACHABILITY_MAX_LINK_BANDWIDTH {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 9. Maximum Link Bandwidth.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.";
+ }
+
+ identity IS_REACHABILITY_MAX_RESERVABLE_BANDWIDTH {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 10. Maximum Reservable Bandwidth.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.";
+ }
+
+ identity IS_REACHABILITY_UNRESERVED_BANDWIDTH {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 11. Unreserved bandwidth.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.";
+ }
+
+ identity IS_REACHABILITY_IPV6_INTERFACE_ADDRESS {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 12. IPv6 Interface Address.";
+ reference
+ "RFC6119: IPv6 Traffic Engineering in IS-IS.";
+ }
+
+ identity IS_REACHABILITY_IPV6_NEIGHBOR_ADDRESS {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 13. IPv6 Neighbor Address.";
+ reference
+ "RFC6119: IPv6 Traffic Engineering in IS-IS.";
+ }
+
+ identity IS_REACHABILITY_EXTENDED_ADMIN_GROUP {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 14. Extended Administrative Group.";
+ reference
+ "RFC7308: Extended Administrative Groups in MPLS Traffic
+ Engineering (MPLS-TE).";
+ }
+
+ identity IS_REACHABILITY_TE_DEFAULT_METRIC {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 18. TE Default Metric.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.";
+ }
+
+ identity IS_REACHABILITY_LINK_ATTRIBUTES {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 19. Link Attributes.";
+ reference
+ "RFC5209: Definition of an IS-IS Link Attribute Sub-TLV.";
+ }
+
+ identity IS_REACHABILITY_LINK_PROTECTION_TYPE {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 20. Link Protection Type.";
+ reference
+ "RFC5307: IS-IS Extensions in Support of Generalized
+ Multi-Protocol Label Switching (GMPLS)";
+ }
+
+ identity IS_REACHABILITY_BANDWIDTH_CONSTRAINTS {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 22. Bandwidth Constraints.";
+ reference
+ "RFC4124: Protocol Extensions for Support of Diffserv-aware MPLS
+ Traffic Engineering.";
+ }
+
+ identity IS_REACHABILITY_UNCONSTRAINED_LSP {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 23. Unconstrained LSP.";
+ reference
+ "RFC5330: A Link-Type sub-TLV to Convey the Number of Traffic
+ Engineering Label Switched Paths Signalled with Zero
+ Reserved Bandwidth across a Link.";
+ }
+
+ identity IS_REACHABILITY_ADJ_SID {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 31. Adjacency Segment Identifier.";
+ reference
+ "draft-ietf-isis-segment-routing-extensions.";
+ }
+
+ identity IS_REACHABILITY_ADJ_LAN_SID {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 32. Adjacency LAN Segment Identifier.";
+ reference
+ "draft-ietf-isis-segment-routing-extensions.";
+ }
+
+ identity IS_REACHABILITY_LINK_DELAY {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 33. Unidirectional Link Delay.";
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+ }
+
+ identity IS_REACHABILITY_MIN_MAX_LINK_DELAY {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 34. Min/Max Unidirectional Link Delay.";
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+ }
+
+ identity IS_REACHABILITY_LINK_DELAY_VARIATION {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 35. Unidirectional Link Delay Variation.";
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+ }
+
+ identity IS_REACHABILITY_LINK_LOSS {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 36. Unidirectional Link Loss Delay.";
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+ }
+
+ identity IS_REACHABILITY_RESIDUAL_BANDWIDTH {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 37. Unidirectional Residual Bandwidth.";
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+ }
+
+ identity IS_REACHABILITY_AVAILABLE_BANDWIDTH {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 38. Unidirectional Available Bandwidth.";
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+ }
+
+ identity IS_REACHABILITY_UTILIZED_BANDWIDTH {
+ base "IS_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 39. Unidirectional Utilized Bandwidth.";
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+ }
+
+ //sub-TLVs for TLVs 135, 235, 236, 237
+ identity IP_REACHABILITY_TAG {
+ base "IP_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 1. 32-bit Administrative Tag.";
+ reference
+ "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and IPv6
+ Reachability.";
+ }
+
+ identity IP_REACHABILITY_TAG64 {
+ base "IP_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 2. 64-bit Administrative Tag.";
+ reference
+ "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and IPv6
+ Reachability.";
+ }
+
+ identity IP_REACHABILITY_PREFIX_SID {
+ base "IP_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 3. Prefix Segment Identifier.";
+ reference
+ "draft-ietf-isis-segment-routing-extension.";
+ }
+
+ identity IP_REACHABILITY_PREFIX_FLAGS {
+ base "IP_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 4. Prefix Attribute Flags.";
+ reference
+ "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and IPv6
+ Reachability.";
+ }
+
+ identity IP_REACHABILITY_IPV4_ROUTER_ID {
+ base "IP_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 11. IPv4 Source Router ID.";
+ reference
+ "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and IPv6
+ Reachability.";
+ }
+
+ identity IP_REACHABILITY_IPV6_ROUTER_ID {
+ base "IP_REACHABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 12. IPv6 Source Router ID.";
+ reference
+ "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and IPv6
+ Reachability.";
+ }
+
+
+ //sub-TLVs for TLVs 242
+
+ identity ROUTER_CAPABILITY_SR_CAPABILITY {
+ base "ROUTER_CAPABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 2. Segment Routing Capability.";
+ reference
+ "draft-ietf-isis-segment-routing-extensions.";
+ }
+
+ identity ROUTER_CAPABILITY_SR_ALGORITHM {
+ base "ROUTER_CAPABILITY_SUBTLVS_TYPE";
+ description
+ "sub-TLV 19. Segment Routing Algorithm.";
+ reference
+ "draft-ietf-isis-segment-routing-extensions.";
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-isis-lsp.yang b/src/plugins/yang/openconfig/openconfig-isis-lsp.yang
new file mode 100644
index 0000000..02f8b79
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-isis-lsp.yang
@@ -0,0 +1,3592 @@
+submodule openconfig-isis-lsp {
+
+ belongs-to openconfig-isis {
+ prefix oc-isis;
+ }
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-inet-types { prefix "inet"; }
+ import openconfig-isis-types { prefix "oc-isis-types"; }
+ import openconfig-isis-lsdb-types { prefix "oc-isis-lsdb-types"; }
+ import openconfig-types { prefix "oc-types"; }
+ import openconfig-mpls-types { prefix "oc-mpls-types"; }
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net ";
+
+ description
+ "This sub-module describes a YANG model for the IS-IS Link State
+ Database (LSDB).
+
+ Portions of this code were derived from IETF RFCs relating to the
+ IS-IS protocol.
+ 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 "0.4.0";
+
+ revision "2018-05-14" {
+ description
+ "Update LSDB model to correct Extended IS reach TLV
+ bug. This change is backwards incompatible due to
+ adding an additional level of hierarchy to support
+ multiple instances of the TLV.";
+ reference "0.4.0";
+ }
+
+ revision "2017-07-26" {
+ description
+ "Update LSDB and fix bugs.";
+ reference "0.3.2";
+ }
+
+ revision "2017-05-15" {
+ description
+ "Refactor LSDB.";
+ reference "0.3.0";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Remove top-level /isis container";
+ reference "0.2.1";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add segment routing to IS-IS module";
+ reference "0.2.0";
+ }
+
+ revision "2016-10-18" {
+ description
+ "Initial revision of IS-IS models.";
+ reference "0.1.0";
+ }
+
+ typedef isis-metric-flags {
+ type enumeration {
+ enum INTERNAL {
+ description
+ "When this flag is not set, internal metrics are in use.";
+ }
+ enum UNSUPPORTED {
+ description
+ "When this flag (referred to as the S-bit) is set, then
+ the metric is unsupported.";
+ }
+ }
+ description
+ "Type definition for flags used in IS-IS metrics";
+ }
+
+ grouping isis-lsdb-link-characteristics-a-bit {
+ description
+ "Definition of the A bit, as used in IS-IS link delay TLVs.";
+
+ leaf a-bit {
+ type boolean;
+ description
+ "The A bit is set when the measured value of this parameter
+ exceeds its configured maximum threshold. The A bit is cleared
+ when the measured value falls below its configured reuse
+ threshold.";
+ }
+ }
+
+ grouping isis-lsdb-tlv-nlpid-state {
+ description
+ "NLP ID parameters for IS-IS.";
+
+ leaf-list nlpid {
+ type enumeration {
+ enum IPV4 {
+ description "IPv4 Address family.";
+ }
+ enum IPV6 {
+ description "IPv6 Address family.";
+ }
+ }
+ description
+ "Protocol supported. IPv4 is defined as (0xcc) and IPv6 -
+ (0x8e)";
+ reference
+ "RFC1195: Use of OSI IS-IS for Routing in TCP/IP and
+ Dual Environments. TLV 129. ";
+ }
+ }
+
+ grouping isis-lsdb-subtlv-type-state {
+ description
+ "Per-subTLV type operational state parameters for ISIS.";
+
+ leaf type {
+ type identityref {
+ base oc-isis-lsdb-types:ISIS_SUBTLV_TYPE;
+ }
+ description
+ "The type of subTLV being described. The type of subTLV is
+ expressed as a canonical name.";
+ }
+ }
+
+ grouping isis-lsdb-tlv-type-state {
+ description
+ "Per-subTLV type operational state parameters for ISIS.";
+
+ leaf type {
+ type identityref {
+ base oc-isis-lsdb-types:ISIS_TLV_TYPE;
+ }
+ description
+ "The type of TLV being described. The type of TLV is
+ expressed as a canonical name.";
+ }
+ }
+
+ grouping is-reachability-neighbor-state {
+ description
+ "This grouping defines is-reachability neighbor.";
+
+ container subtlvs {
+ description
+ "This container describes IS Neighbor sub-TLVs.";
+
+ list subtlv {
+ key "type";
+
+ description
+ "List of subTLV types in the LSDB for the specified TLV.";
+
+ leaf type {
+ type leafref {
+ path "../state/type";
+ }
+ description
+ "Reference to the sub-TLV type.";
+ }
+
+ container state {
+ description
+ "State parameters of IS neighbor state";
+
+ uses isis-lsdb-subtlv-type-state;
+ }
+
+ container admin-group {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_ADMIN_GROUP'" {
+ description
+ "Only include the administrative group container when
+ the sub-TLV is type 3";
+ }
+ description
+ "This container defines sub-TLV 3.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 3.";
+
+ leaf-list admin-group {
+ type uint32;
+ description
+ "The administrative group sub-TLV contains a 4-octet
+ bit mask assigned by the network administrator. Each
+ set bit corresponds to one administrative group
+ assigned to the interface. By convention, the least
+ significant bit is referred to as group 0, and the
+ most significant bit is referred to as group 31.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.
+ sub-TLV 3: TLV 22,23,141,222, 223.";
+ }
+ }
+ }
+
+ container link-id {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_ID'" {
+ description
+ "Only include the link identifier container when the
+ sub-TLV is type 4";
+ }
+ description
+ "This container defines sub-TLV 4.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 4.";
+
+ leaf local {
+ type uint32;
+ description
+ "The value field of this sub-TLV contains 4 octets of
+ Link Local Identifier followed by 4 octets of Link
+ Remote Identifier.";
+ reference
+ "RFC5307: IS-IS Extensions in Support of Generalized
+ Multi-Protocol Label Switching (GMPLS). sub-TLV 3: TLV
+ 22,23,141,222, 223.";
+ }
+
+ leaf remote {
+ type uint32;
+ description
+ "If the Link Remote Identifier is unknown, it is set
+ to 0.";
+ reference
+ "RFC5307: IS-IS Extensions in Support of Generalized
+ Multi-Protocol Label Switching (GMPLS). sub-TLV 3: TLV
+ 22,23,141,222, 223.";
+ }
+ }
+ }
+
+ container ipv4-interface-address {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_IPV4_INTERFACE_ADDRESS'" {
+ description
+ "Only include the IPv4 interface address group container
+ when the sub-TLV is type 6";
+ }
+ description
+ "This container defines sub-TLV 6.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 6.";
+
+ leaf-list address {
+ type inet:ipv4-address;
+ description
+ "A 4-octet IPv4 address for the interface described by
+ the (main) TLV. This sub-TLV can occur multiple
+ times.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.
+ sub-TLV 6: TLV 22,23,41,222,223.";
+ }
+ }
+ }
+
+ container ipv4-neighbor-address {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_IPV4_NEIGHBOR_ADDRESS'" {
+ description
+ "Only include the IPv4 neighbor address container when
+ the sub-TLV is type 8.";
+ }
+ description
+ "This container defines sub-TLV 8.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 8.";
+
+ leaf-list address {
+ type inet:ipv4-address;
+ description
+ "A single IPv4 address for a neighboring router on
+ this link. This sub-TLV can occur multiple times.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.
+ sub-TLV 8: TLV 22,23, 141,222,223.";
+ }
+ }
+ }
+
+ container max-link-bandwidth {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_MAX_LINK_BANDWIDTH'" {
+ description
+ "Only include the maximum link bandwidth container when
+ the sub-TLV is type 9.";
+ }
+ description
+ "This container defines sub-TLV 9.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 9.";
+
+ leaf bandwidth {
+ type oc-types:ieeefloat32;
+ units "bytes per second";
+ description
+ "The maximum bandwidth that can be used on this link
+ in this direction (from the system originating the LSP
+ to its neighbors). It is encoded in 32 bits in IEEE
+ floating point format. The units are bytes (not
+ bits!) per second.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.
+ sub-TLV 9: TLV 22,23,141,222,223.";
+ }
+ }
+ }
+
+ container max-reservable-link-bandwidth {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_MAX_RESERVABLE_BANDWIDTH'" {
+ description
+ "Only include the maximum reservable link bandwidth
+ container when the sub-TLV type is 10.";
+ }
+ description
+ "This container defines sub-TLV 10.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 10.";
+
+ leaf bandwidth {
+ type oc-types:ieeefloat32;
+ units "bytes per second";
+ description
+ "The maximum amount of bandwidth that can be reserved
+ in this direction on this link. Note that for
+ oversubscription purposes, this can be greater than
+ the bandwidth of the link. It is encoded in 32 bits
+ in IEEE floating point format. The units are bytes
+ (not bits!) per second.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.
+ Sub-TLV 10: TLV 22,23,141,222,223.";
+ }
+ }
+ }
+
+ container unreserved-bandwidth {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_UNRESERVED_BANDWIDTH'" {
+ description
+ "Only include the unreserved bandwidth container when
+ the sub-TLV type is 11.";
+ }
+ description
+ "This container defines unreserved-bandwidth. The units
+ are bytes per second.";
+
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering. sub-
+ TLV 11: TLV 22,23,141,222,223";
+
+ list setup-priority {
+ key "priority";
+
+ leaf priority {
+ type leafref {
+ path "../state/priority";
+ }
+ description
+ "Reference to the setup priority to which the
+ unreserved bandwidth corresponds.";
+ }
+
+ description
+ "Setup priority (0 through 7) for unreserved
+ bandwidth.";
+
+ container state {
+ description
+ "State parameters of IS Extended Reachability sub-TLV
+ 11.";
+
+ leaf priority {
+ type uint8 {
+ range "0..7";
+ }
+ description
+ "Setup priority level of 0 through 7 to be used by
+ Unreserved Bandwidth sub-TLV 11.";
+ }
+
+ leaf bandwidth {
+ type oc-types:ieeefloat32;
+ units "bytes per second";
+ description
+ "The amount of bandwidth reservable in this
+ direction on this link. Note that for
+ oversubscription purposes, this can be greater than
+ the bandwidth of the link. It contains eight 32-bit
+ IEEE floating point numbers(one for each priority).
+ The units are bytes (not bits!) per second. The
+ values correspond to the bandwidth that can be
+ reserved with a setup priority of 0 through 7,
+ arranged in increasing order with priority 0
+ occurring at the start of the sub-TLV, and priority
+ 7 at the end of the sub-TLV.";
+ }
+ }
+ }
+ }
+
+ container ipv6-interface-address {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_IPV6_INTERFACE_ADDRESS'" {
+ description
+ "Only include the IPv6 interface address when the
+ sub-TLV type is 12.";
+ }
+ description
+ "This container defines sub-TLV 12.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 12.";
+
+ leaf-list address {
+ type inet:ipv6-address;
+ description
+ "Contains a 16-octet IPv6 address for the interface
+ described by the containing Extended IS Reachability
+ TLV. This sub-TLV can occur multiple times.";
+ reference
+ "RFC6119: IPv6 Traffic Engineering in IS-IS. sub-TLV
+ 12: TLV 22,23,141,222,223.";
+ }
+ }
+ }
+
+ container ipv6-neighbor-address {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_IPV6_NEIGHBOR_ADDRESS'" {
+ description
+ "Only include the IPv6 neighbor address when the
+ sub-TLV type is 13.";
+ }
+ description
+ "This container defines sub-TLV 13.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 13.";
+
+ leaf-list address {
+ type inet:ipv6-address;
+ description
+ "Contains a 16-octet IPv6 address for a neighboring
+ router on the link described by the (main) TLV. This
+ sub-TLV can occur multiple times.";
+ reference
+ "RFC6119: IPv6 Traffic Engineering in IS-IS. sub-TLV
+ 13: ISIS TLV 22,23,141,222,223.";
+ }
+ }
+ }
+
+ container extended-admin-group {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_EXTENDED_ADMIN_GROUP'" {
+ description
+ "Only include the extended admin group when the
+ sub-TLV type is 14.";
+ }
+ description
+ "This container defines sub-TLV 14.";
+ container state {
+ description
+ "State parameters of sub-TLV 14.";
+
+ leaf-list extended-admin-group {
+ type uint32;
+ description
+ "The extended-admin-group sub-TLV is used in addition
+ to the Administrative Groups when it is desirable to
+ make more than 32 colors available for advertisement
+ in a network.";
+ reference
+ "RFC7308: Extended Administrative Groups in MPLS
+ Traffic Engineering (MPLS-TE). sub-TLV 14: TLV
+ 22,23,141,222,223.";
+ }
+ }
+ }
+
+ container te-default-metric {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_TE_DEFAULT_METRIC'" {
+ description
+ "Only include the default traffic engineering metric
+ container when the sub-TLV type is 18.";
+ }
+ description
+ "This container defines sub-TLV 18.";
+ container state {
+ description
+ "State parameters of sub-TLV 18.";
+
+ leaf metric {
+ type uint32;
+ description
+ "This metric is administratively assigned and can be
+ used to present a differently weighted topology to
+ traffic engineering SPF calculations. To preclude
+ overflow within a traffic engineering SPF
+ implementation, all metrics greater than or equal to
+ MAX_PATH_METRIC SHALL be considered to have a metric
+ of MAX_PATH_METRIC.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering.
+ sub-TLV 18: TLV 22,23,141,222,223.";
+ }
+ }
+ }
+
+ container link-attributes {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_ATTRIBUTES'" {
+ description
+ "Only include the link attributes container when the
+ sub-TLV is type 19.";
+ }
+ description
+ "This container defines link-attributes.";
+
+ container state {
+ description
+ "State parameters of IS Extended Reachability sub-TLV
+ 19.";
+
+ leaf-list local-protection {
+ type enumeration {
+ enum LOCAL_PROTECTION {
+ description
+ "If set, local protection is available for the
+ link.";
+ }
+ enum LINK_EXCLUDED {
+ description
+ "If set, the link is excluded from local
+ protection.";
+ }
+ }
+ description
+ "Link local-protection attributes.";
+
+ reference
+ "RFC5029: Definition of an IS-IS Link Attribute Sub-
+ TLV. TLV 22, sub-TLV 19.";
+ }
+ }
+ }
+
+ container link-protection-type {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_PROTECTION_TYPE'" {
+ description
+ "Only include the link protection type container when
+ the sub-TLV type 20.";
+ }
+ description
+ "ISIS LSDB parameters relating to the type of link
+ protection offered.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 20.";
+
+ leaf-list type {
+ type enumeration {
+ enum EXTRA_TRAFFIC {
+ description
+ "If set the link has extra traffic protection. If
+ the link is of type Extra Traffic, it means that
+ the link is protecting another link or links. The
+ LSPs on a link of this type will be lost if any of
+ the links it is protecting fail.";
+ }
+ enum UNPROTECTED {
+ description
+ "If set, the link is unprotected. If the link is
+ of type Unprotected, it means that there is no
+ other link protecting this link. The LSPs on a
+ link of this type will be lost if the link
+ fails.";
+ }
+ enum SHARED {
+ description
+ "If set, the link has shared protection. If the
+ link is of type Shared, it means that there are
+ one or more disjoint links of type Extra Traffic
+ that are protecting this link. These Extra
+ Traffic links are shared between one or more links
+ of type Shared.";
+ }
+ enum ONE_ONE {
+ description
+ "If set, the link has dedicated 1:1 protection. If
+ the link is of type Dedicated 1:1, it means that
+ there is one dedicated disjoint link of type Extra
+ Traffic that is protecting this link.";
+ }
+ enum PLUS_ONE {
+ description
+ "If set, the link has dedicated 1+1 protection. If
+ the link is of type Dedicated 1+1, it means that a
+ dedicated disjoint link is protecting this link.
+ However, the protecting link is not advertised in
+ the link state database and is therefore not
+ available for the routing of LSPs.";
+ }
+ enum ENHANCED {
+ description
+ "If set the link has enhanced protection. If the
+ link is of type Enhanced, it means that a
+ protection scheme that is more reliable than
+ Dedicated 1+1, e.g., 4 fiber BLSR/MS-SPRING, is
+ being used to protect this link.";
+ }
+ }
+ description
+ "Link protection capabilities.";
+ reference
+ "RFC5307: IS-IS Extensions in Support of Generalized
+ Multi-Protocol Label Switching (GMPLS). sub-TLV 20:
+ TLV 22,23,141,222,223.";
+ }
+ }
+ }
+
+ container bandwidth-constraints {
+ when "../state/type =" +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_BANDWIDTH_CONSTRAINTS'" {
+ description
+ "Only include the bandwidth constraints container when
+ the sub-TLV is type 22.";
+ }
+ description
+ "This container defines bandwidth-constraints. For DS-TE,
+ the existing Maximum Reservable link bandwidth parameter
+ is retained, but its semantics is generalized and
+ interpreted as the aggregate bandwidth constraint across
+ all Class-Types";
+
+ reference
+ "RFC4124: Protocol Extensions for Support of Diffserv-
+ aware MPLS Traffic Engineering. sub-TLV 22: TLV 22, 23,
+ 141, 222,223";
+
+ list bandwidth-constraint {
+ key "model-id";
+
+ description
+ "List of the Bandwidth Constraints sub-TLV instances
+ present in the TLV.";
+
+ leaf model-id {
+ type leafref {
+ path "../state/model-id";
+ }
+ description
+ "Reference to the model ID associated with the
+ instance of the Bandwidth Constraints sub-TLV.";
+ }
+
+ container state {
+ description
+ "State parameters of IS Extended Reachability sub-TLV
+ 22.";
+
+ leaf model-id {
+ type uint8;
+ description
+ "Identifier for the Bandwidth Constraints Model
+ currently in use by the LSR initiating the IGP
+ advertisement.";
+ }
+ }
+
+ container constraints {
+ description
+ "Constraints contained within the Bandwidth
+ Constraints sub-TLV";
+
+ list constraint {
+ key "constraint-id";
+
+ description
+ "List of the constraints within the Bandwidth
+ Constraints sub-TLV. The BC0 level is indicated by
+ the constraint-id leaf being set to 0, with BCN
+ being indicated by constraint-id N.";
+
+ leaf constraint-id {
+ type leafref {
+ path "../state/constraint-id";
+ }
+ description
+ "Reference to the unique ID for the BCN level.";
+ }
+
+ container state {
+ description
+ "Operational state parameters of the BCN level";
+
+ leaf constraint-id {
+ type uint32;
+ description
+ "Unique reference for the bandwidth constraint level. BC0
+ is indicated by this leaf being set to zero, with BCN
+ represented by this leaf being set to N.";
+ }
+
+ leaf bandwidth {
+ type oc-types:ieeefloat32;
+ units "bytes per second";
+ description
+ "The bandwidth constraint, expressed as a 32-bit IEEE
+ floating point number expressed in bytes per second.";
+ }
+ }
+ }
+ }
+ }
+ }
+
+ container unconstrained-lsp {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_UNCONSTRAINED_LSP'" {
+ description
+ "Only include the unconstrained LSP container when the
+ sub-TLV is type 23.";
+ }
+ description
+ "This container defines sub-TLV 23.";
+ container state {
+ description
+ "State parameters of sub-TLV 23.";
+
+ uses isis-lsdb-subtlv-type-state;
+
+ leaf count {
+ type uint16;
+ description
+ "Unconstrained TE LSP count(TE Label Switched Paths
+ (LSPs) signalled with zero bandwidth).";
+ reference
+ "RFC5330: A Link-Type sub-TLV to Convey the Number of
+ Traffic Engineering Label Switched Paths Signalled
+ with Zero Reserved Bandwidth across a Link. sub-TLV
+ 23: TLV 22,23,141,222,223";
+ }
+ }
+ }
+
+ container adjacency-sids {
+ when "../state/type = 'oc-isis-lsdb-types:IS_REACHABILITY_ADJ_SID'" {
+ description
+ "Only include the adjacency SIDs container when the
+ sub-TLV type is 31";
+ }
+
+ description
+ "This container defines segment routing adjacency SIDs.";
+
+ list adjacency-sid {
+ key "value";
+
+ description
+ "Adjacency Segment-IDs List. An IGP-Adjacency Segment is
+ an IGP segment attached to a unidirectional adjacency or
+ a set of unidirectional adjacencies. By default, an IGP-
+ Adjacency Segment is local to the node which advertises
+ it.";
+
+ leaf value {
+ type leafref {
+ path "../state/value";
+ }
+ description
+ "Reference to the value of the Adjacency-SID.";
+ }
+
+ container state {
+ description
+ "State parameters of Adjacency-SID.";
+
+ leaf value {
+ type uint32;
+ description
+ "Adjacency-SID value.";
+ }
+
+ leaf-list flags {
+ type enumeration {
+ enum ADDRESS_FAMILY {
+ description
+ "Address-family flag. When unset, the Adj-SID
+ refers to an adjacency with outgoing IPv4
+ encapsulation. If set then the Adj-SID refers to
+ an adjacency with outgoing IPv6 encapsulation.";
+ }
+ enum BACKUP {
+ description
+ "Backup flag. When set, the Adj-SID refers to an
+ adjacency being protected (e.g.: using IPFRR or
+ MPLS-FRR).";
+ }
+ enum VALUE {
+ description
+ "Value flag. When set, the SID carries a value
+ (instead of an index). By default the flag is
+ SET.";
+ }
+ enum LOCAL {
+ description
+ "Local flag. When set, the value/index carried
+ by the SID has local significance. By default
+ the flag is SET.";
+ }
+ enum SET {
+ description
+ "Set flag. When set, the S-Flag indicates that
+ the Adj-SID refers to a set of adjacencies.";
+ }
+ }
+ description
+ "Flags associated with Adj-Segment-ID.";
+ }
+
+ leaf weight {
+ type uint8;
+ description
+ "Value that represents the weight of the Adj-SID for
+ the purpose of load balancing.";
+ }
+ }
+ }
+
+ reference
+ "draft-ietf-isis-segment-routing-extensions. sub-TLV 31:
+ TLV 22, 222, 223, 141. ";
+ }
+
+ container lan-adjacency-sids {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_ADJ_LAN_SID'" {
+ description
+ "Only include the LAN adjacency SID container when
+ the sub-TLV is type 32.";
+ }
+ description
+ "This container defines segment routing LAN adjacency
+ SIDs";
+
+ list lan-adjacency-sid {
+ key "value";
+
+ description
+ "Adjacency Segment-IDs List. An IGP-Adjacency Segment is
+ an IGP segment attached to a unidirectional adjacency or
+ a set of unidirectional adjacencies. By default, an IGP-
+ Adjacency Segment is local to the node which advertises
+ it.";
+
+ leaf value {
+ type leafref {
+ path "../state/value";
+ }
+ description
+ "Reference to the value of the LAN Adjacency-SID.";
+ }
+
+ container state {
+ description
+ "State parameters of LAN Adjacency-SID.";
+
+ leaf value {
+ type uint32;
+ description
+ "LAN Adjacency-SID value.";
+ }
+
+ leaf-list flags {
+ type enumeration {
+ enum ADDRESS_FAMILY {
+ description
+ "Address-family flag. When unset, the Adj-SID
+ refers to an adjacency with outgoing IPv4
+ encapsulation. If set then the Adj-SID refers to
+ an adjacency with outgoing IPv6 encapsulation.";
+ }
+ enum BACKUP {
+ description
+ "Backup flag. When set, the Adj-SID refers to an
+ adjacency being protected (e.g.: using IPFRR or
+ MPLS-FRR).";
+ }
+ enum VALUE {
+ description
+ "Value flag. When set, the SID carries a value
+ (instead of an index). By default the flag is
+ SET.";
+ }
+ enum LOCAL {
+ description
+ "Local flag. When set, the value/index carried
+ by the SID has local significance. By default
+ the flag is SET.";
+ }
+ enum SET {
+ description
+ "Set flag. When set, the S-Flag indicates that
+ the Adj-SID refers to a set of adjacencies.";
+ }
+ }
+ description
+ "Flags associated with LAN-Adj-Segment-ID.";
+ }
+
+ leaf weight {
+ type uint8;
+ description
+ "Value that represents the weight of the Adj-SID
+ for the purpose of load balancing.";
+ }
+
+ leaf neighbor-id {
+ type oc-isis-types:system-id;
+ description
+ "System ID of the neighbor associated with the LAN-
+ Adj-Segment-ID value.";
+ }
+ }
+ }
+
+ reference
+ "draft-ietf-isis-segment-routing-extensions. sub-TLV 32:
+ TLV 22, 222, 223, 141.";
+ }
+
+ container link-delay {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_DELAY'" {
+ description
+ "Include the link delay container only when the sub-TLV
+ type is type 33.";
+ }
+ description
+ "This container defines unidirectional link delay.";
+
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric
+ Extensions. sub-TLV 33: TLV 22, 23, 141, 222, 223.";
+
+ container state {
+ description
+ "State parameters of IS Extended Reachability sub-TLV
+ 33.";
+
+ uses isis-lsdb-link-characteristics-a-bit;
+
+ leaf delay {
+ type uint32;
+ units microseconds;
+ description
+ "Average link delay value (in microseconds) between
+ two directly connected IS-IS neighbors over a
+ configurable interval.";
+ }
+ }
+ }
+
+ container min-max-link-delay {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_MIN_MAX_LINK_DELAY'" {
+ description
+ "Only include the min/max link delay container when the
+ sub-TLV is type 34.";
+ }
+ description
+ "This container defines min/max link delay.";
+
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric
+ Extensions. sub-TLV 34: TLV 22, 23, 141, 222, 223.";
+
+ container state {
+ description
+ "State parameters of IS Extended Reachability sub-TLV
+ 34.";
+
+ uses isis-lsdb-link-characteristics-a-bit;
+
+ leaf min-delay {
+ type uint32;
+ units microseconds;
+ description
+ "Minimum measured link delay value(in microseconds)
+ between two directly connected IS-IS neighbors over a
+ configurable interval.";
+ }
+
+ leaf max-delay {
+ type uint32;
+ units microseconds;
+ description
+ "Maximum measured link delay value(in microseconds)
+ between two directly connected IS-IS neighbors over a
+ configurable interval.";
+ }
+ }
+ }
+
+ container link-delay-variation {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_DELAY_VARIATION'" {
+ description
+ "Only include the link delay variation container when
+ the sub-TLV is type 35.";
+ }
+ description
+ "This container defines unidirectional link delay
+ variation.";
+
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric
+ Extensions. sub-TLV 35: TLV 22,23,141,222,223.";
+
+ container state {
+ description
+ "State parameters of IS Extended Reachability sub-TLV
+ 35.";
+
+ leaf delay {
+ type uint32;
+ units microseconds;
+ description
+ "Average link delay between two directly connected IS-
+ IS neighbors over a configurable interval.";
+ }
+ }
+ }
+
+ container link-loss {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_LOSS'" {
+ description
+ "Only include the link loss container when the sub-TLV
+ is type 36.";
+ }
+ description
+ "This container defines unidirectional link loss delay.";
+
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric
+ Extensions. sub-TLV 36: TLV 22, 23, 141, 222, 223.";
+
+ container state {
+ description
+ "State parameters of IS Extended Reachability sub-TLV
+ 36.";
+
+ uses isis-lsdb-link-characteristics-a-bit;
+
+ leaf link-loss {
+ type uint32;
+ description
+ "Link packet loss as a percentage of the total traffic
+ sent over a configurable interval. The basic unit is
+ 0.000003%, where (2^24 - 2) is 50.331642%. This value
+ is the highest packet-loss percentage that can be
+ expressed (the assumption being that precision is more
+ important on high-speed links than the ability to
+ advertise loss rates greater than this, and that high-
+ speed links with over 50% loss are unusable).
+ Therefore, measured values that are larger than the
+ field maximum SHOULD be encoded as the maximum
+ value.";
+ }
+ }
+ }
+
+ container residual-bandwidth {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_RESIDUAL_BANDWIDTH'" {
+ description
+ "Only include the resdiual bandwidth container when the
+ sub-TLV is type 37.";
+ }
+ description
+ "This container defines unidirectional residual
+ bandwidth.";
+
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric
+ Extensions. sub-TLV 37: TLV 22, 23, 141, 222, 223.";
+
+ container state {
+ description
+ "State parameters of IS Extended Reachability sub-TLV
+ 37.";
+
+ leaf bandwidth {
+ type oc-types:ieeefloat32;
+ units "bytes per second";
+ description
+ "Residual bandwidth on a link,forwarding adjacency
+ [RFC4206], or bundled link in IEEE floating-point
+ format with units of bytes per second. For a link or
+ forwarding adjacency, residual bandwidth is defined to
+ be the Maximum Bandwidth [RFC5305] minus the bandwidth
+ currently allocated to RSVP-TE label switched paths.
+ For a bundled link, residual bandwidth is defined to
+ be the sum of the component link residual
+ bandwidths.";
+ }
+ }
+ }
+
+ container available-bandwidth {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_AVAILABLE_BANDWIDTH'" {
+ description
+ "Only include the available bandwdith container when the
+ sub-TLV is type 38.";
+ }
+ description
+ "This container defines unidirectional lavailable
+ bandwidth.";
+
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric
+ Extensions. sub-TLV 38: TLV 22, 23, 141, 222, 223.";
+
+ container state {
+ description
+ "State parameters of IS Extended Reachability sub-TLV
+ 38.";
+
+ uses isis-lsdb-subtlv-type-state;
+
+ leaf bandwidth {
+ type oc-types:ieeefloat32;
+ units "bytes per second";
+ description
+ "The available bandwidth on a link, forwarding
+ adjacency, or bundled link in IEEE floating-point
+ format with units of bytes per second. For a link or
+ forwarding adjacency, available bandwidth is defined
+ to be residual bandwidth minus the measured bandwidth
+ used for the actual forwarding of non-RSVP-TE label
+ switched path packets. For a bundled link, available
+ bandwidth is defined to be the sum of the component
+ link available bandwidths minus the measured bandwidth
+ used for the actual forwarding of non-RSVP-TE label
+ switched path packets. For a bundled link, available
+ bandwidth is defined to be the sum of the component
+ link available bandwidths.";
+ }
+ }
+ }
+
+ container utilized-bandwidth {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_REACHABILITY_UTILIZED_BANDWIDTH'" {
+ description
+ "Only include the utilized bandwidth container when the
+ TLV is type 39.";
+ }
+ description
+ "This container defines unidirectional utilized
+ bandwidth.";
+
+ reference
+ "RFC7810: IS-IS Traffic Engineering (TE) Metric
+ Extensions. sub-TLV 39: TLV 22, 23, 141, 222, 223.";
+
+ container state {
+ description
+ "State parameters of IS Extended Reachability sub-TLV
+ 39.";
+
+ uses isis-lsdb-subtlv-type-state;
+
+ leaf bandwidth {
+ type oc-types:ieeefloat32;
+ units "bytes per second";
+ description
+ "The bandwidth utilization on a link, forwarding
+ adjacency, or bundled link in IEEE floating-point
+ format with units of bytes per second. For a link or
+ forwarding adjacency, bandwidth utilization represents
+ the actual utilization of the link (i.e., as measured
+ by the advertising node). For a bundled link,
+ bandwidth utilization is defined to be the sum of the
+ component link bandwidth utilizations.";
+ }
+ }
+ }
+ }
+ }
+
+ uses isis-lsdb-undefined-subtlv;
+ }
+
+ grouping isis-lsdb-undefined-tlv {
+ description
+ "Grouping for unknown TLVs in the IS-IS LSDB";
+
+ container undefined-tlvs {
+ description
+ "Surrounding container for a list of unknown TLVs.";
+
+ list undefined-tlv {
+ key "type";
+ description
+ "List of TLVs that are not defined within the model, or are
+ not recognised by the system.";
+
+ leaf type {
+ type leafref {
+ path "../state/type";
+ }
+ description
+ "Reference to the undefined TLV's type";
+ }
+
+ container state {
+ description
+ "State parameters of the undefined TLV.";
+
+ uses undefined-tlv-state;
+ }
+ }
+ }
+ }
+
+ grouping isis-lsdb-undefined-subtlv {
+ description
+ "Grouping for unknown Sub-TLVs in the IS-IS LSDB.";
+
+ container undefined-subtlvs {
+ description
+ "This container describes undefined ISIS TLVs.";
+
+ list undefined-subtlv {
+ key "type";
+
+ description
+ "Sub-TLVs that are not defined in the model or not
+ recognised by system.";
+
+ leaf type {
+ type leafref {
+ path "../state/type";
+ }
+ description
+ "Reference to the type of the undefined sub-TLV";
+ }
+
+ container state {
+ description
+ "State parameters of the undefined sub-TLV.";
+
+ uses undefined-subtlv-state;
+ }
+ }
+ }
+ }
+
+ grouping isis-lsdb-prefix-state {
+ description
+ "This grouping defines prefix reachability.";
+
+ container subtlvs {
+ description
+ "This container describes IS prefix sub-TLVs.";
+
+ list subtlv {
+ key "type";
+
+ description
+ "List of subTLV types in the LSDB for the specified TLV.";
+
+ leaf type {
+ type leafref {
+ path "../state/type";
+ }
+ description
+ "Reference to the sub-TLV type";
+ }
+
+ container state {
+ description
+ "State parameters for a prefix.";
+
+ uses isis-lsdb-subtlv-type-state;
+ }
+
+ container tag {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IP_REACHABILITY_TAG'" {
+ description
+ "Only include the tag container when the sub-TLV is type
+ 1.";
+ }
+ description
+ "This container defines sub-TLV 1.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 1.";
+
+ leaf-list tag32 {
+ type uint32;
+ description
+ "List of 32-bit tags associated with the prefix. Example
+ uses of these tags include carrying BGP standard (or
+ extended) communities and controlling redistribution
+ between levels and areas, different routing protocols,
+ or multiple instances of IS-IS running on the same
+ router.";
+ reference
+ "RFC5130: A Policy Control Mechanism in IS-IS Using
+ Administrative Tags. sub-TLV 1.";
+ }
+ }
+ }
+
+ container tag64 {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IP_REACHABILITY_TAG64'" {
+ description
+ "Only include the tag64 container when the sub-TLV is type
+ 2.";
+ }
+ description
+ "This container defines sub-TLV 2.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 2.";
+
+ leaf-list tag64 {
+ type uint64;
+ description
+ "List of 64-bit tags associated with the prefix. Example
+ uses of these tags include carrying BGP standard (or
+ extended) communities and controlling redistribution
+ between levels and areas, different routing protocols,
+ or multiple instances of IS-IS running on the same
+ router.";
+ reference
+ "RFC5130: A Policy Control Mechanism in IS-IS Using
+ Administrative Tags. sub-TLV 2.";
+ }
+ }
+ }
+
+ container flags {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IP_REACHABILITY_PREFIX_FLAGS'" {
+ description
+ "Only include the flags container when the sub-TLV is type
+ 4.";
+ }
+ description
+ "This container defines sub-TLV 4.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 4.";
+
+ uses isis-lsdb-subtlv-type-state;
+
+ leaf-list flags {
+ type enumeration {
+ enum EXTERNAL_FLAG {
+ description
+ "External prefix flag. Set if the prefix has been
+ redistributed from another protocol. This includes
+ the case where multiple virtual routers are
+ supported and the source of the redistributed prefix
+ is another IS-IS instance.";
+ }
+ enum READVERTISEMENT_FLAG {
+ description
+ "Readvertisement flag. Set when the prefix has been
+ leaked from one level to another (upwards or
+ downwards).";
+ }
+ enum NODE_FLAG {
+ description
+ "Node flag. Set when the prefix identifies the
+ advertising router, i.e., the prefix is a host
+ prefix advertising a globally reachable address
+ typically associated with a loopback address.";
+ }
+ }
+ description
+ "Additional prefix reachability flags.";
+
+ reference
+ "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and
+ IPv6 Reachability. sub-TLV 4.";
+ }
+ }
+ }
+
+ container ipv4-source-router-id {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IP_REACHABILITY_IPV4_ROUTER_ID'" {
+ description
+ "Only include the IPv4 Source Router ID container when
+ the sub-TLV is type 11.";
+ }
+ description
+ "This container defines sub-TLV 11.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 11.";
+
+ uses isis-lsdb-subtlv-type-state;
+
+ leaf router-id {
+ type inet:ipv4-address;
+ description
+ "IPv4 Source router ID address. In cases where the
+ advertisement is an identifier for the advertising
+ router (e.g., with the N-flag set in the Prefix
+ Attribute Flags sub-TLV), it may be useful for other
+ routers to know the source of the advertisement. When
+ reachability advertisement is leaked from one level to
+ another, Router ID advertised is always the Router ID
+ of the IS-IS instance that originated the
+ advertisement. This would be true even if the prefix
+ had been learned from another protocol.";
+ reference
+ "RFC7794: IS-IS Prefix Attributes for Extended IPv4
+ and IPv6 Reachability. sub-TLV 11";
+ }
+ }
+ }
+
+ container ipv6-source-router-id {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IP_REACHABILITY_IPV6_ROUTER_ID'" {
+ description
+ "Only include the IPv6 Source Router ID container when
+ the sub-TLV is type 12.";
+ }
+ description
+ "This container defines sub-TLV 12.";
+
+ container state {
+ description
+ "State parameters of sub-TLV 12.";
+
+ uses isis-lsdb-subtlv-type-state;
+
+ leaf router-id {
+ type inet:ipv6-address;
+ description
+ "IPv6 Source router ID address. In cases where the
+ advertisement is an identifier for the advertising
+ router (e.g., with the N-flag set in the Prefix
+ Attribute Flags sub-TLV), it may be useful for other
+ routers to know the source of the advertisement. When
+ reachability advertisement is leaked from one level to
+ another, Router ID advertised is always the Router ID
+ of the IS-IS instance that originated the
+ advertisement. This would be true even if the prefix
+ had been learned from another protocol.";
+ reference
+ "RFC7794: IS-IS Prefix Attributes for Extended IPv4
+ and IPv6 Reachability. sub-TLV 12.";
+ }
+ }
+ }
+
+ uses isis-lsdb-prefix-sid-state;
+ }
+ }
+
+ uses isis-lsdb-undefined-subtlv;
+ }
+
+ grouping isis-lsdb-prefix-sid-state {
+ description
+ "This grouping defines ISIS Prefix SID.";
+
+ container prefix-sids {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IP_REACHABILITY_PREFIX_SID'" {
+ description
+ "Only include the Prefix SID container when
+ the sub-TLV is type 3.";
+ }
+ description
+ "This container defines segment routing extensions for
+ prefixes.";
+
+ reference
+ "draft-ietf-isis-segment-routing-extensions. sub-TLV 3: TLV
+ 135, 235, 236, 237.";
+
+ list prefix-sid {
+ key "value";
+
+ description
+ "Prefix Segment-ID list. IGP-Prefix Segment is an IGP segment
+ attached to an IGP prefix. An IGP-Prefix Segment is global
+ (unless explicitly advertised otherwise) within the SR/IGP
+ domain.";
+
+ leaf value {
+ type leafref {
+ path "../state/value";
+ }
+ description
+ "Reference to the value of the prefix SID.";
+ }
+
+ container state {
+ description
+ "State parameters for Prefix-SID.";
+
+ leaf value {
+ type uint32;
+ description
+ "IGP Prefix-SID value.";
+ }
+
+ leaf-list flags {
+ type enumeration {
+ enum READVERTISEMENT {
+ description
+ "Readvertisment flag. When set, the prefix to which
+ this Prefix-SID is attached, has been propagated by
+ the router either from another level or from
+ redistribution.";
+ }
+ enum NODE {
+ description
+ "Node flag. When set, the Prefix-SID refers to the
+ router identified by the prefix. Typically, the
+ N-Flag is set on Prefix-SIDs attached to a router
+ loopback address.";
+ }
+ enum NO_PHP {
+ description
+ "Penultimate-Hop-Popping flag. When set, then the
+ penultimate hop MUST NOT pop the Prefix-SID before
+ delivering the packet to the node that advertised
+ the Prefix-SID.";
+ }
+ enum EXPLICIT_NULL {
+ description
+ "Explicit-Null flag. When set, any upstream neighbor
+ of the Prefix-SID originator MUST replace the
+ Prefix-SID with a Prefix-SID having an Explicit-NULL
+ value (0 for IPv4 and 2 for IPv6) before forwarding
+ the packet.";
+ }
+ enum VALUE {
+ description
+ "Value flag. When set, the Prefix-SID carries a
+ value (instead of an index). By default the flag is
+ UNSET.";
+ }
+ enum LOCAL {
+ description
+ "Local flag. When set, the value/index carried by
+ the Prefix-SID has local significance. By default
+ the flag is UNSET.";
+ }
+ }
+ description
+ "Flags associated with Prefix Segment-ID.";
+ }
+
+ leaf algorithm {
+ type uint8;
+ description
+ "Prefix-SID algorithm to be used for path computation.";
+ }
+ }
+ }
+ }
+ }
+
+ grouping isis-lsdb-common-metric-specification {
+ description
+ "Common definitions of the metric in IS-IS.";
+
+ container default-metric {
+ description
+ "This container defines ISIS Default Metric.";
+
+ container state {
+ description
+ "State parameters for default-metric.";
+
+ leaf flags {
+ type enumeration {
+ enum INTERNAL {
+ description
+ "When set to zero, indicates internal metrics.";
+ }
+ }
+ description
+ "ISIS Default-Metric Flags.";
+ }
+
+ leaf metric {
+ type oc-isis-types:narrow-metric;
+ description
+ "ISIS default metric value. This is a metric understood by
+ every Intermediate system in the domain. Each circuit
+ shall have a positive integral value assigned for this
+ metric. The value may be associated with any objective
+ function of the circuit, but by convention is intended to
+ measure the capacity of the circuit for handling traffic,
+ for example, its throughput in bits-per-second. Higher
+ values indicate a lower capacity.";
+ }
+ }
+ }
+
+ container delay-metric {
+ description
+ "This container defines the ISIS delay metric.";
+
+ container state {
+ description
+ "State parameters of delay-metric.";
+
+ leaf metric {
+ type oc-isis-types:narrow-metric;
+ description
+ "ISIS delay metric value. This metric measures the transit
+ delay of the associated circuit. It is an optional metric,
+ which if assigned to a circuit shall have a positive
+ integral value. Higher values indicate a longer transit
+ delay.";
+ }
+
+ leaf-list flags {
+ type isis-metric-flags;
+ description
+ "ISIS Delay Metric Flags.";
+ }
+ }
+ }
+
+ container expense-metric {
+ description
+ "This container defines the ISIS expense metric.";
+
+ container state {
+ description
+ "State parameters of expense-metric.";
+
+ leaf metric {
+ type oc-isis-types:narrow-metric;
+ description
+ "ISIS expense metric value. This metric measures the
+ monetary cost of utilising the associated circuit. It is
+ an optional metric, which if assigned to a circuit shall
+ have a positive integral value1). Higher values indicate a
+ larger monetary expense.";
+ }
+
+ leaf-list flags {
+ type isis-metric-flags;
+ description
+ "ISIS Expense Metric Flags.";
+ }
+ }
+ }
+
+ container error-metric {
+ description
+ "This container defines the ISIS error metric.";
+
+ container state {
+ description
+ "State parameters of error-metric.";
+
+ leaf metric {
+ type oc-isis-types:narrow-metric;
+ description
+ "ISIS error metric value. This metric measures the
+ residual error probability of the associated circuit. It
+ is an optional metric, which if assigned to a circuit
+ shall have a non-zero value. Higher values indicate a
+ larger probability of undetected errors on the circuit.";
+ }
+
+ leaf-list flags {
+ type isis-metric-flags;
+ description
+ "IS-IS error metric flags.";
+ }
+ }
+ }
+ }
+
+ grouping isis-lsdb-neighbor {
+ description
+ "This grouping defines attributes of an ISIS standard
+ neighbor.";
+
+ container state {
+ description
+ "State parameters of IS standard neighbor.";
+
+ leaf system-id {
+ type oc-isis-types:system-id;
+ description
+ "System-ID of IS neighbor.";
+ }
+ }
+
+ uses isis-lsdb-common-metric-specification;
+
+ }
+
+ grouping ipv4-prefix-attributes-state {
+ description
+ "This group defines attributes of an IPv4 standard prefix.";
+
+ container state {
+ description
+ "State parameters of IPv4 standard prefix.";
+
+ leaf up-down {
+ type boolean;
+ description
+ "The up/down bit. Set if a prefix is advertised from a
+ higher level to a lower level (e.g., level 2 to level 1),
+ indicating that the prefix has traveled down the hierarchy.
+ Prefixes that have the up/down bit set may only be
+ advertised down the hierarchy, i.e., to lower levels. When a
+ prefix is first injected into IS-IS, the bit is UNSET.";
+ }
+
+ leaf prefix {
+ type inet:ipv4-prefix;
+ description
+ "IPv4 prefix contained within reachability TLVs.";
+ }
+ }
+
+ uses isis-lsdb-common-metric-specification;
+ }
+
+ grouping isis-lsdb-common-mt-id {
+ description
+ "Common definition of the multi-topology ID";
+
+ leaf mt-id {
+ type uint16 {
+ range "0..4095";
+ }
+ description
+ "Multi-topology ID";
+ }
+ }
+
+ grouping ipv4-prefix-extended-state {
+ description
+ "This grouping defines attributes of an IPv4 extended prefix.";
+
+ container state {
+ description
+ "State parameters of an IPv4 extended prefix.";
+ uses ipv4-prefix-extended-params-state;
+ }
+
+ uses isis-lsdb-prefix-state;
+ }
+
+ grouping ipv4-mt-prefix-extended-state {
+ description
+ "State parameters that relate to an IPv4 prefix in a
+ multi-topology context.";
+
+ container state {
+ description
+ "State parameters of an IPv4 extended prefix.";
+ uses ipv4-prefix-extended-params-state;
+ uses isis-lsdb-common-mt-id;
+ }
+
+ uses isis-lsdb-prefix-state;
+ }
+
+ grouping ipv4-prefix-extended-params-state {
+ description
+ "State parameters that relate to an IPv4 prefix";
+
+ leaf up-down {
+ type boolean;
+ description
+ "The up/down bit. Set if a prefix is advertised from a
+ higher level to a lower level (e.g., level 2 to level 1),
+ indicating that the prefix has traveled down the hierarchy.
+ Prefixes that have the up/down bit set may only be
+ advertised down the hierarchy, i.e., to lower levels. When a
+ prefix is first injected into IS-IS, the bit is UNSET.";
+ }
+
+ leaf s-bit {
+ type boolean;
+ description
+ "The Sub-TLV present bit. If UNSET, the octets of Sub-TLVs
+ are not present. Otherwise, the bit is set and the octet
+ following the prefix will contain the length of the Sub-TLV
+ portion of the structure.";
+ }
+
+ leaf prefix {
+ type inet:ipv4-prefix;
+ description
+ "IPv4 prefix contained within extended reachability TLVs.";
+ }
+
+ leaf metric {
+ type oc-isis-types:wide-metric;
+ description
+ "ISIS metric value.";
+ }
+ }
+
+ grouping ipv6-prefix-extended-state {
+ description
+ "State parameters relating to an IPv6 prefix.";
+
+ container state {
+ description
+ "State parameters of IPv6 prefix attributes";
+
+ uses ipv6-prefix-extended-params-state;
+ }
+
+ uses isis-lsdb-prefix-state;
+ }
+
+ grouping ipv6-mt-prefix-extended-state {
+ description
+ "State parameters relating to a multi-topology IPv6
+ prefix.";
+
+ container state {
+ description
+ "State parameters relating an IPv6 prefix attribute";
+ uses ipv6-prefix-extended-params-state;
+ uses isis-lsdb-common-mt-id;
+ }
+
+ uses isis-lsdb-prefix-state;
+ }
+
+ grouping ipv6-prefix-extended-params-state {
+ description
+ "Common parameters of an IPv6 extended prefix.";
+
+ leaf up-down {
+ type boolean;
+ description
+ "The up/down bit. Set if a prefix is advertised from a
+ higher level to a lower level (e.g., level 2 to level 1),
+ indicating that the prefix has traveled down the hierarchy.
+ Prefixes that have the up/down bit set may only be
+ advertised down the hierarchy, i.e., to lower levels. When a
+ prefix is first injected into IS-IS, the bit is UNSET.";
+ }
+
+ leaf x-bit {
+ type boolean;
+ description
+ "The external bit. Set when the prefix was distributed into
+ IS-IS from another routing protocol.";
+ }
+
+ leaf s-bit {
+ type boolean;
+ description
+ "The sub-tlv present bit. If UNSET, the octets of Sub-TLVs
+ are not present. Otherwise, the bit is set and the octet
+ following the prefix will contain the length of the Sub-TLV
+ portion of the structure.";
+ }
+
+ leaf prefix {
+ type inet:ipv6-prefix;
+ description
+ "IPv6 prefix contained within extended reachability TLVs.";
+ }
+
+ leaf metric {
+ type oc-isis-types:wide-metric;
+ description
+ "ISIS metric value.";
+ }
+ }
+
+ grouping isis-lsdb-common-extisreach-neighbors {
+ description
+ "Common structure for the Extended IS Reachability and IS
+ Reachability Neighbour attributes.";
+
+ container neighbors {
+ description
+ "This container describes IS neighbors.";
+
+ list neighbor {
+ key "system-id";
+ description
+ "This list describes ISIS extended neighbors and
+ reachability attributes.";
+
+ leaf system-id {
+ type leafref {
+ path "../state/system-id";
+ }
+ description
+ "Reference to the neighboring system's system ID.";
+ }
+
+ container state {
+ description
+ "State parameters corresponding to the extended
+ neighbour.";
+
+ leaf system-id {
+ type oc-isis-types:system-id;
+ description
+ "System-id of the neighbor.";
+ }
+ }
+
+ container instances {
+ description
+ "This list contains all instances of an adjacency
+ between the originating IS and the remote IS.
+ Multiple instances are used where there are
+ parallel adjacencies between two systems.";
+
+ list instance {
+ key "id";
+
+ description
+ "Instance of the TLV to the remote IS neighbor.";
+
+ leaf id {
+ type leafref {
+ path "../state/id";
+ }
+ description
+ "Reference to the unique identifier for
+ the instance of the extended IS
+ reachability sub-TLV.";
+ }
+
+ container state {
+ description
+ "State parameters of extended neighbor";
+
+ leaf id {
+ type uint64;
+ description
+ "Unique identifier for the instance of the
+ TLV for the IS neighbor. The instance
+ ID is not required to be consistent across
+ across readvertisements of the LSP.";
+ }
+
+ leaf metric {
+ type oc-isis-types:wide-metric;
+ description
+ "Metric value.";
+ }
+ }
+ uses is-reachability-neighbor-state;
+ }
+ }
+ }
+ }
+ }
+
+ grouping isis-lsdb-mtis-common {
+ description
+ "Common grouping for structure used within the multi-topology IS
+ neighbour and multi-topology IS neighbour attribute TLVs.";
+
+ container neighbors {
+ description
+ "MT-IS neigbor attributes.";
+
+ list neighbor {
+ key "mt-id system-id";
+ description
+ "This container describes IS neighbors.";
+
+ leaf mt-id {
+ type leafref {
+ path "../state/mt-id";
+ }
+ description
+ "Reference to the topology that the neighbor is
+ within.";
+ }
+
+ leaf system-id {
+ type leafref {
+ path "../state/system-id";
+ }
+ description
+ "Reference to the System ID of the neighbor.";
+ }
+
+ container state {
+ description
+ "Operational state parameters related to the
+ MT ISN TLV.";
+
+ uses mt-isis-neighbor-state;
+ }
+
+ container instances {
+ description
+ "This list contains all instances of an adjacency
+ between the originating and remote IS. Multiple
+ instances are used to indicate where there are
+ parallel adjacencies between systems.";
+
+ list instance {
+ key "id";
+
+ description
+ "Instance of TLV-222 between the originating
+ and remote IS.";
+
+ leaf id {
+ type leafref {
+ path "../state/id";
+ }
+ description
+ "Reference to the unique identifier for the
+ instance of the multi-topology IS neighbor
+ TLV instance.";
+ }
+
+ uses mt-isis-neighbor-instance;
+ }
+ }
+ }
+ }
+ }
+
+ grouping mt-isis-neighbor-state {
+ description
+ "This grouping defines state parameters that are related to
+ each neighbour entry for the MT ISN TLV.";
+
+ leaf mt-id {
+ type uint16 {
+ range "0..4095";
+ }
+ description
+ "Identifier of a topology being announced.";
+ }
+
+ leaf system-id {
+ type oc-isis-types:system-id;
+ description
+ "System-id of the IS neighbor.";
+ }
+ }
+
+ grouping mt-isis-neighbor-instance {
+ description
+ "This grouping defines list of ISIS multi-topology neighbors for
+ extended ISIS LSP (multiple system IDs).";
+
+ container state {
+ description
+ "State parameters of MT neighbor.";
+
+ leaf metric {
+ type oc-isis-types:wide-metric;
+ description
+ "ISIS metric value.";
+ }
+
+ leaf id {
+ type uint64;
+ description
+ "Unique identifier for the TLV instance for the
+ neighbor. The ID is not required to be consistent
+ across readvertisements of the LSP.";
+ }
+ }
+ uses is-reachability-neighbor-state;
+ }
+
+ grouping isis-lsdb-generic-tlv {
+ description
+ "Generic TLV encoding grouping.";
+
+ leaf type {
+ type uint8;
+ description
+ "TLV Type.";
+ }
+
+ leaf length {
+ type uint8;
+ description
+ "TLV length.";
+ }
+
+ leaf value {
+ type binary;
+ description
+ "TLV value.";
+ }
+ }
+
+ grouping undefined-tlv-state {
+ description
+ "Generic grouping defining an unknown TLV.";
+
+ uses isis-lsdb-generic-tlv;
+ }
+
+ grouping undefined-subtlv-state {
+ description
+ "Generic grouping defining an unknown sub-TLV.";
+
+ uses isis-lsdb-generic-tlv;
+ }
+
+ grouping lsp-state {
+ description
+ "This grouping defines ISIS LSP state information.";
+
+ leaf lsp-id {
+ type leafref {
+ path "../state/lsp-id";
+ }
+
+ description
+ "A reference to the Link State PDU ID.";
+ }
+
+ container state {
+ description
+ "State parameters of Link State PDU.";
+
+ leaf lsp-id {
+ type oc-isis-types:lsp-id;
+ description
+ "LSP ID of the LSP.";
+ }
+
+ leaf maximum-area-addresses {
+ type uint8;
+ description
+ "Number of area addresses permitted for this ISs area. 0
+ indicates the IS only supports three area addresses (by
+ default). Any number inclusive of 1 and 254 indicates the
+ number of areas allowed.";
+ }
+
+ leaf version {
+ type uint8;
+ default 1;
+ description
+ "PDU version. This is set to 1.";
+ }
+
+ leaf version2 {
+ type uint8;
+ default 1;
+ description
+ "PDU version2. This is set to 1";
+ }
+
+ leaf id-length {
+ type uint8;
+ description
+ "Length of the ID field of NSAP addresses and NETs used in
+ this routing domain.";
+ }
+
+ leaf pdu-type {
+ type enumeration {
+ enum LEVEL_1 {
+ description "This enum describes ISIS level 1 PDU.";
+ }
+ enum LEVEL_2 {
+ description "This enum describes ISIS level 2 PDU.";
+ }
+ }
+ description
+ "Link State PDU type.";
+ }
+
+ leaf remaining-lifetime {
+ type uint16;
+ units "seconds";
+ description
+ "Remaining lifetime in seconds before the LSP expiration.";
+ }
+
+ leaf sequence-number {
+ type uint32;
+ description
+ "Sequence number of the LSP.";
+ }
+
+ leaf checksum {
+ type uint16;
+ description
+ "Checksum of the LSP.";
+ }
+
+ leaf pdu-length {
+ type uint16;
+ description
+ "Total length of the LSP.";
+ }
+
+ leaf-list flags {
+ type enumeration {
+ enum PARTITION_REPAIR {
+ description
+ "When set, the originator supports partition
+ repair.";
+ }
+ enum ATTACHED_ERROR {
+ description
+ "When set, the originator is attached to another
+ area using the referred metric.";
+ }
+ enum ATTACHED_EXPENSE {
+ description
+ "When set, the originator is attached to another
+ area using the referred metric.";
+ }
+ enum ATTACHED_DELAY {
+ description
+ "When set, the originator is attached to another
+ area using the referred metric.";
+ }
+ enum ATTACHED_DEFAULT {
+ description
+ "When set, the originator is attached to another
+ area using the referred metric.";
+ }
+ enum OVERLOAD {
+ description
+ "When set, the originator is overloaded, and must
+ be avoided in path calculation.";
+ }
+ }
+ description
+ "LSP Type-Block flags.";
+ }
+
+ leaf is-type {
+ type oc-isis-types:level-number;
+ description
+ "Type of neighboring system.";
+ }
+ }
+
+ container tlvs {
+ description
+ "This container defines Link State PDU State TLVs.";
+
+ list tlv {
+ key "type";
+
+ description
+ "List of TLV types in the LSDB for the specified LSP.";
+
+ leaf type {
+ type leafref {
+ path "../state/type";
+ }
+ description
+ "Reference to the TLV's type.";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the specified
+ LSP";
+
+ uses isis-lsdb-tlv-type-state;
+ }
+
+ container area-address {
+ when "../state/type = 'oc-isis-lsdb-types:AREA_ADDRESSES'" {
+ description
+ "Include area address parameters only when the TLV type
+ is TLV 1.";
+ }
+
+ description
+ "This container defines TLV 1.";
+
+ container state {
+ description
+ "State parameters of ISIS TLV 1.";
+
+ leaf-list address {
+ type oc-isis-types:area-address;
+ description
+ "Area adress(es) of the IS. Set of manual area
+ addresses of this IS.";
+ reference
+ "ISO 10589 Intermediate System to Intermediate System
+ Intra- Domain Routeing Exchange Protocol for use in
+ Conjunction with the Protocol for Providing the
+ Connectionless-mode Network Service (ISO 8473 )
+ International Standard 10589: 2002, Second Edition,
+ 2002. TLV 1.";
+ }
+ }
+ }
+
+ container lsp-buffer-size {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:LSP_BUFFER_SIZE'" {
+ description
+ "Include the LSP buffer size parameters only when the
+ TLV type is TLV 14.";
+ }
+
+ description
+ "This container defines TLV 14 - the LSP Buffer Size
+ TLV.";
+
+ container state {
+ description
+ "State parameters of TLV 14.";
+
+ leaf size {
+ type uint16;
+ units "bytes";
+ description
+ "The maximum MTU that the advertising system can
+ receive, expressed in bytes.";
+ reference
+ "ISO 10589 Intermediate System to Intermediate System
+ Intra- Domain Routeing Exchange Protocol for use in
+ Conjunction with the Protocol for Providing the
+ Connectionless-mode Network Service (ISO 8473 )
+ International Standard 10589: 2002, Second Edition,
+ 2002. TLV 14.";
+ }
+ }
+ }
+
+ container nlpid {
+ when "../state/type = 'oc-isis-lsdb-types:NLPID'" {
+ description
+ "Include NLPID specification only when the TLV type is
+ TLV 129.";
+ }
+
+ description
+ "This container defines TLV 129.";
+
+ container state {
+ description
+ "State parameters of ISIS TLV 129.";
+
+ uses isis-lsdb-tlv-nlpid-state;
+ }
+ }
+
+ container hostname {
+ when "../state/type = 'oc-isis-lsdb-types:DYNAMIC_NAME'" {
+ description
+ "Include the dynamic hostname TLV only when the TLV is
+ type 137.";
+ }
+ description
+ "This container defines TLV 137.";
+
+ container state {
+ description
+ "State parameters of ISIS TLV 137.";
+
+ leaf-list hostname {
+ type string;
+ description
+ "Name of the node.";
+
+ reference
+ "RFC6233: IS-IS Registry Extension for Purges, RFC
+ 5301: Dynamic Hostname Exchange Mechanism for IS-IS.
+ TLV 137";
+ }
+ }
+ }
+
+ container ipv4-interface-addresses {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IPV4_INTERFACE_ADDRESSES'" {
+ description
+ "Include the IPv4 interface addresses TLV only when the
+ TLV is type 132.";
+ }
+ description
+ "This container defines TLV 132.";
+
+ container state {
+ description
+ "State parameters of ISIS TLV 132.";
+
+ leaf-list address {
+ type inet:ipv4-address;
+ description
+ "IPv4 address(es) of the interface corresponding to
+ the SNPA over which this PDU is to be transmitted.";
+ reference
+ "RFC1195: Use of OSI IS-IS for Routing in TCP/IP and
+ Dual Environments. TLV 132.";
+ }
+ }
+ }
+
+ container ipv6-interface-addresses {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IPV6_INTERFACE_ADDRESSES'" {
+ description
+ "Include the IPv6 interface addresses TLV only when the
+ TLV is type 232.";
+ }
+ description
+ "This container defines TLV 232.";
+
+ container state {
+ description
+ "State parameters of ISIS TLV 232.";
+
+ leaf-list address {
+ type inet:ipv6-address;
+ description
+ "IPv6 interface addresses of the node. MUST contain
+ only the non-link-local IPv6 addresses assigned to the
+ IS.";
+ reference
+ "RFC5308: Routing IPv6 with IS-IS. TLV 232.";
+ }
+ }
+ }
+
+ container ipv4-te-router-id {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IPV4_TE_ROUTER_ID'" {
+ description
+ "Include the IPv4 traffic engineering router ID TLV only
+ when the TLV is type 134.";
+ }
+ description
+ "This container defines TLV 134.";
+
+ container state {
+ description
+ "State parameters of ISIS TLV 134.";
+
+ leaf-list router-id {
+ type inet:ipv4-address;
+ description
+ "IPv4 Traffic Engineering router ID of the node. For
+ traffic engineering, it guarantees that we have a
+ single stable address that can always be referenced in
+ a path that will be reachable from multiple hops away,
+ regardless of the state of the node's interfaces.";
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering. TLV
+ 134.";
+ }
+ }
+ }
+
+ container ipv6-te-router-id {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IPV6_TE_ROUTER_ID'" {
+ description
+ "Include the IPv6 traffic engineering router ID TLV only
+ when the TLV is type 140.";
+ }
+ description
+ "This container defines TLV 140.";
+
+ container state {
+ description
+ "State parameters of ISIS TLV 140.";
+
+ leaf-list router-id {
+ type inet:ipv6-address;
+ description
+ "IPv6 Traffic Engineering router ID of the node. For
+ traffic engineering, it guarantees that we have a
+ single stable address that can always be referenced in
+ a path that will be reachable from multiple hops away,
+ regardless of the state of the node's interfaces.";
+ reference
+ "RFC6119: IPv6 Traffic Engineering in IS-IS. TLV
+ 140.";
+ }
+ }
+ }
+
+ container instance-ids {
+ when "../state/type = 'oc-isis-lsdb-types:INSTANCE_ID'" {
+ description
+ "Include the ISIS Instance Identifier TLV only when the
+ TLV is type 7.";
+ }
+ description
+ "This container defines ISIS Instance Identifier TLV.";
+ reference "RFC6822: IS-IS Multi-Instance. TLV 7.";
+
+ list instance-id {
+ key "instance-id";
+
+ description
+ "A list of instance IDs received within TLV 7 within an
+ IS-IS LSP. In the case that more than one instance of
+ TLV 7 is included in the LSP, the instance IDs specified
+ within the instances are concatenated within this
+ list.";
+
+ leaf instance-id {
+ type leafref {
+ path "../state/instance-id";
+ }
+ description
+ "Reference to the unique instance ID.";
+ }
+ container state {
+ description
+ "State parameters of ISIS TLV 7.";
+
+ leaf instance-id {
+ type uint16;
+ description
+ "An Instance Identifier (IID) to uniquely identify
+ an IS-IS instance. When the IID = 0, the list of
+ supported ITIDs MUST NOT be present. An IID-TLV with
+ IID = 0 MUST NOT appear in an SNP or LSP. When the
+ TLV appears (with a non-zero IID) in an SNP or LSP,
+ exactly one ITID. MUST be present indicating the
+ topology with which the PDU is associated. If no
+ ITIDs or multiple ITIDs are present or the IID is
+ zero, then the PDU MUST be ignored.";
+ }
+
+ leaf-list topology-id {
+ type uint16;
+ description
+ "Instance-Specific Topology Identifiers (ITIDs).";
+ }
+ }
+ }
+ }
+
+ container ipv4-srlgs {
+ when "../state/type = 'oc-isis-lsdb-types:IPV4_SRLG'" {
+ description
+ "Include the IPv4 SRLG TLV only when the TLV is type
+ 138.";
+ }
+ description
+ "This container defines ISIS SRLG TLV 138.";
+
+ reference
+ "RFC5307: IS-IS Extensions in Support of Generalized
+ Multi-Protocol Label Switching (GMPLS). TLV 138.";
+
+ list ipv4-srlg {
+ key "instance-number";
+
+ description
+ "Instance of the IPv4 SRLG TLV";
+
+ leaf instance-number {
+ type leafref {
+ path "../state/instance-number";
+ }
+ description
+ "Reference to the instance number of TLV 138.";
+ }
+
+ container state {
+ description
+ "State parameters of TLV 138.";
+
+ leaf instance-number {
+ type uint32;
+ description
+ "An arbitrary unsigned 32-bit integer used to
+ disambiguate the instance of TLV 138. The instance
+ identifier is synthesised by the system
+ and may be renumbered for the same SRLG definition
+ in subsequent advertised LSPs if (and only if) the
+ entire list of SRLGs is replaced.";
+ }
+
+ leaf system-id {
+ type oc-isis-types:system-id;
+ description
+ "Neighbor system ID.";
+ }
+
+ leaf psn-number {
+ type uint8;
+ description
+ "Pseudonode number if the neighbor is on a LAN
+ interface.";
+ }
+
+ leaf-list flags {
+ type enumeration {
+ enum NUMBERED {
+ description
+ "When set, the interface is numbered, whereas if
+ unset indicates that the interface is
+ unnumbered.";
+ }
+ }
+ description
+ "SRLG flags.";
+ }
+
+ leaf ipv4-interface-address {
+ type inet:ipv4-address;
+ description
+ "IPv4 interface address.";
+ }
+
+ leaf ipv4-neighbor-address {
+ type inet:ipv4-address;
+ description
+ "IPv4 neighbor address.";
+ }
+
+ leaf-list srlg-value {
+ type uint32;
+ description
+ "List of SRLG values.";
+ }
+ }
+ }
+ }
+
+ container ipv6-srlgs {
+ when "../state/type = 'oc-isis-lsdb-types:IPV6_SRLG'" {
+ description
+ "Include the IPv6 SRLG TLV only when the TLV is type
+ 139.";
+ }
+ description
+ "This container defines ISIS SRLG TLV.";
+
+ reference
+ "RFC6119: IPv6 Traffic Engineering in IS-IS. TLV 139.";
+
+ list ipv6-srlg {
+ key "instance-number";
+
+ description
+ "Instance of the IPv6 SRLG TLV.";
+
+ leaf instance-number {
+ type leafref {
+ path "../state/instance-number";
+ }
+ description
+ "Reference to the instance number of the IPv6 Shared
+ Risk Link Group (SRLG) TLV.";
+ }
+
+ container state {
+ description
+ "State parameters of TLV 139.";
+
+ leaf instance-number {
+ type uint32;
+ description
+ "An arbitrary unsigned 32-bit integer used to
+ disambiguate the instance of TLV 138. The instance
+ identifier is synthesised by the system
+ and may be renumbered for the same SRLG definition
+ in subsequent advertised LSPs if (and only if) the
+ entire list of SRLGs is replaced.";
+ }
+
+ leaf system-id {
+ type oc-isis-types:system-id;
+ description
+ "Neighbor system ID.";
+ }
+
+ leaf psn-number {
+ type uint8;
+ description
+ "Pseudonode number if the neighbor is on a LAN
+ interface.";
+ }
+
+ leaf-list flags {
+ type enumeration {
+ enum NA {
+ description
+ "When set, the IPv6 neighbour address is
+ included, whereas if unset, it is omitted";
+ }
+ }
+ description
+ "IPv6 SRLG flags.";
+ }
+
+ leaf ipv6-interface-address {
+ type inet:ipv6-address;
+ description
+ "IPv6 interface address or Link Local Identifier.";
+ }
+
+ leaf ipv6-neighbor-address {
+ type inet:ipv6-address;
+ description
+ "IPv6 neighbor address or Link Remote Identifier.";
+ }
+
+ leaf-list srlg-value {
+ type uint32;
+ description
+ "SRLG values.";
+ }
+ }
+ }
+ }
+
+ container purge-oi {
+ when "../state/type = 'oc-isis-lsdb-types:PURGE_OI'" {
+ description
+ "Only include the purge originator identitication TLV
+ when the TLV type is 13.";
+ }
+ description
+ "This container defines ISIS purge TLV.";
+
+ reference
+ "RFC6232: Purge Originator Identification TLV for IS-IS.
+ TLV 13.";
+
+ container state {
+ description
+ "State parameters of TLV 13.";
+
+ leaf system-id-count {
+ type uint8;
+ description
+ "Number of system IDs carried in this TLV.";
+ }
+
+ leaf source-system-id {
+ type oc-isis-types:system-id;
+ description
+ "System ID of the Intermediate System that inserted
+ this TLV.";
+ }
+
+ leaf received-system-id {
+ type oc-isis-types:system-id;
+ description
+ "System ID of the Intermediate System from which the
+ purge was received.";
+ }
+ }
+ }
+
+ container router-capabilities {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:ROUTER_CAPABILITY'" {
+ description
+ "Only include the router capability TLV when the TLV is
+ type 242.";
+ }
+ description
+ "This container defines router capabilities.";
+
+ list capability {
+ key "instance-number";
+
+ description
+ "This list describes IS Router capabilities.";
+
+ reference
+ "RFC4971: Intermediate System to Intermediate System
+ (IS-IS) Extensions for Advertising Router Information.
+ TLV 242.";
+
+ leaf instance-number {
+ type leafref {
+ path "../state/instance-number";
+ }
+ description
+ "Reference to the instance number of the router
+ capability TLV.";
+ }
+
+ container state {
+ description
+ "State parameters of TLV 242.";
+
+ leaf instance-number {
+ type uint32;
+ description
+ "A unique instance number for the instance of the
+ router capabilities TLV. The instance number should
+ be autogenerated by the producer of the data and may
+ be renumbered if the entire LSP contents are
+ replaced in subsequent advertisements.";
+ }
+
+ leaf router-id {
+ type inet:ipv4-address;
+ description
+ "IPv4 router-id.";
+ }
+
+ leaf-list flags {
+ type enumeration {
+ enum FLOOD {
+ description
+ "When the S bit is set(1), the IS - IS Router
+ CAPABILITY TLV MUST be flooded across the entire
+ routing domain. When the S bit is not set(0),
+ the TLV MUST NOT be leaked between levels . This
+ bit MUST NOT be altered during the TLV
+ leaking.";
+ }
+ enum DOWN {
+ description
+ "When the IS-IS Router CAPABILITY TLV is leaked
+ from level - 2 to level-1, the Down bit MUST be
+ set. Otherwise, this bit MUST be clear. IS - IS
+ Router capability TLVs with the Down bit set
+ MUST NOT be leaked from level - 1 to level-2.
+ This is to prevent TLV looping.";
+ }
+ }
+ description
+ "Router capability flags.";
+ }
+ }
+
+ container subtlvs {
+ description
+ "This container describes router capability TLV
+ sub-TLVs";
+
+ list subtlv {
+ key "type";
+ description
+ "List of subTLV types in the LSDB for the specified
+ TLV";
+
+ leaf type {
+ type leafref {
+ path "../state/type";
+ }
+ description
+ "Reference to the sub-TLV type";
+ }
+
+ container state {
+ description
+ "State parameters of IS Router Capabilities";
+
+ uses isis-lsdb-subtlv-type-state;
+ }
+
+ container segment-routing-algorithms {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:ROUTER_CAPABILITY_SR_ALGORITHM'" {
+ description
+ "Only include segment routing algorithm when the
+ sub-TLV is type 19.";
+ }
+ description
+ "This container defines SR algorithm sub-TLV 19.";
+
+ reference
+ "draft-ietf-isis-segment-routing-extensions.
+ TLV 242, sub-TLV 19";
+
+ container state {
+ description
+ "State parameters of sub-TLV 19 - Segment
+ Routing Algorithm.";
+
+ leaf-list algorithm {
+ type enumeration {
+ enum SPF {
+ value 0;
+ description
+ "Shortest Path First (SPF) algorithm
+ based on link metric. This is the
+ well-known shortest path algorithm as
+ computed by the IS-IS Decision process.
+ Consistent with the deployed practice
+ for link-state protocols, algorithm 0
+ permits any node to overwrite the SPF
+ path with a different path based on
+ local policy.";
+ }
+ enum STRICT_SPF {
+ value 1;
+ description
+ "Strict Shortest Path First (SPF)
+ algorithm based on link metric. The
+ algorithm is identical to algorithm 0
+ but algorithm 1 requires that all nodes
+ along the path will honor the SPF
+ routing decision. Local policy MUST NOT
+ alter the forwarding decision computed
+ by algorithm 1 at the node claiming to
+ support algorithm 1.";
+ }
+ }
+ description
+ "The Segment Routing algorithm that is
+ described by the TLV.";
+ }
+ }
+ }
+
+ container segment-routing-capability {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:ROUTER_CAPABILITY_SR_CAPABILITY'" {
+ description
+ "Only include the SR capability sub-TLV when
+ the sub-TLV type is 2.";
+ }
+ description
+ "This container defines SR Capability sub-TLV 2.";
+
+ reference
+ "draft-ietf-isis-segment-routing-extensions. TLV
+ 242, sub-TLV 2.";
+
+ container state {
+ description
+ "State parameters of IS SR Router Capability";
+
+ leaf-list flags {
+ type enumeration {
+ enum IPV4_MPLS {
+ description
+ "When set, the router is capable of
+ processing SR MPLS encapsulated IPv4
+ packets on all interfaces.";
+ }
+ enum IPV6_MPLS {
+ description
+ "When set, the router is capable of
+ processing SR MPLS encapsulated IPv6
+ packets on all interfaces.";
+ }
+ enum IPV6_SR {
+ description
+ "When set, the router is capable of
+ processing the IPv6 Segment Routing Header
+ on all interfaces.";
+ }
+ }
+ description
+ "Segment Routing Capability Flags.";
+ }
+ }
+
+ container srgb-descriptors {
+ description
+ "SRGB Descriptors included within the SR
+ capability sub-TLV";
+
+ list srgb-descriptor {
+ key "range";
+ description
+ "Descriptor entry within the SR capabilty
+ sub-TLV";
+
+ leaf range {
+ type leafref {
+ path "../state/range";
+ }
+ description
+ "Reference to unique SRGB Descriptor.";
+ }
+
+ container state {
+ description
+ "State parameters of the SR range";
+
+ leaf range {
+ type uint32;
+ description
+ "Number of SRGB elements. The range
+ value MUST be greater than 0.";
+ }
+
+ leaf label {
+ type oc-mpls-types:mpls-label;
+ description
+ "The first value of the SRGB when
+ expressed as an MPLS label.";
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ uses isis-lsdb-undefined-subtlv;
+ }
+ }
+
+ container is-reachability {
+ when "../state/type = 'oc-isis-lsdb-types:IIS_NEIGHBORS'" {
+ description
+ "Include IIS_NEIGHBORS sub-TLV when the TLV type is 2.";
+ }
+ description
+ "This container describes list of ISIS neighbors and
+ attributes.";
+
+ reference
+ "ISO 10589, Intermediate System to Intermediate System
+ Intra- Domain Routeing Exchange Protocol for use in
+ Conjunction with the Protocol for Providing the
+ Connectionless-mode Network Service (ISO 8473),
+ International Standard 10589: 2002, Second Edition,
+ 2002. TLV 2.";
+
+ container neighbors {
+ description
+ "This container describes IS neighbors.";
+
+ list neighbor {
+ key "system-id";
+ description
+ "IS reachability neighbor attributes.";
+
+ leaf system-id {
+ type leafref {
+ path "../state/system-id";
+ }
+ description
+ "Reference to the system ID of the neighbor.";
+ }
+
+ uses isis-lsdb-neighbor;
+ }
+ }
+ }
+
+ container ipv4-internal-reachability {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IPV4_INTERNAL_REACHABILITY'" {
+ description
+ "Include IPv4 internal reachability TLV when the TLV
+ type is specified as 128.";
+ }
+ description
+ "This container defines list of IPv4 internal reachability
+ information.";
+
+ reference
+ "RFC1195: OSI ISIS for IP and Dual Environments. RFC5302:
+ Domain-Wide Prefix Distribution with Two-Level IS-IS. TLV
+ 128";
+
+ container prefixes {
+ description
+ "This container describes IS prefixes.";
+
+ list prefix {
+ key "prefix";
+
+ description
+ "IPv4 prefixes and internal reachability attributes.";
+
+ leaf prefix {
+ type leafref {
+ path "../state/prefix";
+ }
+ description
+ "Reference to the IPv4 prefix";
+ }
+
+ uses ipv4-prefix-attributes-state;
+ }
+ }
+ }
+
+ container ipv4-external-reachability {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IPV4_EXTERNAL_REACHABILITY'" {
+ description
+ "Include IPv4 external reachability when the TLV type
+ is set to 130.";
+ }
+ description
+ "This container defines list of IPv4 external reachability
+ information.";
+
+ reference
+ "RFC1195: OSI ISIS for IP and Dual Environments. RFC5302:
+ Domain-Wide Prefix Distribution with Two-Level IS-IS. TLV
+ 130";
+
+ container prefixes {
+ description
+ "This container describes IS neighbors.";
+
+ list prefix {
+ key "prefix";
+
+ description
+ "IPv4 external prefixes and reachability attributes.";
+
+ leaf prefix {
+ type leafref {
+ path "../state/prefix";
+ }
+ description
+ "Reference to the IPv4 prefix.";
+ }
+
+ uses ipv4-prefix-attributes-state;
+ }
+ }
+ }
+
+ container authentication {
+ when "../state/type = 'oc-isis-lsdb-types:AUTHENTICATION'" {
+ description
+ "Only include the authentication TLV when the TLV is
+ type 10.";
+ }
+ description
+ "This container defines authentication information of the
+ node.";
+
+ reference
+ "ISO 10589 Intermediate System to Intermediate System
+ Intra- Domain Routeing Exchange Protocol for use in
+ Conjunction with the Protocol for Providing the
+ Connectionless-mode Network Service (ISO 8473)
+ International Standard 10589: 2002, Second Edition, 2002.
+ TLV 10.";
+
+ container state {
+ description
+ "State parameters of TLV 10.";
+
+ leaf crypto-type {
+ type enumeration {
+ enum HMAC_MD5 {
+ description
+ "HMAC-MD5 Authentication type.";
+ }
+ enum CLEARTEXT {
+ description
+ "Cleartext Authentication type.";
+ }
+ }
+ description
+ "Authentication type to be used.";
+ }
+
+ leaf authentication-key {
+ type string;
+ description
+ "Authentication key to be used.";
+ }
+ }
+ }
+
+ container extended-is-reachability {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:EXTENDED_IS_REACHABILITY'" {
+ description
+ "Only included the extended IS reachability TLV when the
+ TLV is type 22.";
+ }
+
+ description
+ "This container defines list of ISIS extended reachability
+ neighbors.";
+
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering. TLV
+ 22.";
+
+ uses isis-lsdb-common-extisreach-neighbors;
+ }
+
+ container extended-ipv4-reachability {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:EXTENDED_IPV4_REACHABILITY'" {
+ description
+ "Only include the extended IPv4 reachability container
+ when the TLV type is 135.";
+ }
+ description
+ "This container defines list of IPv4 extended reachability
+ information.";
+
+ reference
+ "RFC5305: IS-IS Extensions for Traffic Engineering. TLV
+ 135";
+
+ container prefixes {
+ description
+ "This container describes IS prefixes.";
+
+ list prefix {
+ key "prefix";
+
+ description
+ "This list describes IPv4 extended prefixes and
+ attributes.";
+
+ leaf prefix {
+ type leafref {
+ path "../state/prefix";
+ }
+ description
+ "Reference to the IPv4 prefix that the TLV describes
+ the attributes of.";
+ }
+
+ uses ipv4-prefix-extended-state;
+ }
+ }
+ }
+
+ container ipv6-reachability {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IPV6_REACHABILITY'" {
+ description
+ "Only include the IPv6 reachability container when the
+ TLV type is 236.";
+ }
+ description
+ "This container defines list of IPv6 reachability
+ information.";
+
+ reference
+ "RFC5308: Routing IPv6 with IS-IS. TLV 236";
+
+ container prefixes {
+ description
+ "This container describes IS prefixes.";
+
+ list prefix {
+ key "prefix";
+
+ description
+ "This list defines IPv6 extended prefix attributes.";
+
+ leaf prefix {
+ type leafref {
+ path "../state/prefix";
+ }
+ description
+ "Reference to the IPv6 prefix that the TLV
+ corresponds to.";
+ }
+
+ uses ipv6-prefix-extended-state;
+ }
+ }
+ }
+
+ container multi-topology {
+ when "../state/type = 'oc-isis-lsdb-types:MULTI_TOPOLOGY'" {
+ description
+ "Only include the multi-topology container when the TLV
+ is type 229.";
+ }
+
+ description
+ "This container defines the topology supported.";
+
+ reference
+ "RFC5120: M-ISIS: Multi Topology (MT) Routing in
+ Intermediate System to Intermediate Systems (IS-ISs). TLV
+ 229";
+
+ container topologies {
+ description
+ "This container describes IS topologies.";
+
+ list topology {
+ key "mt-id";
+
+ description
+ "This list describes a topology.";
+
+ leaf mt-id {
+ type leafref {
+ path "../state/mt-id";
+ }
+ description
+ "Reference to the multi-topology ID being described
+ by the list entry.";
+ }
+
+ container state {
+ description
+ "State parameters of IS multi-topology TLV 229.";
+
+ leaf mt-id {
+ type uint16 {
+ range "0 .. 4095";
+ }
+ description
+ "Multi-topology ID.";
+ }
+
+ leaf attributes {
+ type enumeration {
+ enum OVERLOAD {
+ description
+ "When set, node is overloaded, still part of
+ the topology but cannot be used for transit.";
+ }
+ enum ATTACHED {
+ description
+ "When set, node is attached to another area
+ using the referred metric and can be used as
+ default gateway.";
+ }
+ }
+ description
+ "Attributes of the LSP for the associated
+ topology.";
+ }
+ }
+ }
+ }
+ }
+
+ container isis-neighbor-attribute {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:IS_NEIGHBOR_ATTRIBUTE'" {
+ description
+ "Only include the neighbor attribute container when the
+ TLV is type 23.";
+ }
+ description
+ "This container defines list of ISIS topology neighbors
+ for extended ISIS LSP (multiple system IDs). ";
+
+ reference
+ "RFC5311: Simplified Extension of Link State PDU (LSP)
+ Space for IS-IS. TLV 23. It is identical in format to the
+ extended IS reachability TLV 22.";
+
+ uses isis-lsdb-common-extisreach-neighbors;
+ }
+
+ container is-alias-id {
+ when "../state/type = 'oc-isis-lsdb-types:ISIS_ALIAS_ID'" {
+ description
+ "Only include the ISIS alias ID container when the TLV
+ is type 24.";
+ }
+
+ description
+ "This container defines the IS-Alias TLV which allows
+ extension-capable ISs to recognize the Originating System
+ of an Extended LSP set. It identifies the Normal system-
+ id of the Originating System.";
+
+ reference
+ "RFC5311: Simplified Extension of Link State PDU (LSP)
+ Space for IS-IS TLV 24.";
+
+ container state {
+ config false;
+ description
+ "State parameters of alias ID.";
+
+ leaf alias-id {
+ type oc-isis-types:system-id;
+ description
+ "List of alias ID(s).";
+ }
+ }
+ }
+
+ container mt-isn {
+ when "../state/type = 'oc-isis-lsdb-types:MT_ISN'" {
+ description
+ "Only include the MT ISN container when the TLV is type
+ 222.";
+ }
+ description
+ "This container defines list of ISIS multi-topology
+ neighbors.";
+
+ reference
+ "RFC5120: M-ISIS: Multi Topology (MT) Routing in
+ Intermediate System to Intermediate Systems (IS-ISs). TLV
+ 222.";
+
+ uses isis-lsdb-mtis-common;
+ }
+
+ container mt-isis-neighbor-attribute {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:MT_IS_NEIGHBOR_ATTRIBUTE'" {
+ description
+ "Only include the MT ISIS neighbor attribute container
+ when the TLV is type 223.";
+ }
+
+ description
+ "This container defines list of ISIS multi-topology
+ neighbors.";
+
+ reference
+ "RFC5311: Simplified Extension of Link State PDU (LSP)
+ Space for IS-IS. TLV 223. It is identical in format to the
+ MT-ISN TLV 222.";
+
+ uses isis-lsdb-mtis-common;
+ }
+
+ container mt-ipv4-reachability {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:MT_IPV4_REACHABILITY'" {
+ description
+ "Only include the multi-topology IPv4 reachability
+ container when the TLV is type 235.";
+ }
+ description
+ "This container defines list of IPv4 reachability
+ Information in multi-topology environment.";
+
+ reference
+ "RFC5120: M-ISIS: Multi Topology (MT) Routing in
+ Intermediate System to Intermediate Systems (IS-ISs). TLV
+ 235.";
+
+ container prefixes {
+ description
+ "This container describes IS prefixes.";
+
+ list prefix {
+ key "mt-id prefix";
+
+ leaf mt-id {
+ type leafref {
+ path "../state/mt-id";
+ }
+ description
+ "Reference to the topology ID of the topology that
+ the prefix is within.";
+ }
+
+ leaf prefix {
+ type leafref {
+ path "../state/prefix";
+ }
+ description
+ "Reference to the prefix to which reachability is
+ being advertised.";
+ }
+
+ description
+ "IPv4 prefixes that are contained within MT
+ reachability TLV.";
+
+ uses ipv4-mt-prefix-extended-state;
+ }
+ }
+ }
+
+ container mt-ipv6-reachability {
+ when "../state/type = " +
+ "'oc-isis-lsdb-types:MT_IPV6_REACHABILITY'" {
+ description
+ "Only include the multi-topology IPv6 reachability
+ container when the TLV is type 237.";
+ }
+ description
+ "This container defines list of IPv6 reachability
+ information in multi - topology environment.";
+
+ reference
+ "RFC5120: M-ISIS: Multi Topology (MT) Routing in
+ Intermediate System to Intermediate Systems (IS-ISs). TLV
+ 237.";
+
+ container prefixes {
+ description
+ "This container describes IS prefixes.";
+
+ list prefix {
+ key "prefix mt-id";
+ description
+ "List of IPv6 prefixes contained within MT
+ reachability TLV.";
+
+ leaf prefix {
+ type leafref {
+ path "../state/prefix";
+ }
+ description
+ "Reference to the IPv6 prefix described by the
+ TLV.";
+ }
+
+ leaf mt-id {
+ type leafref {
+ path "../state/mt-id";
+ }
+ description
+ "Reference to the multi-topology ID.";
+ }
+
+ uses ipv6-mt-prefix-extended-state;
+ }
+ }
+ }
+ }
+ }
+
+ uses isis-lsdb-undefined-tlv;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-isis-policy.yang b/src/plugins/yang/openconfig/openconfig-isis-policy.yang
new file mode 100644
index 0000000..748b720
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-isis-policy.yang
@@ -0,0 +1,189 @@
+module openconfig-isis-policy {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/openconfig-isis-policy";
+
+ prefix "oc-isis-pol";
+
+ // import some basic types
+ import openconfig-routing-policy {prefix rpol; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-isis-types { prefix isis-types; }
+
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net ";
+
+ description
+ "This module contains data definitions for ISIS routing policy.
+ It augments the base routing-policy module with BGP-specific
+ options for conditions and actions.";
+
+ oc-ext:openconfig-version "0.4.0";
+
+ revision "2018-05-14" {
+ description
+ "Update LSDB model to correct Extended IS reach TLV
+ bug. This change is backwards incompatible due to
+ adding an additional level of hierarchy to support
+ multiple instances of the TLV.";
+ reference "0.4.0";
+ }
+
+ revision "2017-07-26" {
+ description
+ "Update LSDB and fix bugs.";
+ reference "0.3.2";
+ }
+
+ revision "2017-05-15" {
+ description
+ "Refactor LSDB.";
+ reference "0.3.0";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Remove top-level /isis container";
+ reference "0.2.1";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add segment routing to IS-IS module";
+ reference "0.2.0";
+ }
+
+ revision "2016-10-18" {
+ description
+ "Initial revision of IS-IS models.";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping isis-match-conditions {
+ description
+ "Criteria used to match IS-IS routes within the policy";
+
+ container isis-conditions {
+ description
+ "Match conditions relating to the IS-IS protocol";
+
+ container config {
+ description
+ "Configuration parameters relating to IS-IS match
+ conditions";
+
+ uses isis-match-conditions-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to IS-IS match
+ conditions";
+ uses isis-match-conditions-config;
+ }
+ }
+ }
+
+ grouping isis-match-conditions-config {
+ description
+ "Match conditions for IS-IS";
+
+ leaf level-eq {
+ type isis-types:level-number;
+ description
+ "Match the level that the IS-IS prefix is within. This can
+ be used in the case that import or export policies refer
+ to an IS-IS instance that has multiple levels configured
+ within it";
+ }
+ }
+
+ grouping isis-actions {
+ description
+ "Actions supplied by the IS-IS protocol to be set on a
+ route within the policy";
+
+ container isis-actions {
+ description
+ "Actions that can be performed by IS-IS within a policy";
+
+ container config {
+ description
+ "Configuration parameters relating to IS-IS actions";
+
+ uses isis-actions-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state associated with IS-IS actions";
+
+ uses isis-actions-config;
+ }
+ }
+ }
+
+ grouping isis-actions-config {
+ description
+ "Actions for IS-IS";
+
+ leaf set-level {
+ type isis-types:level-number;
+ description
+ "Set the level that a prefix is to be imported into.";
+ }
+
+ leaf set-metric-type {
+ type isis-types:level-number;
+ description
+ "Set the type of metric that is to be specified when the
+ set metric leaf is specified";
+ }
+
+ leaf set-metric {
+ type isis-types:wide-metric;
+ description
+ "Set the metric of the IS-IS prefix";
+ }
+ }
+
+ // augment statements
+ augment "/rpol:routing-policy/rpol:policy-definitions/" +
+ "rpol:policy-definition/rpol:statements/rpol:statement/" +
+ "rpol:actions" {
+ description "This augments igp-actions with ISIS conditions";
+ uses isis-actions;
+
+ }
+
+ augment "/rpol:routing-policy/rpol:policy-definitions/" +
+ "rpol:policy-definition/rpol:statements/rpol:statement/" +
+ "rpol:conditions" {
+ description "This augments igp-conditions with ISIS conditions";
+ uses isis-match-conditions;
+ }
+
+ // rpc statements
+
+ // notification statements
+}
diff --git a/src/plugins/yang/openconfig/openconfig-isis-routing.yang b/src/plugins/yang/openconfig/openconfig-isis-routing.yang
new file mode 100644
index 0000000..84e7a7a
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-isis-routing.yang
@@ -0,0 +1,384 @@
+submodule openconfig-isis-routing {
+
+ belongs-to openconfig-isis {
+ prefix "oc-isis";
+ }
+
+ // import some basic types
+ import openconfig-isis-types { prefix oc-isis-types; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-mpls-types { prefix oc-mplst; }
+ import openconfig-segment-routing { prefix oc-sr; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module describes YANG model for ISIS Routing";
+
+ oc-ext:openconfig-version "0.4.0";
+
+ revision "2018-05-14" {
+ description
+ "Update LSDB model to correct Extended IS reach TLV
+ bug. This change is backwards incompatible due to
+ adding an additional level of hierarchy to support
+ multiple instances of the TLV.";
+ reference "0.4.0";
+ }
+
+ revision "2017-07-26" {
+ description
+ "Update LSDB and fix bugs.";
+ reference "0.3.2";
+ }
+
+ revision "2017-05-15" {
+ description
+ "Refactor LSDB.";
+ reference "0.3.0";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Remove top-level /isis container";
+ reference "0.2.1";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add segment routing to IS-IS module";
+ reference "0.2.0";
+ }
+
+ revision "2016-10-18" {
+ description
+ "Initial revision of IS-IS models.";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping rt-admin-config {
+ description
+ "Re-usable grouping to enable or disable a particular IS-IS feature.";
+
+ leaf enabled {
+ type boolean;
+ description
+ "When set to true, the functionality within which this leaf is
+ defined is enabled, when set to false it is explicitly disabled.";
+ }
+ }
+
+ grouping isis-afi-safi-config {
+ description
+ "This grouping defines Address-Family configuration parameters";
+
+ leaf afi-name {
+ type identityref {
+ base oc-isis-types:AFI_TYPE;
+ }
+ description
+ "Address-family type.";
+ }
+
+ leaf safi-name {
+ type identityref {
+ base oc-isis-types:SAFI_TYPE;
+ }
+ description
+ "Subsequent address-family type.";
+ }
+ }
+
+ grouping isis-shortcuts-afi-config {
+ description
+ "This grouping defines ISIS Shortcuts configuration parameters";
+
+ leaf afi-name {
+ type identityref {
+ base oc-isis-types:AFI_TYPE;
+ }
+ description "Address-family type.";
+ }
+
+ leaf-list nh-type {
+ type identityref {
+ base oc-mplst:PATH_SETUP_PROTOCOL;
+ }
+ description "Tunnel NH Type(RSVP,SR). When present it implies
+ that nh-type shortcut is enabled for a specified AFI.";
+ }
+ }
+
+ grouping isis-shortcuts-config {
+ description
+ "This grouping defines ISIS Shortcuts consfiguration parameters";
+
+ container config {
+ description "This container defines ISIS shortcuts configuration.";
+ uses rt-admin-config;
+ }
+
+ container state {
+ config false;
+ description "This container defines state for ISIS shortcuts.";
+ uses rt-admin-config;
+ }
+ }
+
+ grouping isis-mt-config {
+ description
+ "This grouping defines ISIS multi-topology configuration parameters";
+
+ leaf afi-name {
+ type identityref {
+ base oc-isis-types:AFI_TYPE;
+ }
+ description
+ "Address-family type.";
+ }
+ leaf safi-name {
+ type identityref {
+ base oc-isis-types:SAFI_TYPE;
+ }
+ description
+ "Subsequent address-family type.";
+ }
+ //prefer single topology
+ }
+
+
+
+ // *********** STRUCTURE GROUPINGS **********************
+
+ grouping isis-metric-config {
+ description
+ "This grouping defines ISIS metric configuration";
+
+ leaf metric {
+ type uint32;
+ default 10;
+ description "ISIS metric value(default=10).";
+ }
+ }
+
+ grouping isis-afi-safi-list {
+ description
+ "This grouping defines address-family configuration and state
+ information";
+
+ list af {
+ key "afi-name safi-name";
+
+ description
+ "Address-family/Subsequent Address-family list.";
+
+ leaf afi-name {
+ type leafref {
+ path "../config/afi-name";
+ }
+ description
+ "Reference to address-family type";
+ }
+
+ leaf safi-name {
+ type leafref {
+ path "../config/safi-name";
+ }
+ description
+ "Reference to subsequent address-family type";
+ }
+
+ container config {
+ description
+ "This container defines AFI-SAFI configuration parameters";
+
+ uses isis-afi-safi-config;
+ uses isis-metric-config;
+ uses rt-admin-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines AFI-SAFI State information";
+
+ uses isis-afi-safi-config;
+ uses isis-metric-config;
+ uses rt-admin-config;
+ }
+
+ uses isis-mt-list;
+ }
+ }
+
+ grouping isis-if-afi-safi-list {
+ description
+ "This grouping defines address-family configuration and state
+ information";
+
+ list af {
+ key "afi-name safi-name";
+
+ description
+ "Address-family/Subsequent Address-family list.";
+
+ leaf afi-name {
+ type leafref {
+ path "../config/afi-name";
+ }
+ description
+ "Reference to address-family type";
+ }
+
+ leaf safi-name {
+ type leafref {
+ path "../config/safi-name";
+ }
+ description
+ "Reference to subsequent address-family type";
+ }
+
+ container config {
+ description
+ "This container defines AFI-SAFI configuration parameters. Single
+ topology is the default setting.";
+ uses isis-afi-safi-config;
+ uses isis-metric-config;
+ uses rt-admin-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines AFI-SAFI State information";
+ uses isis-afi-safi-config;
+ uses isis-metric-config;
+ uses rt-admin-config;
+ }
+
+ uses oc-sr:sr-igp-interface-top;
+ }
+ }
+
+ grouping isis-if-global-afi-safi-list {
+ description
+ "This grouping defines address-family configuration and state
+ information";
+
+ list af {
+ key "afi-name safi-name";
+
+ description
+ "Address-family/Subsequent Address-family list.";
+
+ leaf afi-name {
+ type leafref {
+ path "../config/afi-name";
+ }
+ description
+ "Reference to address-family type";
+ }
+
+ leaf safi-name {
+ type leafref {
+ path "../config/safi-name";
+ }
+ description
+ "Reference to subsequent address-family type";
+ }
+
+ container config {
+ description
+ "This container defines AFI-SAFI configuration parameters. Single
+ topology is the default setting.";
+ uses isis-afi-safi-config;
+ uses rt-admin-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines AFI-SAFI State information";
+ uses isis-afi-safi-config;
+ uses rt-admin-config;
+ }
+ }
+ }
+
+ grouping isis-shortcuts-afi-list {
+ description
+ "This grouping defines ISIS Shorcuts configuration and
+ state information";
+
+ list afi {
+ key "afi-name";
+
+ description
+ "Address-family list.";
+
+ leaf afi-name {
+ type leafref {
+ path "../config/afi-name";
+ }
+ description
+ "Reference to address-family type.";
+ }
+
+ container config {
+ description
+ "This container defines ISIS Shortcuts configuration parameters";
+ uses isis-shortcuts-afi-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines ISIS Shortcuts state information";
+ uses isis-shortcuts-afi-config;
+ }
+ }
+ }
+
+ grouping isis-mt-list {
+ description
+ "This grouping defines multi-topology address-family configuration and
+ state information. MT0 - IPv4 Unicast, MT2 - IPv6 Unicast, MT3 -
+ IPv4 Multicast, MT4 - IPv6 Multicast";
+
+ container multi-topology {
+ description
+ "This container defines multi-topology address-family configuration
+ and state information. ISIS TLV 235, 237.";
+
+ container config {
+ description
+ "This container defines AFI-SAFI multi-topology configuration
+ parameters";
+ uses isis-mt-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines AFI-SAFI multi-topology state information";
+ uses isis-mt-config;
+ uses rt-admin-config;
+ }
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-isis-types.yang b/src/plugins/yang/openconfig/openconfig-isis-types.yang
new file mode 100644
index 0000000..cdfab1f
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-isis-types.yang
@@ -0,0 +1,339 @@
+module openconfig-isis-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/isis-types";
+
+ prefix "oc-isis-types";
+
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module contains general data definitions for use in ISIS YANG
+ model.";
+
+ oc-ext:openconfig-version "0.4.0";
+
+ revision "2018-05-14" {
+ description
+ "Update LSDB model to correct Extended IS reach TLV
+ bug. This change is backwards incompatible due to
+ adding an additional level of hierarchy to support
+ multiple instances of the TLV.";
+ reference "0.4.0";
+ }
+
+ revision "2017-07-26" {
+ description
+ "Update LSDB and fix bugs.";
+ reference "0.3.2";
+ }
+
+ revision "2017-05-15" {
+ description
+ "Refactor LSDB.";
+ reference "0.3.0";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Remove top-level /isis container";
+ reference "0.2.1";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add segment routing to IS-IS module";
+ reference "0.2.0";
+ }
+
+ revision "2016-10-18" {
+ description
+ "Initial revision of IS-IS models.";
+ reference "0.1.0";
+ }
+
+ // identity statements
+ identity OVERLOAD_RESET_TRIGGER_TYPE {
+ description
+ "Base identify type for triggers that reset Overload Bit";
+ }
+
+ identity WAIT_FOR_BGP {
+ base OVERLOAD_RESET_TRIGGER_TYPE;
+ description
+ "Base identity type for resetting Overload Bit when BGP has converged. ";
+ }
+
+ identity WAIT_FOR_SYSTEM {
+ base OVERLOAD_RESET_TRIGGER_TYPE;
+ description
+ "Base identity type for resetting Overload Bit when system resources have
+ been restored. ";
+ }
+
+ identity MT_TYPE {
+ description
+ "Base identify type for multi-topology";
+ }
+
+ identity SAFI_TYPE {
+ description
+ "Base identify type for SAFI";
+ }
+
+ identity AFI_TYPE {
+ description
+ "Base identify type for AFI";
+ }
+
+ identity AFI_SAFI_TYPE {
+ description
+ "Base identify type for AFI/SAFI";
+ }
+
+ identity IPV4_UNICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "Base identify type for IPv4 Unicast address family";
+ }
+
+ identity IPV6_MULTICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "Base identify type for IPv6 multicast address family";
+ }
+
+ identity IPV4_MULTICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "Base identify type for IPv4 multicast address family";
+ }
+
+ identity IPV6_UNICAST {
+ base AFI_SAFI_TYPE;
+ description
+ "Base identify type for IPv6 unicast address family";
+ }
+
+ identity UNICAST {
+ base SAFI_TYPE;
+ description
+ "Base identify type for IPv4 Unicast address family";
+ }
+
+ identity MULTICAST {
+ base SAFI_TYPE;
+ description
+ "Base identify type for IPv6 multicast address family";
+ }
+
+ identity IPV4 {
+ base AFI_TYPE;
+ description
+ "Base identify type for IPv4 address family";
+ }
+
+ identity IPV6 {
+ base AFI_TYPE;
+ description
+ "Base identify type for IPv6 address family";
+ }
+
+ // typedef statements
+ typedef level-type {
+ type enumeration {
+ enum LEVEL_1 {
+ description "This enum describes ISIS level 1";
+ }
+ enum LEVEL_2 {
+ description "This enum describes ISIS level 2";
+ }
+ enum LEVEL_1_2 {
+ description "This enum describes ISIS level 1-2";
+ }
+ }
+ description
+ "This type defines ISIS level types";
+ }
+
+ typedef level-number {
+ type uint8 {
+ range "1..2";
+ }
+ description
+ "This type defines ISIS level.";
+ }
+
+ typedef adaptive-timer-type {
+ type enumeration {
+ enum LINEAR {
+ description "This enum describes linear algorithm timer";
+ }
+ enum EXPONENTIAL {
+ description "This enum describes exponential algorithm timer";
+ }
+ }
+ description
+ "This type defines ISIS adaptive timer types";
+ }
+
+ typedef hello-padding-type {
+ type enumeration {
+ enum STRICT {
+ description "This enum describes strict padding";
+ }
+ enum LOOSE {
+ description "This enum describes loose padding";
+ }
+ enum ADAPTIVE {
+ description "This enum describes adaptive padding";
+ }
+ enum DISABLE {
+ description "This enum disables padding";
+ }
+ }
+ description
+ "This type defines ISIS hello padding type";
+ }
+
+ typedef circuit-type {
+ type enumeration {
+ enum POINT_TO_POINT {
+ description "This enum describes a point-to-point interface";
+ }
+ enum BROADCAST {
+ description "This enum describes a broadcast interface";
+ }
+ }
+ description
+ "This type defines ISIS interface types ";
+ }
+
+ typedef metric-type {
+ type enumeration {
+ enum INTERNAL {
+ description "This enum describes internal route type";
+ }
+ enum EXTERNAL {
+ description "This enum describes external route type";
+ }
+ }
+ description
+ "This type defines ISIS metric type";
+ }
+
+ typedef wide-metric {
+ type uint32 {
+ range "1..16777215";
+ }
+ description
+ "This type defines ISIS wide metric.";
+ }
+
+ typedef narrow-metric {
+ type uint8 {
+ range "1..63";
+ }
+ description
+ "This type defines ISIS narrow metric.";
+ }
+
+ typedef metric-style {
+ type enumeration {
+ enum NARROW_METRIC {
+ description
+ "This enum describes narrow metric style";
+ reference "RFC1195";
+ }
+ enum WIDE_METRIC {
+ description
+ "This enum describes wide metric style";
+ reference "RFC5305";
+ }
+ }
+ description
+ "This type defines ISIS metric styles";
+ }
+
+ typedef isis-interface-adj-state {
+ type enumeration {
+ enum UP {
+ description
+ "This state describes that adjacency is established.";
+ }
+ enum DOWN {
+ description
+ "This state describes that adjacency is NOT established.";
+ }
+ enum INIT {
+ description
+ "This state describes that adjacency is establishing.";
+ }
+ enum FAILED {
+ description
+ "This state describes that adjacency is failed.";
+ }
+ }
+ description
+ "This type defines the state of the interface.";
+ }
+
+ typedef net {
+ type string {
+ pattern '^[a-fA-F0-9]{2}(\.[a-fA-F0-9]{4}){3,9}\.[a-fA-F0-9]{2}$';
+ }
+ description
+ "This type defines OSI NET address. A NET should should be in
+ the form xx.yyyy.yyyy.yyyy.00 with up to 9 sets of yyyy.";
+ }
+
+ typedef area-address {
+ type string {
+ pattern '^[0-9A-Fa-f]{2}\.([0-9A-Fa-f]{4}\.){0,3}$';
+ }
+ description
+ "This type defines the ISIS area address.";
+ }
+
+ typedef system-id {
+ type string {
+ pattern '^[0-9A-Fa-f]{4}\.[0-9A-Fa-f]{4}\.[0-9A-Fa-f]{4}$';
+ }
+ description
+ "This type defines ISIS system id using pattern, system id looks
+ like : 0143.0438.AeF0";
+ }
+
+ typedef extended-circuit-id {
+ type uint32;
+ description
+ "This type defines interface circuit ID.";
+ }
+
+ typedef lsp-id {
+ type string {
+ pattern
+ '^[0-9A-Fa-f]{4}\.[0-9A-Fa-f]{4}\.[0-9A-Fa-f]'
+ + '{4}\.[0-9][0-9]-[0-9][0-9]$';
+ }
+ description
+ "This type defines ISIS LSP ID. ISIS LSP ID type should be in
+ the form of xxxx.xxxx.xxxx.xx-xx";
+ }
+ typedef snpa {
+ type string {
+ length "0 .. 20";
+ }
+ description
+ "This type defines Subnetwork Point of Attachment format.";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-isis.yang b/src/plugins/yang/openconfig/openconfig-isis.yang
new file mode 100644
index 0000000..0a0db6b
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-isis.yang
@@ -0,0 +1,2059 @@
+module openconfig-isis {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/openconfig-isis";
+
+ prefix "oc-isis";
+
+ // import some basic types
+ import ietf-inet-types { prefix "inet"; }
+ import ietf-yang-types { prefix "yang"; }
+ import openconfig-types { prefix "oc-types"; }
+ import openconfig-isis-types { prefix "oc-isis-types"; }
+ import openconfig-routing-policy { prefix "oc-rpol"; }
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-interfaces { prefix "oc-if"; }
+ import openconfig-segment-routing { prefix "oc-sr"; }
+ // TODO(robjs): Import authentication and keychain following merge of these
+ // modules.
+ //import openconfig-authentication-types { prefix "oc-auth-types"; }
+ //import openconfig-keychain { prefix "oc-keychain"; }
+
+ // Include submodules:
+ // IS-IS LSP is the LSDB for IS-IS.
+ include openconfig-isis-lsp;
+ // IS-IS RT is routing-related features for IS-IS
+ include openconfig-isis-routing;
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net ";
+
+ description
+ "This module describes a YANG model for ISIS protocol configuration.
+ It is a limited subset of all of the configuration parameters
+ available in the variety of vendor implementations, hence it is
+ expected that it would be augmented with vendor - specific configuration
+ data as needed. Additional modules or submodules to handle other
+ aspects of ISIS configuration, including policy, routing, types,
+ LSDB and additional address families are also expected. This model
+ supports the following ISIS configuration level hierarchy:
+
+ ISIS
+ +-> { global ISIS configuration}
+ +-> levels +-> { level config}
+ +-> { system-level-counters }
+ +-> { level link-state-database}
+ +-> interface +-> { interface config }
+ +-> { circuit-counters }
+ +-> { levels config }
+ +-> { level adjacencies }";
+
+ oc-ext:openconfig-version "0.4.1";
+
+ revision "2018-06-05" {
+ description
+ "Fix bugs in when statements.";
+ reference "0.4.1";
+ }
+
+ revision "2018-05-14" {
+ description
+ "Update LSDB model to correct Extended IS reach TLV
+ bug. This change is backwards incompatible due to
+ adding an additional level of hierarchy to support
+ multiple instances of the TLV.";
+ reference "0.4.0";
+ }
+
+ revision "2017-07-26" {
+ description
+ "Update LSDB and fix bugs.";
+ reference "0.3.2";
+ }
+
+ revision "2017-05-15" {
+ description
+ "Refactor LSDB.";
+ reference "0.3.0";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Remove top-level /isis container";
+ reference "0.2.1";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add segment routing to IS-IS module";
+ reference "0.2.0";
+ }
+
+ revision "2016-10-18" {
+ description
+ "Initial revision of IS-IS models.";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping isis-global-config {
+ description
+ "This grouping defines lobal configuration options for ISIS router.";
+
+ // multi-instance
+ leaf instance {
+ type string;
+ default 0;
+ description
+ "ISIS Instance.";
+ }
+
+ leaf-list net {
+ type oc-isis-types:net;
+ description
+ "ISIS network entity title (NET). The first 8 bits are usually
+ 49 (private AFI), next 16 bits represent area, next 48 bits represent
+ system id and final 8 bits are set to 0.";
+ reference
+ "International Organization for Standardization, Information
+ technology - Open Systems Interconnection-Network service
+ Definition - ISO/ IEC 8348:2002.";
+ }
+
+ leaf maximum-area-addresses {
+ type uint8;
+ default 3;
+ description
+ "Maximum areas supported.";
+ }
+
+ leaf level-capability {
+ type oc-isis-types:level-type;
+ default "LEVEL_1_2";
+ description
+ "ISIS level capability(level-1, level-2,vlevel-1-2).";
+ }
+
+ leaf max-ecmp-paths {
+ type uint8;
+ description
+ "ISIS max-paths count.";
+ }
+
+ leaf poi-tlv {
+ type boolean;
+ default false;
+ description
+ "ISIS purge TLV. When set to true, a TLV is added to purges to record
+ the system ID of the IS generating the purge.";
+ reference "RFC6232: Purge Originator Identification TLV for IS-IS. TLV 13.";
+ }
+
+ leaf iid-tlv {
+ type boolean;
+ default false;
+ description
+ "ISIS Instance Identifier TLV. When set to trues, the IID-TLV identifies
+ the unique instance as well as the topology/topologies to which the
+ PDU applies.";
+ reference "RFC6822: IS-IS Multi-Instance. TLV 7";
+ }
+
+ leaf fast-flooding {
+ type boolean;
+ default true;
+ description
+ "When set to true, IS will always flood the LSP that triggered an SPF
+ before the router actually runs the SPF computation.";
+ }
+ }
+
+ grouping admin-config {
+ description
+ "Re-usable grouping to enable or disable a particular IS-IS feature.";
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "When set to true, the functionality within which this leaf is
+ defined is enabled, when set to false it is explicitly disabled.";
+ }
+ }
+
+ grouping isis-bfd-config {
+ description
+ "This grouping defines Bidirectionl-Forwarding-Detection
+ configuration.";
+
+ //There is also BFD state under adjacency
+ leaf bfd-tlv {
+ type boolean;
+ description
+ "When set to true, BFD TLV is used. This enables support for the IS-IS
+ BFD TLV options, which specify that a BFD session must be established
+ before an IS-IS adjacency can transition to the established state.
+ This option should be enabled on all IS-IS neighbors on a shared
+ interface.";
+ reference "RFC6213. TLV 148";
+ }
+ reference "RFC5880: Bidirectional Forwarding Detection (BFD).";
+ }
+
+ grouping isis-authentication-check-config {
+ description
+ "This grouping defines ISIS authentication check.";
+
+ leaf authentication-check {
+ type boolean;
+ default true;
+ description
+ "When set to true, reject all ISIS protocol PDUs that either have a mismatch
+ in authentication-type or authentication-key.";
+ }
+ }
+
+ grouping isis-metric-style-config {
+ description
+ "This grouping defines ISIS metric style.";
+
+ leaf metric-style {
+ type oc-isis-types:metric-style;
+ description
+ "ISIS metric style types(narrow, wide).";
+ }
+ }
+
+ grouping authentication-key-config {
+ description
+ "This grouping defines authentication key configuration.";
+
+ leaf auth-password {
+ type oc-types:routing-password;
+ description
+ "Authentication key string.";
+ }
+ }
+
+ grouping keychain-base-group {
+ description
+ "This grouping defines keychain configuration.";
+
+ container keychain {
+ description
+ "This container defines keychain parameters.";
+
+ // TODO(robjs): Import keychain parameters following merge of the auth
+ // models.
+ //uses oc-keychain:keychain-common-base;
+ //uses oc-keychain:tolerance-base;
+ //uses oc-keychain:keychain-key-base;
+ }
+ }
+
+ grouping isis-authentication-config {
+ description
+ "This grouping defines ISIS authentication configuration.";
+
+ // TODO(robjs): Add authentication following merge of auth modules.
+ //leaf auth-type {
+ // type oc-auth-types:auth-type;
+ // description
+ // "ISIS authentication type (key, key-chain).";
+ //}
+
+ leaf csnp-authentication {
+ type boolean;
+ default false;
+ description
+ "Enable or disable for IS-IS CSNPs.";
+ }
+
+ leaf psnp-authentication {
+ type boolean;
+ default false;
+ description
+ "Enable or disable authentication for IS-IS PSNPs.";
+ }
+
+ leaf lsp-authentication {
+ type boolean;
+ default false;
+ description
+ "Enable or disable authentication for IS-IS LSPs.";
+ }
+ }
+
+ grouping isis-authentication-group {
+ description
+ "This grouping defines ISIS authentication.";
+
+ container config {
+ description
+ "This container defines ISIS authentication configuration.";
+
+ uses isis-authentication-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines ISIS authentication state.";
+
+ uses isis-authentication-config;
+ }
+
+ container key {
+ description
+ "This container defines ISIS authentication key";
+ container config {
+ description
+ "This container defines ISIS authentication key configuration.";
+
+ uses authentication-key-group-config {
+ // TODO(aashaikh): Add auth-type conditions after merge of
+ // auth models.
+ // when "../auth-type = 'KEY'";
+ }
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines ISIS authentication key state.";
+
+ uses authentication-key-group-config {
+ // TODO(aashaikh): Add auth-type conditions after merge of
+ // auth models.
+ // when "../auth-type = 'KEY'";
+ }
+ }
+ }
+
+ uses keychain-base-group {
+ // TODO(aashaikh): Add auth-type conditions after merge of
+ // auth models.
+ // when "../auth-type = 'KEY_CHAIN'";
+ }
+ }
+
+ grouping isis-hello-authentication-config {
+ description
+ "Configuration options for IS-IS hello authentication.";
+
+ leaf hello-authentication {
+ type boolean;
+ default false;
+ description
+ "Enabled or disable ISIS Hello authentication.";
+ }
+
+ // TODO(robjs): Add hello-auth-type following merge of auth models.
+ //leaf hello-auth-type {
+ // type oc-auth-types:auth-type;
+ // description
+ // "ISIS authentication type (key, key-chain).";
+ //}
+ }
+
+ grouping isis-hello-authentication-group {
+ description
+ "This grouping defines ISIS hello-authentication.";
+
+ container config {
+ description
+ "This container defines ISIS authentication configuration.";
+
+ uses isis-hello-authentication-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines ISIS authentication state.";
+
+ uses isis-hello-authentication-config;
+ }
+
+ container key {
+ description
+ "This container defines ISIS authentication key";
+
+ container config {
+ description
+ "This container defines ISIS authentication key configuration.";
+
+ uses authentication-key-group-config {
+ // TODO(aashaikh): Add auth-type conditions after merge of
+ // auth models.
+ // when "../auth-type = 'KEY'";
+ }
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines ISIS authentication key state.";
+
+ uses authentication-key-group-config {
+ // TODO(aashaikh): Add auth-type conditions after merge of
+ // auth models.
+ // when "../auth-type = 'KEY'";
+ }
+ }
+ }
+
+ uses keychain-base-group {
+ // TODO(aashaikh): Add auth-type conditions after merge of
+ // auth models.
+ // when "../auth-type = 'KEY_CHAIN'";
+ }
+ }
+
+ grouping isis-ldp-igp-config {
+ description
+ "This grouping defines ISIS/LDP Synchronization configuration.";
+
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "When set to true, rely on IGP/LDP synchronization. IGP cost for
+ link is maintained at max until LDP adjacencies are established ";
+ reference "RFC5443: LDP IGP Synchronization.";
+ }
+
+ leaf post-session-up-delay {
+ type uint16;
+ units seconds;
+ description
+ "Specifies a delay, expressed in units of seconds,
+ between the LDP session to the IGP neighbor being established, and
+ it being considered synchronized by the IGP.";
+ }
+ }
+
+ grouping isis-te-config {
+ description
+ "This grouping defines ISIS Traffic Engineering configuration.";
+
+ leaf ipv4-router-id {
+ type inet:ipv4-address-no-zone;
+ description
+ "IPv4 MPLS Traffic Engineering Router-ID.";
+ }
+
+ leaf ipv6-router-id {
+ type inet:ipv6-address-no-zone;
+ description
+ "IPv6 MPLS Traffic Engineering Router-ID.";
+ }
+ }
+
+ grouping isis-reference-bandwidth-config {
+ description
+ "This grouping defines ISIS Reference Bandwidth Configuration.";
+
+ leaf reference-bandwidth {
+ type uint32;
+ description
+ "ISIS Reference Bandwidth value";
+ }
+ }
+
+ grouping isis-overload-bit-set-config {
+ description
+ "This grouping defines ISIS Overload Bit.";
+
+ leaf set-bit {
+ type boolean;
+ default false;
+ description
+ "When set to true, IS-IS overload bit is set.";
+ }
+
+ leaf set-bit-on-boot {
+ type boolean;
+ default false;
+ description
+ "When set to true, the IS-IS overload bit is set on system boot.";
+ }
+
+ leaf advertise-high-metric {
+ type boolean;
+ default false;
+ description
+ "When set to true, the local IS advertises links with the highest
+ available metric regardless of their configured metric. The metric
+ value is based on the metric style - if wide metrics are utilised
+ the metric is advertised as 16777214, otherwise they are advertised
+ with a value of 63.";
+ }
+ }
+
+ grouping isis-overload-bit-reset-config {
+ description
+ "This grouping defines ISIS Overload Bit Reset Triggers";
+
+ leaf reset-trigger {
+ type identityref {
+ base oc-isis-types:OVERLOAD_RESET_TRIGGER_TYPE;
+ }
+ description
+ "In the case that the system sets the overload bit on start, the
+ system should reset the bit (i.e., clear the overload bit) upon
+ the specified trigger.";
+ }
+
+ leaf delay {
+ type uint16;
+ units seconds;
+ description
+ "If a reset trigger is specified, the system should delay resetting
+ the overload bit for the specified number of seconds after the
+ trigger occurs.";
+ }
+ }
+
+ grouping isis-attached-bit-config {
+ description
+ "This grouping defines ISIS Attached Bit";
+
+ leaf ignore-bit {
+ type boolean;
+ default false;
+ description
+ "When set to true, if the attached bit is set on an incoming Level 1
+ IS-IS, the local system ignores it. In this case the local system
+ does not set a default route to the L1L2 router advertising the PDU
+ with the attached bit set.";
+ }
+
+ leaf suppress-bit {
+ type boolean;
+ default false;
+ description
+ "When set to true, if the local IS acts as a L1L2 router, then the
+ attached bit is not advertised in locally generated PDUs.";
+ }
+ }
+
+ grouping overload-bit-group {
+ description
+ "This grouping defines ISIS Overload Bit.";
+
+ container config {
+ description
+ "This container defines ISIS Overload Bit configuration.";
+
+ uses isis-overload-bit-set-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state for ISIS Overload Bit.";
+
+ uses isis-overload-bit-set-config;
+ }
+
+ container reset-triggers {
+ description
+ "This container defines state for ISIS Overload Bit reset triggers";
+
+ list reset-trigger {
+ key "reset-trigger";
+
+ description
+ "This list describes ISIS Overload reset trigger reasons.";
+
+ leaf reset-trigger {
+ type leafref {
+ path "../config/reset-trigger";
+ }
+ description
+ "Reference to the reset trigger reason";
+ }
+
+ container config {
+ description
+ "This container defines ISIS Overload Bit reset trigger
+ configuration.";
+
+ uses isis-overload-bit-reset-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state for ISIS Overload Bit reset
+ triggers.";
+
+ uses isis-overload-bit-reset-config;
+ }
+ }
+ }
+ }
+
+
+ grouping isis-base-level-config {
+ description
+ "This grouping defines ISIS Level configuration.";
+
+ leaf level-number {
+ type oc-isis-types:level-number;
+ description
+ "ISIS level number (level-1, level-2).";
+ }
+ }
+
+ grouping isis-interface-level-config {
+ description
+ "This grouping defines ISIS Interface Level configuration.";
+
+ leaf level-number {
+ type oc-isis-types:level-number;
+ description
+ "ISIS level number(level-1, level-2).";
+ }
+
+ leaf passive {
+ type boolean;
+ default false;
+ description
+ "ISIS passive interface admin enable/disable function.";
+ }
+
+ leaf priority {
+ type uint8 {
+ range "0 .. 127";
+ }
+ description
+ "ISIS neighbor priority(LAN hello PDU only).";
+ }
+ }
+
+ grouping isis-hello-timers-config {
+ description
+ "This grouping defines ISIS hello timers configuration.";
+
+ leaf hello-interval {
+ type uint32;
+ description
+ "ISIS hello-interval value.";
+ }
+
+ leaf hello-multiplier {
+ type uint8;
+ description
+ "ISIS hello-multiplier value.";
+ }
+ }
+
+ grouping isis-interface-config {
+ description
+ "This grouping defines ISIS interface configuration.";
+
+ leaf interface-id {
+ type oc-if:interface-id;
+ description
+ "Interface for which ISIS configuration is to be applied.";
+ }
+
+ leaf passive {
+ type boolean;
+ default false;
+ description
+ "When set to true, the referenced interface is a passive interface
+ such that it is not eligible to establish adjacencies with other
+ systems, but is advertised into the IS-IS topology.";
+ }
+
+ leaf hello-padding {
+ type oc-isis-types:hello-padding-type;
+ description
+ "This leaf controls padding type for IS-IS Hello PDUs.";
+ }
+
+ leaf circuit-type {
+ type oc-isis-types:circuit-type;
+ description
+ "ISIS circuit type (p2p, broadcast).";
+ }
+ }
+
+ grouping isis-adaptive-timers-state {
+ description
+ "This grouping defines ISIS adaptive timers state";
+
+ leaf adaptive-timer {
+ type oc-isis-types:adaptive-timer-type;
+ description
+ "ISIS adaptive timer types (linear, exponential).";
+ }
+ }
+
+ grouping isis-lsp-generation-timers-config {
+ description
+ "This grouping defines ISIS LSP Generation timers configuration";
+
+ leaf lsp-max-wait-interval {
+ type uint64;
+ units milliseconds;
+ description
+ "Time interval in milliseconds that specifies max interval between
+ two consecutive occurrences of an LSP being generated.";
+ }
+
+ leaf lsp-first-wait-interval {
+ type uint64;
+ units milliseconds;
+ description
+ "Time interval in milliseconds that specifies the first LSP generation
+ delay.";
+ }
+
+ leaf lsp-second-wait-interval {
+ type uint64;
+ units milliseconds;
+ description
+ "Time interval in milliseconds that specifies the millisecond LSP
+ generation delay.";
+ }
+ }
+
+ grouping isis-lsp-timers-config {
+ description
+ "This grouping defines ISIS LSP timers configuration";
+
+ leaf lsp-lifetime-interval {
+ type uint16;
+ units seconds;
+ default 1200;
+ description
+ "Time interval in seconds that specifies how long an LSP remains in
+ LSDB without being refreshed.";
+ }
+
+ leaf lsp-refresh-interval {
+ type uint16;
+ units seconds;
+ description
+ "Time interval in seconds that specifies how often route topology
+ that a device originates is transmitted in LSPs.";
+ }
+ }
+
+ grouping isis-spf-timers-config {
+ description
+ "This grouping defines ISIS SPF timers configuration.";
+
+ leaf spf-hold-interval {
+ type uint64;
+ units milliseconds;
+ default 5000;
+ description
+ "SPF Hold Down time interval in milliseconds.";
+ }
+
+ leaf spf-first-interval {
+ type uint64;
+ units milliseconds;
+ description
+ "Time interval in milliseconds between the
+ detection of topology change and when the SPF algorithm runs.";
+ }
+ leaf spf-second-interval {
+ type uint64;
+ units milliseconds;
+ description
+ "Time interval in milliseconds between the first and second
+ SPF calculation.";
+ }
+ }
+
+ grouping isis-interface-timers-config {
+ description
+ "This grouping defines ISIS interface timers configuration.";
+
+ leaf csnp-interval {
+ type uint16;
+ units seconds;
+ description
+ "The interval, specified in seconds, at which periodic CSNP packets
+ should be transmitted by the local IS.";
+ }
+
+ leaf lsp-pacing-interval {
+ type uint64;
+ units milliseconds;
+ description
+ "The interval interval in milliseconds between the
+ detection of topology change and when the SPF algorithm runs.";
+ }
+ }
+
+ grouping isis-transport-config {
+ description
+ "This grouping defines configuration parameters relating to the
+ transport protocol used by the ISIS.";
+
+ leaf lsp-mtu-size {
+ type uint16;
+ description
+ "The maximum size in bytes of an IS-IS Link state PDU.";
+ }
+ }
+
+ grouping isis-graceful-restart-config {
+ description
+ "This grouping defines ISIS graceful restart configuration.";
+
+ leaf helper-only {
+ type boolean;
+ description
+ "Enable or disable the IS-IS graceful restart helper function. When
+ this leaf is set, the local system does not utilise the IS-IS
+ graceful restart procedures during its own restart, but supports
+ retaining forwarding information during a remote speaker's restart.";
+ }
+ reference "RFC 5306: Restart Signaling for IS-IS.";
+ }
+
+ // configuration context containers
+ grouping inter-level-propagation-policies-structural {
+ description
+ "Propagate prefixes between IS-IS levels.";
+
+ container inter-level-propagation-policies {
+ description
+ "Policies to propagate prefixes between IS-IS levels.";
+
+ container level1-to-level2 {
+ description
+ "Policies relating to prefixes to be propagated from
+ Level 1 to Level 2.";
+
+ container config {
+ description
+ "Configuration parameters relating to the propagation
+ of prefixes from IS-IS Level 1 to Level 2.";
+
+ uses inter-level-propagation-policy-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the
+ propagation of prefixes from IS-IS Level 1 to Level 2.";
+
+ uses inter-level-propagation-policy-config;
+ }
+
+ }
+
+ container level2-to-level1 {
+ description
+ "Policies relating to prefixes to be propagated from
+ Level2 to Level 1.";
+
+ container config {
+ description
+ "Configuration parameters relating to the propagation
+ of prefixes from IS-IS Level 2 to Level 1.";
+
+ uses inter-level-propagation-policy-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the propagation
+ of prefixes from IS-IS Level 2 to Level 1.";
+
+ uses inter-level-propagation-policy-config;
+ }
+ }
+ }
+ }
+
+ grouping inter-level-propagation-policy-config {
+ description
+ "Policy governing the propagation of prefixes between levels.";
+
+ uses oc-rpol:apply-policy-import-config;
+ }
+
+ grouping authentication-key-group-config {
+ description
+ "This grouping defines ISIS authentication key configuration.";
+
+ uses authentication-key-config;
+
+ // TODO(robjs): Add crypto-algorithm after merge of authentication modules.
+ //leaf crypto-algorithm {
+ // type identityref {
+ // base oc-auth-types:CRYPTO_TYPE;
+ // }
+ // description
+ // "Authentication key cryptographic algorithm to be used for key encryption.";
+ //}
+ }
+
+ grouping isis-global-base {
+ description
+ "This grouping describes ISIS Global router.";
+
+ container config {
+ description
+ "This container defines ISIS global configuration router.";
+
+ uses isis-authentication-check-config;
+ uses isis-global-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state for ISIS global router.";
+
+ uses isis-authentication-check-config;
+ uses isis-global-config;
+ }
+
+ container lsp-bit {
+ description
+ "This container defines ISIS LSP Operational Bits.";
+
+ container overload-bit {
+ description
+ "This container defines Overload Bit configuration.";
+ uses overload-bit-group;
+ }
+
+ container attached-bit {
+ description
+ "This container defines Attached Bit.";
+
+ container config {
+ description
+ "This container defines Attached Bit configuration.";
+
+ uses isis-attached-bit-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state for Link State PDU Bit.";
+
+ uses isis-attached-bit-config;
+ }
+ }
+ }
+
+ container reference-bandwidth {
+ description
+ "This container defines ISIS Reference Bandwidth.";
+
+ container config {
+ description
+ "This container defines Reference Bandwidth configuration";
+ uses isis-reference-bandwidth-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state for Reference Bandwidth.";
+
+ uses isis-reference-bandwidth-config;
+ }
+ }
+
+ container nsr {
+ description
+ "This container defines ISIS Non-Stop Routing.";
+
+ container config {
+ description
+ "This container defines Non-Stop-Routing configuration.";
+
+ uses admin-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state for Non-Stop-Routing";
+
+ uses admin-config;
+ }
+ }
+
+ container graceful-restart {
+ description
+ "This container defines ISIS Graceful Restart.";
+
+ container config {
+ description
+ "This container defines ISIS graceful-restart configuration.";
+
+ uses admin-config;
+ uses isis-graceful-restart-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state information for ISIS graceful-restart.";
+
+ uses admin-config;
+ uses isis-graceful-restart-config;
+ }
+ }
+
+ container timers {
+ description
+ "This container defines ISIS timers.";
+
+ container config {
+ description
+ "This container defines ISIS global timers configuration.";
+
+ uses isis-lsp-timers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state information for ISIS global timers.";
+
+ uses isis-lsp-timers-config;
+ }
+
+ container spf {
+ description
+ "This container defines ISIS SPF timer settings.";
+
+ container config {
+ description
+ "This container defines ISIS SPF timers configuration.";
+
+ uses isis-spf-timers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state information for ISIS SPF timers.";
+
+ uses isis-spf-timers-config;
+ uses isis-adaptive-timers-state;
+ }
+ }
+
+ container lsp-generation {
+ description
+ "This container defines ISIS LSP Generation.";
+
+ container config {
+ description
+ "This container defines ISIS LSP Generation timers
+ configuration.";
+
+ uses isis-lsp-generation-timers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state information for ISIS LSP Generation
+ timers.";
+
+ uses isis-lsp-generation-timers-config;
+ uses isis-adaptive-timers-state;
+ }
+ }
+ }
+
+ container transport {
+ description
+ "This container defines ISIS transport.";
+
+ container config {
+ description
+ "This container defines ISIS transport related configuration.";
+
+ uses isis-transport-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state information for ISIS transport
+ parameters.";
+
+ uses isis-transport-config;
+ }
+ }
+
+ container mpls {
+ description
+ "Configuration and operational state relating to MPLS-related
+ features in IS-IS";
+
+ container igp-ldp-sync {
+ description
+ "Configuration and operational state relating to synchronisation
+ between the LDP and IS-IS";
+
+ container config {
+ description
+ "This container defines ISIS/IGP configuration.";
+
+ uses isis-ldp-igp-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state information for ISIS/LDP Sync.";
+
+ uses isis-ldp-igp-config;
+ }
+ }
+ }
+
+ container igp-shortcuts {
+ description
+ "This container defines IGP shortcuts configuration and state
+ information.";
+
+ uses isis-shortcuts-afi-list;
+ }
+
+ container afi-safi {
+ description
+ "This container defines address-family specific configuration
+ and state information.";
+
+ uses isis-afi-safi-list;
+ }
+
+ uses oc-sr:sr-igp-top;
+ }
+
+ grouping isis-route-preference-config {
+ description
+ "This grouping defines ISIS route preference configuration";
+
+ leaf external-route-preference {
+ type uint8 {
+ range "1..max";
+ }
+ description
+ "Administrative Distance(preference) for external ISIS routes.";
+ }
+
+ leaf internal-route-preference {
+ type uint8 {
+ range "1..max";
+ }
+ description
+ "Administrative Distance(preference) for internal ISIS routes.";
+ }
+ }
+
+ grouping isis-interfaces {
+ description
+ "This grouping defines ISIS interfaces configured on local system.";
+
+ list interface {
+ key "interface-id";
+
+ description
+ "This list contains ISIS interfaces.";
+
+ leaf interface-id {
+ type leafref {
+ path "../config/interface-id";
+ }
+ description
+ "Reference to interface-id";
+ }
+
+ uses isis-interface-group;
+ uses oc-if:interface-ref;
+ }
+ }
+
+ grouping isis-interface-group {
+ description
+ "This grouping defines ISIS interfaces configured on local system.";
+
+ container config {
+ description
+ "This container defines ISIS interface configuration.";
+
+ uses admin-config;
+ uses isis-interface-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state information for ISIS interfaces.";
+
+ uses admin-config;
+ uses isis-interface-config;
+ }
+
+ container circuit-counters {
+ description
+ "This container defines state information for ISIS circuit counters.";
+
+ uses circuit-counters-structural;
+ }
+
+ container authentication {
+ description
+ "This container defines ISIS authentication.";
+
+ uses isis-hello-authentication-group;
+ }
+
+ container afi-safi {
+ description
+ "This container defines address-family specific configuration
+ and state information.";
+
+ uses isis-if-global-afi-safi-list;
+ }
+
+ container levels {
+ description
+ "This container defines ISIS level specific configuration and
+ state information.";
+
+ uses isis-interface-levels;
+ }
+
+ container timers {
+ description
+ "This container describes ISIS interface timers configuration";
+
+ container config {
+ description
+ "Configuration parameters relating to interface
+ timers for IS-IS";
+
+ uses isis-interface-timers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines state information for ISIS interface timers.";
+
+ uses isis-interface-timers-config;
+ }
+ }
+
+ container bfd {
+ //TODO(bogdanov): Integrate BFD model/module
+ description
+ "This container defines BFD.";
+
+ container config {
+ description
+ "This container defines BFD configuration parameters.";
+
+ uses isis-bfd-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines BFD state information.";
+
+ uses isis-bfd-config;
+ }
+ }
+ }
+
+ grouping isis-levels {
+ description
+ "This grouping defines global ISIS Levels.";
+
+ list level {
+ key "level-number";
+
+ description
+ "Configuration and operational state parameters related to a
+ particular level within the IS-IS protocol instance";
+
+ leaf level-number {
+ type leafref {
+ path "../config/level-number";
+ }
+ description
+ "Reference to ISIS level-number.";
+ }
+
+ uses isis-level-group;
+ }
+ }
+
+ grouping isis-interface-levels {
+ description
+ "This grouping defines ISIS interface Levels.";
+
+ list level {
+ key "level-number";
+ description
+ "Configuration and operational state parameters related to a
+ particular level on an IS-IS enabled interface.";
+
+ leaf level-number {
+ type leafref {
+ path "../config/level-number";
+ }
+ description
+ "Reference to ISIS level-number.";
+ }
+
+ uses isis-interface-level-group;
+ }
+ }
+
+ grouping isis-level-group {
+ description
+ "This grouping defines ISIS level configuration and state
+ information.";
+
+ container config {
+ description
+ "This container defines ISIS level based configuration.";
+
+ uses admin-config;
+ uses isis-base-level-config;
+ uses isis-metric-style-config;
+ uses isis-authentication-check-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines ISIS level state information.";
+
+ uses admin-config;
+ uses isis-base-level-config;
+ uses isis-metric-style-config;
+ uses isis-authentication-check-config;
+ }
+
+ container system-level-counters {
+ description
+ "This container defines ISIS system level counters.";
+
+ uses system-level-counters-structural;
+ }
+
+ container link-state-database {
+ config false;
+ description
+ "This container defines ISIS LSDB.";
+
+ list lsp {
+ key "lsp-id";
+ description
+ "This list describes LSPs in the LSDB.";
+ uses lsp-state;
+ }
+ }
+
+ container traffic-engineering {
+ description
+ "This container defines ISIS TE.";
+
+ container config {
+ description
+ "This container defines ISIS TE configuration.";
+
+ uses admin-config;
+ uses isis-te-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines ISIS TE state information.";
+
+ uses admin-config;
+ uses isis-te-config;
+ }
+ }
+
+ container route-preference {
+ description
+ "This container defines Administrative Distance (or preference)
+ assigned to ISIS routes (level1 internal, level2 internal, level1
+ external, level2 external).";
+
+ container config {
+ description
+ "This container defines route preference configuration.";
+ uses isis-route-preference-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines ISIS route preference state information.";
+ uses isis-route-preference-config;
+ }
+ }
+
+ container authentication {
+ description
+ "This container defines ISIS authentication.";
+ uses isis-authentication-group;
+ }
+
+ }
+
+ grouping isis-interface-level-group {
+ description
+ "This grouping defines ISIS interface level.";
+
+ container config {
+ description
+ "This container defines interface ISIS level configuration.";
+
+ uses isis-interface-level-config;
+ uses admin-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines interface ISIS level state information.";
+
+ uses isis-interface-level-config;
+ uses admin-config;
+ }
+
+ container packet-counters {
+ description
+ "This container defines ISIS interface packet counters.";
+
+ uses packet-counters-structural;
+ }
+
+ container adjacencies {
+ config false;
+ description
+ "This container defines ISIS adjacencies.";
+
+ list adjacency {
+ key "system-id";
+
+ description
+ "List of the local system's IS-IS adjacencies.";
+
+ leaf system-id {
+ type leafref {
+ path "../state/system-id";
+ }
+ description
+ "Reference to the IS neighbor.";
+ }
+
+ container state {
+ description
+ "Operational state relating to the IS-IS adjacency with the
+ remote system";
+
+ uses adjacency-state;
+ }
+ }
+ }
+
+ container timers {
+ description
+ "This container defines ISIS timers.";
+
+ container config {
+ description
+ "This container defines ISIS interface hello-timers configuration.";
+
+ uses isis-hello-timers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "This container defines ISIS interface hello-timers state.";
+
+ uses isis-hello-timers-config;
+ }
+ }
+
+ container afi-safi {
+ description
+ "This container defines address-family specific configuration
+ and state information.";
+
+ uses isis-if-afi-safi-list;
+ }
+
+ container hello-authentication {
+ description
+ "This container defines ISIS authentication.";
+
+ uses isis-hello-authentication-group;
+ }
+ }
+
+
+ grouping isis-top {
+ description
+ "This grouping define top-level ISIS model data.";
+
+ container isis {
+ description
+ "This container defines top-level ISIS configuration and state
+ information.";
+
+ container global {
+ description
+ "This container defines global ISIS configuration and state
+ information.";
+
+ uses isis-global-base;
+ uses inter-level-propagation-policies-structural;
+ }
+
+ container levels {
+ description
+ "This container defines ISIS level configuration and state
+ information.";
+ uses isis-levels;
+ }
+
+ container interfaces {
+ description
+ "This container defines global ISIS interface configuration and
+ state information.";
+ uses isis-interfaces;
+ }
+ }
+ }
+
+ grouping adjacency-state {
+ description
+ "This grouping defines ISIS adjacency.";
+
+ leaf system-id {
+ type oc-isis-types:system-id;
+ description
+ "ISIS neighbor system-id.";
+ }
+
+ leaf neighbor-ipv4-address {
+ type inet:ipv4-address-no-zone;
+ description
+ "ISIS Neighbor IPv4 address.";
+ }
+
+ leaf neighbor-ipv6-address {
+ type inet:ipv6-address-no-zone;
+ description
+ "ISIS Neighbor IPv6 address.";
+ }
+
+ leaf neighbor-snpa {
+ type oc-isis-types:snpa;
+ description
+ "ISIS neighbor SNPA.";
+ }
+
+ leaf local-extended-circuit-id {
+ type oc-isis-types:extended-circuit-id;
+ description
+ "Local extended circuit ID.";
+ }
+ leaf neighbor-extended-circuit-id {
+ type oc-isis-types:extended-circuit-id;
+ description
+ "ISIS neighbor extended circuit ID.";
+ }
+
+ leaf priority {
+ type uint8 {
+ range "0..127";
+ }
+ description
+ "Priority of the neighboring IS(LAN Hello only).";
+ }
+
+ leaf dis-system-id {
+ type oc-isis-types:system-id;
+ description
+ "DIS System ID(LAN hello only).";
+ }
+
+ leaf neighbor-circuit-type {
+ type oc-isis-types:level-type;
+ description
+ "Received ISIS circuit type (level-1, level-2, level-1-2).";
+ }
+
+ leaf adjacency-type {
+ type oc-isis-types:level-type;
+ description
+ "Formed ISIS adjacency type(level-1, level-2, level-1-2).";
+ }
+
+ leaf adjacency-state {
+ type oc-isis-types:isis-interface-adj-state;
+ description
+ "P2P 3-way ISIS adjacency state(up, down, init, failed).";
+ reference "RFC4303. TLV 240.";
+ }
+
+ leaf remaining-hold-time {
+ type uint16;
+ units seconds;
+ description
+ "Holding time in seconds for adjacency. This value is based on received
+ hello PDUs and the elapsed time since receipt.";
+ }
+
+ leaf up-time {
+ type yang:timestamp;
+ description
+ "Adjacency up time.";
+ }
+
+ leaf multi-topology {
+ type boolean;
+ description
+ "When set to true, ISIS multi-topology is supported.";
+ reference "RFC5129. TLV 229.";
+ }
+
+ leaf-list topology {
+ type identityref {
+ base oc-isis-types:AFI_SAFI_TYPE;
+ }
+ description
+ "ISIS topology type support(ipv4-unicast, ipv6-unicast,
+ ipv4-multicast, ipv6-multicast).";
+ }
+
+ leaf restart-support {
+ type boolean;
+ description
+ "When set to true, Graceful-restart signaling is supported.";
+ }
+
+ leaf restart-suppress {
+ type boolean;
+ description
+ "When set to true, adjacency is not advertised. The SA bit is used by a
+ starting router to request that its neighbor suppress advertisement of
+ the adjacency to the starting router in the neighbor's LSPs.";
+ }
+
+ leaf restart-status {
+ type boolean;
+ description
+ "When set to true, neighbor is being helped. The RR bit is used by a
+ (re)starting router to signal to its neighbors that a (re)start is in
+ progress.";
+ }
+
+ leaf-list area-address {
+ type oc-isis-types:area-address;
+ description
+ "List of ISIS area-address(es).";
+ }
+
+ leaf-list nlpid {
+ type enumeration {
+ enum IPV4 {
+ description
+ "IPv4 Address family.";
+ }
+ enum IPV6 {
+ description
+ "IPv6 Address family.";
+ }
+ }
+ description
+ "Supported Protocol. IPv4 is defined as (0xcc)
+ and IPv6 - (0x8e). ISIS reference is TLV 129.";
+ }
+
+ // TODO(bogdanov): update when BFD model is integrated.
+ //leaf ipv4-bfd-status {
+ //type oc-isis-types:bfd-state;
+ //description
+ // "IPv4 BFD session status.";
+ //}
+ //leaf ipv6-bfd-status {
+ //type oc-isis-types:bfd-state;
+ //description
+ // "IPv4 BFD session status. ";
+ //}
+
+ }
+
+ grouping packet-counters-generic-state {
+ description
+ "Operational state parameters relating to LSP packet counters.";
+
+ leaf received {
+ type yang:counter32;
+ description
+ "The number of the specified type of PDU received on the interface.";
+ }
+ leaf processed {
+ type yang:counter32;
+ description
+ "The number of the specified type of PDU received on the interface
+ that have been processed by the local system.";
+ }
+ leaf dropped {
+ type yang:counter32;
+ description
+ "The number of the specified type of PDU received on the interface
+ that have been dropped.";
+ }
+
+ leaf sent {
+ type yang:counter32;
+ description
+ "The number of the specified type of PDU that have been sent by the
+ local system on the interface.";
+ }
+
+ leaf retransmit {
+ type yang:counter32;
+ description
+ "The number of the specified type of PDU that that have been
+ retransmitted by the local system on the interface.";
+ }
+ }
+
+ grouping packet-counters-structural {
+ description
+ "This grouping defines ISIS packet counter state.";
+
+ container lsp {
+ description
+ "This container defines LSP packet counters.";
+
+ container state {
+ config false;
+ description
+ "This container defines LSP PDU counters.";
+
+ uses packet-counters-generic-state;
+ }
+ }
+
+ container iih {
+ description
+ "This container defines IIH packet counters.";
+
+ container state {
+ config false;
+ description
+ "Operational counters relating to IIH PDUs";
+
+ uses packet-counters-generic-state;
+ }
+ }
+
+ container ish {
+ description
+ "This container defines ISH packet counters.";
+
+ container state {
+ config false;
+ description
+ "Operational state relating to ISH PDUs.";
+
+ uses packet-counters-generic-state;
+ }
+ }
+
+ container esh {
+ description
+ "This container defines ESH packet counters.";
+ container state {
+ config false;
+ description
+ "Operational state relating to ESH PDUs";
+
+ uses packet-counters-generic-state;
+ }
+ }
+
+ container psnp {
+ description
+ "This container defines PSNP packet counters.";
+
+ container state {
+ config false;
+ description
+ "Packet counters relating to PSNPs.";
+
+ uses packet-counters-generic-state;
+ }
+ }
+
+ container csnp {
+ description
+ "Operational state parameters relating to CSNPs.";
+
+ container state {
+ config false;
+ description
+ "Packet counters relating to CSNPs.";
+
+ uses packet-counters-generic-state;
+ }
+ }
+
+ container unknown {
+ description
+ "Operational state parameters relating to IS-IS PDUs that are not
+ otherwise classified - referred to as Unknown PDUs.";
+
+ container state {
+ config false;
+ description
+ "Packet counters relating to unknown PDUs.";
+
+ uses packet-counters-generic-state;
+ }
+ }
+ }
+
+ grouping system-level-counters-state {
+ description
+ "IS-IS counters that are relevant to the system IS-IS context.";
+
+ leaf corrupted-lsps {
+ type yang:counter32;
+ description
+ "Number of corrupted in-memory LSPs detected. LSPs received from the
+ wire with a bad checksum are silently dropped and not counted. LSPs
+ received from the wire with parse errors are counted by lsp-errors. MIB
+ Entry: SysCorrLSPs.";
+ }
+
+ leaf database-overloads {
+ type yang:counter32;
+ description
+ "Number of times the database has become
+ overloaded.
+ MIB entry: SysLSPL(Level)DbaseOloads.";
+ }
+
+ leaf manual-address-drop-from-areas {
+ type yang:counter32;
+ description
+ "Number of times a manual address has been dropped from area.
+ MIB Entry: SysManAddrDropFromAreas.";
+ }
+
+ leaf exceed-max-seq-nums {
+ type yang:counter32;
+ description
+ "The number of times the system has attempted to exceed the maximum
+ sequence number. MIB Entry: SysAttmptToExMaxSeqNums.";
+ }
+ leaf seq-num-skips {
+ type yang:counter32;
+ description
+ "Number of times a sequence number skip has occurred. MIB Entry:
+ SysSeqNumSkips.";
+ }
+
+ leaf own-lsp-purges {
+ type yang:counter32;
+ description
+ "Number of times a zero-aged copy of the system's
+ own LSP is received from some other node.
+ MIB Entry: isisSysOwnLSPPurges.";
+ }
+
+ leaf id-len-mismatch {
+ type yang:counter32;
+ description
+ "Number of times a PDU is received with a different value for ID field
+ length from that of the receiving system. MIB Entry:
+ isisSysIDFieldLenMismatches.";
+ }
+
+ leaf part-changes {
+ type yang:counter32;
+ description
+ "The number of partition changes detected. MIB Entry: SysPartChanges.";
+ }
+
+ leaf max-area-address-mismatches {
+ type yang:counter32;
+ description
+ "Number of times a PDU is received with a different value for
+ MaximumAreaAddresses from that of the receiving system. MIB Entry:
+ SysMaxAreaAddrMismatches.";
+ }
+
+ leaf auth-fails {
+ type yang:counter32;
+ description
+ "The number of authentication key failures.
+ MIB Entry: SysAuthFails.";
+ }
+
+ leaf spf-runs {
+ type yang:counter32;
+ description
+ "The number of times SPF was ran at this level.";
+ }
+
+ leaf auth-type-fails {
+ type yang:counter32;
+ description
+ "The number of authentication type mismatches.";
+ }
+
+ leaf lsp-errors {
+ type yang:counter32;
+ description
+ "The number of received LSPs with errors.";
+ }
+ }
+
+ grouping system-level-counters-structural {
+ description
+ "This grouping defines system level counters.";
+
+ container state {
+ config false;
+ description
+ "The container defines a list of system counters for the IS.";
+
+ uses system-level-counters-state;
+ }
+ }
+
+ grouping circuit-counters-state {
+ description
+ "Operational state parameters relating to counters specific to one
+ interface or circuit.";
+
+ leaf adj-changes {
+ type yang:counter32;
+ description
+ "Number of times an adjacency state change has occurred on this circuit.
+ MIB Entry: CircAdjChanges.";
+ }
+
+ leaf init-fails {
+ type yang:counter32;
+ description
+ "Number of times initialization of this circuit has failed. This counts
+ events such as PPP NCP failures. MIB Entry: CircInitFails.";
+ }
+
+ leaf rejected-adj {
+ type yang:counter32;
+ description
+ "Number of times an adjacency has been rejected on this circuit. MIB
+ Entry: CircRejAdjs.";
+ }
+
+ leaf id-field-len-mismatches {
+ type yang:counter32;
+ description
+ "Number of times an IS-IS control PDU with an ID field length different
+ from that for this system has been received.
+ MIB Entry: CircIDFieldLenMismatches.";
+ }
+
+ leaf max-area-address-mismatches {
+ type yang:counter32;
+ description
+ "Number of times an IS-IS control PDU with a max area address field
+ different from that for this system has been received. MIB Entry:
+ CircMaxAreaAddrMismatches.";
+ }
+
+ leaf auth-type-fails {
+ type yang:counter32;
+ description
+ "Number of times an IS-IS control PDU with an auth type field different
+ from that for this system has been received. MIB Entry:
+ CircAuthTypeFails.";
+ }
+
+ leaf auth-fails {
+ type yang:counter32;
+ description
+ "Number of times an IS-IS control PDU with the correct auth type has
+ failed to pass authentication validation. MIB Entry: CircAuthFails.";
+ }
+
+ leaf lan-dis-changes {
+ type yang:counter32;
+ description
+ "Number of times the Designated IS has changed on this circuit at this
+ level. If the circuit is point to point, this count is zero. MIB Entry:
+ CircLANDesISChanges.";
+ }
+
+ leaf adj-number {
+ type uint32;
+ description
+ "Number of adjacencies on this circuit.
+ MIB Entry: CircNumAdj.";
+ }
+ }
+
+ grouping circuit-counters-structural {
+ description
+ "This grouping defines circuit counters.";
+
+ container state {
+ config false;
+ description
+ "The container defines a list of counters for IS circuit.";
+
+ uses circuit-counters-state;
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-lacp.yang b/src/plugins/yang/openconfig/openconfig-lacp.yang
new file mode 100644
index 0000000..e49dcb6
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-lacp.yang
@@ -0,0 +1,461 @@
+module openconfig-lacp {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/lacp";
+
+ prefix "oc-lacp";
+
+ // import some basic types
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-yang-types { prefix oc-yang; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module describes configuration and operational state
+ data for Link Aggregation Control Protocol (LACP) for
+ managing aggregate interfaces. It works in conjunction with
+ the OpenConfig interfaces and aggregate interfaces models.";
+
+ oc-ext:openconfig-version "1.1.0";
+
+ revision "2017-05-05" {
+ description
+ "Add member local and remote port num";
+ reference "1.1.0";
+ }
+
+ revision "2016-05-26" {
+ description
+ "OpenConfig public release";
+ reference "1.0.2";
+ }
+
+
+ // typedef statements
+
+ typedef lacp-activity-type {
+ type enumeration {
+ enum ACTIVE {
+ description
+ "Interface is an active member, i.e., will detect and
+ maintain aggregates";
+ }
+ enum PASSIVE {
+ description
+ "Interface is a passive member, i.e., it participates
+ with an active partner";
+ }
+ }
+ description
+ "Describes the LACP membership type, active or passive, of the
+ interface in the aggregate";
+ reference "IEEE 802.1AX-2008";
+ }
+
+ typedef lacp-timeout-type {
+ type enumeration {
+ enum LONG {
+ description
+ "Participant wishes to use long timeouts to detect
+ status of the aggregate, i.e., will expect less frequent
+ transmissions. Long timeout is 90 seconds.";
+ }
+ enum SHORT {
+ description
+ "Participant wishes to use short timeouts, i.e., expects
+ frequent transmissions to aggressively detect status
+ changes. Short timeout is 3 seconds.";
+ }
+ }
+ description
+ "Type of timeout used, short or long, by LACP participants";
+ reference "IEEE 802.1AX-2008";
+ }
+
+ typedef lacp-synchronization-type {
+ type enumeration {
+ enum IN_SYNC {
+ description
+ "Participant is in sync with the system id and key
+ transmitted";
+ }
+ enum OUT_SYNC {
+ description
+ "Participant is not in sync with the system id and key
+ transmitted";
+ }
+ }
+ description
+ "Indicates LACP synchronization state of participant";
+ reference "IEEE 802.1AX-2008";
+ }
+
+ typedef lacp-period-type {
+ type enumeration {
+ enum FAST {
+ description "Send LACP packets every second";
+ }
+ enum SLOW {
+ description "Send LACP packets every 30 seconds";
+ }
+ }
+ description
+ "Defines the period options for the time between sending
+ LACP messages";
+ reference "IEEE 802.3ad";
+ }
+
+ // grouping statements
+
+
+ grouping aggregation-lacp-members-config {
+ description
+ "Configuration data for lacp member interfaces";
+
+ //currently a placeholder -- the list of member interfaces
+ //and their status is considered opstate only
+ }
+
+ grouping aggregation-lacp-members-state {
+ description
+ "Operational status data for the member interfaces";
+
+ leaf interface {
+ type oc-if:base-interface-ref;
+ description
+ "Reference to interface member of the LACP aggregate";
+ }
+
+ leaf activity {
+ type lacp-activity-type;
+ description "Indicates participant is active or passive";
+ }
+
+ leaf timeout {
+ type lacp-timeout-type;
+ description
+ "The timeout type (short or long) used by the
+ participant";
+ }
+
+ leaf synchronization {
+ type lacp-synchronization-type;
+ description
+ "Indicates whether the participant is in-sync or
+ out-of-sync";
+ }
+
+ leaf aggregatable {
+ type boolean;
+ description
+ "A true value indicates that the participant will allow
+ the link to be used as part of the aggregate. A false
+ value indicates the link should be used as an individual
+ link";
+ }
+
+ leaf collecting {
+ type boolean;
+ description
+ "If true, the participant is collecting incoming frames
+ on the link, otherwise false";
+ }
+
+ leaf distributing {
+ type boolean;
+ description
+ "When true, the participant is distributing outgoing
+ frames; when false, distribution is disabled";
+ }
+
+ leaf system-id {
+ type oc-yang:mac-address;
+ description
+ "MAC address that defines the local system ID for the
+ aggregate interface";
+ }
+
+ leaf oper-key {
+ type uint16;
+ description
+ "Current operational value of the key for the aggregate
+ interface";
+ }
+
+ leaf partner-id {
+ type oc-yang:mac-address;
+ description
+ "MAC address representing the protocol partner's interface
+ system ID";
+ }
+
+ leaf partner-key {
+ type uint16;
+ description
+ "Operational value of the protocol partner's key";
+ }
+
+ leaf port-num {
+ type uint16;
+ description
+ "Port number of the local (actor) aggregation member";
+ }
+
+ leaf partner-port-num {
+ type uint16;
+ description
+ "Port number of the partner (remote) port for this member
+ port";
+ }
+ }
+
+grouping aggregation-lacp-members-statistics {
+ description
+ "LACP packet statistics for the member interfaces";
+
+ container counters {
+ description
+ "LACP protocol counters";
+
+ leaf lacp-in-pkts {
+ type oc-yang:counter64;
+ description
+ "Number of LACPDUs received";
+ }
+
+ leaf lacp-out-pkts {
+ type oc-yang:counter64;
+ description
+ "Number of LACPDUs transmitted";
+ }
+
+ leaf lacp-rx-errors {
+ type oc-yang:counter64;
+ description
+ "Number of LACPDU receive packet errors";
+ }
+
+ leaf lacp-tx-errors {
+ type oc-yang:counter64;
+ description
+ "Number of LACPDU transmit packet errors";
+ }
+
+ leaf lacp-unknown-errors {
+ type oc-yang:counter64;
+ description
+ "Number of LACPDU unknown packet errors";
+ }
+
+ leaf lacp-errors {
+ type oc-yang:counter64;
+ description
+ "Number of LACPDU illegal packet errors";
+ }
+ }
+ }
+
+ grouping aggregation-lacp-members-top {
+ description
+ "Top-level grouping for aggregate members list";
+
+ container members {
+ config false;
+ description
+ "Enclosing container for the list of members interfaces of
+ the aggregate. This list is considered operational state
+ only so is labeled config false and has no config container";
+
+ list member {
+ key "interface";
+ description
+ "List of member interfaces and their associated status for
+ a LACP-controlled aggregate interface. Member list is not
+ configurable here -- each interface indicates items
+ its participation in the LAG.";
+
+ leaf interface {
+ type leafref {
+ path "../state/interface";
+ }
+ description
+ "Reference to aggregate member interface";
+ }
+
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for aggregate members";
+
+ uses aggregation-lacp-members-state;
+ uses aggregation-lacp-members-statistics;
+ }
+ }
+ }
+ }
+
+ grouping lacp-interfaces-config {
+ description
+ "Configuration data for each LACP-enabled interface";
+
+ leaf name {
+ type oc-if:base-interface-ref;
+ description
+ "Reference to the interface on which LACP should be
+ configured. The type of the target interface must be
+ ieee8023adLag";
+ }
+
+ leaf interval {
+ type lacp-period-type;
+ default SLOW;
+ description
+ "Set the period between LACP messages -- uses
+ the lacp-period-type enumeration.";
+ }
+
+ leaf lacp-mode {
+ type lacp-activity-type;
+ default ACTIVE;
+ description
+ "ACTIVE is to initiate the transmission of LACP packets.
+ PASSIVE is to wait for peer to initiate the transmission of
+ LACP packets.";
+ //TODO:some implementations configure the LACP mode on each
+ //member interface rather than on the LAG interface. There
+ //may be use cases for this identified at a later time.
+ }
+
+ leaf system-id-mac {
+ type oc-yang:mac-address;
+ description
+ "The MAC address portion of the node's System ID. This is
+ combined with the system priority to construct the 8-octet
+ system-id";
+ }
+
+ uses aggregation-lacp-global-config;
+ }
+
+ grouping lacp-interfaces-state {
+ description
+ "Operational state data for each LACP-enabled interface";
+ }
+
+ grouping lacp-interfaces-top {
+ description
+ "Top-level grouping for LACP-enabled interfaces";
+
+ container interfaces {
+ description
+ "Enclosing container for the list of LACP-enabled
+ interfaces";
+
+ list interface {
+ key "name";
+ description
+ "List of aggregate interfaces managed by LACP";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container config {
+ description
+ "Configuration data for each LACP aggregate interface";
+
+ uses lacp-interfaces-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for each LACP aggregate
+ interface";
+
+ uses lacp-interfaces-config;
+ uses lacp-interfaces-state;
+ }
+
+ uses aggregation-lacp-members-top;
+ }
+ }
+ }
+
+ grouping aggregation-lacp-global-config {
+ description
+ "Configuration data for LACP aggregate interfaces";
+
+
+ leaf system-priority {
+ type uint16;
+ description
+ "Sytem priority used by the node on this LAG interface.
+ Lower value is higher priority for determining which node
+ is the controlling system.";
+ }
+ }
+
+ grouping aggregation-lacp-global-state {
+ description
+ "Operational data for LACP aggregate interfaces";
+
+ }
+
+ grouping aggregation-lacp-top {
+ description
+ "Top level configuration and state variable containers for
+ LACP data";
+
+ container lacp {
+ description
+ "Configuration and operational state data for LACP protocol
+ operation on the aggregate interface";
+
+ container config {
+ description
+ "Configuration data for LACP";
+
+ uses aggregation-lacp-global-config;
+ }
+
+ container state {
+
+ config false;
+ description
+ "Operational state data for LACP";
+
+ uses aggregation-lacp-global-config;
+ uses aggregation-lacp-global-state;
+ }
+ uses lacp-interfaces-top;
+ }
+ }
+
+ // data definition statements
+ uses aggregation-lacp-top;
+
+ // augment statements
+
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-lldp-types.yang b/src/plugins/yang/openconfig/openconfig-lldp-types.yang
new file mode 100644
index 0000000..cc7f9f5
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-lldp-types.yang
@@ -0,0 +1,296 @@
+module openconfig-lldp-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/lldp/types";
+
+ prefix "oc-lldp-types";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines types related to the LLDP protocol model.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2016-05-16" {
+ description
+ "Initial public revision";
+ reference "0.1.0";
+ }
+
+
+ // identity statements
+
+ identity LLDP_SYSTEM_CAPABILITY {
+ description
+ "Base identity for standard LLDP system capabilities.
+ The system capabilities field contains a bit-map of the
+ capabilities that define the primary function(s) of
+ the system. A system may advertise more than one capability.";
+ reference
+ "Table 8-4 System Capabilities, IEEE 802.1AB-2009";
+ }
+
+ identity OTHER {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "Other capability not specified; bit position 1";
+ }
+
+ identity REPEATER {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "Repeater capability; bit position 2";
+ reference
+ "IETF RFC 2108";
+ }
+
+ identity MAC_BRIDGE {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "MAC bridge capability; bit position 3";
+ reference
+ "IEEE Std 802.1D";
+ }
+
+ identity WLAN_ACCESS_POINT {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "WLAN access point capability; bit position 4";
+ reference
+ "IEEE Std 802.11 MIB";
+ }
+
+ identity ROUTER {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "Router; bit position 5";
+ reference
+ "IETF RFC 1812";
+ }
+
+ identity TELEPHONE {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "Telephone capability; bit position 6";
+ reference
+ "IETF RFC 4293";
+ }
+
+ identity DOCSIS_CABLE_DEVICE {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "DOCSIS cable device; bit position 7";
+ reference
+ "IETF RFC 4639 and IETF RFC 4546";
+ }
+
+ identity STATION_ONLY {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "Station only capability, for devices that implement only an
+ end station capability, and for which none of the other
+ capabilities apply; bit position 8";
+ reference
+ "IETF RFC 4293";
+ }
+
+ identity C_VLAN {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "C-VLAN component of a VLAN Bridge; bit position 9";
+ reference
+ "IEEE Std 802.1Q";
+ }
+
+ identity S_VLAN {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "S-VLAN component of a VLAN Bridge; bit position 10";
+ reference
+ "IEEE Std 802.1Q";
+ }
+
+ identity TWO_PORT_MAC_RELAY {
+ base LLDP_SYSTEM_CAPABILITY;
+ description
+ "Two-port MAC Relay (TPMR) capability; bit position 11";
+ reference
+ "IEEE Std 802.1Q";
+ }
+
+ identity LLDP_TLV {
+ description
+ "A base identity which describes the TLVs in LLDP";
+ }
+
+ identity CHASSIS_ID {
+ base LLDP_TLV;
+ description
+ "The chassis identifier of the device associated with
+ the transmitting LLDP agent";
+ reference "IEEE Std 802.1AB";
+ }
+
+ identity PORT_ID {
+ base LLDP_TLV;
+ description
+ "The port identifier associated with the interface
+ on with the LLDP agent is transmitting";
+ reference "IEEE Std 802.1AB";
+ }
+
+ identity PORT_DESCRIPTION {
+ base LLDP_TLV;
+ description
+ "The description of the port that is associated with
+ the interface on which the LLDP agent is transmitting";
+ reference "IEEE Std 802.1AB";
+ }
+
+ identity SYSTEM_NAME {
+ base LLDP_TLV;
+ description
+ "The assigned name (sysName or hostname) of the device
+ which is transmitting the LLDP PDU";
+ reference "IEEE Std 802.1AB";
+ }
+
+ identity SYSTEM_DESCRIPTION {
+ base LLDP_TLV;
+ description
+ "The description (sysDescr) of the device which is
+ transmitting the LLDP PDU";
+ reference "IEEE Std 802.1AB";
+ }
+
+ identity SYSTEM_CAPABILITIES {
+ base LLDP_TLV;
+ description
+ "The primary functions of the device transmitting the
+ LLDP PDU and their administrative status";
+ reference "IEEE Std 802.1AB";
+ }
+
+ identity MANAGEMENT_ADDRESS {
+ base LLDP_TLV;
+ description
+ "The address associated with the device transmitting the
+ LLDP PDU which can be used for higher-layer network
+ management";
+ reference "IEEE Std 802.1AB";
+ }
+
+ // typedef statements
+
+ typedef chassis-id-type {
+ type enumeration {
+ enum CHASSIS_COMPONENT {
+ description
+ "Chassis identifier based on the value of entPhysicalAlias
+ object defined in IETF RFC 2737";
+ }
+ enum INTERFACE_ALIAS {
+ description
+ "Chassis identifier based on the value of ifAlias object
+ defined in IETF RFC 2863";
+ }
+ enum PORT_COMPONENT {
+ description
+ "Chassis identifier based on the value of entPhysicalAlias
+ object defined in IETF RFC 2737 for a port or backplane
+ component";
+ }
+ enum MAC_ADDRESS {
+ description
+ "Chassis identifier based on the value of a unicast source
+ address (encoded in network byte order and IEEE 802.3
+ canonical bit order), of a port on the containing chassis
+ as defined in IEEE Std 802-2001";
+ }
+ enum NETWORK_ADDRESS {
+ description
+ "Chassis identifier based on a network address,
+ associated with a particular chassis. The encoded address
+ is composed of two fields. The first field is a single
+ octet, representing the IANA AddressFamilyNumbers value
+ for the specific address type, and the second field is the
+ network address value";
+ }
+ enum INTERFACE_NAME {
+ description
+ "Chassis identifier based on the name of the interface,
+ e.g., the value of ifName object defined in IETF RFC 2863";
+ }
+ enum LOCAL {
+ description
+ "Chassis identifier based on a locally defined value";
+ }
+ }
+ description
+ "Type definition with enumerations describing the source of
+ the chassis identifier";
+ reference
+ "IEEE 802.1AB LLDP MIB";
+ }
+
+ typedef port-id-type {
+ type enumeration {
+ enum INTERFACE_ALIAS {
+ description
+ "Chassis identifier based on the value of ifAlias object
+ defined in IETF RFC 2863";
+ }
+ enum PORT_COMPONENT {
+ description
+ "Port identifier based on the value of entPhysicalAlias
+ object defined in IETF RFC 2737 for a port component";
+ }
+ enum MAC_ADDRESS {
+ description
+ "Port identifier based on the value of a unicast source
+ address (encoded in network byte order and IEEE 802.3
+ canonical bit order) associated with a port";
+ }
+ enum NETWORK_ADDRESS {
+ description
+ "Port identifier based on a network address,
+ associated with a particular port";
+ }
+ enum INTERFACE_NAME {
+ description
+ "Port identifier based on the name of the interface,
+ e.g., the value of ifName object defined in IETF RFC 2863";
+ }
+ enum AGENT_CIRCUIT_ID {
+ description
+ "Port identifer based on the circuit id in the DHCP
+ relay agent information option as defined in IETF
+ RFC 3046";
+ }
+ enum LOCAL {
+ description
+ "Port identifier based on a locally defined alphanumeric
+ string";
+ }
+ }
+ description
+ "Type definition with enumerations describing the basis of
+ the port identifier";
+ reference
+ "IEEE 802.1AB LLDP MIB";
+ }
+
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-lldp.yang b/src/plugins/yang/openconfig/openconfig-lldp.yang
new file mode 100644
index 0000000..c5381ef
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-lldp.yang
@@ -0,0 +1,650 @@
+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.2.0";
+
+ revision "2018-07-17" {
+ description
+ "Adds ttl to lldp-neighbor-state";
+ reference "0.2.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 ttl {
+ type uint16;
+ units "seconds";
+ description
+ "The time-to-live (TTL) is a mandatory TLV which indicates
+ how long information from the neighbor should be considered
+ valid.";
+ }
+
+ 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;
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-local-routing.yang b/src/plugins/yang/openconfig/openconfig-local-routing.yang
new file mode 100644
index 0000000..5184fe7
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-local-routing.yang
@@ -0,0 +1,408 @@
+module openconfig-local-routing {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/local-routing";
+
+ prefix "oc-loc-rt";
+
+ // import some basic types
+ import openconfig-inet-types { prefix inet; }
+ import openconfig-policy-types { prefix oc-pt; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-interfaces { prefix oc-if; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module describes configuration and operational state data
+ for routes that are locally generated, i.e., not created by
+ dynamic routing protocols. These include static routes, locally
+ created aggregate routes for reducing the number of constituent
+ routes that must be advertised, summary routes for IGPs, etc.
+
+ This model expresses locally generated routes as generically as
+ possible, avoiding configuration of protocol-specific attributes
+ at the time of route creation. This is primarily to avoid
+ assumptions about how underlying router implementations handle
+ route attributes in various routing table data structures they
+ maintain. Hence, the definition of locally generated routes
+ essentially creates 'bare' routes that do not have any protocol-
+ specific attributes.
+
+ When protocol-specific attributes must be attached to a route
+ (e.g., communities on a locally defined route meant to be
+ advertised via BGP), the attributes should be attached via a
+ protocol-specific policy after importing the route into the
+ protocol for distribution (again via routing policy).";
+
+ oc-ext:openconfig-version "1.0.1";
+
+ revision "2017-05-15" {
+ description
+ "Update to resolve style guide non-compliance.";
+ reference "1.0.1";
+ }
+
+ revision "2016-05-11" {
+ description
+ "OpenConfig public release";
+ reference "1.0.0";
+ }
+
+
+ // identity statements
+
+ identity LOCAL_DEFINED_NEXT_HOP {
+ description
+ "A base identity type of local defined next-hops";
+ }
+
+ identity DROP {
+ base LOCAL_DEFINED_NEXT_HOP;
+ description
+ "Discard traffic for the corresponding destination";
+ }
+
+ identity LOCAL_LINK {
+ base LOCAL_DEFINED_NEXT_HOP;
+ description
+ "Treat traffic towards addresses within the specified
+ next-hop prefix as though they are connected to a local
+ link. When the LOCAL_LINK next-hop type is specified,
+ an interface must also be specified such that
+ the local system can determine which link to trigger
+ link-layer address discovery against";
+ }
+
+ // typedef statements
+
+ typedef local-defined-next-hop {
+ type identityref {
+ base LOCAL_DEFINED_NEXT_HOP;
+ }
+ description
+ "Pre-defined next-hop designation for locally generated
+ routes";
+ }
+
+ // grouping statements
+
+ grouping local-generic-settings {
+ description
+ "Generic options that can be set on local routes When
+ they are defined";
+
+ leaf set-tag {
+ type oc-pt:tag-type;
+ description
+ "Set a generic tag value on the route. This tag can be
+ used for filtering routes that are distributed to other
+ routing protocols.";
+ }
+ }
+
+ grouping local-static-config {
+ description
+ "Configuration data for static routes.";
+
+ leaf prefix {
+ type inet:ip-prefix;
+ description
+ "Destination prefix for the static route, either IPv4 or
+ IPv6.";
+ }
+
+ uses local-generic-settings;
+ }
+
+ grouping local-static-state {
+ description
+ "Operational state data for static routes";
+ }
+
+
+ grouping local-static-nexthop-config {
+ description
+ "Configuration parameters related to each next-hop entry
+ specified for a static route";
+
+ leaf index {
+ type string;
+ description
+ "An user-specified identifier utilised to uniquely reference
+ the next-hop entry in the next-hop list. The value of this
+ index has no semantic meaning other than for referencing
+ the entry.";
+ }
+
+ leaf next-hop {
+ type union {
+ type inet:ip-address;
+ type local-defined-next-hop;
+ }
+ description
+ "The next-hop that is to be used for the static route
+ - this may be specified as an IP address, an interface
+ or a pre-defined next-hop type - for instance, DROP or
+ LOCAL_LINK. When this leaf is not set, and the interface-ref
+ value is specified for the next-hop, then the system should
+ treat the prefix as though it is directly connected to the
+ interface.";
+ }
+
+ leaf metric {
+ type uint32;
+ description
+ "A metric which is utilised to specify the preference of
+ the next-hop entry when it is injected into the RIB. The
+ lower the metric, the more preferable the prefix is. When
+ this value is not specified the metric is inherited from
+ the default metric utilised for static routes within the
+ network instance that the static routes are being
+ instantiated. When multiple next-hops are specified for a
+ static route, the metric is utilised to determine which of
+ the next-hops is to be installed in the RIB. When multiple
+ next-hops have the same metric (be it specified, or simply
+ the default) then these next-hops should all be installed
+ in the RIB";
+ }
+
+ leaf recurse {
+ type boolean;
+ default false;
+ description
+ "Determines whether the next-hop should be allowed to
+ be looked up recursively - i.e., via a RIB entry which has
+ been installed by a routing protocol, or another static route
+ - rather than needing to be connected directly to an
+ interface of the local system within the current network
+ instance. When the interface reference specified within the
+ next-hop entry is set (i.e., is not null) then forwarding is
+ restricted to being via the interface specified - and
+ recursion is hence disabled.";
+ }
+ }
+
+ grouping local-static-nexthop-state {
+ description
+ "Operational state parameters relating to a next-hop entry
+ for a static route";
+ }
+
+
+ grouping local-static-top {
+ description
+ "Top-level grouping for the list of static route definitions";
+
+ container static-routes {
+ description
+ "Enclosing container for the list of static routes";
+
+ list static {
+ key "prefix";
+ description
+ "List of locally configured static routes";
+
+ leaf prefix {
+ type leafref {
+ path "../config/prefix";
+ }
+ description
+ "Reference to the destination prefix list key.";
+ }
+
+ container config {
+ description
+ "Configuration data for static routes";
+
+ uses local-static-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for static routes";
+
+ uses local-static-config;
+ uses local-static-state;
+ }
+
+ container next-hops {
+ description
+ "Configuration and state parameters relating to the
+ next-hops that are to be utilised for the static
+ route being specified";
+
+ list next-hop {
+ key "index";
+
+ description
+ "A list of next-hops to be utilised for the static
+ route being specified.";
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+ description
+ "A reference to the index of the current next-hop.
+ The index is intended to be a user-specified value
+ which can be used to reference the next-hop in
+ question, without any other semantics being
+ assigned to it.";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the next-hop
+ entry";
+
+ uses local-static-nexthop-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the
+ next-hop entry";
+
+ uses local-static-nexthop-config;
+ uses local-static-nexthop-state;
+ }
+
+ uses oc-if:interface-ref;
+ }
+ }
+ }
+ }
+ }
+
+ grouping local-aggregate-config {
+ description
+ "Configuration data for aggregate routes";
+
+ leaf prefix {
+ type inet:ip-prefix;
+ description
+ "Aggregate prefix to be advertised";
+ }
+
+ leaf discard {
+ type boolean;
+ default false;
+ description
+ "When true, install the aggregate route with a discard
+ next-hop -- traffic destined to the aggregate will be
+ discarded with no ICMP message generated. When false,
+ traffic destined to an aggregate address when no
+ constituent routes are present will generate an ICMP
+ unreachable message.";
+ }
+
+ uses local-generic-settings;
+
+ }
+
+ grouping local-aggregate-state {
+ description
+ "Operational state data for local aggregate advertisement
+ definitions";
+ }
+
+ grouping local-aggregate-top {
+ description
+ "Top-level grouping for local aggregates";
+
+ container local-aggregates {
+ description
+ "Enclosing container for locally-defined aggregate
+ routes";
+
+ list aggregate {
+ key "prefix";
+ description
+ "List of aggregates";
+
+ leaf prefix {
+ type leafref {
+ path "../config/prefix";
+ }
+ description
+ "Reference to the configured prefix for this aggregate";
+ }
+
+ container config {
+ description
+ "Configuration data for aggregate advertisements";
+
+ uses local-aggregate-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for aggregate
+ advertisements";
+
+ uses local-aggregate-config;
+ uses local-aggregate-state;
+ }
+ }
+ }
+ }
+
+ grouping local-routes-config {
+ description
+ "Configuration data for locally defined routes";
+ }
+
+ grouping local-routes-state {
+ description
+ "Operational state data for locally defined routes";
+ }
+
+ grouping local-routes-top {
+ description
+ "Top-level grouping for local routes";
+
+ container local-routes {
+ description
+ "Top-level container for local routes";
+
+ container config {
+ description
+ "Configuration data for locally defined routes";
+
+ uses local-routes-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for locally defined routes";
+
+ uses local-routes-config;
+ uses local-routes-state;
+ }
+
+ uses local-static-top;
+ uses local-aggregate-top;
+ }
+ }
+
+ uses local-routes-top;
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-module-catalog.yang b/src/plugins/yang/openconfig/openconfig-module-catalog.yang
new file mode 100644
index 0000000..673fe95
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-module-catalog.yang
@@ -0,0 +1,786 @@
+module openconfig-module-catalog {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/module-catalog";
+
+ prefix "oc-cat";
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-catalog-types { prefix oc-cat-types; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module provides a schema for cataloging and descrbing
+ YANG models published across various organizations. The catalog
+ contains several categories of data:
+
+ * organizations -- entities that publish and/or maintain
+ individual YANG modules or groups of modules
+
+ * modules -- information regarding individual YANG modules,
+ including their versions, dependencies, submodules, and how
+ to access them
+
+ * release bundles -- groups of modules that are compatible and
+ consistent with each other (as determined by the publisher of
+ of the bundle). The release bundle does not necessarily
+ correspond to a functional area, e.g., it could the entire
+ set of modules published by an organization
+
+ * feature bundles -- sets of schema paths across a
+ release bundle that provide a specific set of functionality
+
+ * implementations -- information about available module and/or
+ bundle implementations and their status";
+
+ oc-ext:openconfig-version "0.2.1";
+
+ revision "2017-05-01" {
+ description
+ "Fix to module dependency list";
+ reference "0.2.1";
+ }
+
+ revision "2017-03-08" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+ revision "2016-02-15" {
+ description
+ "Initial OpenConfig public release";
+ reference "0.1.0";
+ }
+
+
+
+ // grouping statements
+
+ grouping catalog-module-common-config {
+ description
+ "Data definitions common for both bundles and standalone
+ modules";
+
+ leaf name {
+ type string;
+ description
+ "The name of the module or bundle. For modules, this
+ should reflect the 'module' or 'submodule'
+ statement in the YANG module file.
+
+ For bundles, this is the canonical name for the overall
+ bundle of modules which is to be released together.
+ This name should be consistent over multiple
+ releases";
+ }
+
+ leaf version {
+ type oc-cat-types:module-version-type;
+ description
+ "For individual modules, this is the version number, e.g.,
+ a semantic version. The version may be the same as the date
+ indicated in the module revision statement.
+
+ For bundles, this is a semantic version number for the
+ overall bundle. This version is to be defined as per the
+ approach specified in the OpenConfig semantic version
+ guidance - and is of the form x.y.z, where x is the major
+ version, y is the minor version, and z is the patch level";
+ reference
+ "Semantic versioning for OpenConfig models";
+ }
+ }
+
+ grouping feature-bundle-included-reference {
+ description
+ "References to the included feature bundles";
+
+ leaf name {
+ type leafref {
+ path "../../../../../../../organizations/" +
+ "organization[name=current()/../publisher]/" +
+ "feature-bundles/feature-bundle/name";
+ }
+ description
+ "Name of the referenced feature bundle";
+ }
+
+ leaf publisher {
+ type leafref {
+ path "../../../../../../../organizations/organization/" +
+ "name";
+ }
+ description
+ "Publisher of the referenced feature bundle";
+ }
+
+ leaf version {
+ type oc-cat-types:module-version-type;
+ description
+ "Version of the referenced feature bundle";
+ }
+ }
+
+ grouping catalog-implementation-bundle-config {
+ description
+ "References to the feature bundles supported by an
+ implementation";
+
+ uses feature-bundle-included-reference;
+ }
+
+ grouping catalog-implementation-bundle-top {
+ description
+ "Top-level grouping for the list of feature bundles
+ supported by an implementation";
+
+ container feature-bundles {
+ description
+ "Enclosing container for the list of feature bundles";
+
+ list feature-bundle {
+ key "name version";
+ description
+ "List of feature bundles supported by the implementation";
+
+ uses catalog-implementation-bundle-config;
+ }
+ }
+ }
+
+ grouping catalog-implementation-config {
+ description
+ "Data describing any available implementations";
+
+ leaf id {
+ type string;
+ description
+ "An identifier for the implementation, provided by the
+ implementor. This id should uniquely identify a specific
+ implementation of the module, e.g., based on the vendor,
+ platform, and platform version.";
+ }
+
+ leaf description {
+ type string;
+ description
+ "A text summary of important information about the
+ implementation";
+ }
+
+ leaf reference {
+ type union {
+ type oc-inet:uri;
+ type string;
+ }
+ description
+ "A URI (preferred) or text reference to more detailed
+ information about the implementation.";
+ }
+
+
+ leaf platform {
+ type string;
+ description
+ "Name of the platform on which the implementation
+ is available -- this could be the model name of a network
+ device, a server OS, etc.";
+ }
+
+ leaf platform-version {
+ type string;
+ description
+ "Implementor-defined version name or number of the
+ module implementation, corresponding to the platform.
+ This could be the firmware version of a network device
+ such as a router, OS version, or other server platform
+ version.";
+ }
+
+ leaf status {
+ type identityref {
+ base oc-cat-types:IMPLEMENTATION_STATUS_TYPE;
+ }
+ description
+ "Indicates the status of the implementation, e.g.,
+ complete, partial, in-progress, etc. Implementors
+ may define additional values for the base identity";
+ }
+ }
+
+ grouping catalog-implementation-top {
+ description
+ "Top level grouping for information on model implementations";
+
+ container implementations {
+ description
+ "Container for module implementation information";
+
+ list implementation {
+ key "id";
+ description
+ "List of available implementations, keyed by an identifier
+ provided by either the implementor or the module
+ maintainer. Such a key avoids needing a complex composite
+ key to uniquely identify an implementation.";
+
+ uses catalog-implementation-config;
+ uses catalog-implementation-bundle-top;
+ }
+ }
+ }
+
+ grouping catalog-module-dependency-config {
+ description
+ "Information about module dependencies";
+
+
+ leaf-list required-module {
+ type string;
+ description
+ "List of names of modules that are imported by the
+ current module. This list should reflect all of the 'import'
+ statements in the module. Release bundles should be used to
+ indicate which versions of the imported module are used
+ (or are compatible) with the current module";
+ }
+ }
+
+ grouping catalog-module-dependency-top {
+ description
+ "Top-level grouping for module dependency data";
+
+ container dependencies {
+ description
+ "Data about dependencies of the module";
+
+ uses catalog-module-dependency-config;
+ }
+
+ }
+
+ grouping catalog-module-classification-config {
+ description
+ "Data describing the module's classification(s)";
+
+ leaf category {
+ type identityref {
+ base oc-cat-types:MODULE_CATEGORY_BASE;
+ }
+ description
+ "Categorization of the module based on identities defined
+ or used by the publishing organizations.";
+ }
+
+ leaf subcategory {
+ type identityref {
+ base oc-cat-types:MODULE_SUBCATEGORY_BASE;
+ }
+ description
+ "Sub-categorization of the module based on identities
+ defined or used by the publishing organizations.";
+ }
+
+ leaf deployment-status {
+ type identityref {
+ base oc-cat-types:MODULE_STATUS_TYPE;
+ }
+ description
+ "Deployment status of the module -- experimental,
+ standards-track, production, etc.";
+ }
+ }
+
+ grouping catalog-module-classification-top {
+ description
+ "Data definitions related to module classfications";
+
+ container classification {
+ description
+ "Container for data describing the module's classification";
+
+ uses catalog-module-classification-config;
+ }
+ }
+
+ grouping catalog-module-access-config {
+ description
+ "Data pertaining to retrieval and usage of the module";
+
+ leaf uri {
+ type oc-inet:uri;
+ description
+ "URI where module can be downloaded. Modules may be
+ made available from the catalog maintainer, or directly
+ from the publisher";
+ }
+
+ leaf md5-hash {
+ type string;
+ description
+ "Optional MD5 hash of the module file. If specified, the
+ hash may be used by users to validate data integrity";
+ }
+ }
+
+ grouping catalog-module-access-top {
+ description
+ "Top level groupig for data related to accessing a module
+ or submodule";
+
+ container access {
+ description
+ "Container for data pertaining to retrieval and usage of the
+ module";
+
+ uses catalog-module-access-config;
+ }
+ }
+
+ grouping catalog-module-submodule-config {
+ description
+ "Data definitions for submodules belonging to a
+ module";
+
+ leaf name {
+ type string;
+ description
+ "Name of the submodule as indicated by its top-level
+ 'submodule' statement";
+ }
+
+ }
+
+ grouping catalog-module-submodule-top {
+ description
+ "Top-level grouping for submodule information";
+
+ container submodules {
+ description
+ "Data for the submodules belonging to a submodule. If the
+ module does not have any submodules, this container
+ should be empty.";
+
+ list submodule {
+ key "name";
+ description
+ "List of submodules included by a module. All submodules
+ specified by 'include' statements in the module should be
+ included in this list.";
+
+ uses catalog-module-submodule-config;
+ uses catalog-module-access-top;
+ }
+ }
+ }
+
+ grouping catalog-module-base-config {
+ description
+ "Basic information describing the module, e.g., the
+ YANG metadata in the module preface.";
+
+
+ leaf namespace {
+ type string;
+ description
+ "Published namespace of module, i.e., defined by the
+ 'namespace' ";
+ }
+
+ leaf prefix {
+ type string;
+ description
+ "Published prefix of the module";
+ }
+
+ leaf revision {
+ type string;
+ description
+ "Date in the revision statement of the module";
+ }
+
+ leaf summary {
+ type string;
+ description
+ "Summary description of the module";
+ }
+ }
+
+ grouping release-bundle-member-config {
+ description
+ "Data for each member of a bundle";
+
+ leaf id {
+ type string;
+ description
+ "Identifier for the bundle member";
+ }
+
+ leaf type {
+ type identityref {
+ base oc-cat-types:CATALOG_MEMBER_TYPE;
+ }
+ description
+ "The type of member that is to be included within the
+ release bundle. Release bundles may include modules and
+ other release bundles. Both member modules and member
+ bundles should specify the list of compatible versions.";
+ }
+
+ leaf module {
+ when "../type = 'oc-cat-types:MODULE'" {
+ description
+ "The module name is specified for bundle membrs that are
+ modules";
+ }
+ type leafref {
+ path "../../../../../../../organizations/" +
+ "organization[name=current()/../publisher]/modules/" +
+ "module/name";
+ }
+ description
+ "Name of the module set which is included in this bundle -
+ for example, 'openconfig-bgp'";
+ }
+
+ leaf release-bundle {
+ when "../type = 'oc-cat-types:RELEASE_BUNDLE'" {
+ description
+ "The release bundle is specified for bundle members that
+ are release bundles";
+ }
+ type leafref {
+ path "../../../../../../../organizations/" +
+ "organization[name=current()/../publisher]/" +
+ "release-bundles/release-bundle/name";
+ }
+ description
+ "Name of the module set which is included in this bundle -
+ for example, 'openconfig-bgp'";
+ }
+
+ leaf publisher {
+ type leafref {
+ path "../../../../../../../organizations/organization/" +
+ "name";
+ }
+ description
+ "Reference to the name of the publishing organization";
+ }
+
+ leaf-list compatible-versions {
+ type oc-cat-types:module-version-type;
+ description
+ "A list of semantic version specification of the versions
+ of the specified module or release bundle which are
+ compatible when building this version of the bundle.
+
+ Version specifications may be added when changes are made
+ to a module within a bundle, and this does not affect the
+ interaction between it and other modules. It is expected
+ that backwards compatible changes to an individual module or
+ member bundle do not affect the compatibility of that
+ with other members, and hence wildcard matches are allowed
+ within this list.";
+ }
+ }
+
+ grouping release-bundle-member-top {
+
+ description
+ "Parameters relating to models within release bundles";
+
+ container members {
+ description
+ "List of bundle members which make up this release bundle. A
+ member is defined as an individual YANG module specified
+ in the YANG catalogue, or another release
+ bundle which can be used to group multiple YANG
+ models together.";
+
+ list member {
+ key "id";
+ description
+ "A set of modules or bundles which are part of the bundle
+ of models. For example, if 'ietf-yang-types' were to be
+ specified within the bundle, then this would refer to the
+ individual entry within the module catalogue. If the type
+ of the entry is set to bundle, then for example,
+ openconfig-bgp could be referenced - which itself consists
+ of separate modules.";
+
+ uses release-bundle-member-config;
+
+ }
+ }
+ }
+
+ grouping release-bundle-top {
+ description
+ "Top-level container for a release bundle";
+
+ container release-bundles {
+ description
+ "List of release bundles";
+
+ list release-bundle {
+ key "name version";
+
+ description
+ "List of release bundles - sets of modules and/or
+ bundles which are interoperable";
+
+ uses catalog-module-common-config;
+ uses release-bundle-member-top;
+ }
+ }
+ }
+
+ grouping feature-bundle-release-config {
+ description
+ "Data definitions to identify the release bundle that the
+ feature bundle is based on.";
+
+ leaf name {
+ type leafref {
+ path "../../../../release-bundles/release-bundle/name";
+ }
+ description
+ "Reference to the name of the release bundle used for the
+ feature paths.";
+ }
+
+ leaf version {
+ type leafref {
+ path "../../../../release-bundles/" +
+ "release-bundle[name=current()/../name]/version";
+ }
+ description
+ "Reference to the release bundle version used for the
+ feature paths";
+ }
+
+ leaf publisher {
+ type leafref {
+ path "../../../../release-bundles/" +
+ "release-bundle[name=current()/../name]/publisher";
+ }
+ description
+ "Reference to the publisher of the release bundle used for
+ the feature paths";
+ }
+ }
+
+ grouping feature-bundle-release-top {
+ description
+ "Top-level grouping for data about the release bundle used
+ to specify the feature bundle";
+
+ container release-bundle {
+ description
+ "Data to identify the release bundle from which the feature
+ paths should be specified. If the feature crosses
+ release bundles, a new release bundle should be
+ created to support the feature bundle.";
+
+ leaf name {
+ type leafref {
+ path "../../../../../../organizations/" +
+ "organization[name=current()/../publisher]/" +
+ "release-bundles/release-bundle/name";
+ }
+ description
+ "Name of the module set which is included in this bundle -
+ for example, 'openconfig-bgp'";
+ }
+
+ leaf publisher {
+ type leafref {
+ path "../../../../../../organizations/organization/" +
+ "name";
+ }
+ description
+ "Reference to the name of the publishing organization";
+ }
+
+ leaf version {
+ type oc-cat-types:module-version-type;
+ description
+ "Version of the referenced release bundle";
+ }
+ }
+ }
+
+
+ grouping feature-bundle-config {
+ description
+ "Data definitions for the feature bundle";
+
+ uses catalog-module-common-config;
+
+ leaf-list path {
+ type string;
+ description
+ "The list of schema paths included in the feature. The
+ paths specify subtrees, i.e., all data underneath the
+ specified path are included in the feature.";
+ }
+ }
+
+ grouping feature-bundle-feature-config {
+ description
+ "Data definitions for included feature bundles";
+
+ uses feature-bundle-included-reference;
+ }
+
+ grouping feature-bundle-feature-top {
+ description
+ "Top level grouping for the list of included feature
+ bundles";
+
+ container feature-bundles {
+ description
+ "Enclosing container for the list of included feature
+ bundles. Feature bundles may be composed from other
+ smaller feature units";
+
+ list feature-bundle {
+ key "name";
+ description
+ "The list of feature bundles included in the current
+ feature bundle.";
+
+ uses feature-bundle-feature-config;
+ }
+ }
+
+ }
+
+
+ grouping feature-bundle-top {
+ description
+ "Top-level grouping for OpenConfig feature bundles";
+
+ container feature-bundles {
+ description
+ "Enclosing container for the list of feature bundles";
+
+ list feature-bundle {
+ key "name version";
+ description
+ "List of feature bundles";
+
+ uses feature-bundle-config;
+ uses feature-bundle-release-top;
+ uses feature-bundle-feature-top;
+ }
+ }
+ }
+
+ grouping catalog-module-top {
+ description
+ "Top level structure of the module catalog";
+
+ container modules {
+ description
+ "Modules published by this organization";
+
+ list module {
+ key "name version";
+ description
+ "List of published modules from the organization";
+
+ uses catalog-module-common-config;
+ uses catalog-module-base-config;
+ uses catalog-module-classification-top;
+ uses catalog-module-dependency-top;
+ uses catalog-module-access-top;
+ uses catalog-module-submodule-top;
+ }
+ }
+ }
+
+ grouping catalog-organization-config {
+ description
+ "Top level grouping for data related to an organization that
+ publishes module, bundles, etc.";
+
+ leaf name {
+ type string;
+ description
+ "Name of the maintaining organization -- the name should be
+ supplied in the official format used by the organization.
+ Standards Body examples:
+ IETF, IEEE, MEF, ONF, etc.
+ Commercial entity examples:
+ AT&T, Facebook, <Vendor>
+ Name of industry forum examples:
+ OpenConfig, OpenDaylight, ON.Lab";
+ }
+
+ leaf type {
+ type identityref {
+ base oc-cat-types:ORGANIZATION_TYPE;
+ }
+ description
+ "Type of the publishing organization";
+ }
+
+ leaf contact {
+ type string;
+ description
+ "Contact information for the publishing organization (web
+ site, email address, etc.)";
+ }
+ }
+
+ grouping catalog-organization-top {
+ description
+ "Top level grouping for list of maintaining organizations";
+
+ container organizations {
+ description
+ "List of organizations owning modules";
+
+ list organization {
+ key "name";
+
+ description
+ "List of organizations publishing YANG modules or
+ module bundles";
+
+ uses catalog-organization-config;
+ uses catalog-module-top;
+ uses release-bundle-top;
+ uses feature-bundle-top;
+ uses catalog-implementation-top;
+ }
+ }
+ }
+
+
+ grouping catalog-top {
+ description
+ "Top-level grouping for the YANG model catalog";
+
+ uses catalog-organization-top;
+ }
+
+ // data definition statements
+
+ uses catalog-top;
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-mpls-igp.yang b/src/plugins/yang/openconfig/openconfig-mpls-igp.yang
new file mode 100644
index 0000000..267515c
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-mpls-igp.yang
@@ -0,0 +1,129 @@
+submodule openconfig-mpls-igp {
+
+ yang-version "1";
+
+ belongs-to "openconfig-mpls" {
+ prefix "oc-mpls";
+ }
+
+
+ // import some basic types
+ import openconfig-mpls-ldp { prefix oc-ldp; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "Configuration generic configuration parameters for IGP-congruent
+ LSPs";
+
+ oc-ext:openconfig-version "3.0.0";
+
+ revision "2018-07-02" {
+ description
+ "Add new RSVP-TE statistics, remove associated-rsvp-session
+ leaf. Remove use of date-and-time.";
+ reference "3.0.0";
+ }
+
+ revision "2018-06-16" {
+ description
+ "Included attributes for base LDP configuration.";
+ reference "2.6.0";
+ }
+
+ revision "2018-06-13" {
+ description
+ "Add ttl-propagation to global MPLS config";
+ reference "2.5.0";
+ }
+
+ revision "2018-06-05" {
+ description
+ "Fixed bugs in when statements on RSVP-TE attributes";
+ reference "2.4.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "2.4.1";
+ }
+
+ revision "2017-06-21" {
+ description
+ "Add TC bits typedef.";
+ reference "2.4.0";
+ }
+
+ revision "2017-03-22" {
+ description
+ "Add RSVP calculated-absolute-subscription-bw";
+ reference "2.3.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+ reference "2.2.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add additional MPLS parameters";
+ reference "2.1.0";
+ }
+
+ revision "2016-09-01" {
+ description
+ "Revisions based on implementation feedback";
+ reference "2.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "Public release of MPLS models";
+ reference "1.0.1";
+ }
+
+ // grouping statements
+
+
+ grouping igp-lsp-common {
+ description
+ "common definitions for IGP-congruent LSPs";
+
+ }
+
+
+ grouping igp-lsp-setup {
+ description
+ "signaling protocol definitions for IGP-based LSPs";
+
+ container path-setup-protocol {
+ description
+ "select and configure the signaling method for
+ the LSP";
+
+ // uses path-setup-common;
+ uses oc-ldp:igp-lsp-ldp-setup;
+ }
+ }
+
+
+ // data definition statements
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-mpls-ldp.yang b/src/plugins/yang/openconfig/openconfig-mpls-ldp.yang
new file mode 100644
index 0000000..ade7876
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-mpls-ldp.yang
@@ -0,0 +1,873 @@
+module openconfig-mpls-ldp {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/ldp";
+
+ prefix "oc-ldp";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-yang-types { prefix oc-yang; }
+ import openconfig-types { prefix oc-types; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "Configuration of Label Distribution Protocol global and LSP-
+ specific parameters for IGP-congruent LSPs.
+
+ This model reuses data items defined in the IETF YANG model for
+ LDP described by draft-ietf-mpls-ldp-yang-04, YANG Data Model for
+ MPLS LDP, following an alternate structure.
+
+ Portions of this code were derived from draft-ietf-mpls-ldp-yang-04.
+ 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 "3.0.0";
+
+ revision "2018-07-02" {
+ description
+ "Add new RSVP-TE statistics, remove associated-rsvp-session
+ leaf. Remove use of date-and-time.";
+ reference "3.0.0";
+ }
+
+ revision "2018-06-16" {
+ description
+ "Included attributes for base LDP configuration.";
+ reference "2.6.0";
+ }
+
+ revision "2018-06-13" {
+ description
+ "Add ttl-propagation to global MPLS config";
+ reference "2.5.0";
+ }
+
+ revision "2018-06-05" {
+ description
+ "Fixed bugs in when statements on RSVP-TE attributes";
+ reference "2.4.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "2.4.1";
+ }
+
+ revision "2017-06-21" {
+ description
+ "Add TC bits typedef.";
+ reference "2.4.0";
+ }
+
+ revision "2017-03-22" {
+ description
+ "Add RSVP calculated-absolute-subscription-bw";
+ reference "2.3.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+ reference "2.2.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add additional MPLS parameters";
+ reference "2.1.0";
+ }
+
+ revision "2016-09-01" {
+ description
+ "Revisions based on implementation feedback";
+ reference "2.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "Public release of MPLS models";
+ reference "1.0.1";
+ }
+
+ // typedef statements
+
+ typedef mpls-ldp-adjacency-type {
+ type enumeration {
+ enum LINK {
+ description
+ "Link LDP adjacency";
+ }
+ enum TARGETED {
+ description
+ "Targeted LDP adjacency";
+ }
+ }
+ description
+ "enumerated type for specifying LDP adjacencies";
+ }
+
+ typedef mpls-ldp-afi {
+ type enumeration {
+ enum IPV4 {
+ description
+ "IPv4 AFI for LDP adjancencies";
+ }
+ enum IPV6 {
+ description
+ "IPv6 AFI for LDP adjancencies";
+ }
+ }
+ description
+ "enumerated type for specifying LDP AFIs";
+ }
+
+ // grouping statements
+
+ grouping ldp-global {
+ description
+ "Global LDP signaling configuration";
+
+ container ldp {
+ description
+ "LDP global signaling configuration";
+
+ container global {
+ description
+ "Platform wide LDP configuration and state";
+
+ uses mpls-ldp-global;
+ uses mpls-ldp-graceful-restart;
+ uses mpls-ldp-authentication-top;
+ }
+
+ uses mpls-ldp-interface-attributes-top;
+ uses mpls-ldp-targeted-top;
+ uses mpls-ldp-neighbors-top;
+
+ }
+ }
+
+ grouping mpls-ldp-authentication-top {
+ description
+ "Grouping containing LDP authentication attributes";
+
+ container authentication {
+ description
+ "Global LDP authentication";
+
+ container config {
+ description
+ "Configuration of LDP authentication attributes";
+ uses mpls-ldp-authentication-config;
+ }
+
+ container state {
+ config false;
+ description
+ "LDP authentication state.";
+ uses mpls-ldp-authentication-config;
+ }
+ }
+ }
+
+ grouping mpls-ldp-neighbors-top {
+ description
+ "Global LDP neighbor attributes";
+
+ container neighbors {
+ description
+ "State and configuration LDP neighbors attributes";
+
+ list neighbor {
+ key "lsr-id label-space-id";
+
+ description
+ "List of LDP neighbors and their attributes.";
+
+ leaf lsr-id {
+ type leafref {
+ path "../config/lsr-id";
+ }
+ description
+ "Neighbor label switch router identifier.";
+ }
+
+ leaf label-space-id {
+ type leafref {
+ path "../config/label-space-id";
+ }
+ description
+ "Label space ID of the neighbor.";
+ }
+
+ container config {
+ description
+ "Neighbor configuration attributes.";
+ uses mpls-ldp-neighbor-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Neighbor state attributes.";
+ uses mpls-ldp-neighbor-config;
+ }
+
+ container hello-adjacencies {
+ config false;
+ description "Top container for hello adjacencies
+ for a given LDP neighbor.";
+
+ list hello-adjacency {
+ key "remote-address local-address";
+ config false;
+ description
+ "List of hello adjacencies for a given LDP
+ neighbor.";
+
+ leaf remote-address {
+ config false;
+ description
+ "Within the LDP adjacency, this attribute
+ shows the neighbor address.";
+ type leafref {
+ path "../state/remote-address";
+ }
+ }
+
+ leaf local-address {
+ config false;
+ description
+ "Within the LDP adjacency, this attribute
+ shows the local address.";
+ type leafref {
+ path "../state/local-address";
+ }
+ }
+
+ container state {
+ description
+ "State information for a particular LDP
+ hello adjacency.";
+ uses mpls-ldp-adjacency-state;
+ }
+
+ uses oc-if:interface-ref-state;
+
+ container hello-holdtime {
+
+ description
+ "Specifies the time the sending LSR will
+ maintain its record of Hellos from the
+ receiving LSR";
+
+ container state {
+ description
+ "State attributes related to the
+ hello-holdtime.";
+ config false;
+ uses mpls-ldp-hello-holdtime-state;
+ }
+ }
+
+ }
+ }
+
+ uses mpls-ldp-authentication-top;
+
+ }
+ }
+ }
+
+ grouping mpls-ldp-neighbor-config {
+ description
+ "Global configuration for LDP neighbors.";
+
+ leaf lsr-id {
+ type oc-inet:ip-address;
+ description
+ "Neighbor label switch router identifier.";
+ }
+
+ leaf label-space-id {
+ type uint16;
+ description
+ "Label space ID of the neighbor.";
+ }
+
+ }
+
+ grouping mpls-ldp-adjacency-state {
+
+ description
+ "Set of LDP neighbor related state attributes.";
+
+ leaf remote-address {
+ description
+ "Within the LDP adjacency, this attribute
+ shows the neighbor address.";
+ type oc-inet:ip-address;
+ }
+
+ leaf local-address {
+ description
+ "Within the LDP adjacency, this attribute
+ shows the local address.";
+ type oc-inet:ip-address;
+ }
+
+ leaf adjacency-type {
+ description
+ "This attributes defines if the LDP
+ adjacency is from a direct link or from
+ targeted discovery.";
+ type oc-ldp:mpls-ldp-adjacency-type;
+ }
+
+ leaf last-clear {
+ type oc-types:timeticks64;
+ 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).";
+ }
+
+ leaf hello-received {
+ type oc-yang:counter64;
+ description
+ "Number of Hello messaged received by the device";
+ }
+
+ leaf hello-dropped {
+ type oc-yang:counter64;
+ description
+ "Number of Hello messaged dropped by the device";
+ }
+
+ }
+
+ grouping mpls-ldp-hello-holdtime-state {
+ description
+ "Grouping containing the state attributes
+ for hello holdtime.";
+
+ leaf adjacent {
+ description
+ "Hello holdtime attribute learned from the
+ LDP neighbor";
+ type uint16;
+ }
+
+ leaf negotiated {
+ description
+ "Hello holdtime attribute negotiated between
+ the LDP neighbor and the local router.";
+ type uint16;
+ }
+
+ leaf hello-expiration {
+ description
+ "Expiration time for the hello holdtime.";
+ type oc-types:timeticks64;
+ }
+
+ leaf next-hello {
+ description
+ "Time when the next LDP hello will be sent to
+ the adjacent neighbor.";
+ type oc-types:timeticks64;
+ }
+
+ }
+
+ grouping mpls-ldp-global {
+ description
+ "Global LDP attributes";
+
+ container config {
+ description
+ "Global LDP configuration attributes.";
+ uses mpls-ldp-global-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Global LDP state information.";
+ uses mpls-ldp-global-config;
+ }
+ }
+
+ grouping mpls-ldp-global-config {
+ description
+ "Grouping containing platform wide LDP information";
+
+ leaf lsr-id {
+ type oc-inet:ip-address;
+ description
+ "Global label switch router identifier
+ configuration.";
+ reference "RFC5036 LDP Specification";
+ }
+
+ }
+
+ grouping mpls-ldp-interface-attributes-top {
+ description
+ "Top-level structure grouping for interface
+ attributes";
+
+ container interface-attributes {
+ description
+ "Container including attributes for LDP-enabled
+ interfaces";
+
+ container config {
+ description
+ "Configuration of per-interface LDP parameters";
+ uses mpls-ldp-hello-timers-top-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Per-interface LDP protocol and state information";
+ uses mpls-ldp-hello-timers-top-config;
+ }
+
+ container interfaces {
+ description
+ "Container aggregating all interfaces and their
+ LDP-specific attributes.";
+
+ list interface {
+ key "interface-id";
+ description
+ "list of per-interface LDP configurations";
+
+ leaf interface-id {
+ type leafref {
+ path "../config/interface-id";
+ }
+ description
+ "reference to the interface-id data";
+ }
+
+ container config {
+ description
+ "Configuration of per-interface LDP parameters";
+ uses mpls-ldp-interfaces-config;
+ uses mpls-ldp-hello-timers-top-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Per-interface LDP protocol and state information";
+
+ uses mpls-ldp-interfaces-config;
+ uses mpls-ldp-hello-timers-top-config;
+
+ container counters {
+ config false;
+ description
+ "Interface specific LDP statistics and counters";
+ }
+ }
+
+ uses oc-if:interface-ref;
+ uses mpls-ldp-address-families-ldp-top;
+
+ }
+ }
+ }
+ }
+
+ grouping mpls-ldp-address-families-ldp-top {
+ description
+ "Grouping containing the state and configuration
+ attributes for adress families.";
+
+ container address-families {
+ description
+ "Top container comprising the adress families
+ attributes";
+ list address-family {
+ key "afi-name";
+ description
+ "List for attributes related to address-families for LDP.";
+
+ leaf afi-name {
+ type leafref {
+ path "../config/afi-name";
+ }
+ description
+ "Adress-family name atttibute (IPv4, IPv6).";
+ }
+
+ container config {
+ description
+ "Configuration attributes related to address-families
+ for LDP.";
+ uses mpls-ldp-address-family-config;
+ uses admin-config;
+ }
+
+ container state {
+ description
+ "State attributes related to address-families for LDP.";
+ config false;
+ uses mpls-ldp-address-family-config;
+ uses admin-config;
+ }
+ }
+ }
+ }
+
+ grouping mpls-ldp-hello-timers-top-config {
+
+ description
+ "Grouping containing interface-related attributes
+ that can be configured for LDP.";
+
+ leaf hello-holdtime {
+ type uint16;
+ description
+ "Defines the time for which a neighbor adjacency will
+ be kept by the router while it waits for a new link
+ Hello message.";
+ reference "RFC5036 LDP Specification";
+ }
+
+ leaf hello-interval {
+ type uint16;
+ description
+ "Defines the interval for sending Hello messages on
+ each link LDP adjacency.";
+ }
+
+ }
+
+ grouping mpls-ldp-targeted-top {
+
+ description
+ "Grouping containing attributes for targeted LDP";
+
+ container targeted {
+ description
+ "Top container for targeted LDP state and configuration
+ attributes.";
+
+ container config {
+ description
+ "Configuration attributes related to targeted LDP.";
+ uses mpls-ldp-targeted-attributes-top-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State attributes related to targeted LDP.";
+ uses mpls-ldp-targeted-attributes-top-config;
+ }
+
+ uses mpls-ldp-address-targeted-ldp-top;
+ }
+ }
+
+ grouping mpls-ldp-address-targeted-ldp-top {
+ description
+ "Grouping containing address attributes for targeted LDP.";
+
+ container address-families {
+ description
+ "Global container for IPv4 and IPv6 attributes for LDP.";
+
+ list address-family {
+ key "afi-name";
+ description
+ "List of address families for targeted LDP
+ configuration";
+
+ leaf afi-name {
+ type leafref {
+ path "../config/afi-name";
+ }
+ description
+ "Adress-family name atttibute (IPv4, IPv6).";
+ }
+
+ container config {
+ description
+ "Address-family configuration for targeted LDP";
+ uses mpls-ldp-address-family-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Address-family state for targeted LDP";
+ uses mpls-ldp-address-family-config;
+ }
+
+ container targets {
+ description
+ "Container aggregating all targeted sessions and
+ their LDP-specific attributes.";
+
+ list target {
+ key "remote-address";
+
+ description
+ "List of LDP targets configuration";
+
+ leaf remote-address {
+ type leafref {
+ path "../config/remote-address";
+ }
+ description
+ "Neighbor address of the targeted LDP session";
+ }
+
+ container config {
+
+ description
+ "Configuration parameters of a targeted LDP
+ adjacency";
+
+ leaf remote-address {
+ type oc-inet:ip-address;
+ description
+ "Configuration of neighbor address of the
+ targeted LDP adjacency";
+ }
+
+ leaf local-address {
+ type oc-inet:ip-address;
+ description
+ "Local IP address of the LDP adjacency";
+ }
+
+ uses admin-config;
+ uses mpls-ldp-hello-timers-top-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State attributes of a targeted LDP adjacency";
+
+ leaf remote-address {
+ config false;
+ type oc-inet:ip-address;
+ description
+ "Neighbor address of the targeted LDP adjacency";
+ }
+
+ leaf local-address {
+ config false;
+ type oc-inet:ip-address;
+ description
+ "Local IP address of the LDP adjacency";
+ }
+
+ uses admin-config;
+ uses mpls-ldp-hello-timers-top-config;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ grouping mpls-ldp-address-family-config {
+ description
+ "Grouping containing adress-family name atttibute";
+
+ leaf afi-name {
+ description
+ "Adress-family name atttibute (IPv4, IPv6).";
+ type oc-ldp:mpls-ldp-afi;
+ }
+
+ }
+
+ grouping mpls-ldp-targeted-attributes-top-config {
+
+ description
+ "Grouping containing targeted LDP configuration
+ attributes.";
+
+ uses mpls-ldp-hello-timers-top-config;
+
+ leaf hello-accept {
+ type boolean;
+ description
+ "Enables or disables the acceptance of targeted LDP
+ hello messages.";
+ reference "RFC5036 LDP Specification";
+ }
+
+ }
+
+ grouping mpls-ldp-interfaces-config {
+ description
+ "LDP configuration information relevant to an interface";
+
+ leaf interface-id {
+ type oc-if:interface-id;
+ description
+ "Identifier for the interface";
+ }
+ }
+
+ grouping mpls-ldp-graceful-restart {
+ description
+ "Attributes relating to LDP Graceful-Restart";
+
+ container graceful-restart {
+ description
+ "Top container for LDP graceful-restart attributes";
+
+ container config {
+ description
+ "LDP graceful-restart configuration attributes.";
+ uses mpls-ldp-graceful-restart-config;
+ }
+
+ container state {
+ config false;
+ description
+ "LDP graceful-restart state attributes.";
+ uses mpls-ldp-graceful-restart-config;
+ }
+ }
+ }
+
+ grouping mpls-ldp-graceful-restart-config {
+ description
+ "Configuration parameters relating to LDP Graceful-Restart";
+
+ uses admin-config;
+
+ leaf reconnect-time {
+ type uint16;
+ description
+ "Interval for which the remote LDP peers
+ will wait for the local node to reconnect after a
+ failure";
+ reference "RFC3478 Graceful Restart Mechanism for Label
+ Distribution Protocol";
+ }
+
+ leaf recovery-time {
+ type uint16;
+ description
+ "Interval used to specify the time for the remote
+ peer to maintain the MPLS forwarding state after
+ the local node has succesfully reconnected";
+ reference "RFC3478 Graceful Restart Mechanism for Label
+ Distribution Protocol";
+ }
+
+ leaf forwarding-holdtime {
+ type uint16;
+ description
+ "Time that defines the interval for keeping the
+ node in recovery mode.";
+ reference "RFC3478 Graceful Restart Mechanism for Label
+ Distribution Protocol";
+ }
+
+ leaf helper-enable {
+ type boolean;
+ description
+ "Enables the graceful restart helper for LDP.";
+ }
+ }
+
+ grouping igp-tunnel-ldp {
+ description
+ "common defintiions for LDP-signaled LSP tunnel
+ types";
+ }
+
+ grouping igp-lsp-ldp-setup {
+ description
+ "grouping for LDP setup attributes";
+
+ container ldp {
+ description
+ "LDP signaling setup for IGP-congruent LSPs";
+ uses igp-tunnel-ldp;
+ }
+ }
+
+ grouping mpls-ldp-authentication-config {
+ description
+ "LDP authentication parameters container.";
+
+ leaf enable {
+ type boolean;
+ default false;
+ description
+ "Enables LDP authentication on the node.";
+ }
+
+ leaf authentication-key {
+ type oc-types:routing-password;
+ description
+ "authenticate LDP signaling
+ messages";
+ reference
+ "RFC1321 The MD5 Message-Digest Algorithm
+ RFC5036 LDP Specification";
+ }
+ }
+
+ grouping admin-config {
+ description
+ "Re-usable grouping to enable or disable a particular LDP feature.";
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "When set to true, the functionality within which this leaf is
+ defined is enabled, when set to false it is explicitly disabled.";
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-mpls-rsvp.yang b/src/plugins/yang/openconfig/openconfig-mpls-rsvp.yang
new file mode 100644
index 0000000..6b6f4ac
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-mpls-rsvp.yang
@@ -0,0 +1,1446 @@
+module openconfig-mpls-rsvp {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/rsvp";
+
+ prefix "oc-rsvp";
+
+ // import some basic types
+ import openconfig-inet-types { prefix inet; }
+ import openconfig-mpls-types { prefix oc-mplst; }
+ import openconfig-yang-types { prefix yang; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-interfaces { prefix oc-if; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "Configuration for RSVP-TE signaling, including global protocol
+ parameters and LSP-specific configuration for constrained-path
+ LSPs";
+
+ oc-ext:openconfig-version "3.0.0";
+
+ revision "2018-07-02" {
+ description
+ "Add new RSVP-TE statistics, remove associated-rsvp-session
+ leaf. Remove use of date-and-time.";
+ reference "3.0.0";
+ }
+
+ revision "2018-06-16" {
+ description
+ "Included attributes for base LDP configuration.";
+ reference "2.6.0";
+ }
+
+ revision "2018-06-13" {
+ description
+ "Add ttl-propagation to global MPLS config";
+ reference "2.5.0";
+ }
+
+ revision "2018-06-05" {
+ description
+ "Fixed bugs in when statements on RSVP-TE attributes";
+ reference "2.4.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "2.4.1";
+ }
+
+ revision "2017-06-21" {
+ description
+ "Add TC bits typedef.";
+ reference "2.4.0";
+ }
+
+ revision "2017-03-22" {
+ description
+ "Add RSVP calculated-absolute-subscription-bw";
+ reference "2.3.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+ reference "2.2.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add additional MPLS parameters";
+ reference "2.1.0";
+ }
+
+ revision "2016-09-01" {
+ description
+ "Revisions based on implementation feedback";
+ reference "2.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "Public release of MPLS models";
+ reference "1.0.1";
+ }
+
+ // grouping statements
+
+ grouping mpls-rsvp-soft-preemption-config {
+ description
+ "Configuration for MPLS soft preemption";
+ leaf enable {
+ type boolean;
+ default false;
+ description
+ "Enables soft preemption on a node.";
+ }
+
+ leaf soft-preemption-timeout {
+ type uint16 {
+ range 0..max;
+ }
+ default 30;
+ description
+ "Timeout value for soft preemption to revert
+ to hard preemption. The default timeout for
+ soft-preemption is 30 seconds - after which
+ the local system reverts to hard pre-emption.";
+ reference "RFC5712 MPLS-TE soft preemption";
+ }
+ }
+
+ grouping mpls-rsvp-soft-preemption {
+ description
+ "Top level group for MPLS soft preemption";
+ container soft-preemption {
+ description
+ "Protocol options relating to RSVP
+ soft preemption";
+ container config {
+ description
+ "Configuration parameters relating to RSVP
+ soft preemption support";
+ uses mpls-rsvp-soft-preemption-config;
+ }
+ container state {
+ config false;
+ description
+ "State parameters relating to RSVP
+ soft preemption support";
+ uses mpls-rsvp-soft-preemption-config;
+ }
+ }
+ }
+
+ grouping mpls-rsvp-hellos-config {
+ description
+ "RSVP protocol options configuration.";
+
+ leaf hello-interval {
+ type uint16 {
+ range 1000..60000;
+ }
+ units milliseconds;
+ default 9000;
+ description
+ "set the interval in ms between RSVP hello
+ messages";
+ reference
+ "RFC 3209: RSVP-TE: Extensions to RSVP for
+ LSP Tunnels.
+ RFC 5495: Description of the Resource
+ Reservation Protocol - Traffic-Engineered
+ (RSVP-TE) Graceful Restart Procedures";
+ }
+
+ leaf refresh-reduction {
+ type boolean;
+ default true;
+ description
+ "enables all RSVP refresh reduction message
+ bundling, RSVP message ID, reliable message delivery
+ and summary refresh";
+ reference
+ "RFC 2961 RSVP Refresh Overhead Reduction
+ Extensions";
+ }
+ }
+
+ grouping mpls-rsvp-hellos {
+ description
+ "Top level grouping for RSVP hellos parameters";
+ // TODO: confirm that the described semantics are supported
+ // on various implementations. Finer grain configuration
+ // will be vendor-specific
+
+ container hellos {
+ description
+ "Top level container for RSVP hello parameters";
+
+ container config {
+ description
+ "Configuration parameters relating to RSVP
+ hellos";
+ uses mpls-rsvp-hellos-config;
+ }
+ container state {
+ config false;
+ description
+ "State information associated with RSVP hellos";
+ uses mpls-rsvp-hellos-config;
+ }
+ }
+ }
+
+ grouping mpls-rsvp-subscription-config {
+ description
+ "RSVP subscription configuration";
+
+ leaf subscription {
+ type oc-types:percentage;
+ description
+ "percentage of the interface bandwidth that
+ RSVP can reserve";
+ }
+ }
+
+ grouping mpls-rsvp-subscription-state {
+ description
+ "Operational state parameters relating to the
+ bandwidth subscription on an interface";
+
+ leaf calculated-absolute-subscription-bw {
+ type uint64;
+ units "kbps";
+ description
+ "The calculated absolute value of the bandwidth
+ which is reservable to RSVP-TE on the interface
+ prior to any adjustments that may be made from
+ external sources.";
+ }
+ }
+
+ grouping mpls-rsvp-subscription {
+ description
+ "Top level group for RSVP subscription options";
+
+ container subscription {
+ description
+ "Bandwidth percentage reservable by RSVP
+ on an interface";
+
+ container config {
+ description
+ "Configuration parameters relating to RSVP
+ subscription options";
+ uses mpls-rsvp-subscription-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to RSVP
+ subscription options";
+ uses mpls-rsvp-subscription-config;
+ uses mpls-rsvp-subscription-state;
+ }
+ }
+ }
+
+ grouping mpls-rsvp-graceful-restart-config {
+ description
+ "Configuration parameters relating to RSVP Graceful-Restart";
+
+ leaf enable {
+ type boolean;
+ default false;
+ description
+ "Enables graceful restart on the node.";
+ }
+
+ leaf restart-time {
+ type uint32;
+ description
+ "Graceful restart time (seconds).";
+ reference
+ "RFC 5495: Description of the Resource
+ Reservation Protocol - Traffic-Engineered
+ (RSVP-TE) Graceful Restart Procedures";
+ }
+ leaf recovery-time {
+ type uint32;
+ description
+ "RSVP state recovery time";
+ }
+ }
+
+ grouping mpls-rsvp-graceful-restart {
+ description
+ "Top level group for RSVP graceful-restart
+ parameters";
+
+ container graceful-restart {
+ description
+ "Operational state and configuration parameters relating to
+ graceful-restart for RSVP";
+
+ container config {
+ description
+ "Configuration parameters relating to
+ graceful-restart";
+ uses mpls-rsvp-graceful-restart-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information associated with
+ RSVP graceful-restart";
+ uses mpls-rsvp-graceful-restart-config;
+ }
+ }
+ }
+
+ grouping mpls-rsvp-authentication-config {
+ description
+ "RSVP authentication parameters container.";
+
+ leaf enable {
+ type boolean;
+ default false;
+ description
+ "Enables RSVP authentication on the node.";
+ }
+
+ leaf authentication-key {
+ type string {
+ // Juniper supports 1..16 while
+ // Cisco has a much bigger range, up to 60.
+ length "1..32";
+ }
+ description
+ "authenticate RSVP signaling
+ messages";
+ reference
+ "RFC 2747: RSVP Cryptographic Authentication";
+ }
+ }
+
+ grouping mpls-rsvp-authentication {
+ description
+ "Top level group for RSVP authentication,
+ as per RFC2747";
+
+ container authentication {
+ description
+ "Configuration and state parameters relating to RSVP
+ authentication as per RFC2747";
+
+ container config {
+ description
+ "Configuration parameters relating
+ to authentication";
+ uses mpls-rsvp-authentication-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information associated
+ with authentication";
+ uses mpls-rsvp-authentication-config;
+ }
+ }
+ }
+
+ grouping mpls-rsvp-protection-config {
+ description
+ "RSVP facility (link/node) protection configuration";
+
+ leaf link-protection-style-requested {
+ type identityref {
+ base oc-mplst:PROTECTION_TYPE;
+ }
+ default oc-mplst:LINK_NODE_PROTECTION_REQUESTED;
+ description
+ "Style of mpls frr protection desired:
+ link, link-node, or unprotected";
+ }
+
+ leaf bypass-optimize-interval {
+ type uint16;
+ units seconds;
+ description
+ "interval between periodic optimization
+ of the bypass LSPs";
+ // note: this is interface specific on juniper
+ // on iox, this is global. need to resolve.
+ }
+ // to be completed, things like enabling link protection,
+ // optimization times, etc.
+ }
+
+ grouping mpls-rsvp-link-protection {
+ description
+ "Top level group for RSVP protection";
+ container protection {
+ description
+ "link-protection (NHOP) related configuration";
+
+ container config {
+ description
+ "Configuration for link-protection";
+ uses mpls-rsvp-protection-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State for link-protection";
+ uses mpls-rsvp-protection-config;
+ }
+ }
+ }
+
+ grouping mpls-rsvp-statistics {
+ description
+ "Top level grouping for RSVP protocol state";
+
+ uses mpls-rsvp-protocol-state;
+ }
+
+ grouping rsvp-global {
+ description
+ "Global RSVP protocol configuration";
+ container rsvp-te {
+ description
+ "RSVP-TE global signaling protocol configuration";
+
+ uses mpls-rsvp-session-state;
+
+ container neighbors {
+ description
+ "Configuration and state for RSVP neighbors connecting
+ to the device";
+
+ list neighbor {
+ key "address";
+
+ config false;
+
+ description
+ "List of RSVP neighbors of the local system";
+
+ leaf address {
+ type leafref {
+ path "../state/address";
+ }
+ description
+ "Reference to the address of the RSVP neighbor";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the
+ RSVP neighbor";
+ uses mpls-rsvp-neighbor-state;
+ }
+ }
+ }
+
+ container global {
+ description
+ "Platform wide RSVP configuration and state";
+ uses mpls-rsvp-graceful-restart;
+ uses mpls-rsvp-soft-preemption;
+ uses mpls-rsvp-hellos;
+
+ container state {
+ config false;
+ description
+ "Platform wide RSVP state, including counters";
+ // TODO - reconcile global and per-interface
+ // protocol-related statistics
+
+ container counters {
+ config false;
+ description
+ "Platform wide RSVP statistics and counters";
+ uses mpls-rsvp-global-protocol-state;
+ uses mpls-rsvp-statistics;
+
+ container errors {
+ description
+ "Error counters associated with the global RSVP-TE
+ instance.";
+ uses mpls-rsvp-error-counters;
+ }
+ }
+ }
+ }
+
+ container interface-attributes {
+ description
+ "Attributes relating to RSVP-TE enabled interfaces";
+
+ list interface {
+ key "interface-id";
+ description
+ "list of per-interface RSVP configurations";
+
+ leaf interface-id {
+ type leafref {
+ path "../config/interface-id";
+ }
+ description
+ "reference to the interface-id data";
+ }
+
+
+ container config {
+ description
+ "Configuration of per-interface RSVP parameters";
+ uses mpls-rsvp-interfaces-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Per-interface RSVP protocol and state information";
+
+ uses mpls-rsvp-interfaces-state;
+ uses mpls-rsvp-interfaces-config;
+
+ container counters {
+ config false;
+ description
+ "Interface specific RSVP statistics and counters";
+ uses mpls-rsvp-protocol-state;
+ uses mpls-rsvp-rate-limited-messages-state;
+
+ container errors {
+ description
+ "Interface specific RSVP error counters";
+ uses mpls-rsvp-error-counters;
+ }
+ }
+ }
+
+ uses oc-if:interface-ref;
+ uses mpls-rsvp-interface-reservations;
+ uses mpls-rsvp-hellos;
+ uses mpls-rsvp-authentication;
+ uses mpls-rsvp-subscription;
+ uses mpls-rsvp-link-protection;
+ }
+ }
+ }
+ }
+
+ grouping rsvp-p2p-tunnel-attributes-config {
+ description
+ "properties of RSVP point-to-point paths";
+
+ leaf source {
+ when "../signaling-protocol = 'PATH_SETUP_RSVP'" {
+ description
+ "When the signaling protocol is RSVP-TE ";
+ }
+ type inet:ip-address;
+ description
+ "RSVP-TE tunnel source address";
+ }
+
+ leaf soft-preemption {
+ when "../signaling-protocol = 'PATH_SETUP_RSVP'" {
+ description
+ "When the signaling protocol is RSVP-TE ";
+ }
+ type boolean;
+ default false;
+ description
+ "Enables RSVP soft-preemption on this LSP";
+ }
+
+ uses rsvp-priorities-tunnel-config;
+ }
+
+ grouping rsvp-priorities-tunnel-config {
+ description
+ "Configuration paramters related to RSVP-TE priorities for
+ an LSP tunnel";
+
+ leaf setup-priority {
+ when "../signaling-protocol = 'PATH_SETUP_RSVP'" {
+ description
+ "When the signaling protocol is RSVP-TE ";
+ }
+ type uint8 {
+ range 0..7;
+ }
+ default 7;
+ description
+ "RSVP-TE preemption priority during LSP setup, lower is
+ higher priority; default 7 indicates that LSP will not
+ preempt established LSPs during setup";
+ reference "RFC 3209 - RSVP-TE: Extensions to RSVP for
+ LSP Tunnels";
+ }
+
+ leaf hold-priority {
+ when "../signaling-protocol = 'PATH_SETUP_RSVP'" {
+ description
+ "When the signaling protocol is RSVP-TE ";
+ }
+ type uint8 {
+ range 0..7;
+ }
+ default 0;
+ description
+ "preemption priority once the LSP is established,
+ lower is higher priority; default 0 indicates other LSPs
+ will not preempt the LSPs once established";
+ reference "RFC 3209 - RSVP-TE: Extensions to RSVP for
+ LSP Tunnels";
+ }
+ }
+
+ grouping rsvp-priorities-path-config {
+ description
+ "Configuration paramters related to RSVP-TE priorities on
+ a primary/secondary path associated with an LSP.";
+
+ leaf setup-priority {
+ when "../../../../../" +
+ "config/signaling-protocol = 'PATH_SETUP_RSVP'" {
+ description
+ "When the signaling protocol is RSVP-TE ";
+ }
+ type uint8 {
+ range 0..7;
+ }
+ default 7;
+ description
+ "RSVP-TE preemption priority during LSP setup, lower is
+ higher priority; default 7 indicates that LSP will not
+ preempt established LSPs during setup";
+ reference "RFC 3209 - RSVP-TE: Extensions to RSVP for
+ LSP Tunnels";
+ }
+
+ leaf hold-priority {
+ when "../../../../../" +
+ "config/signaling-protocol = 'PATH_SETUP_RSVP'" {
+ description
+ "When the signaling protocol is RSVP-TE ";
+ }
+ type uint8 {
+ range 0..7;
+ }
+ default 0;
+ description
+ "preemption priority once the LSP is established,
+ lower is higher priority; default 0 indicates other LSPs
+ will not preempt the LSPs once established";
+ reference "RFC 3209 - RSVP-TE: Extensions to RSVP for
+ LSP Tunnels";
+ }
+ }
+
+ grouping rsvp-p2p-path-attributes-config {
+ description
+ "properties of RSPP point-to-point paths";
+
+ uses rsvp-priorities-path-config;
+
+ leaf retry-timer {
+ when "../../../../../" +
+ "config/signaling-protocol = 'PATH_SETUP_RSVP'" {
+ description
+ "When the signaling protocol is RSVP-TE ";
+ }
+ type uint16 {
+ range 1..600;
+ }
+ units seconds;
+ description
+ "sets the time between attempts to establish the
+ LSP";
+ }
+ }
+
+ grouping mpls-rsvp-neighbor-state {
+ description
+ "State information for RSVP neighbors";
+
+ leaf address {
+ type inet:ip-address;
+ description
+ "Address of RSVP neighbor";
+ }
+
+ leaf detected-interface {
+ type string;
+ description
+ "Interface where RSVP neighbor was detected";
+ }
+
+ leaf neighbor-status {
+ type enumeration {
+ enum UP {
+ description
+ "RSVP hello messages are detected from the neighbor";
+ }
+ enum DOWN {
+ description
+ "RSVP neighbor not detected as up, due to a
+ communication failure or IGP notification
+ the neighbor is unavailable";
+ }
+ }
+ description
+ "Enumuration of possible RSVP neighbor states";
+ }
+
+ leaf refresh-reduction {
+ type boolean;
+ description
+ "Suppport of neighbor for RSVP refresh reduction";
+ reference
+ "RFC 2961 RSVP Refresh Overhead Reduction
+ Extensions";
+ }
+
+ }
+
+ grouping mpls-rsvp-session-state {
+ description
+ "State information for RSVP TE sessions";
+
+ container sessions {
+ description
+ "Enclosing container for sessions";
+
+ list session {
+ key "local-index";
+ config false;
+
+ description
+ "List of RSVP sessions";
+
+ leaf local-index {
+ type leafref {
+ path "../state/local-index";
+ }
+ description
+ "Reference to the local index for the RSVP
+ session";
+ }
+
+ uses mpls-rsvp-record-route-object-top;
+ uses mpls-rsvp-explicit-route-object-top;
+
+ container state {
+ description
+ "Operational state parameters relating to the
+ RSVP session";
+
+ leaf local-index {
+ type uint64;
+ description
+ "The index used to identify the RSVP session
+ on the local network element. This index is
+ generated by the device and is unique only
+ to the local network element.";
+ }
+
+ leaf source-address {
+ type inet:ip-address;
+ description
+ "Origin address of RSVP session";
+ }
+
+ leaf destination-address {
+ type inet:ip-address;
+ description
+ "Destination address of RSVP session";
+ }
+
+ leaf tunnel-id {
+ type uint16;
+ description
+ "The tunnel ID is an identifier used in the
+ RSVP session, which remains constant over
+ the life of the tunnel.";
+ reference "RFC 3209";
+ }
+
+ leaf lsp-id {
+ type uint16;
+ description
+ "The LSP ID distinguishes between two LSPs
+ originated from the same headend, and is
+ commonly used to distinguish RSVP sessions
+ during make before break operations.";
+ reference "RFC 3209";
+ }
+
+ leaf session-name {
+ type string;
+ description
+ "The signaled name of this RSVP session.";
+ }
+
+ leaf status {
+ type enumeration {
+ enum UP {
+ description
+ "RSVP session is up";
+ }
+ enum DOWN {
+ description
+ "RSVP session is down";
+ }
+ }
+ description
+ "Enumeration of RSVP session states";
+ }
+
+ leaf type {
+ type identityref {
+ base oc-mplst:LSP_ROLE;
+ }
+ description
+ "The type/role of the RSVP session, signifing
+ the session's role on the current device, such as
+ a transit session vs. an ingress session.";
+ }
+
+ leaf protection-requested {
+ type identityref {
+ base oc-mplst:PROTECTION_TYPE;
+ }
+ description
+ "The type of protection requested for the RSVP session";
+ }
+
+ leaf label-in {
+ type oc-mplst:mpls-label;
+ description
+ "Incoming MPLS label associated with this RSVP session";
+ }
+
+ leaf label-out {
+ type oc-mplst:mpls-label;
+ description
+ "Outgoing MPLS label associated with this RSVP session";
+ }
+
+ container sender-tspec {
+ description
+ "Operational state statistics relating to the SENDER_TSPEC
+ received for the RSVP session";
+
+ leaf rate {
+ type oc-types:ieeefloat32;
+ units "Bps";
+ description
+ "The rate at which the head-end device generates traffic,
+ expressed in bytes per second.";
+ reference
+ "RFC2210: RSVP with INTSERV";
+ }
+
+ leaf size {
+ type oc-types:ieeefloat32;
+ units "bytes per second";
+ description
+ "The size of the token bucket that is used to determine
+ the rate at which the head-end device generates traffic,
+ expressed in bytes per second.";
+ reference
+ "RFC2210: RSVP with INTSERV";
+ }
+
+ leaf peak-data-rate {
+ type union {
+ type oc-types:ieeefloat32;
+ type enumeration {
+ enum INFINITY {
+ description
+ "The head-end device has no maximum data rate.";
+ }
+ }
+ }
+ units "bytes per second";
+ description
+ "The maximum traffic generation rate that the head-end
+ device sends traffic at.";
+ reference
+ "RFC2210: RSVP with INTSERV";
+ }
+ }
+ }
+ }
+ }
+ } //rsvp-session-state
+
+ grouping mpls-rsvp-interfaces-config {
+ description
+ "RSVP configuration information relevant to an interface";
+
+ leaf interface-id {
+ type oc-if:interface-id;
+ description
+ "Identifier for the interface";
+ }
+ }
+
+ grouping mpls-rsvp-interfaces-state {
+ description
+ "RSVP state information relevant to an interface";
+
+ leaf max-link-bandwidth {
+ type oc-mplst:bandwidth-kbps;
+ description
+ "The maximum link bandwidth expressed in kilobits
+ per second. This value should be the same (other than
+ the units) as the value that is advertised into the
+ IGP traffic engineering database.";
+ }
+ }
+
+ grouping mpls-rsvp-interface-reservations {
+ description
+ "Operational state related to interface bandwidth
+ reservations";
+
+ container bandwidth-reservations {
+ description
+ "Enclosing container for bandwidth reservation";
+ list bandwidth-reservation {
+ key "priority";
+ config false;
+ description
+ "Available and reserved bandwidth by priority on
+ the interface.";
+
+ leaf priority {
+ type leafref {
+ path "../state/priority";
+ }
+ description "Reference to the RSVP priority level";
+ }
+
+ container state {
+ description
+ "Operational state parameters relating to a
+ bandwidth reservation at a certain priority";
+
+ leaf priority {
+ type union {
+ type uint8 {
+ range 0..7;
+ }
+ type enumeration {
+ enum ALL {
+ description
+ "The ALL keyword represents the overall
+ state of the interface - i.e., the union
+ of all of the priority levels";
+ }
+ }
+ }
+ description
+ "RSVP priority level for LSPs traversing the interface";
+ }
+
+ leaf available-bandwidth {
+ type oc-mplst:bandwidth-mbps;
+ description
+ "Bandwidth currently available with the priority level,
+ or for the entire interface when the priority is set to
+ ALL";
+ }
+
+ leaf reserved-bandwidth {
+ type oc-mplst:bandwidth-mbps;
+ description
+ "Bandwidth currently reserved within the priority level,
+ or the sum of all priority levels when the keyword is set
+ to ALL";
+ }
+
+ leaf active-reservations-count {
+ type yang:gauge64;
+ description
+ "Number of active RSVP reservations in the associated
+ priority, or the sum of all reservations when the priority
+ level is set to ALL";
+ }
+
+ leaf highwater-mark {
+ type oc-mplst:bandwidth-mbps;
+ description
+ "Maximum bandwidth reserved on the interface within the
+ priority, or across all priorities in the case that the
+ priority level is set to ALL";
+ }
+ }
+ }
+ }
+ }
+
+ grouping mpls-rsvp-global-protocol-state {
+ description
+ "RSVP protocol statistics which may not apply
+ on an interface, but are significant globally.";
+
+ leaf path-timeouts {
+ type yang:counter64;
+ description
+ "The number of Path State Blocks (PSBs) that
+ have been timed out by the local system.";
+ }
+
+ leaf reservation-timeouts {
+ type yang:counter64;
+ description
+ "The number of Reservation State Blocks (RSBs) that
+ have been timed out by the local system.";
+ }
+
+ uses mpls-rsvp-rate-limited-messages-state;
+ }
+
+ grouping mpls-rsvp-rate-limited-messages-state {
+ description
+ "Common grouping for rate limit messages";
+
+ leaf rate-limited-messages {
+ type yang:counter64;
+ description
+ "RSVP messages dropped due to rate limiting";
+ }
+ }
+
+ grouping mpls-rsvp-protocol-state {
+ description
+ "RSVP protocol statistics and message counters";
+
+ leaf in-path-messages {
+ type yang:counter64;
+ description
+ "Number of received RSVP Path messages";
+ }
+
+ leaf in-path-error-messages {
+ type yang:counter64;
+ description
+ "Number of received RSVP Path Error messages";
+ }
+
+ leaf in-path-tear-messages {
+ type yang:counter64;
+ description
+ "Number of received RSVP Path Tear messages";
+ }
+
+ leaf in-reservation-messages {
+ type yang:counter64;
+ description
+ "Number of received RSVP Resv messages";
+ }
+
+ leaf in-reservation-error-messages {
+ type yang:counter64;
+ description
+ "Number of received RSVP Resv Error messages";
+ }
+
+ leaf in-reservation-tear-messages {
+ type yang:counter64;
+ description
+ "Number of received RSVP Resv Tear messages";
+ }
+
+ leaf in-hello-messages {
+ type yang:counter64;
+ description
+ "Number of received RSVP hello messages";
+ }
+
+ leaf in-srefresh-messages {
+ type yang:counter64;
+ description
+ "Number of received RSVP summary refresh messages";
+ }
+
+ leaf in-ack-messages {
+ type yang:counter64;
+ description
+ "Number of received RSVP refresh reduction ack
+ messages";
+ }
+
+ leaf out-path-messages {
+ type yang:counter64;
+ description
+ "Number of sent RSVP PATH messages";
+ }
+
+ leaf out-path-error-messages {
+ type yang:counter64;
+ description
+ "Number of sent RSVP Path Error messages";
+ }
+
+ leaf out-path-tear-messages {
+ type yang:counter64;
+ description
+ "Number of sent RSVP Path Tear messages";
+ }
+
+ leaf out-reservation-messages {
+ type yang:counter64;
+ description
+ "Number of sent RSVP Resv messages";
+ }
+
+ leaf out-reservation-error-messages {
+ type yang:counter64;
+ description
+ "Number of sent RSVP Resv Error messages";
+ }
+
+ leaf out-reservation-tear-messages {
+ type yang:counter64;
+ description
+ "Number of sent RSVP Resv Tear messages";
+ }
+
+ leaf out-hello-messages {
+ type yang:counter64;
+ description
+ "Number of sent RSVP hello messages";
+ }
+
+ leaf out-srefresh-messages {
+ type yang:counter64;
+ description
+ "Number of sent RSVP summary refresh messages";
+ }
+
+ leaf out-ack-messages {
+ type yang:counter64;
+ description
+ "Number of sent RSVP refresh reduction ack messages";
+ }
+ }
+
+ grouping mpls-rsvp-record-route-object-top {
+ description
+ "Top-level structure grouping for list of record route
+ objects.";
+
+ container record-route-objects {
+ description
+ "Enclosing container for MPLS RRO objects associated with the
+ traffic engineered tunnel.";
+
+ list record-route-object {
+ key "index";
+ config false;
+
+ description
+ "Read-only list of record route objects associated with the
+ traffic engineered tunnel. Each entry in the list
+ may contain a hop IP address, MPLS label allocated
+ at the hop, and the flags associated with the entry.";
+
+ leaf index {
+ type leafref {
+ path "../state/index";
+ }
+ description
+ "Reference to the index of the record route object.
+ The index is used to indicate the ordering of hops in
+ the path.";
+ }
+
+ container state {
+ config false;
+
+ description
+ "Information related to RRO objects. The hop, label, and
+ optional flags are present for each entry in the list.";
+
+ uses mpls-rsvp-record-route-object-state;
+ }
+ }
+ }
+ }
+
+ grouping mpls-rsvp-record-route-object-state {
+ description
+ "Grouping to hold information relating to record route
+ objects relevant to a traffic engineering LSP.";
+
+ leaf index {
+ type uint8;
+ description
+ "Index of object in the list. Used for ordering.";
+ }
+
+ leaf address {
+ type inet:ip-address;
+ description
+ "IP router hop for RRO entry";
+ }
+
+ leaf reported-label {
+ type oc-mplst:mpls-label;
+ description
+ "Label reported for RRO hop";
+ }
+
+ leaf reported-flags {
+ type uint8;
+ description
+ "Subobject flags for MPLS label";
+ }
+ }
+
+ grouping mpls-rsvp-explicit-route-object-top {
+ description
+ "Top-level structure for explicit-route objects.";
+
+ container explicit-route-objects {
+ description
+ "Enclosing container for MPLS ERO objects associated
+ with the traffic engineered tunnel.";
+
+ list explicit-route-object {
+ key "index";
+
+ config false;
+
+ description
+ "Read-only list of explicit route objects associated with the
+ traffic-engineered tunnel. Each entry in the list contains
+ a hop IP address, and the MPLS label allocated at the hop.";
+
+ leaf index {
+ type leafref {
+ path "../state/index";
+ }
+ description
+ "Reference to the index of the entry in the explicit route
+ object. The index is used to indicate the ordering of hops
+ in the path.";
+ }
+
+ container state {
+ config false;
+ description
+ "Information related to the ERO index.";
+ uses mpls-rsvp-explicit-route-object-state;
+ }
+ }
+ }
+ }
+
+ grouping mpls-rsvp-explicit-route-object-state {
+ description
+ "Grouping defining information related to an individual hop
+ of an ERO.";
+
+ leaf index {
+ type uint64;
+ description
+ "Index of the entry in the ERO. Entries are ordered in
+ ascending order from the source to destination of the
+ LSP.";
+ }
+
+ leaf loose {
+ type boolean;
+ description
+ "When set to true, indicates that the hop of the ERO is
+ a loose hop within the explicit route. If unset, indicates
+ that the hop must explicitly traverse the entity specified
+ in the ERO hop as the next-entity.";
+ }
+
+ leaf type {
+ type enumeration {
+ enum IPV4 {
+ description
+ "The hop represents an IPv4 prefix.";
+ reference "RFC3209";
+ }
+ enum IPV6 {
+ description
+ "The hop represents an IPv6 prefix.";
+ reference "RFC3209";
+ }
+ enum ASN {
+ description
+ "The hop represents an autonomous system number.";
+ reference "RFC3209";
+ }
+ enum ASN4 {
+ description
+ "The hop represents a 4-byte autonomous system number.";
+ }
+ enum LABEL {
+ description
+ "The hop represents an MPLS label.";
+ reference "RFC3473";
+ }
+ enum UNNUMBERED_INTERFACE {
+ description
+ "The hop represents an unnumbered interface.";
+ reference "RFC3477";
+ }
+ }
+ description
+ "The type of hop indicated by the ERO entry.";
+ }
+
+ leaf ip-prefix {
+ type inet:ip-prefix;
+ description
+ "The IPv4 or IPv6 prefix indicated by the ERO. Specified
+ only when the ERO hop is an IPv4 or IPv6 prefix.";
+ }
+
+ leaf asn {
+ type inet:as-number;
+ description
+ "The autonomous system number indicated by the ERO. Specified
+ only when the ERO hop is an 2 or 4-byte AS number.";
+ }
+
+ leaf label {
+ type oc-mplst:mpls-label;
+ description
+ "The MPLS label specified in the ERO hop. Specified only when
+ the hop is an MPLS label.";
+ }
+
+ leaf interface-id {
+ type uint32;
+ description
+ "The interface ID for an unnumbered interface. Specified only
+ when the ERO hop is a unnumbered interface.";
+ }
+ reference
+ "RFC3477 - Signalling Unnumbered Links in Resource
+ ReSerVation Protocol - Traffic Engineering (RSVP-TE)";
+
+ }
+
+ grouping mpls-rsvp-error-counters {
+ description
+ "Grouping containing definitions of leaves relating to
+ errors in RSVP-TE. This grouping can be used in different
+ contexts - e.g., per-RSVP-TE protocol instance, or per-
+ interface such that the errors represented should
+ correspond to the number of errors that have occurred for
+ the context in which the grouping is used.";
+
+ leaf authentication-fail {
+ type yang:counter64;
+ description
+ "The number of packets received that have failed RSVP-TE
+ authentication checks in the specified context.";
+ }
+
+ leaf bad-checksum {
+ type yang:counter64;
+ description
+ "The number of packets received that have an incorrect RSVP-TE
+ checksum in the context.";
+ }
+
+ leaf bad-packet-format {
+ type yang:counter64;
+ description
+ "The number of packets received that were dropped due to being
+ badly formed in the context.";
+ }
+
+ leaf bad-packet-length {
+ type yang:counter64;
+ description
+ "The number of packets received that were dropped due to having
+ an invalid length specified in the context.";
+ }
+
+ leaf out-of-order {
+ type yang:counter64;
+ description
+ "The number of messages received out of order in the context.";
+ }
+
+ leaf received-nack {
+ type yang:counter64;
+ description
+ "The number of NACK RESV messages received in the context.";
+ }
+
+ leaf transmit-failure {
+ type yang:counter64;
+ description
+ "The total number of packets dropped on transmit in the context.";
+ }
+
+ leaf transmit-queue-full {
+ type yang:counter64;
+ description
+ "The number of packets dropped due to the transmit queue being
+ full in the context.";
+ }
+
+ leaf unknown-ack {
+ type yang:counter64;
+ description
+ "The number of packets received containing an ACK for an unknown
+ message ID in the context.";
+ }
+
+ leaf unknown-nack {
+ type yang:counter64;
+ description
+ "The number of packets received containing a NACK for an unknown
+ message ID in the context.";
+ }
+ }
+
+
+
+ // data definition statements
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-mpls-sr.yang b/src/plugins/yang/openconfig/openconfig-mpls-sr.yang
new file mode 100644
index 0000000..7485b2d
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-mpls-sr.yang
@@ -0,0 +1,138 @@
+module openconfig-mpls-sr {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/mpls-sr";
+
+ prefix "oc-mpls-sr";
+
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "Configuration for MPLS with segment routing-based LSPs,
+ including global parameters, and LSP-specific configuration for
+ both constrained-path and IGP-congruent LSPs";
+
+ oc-ext:openconfig-version "3.0.0";
+
+ revision "2018-07-02" {
+ description
+ "Add new RSVP-TE statistics, remove associated-rsvp-session
+ leaf. Remove use of date-and-time.";
+ reference "3.0.0";
+ }
+
+ revision "2018-06-16" {
+ description
+ "Included attributes for base LDP configuration.";
+ reference "2.6.0";
+ }
+
+ revision "2018-06-13" {
+ description
+ "Add ttl-propagation to global MPLS config";
+ reference "2.5.0";
+ }
+
+ revision "2018-06-05" {
+ description
+ "Fixed bugs in when statements on RSVP-TE attributes";
+ reference "2.4.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "2.4.1";
+ }
+
+ revision "2017-06-21" {
+ description
+ "Add TC bits typedef.";
+ reference "2.4.0";
+ }
+
+ revision "2017-03-22" {
+ description
+ "Add RSVP calculated-absolute-subscription-bw";
+ reference "2.3.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+ reference "2.2.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add additional MPLS parameters";
+ reference "2.1.0";
+ }
+
+ revision "2016-09-01" {
+ description
+ "Revisions based on implementation feedback";
+ reference "2.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "Public release of MPLS models";
+ reference "1.0.1";
+ }
+
+ grouping sr-path-attributes-config {
+ description
+ "Configuration parameters relating to SR-TE LSPs";
+
+ leaf sid-selection-mode {
+ type enumeration {
+ enum ADJ_SID_ONLY {
+ description
+ "The SR-TE tunnel should only use adjacency SIDs
+ to build the SID stack to be pushed for the LSP";
+ }
+ enum MIXED_MODE {
+ description
+ "The SR-TE tunnel can use a mix of adjacency
+ and prefix SIDs to build the SID stack to be pushed
+ to the LSP";
+ }
+ }
+ default MIXED_MODE;
+ description
+ "The restrictions placed on the SIDs to be selected by the
+ calculation method for the explicit path when it is
+ instantiated for a SR-TE LSP";
+ }
+
+ leaf sid-protection-required {
+ type boolean;
+ default "false";
+ description
+ "When this value is set to true, only SIDs that are
+ protected are to be selected by the calculating method
+ when the explicit path is instantiated by a SR-TE LSP.";
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-mpls-static.yang b/src/plugins/yang/openconfig/openconfig-mpls-static.yang
new file mode 100644
index 0000000..493b5f8
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-mpls-static.yang
@@ -0,0 +1,312 @@
+submodule openconfig-mpls-static {
+
+ yang-version "1";
+
+ belongs-to "openconfig-mpls" {
+ prefix "mpls";
+ }
+
+ // import some basic types
+ import openconfig-mpls-types {prefix oc-mplst; }
+ import openconfig-inet-types { prefix inet; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "Defines static LSP configuration";
+
+
+ oc-ext:openconfig-version "3.0.0";
+
+ revision "2018-07-02" {
+ description
+ "Add new RSVP-TE statistics, remove associated-rsvp-session
+ leaf. Remove use of date-and-time.";
+ reference "3.0.0";
+ }
+
+ revision "2018-06-16" {
+ description
+ "Included attributes for base LDP configuration.";
+ reference "2.6.0";
+ }
+
+ revision "2018-06-13" {
+ description
+ "Add ttl-propagation to global MPLS config";
+ reference "2.5.0";
+ }
+
+ revision "2018-06-05" {
+ description
+ "Fixed bugs in when statements on RSVP-TE attributes";
+ reference "2.4.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "2.4.1";
+ }
+
+ revision "2017-06-21" {
+ description
+ "Add TC bits typedef.";
+ reference "2.4.0";
+ }
+
+ revision "2017-03-22" {
+ description
+ "Add RSVP calculated-absolute-subscription-bw";
+ reference "2.3.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+ reference "2.2.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add additional MPLS parameters";
+ reference "2.1.0";
+ }
+
+ revision "2016-09-01" {
+ description
+ "Revisions based on implementation feedback";
+ reference "2.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "Public release of MPLS models";
+ reference "1.0.1";
+ }
+
+ // grouping statements
+
+ grouping static-lsp-common-config {
+ description
+ "common definitions for static LSPs";
+
+ leaf next-hop {
+ type inet:ip-address;
+ description
+ "next hop IP address for the LSP";
+ }
+
+ leaf incoming-label {
+ type oc-mplst:mpls-label;
+ description
+ "label value on the incoming packet";
+ }
+
+ leaf push-label {
+ type oc-mplst:mpls-label;
+ description
+ "label value to push at the current hop for the
+ LSP";
+ }
+ }
+
+ grouping static-lsp-ingress-config {
+ description
+ "Configuration data for ingress LSPs";
+
+ uses static-lsp-common-config;
+ }
+
+ grouping static-lsp-ingress-state {
+ description
+ "Operational state data for ingress LSPs";
+ }
+
+ grouping static-lsp-ingress-top {
+ description
+ "Top-level grouping for ingress LSP data";
+
+ container ingress {
+ description
+ "Static LSPs for which the router is an
+ ingress node";
+
+ container config {
+ description
+ "Configuration data for ingress LSPs";
+
+ uses static-lsp-ingress-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for ingress LSPs";
+
+ uses static-lsp-ingress-config;
+ uses static-lsp-ingress-state;
+ }
+ }
+ }
+
+ grouping static-lsp-transit-config {
+ description
+ "Configuration data for transit LSPs";
+
+ uses static-lsp-common-config;
+ }
+
+ grouping static-lsp-transit-state {
+ description
+ "Operational state data for transit LSPs";
+ }
+
+ grouping static-lsp-transit-top {
+ description
+ "Top-level grouping for transit LSP data";
+
+ container transit {
+ description
+ "Static LSPs for which the router is an
+ transit node";
+
+ container config {
+ description
+ "Configuration data for transit LSPs";
+
+ uses static-lsp-transit-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for transit LSPs";
+
+ uses static-lsp-transit-config;
+ uses static-lsp-transit-state;
+ }
+ }
+ }
+
+ grouping static-lsp-egress-config {
+ description
+ "Configuration data for egress LSPs";
+
+ uses static-lsp-common-config;
+ }
+
+ grouping static-lsp-egress-state {
+ description
+ "Operational state data for egress LSPs";
+ }
+
+ grouping static-lsp-egress-top {
+ description
+ "Top-level grouping for egress LSP data";
+
+ container egress {
+ description
+ "Static LSPs for which the router is an
+ egress node";
+
+ container config {
+ description
+ "Configuration data for egress LSPs";
+
+ uses static-lsp-egress-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for egress LSPs";
+
+ uses static-lsp-egress-config;
+ uses static-lsp-egress-state;
+ }
+ }
+ }
+
+ grouping static-lsp-config {
+ description
+ "Configuration data for static LSPs";
+
+ leaf name {
+ type string;
+ description
+ "name to identify the LSP";
+ }
+ }
+
+ grouping static-lsp-state {
+ description
+ "Operational state data for static LSPs";
+
+ }
+
+ grouping static-lsp-top {
+ description
+ "grouping for top level list of static LSPs";
+
+
+ list static-lsp {
+ key "name";
+ description
+ "list of defined static LSPs";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference the name list key";
+ }
+
+ container config {
+ description
+ "Configuration data for the static lsp";
+
+ uses static-lsp-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for the static lsp";
+
+ uses static-lsp-config;
+ uses static-lsp-state;
+
+ }
+
+ // TODO: separation into ingress, transit, egress may help
+ // to figure out what exactly is configured, but need to
+ // consider whether implementations can support the
+ // separation
+ uses static-lsp-ingress-top;
+ uses static-lsp-transit-top;
+ uses static-lsp-egress-top;
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-mpls-te.yang b/src/plugins/yang/openconfig/openconfig-mpls-te.yang
new file mode 100644
index 0000000..e5142f1
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-mpls-te.yang
@@ -0,0 +1,1381 @@
+submodule openconfig-mpls-te {
+
+ yang-version "1";
+
+ belongs-to "openconfig-mpls" {
+ prefix "oc-mpls";
+ }
+
+
+ // import some basic types
+ import openconfig-inet-types { prefix inet; }
+ import openconfig-mpls-rsvp { prefix oc-rsvp; }
+ import openconfig-mpls-sr { prefix oc-sr; }
+ import openconfig-mpls-types {prefix oc-mplst; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-yang-types { prefix yang; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "Configuration related to constrained-path LSPs and traffic
+ engineering. These definitions are not specific to a particular
+ signaling protocol or mechanism (see related submodules for
+ signaling protocol-specific configuration).";
+
+ oc-ext:openconfig-version "3.0.0";
+
+ revision "2018-07-02" {
+ description
+ "Add new RSVP-TE statistics, remove associated-rsvp-session
+ leaf. Remove use of date-and-time.";
+ reference "3.0.0";
+ }
+
+ revision "2018-06-16" {
+ description
+ "Included attributes for base LDP configuration.";
+ reference "2.6.0";
+ }
+
+ revision "2018-06-13" {
+ description
+ "Add ttl-propagation to global MPLS config";
+ reference "2.5.0";
+ }
+
+ revision "2018-06-05" {
+ description
+ "Fixed bugs in when statements on RSVP-TE attributes";
+ reference "2.4.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "2.4.1";
+ }
+
+ revision "2017-06-21" {
+ description
+ "Add TC bits typedef.";
+ reference "2.4.0";
+ }
+
+ revision "2017-03-22" {
+ description
+ "Add RSVP calculated-absolute-subscription-bw";
+ reference "2.3.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+ reference "2.2.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add additional MPLS parameters";
+ reference "2.1.0";
+ }
+
+ revision "2016-09-01" {
+ description
+ "Revisions based on implementation feedback";
+ reference "2.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "Public release of MPLS models";
+ reference "1.0.1";
+ }
+
+ // typedef statements
+
+ typedef te-bandwidth-type {
+ type enumeration {
+ enum SPECIFIED {
+ description
+ "Bandwidth is explicitly specified";
+ }
+ enum AUTO {
+ description
+ "Bandwidth is automatically computed";
+ }
+ }
+ description
+ "enumerated type for specifying whether bandwidth is
+ explicitly specified or automatically computed";
+ }
+
+ typedef mpls-srlg-flooding-type {
+ type enumeration {
+ enum FLOODED_SRLG {
+ description
+ "SRLG is flooded in the IGP";
+ }
+ enum STATIC_SRLG {
+ description
+ "SRLG is not flooded, the members are
+ statically configured";
+ }
+ }
+ description
+ "Enumerated bype for specifying how the SRLG is flooded";
+ }
+
+ typedef mpls-hop-type {
+ type enumeration {
+ enum LOOSE {
+ description
+ "loose hop in an explicit path";
+ }
+ enum STRICT {
+ description
+ "strict hop in an explicit path";
+ }
+ }
+ description
+ "enumerated type for specifying loose or strict
+ paths";
+ }
+
+ typedef te-metric-type {
+ type union {
+ type enumeration {
+ enum IGP {
+ description
+ "set the LSP metric to track the underlying
+ IGP metric";
+ }
+ }
+ type uint32;
+ }
+ description
+ "union type for setting the LSP TE metric to a
+ static value, or to track the IGP metric";
+ }
+
+ typedef cspf-tie-breaking {
+ type enumeration {
+ enum RANDOM {
+ description
+ "CSPF calculation selects a random path among
+ multiple equal-cost paths to the destination";
+ }
+ enum LEAST_FILL {
+ description
+ "CSPF calculation selects the path with greatest
+ available bandwidth";
+ }
+ enum MOST_FILL {
+ description
+ "CSPF calculation selects the path with the least
+ available bandwidth";
+ }
+ }
+ default RANDOM;
+ description
+ "type to indicate the CSPF selection policy when
+ multiple equal cost paths are available";
+ }
+
+
+ // grouping statements
+
+ grouping te-tunnel-reoptimize-config {
+ description
+ "Definition for reoptimize timer configuration";
+
+ leaf reoptimize-timer {
+ type uint16;
+ units seconds;
+ description
+ "frequency of reoptimization of
+ a traffic engineered LSP";
+ }
+ }
+
+ grouping te-lsp-auto-bandwidth-config {
+ description
+ "Configuration parameters related to autobandwidth";
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "enables mpls auto-bandwidth on the
+ lsp";
+ }
+
+ leaf min-bw {
+ type oc-mplst:bandwidth-kbps;
+ description
+ "set the minimum bandwidth in Kbps for an
+ auto-bandwidth LSP";
+ }
+
+ leaf max-bw {
+ type oc-mplst:bandwidth-kbps;
+ description
+ "set the maximum bandwidth in Kbps for an
+ auto-bandwidth LSP";
+ }
+
+ leaf adjust-interval {
+ type uint32;
+ description
+ "time in seconds between adjustments to
+ LSP bandwidth";
+ }
+
+ leaf adjust-threshold {
+ type oc-types:percentage;
+ description
+ "percentage difference between the LSP's
+ specified bandwidth and its current bandwidth
+ allocation -- if the difference is greater than the
+ specified percentage, auto-bandwidth adjustment is
+ triggered";
+ }
+ }
+
+ grouping te-lsp-auto-bandwidth-state {
+ description
+ "Operational state parameters relating to auto-bandwidth";
+
+ leaf interval-high-bw {
+ type oc-mplst:bandwidth-kbps;
+ description
+ "The maximum measured bandwidth during the current
+ auto-bandwidth adjust interval expressed in kilobits
+ per second.";
+ }
+ }
+
+ grouping te-lsp-overflow-config {
+ description
+ "configuration for mpls lsp bandwidth
+ overflow adjustment";
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "enables mpls lsp bandwidth overflow
+ adjustment on the lsp";
+ }
+
+ leaf overflow-threshold {
+ type oc-types:percentage;
+ description
+ "bandwidth percentage change to trigger
+ an overflow event";
+
+ }
+
+ leaf trigger-event-count {
+ type uint16;
+ description
+ "number of consecutive overflow sample
+ events needed to trigger an overflow adjustment";
+ }
+ }
+
+ grouping te-lsp-underflow-config {
+ description
+ "configuration for mpls lsp bandwidth
+ underflow adjustment";
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "enables bandwidth underflow
+ adjustment on the lsp";
+ }
+
+ leaf underflow-threshold {
+ type oc-types:percentage;
+ description
+ "bandwidth percentage change to trigger
+ and underflow event";
+ }
+
+ leaf trigger-event-count {
+ type uint16;
+ description
+ "number of consecutive underflow sample
+ events needed to trigger an underflow adjustment";
+ }
+ }
+
+ grouping te-path-placement-constraints-config {
+ description
+ "Configuration data for link affinities";
+
+ leaf-list exclude-group {
+ type leafref {
+ path "../../../../../../../../../../te-global-attributes" +
+ "/mpls-admin-groups/admin-group/admin-group-name";
+ }
+ description
+ "list of references to named admin-groups to exclude in
+ path calculation.";
+ }
+
+ leaf-list include-all-group {
+ type leafref {
+ path "../../../../../../../../../../te-global-attributes" +
+ "/mpls-admin-groups/admin-group/admin-group-name";
+ }
+ description
+ "list of references to named admin-groups of which all must
+ be included";
+ }
+
+ leaf-list include-any-group {
+ type leafref {
+ path "../../../../../../../../../../te-global-attributes" +
+ "/mpls-admin-groups/admin-group/admin-group-name";
+ }
+ description
+ "list of references to named admin-groups of which one must
+ be included";
+ }
+ }
+
+ grouping te-path-placement-constraints-state {
+ description
+ "Operational state data for link affinities";
+ //TODO: currently a placeholder
+ }
+
+ grouping te-path-placement-constraints-top {
+ description
+ "Top-level grouping ";
+
+ container admin-groups {
+ description
+ "Top-level container for include/exclude constraints for
+ link affinities";
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses te-path-placement-constraints-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses te-path-placement-constraints-config;
+ uses te-path-placement-constraints-state;
+ }
+ }
+ }
+
+ grouping te-tunnel-protection-config {
+ description
+ "Configuration parameters related to LSP
+ protection";
+ leaf protection-style-requested {
+ type identityref {
+ base oc-mplst:PROTECTION_TYPE;
+ }
+ default oc-mplst:UNPROTECTED;
+ description
+ "style of mpls frr protection desired: can be
+ link, link-node or unprotected.";
+ }
+ }
+
+ grouping explicit-route-subobject-config {
+ description
+ "The explicit route subobject grouping";
+
+ leaf address {
+ type inet:ip-address;
+ description
+ "router hop for the LSP path";
+ }
+
+ leaf hop-type {
+ type mpls-hop-type;
+ description
+ "strict or loose hop";
+ }
+
+ leaf index {
+ type uint8 {
+ range "0..255";
+ }
+ description
+ "Index of this explicit route object to express
+ the order of hops in the path";
+ }
+
+ }
+
+ grouping named-explicit-path-config {
+ description
+ "Configuration parameters relating to a named
+ explicit path";
+
+ leaf name {
+ type string;
+ description
+ "A string name that uniquely identifies an explicit
+ path";
+ }
+ }
+
+ // Explicit paths config somewhat following the IETF model
+ grouping explicit-paths-top {
+ description
+ "Top level global explicit path configuration
+ grouping";
+
+ container named-explicit-paths {
+ description
+ "Enclosing container for the named explicit paths";
+ list named-explicit-path {
+ key "name";
+ description
+ "A list of explicit paths";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "A string name that uniquely identifies
+ an explicit path";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to named explicit
+ paths";
+ uses named-explicit-path-config;
+ uses oc-sr:sr-path-attributes-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the named
+ explicit paths";
+ uses named-explicit-path-config;
+ uses oc-sr:sr-path-attributes-config;
+ }
+
+ container explicit-route-objects {
+ description
+ "Enclosing container for EROs";
+
+ list explicit-route-object {
+ key "index";
+ description
+ "List of explicit route objects";
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+
+ description
+ "Index of this explicit route object,
+ to express the order of hops in path";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to an explicit
+ route";
+ uses explicit-route-subobject-config;
+ }
+
+
+ container state {
+ config false;
+ description
+ "State parameters relating to an explicit route";
+ uses explicit-route-subobject-config;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ grouping mpls-te-srlg-config {
+ description
+ "Configuration of various attributes associated
+ with the SRLG";
+
+ leaf name {
+ type string;
+ description
+ "SRLG group identifier";
+ }
+
+ leaf value {
+ type uint32;
+ description
+ "group ID for the SRLG";
+ }
+
+ leaf cost {
+ type uint32;
+ description
+ "The cost of the SRLG to the computation
+ algorithm";
+ }
+
+ leaf flooding-type {
+ type mpls-srlg-flooding-type;
+ default FLOODED_SRLG;
+ description
+ "The type of SRLG, either flooded in the IGP or
+ statically configured";
+ }
+ }
+
+ grouping mpls-te-srlg-members-config {
+ description
+ "Configuration of the membership of the SRLG";
+
+ leaf from-address {
+ type inet:ip-address;
+ description
+ "IP address of the a-side of the SRLG link";
+ }
+
+ leaf to-address {
+ type inet:ip-address;
+ description
+ "IP address of the z-side of the SRLG link";
+ }
+ }
+
+ grouping mpls-te-srlg-top {
+ description
+ "Top level grouping for MPLS shared
+ risk link groups.";
+
+ container srlgs {
+ description
+ "Shared risk link groups attributes";
+ list srlg {
+ key "name";
+ description
+ "List of shared risk link groups";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ // Requires YANG 1.1
+ //require-instance true;
+ }
+ description
+ "The SRLG group identifier";
+ }
+
+ container config {
+ description
+ "Configuration parameters related to the SRLG";
+ uses mpls-te-srlg-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters related to the SRLG";
+ uses mpls-te-srlg-config;
+ }
+
+ container static-srlg-members {
+ when "../config/flooding-type = 'STATIC_SRLG'" {
+ description
+ "Include this container for static
+ SRLG specific configuration";
+ }
+ description
+ "SRLG members for static (not flooded) SRLGs ";
+
+ list members-list {
+ key "from-address";
+ description
+ "List of SRLG members, which are expressed
+ as IP address endpoints of links contained in the
+ SRLG";
+
+ leaf from-address {
+ type leafref {
+ path "../config/from-address";
+ // Requires YANG 1.1
+ //require-instance true;
+ }
+ description
+ "The from address of the link in the SRLG";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the
+ SRLG members";
+ uses mpls-te-srlg-members-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to the SRLG
+ members";
+ uses mpls-te-srlg-members-config;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ grouping te-global-tunnel-config {
+ description
+ "Configuration parameters relevant to a single
+ traffic engineered tunnel.";
+
+ leaf name {
+ type string;
+ description
+ "The tunnel name";
+ }
+
+ leaf type {
+ type identityref {
+ base oc-mplst:TUNNEL_TYPE;
+ }
+ description
+ "Tunnel type, p2p or p2mp";
+ }
+
+ leaf signaling-protocol {
+ type identityref {
+ base oc-mplst:PATH_SETUP_PROTOCOL;
+ }
+ description
+ "Signaling protocol used to set up this tunnel";
+ }
+
+ leaf description {
+ type string;
+ description
+ "optional text description for the tunnel";
+ }
+
+ leaf admin-status {
+ type identityref {
+ base oc-mplst:TUNNEL_ADMIN_STATUS;
+ }
+ default oc-mplst:ADMIN_UP;
+ description
+ "TE tunnel administrative state.";
+ }
+
+ leaf preference {
+ type uint8 {
+ range "1..255";
+ }
+ description
+ "Specifies a preference for this tunnel.
+ A lower number signifies a better preference";
+ }
+
+ leaf metric-type {
+ type identityref {
+ base oc-mplst:LSP_METRIC_TYPE;
+ }
+ default oc-mplst:LSP_METRIC_INHERITED;
+ description
+ "The type of metric specification that should be used to set
+ the LSP(s) metric";
+ }
+
+ leaf metric {
+ type int32;
+ description
+ "The value of the metric that should be specified. The value
+ supplied in this leaf is used in conjunction with the metric
+ type to determine the value of the metric used by the system.
+ Where the metric-type is set to LSP_METRIC_ABSOLUTE - the
+ value of this leaf is used directly; where it is set to
+ LSP_METRIC_RELATIVE, the relevant (positive or negative)
+ offset is used to formulate the metric; where metric-type
+ is LSP_METRIC_INHERITED, the value of this leaf is not
+ utilised";
+ }
+
+ leaf shortcut-eligible {
+ type boolean;
+ default "true";
+ description
+ "Whether this LSP is considered to be eligible for us as a
+ shortcut in the IGP. In the case that this leaf is set to
+ true, the IGP SPF calculation uses the metric specified to
+ determine whether traffic should be carried over this LSP";
+ }
+
+ leaf protection-style-requested {
+ type identityref {
+ base oc-mplst:PROTECTION_TYPE;
+ }
+ default oc-mplst:UNPROTECTED;
+ description
+ "style of mpls frr protection desired: can be
+ link, link-node or unprotected.";
+ }
+
+ uses te-tunnel-reoptimize-config;
+ uses oc-rsvp:rsvp-p2p-tunnel-attributes-config;
+
+ }
+
+ grouping tunnel-p2p-attributes-config {
+ description
+ "Configuration related to p2p LSPs";
+ leaf destination {
+ type inet:ip-address;
+ description
+ "P2P tunnel destination address";
+ }
+ }
+
+ grouping p2p-path-state {
+ description
+ "Operational state parameters for p2p paths";
+
+ leaf-list associated-rsvp-sessions {
+ type leafref {
+ path "../../../../../../../../../signaling-protocols/" +
+ "rsvp-te/sessions/session/local-index";
+ }
+ description
+ "If the signalling protocol specified for this path is
+ RSVP-TE, this leaf-list provides a reference to the associated
+ sessions within the RSVP-TE protocol sessions list, such
+ that details of the signaling can be retrieved. More than
+ one session may exist during re-signalling such as
+ make-before-break.";
+ }
+
+ leaf spf-metric {
+ type uint64;
+ description
+ "The IGP metric of the shortest path to the LSP destination.
+ This value is used to compare the current metric of the
+ constrained path to the shortest path that is available in
+ the network topology.";
+ }
+
+ leaf cspf-metric {
+ type uint64;
+ description
+ "The IGP metric of the path currently used by the LSP.
+ This value is used to represent the metric of the path
+ used by the LSP following the execution of the CSPF
+ algorithm and signalling of the LSP.";
+ }
+ }
+
+ grouping p2p-path-config {
+ description
+ "Configuration parameters for p2p paths";
+
+ leaf name {
+ type string;
+ description
+ "Path name";
+ }
+
+ leaf path-computation-method {
+ type identityref {
+ base oc-mplst:PATH_COMPUTATION_METHOD;
+ }
+ default oc-mplst:LOCALLY_COMPUTED;
+ description
+ "The method used for computing the path, either
+ locally computed, queried from a server or not
+ computed at all (explicitly configured).";
+ }
+
+ leaf use-cspf {
+ when "../path-computation-method = 'LOCALLY_COMPUTED'" {
+ description
+ "The use of cspf when the path-computation method is
+ local computation";
+ }
+ type boolean;
+ description
+ "Flag to enable CSPF for locally computed LSPs";
+ }
+
+ leaf cspf-tiebreaker {
+ when "../path-computation-method = 'LOCALLY_COMPUTED'" {
+ description
+ "The cspf tiebreaking method when the path is
+ locally computed";
+ }
+ type cspf-tie-breaking;
+ description
+ "Determine the tie-breaking method to choose between
+ equally desirable paths during CSFP computation";
+ }
+
+
+ leaf path-computation-server {
+ when "../path-computation-method = 'EXTERNALLY_QUERIED'" {
+ description
+ "The path-computation server when the path is
+ externally queried";
+ }
+ type inet:ip-address;
+ description
+ "Address of the external path computation
+ server";
+ }
+
+ leaf explicit-path-name {
+ when "../path-computation-method = 'EXPLICITLY_DEFINED'" {
+ description
+ "The name of the explicitly defined path used";
+ }
+
+ type leafref {
+ path "../../../../../../../"
+ + "named-explicit-paths/named-explicit-path/"
+ + "config/name";
+ // Requires YANG 1.1
+ //require-instance true;
+ }
+ description
+ "reference to a defined path";
+ }
+
+ leaf preference {
+ type uint8 {
+ range "1..255";
+ }
+ description
+ "Specifies a preference for this path. The lower the
+ number higher the preference";
+ }
+
+ uses oc-rsvp:rsvp-p2p-path-attributes-config;
+ }
+
+
+ grouping te-tunnel-p2p-top {
+ description
+ "Top level grouping for p2p configuration";
+
+ container p2p-tunnel-attributes {
+ when "../config/type = 'P2P'" {
+ description
+ "Include this container for LSPs of type P2P";
+ }
+ description
+ "Parameters related to LSPs of type P2P";
+
+ container config {
+ description
+ "Configuration parameters for P2P LSPs";
+ uses tunnel-p2p-attributes-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters for P2P LSPs";
+ uses tunnel-p2p-attributes-config;
+ }
+
+ uses p2p-primary-paths-top;
+ uses p2p-secondary-paths-top;
+ }
+ }
+
+
+ grouping te-tunnel-state {
+ description
+ "Counters and statistical data relevent to a single
+ tunnel.";
+
+ leaf oper-status {
+ type identityref {
+ base oc-mplst:LSP_OPER_STATUS;
+ }
+ description
+ "The operational status of the TE tunnel";
+ }
+
+ leaf role {
+ type identityref {
+ base oc-mplst:LSP_ROLE;
+ }
+ description
+ "The lsp role at the current node, whether it is headend,
+ transit or tailend.";
+ }
+
+ leaf auto-generated {
+ type boolean;
+ description
+ "If the LSP was auto-generated by the system this leaf
+ should be set to true. Examples of auto-generated LSPs
+ are dynamically created backup LSPs to meet a FRR
+ policy.";
+ }
+
+ container counters {
+ description
+ "State data for MPLS label switched paths. This state
+ data is specific to a single label switched path.";
+
+ leaf bytes {
+ type yang:counter64;
+ description
+ "Number of bytes that have been forwarded over the
+ label switched path.";
+ }
+
+ leaf packets {
+ type yang:counter64;
+ description
+ "Number of pacets that have been forwarded over the
+ label switched path.";
+ }
+
+ leaf path-changes {
+ type yang:counter64;
+ description
+ "Number of path changes for the label switched path";
+ }
+
+ leaf state-changes {
+ type yang:counter64;
+ description
+ "Number of state changes for the label switched path";
+ }
+
+ leaf online-time {
+ type oc-types:timeticks64;
+ description
+ "Indication of the time the label switched path
+ transitioned to an Oper Up or in-service state.
+
+ The value is the timestamp in nanoseconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+
+ leaf current-path-time {
+ type oc-types:timeticks64;
+ description
+ "Indicates the time the LSP switched onto its
+ current path. The value is reset upon a LSP path
+ change.
+
+ The value is the timestamp in nanoseconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+
+ }
+
+ leaf next-reoptimization-time {
+ type oc-types:timeticks64;
+ description
+ "Indicates the next scheduled time the LSP
+ will be reoptimized.
+
+ The value is the timestamp in nanoseconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+
+ }
+ }
+ }
+
+ grouping te-tunnel-bandwidth-config {
+ description
+ "Configuration parameters related to bandwidth for a tunnel";
+
+ leaf specification-type {
+ type te-bandwidth-type;
+ default SPECIFIED;
+ description
+ "The method used for settign the bandwidth, either explicitly
+ specified or configured";
+ }
+
+ leaf set-bandwidth {
+ when "../specification-type = 'SPECIFIED'" {
+ description
+ "The bandwidth value when bandwidth is explicitly
+ specified";
+ }
+ type oc-mplst:bandwidth-kbps;
+ description
+ "set bandwidth explicitly, e.g., using
+ offline calculation";
+ }
+ }
+
+ grouping te-tunnel-bandwidth-state {
+ description
+ "Operational state parameters relating to bandwidth for a tunnel";
+
+ leaf signaled-bandwidth {
+ type oc-mplst:bandwidth-kbps;
+ description
+ "The currently signaled bandwidth of the LSP. In the case where
+ the bandwidth is specified explicitly, then this will match the
+ value of the set-bandwidth leaf; in cases where the bandwidth is
+ dynamically computed by the system, the current value of the
+ bandwidth should be reflected.";
+ }
+ }
+
+ grouping te-tunnel-bandwidth-top {
+ description
+ "Top level grouping for specifying bandwidth for a tunnel";
+
+ container bandwidth {
+ description
+ "Bandwidth configuration for TE LSPs";
+
+ container config {
+ description
+ "Configuration parameters related to bandwidth on TE
+ tunnels:";
+ uses te-tunnel-bandwidth-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters related to bandwidth
+ configuration of TE tunnels";
+ uses te-tunnel-bandwidth-config;
+ uses te-tunnel-bandwidth-state;
+ }
+
+ container auto-bandwidth {
+ when "../config/specification-type = 'AUTO'" {
+ description
+ "Include this container for auto bandwidth
+ specific configuration";
+ }
+ description
+ "Parameters related to auto-bandwidth";
+
+ container config {
+ description
+ "Configuration parameters relating to MPLS
+ auto-bandwidth on the tunnel.";
+ uses te-lsp-auto-bandwidth-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to MPLS
+ auto-bandwidth on the tunnel.";
+ uses te-lsp-auto-bandwidth-config;
+ uses te-lsp-auto-bandwidth-state;
+ }
+
+ container overflow {
+ description
+ "configuration of MPLS overflow bandwidth
+ adjustement for the LSP";
+
+ container config {
+ description
+ "Config information for MPLS overflow bandwidth
+ adjustment";
+ uses te-lsp-overflow-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Config information for MPLS overflow bandwidth
+ adjustment";
+ uses te-lsp-overflow-config;
+ }
+ }
+
+ container underflow {
+ description
+ "configuration of MPLS underflow bandwidth
+ adjustement for the LSP";
+
+ container config {
+ description
+ "Config information for MPLS underflow bandwidth
+ adjustment";
+ uses te-lsp-underflow-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information for MPLS underflow bandwidth
+ adjustment";
+ uses te-lsp-underflow-config;
+ }
+ }
+ }
+ }
+ }
+
+ grouping p2p-path-candidate-secondary-path-config {
+ description
+ "Configuration parameters relating to a secondary path which
+ is a candidate for a particular primary path";
+
+ leaf secondary-path {
+ type leafref {
+ path "../../../../../../p2p-secondary-paths/" +
+ "p2p-secondary-path/config/name";
+ }
+ description
+ "A reference to the secondary path that should be utilised
+ when the containing primary path option is in use";
+ }
+
+ leaf priority {
+ type uint16;
+ description
+ "The priority of the specified secondary path option. Higher
+ priority options are less preferable - such that a secondary
+ path reference with a priority of 0 is the most preferred";
+ }
+ }
+
+ grouping p2p-path-candidate-secondary-path-state {
+ description
+ "Operational state parameters relating to a secondary path
+ which is a candidate for a particular primary path";
+
+ leaf active {
+ type boolean;
+ description
+ "Indicates the current active path option that has
+ been selected of the candidate secondary paths";
+ }
+ }
+
+ grouping p2p-primary-paths-top {
+ description
+ "Top level grouping for p2p primary paths";
+
+ container p2p-primary-path {
+ description
+ "Primary paths associated with the LSP";
+
+ list p2p-primary-path {
+ key "name";
+ description
+ "List of p2p primary paths for a tunnel";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ // Requires YANG 1.1
+ //require-instance true;
+ }
+ description
+ "Path name";
+ }
+
+ container config {
+ description
+ "Configuration parameters related to paths";
+ uses p2p-path-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters related to paths";
+ uses p2p-path-config;
+ uses p2p-path-state;
+ }
+
+ container candidate-secondary-paths {
+ description
+ "The set of candidate secondary paths which may be used
+ for this primary path. When secondary paths are specified
+ in the list the path of the secondary LSP in use must be
+ restricted to those path options referenced. The
+ priority of the secondary paths is specified within the
+ list. Higher priority values are less preferred - that is
+ to say that a path with priority 0 is the most preferred
+ path. In the case that the list is empty, any secondary
+ path option may be utilised when the current primary path
+ is in use.";
+
+ list candidate-secondary-path {
+ key "secondary-path";
+
+ description
+ "List of secondary paths which may be utilised when the
+ current primary path is in use";
+
+ leaf secondary-path {
+ type leafref {
+ path "../config/secondary-path";
+ }
+ description
+ "A reference to the secondary path option reference
+ which acts as the key of the candidate-secondary-path
+ list";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the candidate
+ secondary path";
+
+ uses p2p-path-candidate-secondary-path-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the candidate
+ secondary path";
+
+ uses p2p-path-candidate-secondary-path-config;
+ uses p2p-path-candidate-secondary-path-state;
+ }
+ }
+ }
+
+ uses te-path-placement-constraints-top;
+
+ }
+ }
+ }
+
+ grouping p2p-secondary-paths-top {
+ description
+ "Top level grouping for p2p secondary paths";
+
+ container p2p-secondary-paths {
+ description
+ "Secondary paths for the LSP";
+
+ list p2p-secondary-path {
+ key "name";
+ description
+ "List of p2p primary paths for a tunnel";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ // Requires YANG 1.1
+ //require-instance true;
+ }
+ description
+ "Path name";
+ }
+
+ container config {
+ description
+ "Configuration parameters related to paths";
+ uses p2p-path-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters related to paths";
+ uses p2p-path-config;
+ uses p2p-path-state;
+ }
+
+ uses te-path-placement-constraints-top;
+ }
+ }
+ }
+
+ grouping te-tunnels-top {
+ description
+ "Top level grouping for TE tunnels";
+
+ container tunnels {
+ description
+ "Enclosing container for tunnels";
+ list tunnel {
+ key "name";
+ description
+ "List of TE tunnels. This list contains only the LSPs that the
+ current device originates (i.e., for which it is the head-end).
+ Where the signaling protocol utilised for an LSP allows a mid-point
+ or tail device to be aware of the LSP (e.g., RSVP-TE), then the
+ associated sessions are maintained per protocol";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ // Requires YANG 1.1
+ //require-instance true;
+ }
+ description
+ "The tunnel name";
+ }
+
+ container config {
+ description
+ "Configuration parameters related to TE tunnels:";
+ uses te-global-tunnel-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters related to TE tunnels";
+ uses te-global-tunnel-config;
+ uses te-tunnel-state;
+
+ }
+
+ uses te-tunnel-bandwidth-top;
+ uses te-tunnel-p2p-top;
+ // TODO - add the p2mp configuration
+ }
+ }
+ }
+
+// data definition statements
+
+// augment statements
+
+// rpc statements
+
+// notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-mpls-types.yang b/src/plugins/yang/openconfig/openconfig-mpls-types.yang
new file mode 100644
index 0000000..18d3816
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-mpls-types.yang
@@ -0,0 +1,426 @@
+module openconfig-mpls-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/mpls-types";
+
+ prefix "oc-mpls-types";
+
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "General types for MPLS / TE data model";
+
+ oc-ext:openconfig-version "3.0.0";
+
+ revision "2018-07-02" {
+ description
+ "Add new RSVP-TE statistics, remove associated-rsvp-session
+ leaf. Remove use of date-and-time.";
+ reference "3.0.0";
+ }
+
+ revision "2018-06-16" {
+ description
+ "Included attributes for base LDP configuration.";
+ reference "2.6.0";
+ }
+
+ revision "2018-06-13" {
+ description
+ "Add ttl-propagation to global MPLS config";
+ reference "2.5.0";
+ }
+
+ revision "2018-06-05" {
+ description
+ "Fixed bugs in when statements on RSVP-TE attributes";
+ reference "2.4.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "2.4.1";
+ }
+
+ revision "2017-06-21" {
+ description
+ "Add TC bits typedef.";
+ reference "2.4.0";
+ }
+
+ revision "2017-03-22" {
+ description
+ "Add RSVP calculated-absolute-subscription-bw";
+ reference "2.3.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+ reference "2.2.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add additional MPLS parameters";
+ reference "2.1.0";
+ }
+
+ revision "2016-09-01" {
+ description
+ "Revisions based on implementation feedback";
+ reference "2.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "Public release of MPLS models";
+ reference "1.0.1";
+ }
+
+ // identity statements
+
+ identity PATH_COMPUTATION_METHOD {
+ description
+ "base identity for supported path computation
+ mechanisms";
+ }
+
+ identity LOCALLY_COMPUTED {
+ base PATH_COMPUTATION_METHOD;
+ description
+ "indicates a constrained-path LSP in which the
+ path is computed by the local LER";
+ }
+
+ identity EXTERNALLY_QUERIED {
+ base PATH_COMPUTATION_METHOD;
+ description
+ "Constrained-path LSP in which the path is
+ obtained by querying an external source, such as a PCE server.
+ In the case that an LSP is defined to be externally queried, it may
+ also have associated explicit definitions (which are provided to the
+ external source to aid computation); and the path that is returned by
+ the external source is not required to provide a wholly resolved
+ path back to the originating system - that is to say, some local
+ computation may also be required";
+ }
+
+ identity EXPLICITLY_DEFINED {
+ base PATH_COMPUTATION_METHOD;
+ description
+ "constrained-path LSP in which the path is
+ explicitly specified as a collection of strict or/and loose
+ hops";
+ }
+
+
+ // using identities rather than enum types to simplify adding new
+ // signaling protocols as they are introduced and supported
+ identity PATH_SETUP_PROTOCOL {
+ description
+ "base identity for supported MPLS signaling
+ protocols";
+ }
+
+ identity PATH_SETUP_RSVP {
+ base PATH_SETUP_PROTOCOL;
+ description
+ "RSVP-TE signaling protocol";
+ }
+
+ identity PATH_SETUP_SR {
+ base PATH_SETUP_PROTOCOL;
+ description
+ "Segment routing";
+ }
+
+ identity PATH_SETUP_LDP {
+ base PATH_SETUP_PROTOCOL;
+ description
+ "LDP - RFC 5036";
+ }
+
+
+ identity PROTECTION_TYPE {
+ description
+ "base identity for protection type";
+ }
+
+ identity UNPROTECTED {
+ base PROTECTION_TYPE;
+ description
+ "no protection is desired";
+ }
+
+ identity LINK_PROTECTION_REQUIRED {
+ base PROTECTION_TYPE;
+ description
+ "link protection is desired";
+ }
+
+ identity LINK_NODE_PROTECTION_REQUESTED {
+ base PROTECTION_TYPE;
+ description
+ "node and link protection are both desired";
+ }
+
+ identity LSP_ROLE {
+ description
+ "Base identity for describing the role of
+ label switched path at the current node";
+ }
+
+ identity INGRESS {
+ base LSP_ROLE;
+ description
+ "Label switched path is an ingress (headend)
+ LSP";
+ }
+
+ identity EGRESS {
+ base LSP_ROLE;
+ description
+ "Label switched path is an egress (tailend)
+ LSP";
+ }
+
+ identity TRANSIT {
+ base LSP_ROLE;
+ description
+ "Label switched path is a transit LSP";
+ }
+
+
+ identity TUNNEL_TYPE {
+ description
+ "Base identity from which specific tunnel types are
+ derived.";
+ }
+
+ identity P2P {
+ base TUNNEL_TYPE;
+ description
+ "TE point-to-point tunnel type.";
+ }
+
+ identity P2MP {
+ base TUNNEL_TYPE;
+ description
+ "TE point-to-multipoint tunnel type.";
+ }
+
+
+ identity LSP_OPER_STATUS {
+ description
+ "Base identity for LSP operational status";
+ }
+
+ identity DOWN {
+ base LSP_OPER_STATUS;
+ description
+ "LSP is operationally down or out of service";
+ }
+
+ identity UP {
+ base LSP_OPER_STATUS;
+ description
+ "LSP is operationally active and available
+ for traffic.";
+ }
+
+ identity TUNNEL_ADMIN_STATUS {
+ description
+ "Base identity for tunnel administrative status";
+ }
+
+ identity ADMIN_DOWN {
+ base TUNNEL_ADMIN_STATUS;
+ description
+ "LSP is administratively down";
+ }
+
+ identity ADMIN_UP {
+ base TUNNEL_ADMIN_STATUS;
+ description
+ "LSP is administratively up";
+ }
+
+ identity NULL_LABEL_TYPE {
+ description
+ "Base identity from which specific null-label types are
+ derived.";
+ }
+
+ identity EXPLICIT {
+ base NULL_LABEL_TYPE;
+ description
+ "Explicit null label is used.";
+ }
+
+ identity IMPLICIT {
+ base NULL_LABEL_TYPE;
+ description
+ "Implicit null label is used.";
+ }
+
+ identity LSP_METRIC_TYPE {
+ description
+ "Base identity for types of LSP metric specification";
+ }
+
+ identity LSP_METRIC_RELATIVE {
+ base LSP_METRIC_TYPE;
+ description
+ "The metric specified for the LSPs to which this identity refers
+ is specified as a relative value to the IGP metric cost to the
+ LSP's tail-end.";
+ }
+
+ identity LSP_METRIC_ABSOLUTE {
+ base LSP_METRIC_TYPE;
+ description
+ "The metric specified for the LSPs to which this identity refers
+ is specified as an absolute value";
+ }
+
+ identity LSP_METRIC_INHERITED {
+ base LSP_METRIC_TYPE;
+ description
+ "The metric for for the LSPs to which this identity refers is
+ not specified explicitly - but rather inherited from the IGP
+ cost directly";
+ }
+
+ // typedef statements
+ typedef mpls-label {
+ type union {
+ type uint32 {
+ range 16..1048575;
+ }
+ type enumeration {
+ enum IPV4_EXPLICIT_NULL {
+ value 0;
+ description
+ "valid at the bottom of the label stack,
+ indicates that stack must be popped and packet forwarded
+ based on IPv4 header";
+ }
+ enum ROUTER_ALERT {
+ value 1;
+ description
+ "allowed anywhere in the label stack except
+ the bottom, local router delivers packet to the local CPU
+ when this label is at the top of the stack";
+ }
+ enum IPV6_EXPLICIT_NULL {
+ value 2;
+ description
+ "valid at the bottom of the label stack,
+ indicates that stack must be popped and packet forwarded
+ based on IPv6 header";
+ }
+ enum IMPLICIT_NULL {
+ value 3;
+ description
+ "assigned by local LSR but not carried in
+ packets";
+ }
+ enum ENTROPY_LABEL_INDICATOR {
+ value 7;
+ description
+ "Entropy label indicator, to allow an LSR
+ to distinguish between entropy label and applicaiton
+ labels RFC 6790";
+ }
+ enum NO_LABEL {
+ description
+ "This value is utilised to indicate that the packet that
+ is forwarded by the local system does not have an MPLS
+ header applied to it. Typically, this is used at the
+ egress of an LSP";
+ }
+ }
+ }
+ description
+ "type for MPLS label value encoding";
+ reference "RFC 3032 - MPLS Label Stack Encoding";
+ }
+
+ typedef tunnel-type {
+ type enumeration {
+ enum P2P {
+ description
+ "point-to-point label-switched-path";
+ }
+ enum P2MP {
+ description
+ "point-to-multipoint label-switched-path";
+ }
+ enum MP2MP {
+ description
+ "multipoint-to-multipoint label-switched-path";
+ }
+ }
+ description
+ "defines the tunnel type for the LSP";
+ reference
+ "RFC 6388 - Label Distribution Protocol Extensions for
+ Point-to-Multipoint and Multipoint-to-Multipoint Label Switched
+ Paths
+ RFC 4875 - Extensions to Resource Reservation Protocol
+ - Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE
+ Label Switched Paths (LSPs)";
+ }
+
+ typedef bandwidth-kbps {
+ type uint64;
+ units "Kbps";
+ description
+ "Bandwidth values expressed in kilobits per second";
+ }
+
+ typedef bandwidth-mbps {
+ type uint64;
+ units "Mbps";
+ description
+ "Bandwidth values expressed in megabits per second";
+ }
+
+ typedef bandwidth-gbps {
+ type uint64;
+ units "Gbps";
+ description
+ "Bandwidth values expressed in gigabits per second";
+ }
+
+ typedef mpls-tc {
+ type uint8 {
+ range "0..7";
+ }
+ description
+ "Values of the MPLS Traffic Class (formerly known as
+ Experimental, EXP) bits";
+ }
+
+ // grouping statements
+
+ // data definition statements
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-mpls.yang b/src/plugins/yang/openconfig/openconfig-mpls.yang
new file mode 100644
index 0000000..e6bdf96
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-mpls.yang
@@ -0,0 +1,746 @@
+module openconfig-mpls {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/mpls";
+
+ prefix "oc-mpls";
+
+
+ // import some basic types
+ import openconfig-mpls-types { prefix oc-mplst; }
+ import openconfig-mpls-rsvp { prefix oc-rsvp; }
+ import openconfig-mpls-ldp { prefix oc-ldp; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-segment-routing { prefix oc-sr; }
+
+ // include submodules
+ include openconfig-mpls-te;
+ include openconfig-mpls-igp;
+ include openconfig-mpls-static;
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module provides data definitions for configuration of
+ Multiprotocol Label Switching (MPLS) and associated protocols for
+ signaling and traffic engineering.
+
+ RFC 3031: Multiprotocol Label Switching Architecture
+
+ The MPLS / TE data model consists of several modules and
+ submodules as shown below. The top-level MPLS module describes
+ the overall framework. Three types of LSPs are supported:
+
+ i) traffic-engineered (or constrained-path)
+
+ ii) IGP-congruent (LSPs that follow the IGP path)
+
+ iii) static LSPs which are not signaled
+
+ The structure of each of these LSP configurations is defined in
+ corresponding submodules. Companion modules define the relevant
+ configuration and operational data specific to key signaling
+ protocols used in operational practice.
+
+
+ +-------+
+ +---------------->| MPLS |<--------------+
+ | +-------+ |
+ | ^ |
+ | | |
+ +----+-----+ +--------+-------+ +-----+-----+
+ | TE LSPs | | IGP-based LSPs | |static LSPs|
+ | | | | | |
+ +----------+ +----------------+ +-----------+
+ ^ ^ ^ ^
+ | +----------------+ | +--------+
+ | | | |
+ | +------+ +-+---+-+ +--+--+
+ +---+ RSVP | |SEGMENT| | LDP |
+ +------+ |ROUTING| +-----+
+ +-------+
+ ";
+
+
+ oc-ext:openconfig-version "3.0.0";
+
+ revision "2018-07-02" {
+ description
+ "Add new RSVP-TE statistics, remove associated-rsvp-session
+ leaf. Remove use of date-and-time.";
+ reference "3.0.0";
+ }
+
+ revision "2018-06-16" {
+ description
+ "Included attributes for base LDP configuration.";
+ reference "2.6.0";
+ }
+
+ revision "2018-06-13" {
+ description
+ "Add ttl-propagation to global MPLS config";
+ reference "2.5.0";
+ }
+
+ revision "2018-06-05" {
+ description
+ "Fixed bugs in when statements on RSVP-TE attributes";
+ reference "2.4.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "2.4.1";
+ }
+
+ revision "2017-06-21" {
+ description
+ "Add TC bits typedef.";
+ reference "2.4.0";
+ }
+
+ revision "2017-03-22" {
+ description
+ "Add RSVP calculated-absolute-subscription-bw";
+ reference "2.3.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+ reference "2.2.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add additional MPLS parameters";
+ reference "2.1.0";
+ }
+
+ revision "2016-09-01" {
+ description
+ "Revisions based on implementation feedback";
+ reference "2.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "Public release of MPLS models";
+ reference "1.0.1";
+ }
+
+
+ // grouping statements
+
+ grouping mpls-admin-group-config {
+ description
+ "configuration data for MPLS link admin groups";
+
+ leaf admin-group-name {
+ type string;
+ description
+ "name for mpls admin-group";
+ }
+
+ leaf bit-position {
+ type uint32;
+ description
+ "bit-position value for mpls admin-group. The value
+ for the admin group is an integer that represents one
+ of the bit positions in the admin-group bitmask. Values
+ between 0 and 31 are interpreted as the original limit
+ of 32 admin groups. Values >=32 are interpreted as
+ extended admin group values as per RFC7308.";
+ }
+
+ }
+
+ grouping mpls-admin-groups-top {
+
+ description
+ "top-level mpls admin-groups config
+ and state containers";
+
+ container mpls-admin-groups {
+ description
+ "Top-level container for admin-groups configuration
+ and state";
+
+ list admin-group {
+ key "admin-group-name";
+ description
+ "configuration of value to name mapping
+ for mpls affinities/admin-groups";
+
+ leaf admin-group-name {
+ type leafref {
+ path "../config/admin-group-name";
+ }
+ description
+ "name for mpls admin-group";
+ }
+ container config {
+ description
+ "Configurable items for admin-groups";
+ uses mpls-admin-group-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state for admin-groups";
+ uses mpls-admin-group-config;
+ }
+ }
+ }
+ }
+
+ grouping mpls-te-igp-flooding-bandwidth-config {
+ description
+ "Configurable items for igp flooding bandwidth
+ threshold configuration.";
+ leaf threshold-type {
+ type enumeration {
+ enum DELTA {
+ description
+ "DELTA indicates that the local
+ system should flood IGP updates when a
+ change in reserved bandwidth >= the specified
+ delta occurs on the interface.";
+ }
+ enum THRESHOLD_CROSSED {
+ description
+ "THRESHOLD-CROSSED indicates that
+ the local system should trigger an update (and
+ hence flood) the reserved bandwidth when the
+ reserved bandwidth changes such that it crosses,
+ or becomes equal to one of the threshold values.";
+ }
+ }
+ description
+ "The type of threshold that should be used to specify the
+ values at which bandwidth is flooded. DELTA indicates that
+ the local system should flood IGP updates when a change in
+ reserved bandwidth >= the specified delta occurs on the
+ interface. Where THRESHOLD_CROSSED is specified, the local
+ system should trigger an update (and hence flood) the
+ reserved bandwidth when the reserved bandwidth changes such
+ that it crosses, or becomes equal to one of the threshold
+ values";
+ }
+
+ leaf delta-percentage {
+ when "../threshold-type = 'DELTA'" {
+ description
+ "The percentage delta can only be specified when the
+ threshold type is specified to be a percentage delta of
+ the reserved bandwidth";
+ }
+ type oc-types:percentage;
+ description
+ "The percentage of the maximum-reservable-bandwidth
+ considered as the delta that results in an IGP update
+ being flooded";
+ }
+
+ leaf threshold-specification {
+ when "../threshold-type = 'THRESHOLD_CROSSED'" {
+ description
+ "The selection of whether mirrored or separate threshold
+ values are to be used requires user specified thresholds to
+ be set";
+ }
+ type enumeration {
+ enum MIRRORED_UP_DOWN {
+ description
+ "MIRRORED_UP_DOWN indicates that a single set of
+ threshold values should be used for both increasing
+ and decreasing bandwidth when determining whether
+ to trigger updated bandwidth values to be flooded
+ in the IGP TE extensions.";
+ }
+ enum SEPARATE_UP_DOWN {
+ description
+ "SEPARATE_UP_DOWN indicates that a separate
+ threshold values should be used for the increasing
+ and decreasing bandwidth when determining whether
+ to trigger updated bandwidth values to be flooded
+ in the IGP TE extensions.";
+ }
+ }
+ description
+ "This value specifies whether a single set of threshold
+ values should be used for both increasing and decreasing
+ bandwidth when determining whether to trigger updated
+ bandwidth values to be flooded in the IGP TE extensions.
+ MIRRORED-UP-DOWN indicates that a single value (or set of
+ values) should be used for both increasing and decreasing
+ values, where SEPARATE-UP-DOWN specifies that the increasing
+ and decreasing values will be separately specified";
+ }
+
+ leaf-list up-thresholds {
+ when "../threshold-type = 'THRESHOLD_CROSSED'" +
+ "and ../threshold-specification = 'SEPARATE_UP_DOWN'" {
+ description
+ "A list of up-thresholds can only be specified when the
+ bandwidth update is triggered based on crossing a
+ threshold and separate up and down thresholds are
+ required";
+ }
+ type oc-types:percentage;
+ description
+ "The thresholds (expressed as a percentage of the maximum
+ reservable bandwidth) at which bandwidth updates are to be
+ triggered when the bandwidth is increasing.";
+ }
+
+ leaf-list down-thresholds {
+ when "../threshold-type = 'THRESHOLD_CROSSED'" +
+ "and ../threshold-specification = 'SEPARATE_UP_DOWN'" {
+ description
+ "A list of down-thresholds can only be specified when the
+ bandwidth update is triggered based on crossing a
+ threshold and separate up and down thresholds are
+ required";
+ }
+ type oc-types:percentage;
+ description
+ "The thresholds (expressed as a percentage of the maximum
+ reservable bandwidth) at which bandwidth updates are to be
+ triggered when the bandwidth is decreasing.";
+ }
+
+ leaf-list up-down-thresholds {
+ when "../threshold-type = 'THRESHOLD_CROSSED'" +
+ "and ../threshold-specification = 'MIRRORED_UP_DOWN'" {
+ description
+ "A list of thresholds corresponding to both increasing
+ and decreasing bandwidths can be specified only when an
+ update is triggered based on crossing a threshold, and
+ the same up and down thresholds are required.";
+ }
+ type oc-types:percentage;
+ description
+ "The thresholds (expressed as a percentage of the maximum
+ reservable bandwidth of the interface) at which bandwidth
+ updates are flooded - used both when the bandwidth is
+ increasing and decreasing";
+ }
+ }
+
+
+ grouping mpls-te-igp-flooding-bandwidth {
+ description
+ "Top level group for traffic engineering
+ database flooding options";
+ container igp-flooding-bandwidth {
+ description
+ "Interface bandwidth change percentages
+ that trigger update events into the IGP traffic
+ engineering database (TED)";
+ container config {
+ description
+ "Configuration parameters for TED
+ update threshold ";
+ uses mpls-te-igp-flooding-bandwidth-config;
+ }
+ container state {
+ config false;
+ description
+ "State parameters for TED update threshold ";
+ uses mpls-te-igp-flooding-bandwidth-config;
+ }
+ }
+ }
+
+
+ grouping te-lsp-delay-config {
+ description
+ "Group for the timers goerning the delay
+ in installation and cleanup of TE LSPs";
+
+ leaf install-delay {
+ type uint16 {
+ range 0..3600;
+ }
+ units seconds;
+ description
+ "delay the use of newly installed te lsp for a
+ specified amount of time.";
+ }
+
+ leaf cleanup-delay {
+ type uint16;
+ units seconds;
+ description
+ "delay the removal of old te lsp for a specified
+ amount of time";
+ }
+ }
+
+ grouping te-interface-attributes-top {
+ description
+ "Top level grouping for attributes
+ for TE interfaces.";
+
+ list interface {
+ key "interface-id";
+ description
+ "List of TE interfaces";
+
+ leaf interface-id {
+ type leafref {
+ path "../config/interface-id";
+ }
+ description
+ "Reference to the interface id list key";
+ }
+
+ container config {
+ description
+ "Configuration parameters related to TE interfaces:";
+ uses te-interface-attributes-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters related to TE interfaces";
+ uses te-interface-attributes-config;
+ }
+
+ uses oc-if:interface-ref;
+
+ uses mpls-te-igp-flooding-bandwidth;
+ }
+ }
+
+ grouping te-interface-attributes-config {
+ description
+ "global level definitions for interfaces
+ on which TE is run";
+
+ leaf interface-id {
+ type oc-if:interface-id;
+ description
+ "Id of the interface";
+ }
+
+ leaf te-metric {
+ type uint32;
+ description
+ "TE specific metric for the link";
+ }
+
+ leaf-list srlg-membership {
+ type leafref {
+ path "../../../../te-global-attributes/srlgs/srlg/name";
+ }
+ description
+ "list of references to named shared risk link groups that the
+ interface belongs to.";
+ }
+
+ leaf-list admin-group {
+ type string;
+ description
+ "list of admin groups (by name) on the interface";
+ }
+ }
+
+ grouping mpls-te-lsp-timers {
+ description
+ "Grouping for traffic engineering timers";
+ container te-lsp-timers {
+ description
+ "Definition for delays associated with setup
+ and cleanup of TE LSPs";
+
+ container config {
+ description
+ "Configuration parameters related
+ to timers for TE LSPs";
+
+ uses te-lsp-delay-config;
+ uses te-tunnel-reoptimize-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State related to timers for TE LSPs";
+
+ uses te-lsp-delay-config;
+ uses te-tunnel-reoptimize-config;
+ }
+ }
+ }
+
+ grouping mpls-global-config {
+ description
+ "Definition of global MPLS configuration parameters";
+
+ leaf null-label {
+ type identityref {
+ base oc-mplst:NULL_LABEL_TYPE;
+ }
+ default oc-mplst:IMPLICIT;
+ description
+ "The null-label type used, implicit or explicit";
+ }
+
+ leaf ttl-propagation {
+ type boolean;
+ default true;
+ description
+ "Enables TTL propagation across the MPLS domain.
+ When ttl-propagation is set to true, the IP TTL
+ is copied into the MPLS header TTL when pushing
+ a label to an IP packet. If false, the IP TTL is
+ not copied into the MPLS header TTL and, therefore,
+ the IP TTL is not updated in the MPLS domain.";
+ }
+
+ }
+
+ grouping mpls-global-top {
+ description
+ "Top level grouping for global MPLS configuration ";
+
+ container config {
+ description
+ "Top level global MPLS configuration";
+ uses mpls-global-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Top level global MPLS state";
+ uses mpls-global-config;
+ }
+ }
+
+ grouping mpls-interfaces-top {
+ description
+ "Top level grouping for attributes
+ for MPLS-enabled interfaces.";
+ container interface-attributes {
+ description
+ "Parameters related to MPLS interfaces";
+ list interface {
+ key "interface-id";
+ description
+ "List of TE interfaces";
+
+ leaf interface-id {
+ type leafref {
+ path "../config/interface-id";
+ }
+ description
+ "Reference to the interface id list key";
+ }
+
+ container config {
+ description
+ "Configuration parameters related to MPLS interfaces:";
+ uses mpls-interface-attributes-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters related to TE interfaces";
+ uses mpls-interface-attributes-config;
+ }
+
+ uses oc-if:interface-ref;
+ }
+ }
+ }
+
+ grouping mpls-interface-attributes-config {
+ description
+ "global level definitions for interfaces
+ on which MPLS is run";
+
+ leaf interface-id {
+ type oc-if:interface-id;
+ description
+ "Indentifier for the MPLS interface";
+ }
+
+ leaf mpls-enabled {
+ type boolean;
+ default false;
+ description
+ "Enable MPLS forwarding on this interface";
+ }
+ }
+
+ grouping mpls-label-block-config {
+ description
+ "Configuration parameters relating to an MPLS label block.";
+
+ leaf local-id {
+ type string;
+ description
+ "A local identifier for the global label block allocation.";
+ }
+
+ leaf lower-bound {
+ type oc-mplst:mpls-label;
+ description
+ "Lower bound of the global label block. The block is defined to include
+ this label.";
+ }
+
+ leaf upper-bound {
+ type oc-mplst:mpls-label;
+ description
+ "Upper bound for the global label block. The block is defined to include
+ this label.";
+ }
+ }
+
+ grouping mpls-label-blocks-top {
+ description
+ "Top-level configuration and operational state parameters corresponding
+ to reserved label blocks.";
+
+ container reserved-label-blocks {
+ description
+ "A range of labels starting with the start-label and up-to and including
+ the end label that should be allocated as reserved. These labels should
+ not be utilised by any dynamic label allocation on the local system unless
+ the allocating protocol is explicitly configured to specify that
+ allocation of labels should be out of the label block specified.";
+
+ list reserved-label-block {
+ key "local-id";
+
+ description
+ "A range of labels starting with the start-label up to and including
+ the end label that should be allocated for use by a specific protocol.";
+
+ leaf local-id {
+ type leafref {
+ path "../config/local-id";
+ }
+ description
+ "A reference to a unique local identifier for this label block.";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the label block.";
+
+ uses mpls-label-block-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to the label block.";
+
+ uses mpls-label-block-config;
+ }
+ }
+ }
+ }
+
+ grouping mpls-top {
+ description
+ "Top level grouping for MPLS configuration and state";
+
+ container mpls {
+ description
+ "Anchor point for mpls configuration and operational
+ data";
+
+ container global {
+ // entropy label support, label ranges will be added here.
+ description
+ "general mpls configuration applicable to any
+ type of LSP and signaling protocol - label ranges,
+ entropy label supportmay be added here";
+ uses mpls-global-top;
+ uses mpls-interfaces-top;
+ uses mpls-label-blocks-top;
+ }
+
+ container te-global-attributes {
+ description
+ "traffic-engineering global attributes";
+ uses mpls-te-srlg-top;
+ uses mpls-admin-groups-top;
+ uses mpls-te-lsp-timers;
+ }
+
+ container te-interface-attributes {
+ description
+ "traffic engineering attributes specific
+ for interfaces";
+ uses te-interface-attributes-top;
+ }
+
+ container signaling-protocols {
+ description
+ "top-level signaling protocol configuration";
+
+ uses oc-rsvp:rsvp-global;
+ uses oc-ldp:ldp-global;
+ uses oc-sr:sr-mpls-top;
+ }
+
+ container lsps {
+ description
+ "LSP definitions and configuration";
+
+ container constrained-path {
+ description
+ "traffic-engineered LSPs supporting different
+ path computation and signaling methods";
+ uses explicit-paths-top;
+ uses te-tunnels-top;
+ }
+
+ container unconstrained-path {
+ description
+ "LSPs that use the IGP-determined path, i.e., non
+ traffic-engineered, or non constrained-path";
+
+ uses igp-lsp-common;
+ uses igp-lsp-setup;
+ }
+
+ container static-lsps {
+ description
+ "statically configured LSPs, without dynamic
+ signaling";
+
+ uses static-lsp-top;
+ }
+ }
+ }
+ }
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+}
diff --git a/src/plugins/yang/openconfig/openconfig-network-instance-l2.yang b/src/plugins/yang/openconfig/openconfig-network-instance-l2.yang
new file mode 100644
index 0000000..530b8c8
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-network-instance-l2.yang
@@ -0,0 +1,339 @@
+submodule openconfig-network-instance-l2 {
+
+ belongs-to openconfig-network-instance {
+ prefix "oc-netinst";
+ }
+
+ // import some basic types
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-interfaces { prefix "oc-if"; }
+ import ietf-yang-types { prefix "yang"; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module contains groupings which specifically relate to
+ Layer 2 network instance configuration and operational state
+ parameters.";
+
+ oc-ext:openconfig-version "0.11.0";
+
+ revision "2018-08-11" {
+ description
+ "Add vlan id as additional key in MAC table";
+ reference "0.11.0";
+ }
+
+ revision "2018-06-22" {
+ description
+ "Fix typo in OSPF when statement";
+ reference "0.10.2";
+ }
+
+ revision "2018-06-05" {
+ description
+ "Fix bugs in when statements";
+ reference "0.10.1";
+ }
+
+ revision "2018-02-19" {
+ description
+ "Add PIM and IGMP to network instance";
+ reference "0.10.0";
+ }
+
+ revision "2017-12-13" {
+ description
+ "Fix incorrect constraint on SR and MPLS containers";
+ reference "0.9.0";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes";
+ reference "0.8.1";
+ }
+
+ revision "2017-02-28" {
+ description
+ "Add OSPFv2 to network instance";
+ reference "0.8.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add policy forwarding to network instance";
+ reference "0.7.0";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Add AFT to the network instance";
+ reference "0.6.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add segment routing to network instance";
+ reference "0.5.0";
+ }
+
+ revision "2016-11-10" {
+ description
+ "Update model to include IS-IS.";
+ reference "0.4.1";
+ }
+
+ revision "2016-10-12" {
+ description
+ "Update table connections";
+ reference "0.4.0";
+ }
+
+ revision "2016-09-28" {
+ description
+ "Change L2 instance to submodule; add MAC table";
+ reference "0.3.0";
+ }
+
+ revision "2016-08-11" {
+ description
+ "Resolve repeated container names in routing protocols";
+ reference "0.2.3";
+ }
+
+ revision "2016-07-08" {
+ description
+ "Updated with refactored routing protocol models";
+ reference "0.2.1";
+ }
+
+ revision "2016-03-29" {
+ description
+ "Initial revision";
+ reference "0.2.0";
+ }
+
+ revision "2015-11-20" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ grouping l2ni-instance {
+ description
+ "Configuration and operational state parameters relating
+ to a Layer 2 network instance";
+
+ container fdb {
+ description
+ "Operational state and configuration parameters relating to
+ the forwarding database of the network instance";
+
+ container config {
+ description
+ "Configuration parameters relating to the FDB";
+ uses l2ni-fdb-mac-config;
+ }
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the FDB";
+ uses l2ni-fdb-mac-config;
+ }
+
+ uses l2ni-mac-table-top;
+ }
+ }
+
+ grouping l2ni-instance-common-config {
+ description
+ "Common configuration options which are specific to Layer 2
+ network instances";
+
+ leaf mtu {
+ type uint16;
+ description
+ "The maximum frame size which should be supported for this
+ instance for Layer 2 frames";
+ }
+
+ }
+
+ grouping l2ni-fdb-mac-config {
+ description
+ "Parameters relating to FDB behaviour relating to MAC
+ addresses";
+
+ leaf mac-learning {
+ type boolean;
+ description
+ "When this leaf is set to true, MAC learning is enabled for
+ the network instance, such that MAC addresses are learned
+ from ingress frames and added to the FDB.";
+ }
+
+ leaf mac-aging-time {
+ // Cisco supports one aging time for local and remote, but
+ // can specify this time is absolute or against inactivity.
+ // ALU SROS supports different aging times for local and remote
+ // but does not allow absolute/inactivity specification.
+ // JNPR supports only a single aging time, and no specification
+ // of whether inactivity/absolute is used.
+ // It is easy to augment new options in here for local remote
+ // and an extra leaf to allow specification of the type of aging
+ // so this is left as a single value.
+ type uint16;
+ units seconds;
+ description
+ "The number of seconds of inactivity after which the entry
+ in the local FDB is timed out.";
+ }
+
+ leaf maximum-entries {
+ type uint16;
+ description
+ "The maximum number of MAC address entries that should be
+ accepted into the FDB";
+ }
+ }
+
+ grouping l2ni-encapsulation-config {
+ description
+ "Encapsulation related configuration parameters for a L2
+ network instance";
+
+ leaf control-word {
+ type boolean;
+ description
+ "Whether the control-word should be used for the network
+ instance";
+ reference "RFC3985";
+ }
+ }
+
+ grouping l2ni-mac-table-config {
+ description
+ "Configuration data for MAC table entries";
+
+ leaf mac-address {
+ type yang:mac-address;
+ description
+ "MAC address for the dynamic or static MAC table
+ entry";
+ }
+
+ leaf vlan {
+ //TODO(aashaikh): Consider whether this should just reflect the
+ //VLAN id or be a union type to also support displaying/setting
+ //the VLAN by name (i.e., global VLAN configured in the VLAN
+ // model).
+ type leafref {
+ path "../../../../../../vlans/vlan/config/vlan-id";
+ }
+ description
+ "VLAN on which the MAC address is present. The same MAC
+ address may be seen on multiple VLANs in some cases.";
+ }
+ }
+
+ grouping l2ni-mac-table-state {
+ description
+ "Operational state data for MAC table entries";
+
+ leaf age {
+ type uint64;
+ units seconds;
+ description
+ "The time in seconds since the MAC address has been in the
+ table";
+ }
+
+ leaf entry-type {
+ type enumeration {
+ enum STATIC {
+ description
+ "Statically programmed MAC table entry";
+ }
+ enum DYNAMIC {
+ description
+ "Dynamically learned MAC table entry";
+ }
+ }
+ description
+ "Indicates whether the entry was statically configured, or
+ dynamically learned.";
+ }
+
+ }
+
+ grouping l2ni-mac-table-top {
+ description
+ "Top-level grouping for MAC table list";
+
+
+ container mac-table {
+ description
+ "Table of learned or statically configured MAC addresses and
+ corresponding VLANs in the bridge domain";
+
+ container entries {
+ description
+ "Enclosing container for list of MAC table entries";
+
+ list entry {
+ key "mac-address vlan";
+ description
+ "List of learned MAC addresses";
+
+ leaf mac-address {
+ type leafref {
+ path "../config/mac-address";
+ }
+ description
+ "Reference to mac-address list key";
+ }
+
+ leaf vlan {
+ type leafref {
+ path "../config/vlan";
+ }
+ description
+ "Reference to vlan list key";
+ }
+
+ container config {
+ description
+ "Configuration data for MAC table entries";
+
+ uses l2ni-mac-table-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for MAC table entries";
+
+ uses l2ni-mac-table-config;
+ uses l2ni-mac-table-state;
+ }
+
+ container interface {
+ description
+ "Reference to the base and/or subinterface for the
+ MAC table entry";
+
+ uses oc-if:interface-ref;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-network-instance-l3.yang b/src/plugins/yang/openconfig/openconfig-network-instance-l3.yang
new file mode 100644
index 0000000..d9dca40
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-network-instance-l3.yang
@@ -0,0 +1,234 @@
+module openconfig-network-instance-l3 {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/network-instance-l3";
+
+ prefix "oc-ni-l3";
+
+ // import some basic types
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-types { prefix "octypes"; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module contains groupings which specifically relate to
+ Layer 3 network instance configuration and operational state
+ parameters.";
+
+ oc-ext:openconfig-version "0.11.0";
+
+ revision "2018-08-17" {
+ description
+ "Add a route limit for L3 network instances.";
+ reference "0.11.0";
+ }
+
+ revision "2017-12-13" {
+ description
+ "Fix incorrect constraint on SR and MPLS containers";
+ reference "0.9.0";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes";
+ reference "0.8.1";
+ }
+
+ revision "2017-02-28" {
+ description
+ "Add OSPFv2 to network instance";
+ reference "0.8.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add policy forwarding to network instance";
+ reference "0.7.0";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Add AFT to the network instance";
+ reference "0.6.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add segment routing to network instance";
+ reference "0.5.0";
+ }
+
+ revision "2016-11-10" {
+ description
+ "Update model to include IS-IS.";
+ reference "0.4.1";
+ }
+
+ revision "2016-09-28" {
+ description
+ "Change L2 instance to submodule; add MAC table";
+ reference "0.3.0";
+ }
+
+ revision "2016-08-11" {
+ description
+ "Resolve repeated container names in routing protocols";
+ reference "0.2.3";
+ }
+
+ revision "2016-07-08" {
+ description
+ "Updated with refactored routing protocol models";
+ reference "0.2.1";
+ }
+
+ revision "2016-03-29" {
+ description
+ "Initial revision";
+ reference "0.2.0";
+ }
+
+ revision "2016-03-14" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ grouping l3ni-instance {
+ description
+ "Configuration and operational state parameters relevant
+ to network instances that include a Layer 3 type";
+
+ }
+
+ grouping l3ni-instance-common-config {
+ description
+ "Configuration parameters that are common to L3 network
+ instances other than the default instance";
+
+ leaf-list enabled-address-families {
+ type identityref {
+ base octypes:ADDRESS_FAMILY;
+ }
+ description
+ "The address families that are to be enabled for this
+ network instance.";
+ }
+ }
+
+ grouping l3ni-route-limit-structural {
+ description
+ "Configuration and state for the maximum number of routes
+ that should be used by routing instance.";
+
+ container route-limits {
+ description
+ "Configuration and operational state relating to the
+ maximum number of routes for the address family that
+ should be allowed within the Layer 3 network instance.
+
+ When the specified value is reached, no further prefixes
+ should be installed into the system's RIB from this network
+ instance unless the warning only leaf is set. In this case,
+ new routes should still be installed. If a alarm threshold
+ is specified, then this should be used to generate
+ alarms via telemetry for the network instance.";
+
+ list route-limit {
+ key "afi";
+
+ description
+ "A route limit applying to a particular address family.";
+
+ leaf afi {
+ type leafref {
+ path "../config/afi";
+ }
+ description
+ "Reference to the address family for which the route
+ limit is being applied.";
+ }
+
+ container config {
+ description
+ "Configuration options relating to the route limit.";
+ uses l3ni-route-limit-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the route limit.";
+ uses l3ni-route-limit-config;
+ uses l3ni-route-limit-state;
+ }
+ }
+ }
+ }
+
+ grouping l3ni-route-limit-config {
+ description
+ "Configuration options relating to the route limit for a network
+ instance.";
+
+ leaf afi {
+ type identityref {
+ base octypes:ADDRESS_FAMILY;
+ }
+ description
+ "The address family for which the route limit applies.";
+ }
+
+ leaf maximum {
+ type uint32;
+ description
+ "The maximum number of routes for the address family. The
+ system should not install more than maximum number of
+ prefixes into the RIB unless the warning-only leaf is specified.";
+ }
+
+ leaf warning-only {
+ type boolean;
+ default false;
+ description
+ "When specified, the route limit specified is considered only as
+ a warning - and routes should continue to be installed into the
+ RIB over the limit specified in the maximum leaf.";
+ }
+
+ leaf alarm-threshold {
+ type uint32;
+ description
+ "When specified, an alarm should be generated when the threshold
+ number of installed routes is reached.";
+ }
+ }
+
+ grouping l3ni-route-limit-state {
+ description
+ "Operational state relating to the route limit for a network
+ instance.";
+
+ leaf threshold-exceeded {
+ type boolean;
+ description
+ "This leaf should be set to true in the case that the threshold
+ number of routes has been exceeded.";
+ }
+
+ leaf installed-routes {
+ type uint32;
+ description
+ "The current number of routes installed for the address family.";
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-network-instance-policy.yang b/src/plugins/yang/openconfig/openconfig-network-instance-policy.yang
new file mode 100644
index 0000000..afbcacd
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-network-instance-policy.yang
@@ -0,0 +1,115 @@
+module openconfig-network-instance-policy {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/network-instance/policy";
+
+ prefix "oc-ni-pol";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-routing-policy { prefix oc-rpol; }
+ import openconfig-policy-types { prefix oc-pol-types; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines routing policy statements (conditions and
+ actions) for the network instance model. These statements are
+ generally added to the routing policy model.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2017-02-15" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ // grouping statements
+
+ grouping protocol-instance-policy-config {
+ description
+ "Configuration data for policy matching on protocol instance";
+
+ leaf protocol-identifier {
+ type identityref {
+ base oc-pol-types:INSTALL_PROTOCOL_TYPE;
+ }
+ description
+ "The identifier (protocol type) of the
+ protocol instance to match on in the local network
+ instance.";
+ }
+
+ leaf protocol-name {
+ type string;
+ description
+ "The name of the protocol instance to match
+ on in the local network instance";
+ }
+ }
+
+ grouping protocol-instance-policy-state {
+ description
+ "Operational state data for policy matching on protocol
+ instance";
+ }
+
+ grouping protocol-instance-policy-top {
+ description
+ "Top-level grouping for policy matching on protocol instance";
+
+ container match-protocol-instance {
+ description
+ "Top-level container for protocol instance match condition
+ in policy statements. The protocol instance is referenced
+ by an identifier and name";
+
+ container config {
+ description
+ "Configuration data for policy matching on protocol
+ instance";
+
+ uses protocol-instance-policy-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for policy matching on protocol instance";
+
+ uses protocol-instance-policy-config;
+ uses protocol-instance-policy-state;
+ }
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+ "oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
+ "oc-rpol:conditions" {
+ description
+ "Add match conditions for protocol instances to the routing
+ policy model.";
+
+ uses protocol-instance-policy-top;
+ }
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-network-instance-types.yang b/src/plugins/yang/openconfig/openconfig-network-instance-types.yang
new file mode 100644
index 0000000..67ab357
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-network-instance-types.yang
@@ -0,0 +1,261 @@
+module openconfig-network-instance-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/network-instance-types";
+
+ prefix "oc-ni-types";
+
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Types associated with a network instance";
+
+ oc-ext:openconfig-version "0.8.1";
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes";
+ reference "0.8.1";
+ }
+
+ revision "2017-02-28" {
+ description
+ "Add OSPFv2 to network instance";
+ reference "0.8.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add policy forwarding to network instance";
+ reference "0.7.0";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Add AFT to the network instance";
+ reference "0.6.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add segment routing to network instance";
+ reference "0.5.0";
+ }
+
+ revision "2016-11-10" {
+ description
+ "Update model to include IS-IS.";
+ reference "0.4.1";
+ }
+
+ revision "2016-10-12" {
+ description
+ "Update table connections";
+ reference "0.4.0";
+ }
+
+ revision "2016-09-28" {
+ description
+ "Change L2 instance to submodule; add MAC table";
+ reference "0.3.0";
+ }
+
+ revision "2016-08-11" {
+ description
+ "Resolve repeated container names in routing protocols";
+ reference "0.2.3";
+ }
+
+ revision "2016-07-08" {
+ description
+ "Updated with refactored routing protocol models";
+ reference "0.2.1";
+ }
+
+ revision "2016-03-29" {
+ description
+ "Initial revision";
+ reference "0.2.0";
+ }
+
+ revision "2015-10-18" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ // identity statements
+ identity NETWORK_INSTANCE_TYPE {
+ description
+ "A base identity which can be extended to indicate different
+ types of network instance supported by a device.";
+ }
+
+ identity DEFAULT_INSTANCE {
+ base NETWORK_INSTANCE_TYPE;
+ description
+ "A special routing instance which acts as the 'default' or
+ 'global' routing instance for a network device.";
+ }
+
+ identity L3VRF {
+ base NETWORK_INSTANCE_TYPE;
+ description
+ "A private Layer 3 only routing instance which is formed of
+ one or more RIBs";
+ }
+
+ identity L2VSI {
+ base NETWORK_INSTANCE_TYPE;
+ description
+ "A private Layer 2 only switch instance which is formed of
+ one or more L2 forwarding tables";
+ }
+
+ identity L2P2P {
+ base NETWORK_INSTANCE_TYPE;
+ description
+ "A private Layer 2 only forwarding instance which acts as
+ a point to point connection between two endpoints";
+ }
+
+ identity L2L3 {
+ base NETWORK_INSTANCE_TYPE;
+ description
+ "A private Layer 2 and Layer 2 forwarding instance";
+ }
+
+ identity ENDPOINT_TYPE {
+ description
+ "Specification of the type of endpoint that is being associated
+ with a network instance";
+ }
+
+ identity LOCAL {
+ base ENDPOINT_TYPE;
+ description
+ "A local interface which is being associated with the endpoint";
+ }
+
+ identity REMOTE {
+ base ENDPOINT_TYPE;
+ description
+ "A remote interface which is being associated with the
+ endpoint";
+ }
+
+ identity LABEL_ALLOCATION_MODE {
+ description
+ "Base identity to be used to express types of label allocation
+ strategies to be used within a network instance";
+ }
+
+ identity PER_PREFIX {
+ base LABEL_ALLOCATION_MODE;
+ description
+ "A label is to be allocated per prefix entry in the RIB for the
+ network instance";
+ }
+
+ identity PER_NEXTHOP {
+ base LABEL_ALLOCATION_MODE;
+ description
+ "A label is to be allocated per nexthop entry in the RIB for
+ the network instance";
+ }
+
+ identity INSTANCE_LABEL {
+ base LABEL_ALLOCATION_MODE;
+ description
+ "A single label is to be used for the instance";
+ }
+
+ identity ENCAPSULATION {
+ description
+ "On the wire encapsulations that can be used when
+ differentiating network instances";
+ }
+
+ identity MPLS {
+ base ENCAPSULATION;
+ description
+ "Use MPLS labels to distinguish network instances on the wire";
+ }
+
+ identity VXLAN {
+ base ENCAPSULATION;
+ description
+ "Use VXLAN (RFC7348) VNIs to distinguish network instances on
+ the wire";
+ }
+
+ identity SIGNALLING_PROTOCOL {
+ description
+ "The signalling protocol that should be used to diseminate
+ entries within a forwarding instance";
+ }
+
+ identity LDP {
+ base SIGNALLING_PROTOCOL;
+ description
+ "Use LDP-based setup for signalling. Where the instance is
+ a point-to-point service this refers to RFC4447 ('Martini')
+ setup. Where the service is an L2VSI, or L2L3 instance it
+ refers to RFC4762 LDP-signalled VPLS instances";
+ }
+
+ identity BGP_VPLS {
+ base SIGNALLING_PROTOCOL;
+ description
+ "Use BGP-based signalling and autodiscovery for VPLS instances
+ as per RFC4761";
+ }
+
+ identity BGP_EVPN {
+ base SIGNALLING_PROTOCOL;
+ description
+ "Use BGP-based Ethernet VPN (RFC7432) based signalling for
+ the network instance";
+ }
+
+ // rjs note:
+ // this should move to openconfig-types when merged
+ typedef route-distinguisher {
+ type union {
+ // type 0: <2-byte administrator>:<4-byte assigned number>
+ type string {
+ pattern '^(65[0-5][0-3][0-5]|[1-5][1-5][0-9][0-9][0-9]|'
+ + '[1-9]?[1-9]?[0-9][0-9]|[1-9]):'
+ + '(4[0-2][0-9][0-4][0-9][0-6][0-7][0-2][0-9][0-5]|'
+ + '[0-3][0-9]{9}|[1-9][0-9]{1,8}|[1-9])$';
+ }
+ // type 1: <ip-address>:<2-byte assigned number>
+ type string {
+ pattern
+ '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]):'
+ + '(65[0-5][0-3][0-5]|[1-5][1-5][0-9][0-9][0-9]|'
+ + '[1-9]?[1-9]?[0-9][0-9]|[1-9])$';
+ }
+ // type 2: <4-byte as-number>:<2-byte assigned number>
+ type string {
+ pattern
+ '^(4[0-2][0-9][0-4][0-9][0-6][0-7][0-2][0-9][0-5]|'
+ + '[0-3][0-9]{9}|[1-9][0-9]{1,8}|[1-9]):'
+ + '(65[0-5][0-3][0-5]|[1-5]{2}[0-9]{3}|'
+ + '[1-9]{0,2}[0-9][0-9]|[1-9])$';
+ }
+ }
+ description "A route distinguisher value";
+ reference "RFC4364";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-network-instance.yang b/src/plugins/yang/openconfig/openconfig-network-instance.yang
new file mode 100644
index 0000000..0d42a11
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-network-instance.yang
@@ -0,0 +1,1093 @@
+module openconfig-network-instance {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/network-instance";
+
+ prefix "oc-netinst";
+
+ // import some basic types
+ //import ietf-inet-types { prefix inet; }
+ import ietf-yang-types { prefix "yang"; }
+ import ietf-inet-types { prefix "inet"; }
+ import openconfig-network-instance-types { prefix "oc-ni-types"; }
+ import openconfig-policy-types { prefix "oc-pol-types"; }
+ import openconfig-routing-policy { prefix "oc-rpol"; }
+ import openconfig-local-routing { prefix "oc-loc-rt"; }
+ import openconfig-interfaces { prefix "oc-if"; }
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-network-instance-l3 { prefix "oc-ni-l3"; }
+ import openconfig-types { prefix "oc-types"; }
+ import openconfig-bgp { prefix "oc-bgp"; }
+ import openconfig-mpls { prefix "oc-mpls"; }
+ import openconfig-vlan { prefix "oc-vlan"; }
+ import openconfig-ospfv2 { prefix "oc-ospfv2"; }
+ import openconfig-policy-forwarding { prefix "oc-pf"; }
+ import openconfig-segment-routing { prefix "oc-sr"; }
+ import openconfig-isis { prefix "oc-isis"; }
+ import openconfig-aft { prefix "oc-aft"; }
+ import openconfig-pim { prefix "oc-pim"; }
+ import openconfig-igmp { prefix "oc-igmp"; }
+
+ // include submodules
+ include openconfig-network-instance-l2;
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "An OpenConfig description of a network-instance. This may be
+ a Layer 3 forwarding construct such as a virtual routing and
+ forwarding (VRF) instance, or a Layer 2 instance such as a
+ virtual switch instance (VSI). Mixed Layer 2 and Layer 3
+ instances are also supported.";
+
+ oc-ext:openconfig-version "0.11.0";
+
+ revision "2018-08-11" {
+ description
+ "Add vlan id as additional key in MAC table";
+ reference "0.11.0";
+ }
+
+ revision "2018-06-22" {
+ description
+ "Fix typo in OSPF when statement";
+ reference "0.10.2";
+ }
+
+ revision "2018-06-05" {
+ description
+ "Fix bugs in when statements";
+ reference "0.10.1";
+ }
+
+ revision "2018-02-19" {
+ description
+ "Add PIM and IGMP to network instance";
+ reference "0.10.0";
+ }
+
+ revision "2017-12-13" {
+ description
+ "Fix incorrect constraint on SR and MPLS containers";
+ reference "0.9.0";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes";
+ reference "0.8.1";
+ }
+
+ revision "2017-02-28" {
+ description
+ "Add OSPFv2 to network instance";
+ reference "0.8.0";
+ }
+
+ revision "2017-01-26" {
+ description
+ "Add policy forwarding to network instance";
+ reference "0.7.0";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Add AFT to the network instance";
+ reference "0.6.0";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Add segment routing to network instance";
+ reference "0.5.0";
+ }
+
+ revision "2016-11-10" {
+ description
+ "Add IS-IS to OpenConfig network instance";
+ reference "0.4.1";
+ }
+
+ revision "2016-10-12" {
+ description
+ "Update table connections";
+ reference "0.4.0";
+ }
+
+ revision "2016-09-28" {
+ description
+ "Change L2 instance to submodule; add MAC table";
+ reference "0.3.0";
+ }
+
+ revision "2016-08-11" {
+ description
+ "Resolve repeated container names in routing protocols";
+ reference "0.2.3";
+ }
+
+ revision "2016-07-08" {
+ description
+ "Updated with refactored routing protocol models";
+ reference "0.2.1";
+ }
+
+ revision "2016-03-29" {
+ description
+ "Initial revision";
+ reference "0.2.0";
+ }
+
+ revision "2015-10-18" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ typedef network-instance-ref {
+ type leafref {
+ path "/network-instances/network-instance/config/name";
+ }
+ description
+ "A re-usable type that can be referenced within other
+ modules that references a network instance.";
+ }
+
+ grouping network-instance-top {
+ description
+ "Top-level grouping containing a list of network instances.";
+
+ container network-instances {
+ description
+ "The L2, L3, or L2+L3 forwarding instances that are
+ configured on the local system";
+
+ list network-instance {
+ key "name";
+
+ description
+ "Network instances configured on the local system";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "A unique name identifying the network instance";
+ }
+
+ uses l2ni-instance {
+ when "config/type = 'L2VSI' or config/type = 'L2P2P'" +
+ " or config/type = 'L2L3' or config/type = 'DEFAULT_INSTANCE'" {
+ description
+ "Layer 2 configuration parameters included when
+ a network instance is a Layer 2 instance or a
+ combined L2L3 instance";
+ }
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to a network
+ instance";
+ uses network-instance-config;
+ uses network-instance-type-dependent-config;
+ }
+
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to a network
+ instance";
+ uses network-instance-config;
+ uses network-instance-type-dependent-config;
+ uses network-instance-state;
+ }
+
+ container encapsulation {
+ when "../config/type != 'DEFAULT_INSTANCE'" {
+ description
+ "Only allow the encapsulation of the instance to be
+ set when the instance is not the default instance";
+ }
+ description
+ "Configuration parameters relating to the encapsulation
+ used for the network instance";
+
+ container config {
+ description
+ "Configuration parameters relating to the encapsulation
+ of the network instance";
+
+ uses encapsulation-config;
+
+ uses l2ni-encapsulation-config {
+ when "../../config/type = 'L2VSI' or ../../config/type = 'L2P2P'
+ or ../../config/type = 'L2L3'" {
+ description
+ "Only allow L2 encapsulations to be set
+ when the instance is of a type that supports
+ L2";
+ }
+ }
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to the encapsulation of
+ the network instance";
+ uses encapsulation-config;
+
+ uses l2ni-encapsulation-config {
+ when "../../config/type = 'L2VSI' or ../../config/type = 'L2P2P'
+ or ../../config/type = 'L2L3'" {
+ description
+ "Only allow L2 encapsulations to be set
+ when the instance is of a type that supports
+ L2";
+ }
+ }
+ }
+ }
+
+ container inter-instance-policies {
+ description
+ "Policies dictating how RIB or FIB entries are imported
+ to and exported from this instance";
+
+ uses oc-rpol:apply-policy-group;
+ }
+
+ container table-connections {
+ description
+ "Policies dictating how RIB or FIB entries are propagated
+ between tables";
+
+ list table-connection {
+ key "src-protocol dst-protocol address-family";
+
+ description
+ "A list of connections between pairs of routing or
+ forwarding tables, the leaking of entries between
+ which is specified by the import policy.
+
+ A connection connecting a source table to a destination
+ table implies that routes that match the policy specified
+ for the connection are available for the destination
+ protocol to advertise, or match within its policies.";
+
+ leaf src-protocol {
+ type leafref {
+ path "../config/src-protocol";
+ }
+ description
+ "The name of the protocol associated with the table
+ which should be utilised as the source of forwarding
+ or routing information";
+ }
+
+ leaf dst-protocol {
+ type leafref {
+ path "../config/dst-protocol";
+ }
+ description
+ "The table to which routing entries should be
+ exported";
+ }
+
+ leaf address-family {
+ type leafref {
+ path "../config/address-family";
+ }
+ description
+ "The address family associated with the connection";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the connection
+ between tables";
+ uses inter-table-policies-config;
+ }
+ container state {
+ config false;
+ description
+ "State parameters relating to the connection between
+ tables";
+ uses inter-table-policies-config;
+ }
+ }
+ }
+
+ container interfaces {
+ description
+ "The interfaces that are associated with this network
+ instance";
+
+ list interface {
+ key "id";
+ unique "config/interface config/subinterface";
+
+ description
+ "An interface associated with the network instance";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "A reference to an identifier for this interface which
+ acts as a key for this list";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the associated
+ interface";
+ uses instance-interfaces-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the
+ associated interface";
+
+ uses instance-interfaces-config;
+ uses instance-interfaces-state;
+ }
+ }
+ }
+
+ uses oc-ni-l3:l3ni-route-limit-structural {
+ when "type = 'L3VRF' or type = 'L2L3'" {
+ description
+ "Layer 3 VRF or L2/L3 instances can have route limits
+ applied. This is not supported for the default instance.";
+ }
+ }
+
+ container tables {
+ description
+ "The routing tables that are managed by this network
+ instance";
+
+ list table {
+ key "protocol address-family";
+
+ description
+ "A network instance manages one or more forwarding or
+ routing tables. These may reflect a Layer 2 forwarding
+ information base, a Layer 3 routing table, or an MPLS
+ LFIB.
+
+ The table populated by a protocol within an instance is
+ identified by the protocol identifier (e.g., BGP, IS-IS)
+ and the address family (e.g., IPv4, IPv6) supported by
+ that protocol. Multiple instances of the same protocol
+ populate a single table -- such that
+ a single IS-IS or OSPF IPv4 table exists per network
+ instance.
+
+ An implementation is expected to create entries within
+ this list when the relevant protocol context is enabled.
+ i.e., when a BGP instance is created with IPv4 and IPv6
+ address families enabled, the protocol=BGP,
+ address-family=IPv4 table is created by the system.";
+
+ leaf protocol {
+ type leafref {
+ path "../config/protocol";
+ }
+ description
+ "A reference to the protocol that populates
+ the table";
+ }
+
+ leaf address-family {
+ type leafref {
+ path "../config/address-family";
+ }
+ description
+ "A reference to the address-family that the
+ table represents";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the
+ table";
+ uses table-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters related to the table";
+ uses table-config;
+ }
+ }
+ }
+
+ container connection-points {
+ description
+ "The set of connection points within a forwarding
+ instance";
+
+ list connection-point {
+ key "connection-point-id";
+
+ description
+ "A connection point within a Layer 2 network instance.
+ Each connection-point consists of a set of interfaces
+ only one of which is active at any one time. Other than
+ the specification of whether an interface is local
+ (i.e., exists within this network-instance), or remote,
+ all configuration and state parameters are common";
+
+ leaf connection-point-id {
+ type leafref {
+ path "../config/connection-point-id";
+ }
+ description
+ "A locally significant reference for the
+ connection-point";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to a Layer 2
+ network instance connection point";
+ uses instance-connection-point-config;
+ }
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to a Layer 2
+ network instance connection point";
+
+ uses instance-connection-point-config;
+ uses instance-connection-point-state;
+ }
+
+ container endpoints {
+ when "../../../config/type = 'L2P2P' " +
+ "or ../../../config/type = 'L2VSI'" {
+ description
+ "Configuration parameters to associate interfaces
+ into a common group for use in Layer 2 network
+ instances";
+ }
+
+ description
+ "The set of endpoints which are grouped within the
+ connection point";
+
+ list endpoint {
+ key "endpoint-id";
+
+ description
+ "A list of the endpoints (interfaces or remote
+ connection points that can be used for this
+ connection point). The active endpoint is selected
+ based on the precedence that it is configured
+ with";
+
+ leaf endpoint-id {
+ type leafref {
+ path "../config/endpoint-id";
+ }
+ description
+ "A pointer to the configured identifier for the
+ endpoint";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the
+ endpoint";
+ uses instance-endpoint-config;
+ }
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the
+ endpoint";
+ uses instance-endpoint-config;
+ uses instance-endpoint-state;
+ }
+
+ container local {
+ when "../config/type = 'LOCAL'" {
+ description
+ "Only include the local configuration when
+ the endpoint is specified to be local to
+ the network element";
+ }
+
+ description
+ "Configuration and operational state parameters
+ relating to a local interface";
+
+ container config {
+ description
+ "Configuration parameters relating to a local
+ endpoint";
+ uses instance-endpoint-local-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to a
+ local endpoint";
+ uses instance-endpoint-local-config;
+ }
+ }
+
+ container remote {
+ when "../config/type = 'REMOTE'" {
+ description
+ "Only include the remote configuration when
+ the endpoint is specified to be remote to
+ the network element";
+ }
+
+ description
+ "Configuration and operational state parameters
+ relating to a remote interface";
+
+ container config {
+ description
+ "Configuration parameters relating to a remote
+ endpoint";
+ uses instance-endpoint-remote-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to
+ a remote endpoint";
+ uses instance-endpoint-remote-config;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ uses oc-mpls:mpls-top {
+ when "config/type = 'DEFAULT_INSTANCE'" {
+ description
+ "MPLS configuration is only valid within the default
+ network instance.";
+ }
+ }
+
+ uses oc-sr:sr-top {
+ when "config/type = 'DEFAULT_INSTANCE'" {
+ description
+ "Segment routing configuration is only valid with the default
+ network instance.";
+ }
+ }
+
+ uses oc-vlan:vlan-top;
+
+ uses oc-pf:policy-forwarding-top;
+
+ uses oc-aft:aft-top;
+
+ container protocols {
+ description
+ "The routing protocols that are enabled for this
+ network-instance.";
+
+ list protocol {
+ key "identifier name";
+
+ description
+ "A process (instance) of a routing protocol. Some
+ systems may not support more than one instance of
+ a particular routing protocol";
+
+ leaf identifier {
+ type leafref {
+ path "../config/identifier";
+ }
+ description
+ "The protocol name for the routing or forwarding
+ protocol to be instantiated";
+ }
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "An operator-assigned identifier for the routing
+ or forwarding protocol. For some processes this
+ leaf may be system defined.";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the routing
+ protocol instance";
+
+ uses protocols-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to the routing protocol
+ instance";
+
+ uses protocols-config;
+ uses protocols-state;
+ }
+
+ uses oc-loc-rt:local-static-top {
+ when "config/identifier = 'STATIC'" {
+ description
+ "Include static route parameters only when the
+ protocol is set to static";
+ }
+ description
+ "Configuration and state parameters relating to
+ static routes";
+ }
+
+ uses oc-loc-rt:local-aggregate-top {
+ when "config/identifier = 'LOCAL_AGGREGATE'" {
+ description
+ "Include aggregate route parameters only when the
+ protocol is set to aggregate";
+ }
+ description
+ "Configuration and state parameters relating to
+ locally generated aggregate routes";
+ }
+
+ uses oc-bgp:bgp-top {
+ when "config/identifier = 'BGP'" {
+ description
+ "Include BGP parameters only when the protocol
+ is of type BGP";
+ }
+ description
+ "Configuration and state parameters relating to
+ Border Gateway Protocol (BGP)";
+ }
+
+ uses oc-ospfv2:ospfv2-top {
+ when "config/identifier = 'OSPF'" {
+ description
+ "Include OSPFv2 parameters only when the protocol
+ is of type OSPFv2";
+ }
+ }
+
+ uses oc-isis:isis-top {
+ when "config/identifier = 'ISIS'" {
+ description
+ "Include IS-IS configuration when the protocol is of type
+ IS-IS";
+ }
+ description
+ "Configuration and state parameters relating to Intermediate
+ System to Intermediate System (IS-IS).";
+ }
+
+ uses oc-pim:pim-top {
+ when "config/identifier = 'PIM'" {
+ description
+ "Include PIM configuration when the protocol is of type
+ PIM";
+ }
+ description
+ "Configuration and state parameters relating to Protocol
+ Indepdendent Multicast (PIM).";
+ }
+
+ uses oc-igmp:igmp-top {
+ when "config/identifier = 'IGMP'" {
+ description
+ "Include IGMP configuration when the protocol is of type
+ IGMP";
+ }
+ description
+ "Configuration and state parameters relating to the Internet
+ Group Management Protocol (IGMP).";
+ }
+ }
+ }
+ }
+ }
+ }
+
+ grouping network-instance-type-dependent-config {
+ description
+ "Type dependent network instance configuration";
+
+ uses oc-ni-l3:l3ni-instance-common-config {
+ when "type = 'L3VRF' or type = 'L2L3'" {
+ description
+ "Layer 3 VRF configuration parameters included when a
+ network instance is a L3VRF or combined L2L3 instance";
+ }
+ }
+
+ uses l2ni-instance-common-config {
+ when "type = 'L2VSI' or type = 'L2P2P'" +
+ " or type = 'L2L3'" {
+ description
+ "Layer 2 configuration parameters included when
+ a network instance is a Layer 2 instance or a
+ combined L2L3 instance";
+ }
+ }
+ }
+
+ grouping instance-endpoint-config {
+ description
+ "Configuration data relating to an forwarding-instance
+ endpoint";
+
+ leaf endpoint-id {
+ type string;
+ description
+ "An identifier for the endpoint";
+ }
+
+ leaf precedence {
+ type uint16;
+ description
+ "The precedence of the endpoint - the lowest precendence
+ viable endpoint will be utilised as the active endpoint
+ within a connection";
+ }
+
+ leaf type {
+ type identityref {
+ base "oc-ni-types:ENDPOINT_TYPE";
+ }
+ description
+ "The type of endpoint that is referred to by the current
+ endpoint";
+ }
+
+ }
+
+ grouping instance-endpoint-local-config {
+ description
+ "Configuration parameters relating to an endpoint that is local
+ to the current system";
+
+ uses oc-if:interface-ref-common;
+ }
+
+ grouping instance-endpoint-remote-config {
+ description
+ "Configuration parameters relating to an endpoint that is
+ remote from the local system";
+ leaf remote-system {
+ type inet:ip-address;
+ description
+ "The IP address of the device which hosts the
+ remote end-point";
+ }
+
+ leaf virtual-circuit-identifier {
+ type uint32;
+ description
+ "The virtual-circuit identifier that identifies the
+ connection at the remote end-point";
+ }
+ }
+
+ grouping instance-endpoint-state {
+ description
+ "Operational state data relating to a forwarding-instance
+ endpoint";
+ leaf active {
+ type boolean;
+ description
+ "When the backup endpoint is active, the value of this
+ parameter is set to true";
+ }
+ }
+
+ grouping instance-connection-point-config {
+ description
+ "Configuration data relating to a forwarding-instance
+ connection point";
+
+ leaf connection-point-id {
+ type string;
+ description
+ "An identifier for a connection point";
+ }
+ }
+
+ grouping instance-connection-point-state {
+ description
+ "Operational state data relating to a forwarding-instance
+ connection point";
+ }
+
+ grouping table-config {
+ description
+ "Config parameters relating to an L2/L2.5/L3 table that exists
+ within a network instance";
+
+ leaf protocol {
+ type leafref {
+ path "../../../../protocols/protocol/config/identifier";
+ }
+ description
+ "Reference to the protocol that the table is associated with.";
+ }
+
+ leaf address-family {
+ type identityref {
+ base oc-types:ADDRESS_FAMILY;
+ }
+ description
+ "The address family (IPv4, IPv6) of the table's entries";
+ }
+ }
+
+ grouping instance-interfaces-config {
+ description
+ "Configuration parameters related to an interface associated
+ with the network instance";
+
+ leaf id {
+ type string;
+ description
+ "A unique identifier for this interface - this is expressed
+ as a free-text string";
+ }
+
+ uses oc-if:interface-ref-common;
+
+ leaf-list associated-address-families {
+ type identityref {
+ base oc-types:ADDRESS_FAMILY;
+ }
+ description
+ "The address families on the subinterface which are to be
+ associated with this network instance. When this leaf-list
+ is empty and the network instance requires Layer 3 information
+ the address families for which the network instance is
+ enabled should be imported. If the value of this leaf-list
+ is specified then the association MUST only be made for
+ those address families that are included in the list.";
+ }
+ }
+
+ grouping instance-interfaces-state {
+ description
+ "Operational state parameters relating to an interface
+ associated with this network instance";
+ }
+
+ grouping inter-table-policies-config {
+ description
+ "Configuration entries that relate to how RIB or FIB entries
+ are propagated between tables within the same network
+ instance";
+
+ leaf src-protocol {
+ type leafref {
+ // we are at table-connections/table-connection/config/.
+ path "../../../../tables/table/config/protocol";
+ }
+ description
+ "The source protocol for the table connection";
+ }
+
+ leaf address-family {
+ type leafref {
+ // we are at table-connections/table-connection/config/.
+ path "../../../../tables/" +
+ "table[protocol=current()/../src-protocol]/" +
+ "config/address-family";
+ }
+ description
+ "The address family associated with the connection. This
+ must be defined for the source protocol. The target
+ address family is implicitly defined by the address family
+ specified for the source protocol.";
+ }
+
+ leaf dst-protocol {
+ type leafref {
+ path "../../../../tables/table/config/protocol";
+ }
+ description
+ "The destination protocol for the table connection";
+ }
+
+ uses oc-rpol:apply-policy-import-config;
+ }
+
+ grouping network-instance-config {
+ description
+ "Configuration parameters relating to a top-level network
+ instance";
+
+ leaf name {
+ type string;
+ description
+ "An operator-assigned unique name for the forwarding
+ instance";
+ }
+
+ leaf type {
+ type identityref {
+ base "oc-ni-types:NETWORK_INSTANCE_TYPE";
+ }
+ description
+ "The type of network instance. The value of this leaf
+ indicates the type of forwarding entries that should be
+ supported by this network instance";
+ }
+
+ leaf enabled {
+ type boolean;
+ description
+ "Whether the network instance should be configured to be
+ active on the network element";
+ }
+
+ leaf description {
+ type string;
+ description
+ "A free-form string to be used by the network operator to
+ describe the function of this network instance";
+ }
+
+ leaf router-id {
+ type yang:dotted-quad;
+ description
+ "A identifier for the local network instance - typically
+ used within associated routing protocols or signalling
+ routing information in another network instance";
+ }
+
+ leaf route-distinguisher {
+ type oc-ni-types:route-distinguisher;
+ description
+ "The route distinguisher that should be used for the local
+ VRF or VSI instance when it is signalled via BGP.";
+ }
+ }
+
+ grouping network-instance-state {
+ description
+ "Operational state parameters relating to a network instance";
+ }
+
+ grouping protocols-config {
+ description
+ "Configuration parameters relating to a generic protocol
+ instance within a network instance";
+
+ leaf identifier {
+ type identityref {
+ base "oc-pol-types:INSTALL_PROTOCOL_TYPE";
+ }
+ description
+ "The protocol identifier for the instance";
+ }
+
+ leaf name {
+ type string;
+ description
+ "A unique name for the protocol instance";
+ }
+
+ leaf enabled {
+ type boolean;
+ description
+ "A boolean value indicating whether the local protocol
+ instance is enabled.";
+ }
+
+ leaf default-metric {
+ type uint32;
+ description
+ "The default metric within the RIB for entries that are
+ installed by this protocol instance. This value may
+ be overridden by protocol specific configuration options.
+ The lower the metric specified the more preferable the RIB
+ entry is to be selected for use within the network instance.
+ Where multiple entries have the same metric value then these
+ equal cost paths should be treated according to the specified
+ ECMP path selection behaviour for the instance";
+ }
+ }
+
+ grouping protocols-state {
+ description
+ "Operational state parameters relating to a protocol instance";
+ }
+
+ grouping instance-interface-association-config {
+ description
+ "Grouping containing leaves that are to be augmented into an
+ interface or subinterface to include mapping to a network
+ instance";
+
+ leaf network-instance {
+ type leafref {
+ path "/network-instances/network-instance/name";
+ }
+ description
+ "The network instance that this interface is associated
+ with";
+ }
+ }
+
+ grouping encapsulation-config {
+ description
+ "Type agnostic configuration parameters relating to the
+ encapsulation of the network instance";
+
+ leaf encapsulation-type {
+ type identityref {
+ base oc-ni-types:ENCAPSULATION;
+ }
+ description
+ "The on-the-wire encapsulation that should be used when
+ sending traffic from this network instance";
+ }
+
+ // rjs: This is left here as I suspect that this can
+ // be used in EVPN. Need to validate implementations, otherwise
+ // move to L3. (TODO)
+ leaf label-allocation-mode {
+ type identityref {
+ base oc-ni-types:LABEL_ALLOCATION_MODE;
+ }
+ description
+ "The label allocation mode to be used for L3 entries
+ in the network instance";
+ }
+ }
+
+ uses network-instance-top;
+}
diff --git a/src/plugins/yang/openconfig/openconfig-openflow-types.yang b/src/plugins/yang/openconfig/openconfig-openflow-types.yang
new file mode 100644
index 0000000..41c5dc0
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-openflow-types.yang
@@ -0,0 +1,93 @@
+module openconfig-openflow-types {
+
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/openflow/types";
+
+ prefix "openflow-types";
+
+ import openconfig-extensions { prefix oc-ext; }
+
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines types related to the Openflow configuration
+ and operational state model.";
+
+ oc-ext:openconfig-version "0.1.1";
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.Initial revision";
+ reference "0.1.1";
+ }
+
+ revision "2017-06-01" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+
+ typedef failure-mode {
+ type enumeration {
+ enum SECURE {
+ description
+ "Packets and messages destined to the controllers are
+ dropped. Flow entries continue to expire according to
+ their timeouts.";
+ }
+ enum STANDALONE {
+ description
+ "Processes all packets using the OFPP_NORMAL reserved
+ port. The switch acts as a legacy Ethernet switch or
+ router.";
+ }
+ }
+ description
+ "Type to define Openflow failure mode.";
+ }
+
+ typedef transport {
+ type enumeration {
+ enum TCP {
+ description
+ "Transmission Control Protocol (TCP).";
+ }
+ enum TLS {
+ description
+ "Transport Layer Security (TLS).";
+ }
+ }
+ description
+ "Type to define Openflow transport protocol.";
+ }
+
+ typedef auxiliary-id {
+ type uint8 {
+ range "0..15";
+ }
+ description
+ "A Controller may have multiple auxiliary connections as
+ specified by the Openflow protocol. The main Controller
+ connection should always have the auxiliary-id set to zero.
+ All other connections must have an auxiliary-id different
+ from 0.";
+ }
+
+ typedef datapath-id {
+ type string {
+ pattern '^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){7}$';
+ }
+ description
+ "The datapath-id type represents an OpenFlow
+ datapath identifier. The lower 48-bits are for
+ a MAC address, while the upper 16-bits are
+ implementer-defined.";
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-openflow.yang b/src/plugins/yang/openconfig/openconfig-openflow.yang
new file mode 100644
index 0000000..ab7a433
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-openflow.yang
@@ -0,0 +1,314 @@
+module openconfig-openflow {
+
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/openflow";
+
+ prefix "openflow";
+
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-openflow-types { prefix of-types; }
+ import openconfig-system { prefix oc-sys; }
+
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and operational state data for
+ Openflow.";
+
+ oc-ext:openconfig-version "0.1.1";
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.Initial revision";
+ reference "0.1.1";
+ }
+
+ revision "2017-06-01" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ grouping openflow-controller-config {
+ description
+ "Openflow controller config";
+
+ leaf name {
+ type string;
+ description "Name of this Openflow controller. All connections
+ for the same controller need to have the same name.";
+ }
+ }
+
+ grouping openflow-controller-state {
+ description
+ "Openflow controller state";
+ }
+
+ grouping openflow-controllers-top {
+ description
+ "Top-level for the Openflow controllers model";
+
+ container controllers {
+ description
+ "Container for the Openflow controllers model";
+
+ list controller {
+ key "name";
+
+ description
+ "The Openflow Switch connects to all Openflow controllers
+ configured";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "The name identifies the controller.";
+ }
+
+ container config {
+ description
+ "Container for the Openflow controller config.";
+
+ uses openflow-controller-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Container for the Openflow controller state.";
+
+ uses openflow-controller-config;
+ uses openflow-controller-state;
+ }
+
+ uses openflow-connections-top;
+ }
+ }
+ }
+
+
+ grouping openflow-connections-config {
+ description
+ "Configuration data for OpenFlow controller connections";
+
+ leaf aux-id {
+ type of-types:auxiliary-id;
+ description
+ "Controller auxiliary ID. Must be 0 for the main controller.
+ One controller may have multiple auxiliary connections as
+ specified by the Openflow protocol. Besides configuring the
+ main controller, it is also possible to configure auxiliary
+ connections. The main controller must have the aux-id
+ set to zero. All others must have an aux-id different
+ from 0.";
+ }
+
+ leaf priority {
+ type uint8;
+ description
+ "Optional value for servicing auxiliary connections with
+ different priorities.";
+ }
+
+ leaf address {
+ type oc-inet:ip-address;
+ description
+ "The IP address of the controller.";
+ }
+
+ leaf port {
+ type oc-inet:port-number;
+ default 6653;
+ description
+ "Controller port to use.";
+ }
+
+ leaf transport {
+ type of-types:transport;
+ default TCP;
+ description
+ "Controller transport protocol used.";
+ }
+
+ leaf certificate-id {
+ type string;
+ description
+ "Certificate ID is used for TLS connections. When installed,
+ certificates are associated with an ID. This ID specifies the
+ certificate to use in a TLS connection.";
+ }
+
+ leaf source-interface {
+ type oc-if:base-interface-ref;
+ description
+ "Optionally specify the source interface for the
+ controller connection.";
+ }
+ }
+
+ grouping openflow-connections-state {
+ description
+ "Operational state data for OpenFlow controller connections";
+
+ leaf connected {
+ type boolean;
+ description
+ "When set to true, indicates the connection between the
+ switch and controller is established.";
+ }
+ }
+
+ grouping openflow-connections-top {
+ description
+ "Top-level grouping for OpenFlow controller connections";
+
+ container connections {
+ description
+ "Enclosing container for list of controller connections";
+
+ list connection {
+ key "aux-id";
+ description
+ "List of connections to the OpenFlow controller.
+ The Openflow switch always connects to configured Openflow
+ controllers. Each controller can have more than one
+ connection, called auxiliary Openflow connections.";
+
+ leaf aux-id {
+ type leafref {
+ path "../config/aux-id";
+ }
+ description
+ "Reference to auxiliary id list key";
+ }
+
+ container config {
+ description
+ "Configuration data for OpenFlow controller connections";
+
+ uses openflow-connections-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for OpenFlow controller
+ connections";
+
+ uses openflow-connections-config;
+ uses openflow-connections-state;
+ }
+ }
+ }
+ }
+
+
+ grouping openflow-agent-config {
+ description
+ "Openflow agent config";
+
+ leaf datapath-id {
+ type of-types:datapath-id;
+ description
+ "Datapath unique ID. The lower 48-bits are for
+ a MAC address, while the upper 16-bits are
+ implementer-defined.";
+ }
+
+ leaf failure-mode {
+ type of-types:failure-mode;
+ description
+ "Failure mode for Openflow.";
+ }
+
+ leaf backoff-interval {
+ type uint32;
+ units seconds;
+ description
+ "Openflow agent connection backoff interval.";
+ }
+
+ leaf max-backoff {
+ type uint32;
+ units seconds;
+ description
+ "Openflow agent max backoff time.";
+ }
+
+ leaf inactivity-probe {
+ type uint32;
+ units seconds;
+ description
+ "Openflow agent inactivity probe period.";
+ }
+ }
+
+ grouping openflow-agent-state {
+ description
+ "Openflow agent state";
+ }
+
+ grouping openflow-agent-top {
+ description
+ "Top-level for the Openflow agent model";
+
+ container agent {
+ description
+ "Container for the Openflow agent model.";
+
+ container config {
+ description
+ "Container for the Openflow agent config.";
+
+ uses openflow-agent-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Container for the Openflow agent state.";
+
+ uses openflow-agent-config;
+ uses openflow-agent-state;
+ }
+ }
+ }
+
+
+ grouping openflow-top {
+ description
+ "Top-level for the Openflow model";
+
+ container openflow {
+ description
+ "Container for Openflow model";
+
+
+ uses openflow-controllers-top;
+ uses openflow-agent-top;
+ }
+ }
+
+
+ augment "/oc-sys:system" {
+ description
+ "Adding OpenConfig data to the system model";
+
+ uses openflow-top;
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-optical-amplifier.yang b/src/plugins/yang/openconfig/openconfig-optical-amplifier.yang
new file mode 100644
index 0000000..1467148
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-optical-amplifier.yang
@@ -0,0 +1,474 @@
+module openconfig-optical-amplifier {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/optical-amplfier";
+
+ prefix "oc-opt-amp";
+
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-transport-line-common { prefix oc-line-com; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This model describes configuration and operational state data
+ for optical amplifiers, deployed as part of a transport
+ line system.";
+
+ oc-ext:openconfig-version "0.4.0";
+
+ revision "2017-10-02" {
+ description
+ "Add support for fiber type profile and physical component
+ association for amplifier gain blocks.";
+ reference "0.4.0";
+ }
+
+ revision "2017-09-08" {
+ description
+ "Correct bug with OSC interfaces";
+ reference "0.3.1";
+ }
+
+ revision "2017-07-08" {
+ description
+ "Add monitor port type and refs to hw ports, ";
+ reference "0.3.0";
+ }
+
+ revision "2017-03-28" {
+ description
+ "Added min/max/avg stats, status for media channels, OCM, APS";
+ reference "0.2.0";
+ }
+
+ revision "2016-03-31" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ identity OPTICAL_AMPLIFIER_TYPE {
+ description
+ "Type definition for different types of optical amplifiers";
+ }
+
+ identity EDFA {
+ base OPTICAL_AMPLIFIER_TYPE;
+ description
+ "Erbium doped fiber amplifer (EDFA)";
+ }
+
+ identity FORWARD_RAMAN {
+ base OPTICAL_AMPLIFIER_TYPE;
+ description
+ "Forward pumping Raman amplifier";
+ }
+
+ identity BACKWARD_RAMAN {
+ base OPTICAL_AMPLIFIER_TYPE;
+ description
+ "Backward pumping Raman amplifier";
+ }
+
+ identity HYBRID {
+ base OPTICAL_AMPLIFIER_TYPE;
+ description
+ "Hybrid backward pumping Raman + EDFA amplifier";
+ }
+
+ identity GAIN_RANGE {
+ description
+ "Base type for expressing the gain range for a switched gain
+ amplifier. The gain range is expressed as a generic setting,
+ e.g., LOW/MID/HIGH. The actual db range will be determined
+ by the implementation.";
+ }
+
+ identity LOW_GAIN_RANGE {
+ base GAIN_RANGE;
+ description
+ "LOW gain range setting";
+ }
+
+ identity MID_GAIN_RANGE {
+ base GAIN_RANGE;
+ description
+ "MID gain range setting";
+ }
+
+ identity HIGH_GAIN_RANGE {
+ base GAIN_RANGE;
+ description
+ "HIGH gain range setting";
+ }
+
+ identity FIXED_GAIN_RANGE {
+ base GAIN_RANGE;
+ description
+ "Fixed or non-switched gain amplfier";
+ }
+
+ identity OPTICAL_AMPLIFIER_MODE {
+ description
+ "Type definition for different types of optical amplifier
+ operating modes";
+ }
+
+ identity CONSTANT_POWER {
+ base OPTICAL_AMPLIFIER_MODE;
+ description
+ "Constant power mode";
+ }
+
+ identity CONSTANT_GAIN {
+ base OPTICAL_AMPLIFIER_MODE;
+ description
+ "Constant gain mode";
+ }
+
+
+ identity FIBER_TYPE_PROFILE {
+ description
+ "Type definition for different profiles of fiber types";
+ }
+
+ identity DSF {
+ base FIBER_TYPE_PROFILE;
+ description
+ "Dispersion shifted fiber";
+ }
+
+ identity LEAF {
+ base FIBER_TYPE_PROFILE;
+ description
+ "Large effective area fiber";
+ }
+
+ identity SSMF {
+ base FIBER_TYPE_PROFILE;
+ description
+ "Standard single mode fiber";
+ }
+
+ identity TWC {
+ base FIBER_TYPE_PROFILE;
+ description
+ "True wave classic";
+ }
+
+ identity TWRS {
+ base FIBER_TYPE_PROFILE;
+ description
+ "True wave reduced slope";
+ }
+
+ // grouping statements
+
+ grouping optical-amplifier-config {
+ description
+ "Configuration data for optical amplifiers";
+
+ leaf name {
+ type string;
+ description
+ "User-defined name assigned to identify a specific amplifier
+ in the device";
+ }
+
+ leaf type {
+ type identityref {
+ base OPTICAL_AMPLIFIER_TYPE;
+ }
+ description
+ "Type of the amplifier";
+ }
+
+ leaf target-gain {
+ type decimal64 {
+ fraction-digits 2;
+ range 0..max;
+ }
+ units dB;
+ description
+ "Positive gain applied by the amplifier.";
+ }
+
+ leaf target-gain-tilt {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ description
+ "Gain tilt control";
+ }
+
+ leaf gain-range {
+ type identityref {
+ base GAIN_RANGE;
+ }
+ description
+ "Selected gain range. The gain range is a platform-defined
+ value indicating the switched gain amplifier setting";
+ }
+
+ leaf amp-mode {
+ type identityref {
+ base OPTICAL_AMPLIFIER_MODE;
+ }
+ description
+ "The operating mode of the amplifier";
+ }
+
+ leaf target-output-power {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dBm;
+ description
+ "Output optical power of the amplifier.";
+ }
+
+ leaf enabled {
+ type boolean;
+ description
+ "Turns power on / off to the amplifiers gain module.";
+ }
+
+ leaf fiber-type-profile {
+ type identityref {
+ base FIBER_TYPE_PROFILE;
+ }
+ description
+ "The fiber type profile specifies details about the
+ fiber type which are needed to accurately determine
+ the gain and perform efficient amplification. This is
+ only needed for Raman type amplifiers.";
+ }
+
+ }
+
+ grouping optical-amplifier-state {
+ description
+ "Operational state data for optical amplifiers";
+
+ leaf component {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ description
+ "Reference to the system-supplied physical component that
+ the amplifier gain block is contained within. Multiple
+ amplifier gain blocks may be contained within the same
+ physical component.";
+ }
+
+ leaf ingress-port {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ description
+ "Reference to system-supplied name of the amplifier ingress
+ port. This leaf is only valid for ports of type INGRESS.";
+ }
+
+ leaf egress-port {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ description
+ "Reference to system-supplied name of the amplifier egress
+ port. This leaf is only valid for ports of type EGRESS.";
+ }
+
+ container actual-gain {
+ description
+ "The actual gain applied by the amplifier in units of
+ 0.01dB. If avg/min/max statistics are not supported,
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dB;
+ }
+
+ container actual-gain-tilt {
+ description
+ "The actual tilt applied by the amplifier in units of
+ 0.01dB. If avg/min/max statistics are not supported,
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dB;
+ }
+
+ container input-power-total {
+ description
+ "The total input optical power of this port in units
+ of 0.01dBm. If avg/min/max statistics are not supported,
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container input-power-c-band {
+ description
+ "The C band (consisting of approximately 191 to 195 THz or
+ 1530nm to 1565 nm) input optical power of this port in units
+ of 0.01dBm. If avg/min/max statistics are not supported,
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container input-power-l-band {
+ description
+ "The L band (consisting of approximately 184 to 191 THz or
+ 1565 to 1625 nm) input optical power of this port in units
+ of 0.01dBm. If avg/min/max statistics are not supported,
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container output-power-total {
+ description
+ "The total output optical power of this port in units
+ of 0.01dBm. If avg/min/max statistics are not supported,
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container output-power-c-band {
+ description
+ "The C band (consisting of approximately 191 to 195 THz or
+ 1530nm to 1565 nm)output optical power of this port in units
+ of 0.01dBm. If avg/min/max statistics are not supported,
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container output-power-l-band {
+ description
+ "The L band (consisting of approximately 184 to 191 THz or
+ 1565 to 1625 nm)output optical power of this port in units
+ of 0.01dBm. If avg/min/max statistics are not supported,
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container laser-bias-current {
+ description
+ "The current applied by the system to the transmit laser to
+ achieve the output power. The current is expressed in mA
+ with up to two decimal precision. If avg/min/max statistics
+ are not supported, just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-mA;
+ }
+
+ container optical-return-loss {
+ description
+ "The optical return loss (ORL) is the ratio of the light
+ reflected back into the port to the light launched out of
+ the port. ORL is in units of 0.01dBm. If avg/min/max
+ statistics are not supported, just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+ }
+
+ grouping optical-amplifier-top {
+ description
+ "Top-level grouping for optical amplifier data";
+
+ container optical-amplifier {
+ description
+ "Enclosing container for amplifiers and supervisory channels";
+
+ container amplifiers {
+ description
+ "Enclosing container for list of amplifiers";
+
+ list amplifier {
+ key "name";
+ description
+ "List of optical amplifiers present in the device";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the name of the amplifier";
+ }
+
+ container config {
+ description
+ "Configuration data for the amplifier";
+
+ uses optical-amplifier-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the amplifier";
+
+ uses optical-amplifier-config;
+ uses optical-amplifier-state;
+ }
+ }
+ }
+
+ container supervisory-channels {
+ description
+ "Enclosing container for list of supervisory channels";
+
+ list supervisory-channel {
+ key "interface";
+ description
+ "List of supervisory channels";
+
+ leaf interface {
+ type leafref {
+ path "../config/interface";
+ }
+ description
+ "Reference to the interface of the supervisory channel";
+ }
+
+ uses oc-line-com:optical-osc-top;
+ }
+ }
+ }
+ }
+
+ // data definition statements
+
+ uses optical-amplifier-top;
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-ospf-policy.yang b/src/plugins/yang/openconfig/openconfig-ospf-policy.yang
new file mode 100644
index 0000000..35b915a
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-ospf-policy.yang
@@ -0,0 +1,188 @@
+module openconfig-ospf-policy {
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/ospf-policy";
+
+ prefix "oc-ospf-pol";
+
+ import openconfig-routing-policy { prefix "oc-rpol"; }
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-ospf-types { prefix "oc-ospf-types"; }
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines extensions to the OpenConfig policy
+ model to add extensions for OSPF. This module is intended
+ to be generic for both OSPFv2 and OSPFv3.";
+
+ oc-ext:openconfig-version "0.1.2";
+
+ revision "2018-06-05" {
+ description
+ "Bug fixes in when statements in lsdb";
+ reference "0.1.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "0.1.1";
+ }
+
+ revision "2016-08-22" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ grouping ospf-match-config {
+ description
+ "Configuration parameters for OSPF match conditions";
+
+ leaf area-eq {
+ type oc-ospf-types:ospf-area-identifier;
+ description
+ "Match prefixes which are within a particular OSPF area";
+ }
+ }
+
+ grouping ospf-match-conditions {
+ description
+ "Match conditions that are added by OSPF";
+
+ container ospf-conditions {
+ description
+ "Match conditions specific to OSPF";
+
+ container config {
+ description
+ "Configuration parameters relating to OSPF match conditions";
+
+ uses ospf-match-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to OSPF match conditions";
+
+ uses ospf-match-config;
+ }
+ }
+ }
+
+ grouping ospf-actions-config {
+ description
+ "Configuration parameters for OSPF policy actions";
+
+ leaf set-area {
+ type oc-ospf-types:ospf-area-identifier;
+ description
+ "Set the area for the matched route. This action is typically
+ used when importing prefixes into OSPF, such that a route can
+ be imported into a specific area within the instance.";
+ }
+ }
+
+ grouping ospf-actions-set-metric-config {
+ description
+ "Configuration parameters relating to setting the OSPF metric";
+
+ leaf metric-type {
+ type enumeration {
+ enum EXTERNAL_TYPE_1 {
+ description
+ "Set the external type 1 metric";
+ }
+ enum EXTERNAL_TYPE_2 {
+ description
+ "Set the external type 2 metric";
+ }
+ }
+ default "EXTERNAL_TYPE_2";
+ description
+ "Specify the type of metric which is to be set by the policy";
+ }
+
+ leaf metric {
+ type oc-ospf-types:ospf-metric;
+ description
+ "Set the metric of the routes matching the policy to the value
+ specified by this leaf.";
+ }
+ }
+
+ grouping ospf-actions {
+ description
+ "Actions that are added by OSPF to the action framework";
+
+ container ospf-actions {
+ description
+ "Actions specific to OSPF";
+
+ container config {
+ description
+ "Configuration parameters for OSPF actions";
+
+ uses ospf-actions-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for OSPF actions";
+
+ uses ospf-actions-config;
+ }
+
+ container set-metric {
+ description
+ "Configuration and state parameters relating to manipulating
+ the OSPF metric";
+
+ container config {
+ description
+ "Configuration parameters relating to setting the OSPF metric";
+ uses ospf-actions-set-metric-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to setting the OSPF
+ metric";
+
+ uses ospf-actions-set-metric-config;
+ }
+ }
+ }
+ }
+
+ // augment the groupings into the routing policy model
+
+ // TODO: discuss whether igp-actions should be used or whether this should
+ // be removed.
+
+ augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+ "oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
+ "oc-rpol:conditions" {
+ description
+ "Add OSPF specific match conditions to the routing policy model";
+ uses ospf-match-conditions;
+ }
+
+ augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+ "oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
+ "oc-rpol:actions" {
+ description
+ "Add OSPF specific actions to the routing policy model";
+ uses ospf-actions;
+ }
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-ospf-types.yang b/src/plugins/yang/openconfig/openconfig-ospf-types.yang
new file mode 100644
index 0000000..0544670
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-ospf-types.yang
@@ -0,0 +1,784 @@
+module openconfig-ospf-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/ospf-types";
+
+ prefix "oc-ospf-types";
+
+ // import some basic types
+ 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
+ "Type definitions for OSPF";
+
+ oc-ext:openconfig-version "0.1.2";
+
+ revision "2018-06-05" {
+ description
+ "Bug fixes in when statements in lsdb";
+ reference "0.1.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "0.1.1";
+ }
+
+ revision "2017-02-28"{
+ description
+ "Initial public release of OSPFv2";
+ reference "0.1.0";
+ }
+
+ revision "2016-06-24" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ // typedefs
+ typedef ospf-area-identifier {
+ type union {
+ type uint32;
+ type yang:dotted-quad;
+ }
+ description
+ "An identifier for an area with OSPF version 2 or 3. This value
+ is expressed as either a dotted-quad, or a unsigned 32-bit
+ number";
+ }
+
+ typedef ospf-metric {
+ type uint16;
+ description
+ "A common type that can be utilised to express an OSPF metric";
+ }
+
+ typedef sr-sid-type {
+ type enumeration {
+ enum LABEL {
+ description
+ "When the length of the SR/Label Sub-TLV is specified to be 3, then
+ the right-most 20-bits represent a label value within the SR/Label
+ Sub-TLV. When this leaf is set to a value of Label the first-entry
+ leaf should be interpreted to be an MPLS label.";
+ }
+ enum SID {
+ description
+ "When the length of the SR/Label Sub-TLV is specified to be 4, then
+ the value specified in the first-entry leaf should be specified to
+ be a segment identifier.";
+ }
+ }
+ description
+ "A common type used to express the type of segment identifier that is
+ used in LSDB entries relating to segment routing";
+ }
+
+ // identities
+ identity OSPF_LSA_TYPE {
+ description
+ "Base identity for an OSPF LSA type. This identity is intended
+ to be used across both OSPFv2 and OSPFv3. Identity values that
+ correspond to only one OSPF version are marked as such.";
+ }
+
+ identity ROUTER_LSA {
+ base "OSPF_LSA_TYPE";
+ description
+ "Type 1 - ROUTER_LSA. An LSA originated by each router within
+ the area describing the state and cost of the router's links
+ in the area.";
+ reference "RFC2328";
+ }
+
+ identity NETWORK_LSA {
+ base "OSPF_LSA_TYPE";
+ description
+ "Type 2 - NETWORK_LSA. An LSA originated for each broadcast and
+ non-broadcast multiple access (NBMA) in the area. This LSA is
+ originated by the designated router.";
+ reference "RFC2328";
+ }
+
+ identity SUMMARY_IP_NETWORK_LSA {
+ base "OSPF_LSA_TYPE";
+ description
+ "Type 3 - SUMMARY_IP_NETWORK_LSA. An LSA originated by area
+ border routers describing inter-area destinations. This LSA type
+ is used when the destination is an IP network";
+ reference "RFC2328";
+ }
+
+ identity SUMMARY_ASBR_LSA {
+ base "OSPF_LSA_TYPE";
+ description
+ "Type 4 - SUMMARY_ASBR_LSA. An LSA originated by an area border
+ router describing inter-area destinations. This LSA type is used
+ when the destination is an AS boundary router.";
+ reference "RFC2328";
+ }
+
+ identity AS_EXTERNAL_LSA {
+ base "OSPF_LSA_TYPE";
+ description
+ "Type 5 - AS_EXTERNAL_LSA. This LSA type is used to describe
+ destinations external to the autonomous system, and is
+ originated by an AS boundary router (ASBR).";
+ reference "RFC2328";
+ }
+
+ identity NSSA_AS_EXTERNAL_LSA {
+ base "OSPF_LSA_TYPE";
+ description
+ "Type 7 - NSSA_AS_EXTERNAL_LSA. This LSA type is used by
+ systems within a not-so-stubby-area (NSSA) to inject external
+ prefixes into the LSDB. They are translated to Type 5 LSAs
+ at an ABR device.";
+ reference "RFC3101";
+ }
+
+ identity OSPFV2_LINK_SCOPE_OPAQUE_LSA {
+ base "OSPF_LSA_TYPE";
+ description
+ "Type 9 - OSPFV2_LINK_SCOPE_OPAQUE_LSA. This LSA type is used
+ in OSPFv2 to distribute arbitrary information via the OSPF
+ protocol. The contents is specific to the application defining
+ the Opaque Type specified within the LSDB. LSAs with Type 9 have
+ a scope of the link that they are being transmitted on (and the
+ associated network or subnetwork).";
+ reference "RFC5250";
+ }
+
+ identity OSPFV2_AREA_SCOPE_OPAQUE_LSA {
+ base "OSPF_LSA_TYPE";
+ description
+ "Type 10 - OSPFV2_AREA_SCOPE_OPAQUE_LSA. This LSA type is used
+ in OSPFv2 to distribute arbitrary information via the OSPF
+ protocol. The contents is specific to the application defining
+ the Opaque Type specified within the LSDB. LSAs with Type 10 have
+ a scope of the area that they are transmitted within.";
+ reference "RFC5250";
+ }
+
+ identity OSPFV2_AS_SCOPE_OPAQUE_LSA {
+ base "OSPF_LSA_TYPE";
+ description
+ "Type 11 - OSPFV2_AS_SCOPE_OPAQUE_LSA. This LSA type is used
+ in OSPFv2 to distribute arbitrary information via the OSPF
+ protocol. The contents is specific to the application defining
+ the Opaque Type specified within the LSDB. LSAs with Type 11
+ have a scope of the autonomous system that they are transmitted
+ within.";
+ reference "RFC5250";
+ }
+
+ identity ROUTER_LSA_TYPES {
+ description
+ "Sub-types of the router LSA";
+ }
+
+ identity ROUTER_LSA_P2P {
+ base "ROUTER_LSA_TYPES";
+ description
+ "The LSA represents a point-to-point connection to another
+ router";
+ }
+
+ identity ROUTER_LSA_TRANSIT_NETWORK {
+ base "ROUTER_LSA_TYPES";
+ description
+ "The LSA represents a connection to a transit network";
+ }
+
+ identity ROUTER_LSA_STUB_NETWORK {
+ base "ROUTER_LSA_TYPES";
+ description
+ "The LSA represents a connection to a stub network";
+ }
+
+ identity ROUTER_LSA_VIRTUAL_LINK {
+ base "ROUTER_LSA_TYPES";
+ description
+ "The LSA represents a virtual link connection";
+ }
+
+ identity OSPF_NEIGHBOR_STATE {
+ description
+ "The state of an adjacency between the local system and a remote
+ device";
+ }
+
+ identity DOWN {
+ base "OSPF_NEIGHBOR_STATE";
+ description
+ "The initial state of a neighbor, indicating that no recent
+ information has been received from the neighbor.";
+ reference "RFC2328";
+ }
+
+ identity ATTEMPT {
+ base "OSPF_NEIGHBOR_STATE";
+ description
+ "Utilised for neighbors that are attached to NBMA networks, it
+ indicates that no information has been recently received from
+ the neighbor but that Hello packets should be directly sent
+ to that neighbor.";
+ reference "RFC2328";
+ }
+
+ identity INIT {
+ base "OSPF_NEIGHBOR_STATE";
+ description
+ "Indicates that a Hello packet has been received from the
+ neighbor but bi-directional communication has not yet been
+ established. That is to say that the local Router ID does
+ not appear in the list of neighbors in the remote system's
+ Hello packet.";
+ reference "RFC2328";
+ }
+
+ identity TWO_WAY {
+ base "OSPF_NEIGHBOR_STATE";
+ description
+ "Communication between the local and remote system is
+ bi-directional such that the local system's Router ID is listed
+ in the received remote system's Hello packet.";
+ reference "RFC2328";
+ }
+
+ identity EXSTART {
+ base "OSPF_NEIGHBOR_STATE";
+ description
+ "An adjacency with the remote system is being formed. The local
+ system is currently transmitting empty database description
+ packets in order to establish the master/slave relationship for
+ the adjacency.";
+ reference "RFC2328";
+ }
+
+ identity EXCHANGE {
+ base "OSPF_NEIGHBOR_STATE";
+ description
+ "The local and remote systems are currently exchanging database
+ description packets in order to determine which elements of
+ their local LSDBs are out of date.";
+ reference "RFC2328";
+ }
+
+ identity LOADING {
+ base "OSPF_NEIGHBOR_STATE";
+ description
+ "The local system is sending Link State Request packets to the
+ remote system in order to receive the more recently LSAs that
+ were discovered during the Exchange phase of the procedure
+ establishing the adjacency.";
+ reference "RFC2328";
+ }
+
+ identity FULL {
+ base "OSPF_NEIGHBOR_STATE";
+ description
+ "The neighboring routers are fully adjacent such that both
+ LSDBs are synchronized. The adjacency will appear in Router and
+ Network LSAs";
+ reference "RFC2328";
+ }
+
+ identity OSPF_NETWORK_TYPE {
+ description
+ "Types of network that OSPF should consider attached to an
+ interface";
+ }
+
+ identity POINT_TO_POINT_NETWORK {
+ base "OSPF_NETWORK_TYPE";
+ description
+ "A interface that connects two routers.";
+ reference "RFC2328";
+ }
+
+ identity BROADCAST_NETWORK {
+ base "OSPF_NETWORK_TYPE";
+ description
+ "An interface that supports >2 attached routers which has the
+ ability to address all connected systems via a single
+ (broadcast) address.";
+ }
+
+ identity NON_BROADCAST_NETWORK {
+ base "OSPF_NETWORK_TYPE";
+ description
+ "An interface that supports >2 attached rotuers which does not
+ have the ability to address all connected systems with a
+ broadcast address.";
+ }
+
+ // rjs TODO: Maybe need p2mp here.
+
+
+ identity OSPF_OPAQUE_LSA_TYPE {
+ description
+ "This identity is the base used for opaque LSA types. The values
+ that extend this base are those that are described in the IANA
+ OSPF Opaque Link-State Advertisements (LSA) Option Types registry";
+ }
+
+ identity TRAFFIC_ENGINEERING {
+ base "OSPF_OPAQUE_LSA_TYPE";
+ description
+ "The Traffic Engineering LSA. This type is used only with area-scope
+ Opaque LSAs - and is used to describe routers, point-to-point links
+ and connections to multi-access networks for traffic engineering
+ purposes.";
+ reference "RFC3630";
+ }
+
+ identity GRACE_LSA {
+ base "OSPF_OPAQUE_LSA_TYPE";
+ description
+ "Grace LSAs are announced by a system undergoing graceful-restart.
+ A system that is attempting an OSPF graceful restart announces
+ Grace-LSAs with a specified grace period, indicating the intention
+ to have completed an restart within the specified period.";
+ reference "RFC3623";
+ }
+
+ identity ROUTER_INFORMATION {
+ base "OSPF_OPAQUE_LSA_TYPE";
+ description
+ "The Router Information LSA is used by an OSPFv2 system to announce
+ optional capabilities of the local system, over and above those that
+ are included within the OSPF hello message field. The flooding scope
+ of the LSA can be link-, area-, or AS-wide (i.e., the LSA type can
+ be 9, 10 or 11).";
+ reference "RFC7770";
+ }
+
+ identity OSPFV2_EXTENDED_PREFIX {
+ base "OSPF_OPAQUE_LSA_TYPE";
+ description
+ "The Extended Prefix LSA is used in OSPFv2 to carry a set of attributes
+ that are to be associated with a prefix that is advertised in OSPF. The
+ attributes are carried as one or more TLV tuples. The flooding scope
+ of the LSA can be link-, area-, or AS-wide as specified by the
+ advertising system. The flooding scope of the LSA may exceed the scope
+ of the corresponding prefix.";
+ reference "RFC7684";
+ }
+
+ identity OSPFV2_EXTENDED_LINK {
+ base "OSPF_OPAQUE_LSA_TYPE";
+ description
+ "The Extended Link LSA is used in OSPFv2 to carry a set of attributes
+ that are to be associated with a link that is advertised in OSPF. The
+ link attributes are carried as one or more TLV tuples. The flooding
+ scope of the link LSA is area-local - i.e., it is carried in a Type 10
+ opaque LSA.";
+ reference "RFC7684";
+ }
+
+ identity OSPF_TE_LSA_TLV_TYPE {
+ description
+ "This identity is the base used for the type field of TLVs that are
+ included within the Traffic Engineering Opaque LSA.";
+ }
+
+ identity TE_ROUTER_ADDRESS {
+ base "OSPF_TE_LSA_TLV_TYPE";
+ description
+ "A stable IP address of the advertising router that is always reachable
+ if the node has connectivity.";
+ }
+
+ identity TE_LINK {
+ base "OSPF_TE_LSA_TLV_TYPE";
+ description
+ "A single link within a traffic engineering topology. A set of sub-TLVs
+ are carried within this attribute to indicate traffic engineering
+ characteristics of the link.";
+ }
+
+ identity TE_ROUTER_IPV6_ADDRESS {
+ base "OSPF_TE_LSA_TLV_TYPE";
+ description
+ "A stable IPv6 address of the advertising router that is always
+ reachable if the node has connectivity. This TLV is used only with
+ OSPFv3";
+ reference "RFC5329";
+ }
+
+ identity TE_LINK_LOCAL {
+ base "OSPF_TE_LSA_TLV_TYPE";
+ description
+ "Attributes associated with the local link by the system.";
+ reference "RFC4203";
+ }
+
+ identity TE_NODE_ATTRIBUTE {
+ base "OSPF_TE_LSA_TLV_TYPE";
+ description
+ "Attributes associted with the local system";
+ reference "RFC5786";
+ }
+
+ identity TE_OPTICAL_NODE_PROPERTY {
+ base "OSPF_TE_LSA_TLV_TYPE";
+ description
+ "Attributes associated with the local optical node. A set of sub-TLVs
+ are carried within this TLV which are used within the GMPLS control
+ plane when using OSPF";
+ }
+
+ identity OSPF_TE_LINK_TLV_TYPE {
+ description
+ "This identity is the based used for the type field for sub-TLVs of the
+ Link TLV of the OSPF Traffic Engineering Opaque LSA";
+ }
+
+ identity TE_LINK_TYPE {
+ base "OSPF_TE_LINK_TLV_TYPE";
+ description
+ "The OSPF-TE Link Type sub-TLV appears exactly once per OSPF-TE Link
+ and describes the type of the link";
+ }
+
+ identity TE_LINK_ID {
+ base "OSPF_TE_LINK_TLV_TYPE";
+ description
+ "The OSPF-TE Link ID sub-TLV appears exactly once per OSPF-TE link and
+ identifies the remote end of the link.";
+ }
+
+ identity TE_LINK_LOCAL_IP {
+ base "OSPF_TE_LINK_TLV_TYPE";
+ description
+ "The OSPF-TE Local IP specifies a list of the interface addresses of the
+ local system corresponding to the traffic engineering link.";
+ }
+
+ identity TE_LINK_REMOTE_IP {
+ base "OSPF_TE_LINK_TLV_TYPE";
+ description
+ "The OSPF-TE Remote IP specifies a list of IP addresses of the remote
+ neighbors associated with the traffic engineering link.";
+ }
+
+ identity TE_LINK_METRIC {
+ base "OSPF_TE_LINK_TLV_TYPE";
+ description
+ "The OSPF-TE Metric specifies the link metric for traffic engineering
+ purposes";
+ }
+
+ identity TE_LINK_MAXIMUM_BANDWIDTH {
+ base "OSPF_TE_LINK_TLV_TYPE";
+ description
+ "The OSPF-TE Maximum Bandwidth specifies the maximum bandwidth of the
+ link that it is associated with.";
+ }
+
+ identity TE_LINK_MAXIMUM_RESERVABLE_BANDWIDTH {
+ base "OSPF_TE_LINK_TLV_TYPE";
+ description
+ "The OSPF-TE Maximum Reservable Bandwidth specifies the maximum
+ bandwidth that may be reserved on the link in bytes per second";
+ }
+
+ identity TE_LINK_UNRESERVED_BANDWIDTH {
+ base "OSPF_TE_LINK_TLV_TYPE";
+ description
+ "The OSPF-TE unreserved bandwidth indicates the amount of bandwidth
+ at each priority level that is currently not reserved";
+ }
+
+ identity TE_LINK_ADMIN_GROUP {
+ base "OSPF_TE_LINK_TLV_TYPE";
+ description
+ "The OSPF-TE administrative group indicates the administrative group
+ that the is assigned to the interface";
+ }
+
+ identity TE_NODE_ATTRIBUTE_TLV_TYPE {
+ description
+ "This identity forms the base for sub-TLVs of the Node Attribute TLV
+ of the Traffic Engineering LSA";
+ }
+
+ identity NODE_IPV4_LOCAL_ADDRESS {
+ base "TE_NODE_ATTRIBUTE_TLV_TYPE";
+ description
+ "The Node Attribute Sub-TLV contains a list of the IPv4 addresses of
+ the local system";
+ }
+
+ identity NODE_IPV6_LOCAL_ADDRESS {
+ base "TE_NODE_ATTRIBUTE_TLV_TYPE";
+ description
+ "The Node Attribute Sub-TLV contains a list of the IPv6 addresses of
+ the local system";
+ }
+
+ identity GRACE_LSA_TLV_TYPES {
+ description
+ "This identity is used as the base for TLVs within the Grace LSA";
+ }
+
+ identity GRACE_PERIOD {
+ base "GRACE_LSA_TLV_TYPES";
+ description
+ "This sub-TLV describes the period for which adjacencies should be
+ maintained with the restarting system";
+ }
+
+ identity GRACE_RESTART_REASON {
+ base "GRACE_LSA_TLV_TYPES";
+ description
+ "This sub-TLV describes the reason for the OSPF restart of the system
+ that is restarting";
+ }
+
+ identity GRACE_IP_INTERFACE_ADDRESS {
+ base "GRACE_LSA_TLV_TYPES";
+ description
+ "This sub-TLV specifies the restarting system's IP address on the
+ interface via which it is advertising the Grace LSA";
+ }
+
+ identity RI_LSA_TLV_TYPES {
+ description
+ "This identity is used as the base for the TLVs within the Router
+ Information LSA";
+ reference "RFC7770";
+ }
+
+ identity RI_INFORMATIONAL_CAPABILITIES {
+ base "RI_LSA_TLV_TYPES";
+ description
+ "Informational capabilities of the advertising system";
+ reference "RFC7770";
+ }
+
+ identity RI_FUNCTIONAL_CAPABILITIES {
+ base "RI_LSA_TLV_TYPES";
+ description
+ "Functional capabilities of the advertising system";
+ reference "RFC7770";
+ }
+
+ identity RI_NODE_ADMIN_TAG {
+ base "RI_LSA_TLV_TYPES";
+ description
+ "Operator-defined administrative tags associated with the advertising
+ system";
+ reference "RFC7777";
+ }
+
+ identity RI_SR_SID_LABEL_RANGE {
+ base "RI_LSA_TLV_TYPES";
+ description
+ "SID or Label ranges for use with segment routing when forwarding to
+ the advertising system";
+ reference "draft-ietf-ospf-segment-routing-extensions";
+ }
+
+ identity RI_SR_ALGORITHM {
+ base "RI_LSA_TLV_TYPES";
+ description
+ "The algorithms that are supported for segment routing by the
+ advertising system";
+ reference "draft-ietf-ospf-segment-routing-extensions";
+ }
+
+ // will be shared with IS-IS
+ identity SR_ALGORITHM {
+ description
+ "This identity is used as a base for the algorithms that can be
+ supported for segment routing and are advertised by a system in the RI
+ LSA";
+ }
+
+ identity SPF {
+ base "SR_ALGORITHM";
+ description
+ "The standard shortest path algorithm based on link metric,
+ as used by the OSPF protocol";
+ }
+
+ identity STRICT_SPF {
+ base "SR_ALGORITHM";
+ description
+ "The standard shortest path algorithm based on link metric, with the
+ requirement that all nodes along the path honor the SPF decision. That
+ is to say that the SPF decision cannot be altered by local policy at
+ the node";
+ }
+
+ identity OSPF_RI_SR_SID_LABEL_TLV_TYPES {
+ description
+ "This identity is used as a base for the sub-TLVs of the Segment
+ Routing SID/Label Range TLV";
+ }
+
+ identity SR_SID_LABEL_TLV {
+ base "OSPF_RI_SR_SID_LABEL_TLV_TYPES";
+ description
+ "A range of SID/Label values used by the local system";
+ reference "draft-ietf-ospf-segment-routing-extensions";
+ }
+
+ identity OSPFV2_ROUTER_LINK_TYPE {
+ description
+ "OSPFv2 Router Link Types as per the IANA registry defined in
+ RFC2740";
+ }
+
+ identity POINT_TO_POINT_LINK {
+ base "OSPFV2_ROUTER_LINK_TYPE";
+ description
+ "The link is a point-to-point connection to another router";
+ }
+
+ identity TRANSIT_NETWORK_LINK {
+ base "OSPFV2_ROUTER_LINK_TYPE";
+ description
+ "The link is a connection to a transit network";
+ }
+
+ identity STUB_NETWORK_LINK {
+ base "OSPFV2_ROUTER_LINK_TYPE";
+ description
+ "The link is a connection to a stub network";
+ }
+
+ identity VIRTUAL_LINK {
+ base "OSPFV2_ROUTER_LINK_TYPE";
+ description
+ "The link is a virtual connection to another router";
+ }
+
+ identity OSPFV2_EXTENDED_PREFIX_SUBTLV_TYPE {
+ description
+ "Sub-TLVs of the OSPFv2 Extended Prefix LSA as defined by
+ RFC7684";
+ }
+
+ identity EXTENDED_PREFIX_RANGE {
+ base "OSPFV2_EXTENDED_PREFIX_SUBTLV_TYPE";
+ description
+ "The attributes being described relate to a range of prefixes";
+ }
+
+ identity PREFIX_SID {
+ base "OSPFV2_EXTENDED_PREFIX_SUBTLV_TYPE";
+ description
+ "The TLV describes a Segment Routing Prefix Segment Identifier
+ associated with a prefix";
+ }
+
+ identity SID_LABEL_BINDING {
+ base "OSPFV2_EXTENDED_PREFIX_SUBTLV_TYPE";
+ description
+ "The TLV describes a binding of a SID to a path to the prefix,
+ which may have associated path characteristics";
+ }
+
+ identity OSPFV2_EXTENDED_PREFIX_SID_LABEL_BINDING_SUBTLV_TYPE {
+ description
+ "Sub-TLV types carried in the SID/Label Binding Sub-TLV of
+ the Extended Prefix Sub-TLV";
+ }
+
+ identity SID_MPLS_LABEL_BINDING {
+ base "OSPFV2_EXTENDED_PREFIX_SID_LABEL_BINDING_SUBTLV_TYPE";
+ description
+ "This sub-TLV indicates a binding between an SR SID and an
+ MPLS label and must be present in the sub-TLV";
+ }
+
+ identity ERO_METRIC {
+ base "OSPFV2_EXTENDED_PREFIX_SID_LABEL_BINDING_SUBTLV_TYPE";
+ description
+ "This sub-TLV indicates the cost of the ERO path being
+ advertised in the SID/Label TLV";
+ }
+
+ identity ERO_PATH {
+ base "OSPFV2_EXTENDED_PREFIX_SID_LABEL_BINDING_SUBTLV_TYPE";
+ description
+ "This sub-TLV indicates the path associated with an ERO
+ being advertised in the SID/Label TLV";
+ }
+
+ identity OSPFV2_EXTPREFIX_BINDING_ERO_PATH_SEGMENT_TYPE {
+ description
+ "The types of segment included within an ERO Path described
+ within the SID/Label binding sub-TLV";
+ }
+
+ identity IPV4_SEGMENT {
+ base "OSPFV2_EXTPREFIX_BINDING_ERO_PATH_SEGMENT_TYPE";
+ description
+ "The segment is specified as an IPv4 address";
+ }
+
+ identity UNNUMBERED_INTERFACE_SEGMENT {
+ base "OSPFV2_EXTPREFIX_BINDING_ERO_PATH_SEGMENT_TYPE";
+ description
+ "The segment is specified as an unnumbered interface of
+ a remote system";
+ }
+
+ identity OSPFV2_EXTENDED_LINK_SUBTLV_TYPE {
+ description
+ "Sub-TLVs of the Extended Link TLV for OSPFv2";
+ }
+
+ identity ADJACENCY_SID {
+ base "OSPFV2_EXTENDED_LINK_SUBTLV_TYPE";
+ description
+ "The extended link sub-TLV indicates an Adjacency SID";
+ }
+
+ identity MAX_METRIC_TRIGGER {
+ description
+ "Triggers which cause the maximum metric to be set for
+ entities advertised in OSPF";
+ }
+
+ identity MAX_METRIC_ON_SYSTEM_BOOT {
+ base "MAX_METRIC_TRIGGER";
+ description
+ "Set the maximum metric when the system boots.";
+ }
+
+ identity MAX_METRIC_INCLUDE {
+ description
+ "Entities that may optionally be included when advertising
+ the maximum metric.";
+ }
+
+ identity MAX_METRIC_INCLUDE_STUB {
+ base "MAX_METRIC_INCLUDE";
+ description
+ "Include stub networks when advertising the maximum metric.";
+ }
+
+ identity MAX_METRIC_INCLUDE_TYPE2_EXTERNAL {
+ base "MAX_METRIC_INCLUDE";
+ description
+ "Include OSPF Type 2 external routes when advertising
+ the maximum metric.";
+ }
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-ospfv2-area-interface.yang b/src/plugins/yang/openconfig/openconfig-ospfv2-area-interface.yang
new file mode 100644
index 0000000..f2454c0
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-ospfv2-area-interface.yang
@@ -0,0 +1,472 @@
+submodule openconfig-ospfv2-area-interface {
+
+ belongs-to openconfig-ospfv2 {
+ prefix "oc-ospfv2";
+ }
+
+ import ietf-yang-types { prefix "yang"; }
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-types { prefix "oc-types"; }
+ import openconfig-interfaces { prefix "oc-if"; }
+ import openconfig-ospf-types { prefix "oc-ospf-types"; }
+
+ // include common submodule
+ include openconfig-ospfv2-common;
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule provides OSPFv2 configuration and operational
+ state parameters that are specific to the area context";
+
+ oc-ext:openconfig-version "0.1.2";
+
+ revision "2018-06-05" {
+ description
+ "Bug fixes in when statements in lsdb";
+ reference "0.1.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "0.1.1";
+ }
+
+ revision "2017-02-28"{
+ description
+ "Initial public release of OSPFv2";
+ reference "0.1.0";
+ }
+
+ revision "2016-06-24" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ grouping ospfv2-area-interface-config {
+ description
+ "Configuration parameters for an OSPF interface";
+
+ leaf id {
+ type string;
+ description
+ "An operator-specified string utilised to uniquely
+ reference this interface";
+ }
+
+ leaf network-type {
+ type identityref {
+ base "oc-ospf-types:OSPF_NETWORK_TYPE";
+ }
+ description
+ "The type of network that OSPFv2 should use for the specified
+ interface.";
+ }
+
+ leaf priority {
+ type uint8;
+ description
+ "The local system's priority to become the designated
+ router";
+ }
+
+ leaf multi-area-adjacency-primary {
+ type boolean;
+ default true;
+ description
+ "When the specified interface is included in more than one
+ area's configuration, this leaf marks whether the area should
+ be considered the primary (when the value is true). In the
+ case that this value is false, the area is considered a
+ secondary area.";
+ }
+
+ leaf authentication-type {
+ type string;
+ // rjs TODO: discuss with bogdanov@ what the approach for auth
+ // links should be.
+ description
+ "The type of authentication that should be used on this
+ interface";
+ }
+
+ leaf metric {
+ type oc-ospf-types:ospf-metric;
+ description
+ "The metric for the interface";
+ }
+
+ leaf passive {
+ type boolean;
+ description
+ "When this leaf is set to true, the interface should be
+ advertised within the OSPF area but OSPF adjacencies should
+ not be established over the interface";
+ }
+
+ leaf hide-network {
+ type boolean;
+ description
+ "When this leaf is set to true, the network connected to
+ the interface should be hidden from OSPFv2 advertisements
+ per the procedure described in RFC6860.";
+ reference
+ "RFC6860 - Hiding Transit-Only Networks in OSFF";
+ }
+ }
+
+ grouping ospfv2-area-interface-timers-config {
+ description
+ "Configuration parameters relating to per-interface OSPFv2
+ timers";
+
+ leaf dead-interval {
+ type uint32;
+ units seconds;
+ description
+ "The number of seconds that the local system should let
+ elapse before declaring a silent router down";
+ reference "RFC2328";
+ }
+
+ leaf hello-interval {
+ type uint32;
+ units seconds;
+ description
+ "The number of seconds the local system waits between the
+ transmission of subsequent Hello packets";
+ }
+
+ leaf retransmission-interval {
+ type uint32;
+ units seconds;
+ description
+ "The number of seconds that the local system waits before
+ retransmitting an unacknowledged LSA.";
+ }
+ }
+
+ grouping ospfv2-area-interface-mpls-config {
+ description
+ "Configuration parameters relating to MPLS extensions for OSPF";
+
+ leaf traffic-engineering-metric {
+ type uint32;
+ description
+ "A link metric that should only be considered for traffic
+ engineering purposes.";
+ reference "RFC3630, #2.5.5";
+ }
+ }
+
+ grouping ospfv2-area-interface-neighbor-config {
+ description
+ "Configuration parameters relating to an individual neighbor
+ system on an interface within an OSPF area";
+
+ leaf router-id {
+ type yang:dotted-quad;
+ description
+ "The router ID of the remote system.";
+ }
+
+ leaf metric {
+ type oc-ospf-types:ospf-metric;
+ description
+ "The metric that should be considered to the remote neighbor
+ over this interface. This configuration is only applicable
+ for multiple-access networks";
+ }
+ }
+
+ grouping ospfv2-area-interface-neighbor-state {
+ description
+ "Operational state parameters relating an individual neighbor
+ system on an interface within an OSPF area";
+
+ leaf priority {
+ type uint8;
+ description
+ "The remote system's priority to become the designated
+ router";
+ }
+
+ leaf dead-time {
+ // rjs TODO: discussion with aashaikh@ + hines@ around how this
+ // value should be represented, usually is a timer that
+ // continually counts down but this sounds challenging for
+ // telemetry.
+ type oc-types:timeticks64;
+ description
+ "The time at which this neighbor's adjacency will be
+ considered dead. This value is expressed as a number of
+ seconds since the Unix Epoch";
+ }
+
+ leaf designated-router {
+ type yang:dotted-quad;
+ description
+ "The designated router for the adjacency. This device
+ advertises the Network LSA for broadcast and NBMA networks.";
+ }
+
+ leaf backup-designated-router {
+ type yang:dotted-quad;
+ description
+ "The backup designated router for the adjacency.";
+ }
+
+ leaf optional-capabilities {
+ // rjs TODO: should this be anything more than the hex-string
+ // this is currently what is shown in IOS/JUNOS
+ type yang:hex-string;
+ description
+ "The optional capabilities field received in the Hello
+ message from the neighbor";
+ }
+
+ leaf last-established-time {
+ type oc-types:timeticks64;
+ units seconds;
+ // rjs TODO: check implementations - is FULL considered 'up'
+ // since the adjacency is probably up since ExStart
+ description
+ "The time at which the adjacency was last established with
+ the neighbor. That is to say the time at which the
+ adjacency last transitioned into the FULL state.
+
+ This value is expressed as the number of seconds, relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+
+ leaf adjacency-state {
+ type identityref {
+ base "oc-ospf-types:OSPF_NEIGHBOR_STATE";
+ }
+ description
+ "The state of the adjacency with the neighbor.";
+ }
+
+ leaf state-changes {
+ type uint32;
+ description
+ "The number of transitions out of the FULL state that this
+ neighbor has been through";
+ }
+
+ leaf retranmission-queue-length {
+ type uint32;
+ description
+ "The number of LSAs that are currently in the queue to be
+ retransmitted to the neighbor";
+ }
+ }
+
+ grouping ospfv2-area-interface-lsa-filter-config {
+ description
+ "Configuration options relating to filtering LSAs
+ on an interface.";
+
+ leaf all {
+ type boolean;
+ description
+ "When this leaf is set to true, all LSAs should be
+ filtered to the neighbours with whom adjacencies are
+ formed on the interface.";
+ }
+
+ // NB: this container can be augmented to add additional
+ // filtering options which exist in some implementations.
+ }
+
+ grouping ospfv2-area-interface-mpls-igp-ldp-sync-state {
+ description
+ "Operational state parameters relating to MPLS LDP/IGP
+ synchronization on a per-neighbor basis";
+
+ leaf synchronized {
+ type boolean;
+ description
+ "When the value of this leaf is set to true, the
+ LDP neighbors reachable via this interface are considered
+ to be synchronized, and hence the link is considered
+ usable by the IGP.";
+ }
+ }
+
+ grouping ospfv2-area-interfaces-structure {
+ description
+ "Structural grouping for configuration and operational state
+ parameters that relate to an interface";
+
+ container interfaces {
+ description
+ "Enclosing container for a list of interfaces enabled within
+ this area";
+
+ list interface {
+ key "id";
+
+ description
+ "List of interfaces which are enabled within this area";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "A pointer to the identifier for the interface.";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the interface on which
+ OSPFv2 is enabled";
+
+ uses ospfv2-area-interface-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for the interface on which
+ OSPFv2 is enabled";
+ uses ospfv2-area-interface-config;
+ }
+
+ uses oc-if:interface-ref;
+
+ container timers {
+ description
+ "Timers relating to OSPFv2 on the interface";
+
+ container config {
+ description
+ "Configuration parameters for OSPFv2 timers on the
+ interface";
+ uses ospfv2-area-interface-timers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for OSPFv2 timers on
+ the interface";
+
+ uses ospfv2-area-interface-timers-config;
+ }
+ }
+
+ container mpls {
+ description
+ "Configuration and operational state parameters for
+ OSPFv2 extensions related to MPLS on the interface.";
+
+ container config {
+ description
+ "Configuration parameters for OSPFv2 extensions relating
+ to MPLS for the interface";
+ uses ospfv2-area-interface-mpls-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state for OSPFv2 extensions relating to
+ MPLS for the interface";
+ uses ospfv2-area-interface-mpls-config;
+ }
+
+ container igp-ldp-sync {
+ description
+ "OSPFv2 parameters relating to LDP/IGP synchronization";
+
+ container config {
+ description
+ "Configuration parameters relating to LDP/IG
+ synchronization.";
+ uses ospfv2-common-mpls-igp-ldp-sync-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state variables relating to LDP/IGP
+ synchronization";
+ uses ospfv2-common-mpls-igp-ldp-sync-config;
+ uses ospfv2-area-interface-mpls-igp-ldp-sync-state;
+ }
+ }
+ }
+
+ container lsa-filter {
+ description
+ "OSPFv2 parameters relating to filtering of LSAs to
+ neighbors the specified interface.";
+
+ container config {
+ description
+ "Configuration parameters relating to filtering LSAs
+ on the specified interface.";
+ uses ospfv2-area-interface-lsa-filter-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to filtering
+ LSAs on the specified interface";
+ uses ospfv2-area-interface-lsa-filter-config;
+ }
+ }
+
+ container neighbors {
+ description
+ "Enclosing container for the list of neighbors that
+ an adjacency has been established with on the interface";
+
+ list neighbor {
+ key "router-id";
+
+ description
+ "A neighbor with which an OSPFv2 adjacency has been
+ established within this area";
+
+ leaf router-id {
+ type leafref {
+ path "../config/router-id";
+ }
+ description
+ "Reference to the router ID of the adjacent system";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the adjacent
+ system";
+ uses ospfv2-area-interface-neighbor-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the adjacent
+ system";
+ uses ospfv2-area-interface-neighbor-config;
+ uses ospfv2-area-interface-neighbor-state;
+ }
+ }
+ }
+
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-ospfv2-area.yang b/src/plugins/yang/openconfig/openconfig-ospfv2-area.yang
new file mode 100644
index 0000000..2ee4ab4
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-ospfv2-area.yang
@@ -0,0 +1,169 @@
+submodule openconfig-ospfv2-area {
+
+ belongs-to openconfig-ospfv2 {
+ prefix "oc-ospfv2";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-ospf-types { prefix "oc-ospf-types"; }
+ import ietf-inet-types { prefix "inet"; }
+
+ // include other required submodules
+ include openconfig-ospfv2-area-interface;
+ include openconfig-ospfv2-lsdb;
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule provides OSPFv2 configuration and operational
+ state parameters that are specific to the area context";
+
+ oc-ext:openconfig-version "0.1.2";
+
+ revision "2018-06-05" {
+ description
+ "Bug fixes in when statements in lsdb";
+ reference "0.1.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "0.1.1";
+ }
+
+ revision "2017-02-28"{
+ description
+ "Initial public release of OSPFv2";
+ reference "0.1.0";
+ }
+
+ revision "2016-06-24" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ grouping ospfv2-area-config {
+ description
+ "Configuration parameters relating to an OSPF area";
+
+ leaf identifier {
+ type oc-ospf-types:ospf-area-identifier;
+ description
+ "An identifier for the OSPFv2 area - described as either a
+ 32-bit unsigned integer, or a dotted-quad";
+ }
+ }
+
+ grouping ospfv2-area-mpls-config {
+ description
+ "Configuration parameters relating to OSPFv2 extensions for
+ MPLS";
+
+ leaf traffic-engineering-enabled {
+ type boolean;
+ description
+ "Specifies whether traffic engineering extensions should be
+ advertised within the area";
+ }
+ }
+
+ grouping ospfv2-area-virtual-link-config {
+ description
+ "Configuration parameters relating to a virtual-link within
+ the OSPF area";
+
+ leaf remote-router-id {
+ type inet:ipv4-address-no-zone;
+ description
+ "The router ID of the device which terminates the remote end
+ of the virtual link";
+ }
+ }
+
+ grouping ospfv2-area-structure {
+ description
+ "Structural grouping for configuration and operational state
+ parameters that relate to an individual area";
+
+ container config {
+ description
+ "Configuration parameters relating to an OSPFv2 area";
+
+ uses ospfv2-area-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to an OSPFv2 area";
+ uses ospfv2-area-config;
+ }
+
+ container mpls {
+ description
+ "Configuration and operational state parameters for OSPFv2
+ extensions relating to MPLS";
+
+ container config {
+ description
+ "Configuration parameters relating to MPLS extensions for
+ OSPFv2";
+ uses ospfv2-area-mpls-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to MPLS extensions
+ for OSPFv2";
+ uses ospfv2-area-mpls-config;
+ }
+ }
+
+ uses ospfv2-lsdb-structure;
+ uses ospfv2-area-interfaces-structure;
+
+ container virtual-links {
+ description
+ "Configuration and state parameters relating to virtual
+ links from the source area to a remote router";
+
+ list virtual-link {
+ key "remote-router-id";
+
+ description
+ "Configuration and state parameters relating to a
+ virtual link";
+
+ leaf remote-router-id {
+ type leafref {
+ path "../config/remote-router-id";
+ }
+ description
+ "Reference to the remote router ID";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the OSPF virtual link";
+ uses ospfv2-area-virtual-link-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to the OSPF virtual link";
+ uses ospfv2-area-virtual-link-config;
+ uses ospfv2-area-interface-neighbor-state;
+ }
+ }
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-ospfv2-common.yang b/src/plugins/yang/openconfig/openconfig-ospfv2-common.yang
new file mode 100644
index 0000000..12df35e
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-ospfv2-common.yang
@@ -0,0 +1,91 @@
+submodule openconfig-ospfv2-common {
+
+ belongs-to openconfig-ospfv2 {
+ prefix "oc-ospfv2";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule provides OSPFv2 configuration and operational
+ state parameters that are shared across multiple contexts";
+
+ oc-ext:openconfig-version "0.1.2";
+
+ revision "2018-06-05" {
+ description
+ "Bug fixes in when statements in lsdb";
+ reference "0.1.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "0.1.1";
+ }
+
+ revision "2017-02-28"{
+ description
+ "Initial public release of OSPFv2";
+ reference "0.1.0";
+ }
+
+ revision "2016-06-24" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ grouping ospfv2-common-mpls-igp-ldp-sync-config {
+ description
+ "Configuration parameters used for OSPFv2 MPLS/IGP
+ synchronization";
+
+ leaf enabled {
+ type boolean;
+ description
+ "When this leaf is set to true, do not utilise this link for
+ forwarding via the IGP until such time as LDP adjacencies to
+ the neighbor(s) over the link are established.";
+ }
+
+ leaf post-session-up-delay {
+ type uint32;
+ units milliseconds;
+ description
+ "This leaf specifies a delay, expressed in units of milliseconds,
+ between the LDP session to the IGP neighbor being established, and
+ it being considered synchronized by the IGP.";
+ }
+ }
+
+ grouping ospfv2-common-timers {
+ description
+ "Common definition of the type of timers that the OSPFv2 implementation
+ uses";
+
+ leaf timer-type {
+ type enumeration {
+ enum LINEAR_BACKOFF {
+ description
+ "The backoff used by the OSPFv2 implementation is linear, such that
+ a common delay is added following each event.";
+ }
+ enum EXPONENTIAL_BACKOFF {
+ description
+ "The backoff used by the OSPFv2 implementation is exponential, such
+ that the delay added following each event increases.";
+ }
+ }
+ description
+ "The timer mode that is utilised by the implementation.";
+ }
+ }
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-ospfv2-global.yang b/src/plugins/yang/openconfig/openconfig-ospfv2-global.yang
new file mode 100644
index 0000000..6e82c9a
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-ospfv2-global.yang
@@ -0,0 +1,509 @@
+submodule openconfig-ospfv2-global {
+
+ belongs-to openconfig-ospfv2 {
+ prefix "oc-ospfv2";
+ }
+
+ import ietf-yang-types { prefix "yang"; }
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-routing-policy { prefix "oc-rpol"; }
+ import openconfig-ospf-types { prefix "oc-ospft"; }
+
+ // Include common submodule
+ include openconfig-ospfv2-common;
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule provides OSPFv2 configuration and operational
+ state parameters that are global to a particular OSPF instance";
+
+ oc-ext:openconfig-version "0.1.2";
+
+ revision "2018-06-05" {
+ description
+ "Bug fixes in when statements in lsdb";
+ reference "0.1.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "0.1.1";
+ }
+
+ revision "2017-02-28"{
+ description
+ "Initial public release of OSPFv2";
+ reference "0.1.0";
+ }
+
+ revision "2016-06-24" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ grouping ospfv2-global-config {
+ description
+ "Global configuration for OSPFv2";
+
+ leaf router-id {
+ type yang:dotted-quad;
+ description
+ "A 32-bit number represented as a dotted quad assigned to
+ each router running the OSPFv2 protocol. This number should
+ be unique within the autonomous system";
+ reference "rfc2828";
+ }
+
+ leaf summary-route-cost-mode {
+ type enumeration {
+ enum RFC1583_COMPATIBLE {
+ description
+ "Specify that summary routes should assume the cost of
+ the lowest-cost more-specific route as per the behaviour
+ specified in RFC1583";
+ }
+ enum RFC2328_COMPATIBLE {
+ description
+ "Specify that summary routes should assume the cost of the
+ highest-cost more-specific route as per the revised
+ behaviour specified in RFC2328";
+ }
+ }
+ default "RFC2328_COMPATIBLE";
+ description
+ "Specify how costs for the summary routes should be specified
+ as per the behaviour in the original OSPF specification
+ RFC1583, or alternatively whether the revised behaviour
+ described in RFC2328 should be utilised";
+ }
+
+ leaf igp-shortcuts {
+ type boolean;
+ description
+ "When this leaf is set to true, OSPFv2 will route traffic to
+ a remote system via any LSP to the system that is marked as
+ shortcut eligible.";
+ }
+
+ leaf log-adjacency-changes {
+ type boolean;
+ description
+ "When this leaf is set to true, a log message will be
+ generated when the state of an OSPFv2 neighbour changes.";
+ }
+
+ leaf hide-transit-only-networks {
+ type boolean;
+ description
+ "When this leaf is set to true, do not advertise prefixes
+ into OSPFv2 that correspond to transit interfaces, as per
+ the behaviour discussed in RFC6860.";
+ reference
+ "RFC6860 - Hiding Transit-Only Networks in OSPF";
+ }
+ }
+
+ grouping ospfv2-global-spf-timers-config {
+ description
+ "Configuration parameters relating to global SPF timer
+ parameters for OSPFv2";
+
+ leaf initial-delay {
+ // rjs TODO: IS-IS model has this as decimal64 - should it be
+ // that or uint32 msec?
+ type uint32;
+ units msec;
+ description
+ "The value of this leaf specifies the time between a change
+ in topology being detected and the first run of the SPF
+ algorithm.";
+ }
+
+ leaf maximum-delay {
+ // rjs TODO: same question as above
+ type uint32;
+ units msec;
+ description
+ "The value of this leaf specifies the maximum delay between
+ a topology change being detected and the SPF algorithm
+ running. This value is used for implementations that support
+ increasing the wait time between SPF runs.";
+ }
+
+ // rjs TODO: some questions here around what we should specify:
+ // JUNOS has rapid-runs and holddown
+ // Cisco has maximum time between runs, and then a doubling of
+ // the wait interval up to that maximum.
+ // ALU has first-wait, second-wait, max-wait
+ }
+
+ grouping ospfv2-global-lsa-generation-timers-config {
+ description
+ "Configuration parameters relating to global LSA generation
+ parameters for OSPFv2";
+
+ leaf initial-delay {
+ type uint32;
+ units msec;
+ description
+ "The value of this leaf specifies the time between the first
+ time an LSA is generated and advertised and the subsequent
+ generation of that LSA.";
+ }
+
+ leaf maximum-delay {
+ type uint32;
+ units msec;
+ description
+ "The value of this leaf specifies the maximum time between the
+ generation of an LSA and the subsequent re-generation of that
+ LSA. This value is used in implementations that support
+ increasing delay between generation of an LSA";
+ }
+ }
+
+ grouping ospfv2-global-spf-timers-state {
+ description
+ "Operational state parameters relating to OSPFv2 global
+ timers";
+
+ uses ospfv2-common-timers;
+ }
+
+ grouping ospfv2-global-lsa-generation-timers-state {
+ description
+ "Operational state parameters relating to OSPFv2 global
+ timers";
+
+ uses ospfv2-common-timers;
+ }
+
+ grouping ospfv2-global-graceful-restart-config {
+ description
+ "Configuration parameters relating to graceful restart for
+ OSPFv2";
+
+ leaf enabled {
+ type boolean;
+ description
+ "When the value of this leaf is set to true, graceful restart
+ is enabled on the local system. In this case, the system will
+ use Grace-LSAs to signal that it is restarting to its
+ neighbors.";
+ }
+
+ leaf helper-only {
+ type boolean;
+ description
+ "Operate graceful-restart only in helper mode. When this leaf
+ is set to true, the local system does not use Grace-LSAs to
+ indicate that it is restarting, but will accept Grace-LSAs
+ from remote systems, and suppress withdrawl of adjacencies
+ of the system for the grace period specified";
+ }
+ }
+
+ grouping ospfv2-global-mpls-config {
+ description
+ "Configuration parameters for OSPFv2 options which
+ relate to MPLS";
+
+ leaf traffic-engineering-extensions {
+ type boolean;
+ description
+ "When this leaf is set to true, use traffic engineering
+ extensions for OSPF to advertise TE parameters via type 10
+ Opaque LSAs";
+ }
+ }
+
+ grouping ospfv2-global-inter-areapp-config {
+ description
+ "Configuration parameters for OSPFv2 policies which propagate
+ prefixes between areas";
+
+ leaf src-area {
+ type leafref {
+ // we are at ospf/global/inter-area-propagation-policies/...
+ // inter-area-propagation-policy/config/src-area
+ path "../../../../../areas/area/identifier";
+ }
+ description
+ "The area from which prefixes are to be exported.";
+ }
+
+ leaf dst-area {
+ type leafref {
+ // we are at ospf/global/inter-area-propagation-policies/...
+ // inter-area-propagation-policy/config/src-area
+ path "../../../../../areas/area/identifier";
+ }
+ description
+ "The destination area to which prefixes are to be imported";
+ }
+
+ uses oc-rpol:apply-policy-import-config;
+ }
+
+ grouping ospfv2-global-max-metric-config {
+ description
+ "Configuration paramters relating to setting the OSPFv2
+ maximum metric.";
+
+ leaf set {
+ type boolean;
+ description
+ "When this leaf is set to true, all non-stub interfaces of
+ the local system are advertised with the maximum metric,
+ such that the router does not act as a transit system,
+ (similarly to the IS-IS overload functionality).";
+ reference
+ "RFC3137 - OSPF Stub Router Advertisement";
+ }
+
+ leaf timeout {
+ type uint64;
+ units "seconds";
+ description
+ "The delay, in seconds, after which the advertisement of
+ entities with the maximum metric should be cleared, and
+ the system reverts to the default, or configured, metrics.";
+ }
+
+ leaf-list include {
+ type identityref {
+ base "oc-ospft:MAX_METRIC_INCLUDE";
+ }
+ description
+ "By default, the maximum metric is advertised for all
+ non-stub interfaces of a device. When identities are
+ specified within this leaf-list, additional entities
+ are also advertised with the maximum metric according
+ to the values within the list.";
+ }
+
+ leaf-list trigger {
+ type identityref {
+ base "oc-ospft:MAX_METRIC_TRIGGER";
+ }
+ description
+ "By default, the maximum metric is only advertised
+ when the max-metric/set leaf is specified as true.
+ In the case that identities are specified within this
+ list, they provide additional triggers (e.g., system
+ boot) that may cause the max-metric to be set. In this
+ case, the system should still honour the timeout specified
+ by the max-metric/timeout leaf, and clear the max-metric
+ advertisements after the expiration of this timer.";
+ }
+ }
+
+ grouping ospfv2-global-structural {
+ description
+ "Top level structural grouping for OSPFv2 global parameters";
+
+ container global {
+ description
+ "Configuration and operational state parameters for settings
+ that are global to the OSPFv2 instance";
+
+ container config {
+ description
+ "Global configuration parameters for OSPFv2";
+ uses ospfv2-global-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for OSPFv2";
+ uses ospfv2-global-config;
+ }
+
+ container timers {
+ description
+ "Configuration and operational state parameters for OSPFv2
+ timers";
+
+ container spf {
+ description
+ "Configuration and operational state parameters relating
+ to timers governing the operation of SPF runs";
+
+ container config {
+ description
+ "Configuration parameters relating to global OSPFv2
+ SPF timers";
+ uses ospfv2-global-spf-timers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the global
+ OSPFv2 SPF timers";
+ uses ospfv2-global-spf-timers-config;
+ uses ospfv2-global-spf-timers-state;
+ }
+ }
+
+ container max-metric {
+ description
+ "Configuration and operational state parameters relating
+ to setting the OSPFv2 maximum metric.";
+
+ container config {
+ description
+ "Configuration parameters relating to setting the OSPFv2
+ maximum metric for a set of advertised entities.";
+ uses ospfv2-global-max-metric-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to setting the
+ OSPFv2 maximum metric for a set of advertised entities.";
+ uses ospfv2-global-max-metric-config;
+ }
+ }
+
+ container lsa-generation {
+ description
+ "Configuration and operational state parameters relating
+ to timers governing the generation of LSAs by the local
+ system";
+
+ container config {
+ description
+ "Configuration parameters relating to the generation of
+ LSAs by the local system";
+ uses ospfv2-global-lsa-generation-timers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the generation
+ of LSAs by the local system";
+ uses ospfv2-global-lsa-generation-timers-config;
+ uses ospfv2-global-lsa-generation-timers-state;
+ }
+ }
+ }
+
+ container graceful-restart {
+ description
+ "Configuration and operational state parameters for OSPFv2
+ graceful restart";
+
+ container config {
+ description
+ "Configuration parameters relating to OSPFv2 graceful
+ restart";
+ uses ospfv2-global-graceful-restart-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to OSPFv2 graceful
+ restart";
+ uses ospfv2-global-graceful-restart-config;
+ }
+ }
+
+ container mpls {
+ description
+ "OSPFv2 parameters relating to MPLS";
+
+ container config {
+ description
+ "Configuration parameters relating to MPLS for OSPFv2";
+ uses ospfv2-global-mpls-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to MPLS for
+ OSPFv2";
+ uses ospfv2-global-mpls-config;
+ }
+
+ container igp-ldp-sync {
+ description
+ "OSPFv2 parameters relating to LDP/IGP synchronization";
+
+ container config {
+ description
+ "Configuration parameters relating to LDP/IG
+ synchronization.";
+ uses ospfv2-common-mpls-igp-ldp-sync-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state variables relating to LDP/IGP
+ synchronization";
+ uses ospfv2-common-mpls-igp-ldp-sync-config;
+ }
+ }
+ }
+
+ container inter-area-propagation-policies {
+ description
+ "Policies defining how inter-area propagation should be performed
+ by the OSPF instance";
+
+ list inter-area-propagation-policy {
+ key "src-area dst-area";
+ description
+ "A list of connections between pairs of areas - routes are
+ propagated from the source (src) area to the destination (dst)
+ area according to the policy specified";
+
+ leaf src-area {
+ type leafref {
+ path "../config/src-area";
+ }
+ description
+ "Reference to the source area";
+ }
+
+ leaf dst-area {
+ type leafref {
+ path "../config/dst-area";
+ }
+ description
+ "Reference to the destination area";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the inter-area
+ propagation policy";
+ uses ospfv2-global-inter-areapp-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the inter-area
+ propagation policy";
+ uses ospfv2-global-inter-areapp-config;
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-ospfv2-lsdb.yang b/src/plugins/yang/openconfig/openconfig-ospfv2-lsdb.yang
new file mode 100644
index 0000000..b345724
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-ospfv2-lsdb.yang
@@ -0,0 +1,2355 @@
+submodule openconfig-ospfv2-lsdb {
+
+ belongs-to openconfig-ospfv2 {
+ prefix "oc-ospfv2";
+ }
+
+ // import some basic types
+ import ietf-yang-types { prefix "yang"; }
+ import ietf-inet-types { prefix "inet"; }
+ import openconfig-types { prefix "oc-types"; }
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-ospf-types { prefix "oc-ospf-types"; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "An OpenConfig model for the Open Shortest Path First (OSPF)
+ version 2 link-state database (LSDB)";
+
+ oc-ext:openconfig-version "0.1.2";
+
+ revision "2018-06-05" {
+ description
+ "Bug fixes in when statements in lsdb";
+ reference "0.1.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "0.1.1";
+ }
+
+ revision "2017-02-28"{
+ description
+ "Initial public release of OSPFv2";
+ reference "0.1.0";
+ }
+
+ revision "2016-06-24" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ grouping ospfv2-lsdb-common-prefix-properties {
+ description
+ "Common properties used in the LSDB that relate to IPv4 prefixes";
+
+ leaf prefix-length {
+ type uint8 {
+ range "0..32";
+ }
+ description
+ "The length of the IPv4 prefix contained in the Extended Prefix LSA";
+ }
+
+ leaf address-family {
+ // TODO: should this be an identity?
+ type enumeration {
+ enum IPV4_UNICAST {
+ value 0;
+ description
+ "The prefix contained within the Extended Prefix LSA is an IPv4
+ unicast prefix";
+ }
+ }
+ description
+ "The address family of the prefix contained in the Extended Prefix
+ LSA";
+ }
+ }
+
+ grouping ospfv2-lsdb-common-link-specification {
+ description
+ "Generic attributes used to identify links within OSPFv2";
+
+ leaf link-id {
+ type yang:dotted-quad;
+ description
+ "The identifier for the link specified. The value of the link
+ identifier is dependent upon the type of the LSA. The value is
+ specified to be, per sub-type:
+ 1) Neighbouring router's router ID.
+ 2) IP address of DR.
+ 3) IP network address.
+ 4) Neighbouring router router's ID.";
+ }
+
+ leaf link-data {
+ type union {
+ type yang:dotted-quad;
+ type uint32;
+ }
+ description
+ "The data associated with the link type. The value is
+ dependent upon the subtype of the LSA. When the connection is
+ to a stub network it represents the mask; for p2p connections
+ that are unnumbered it represents the ifIndex value of the
+ router's interface; for all other connections it represents
+ the local system's IP address";
+ }
+
+ }
+
+ grouping ospfv2-lsdb-common-unknown-tlv {
+ description
+ "A generic specification of a TLV to be used when the
+ value cannot be decoded by the local system";
+
+ leaf type {
+ type uint16;
+ description
+ "The type value of the unknown TLV";
+ }
+
+ leaf length {
+ type uint16;
+ description
+ "The length value of the unknown TLV";
+ }
+
+ leaf value {
+ type binary;
+ description
+ "The value portion of the unknwon TLV";
+ }
+ }
+
+ grouping ospfv2-lsdb-common-unknown-tlv-structure {
+ description
+ "A generic specification of an unknown TLV";
+
+ container unknown-tlv {
+ description
+ "An unknown TLV within the context. Unknown TLVs are
+ defined to be the set of TLVs that are not modelled
+ within the OpenConfig model, or are unknown to the
+ local system such that it cannot decode their value.";
+
+ container state {
+ description
+ "Contents of an unknown TLV within the LSA";
+ uses ospfv2-lsdb-common-unknown-tlv;
+ }
+ }
+ }
+
+ grouping ospfv2-lsdb-common-unknown-subtlv-structure {
+ description
+ "A generic specification of an unknown TLV";
+
+ container unknown-subtlv {
+ description
+ "An unknown SubTLV within the context. Unknown Sub-TLV
+ are defined to be the set of SubTLVs that are not modelled
+ by the OpenConfig schema, or are unknown to the local system
+ such that it cannot decode their value.";
+
+ container state {
+ description
+ "Contents of an unknown TLV within the LSA";
+ uses ospfv2-lsdb-common-unknown-tlv;
+ }
+ }
+ }
+
+ grouping ospfv2-lsdb-common-tos-metric {
+ description
+ "Common LSDB LSA parameters for type of service and metric";
+
+ leaf tos {
+ type uint8;
+ description
+ "OSPF encoding of the type of service referred to by this
+ LSA. Encoding for OSPF TOS are described in RFC2328.";
+ }
+
+ leaf metric {
+ type oc-ospf-types:ospf-metric;
+ description
+ "The metric value to be used for the TOS specified. This value
+ represents the cost of use of the link for the specific type
+ of service.";
+ }
+ }
+
+ grouping ospfv2-lsdb-common-sr-sid-spec {
+ description
+ "Re-usable specification of a segment routing SID";
+
+ leaf sid-type {
+ type oc-ospf-types:sr-sid-type;
+ description
+ "The type of the value contained within the sub-TLV";
+ }
+
+ leaf sid-value {
+ type uint32;
+ description
+ "The value of the binding included within the sub-TLV. The type of
+ this binding is indicated by the type leaf.";
+ }
+ }
+
+ grouping ospfv2-lsdb-area-state {
+ description
+ "Per-area operational state parameters for an OSPFv2 area";
+
+ leaf identifier {
+ type oc-ospf-types:ospf-area-identifier;
+ description
+ "An identifier for the area, expressed as a dotted quad or
+ an unsigned 32-bit integer";
+ }
+ }
+
+ grouping ospfv2-lsdb-area-lsa-type-state {
+ description
+ "Per-LSA type operational state parameters for an OSPFv2 area";
+
+ leaf type {
+ type identityref {
+ base "oc-ospf-types:OSPF_LSA_TYPE";
+ }
+ description
+ "The type of LSA being described. The type of the LSA is
+ expressed as a canonical name.";
+ }
+ }
+
+ grouping ospfv2-lsdb-area-lsa-state {
+ description
+ "Generic parameters of an OSPFv2 LSA";
+
+ leaf link-state-id {
+ type yang:dotted-quad;
+ description
+ "The Link State ID for the specified LSA type. The exact
+ defined value of the Link State ID is dependent on the LSA
+ type.";
+ }
+
+ leaf advertising-router {
+ type yang:dotted-quad;
+ description
+ "The router ID of the router that originated the LSA";
+ }
+
+ leaf sequence-number {
+ type int32;
+ description
+ "A signed 32-bit integer used to detect old and duplicate
+ LSAs. The greater the sequence number the more recent the
+ LSA.";
+ }
+
+ leaf checksum {
+ type uint16;
+ description
+ "The checksum of the complete contents of the LSA excluding
+ the age field.";
+ }
+
+ leaf age {
+ type uint16;
+ units seconds;
+ description
+ "The time since the LSA's generation in seconds";
+ }
+ }
+
+ grouping ospfv2-lsdb-router-lsa-structure {
+ description
+ "Structural grouping for Router LSA contents within the LSDB";
+
+ container router-lsa {
+ description
+ "Contents of the router LSA";
+
+ container state {
+ description
+ "State parameters of the router LSA";
+ uses ospfv2-lsdb-router-lsa-state;
+ }
+
+ uses ospfv2-lsdb-generic-lsa-tos-metric-structure;
+ }
+ }
+
+ grouping ospfv2-lsdb-generic-lsa-tos-metric-structure {
+ description
+ "Grouping including a generic TOS/metric structure for an
+ LSA";
+
+ container types-of-service {
+ description
+ "Breakdown of LSA contents specifying multiple
+ TOS values";
+
+ list type-of-service {
+ key "tos";
+ description
+ "Per-type of service parameters for the LSA";
+
+ leaf tos {
+ type leafref {
+ path "../state/tos";
+ }
+ description
+ "Reference to the type of service identifier which is
+ specified in the LSA";
+ }
+
+ container state {
+ description
+ "Per-TOS parameters for the LSA";
+
+ uses ospfv2-lsdb-generic-lsa-tos-metric-state;
+ }
+ }
+ }
+ }
+
+ grouping ospfv2-lsdb-network-lsa-structure {
+ description
+ "Structural grouping for Network LSA contents within the LSDB";
+
+ container network-lsa {
+ description
+ "Contents of the network LSA";
+
+ container state {
+ description
+ "State parameters of the network LSA";
+ uses ospfv2-lsdb-network-lsa-state;
+ }
+ }
+ }
+
+ grouping ospfv2-lsdb-summary-lsa-structure {
+ description
+ "Structural grouping for the Summary LSA contents within the
+ LSDB";
+
+ container summary-lsa {
+ description
+ "Contents of the summary LSA";
+
+ container state {
+ description
+ "State parameters of the summary LSA";
+ uses ospfv2-lsdb-summary-lsa-state;
+ }
+
+ uses ospfv2-lsdb-generic-lsa-tos-metric-structure;
+ }
+ }
+
+ grouping ospfv2-lsdb-asexternal-lsa-structure {
+ description
+ "Structural grouping for the AS External LSA contents within
+ the LSDB";
+
+ container as-external-lsa {
+ description
+ "Contents of the AS External LSA";
+
+ container state {
+ description
+ "State parameters for the AS external LSA";
+ uses ospfv2-lsdb-asexternal-lsa-state;
+ }
+
+ container types-of-service {
+ description
+ "Breakdown of External LSA contents specifying multiple
+ TOS values";
+
+ list type-of-service {
+ key "tos";
+ description
+ "Per-type of service parameters for the AS External LSA";
+
+ leaf tos {
+ type leafref {
+ path "../state/tos";
+ }
+ description
+ "Reference to the type of service identifier which is
+ specified in the AS External LSA";
+ }
+
+ container state {
+ description
+ "Per-TOS parameters for the LSA";
+
+ uses ospfv2-lsdb-asexternal-tos-state;
+ }
+ }
+ }
+
+ }
+ }
+
+ grouping ospfv2-lsdb-nssa-external-lsa-structure {
+ description
+ "Structural grouping for the NSSA External LSA contents within
+ the LSDB";
+
+ container nssa-external-lsa {
+ description
+ "Contents of the NSSA External LSA";
+
+ container state {
+ description
+ "State parameters for the AS external LSA";
+ // Type 7 LSAs are are a super-set of Type 5 LSAs so we simply
+ // include the Type 5
+ uses ospfv2-lsdb-asexternal-lsa-state;
+ uses ospfv2-lsdb-nssa-external-lsa-state;
+ }
+
+ container types-of-service {
+ description
+ "Breakdown of the NSSA External LSA contents specifying multiple
+ TOS values";
+
+ list type-of-service {
+ key "tos";
+ description
+ "Per-type of service parameters for the NSSA external LSA";
+
+ leaf tos {
+ type leafref {
+ path "../state/tos";
+ }
+ description
+ "Reference to the type of services identifier which is specified
+ in the NSSA External LSA";
+ }
+
+ container state {
+ description
+ "Per-TOS parameters for the LSA";
+ uses ospfv2-lsdb-asexternal-tos-state;
+ }
+ }
+ }
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-lsa-structure {
+ description
+ "Structural grouping for Opaque LSA contents within the LSDB";
+
+ container opaque-lsa {
+ description
+ "Contents of the opaque LSA";
+
+ container state {
+ description
+ "State parameters for the opaque LSA";
+ uses ospfv2-lsdb-opaque-lsa-state;
+ }
+
+ container traffic-engineering {
+ when "../state/type = 'TRAFFIC_ENGINEERING'" {
+ description
+ "Include the traffic-engineering information when
+ the Opaque LSA being described is a Traffic Engineering
+ LSA";
+ }
+ description
+ "Contents of the Traffic Engineering Opaque LSA";
+
+ container tlvs {
+ description
+ "The TLVs contained in the TE Opaque LSA";
+ list tlv {
+ // this is an unkeyed list
+ description
+ "The Type-Length-Value tuples included in the TE LSA";
+
+ container state {
+ description
+ "The contents of the TLV tuple within the TE LSA";
+ uses ospfv2-lsdb-opaque-lsa-te-tlv-state;
+ }
+
+ uses ospfv2-lsdb-common-unknown-tlv-structure;
+
+ container router-address {
+ when "../state/type = 'TE_ROUTER_ADDRESS'" {
+ description
+ "Include the router address container only when the type
+ of the TLV is Router Address";
+ }
+
+ description
+ "Parameters included in the Router Address TLV";
+
+ container state {
+ description
+ "State parameters of the router address TLV";
+ uses ospfv2-lsdb-opaque-te-router-address-state;
+ }
+ }
+
+ container link {
+ when "../state/type = 'TE_ROUTER_LINK'" {
+ description
+ "Include the link container only when the type of the
+ TLV describes a traffic engineering link";
+ }
+
+ description
+ "Parameters included in the Link TLV";
+ container sub-tlvs {
+ description
+ "Sub-TLVs included in the Link TLV";
+
+ list sub-tlv {
+ // unkeyed list
+ description
+ "The Sub-TLVs included within the Traffic Engineering
+ LSA's sub-TLV";
+
+ container state {
+ description
+ "State parameters of the Link Sub-TLV";
+
+ uses ospfv2-lsdb-opaque-te-link-state;
+ }
+
+ uses ospfv2-lsdb-common-unknown-subtlv-structure;
+
+ container unreserved-bandwidths {
+ description
+ "The unreserved link bandwidths for the Traffic
+ Engineering LSA - utilised when the sub-TLV type
+ indicates that the sub-TLV describes unreserved
+ bandwidth";
+
+ list unreserved-bandwidth {
+ key "priority";
+
+ description
+ "The unreserved bandwidth at each priority level";
+
+ leaf priority {
+ type leafref {
+ path "../state/priority";
+ }
+ description
+ "A reference to the priority level being described";
+ }
+
+ container state {
+ description
+ "State parameters relating to the unreserved
+ bandwidth of the link being described";
+ uses ospfv2-lsdb-opaque-te-link-unreserved-bw-state;
+ }
+ }
+ }
+
+ container administrative-groups {
+ description
+ "The administrative groups that are set for the
+ Traffic Engineering LSA - utilised when the sub-TLV type
+ indicates that the sub-TLV describes administrative
+ groups";
+
+ list admin-group {
+ key "bit-index";
+
+ description
+ "The administrative group described within the
+ sub-TLV";
+
+ leaf bit-index {
+ type leafref {
+ path "../state/bit-index";
+ }
+ description
+ "A reference to the bit index being described";
+ }
+
+ container state {
+ description
+ "State parameters relating to the administrative
+ groups being described for the link";
+ uses ospfv2-lsdb-opaque-te-link-admin-group-state;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ container node-attribute {
+ when "../state/type = 'TE_NODE_ATTRIBUTE'" {
+ description
+ "Include the node-attribute container only when the type of
+ the TLV describes a node attribute";
+ }
+
+ description
+ "Parameters included in the Node Attribute TLV";
+
+ container sub-tlvs {
+ description
+ "Sub-TLVs of the Node Attribute TLV of the Traffic
+ Engineering LSA";
+
+ list sub-tlv {
+ // unkeyed list
+ description
+ "List of the Sub-TLVs contained within the Node Attribute
+ TLV";
+
+ container state {
+ description
+ "State parameters of the Node Attribute TLV sub-TLV";
+ uses ospfv2-lsdb-opaque-te-node-attribute-state;
+ }
+
+ uses ospfv2-lsdb-common-unknown-subtlv-structure;
+ }
+ }
+ }
+
+ // A set of TLVs are omitted here - based on operational
+ // requirements, these are:
+ // * link-local
+ // * ipv6-address (OSPFv3 only)
+ // * optical-node-property
+ }
+ }
+ } // traffic-engineering
+
+ container grace-lsa {
+ when "../state/type = 'GRACE_LSA'" {
+ description
+ "Include the grace-lsa container when the opaque LSA is specified
+ to be of that type.";
+ }
+
+ description
+ "The Grace LSA is utilised when a remote system is undergoing
+ graceful restart";
+
+ container tlvs {
+ description
+ "TLVs of the Grace LSA";
+
+ list tlv {
+ description
+ "TLV entry in the Grace LSA, advertised by a system undergoing
+ graceful restart";
+
+ // unkeyed list
+ container state {
+ description
+ "Per-TLV state parameters of the Grace LSA";
+ uses ospfv2-lsdb-opaque-grace-state;
+ }
+ uses ospfv2-lsdb-common-unknown-tlv-structure;
+ }
+ }
+ } // grace LSA
+
+ container router-information {
+ when "../state/type = 'ROUTER_INFORMATION_LSA'" {
+ description
+ "Include the router-information container when the opaque LSA
+ type is specified to be an RI LSA";
+ }
+
+ description
+ "The router information LSA is utilised to advertise capabilities
+ of a system to other systems who receive the LSA";
+
+ container tlvs {
+ description
+ "The TLVs included within the Router Information LSA.";
+
+ list tlv {
+ description
+ "TLV entry in the Router Information LSA";
+
+ // unkeyed list
+ container state {
+ description
+ "Per-TLV state parameters of the RI LSA";
+ uses ospfv2-lsdb-opaque-ri-state;
+ }
+
+ uses ospfv2-lsdb-common-unknown-tlv-structure;
+
+ container informational-capabilities {
+ when "../state/type = 'RI_INFORMATIONAL_CAPABILITIES'" {
+ description
+ "Include the informational capabilities specification when
+ the TLV of the RI LSA is specified to be of this type";
+ }
+
+ description
+ "Information related to the capabilities of the advertising
+ router within the scope that the opaque RI LSA is being
+ advertised";
+
+ container state {
+ description
+ "State parameters of the informational capabilitis of the
+ RI LSA";
+ uses ospfv2-lsdb-opaque-ri-informational-state;
+ }
+ }
+
+ container node-administrative-tags {
+ when "../state/type = 'RI_NODE_ADMIN_TAG'" {
+ description
+ "Include the node administrative tags specification when
+ the TLV of the RI LSA is specified to be of this type";
+ }
+
+ description
+ "Per-node administrative tags associated with the local system
+ specified by the operator";
+
+ container state {
+ description
+ "State parameters of the node administrative tags advertised
+ in the RI LSA";
+ uses ospfv2-lsdb-opaque-ri-admintag-state;
+ }
+ }
+
+ container segment-routing-algorithm {
+ when "../state/type = 'RI_SR_ALGORITHM'" {
+ description
+ "Include the segment routing algorithm specific parameters when
+ the TLV of the RI LSA is specified to be of this type";
+ }
+
+ description
+ "The algorithms supported for Segment Routing by the local system";
+
+ container state {
+ description
+ "State parameters of the Segment Routing algorithm advertised in
+ the RI LSA";
+ uses ospfv2-lsdb-opaque-ri-sralgo-state;
+ }
+ }
+
+ container segment-routing-sid-label-range {
+ when "../state/type = 'RI_SR_SID_LABEL_RANGE'" {
+ description
+ "Include the segment routing SID/Label range TLV specific state when
+ the TLV of the RI LSA is specified to be of this type";
+ }
+
+ description
+ "The Segment Identifier (SID) or label ranges that are supported by
+ the local system for Segment Routing";
+
+ container tlvs {
+ description
+ "Sub-TLVs of the SID/Label range TLV of the RI LSA";
+
+ list tlv {
+ // unkeyed list
+ description
+ "Sub-TLVs of the SID/Label range TLV";
+
+ uses ospfv2-lsdb-common-unknown-tlv-structure;
+
+ container state {
+ description
+ "State parameters of the sub-TLVs of the SR/Label range TLV";
+ uses ospfv2-lsdb-opaque-ri-srrange-tlv-state;
+ }
+
+ container sid-label {
+ description
+ "Sub-TLV used to advertise the SID or label associated with the
+ subset of the SRGB being advertised";
+
+ container state {
+ description
+ "State parameters of the SID/Label sub-TLV of the SR/Label
+ range TLV of the RI LSA";
+ uses ospfv2-lsdb-opaque-ri-srrange-sid-label-tlv-state;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } // router-information
+
+ container extended-prefix {
+ when "../state/type = 'OSPFV2_EXTENDED_PREFIX'" {
+ description
+ "Include the extended-prefix container when the opaque LSA
+ type is specified to be an extended prefix LSA";
+ }
+
+ description
+ "An OSPFv2 Extended Prefix Opaque LSA, used to encapsulate
+ TLV attributes associated with a prefix advertised in OSPF.";
+
+ reference "RFC7684 - OSPFv2 Prefix/Link Attribute Advertisement";
+
+ container state {
+ description
+ "State parameters of the Extended Prefix LSA";
+ uses ospfv2-lsdb-extended-prefix-state;
+ }
+
+ container tlvs {
+ description
+ "TLVs contained within the Extended Prefix LSA";
+
+ list tlv {
+ // unkeyed list
+ description
+ "A TLV contained within the extended prefix LSA";
+
+ container state {
+ description
+ "State parameters relating to the sub-TLV of the extended
+ prefix LSA";
+ uses ospfv2-lsdb-extended-prefix-tlv-state;
+ }
+
+ container extended-prefix-range {
+ when "../state/type = 'EXTENDED_PREFIX_RANGE'" {
+ description
+ "Include the prefix range sub-TLV when the type of the
+ sub-TLV is specified as such";
+ }
+
+ description
+ "State parameters relating to the extended prefix range
+ sub-TLV of the extended prefix LSA";
+
+ container state {
+ description
+ "State parameters relating to the Extended Prefix Range
+ sub-TLV of the Extended Prefix LSA";
+ uses ospfv2-lsdb-extended-prefix-range-state;
+ }
+ }
+
+ container prefix-sid {
+ when "../state/type = 'PREFIX_SID'" {
+ description
+ "Include parameters relating to the Prefix SID when the type
+ of the sub-TLV is indicated as such";
+ }
+
+ description
+ "State parameters relating to the Prefix SID sub-TLV of the
+ extended prefix LSA";
+
+ container state {
+ description
+ "State parameters relating to the Prefix SID sub-TLV of the
+ extended prefix LSA";
+ uses ospfv2-lsdb-extended-prefix-prefix-sid-state;
+ }
+ } // prefix-sid
+
+ container sid-label-binding {
+ when "../state/type = 'SID_LABEL_BINDING'" {
+ description
+ "Include parameters relating to the SID/Label binding sub-TLV
+ only when the type is indicated as such";
+ }
+
+ description
+ "State parameters relating to the SID/Label binding sub-TLV
+ of the extended prefix LSA";
+
+ container state {
+ description
+ "State parameters relating to the SID/Label binding sub-TLV
+ of the extended prefix LSA";
+ uses ospfv2-lsdb-extended-prefix-sid-label-binding-state;
+ }
+
+ container tlvs {
+ description
+ "TLVs contained within the SID/Label Binding sub-TLV of the
+ SID/Label Binding TLV";
+
+ list tlv {
+ description
+ "A TLV contained within the SID/Label Binding sub-TLV";
+
+ container state {
+ description
+ "State parameters relating to the SID/Label Binding
+ sub-TLV";
+ uses ospfv2-lsdb-extended-prefix-sid-label-binding-tlv-state;
+ }
+
+ container sid-label-binding {
+ when "../state/type = 'SID_LABEL_BINDING'" {
+ description
+ "Include the SID/Label Binding sub-TLV parameters only
+ when the type is indicated as such";
+ }
+
+ description
+ "Parameters for the SID/Label Binding sub-TLV of the
+ SID/Label binding TLV";
+
+ container state {
+ description
+ "State parameteres relating to the SID/Label Binding
+ sub-TLV";
+ uses ospfv2-lsdb-extprefix-sid-label-binding-state;
+ }
+ } // sid-label-binding
+
+ container ero-metric {
+ when "../state/type = 'ERO_METRIC'" {
+ description
+ "Include the ERO Metric sub-TLV parameters only when
+ the type is indicated as such";
+ }
+
+ description
+ "Parameters for the ERO Metric Sub-TLV of the SID/Label
+ binding TLV";
+
+ container state {
+ description
+ "State parameters relating to the ERO Metric Sub-TLV of
+ the SID/Label binding TLV";
+ uses ospfv2-lsdb-extprefix-sid-label-ero-metric-state;
+ }
+ } // ero-metric
+
+ container ero-path {
+ when "../state/type = 'ERO_PATH'" {
+ description
+ "Include the ERO Path sub-TLV parameters only when the
+ type is indicated as such";
+ }
+
+ description
+ "Parameters for the ERO Path Sub-TLV of the SID/Label
+ binding TLV";
+
+ container segments {
+ description
+ "Segments of the path described within the SID/Label
+ Binding sub-TLV";
+
+ list segment {
+ description
+ "A segment of the path described within the sub-TLV";
+
+ container state {
+ description
+ "State parameters relating to the path segment
+ contained within the sub-TLV";
+ uses ospfv2-lsdb-extprefix-sid-lbl-ero-path-seg-state;
+ }
+
+ container ipv4-segment {
+ when "../state/type = 'IPV4_SEGMENT'" {
+ description
+ "Include the IPv4 segment only when the type is
+ indicated as such";
+ }
+
+ description
+ "Details of the IPv4 segment interface of the ERO";
+
+ container state {
+ description
+ "State parameters of the IPv4 segment of the ERO";
+ uses ospfv2-lsdb-extprefix-sid-lbl-ero-ipv4-state;
+ }
+ } // ipv4-segment
+
+ container unnumbered-hop {
+ when "../state/type = 'UNNUMBERED_INTERFACE_SEGMENT'" {
+ description
+ "Include the unnumbered segment only when the
+ type is indicated as such";
+ }
+
+ description
+ "Details of the unnumbered interface segment of the
+ ERO";
+
+ container state {
+ description
+ "State parameters of the unnumbered interface
+ segment of the ERO";
+ uses ospfv2-lsdb-extprefix-sid-lbl-ero-unnum-state;
+ }
+ } // unnumbered-hop
+ } // tlv
+ } // tlvs
+ }
+ }
+ }
+ } // sid-label-binding
+
+ uses ospfv2-lsdb-common-unknown-tlv-structure;
+ }
+ }
+ } // extended-prefix
+
+ container extended-link {
+ description
+ "The OSPFv2 Extended Link Opaque LSA, used to encapsulate TLV
+ attributes associated with a link advertised in OSPF.";
+
+ reference "RFC7684 - OSPFv2 Prefix/Link Attribute Advertisement";
+
+ container state {
+ description
+ "State parameters of the Extended Link LSA";
+ uses ospfv2-lsdb-extended-link-state;
+ }
+
+ container tlvs {
+ description
+ "TLVs contained within the Extended Link LSA";
+
+ list tlv {
+ description
+ "List of TLVs within the Extended Link LSA";
+
+ container state {
+ description
+ "State parameters relating to the sub-TLV of the extended link
+ LSA";
+ uses ospfv2-lsdb-extended-link-tlv-state;
+ }
+
+ uses ospfv2-lsdb-common-unknown-tlv-structure;
+
+ container adjacency-sid {
+ when "../state/type = 'ADJACENCY_SID'" {
+ description
+ "Include the Adjacency SID parameters only when the type of
+ the sub-TLV is indicated as such";
+ }
+
+ description
+ "Parameters relating to an Adjacency SID sub-TLV of the
+ extended link LSA";
+
+ container state {
+ description
+ "State parameters relating to an Adjacency SID";
+
+ uses ospfv2-lsdb-extended-link-adj-sid-state;
+ }
+ }
+ }
+ }
+
+ } // extended-link
+
+ uses ospfv2-lsdb-common-unknown-tlv-structure;
+ }
+ }
+
+ grouping ospfv2-lsdb-generic-lsa-tos-metric-state {
+ description
+ "Per-TOS state parameters for the Router LSA";
+
+ uses ospfv2-lsdb-common-tos-metric;
+ }
+
+ grouping ospfv2-lsdb-router-lsa-state {
+ description
+ "Parameters of the router LSA";
+
+ leaf type {
+ type identityref {
+ base "oc-ospf-types:ROUTER_LSA_TYPES";
+ }
+ description
+ "The sub-type of the Router LSA.";
+ }
+
+ uses ospfv2-lsdb-common-link-specification;
+
+ leaf metric {
+ type oc-ospf-types:ospf-metric;
+ description
+ "The cost of utilising the link specified independent of TOS";
+ }
+
+ leaf number-links {
+ type uint16;
+ description
+ "The number of links that are described within the LSA";
+ }
+
+ leaf number-tos-metrics {
+ type uint16;
+ description
+ "The number of different TOS metrics given for this link, not
+ including the link metric (which is referred to as TOS 0).";
+ }
+ }
+
+ grouping ospfv2-lsdb-network-lsa-state {
+ description
+ "Parameters of the Network LSA";
+
+ leaf network-mask {
+ type uint8 {
+ range "0..32";
+ }
+ description
+ "The mask of the network described by the Network LSA
+ represented as a CIDR mask.";
+ }
+
+ leaf-list attached-router {
+ type yang:dotted-quad;
+ description
+ "A list of the router ID of the routers that are attached to
+ the network described by the Network LSA";
+ }
+ }
+
+ grouping ospfv2-lsdb-summary-lsa-state {
+ description
+ "Parameters of the Summary LSA";
+
+ leaf network-mask {
+ type uint8 {
+ range "0..32";
+ }
+ description
+ "The mask of the network described by the Summary LSA
+ represented as a CIDR mask.";
+ }
+ }
+
+ grouping ospfv2-lsdb-asexternal-lsa-common-parameters {
+ description
+ "Common parameters that are used for OSPFv2 AS External LSAs";
+
+ leaf forwarding-address {
+ type inet:ipv4-address-no-zone;
+ description
+ "The destination to which traffic for the external prefix
+ should be advertised. When this value is set to 0.0.0.0 then
+ traffic should be forwarded to the LSA's originator";
+ }
+
+ leaf external-route-tag {
+ type uint32;
+ description
+ "An opaque tag that set by the LSA originator to carry
+ information relating to the external route";
+ }
+ }
+
+ grouping ospfv2-lsdb-asexternal-lsa-state {
+ description
+ "Parameters for the AS External LSA";
+
+ leaf mask {
+ type uint8 {
+ range "0..32";
+ }
+ description
+ "The subnet mask for the advertised destination";
+ }
+
+ leaf metric-type {
+ type enumeration {
+ enum "TYPE_1" {
+ description
+ "When the metric of a prefix is specified as Type 1
+ then it is considered to be expressed in the same units as
+ the link-state metrics carried in OSPF. That is to say
+ that the metric advertised is directly compared to the
+ internal cost";
+ }
+ enum "TYPE_2" {
+ description
+ "When the metric of a prefix is specified as Type 2 then
+ it is considered to be expressed as a cost in addition to
+ that of the link-state metric to the advertising router.
+ That is to say that the metric is considered to be the
+ cost to the advertising router plus the advertised metric
+ for the external entity";
+ }
+ }
+ description
+ "The type of metric included within the AS External LSA.";
+ }
+
+ leaf metric {
+ type oc-ospf-types:ospf-metric;
+ description
+ "The cost to reach the external network specified. The exact
+ interpretation of this cost is dependent on the type of
+ metric specified";
+ }
+
+ uses ospfv2-lsdb-asexternal-lsa-common-parameters;
+ }
+
+ grouping ospfv2-lsdb-asexternal-tos-state {
+ description
+ "Per-TOS parameters for the AS External LSA";
+
+ uses ospfv2-lsdb-asexternal-lsa-common-parameters;
+ uses ospfv2-lsdb-common-tos-metric;
+ }
+
+ grouping ospfv2-lsdb-nssa-external-lsa-state {
+ description
+ "Operational state parameters specific to the NSSA External
+ LSA";
+
+ leaf propagate {
+ type boolean;
+ description
+ "When this bit is set to true, an NSSA border router will
+ translate a Type 7 LSA (NSSA External) to a Type 5 LSA
+ (AS External).";
+ reference "RFC3101, Section 2.3";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-lsa-state {
+ description
+ "Operational state parameters specific to an Opaque LSA";
+
+ leaf scope {
+ type enumeration {
+ enum LINK {
+ description
+ "The scope of the LSA is the current link. The LSA
+ is not flooded beyond the local network. This
+ enumeration denotes a Type 9 LSA.";
+ }
+ enum AREA {
+ description
+ "The scope of the LSA is the local area. The LSA
+ is not flooded beyond the area of origin. This
+ enumeration denotes a Type 10 LSA.";
+ }
+ enum AS {
+ description
+ "The scope of the LSA is the local autonomous
+ system (AS). The flooding domain is the same
+ as a Type 5 LSA - it is not flooded into
+ stub areas or NSSAs. This enumeration denotes a
+ Type 11 LSA.";
+ }
+ }
+ description
+ "The scope of the opaque LSA. The type of the LSA
+ indicates its scope - the value of this leaf
+ determines both the flooding domain, and the type
+ of the LSA.";
+ }
+
+ leaf type {
+ type identityref {
+ base "oc-ospf-types:OSPF_OPAQUE_LSA_TYPE";
+ }
+ description
+ "The Opaque Type of the LSA. This value is used to
+ indicate the type of data carried by the opaque LSA";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-lsa-te-tlv-state {
+ description
+ "The contents of the Traffic Engineering LSA";
+
+ leaf type {
+ type identityref {
+ base "oc-ospf-types:OSPF_TE_LSA_TLV_TYPE";
+ }
+ description
+ "The type of TLV within the Traffic Engineering LSA";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-te-unknown-state {
+ description
+ "The contents of the unknown TLV within the Traffic Engineering LSA";
+
+ uses ospfv2-lsdb-common-unknown-tlv;
+ }
+
+ grouping ospfv2-lsdb-opaque-te-link-state {
+ description
+ "The contents of the sub-TLVs of a Traffic Engineering LSA Link TLV";
+
+ leaf type {
+ type union {
+ type identityref {
+ base "oc-ospf-types:OSPF_TE_LINK_TLV_TYPE";
+ }
+ type enumeration {
+ enum UNKNOWN {
+ description
+ "The sub-TLV received in the LSA is unknown to the local
+ system";
+ }
+ }
+ }
+ description
+ "The sub-TLV type specified in the Link TLV. When the value is
+ known by the local system, a canonical name of the sub-TLV is utilised
+ - the special UNKNOWN value indicates that the system did not
+ support the sub-TLV type received in the LSA.";
+ }
+
+ leaf unknown-type {
+ when "../type = 'UNKNOWN'" {
+ description
+ "Include the unknown type field only when the sub-TLV was not
+ known to the local system";
+ }
+
+ type uint16;
+ description
+ "The value of the type field of an unknown sub-TLV";
+ }
+
+ leaf unknown-value {
+ when "../type = 'UNKNOWN'" {
+ description
+ "Include the unknown value field only when the sub-TLV was not
+ known to the local system";
+ }
+
+ type binary;
+ description
+ "The binary contents of the unknown TLV";
+ }
+
+ leaf link-type {
+ when "../type = 'TE_LINK_TYPE'" {
+ description
+ "Include the link-type field only when the sub-TLV type was a TE
+ link type";
+ }
+
+ type enumeration {
+ enum POINT_TO_POINT {
+ description
+ "The link being described by the TE LSA Link sub-TLV is a
+ point-to-point link to exactly one other system";
+ }
+ enum MULTI_ACCESS {
+ description
+ "The link being described by the TE LSA Link sub-TLV is a
+ multi-access link that supports connectivity to multiple remote
+ systems";
+ }
+ enum UNKNOWN {
+ description
+ "The link type received was unknown to the local system";
+ }
+ }
+ description
+ "The type of the link that is being described by the TE LSA Link
+ sub-TLV";
+ }
+
+ leaf link-id {
+ when "../type = 'TE_LINK_ID'" {
+ description
+ "Include the link ID field only when the sub-TLV type was a TE
+ Link identifier";
+ }
+
+ type yang:dotted-quad;
+ description
+ "The ID of the remote system. For point-to-point links, this is the
+ router ID of the neighbor. For multi-access links it is the address
+ of the designated router.";
+ }
+
+ leaf-list local-ip-address {
+ when "../type = 'TE_LINK_LOCAL_IP'" {
+ description
+ "Include the local IP address field only when the sub-TLV type was
+ a local IP address";
+ }
+
+ type inet:ipv4-address-no-zone;
+ description
+ "The IP address(es) of the local system that correspond to the
+ specified TE link";
+ }
+
+ leaf-list remote-ip-address {
+ when "../type = 'TE_LINK_REMOTE_IP'" {
+ description
+ "Include the remote IP address field only when the sub-TLV type was
+ a remote IP address";
+ }
+
+ type inet:ipv4-address-no-zone;
+ description
+ "The IP address(es) of the remote systems that are attached to the
+ specified TE link";
+ }
+
+ leaf metric {
+ when "../type = 'TE_LINK_METRIC'" {
+ description
+ "Include the traffic engineering metric only when the sub-TLV type
+ is a TE metric";
+ }
+
+ type uint32;
+ description
+ "The metric of the link that should be used for traffic engineering
+ purposes. This link may be different than the standard OSPF link
+ metric.";
+ }
+
+ leaf maximum-bandwidth {
+ when "../type = 'TE_LINK_MAXIMUM_BANDWIDTH'" {
+ description
+ "Include the traffic engineering metric only when the sub-TLV type
+ is the maximum bandwidth";
+ }
+
+ type oc-types:ieeefloat32;
+ units "bytes per second";
+ description
+ "The maximum bandwidth of the link. This value reflects the actual
+ bandwidth of the link expressed asn IEEE 32-bit floating point
+ number";
+ }
+
+ leaf maximum-reservable-bandwidth {
+ when "../type = 'TE_LINK_MAXIUMUM_RESERVABLE_BANDWIDTH'" {
+ description
+ "Include the maximum reservable bandwidth field only when the
+ sub-TLV type is the maximum reservable bandwidth";
+ }
+
+ type oc-types:ieeefloat32;
+ units "bytes per second";
+ description
+ "The maximum reservable bandwidth for the link. This value represents
+ the total bandwidth which may be used for traffic engineering
+ purposes. The value may exceed the maximum-bandwidth value
+ in cases where the link is oversubscribed. The value is reflected as
+ a 32-bit IEEE floating-point number";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-te-link-unreserved-bw-state {
+ description
+ "The per-priority unreserved bandwidth described within the unreserved
+ bandwidth sub-TLV of the Link TLV of the Traffic Engineering LSA";
+
+ leaf priority {
+ type uint8 {
+ range "0..7";
+ }
+ description
+ "The priority level being described";
+ }
+
+ leaf unreserved-bandwidth {
+ type oc-types:ieeefloat32;
+ description
+ "The unreserved bandwidth for at priority level P, where P is
+ equal to the priority of the current list entry. The reservable
+ bandwidth at priority P is equal to the sum of the reservable
+ bandwidth at all levels 0..P.";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-te-link-admin-group-state {
+ description
+ "Per bit administrative group status";
+
+ leaf bit-index {
+ type uint8 {
+ range "0..31";
+ }
+ description
+ "The index of the bit within the 32-bit administrative group field
+ of the Administrative Group sub-TLV of the Traffic Engineering LSA";
+ }
+
+ leaf set {
+ type boolean;
+ default false;
+ description
+ "Whether the bit is set within the administrative group field";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-te-node-attribute-state {
+ description
+ "State parameters relating to the Traffic Engineering Node Attribute
+ TLV of the Traffic Engineering LSA";
+
+ leaf type {
+ type union {
+ type identityref {
+ base "oc-ospf-types:TE_NODE_ATTRIBUTE_TLV_TYPE";
+ }
+ type enumeration {
+ enum UNKNOWN {
+ description
+ "The sub-TLV type received within the TE LSA Node Attribute TLV
+ was unknown the the local system";
+ }
+ }
+ }
+ description
+ "The type of the sub-TLV of the Node Attribute TLV contained within
+ the TE LSA. If the local system can interpret the value received the
+ canonical name of the type is utilised, otherwise the special UNKNOWN
+ value is used";
+ }
+
+ leaf-list local-ipv4-addresses {
+ when "../type = 'NODE_IPV4_LOCAL_ADDRESS'" {
+ description
+ "Include the local IPv4 addresses when the type of the sub-TLV
+ indicates that this is the contained data";
+ }
+
+ type inet:ipv4-prefix;
+ description
+ "The local IPv4 addresses of the node expressed in CIDR notation";
+ }
+
+ leaf-list local-ipv6-addresses {
+ when "../type = 'NODE_LOCAL_IPV6_ADDRESS'" {
+ description
+ "Include the local IPv6 addresses when the type of the sub-TLV
+ indicfates that this is the contained data";
+ }
+
+ type inet:ipv6-prefix;
+ description
+ "The local IPv6 addreses of the node";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-te-router-address-state {
+ description
+ "The contents of the value field of the Router Address TLV of the
+ Traffic Engineering LSA.";
+
+ leaf address {
+ type inet:ipv4-address-no-zone;
+ description
+ "A stable IP address of the advertising router, that is always
+ reachable when the router is connected to the network. Typically this
+ is a loopback address.";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-grace-state {
+ description
+ "State parameters on a per-TLV basis of the Grace LSA";
+
+ leaf type {
+ type identityref {
+ base "oc-ospf-types:GRACE_LSA_TLV_TYPES";
+ }
+ description
+ "The type of the sub-TLV received within the Grace LSA";
+ }
+
+ leaf period {
+ when "../type = 'GRACE_PERIOD'" {
+ description
+ "Include the period specification when the sub-TLV type is indicated
+ to be of this type";
+ }
+
+ type uint32;
+ units seconds;
+ description
+ "The number of seconds that the router's neighbors should advertise
+ the local system as fully adjacent regardless of database
+ synchronization state";
+ reference "RFC3623";
+ }
+
+ leaf reason {
+ when "../type = 'GRACE_RESTART_REASON'" {
+ description
+ "Include the restart reason when the sub-TLV type specifies this
+ is included";
+ }
+
+ type enumeration {
+ enum UNKNOWN {
+ value 0;
+ description
+ "The reason for the graceful restart is unknown";
+ }
+ enum SOFTWARE_RESTART {
+ value 1;
+ description
+ "The local system is restarting due to a software component
+ restart";
+ }
+ enum SOFTWARE_RELOAD_UPGRADE {
+ value 2;
+ description
+ "The local system is restarting due to a software reload or
+ upgrade";
+ }
+ enum CONTROL_PROCESSOR_SWITCH {
+ value 3;
+ description
+ "The local system is restarting due to a switch to a redundant
+ control plane element";
+ }
+ }
+ description
+ "The reason for the graceful restart event occurring, as advertised
+ by the restarting system";
+ reference "RFC3623";
+ }
+
+ leaf ip-interface-address {
+ when "../type = 'GRACE_IP_INTERFACE_ADDRESS'" {
+ description
+ "Include the interface address when the sub-TLV type specifies that
+ it is included";
+ }
+
+ type inet:ipv4-address-no-zone;
+ description
+ "The restarting system's IP address on the interface via which the
+ Grace LSA is being advertised.";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-ri-state {
+ description
+ "State parameters of the Router Information Opaque LSA";
+
+ leaf type {
+ type union {
+ type identityref {
+ base "oc-ospf-types:RI_LSA_TLV_TYPES";
+ }
+ type enumeration {
+ enum UNKNOWN {
+ description
+ "The TLV received within the RI LSA is unknown";
+ }
+ }
+ }
+ description
+ "The type of sub-TLV of the Router Information opaque LSA";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-ri-informational-state {
+ description
+ "State parmaeters of the Router Information Informational Capabilities
+ sub-TLV";
+
+ leaf graceful-restart-capable {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to true, the advertising system is capable of
+ OSPF graceful restart.";
+ }
+
+ leaf graceful-restart-helper {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to true, the advertising system is capable of
+ being a helper for OSPF graceful restart";
+ }
+
+ leaf stub-router {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to true, the advertising system is able to
+ advertise its status as a stub router";
+ reference "RFC6987";
+ }
+
+ leaf traffic-engineering {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to true, the advertising system supports OSPFv2
+ traffic engineering capabilities";
+ }
+
+ leaf point-to-point-over-lan {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to true, the advertising system supports treating
+ LAN adjacencies as though they were point to point";
+ reference "RFC5309";
+ }
+
+ leaf experimental-te {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to ture, the advertising system supports the
+ experimental extensions to OSPF for TE described in RFC4973";
+ reference "RFC4973";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-ri-admintag-state {
+ description
+ "State parameters relating to the administrative tags specified for
+ a node within the RI LSA";
+
+ leaf-list administrative-tags {
+ type uint32;
+ description
+ "The set of administrative tags assigned to the local system by
+ the network operator. The meaning of these tags is opaque to OSPF
+ - and their interpretation is per-domain specific";
+ reference "RFC7777";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-ri-unknown-state {
+ description
+ "State parameters relating to an unknown TLV within the RI LSA";
+ uses ospfv2-lsdb-common-unknown-tlv;
+ }
+
+ grouping ospfv2-lsdb-opaque-ri-sralgo-state {
+ description
+ "State parameters relating to the SR Algorithms TLV of the RI LSA";
+
+ leaf-list supported-algorithms {
+ type identityref {
+ base "oc-ospf-types:SR_ALGORITHM";
+ }
+ description
+ "A list of the algorithms that are supported for segment routing
+ by the advertising system";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-ri-srrange-tlv-state {
+ description
+ "State parameters relating to the SR SID/Label range TLV of the
+ RI LSA";
+
+ leaf type {
+ type union {
+ type identityref {
+ base "oc-ospf-types:OSPF_RI_SR_SID_LABEL_TLV_TYPES";
+ }
+ type enumeration {
+ enum UNKNOWN {
+ description
+ "The type of the sub-TLV advertised with the SID/Label range
+ TLV of the RI LSA is unknown to the receiving system";
+ }
+ }
+ }
+ description
+ "The type of the sub-TLV received by the local system within the
+ SR SID/Label Range TLV of the RI LSA";
+ }
+
+ leaf range-size {
+ type uint32 {
+ range "0..16777216";
+ }
+ description
+ "The number of entries within the range being described within the
+ SID/Label range TLV";
+ }
+ }
+
+ grouping ospfv2-lsdb-opaque-ri-srrange-sid-label-tlv-state {
+ description
+ "State parameters relating to the SR SID/Label sub-TLV of the SR SID/Label
+ range TLV of the RI LSA";
+
+ leaf entry-type {
+ type oc-ospf-types:sr-sid-type;
+ description
+ "The type of entry that is contained within the sub-TLV. The range may
+ be represented as either a range of MPLS labels, or numeric segment
+ identifiers";
+ }
+
+ leaf first-value {
+ type uint32;
+ description
+ "The first value within the SRGB range being specified. The type of the
+ entry is determined based on the value of the entry type as this value
+ may represent either a segment identifier or an MPLS label.";
+ }
+ }
+
+ grouping ospfv2-lsdb-extended-prefix-state {
+ description
+ "State parameters relating to an Extended Prefix LSA";
+
+ leaf route-type {
+ type enumeration {
+ enum UNSPECIFIED {
+ value 0;
+ description
+ "The prefix described in the extended prefix LSA is of an
+ unspecified type";
+ }
+ enum INTRA_AREA {
+ value 1;
+ description
+ "The prefix described in the extended prefix LSA is an intra-area
+ prefix for the advertising system";
+ }
+ enum INTER_AREA {
+ value 3;
+ description
+ "The prefix described in the extended prefix LSA is an inter-area
+ prefix for the advertising system";
+ }
+ enum AS_EXTERNAL {
+ value 5;
+ description
+ "The prefix described in the extended prefix LSA is external to the
+ autonomous system of the advertising system";
+ }
+ enum NSSA_EXTERNAL {
+ value 7;
+ description
+ "The prefix described in the extended prefix LSA externally
+ advertised from an NSSA area visibile to the advertising system";
+ }
+ }
+ description
+ "The type of prefix that is contained within the Extended Prefix LSA.
+ The information contained in sub-TLVs of the attribute is applicable
+ regardless of this value.";
+ }
+
+ uses ospfv2-lsdb-common-prefix-properties;
+
+ leaf attached {
+ type boolean;
+ default false;
+ description
+ "If this value is set to true, the prefix being advertised was
+ generated by an ABR for an inter-area prefix. The value corresponds
+ to the A-flag of the flags field of the Extended Prefix LSA";
+ }
+
+ leaf node {
+ type boolean;
+ default false;
+ description
+ "If this value is set to true, the prefix being advertised represents
+ the advertising router. Typically, the prefix within the LSA is
+ expected to be globally-reachable prefix associated with a loopback
+ interface";
+ }
+
+ leaf prefix {
+ type inet:ipv4-address-no-zone;
+ description
+ "The IPv4 prefix contained within the extended prefix LSA";
+ }
+ }
+
+ grouping ospfv2-lsdb-extended-link-state {
+ description
+ "State parameters related to an extended link LSA";
+
+ leaf link-type {
+ type identityref {
+ base "oc-ospf-types:OSPFV2_ROUTER_LINK_TYPE";
+ }
+ description
+ "The type of link with which extended attributes are associated";
+ }
+
+ uses ospfv2-lsdb-common-link-specification;
+
+ }
+
+ grouping ospfv2-lsdb-extended-link-tlv-state {
+ description
+ "State parameters relating to a sub-TLV of the extended link LSA";
+
+ leaf type {
+ type identityref {
+ base "oc-ospf-types:OSPFV2_EXTENDED_LINK_SUBTLV_TYPE";
+ }
+ description
+ "The type of the sub-TLV contained within the extended link TLV";
+ }
+ }
+
+ grouping ospfv2-lsdb-extended-prefix-tlv-state {
+ description
+ "State parameters related to a sub-TLV of an Extended Prefix LSA";
+
+ leaf type {
+ type identityref {
+ base "oc-ospf-types:OSPFV2_EXTENDED_PREFIX_SUBTLV_TYPE";
+ }
+ description
+ "The type of sub-TLV as indicated by the Extended Prefix LSA";
+ }
+ }
+
+ grouping ospfv2-lsdb-extended-prefix-range-state {
+ description
+ "Parameters of the Extended Prefix Range SubTLV";
+
+ uses ospfv2-lsdb-common-prefix-properties;
+
+ leaf range-size {
+ type uint16;
+ description
+ "The number of prefixes that are covered by the advertisement.";
+ }
+
+ leaf inter-area {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to true, then the prefix range is inter-area -
+ the flag is set by the ABR that advertises the Extended Prefix Range
+ TLV";
+ }
+
+ leaf prefix {
+ type inet:ipv4-prefix;
+ description
+ "The first prefix in the range of prefixes being described by the
+ extended prefix range sub-TLV";
+ }
+ }
+
+ grouping ospfv2-lsdb-extended-prefix-prefix-sid-state {
+ description
+ "Parameters of the Prefix-SID sub-TLV";
+
+ leaf no-php {
+ type boolean;
+ default false;
+ description
+ "If this leaf is set the advertising system has indicated that the
+ prefix SID must not be popped before delivering packets to it";
+ }
+
+ leaf mapping-server {
+ type boolean;
+ default false;
+ description
+ "If this leaf is set the SID was advertised by a Segment Routing
+ mapping server";
+ }
+
+ leaf explicit-null {
+ type boolean;
+ default false;
+ description
+ "If this leaf is set, the advertising system has requested that the
+ prefix SID value should be replaced with the explicit null label
+ value";
+ }
+
+ leaf sid-value-type {
+ type enumeration {
+ enum ABSOLUTE {
+ description
+ "The SID contained in the Prefix-SID sub-TLV is an absolute
+ value";
+ }
+ enum INDEX {
+ description
+ "The SID contained in the Prefix-SID sub-TLV is an index to the
+ SRGB";
+ }
+ }
+ description
+ "Specifies the type of the value specified within the Prefix SID
+ sub-TLV - in particular, whether the value is an index or an
+ absolute value. This value corresponds with the V-flag of the Prefix
+ SID sub-TLV";
+ }
+
+ leaf sid-scope {
+ type enumeration {
+ enum LOCAL {
+ description
+ "The value of the SID is
+ significant only to the advertising system";
+ }
+ enum GLOBAL {
+ description
+ "The value of the SID is globally significant";
+ }
+ }
+ description
+ "Specifies the scope of the SID advertisement within the Prefix SID
+ sub-TLV. The scope of the SID is independent of whether the SID
+ contained is an index, or an absolute value";
+ }
+
+ leaf multi-topology-identifier {
+ type uint8;
+ description
+ "The identifier for the topology to which the Prefix SID relates. The
+ value of this leaf is a MT-ID as defined in RFC4915";
+ }
+
+ leaf algorithm {
+ type uint8;
+ description
+ "The algorithm that computes the path associated with the Prefix SID";
+ }
+
+ leaf sid-value {
+ type uint32;
+ description
+ "The value of the Prefix SID. The meaning of this value is dependent
+ upon the type of SID, and its scope. The value contained is either a
+ 32-bit value indicating the index of the SID, or a 24-bit label where
+ the 20 right-most bits are used for encoding the label value";
+ }
+ }
+
+ grouping ospfv2-lsdb-extended-prefix-sid-label-binding-state {
+ description
+ "State parameters relating to the extended prefix SID SID/Label binding
+ sub-TLV";
+
+ leaf mirroring {
+ type boolean;
+ default false;
+ description
+ "When set to true, this indicates that the SID/Label Binding sub-TLV
+ entries contained within this TLV are indicative of a mirroring
+ context";
+ }
+
+ leaf multi-topology-identifier {
+ type uint8;
+ description
+ "The identifier for the topology to which the SID/Label Binding
+ sub-TLV is associated. The value of this leaf is a MT-ID as defined
+ in RFC4915";
+ }
+
+ leaf weight {
+ type uint8;
+ description
+ "The weight of the advertised binding when used for load-balancing
+ purposes";
+ }
+ }
+
+ grouping ospfv2-lsdb-extended-prefix-sid-label-binding-tlv-state {
+ description
+ "State parameters directly relating to the SID/Label Binding TLV";
+
+ leaf type {
+ type identityref {
+ base
+ "oc-ospf-types:OSPFV2_EXTENDED_PREFIX_SID_LABEL_BINDING_SUBTLV_TYPE";
+ }
+ description
+ "The type of sub-TLV that is being contained within the SID/Label
+ sub-TLV";
+ }
+ }
+
+ grouping ospfv2-lsdb-extprefix-sid-label-binding-state {
+ description
+ "State parameters relating to the SID/Label binding sub-TLV of the
+ SID/Label/Binding TLV";
+
+ uses ospfv2-lsdb-common-sr-sid-spec;
+ }
+
+ grouping ospfv2-lsdb-extprefix-sid-label-ero-metric-state {
+ description
+ "State parameters relating to the ERO Metric Sub-TLV of the SID/Label
+ Binding TLV";
+
+ leaf metric {
+ type uint32;
+ description
+ "The metric representing the aggregate IGP or TE path cost for the
+ binding included within the SID/Label Binding TLV";
+ }
+ }
+
+ grouping ospfv2-lsdb-extprefix-sid-lbl-ero-path-seg-state {
+ description
+ "State parameters relating to the a segment included within the
+ ERO Path Sub-TLV of the SID/Label Binding TLV";
+
+ leaf type {
+ type identityref {
+ base "oc-ospf-types:OSPFV2_EXTPREFIX_BINDING_ERO_PATH_SEGMENT_TYPE";
+ }
+ description
+ "The type of the segment being specified as part of the ERO";
+ }
+
+ leaf loose {
+ type boolean;
+ default false;
+ description
+ "If this leaf is set the segment is identifier as a loose path
+ segment, otherwise the path strictly follows the path specified";
+ }
+ }
+
+ grouping ospfv2-lsdb-extprefix-sid-lbl-ero-ipv4-state {
+ description
+ "State parameters relating to an IPv4 address segment included within
+ the ERO path";
+
+ leaf address {
+ type inet:ipv4-address-no-zone;
+ description
+ "The IPv4 address of the hop within the ERO";
+ }
+ }
+
+ grouping ospfv2-lsdb-extprefix-sid-lbl-ero-unnum-state {
+ description
+ "State parameters relating to an unnumbered hop within the ERO path";
+
+ leaf router-id {
+ type inet:ipv4-address-no-zone;
+ description
+ "The IPv4 router identtifier of the remote system";
+ }
+
+ leaf interface-id {
+ type uint32;
+ description
+ "The identifier assigned to the link by the remote system";
+ }
+ }
+
+ grouping ospfv2-lsdb-extended-link-adj-sid-state {
+ description
+ "State parameters relating to the Adjacency SID sub-TLV of the
+ Extended Link LSA";
+
+ leaf backup {
+ type boolean;
+ default false;
+ description
+ "When this flag is set, it indicates that the adjacency SID refers to
+ an adjacency which is eligible for protection";
+ }
+
+ leaf group {
+ type boolean;
+ default false;
+ description
+ "When this flag is set it indicates that the adjacency SID refers to
+ a group of adjacencies that have a common value";
+ }
+
+ uses ospfv2-lsdb-common-sr-sid-spec;
+
+ leaf weight {
+ type uint8;
+ description
+ "The weight of the Adjacency SID when used for load-balancing";
+ }
+
+ leaf multi-topology-identifier {
+ type uint8;
+ description
+ "The multi-topology identifier with which the adjacency SID is
+ associated";
+ }
+ }
+
+ grouping ospfv2-lsdb-structure {
+ description
+ "Structural grouping for per-area LSDB contents";
+
+ container lsdb {
+ // Top-level RO, if this were ever to become writeable then
+ // the state containers lower down need config false added
+ config false;
+ description
+ "The link-state database for the OSPFv2 area";
+
+ container state {
+ description
+ "Operational state parameters relating to the OSPFv2
+ area";
+
+ uses ospfv2-lsdb-area-state;
+ }
+
+ container lsa-types {
+ description
+ "Enclosing container for a list of LSA types that are
+ in the LSDB for the specified area";
+
+ list lsa-type {
+ key "type";
+
+ description
+ "List of LSA types in the LSDB for the specified
+ area";
+
+ leaf type {
+ type leafref {
+ path "../state/type";
+ }
+ description
+ "A reference for the LSA type being described within
+ the LSDB";
+ }
+
+ container state {
+ description
+ "Top-level operational state parameters relating to
+ an LSA within the area";
+ uses ospfv2-lsdb-area-lsa-type-state;
+ }
+
+ container lsas {
+ description
+ "Enclosing container for a list of the LSAs of
+ the specified type received by the system";
+
+ list lsa {
+ key "link-state-id";
+
+ description
+ "List of the LSAs of a specified type in the
+ LSDB for the specified area";
+
+ leaf link-state-id {
+ type leafref {
+ path "../state/link-state-id";
+ }
+ description
+ "Reference to the Link State ID of the LSA";
+ }
+
+ container state {
+ description
+ "Operational state parameters relating to all
+ LSA types";
+ uses ospfv2-lsdb-area-lsa-state;
+ }
+
+ uses ospfv2-lsdb-router-lsa-structure {
+ when "../../state/type = 'ROUTER_LSA'" {
+ description
+ "Include the router LSA hierarchy solely when
+ that LSA type is being described";
+ }
+ }
+
+ uses ospfv2-lsdb-network-lsa-structure {
+ when "../../state/type = 'NETWORK_LSA'" {
+ description
+ "Include the network LSA hierarchy solely when
+ that LSA type is being described";
+ }
+ }
+
+ uses ospfv2-lsdb-summary-lsa-structure {
+ // rjs TODO: check this syntax
+ when "../../state/type = " +
+ "'SUMMARY_IP_NETWORK_LSA' or " +
+ "../../state/type = 'SUMMARY_ASBR_LSA'" {
+ description
+ "Include the summary LSA hierarchy solely when
+ that LSA type is being described";
+ }
+ }
+
+ uses ospfv2-lsdb-asexternal-lsa-structure {
+ when "../../state/type = 'AS_EXTERNAL_LSA'" {
+ description
+ "Include the AS external LSA hierarchy solely when
+ that LSA type is being described";
+ }
+ }
+
+ uses ospfv2-lsdb-nssa-external-lsa-structure {
+ when "../../state/type = 'NSSA_AS_EXTERNAL_LSA'" {
+ description
+ "Include the NSSA External LSA hierarchy solely
+ when that LSA type is being described";
+ }
+ }
+
+ uses ospfv2-lsdb-opaque-lsa-structure {
+ when "../../state/type = 'OSPFV2_LINK_SCOPE_OPAQUE_LSA'
+ or ../../state/type = 'OSPFV2_AREA_SCOPE_OPAQUE_LSA'
+ or ../../state/type = 'OSPFV2_AS_SCOPE_OPAQUE_LSA'" {
+ description
+ "Include the Opaque LSA structure when type of entry
+ being described in an opaque LSA";
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-ospfv2.yang b/src/plugins/yang/openconfig/openconfig-ospfv2.yang
new file mode 100644
index 0000000..6ff43c4
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-ospfv2.yang
@@ -0,0 +1,98 @@
+module openconfig-ospfv2 {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/ospfv2";
+
+ prefix "oc-ospfv2";
+
+ // import some basic types
+ //import ietf-inet-types { prefix inet; }
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ // Include submodules
+ // Global: All global context groupings;
+ include openconfig-ospfv2-global;
+ // Area: Config/opstate for an area
+ include openconfig-ospfv2-area;
+ // Area Interface: Config/opstate for an Interface
+ include openconfig-ospfv2-area-interface;
+ // LSDB: Operational state model covering the LSDB
+ include openconfig-ospfv2-lsdb;
+ // Common: Content included in >1 context
+ include openconfig-ospfv2-common;
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "An OpenConfig model for Open Shortest Path First (OSPF)
+ version 2";
+
+ oc-ext:openconfig-version "0.1.2";
+
+ revision "2018-06-05" {
+ description
+ "Bug fixes in when statements in lsdb";
+ reference "0.1.2";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes.";
+ reference "0.1.1";
+ }
+
+ revision "2017-02-28"{
+ description
+ "Initial public release of OSPFv2";
+ reference "0.1.0";
+ }
+
+ revision "2016-06-24" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ grouping ospfv2-top {
+ description
+ "Top-level OSPF configuration and operational state";
+
+ container ospfv2 {
+ description
+ "Top-level configuration and operational state for
+ Open Shortest Path First (OSPF) v2";
+
+ uses ospfv2-global-structural;
+
+ container areas {
+ description
+ "Configuration and operational state relating to an
+ OSPFv2 area.";
+
+ list area {
+ key "identifier";
+
+ description
+ "The OSPFv2 areas within which the local system exists";
+
+ leaf identifier {
+ type leafref {
+ path "../config/identifier";
+ }
+ description
+ "A reference to the identifier for the area.";
+ }
+
+ uses ospfv2-area-structure;
+ }
+ }
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-packet-match-types.yang b/src/plugins/yang/openconfig/openconfig-packet-match-types.yang
new file mode 100644
index 0000000..d23cc61
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-packet-match-types.yang
@@ -0,0 +1,297 @@
+module openconfig-packet-match-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/packet-match-types";
+
+ prefix "oc-pkt-match-types";
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines common types for use in models requiring
+ data definitions related to packet matches.";
+
+ oc-ext:openconfig-version "1.0.1";
+
+ revision "2018-04-15" {
+ description
+ "Corrected description and range for ethertype typedef";
+ reference "1.0.1";
+ }
+
+ revision "2017-05-26" {
+ description
+ "Separated IP matches into AFs";
+ reference "1.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+ revision "2016-04-27" {
+ description
+ "Initial revision";
+ reference "TBD";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+
+ //TODO: should replace this with an official IEEE module
+ // when available. Only a select number of types are
+ // defined in this identity.
+ identity ETHERTYPE {
+ description
+ "Base identity for commonly used Ethertype values used
+ in packet header matches on Ethernet frames. The Ethertype
+ indicates which protocol is encapsulated in the Ethernet
+ payload.";
+ reference
+ "IEEE 802.3";
+ }
+
+ identity ETHERTYPE_IPV4 {
+ base ETHERTYPE;
+ description
+ "IPv4 protocol (0x0800)";
+ }
+
+ identity ETHERTYPE_ARP {
+ base ETHERTYPE;
+ description
+ "Address resolution protocol (0x0806)";
+ }
+
+ identity ETHERTYPE_VLAN {
+ base ETHERTYPE;
+ description
+ "VLAN-tagged frame (as defined by IEEE 802.1q) (0x8100). Note
+ that this value is also used to represent Shortest Path
+ Bridging (IEEE 801.1aq) frames.";
+ }
+
+ identity ETHERTYPE_IPV6 {
+ base ETHERTYPE;
+ description
+ "IPv6 protocol (0x86DD)";
+ }
+
+ identity ETHERTYPE_MPLS {
+ base ETHERTYPE;
+ description
+ "MPLS unicast (0x8847)";
+ }
+
+ identity ETHERTYPE_LLDP {
+ base ETHERTYPE;
+ description
+ "Link Layer Discovery Protocol (0x88CC)";
+ }
+
+ identity ETHERTYPE_ROCE {
+ base ETHERTYPE;
+ description
+ "RDMA over Converged Ethernet (0x8915)";
+ }
+
+
+ //TODO: should replace this with an official IANA module when
+ //available. Only a select set of protocols are defined with
+ //this identity.
+ identity IP_PROTOCOL {
+ description
+ "Base identity for commonly used IP protocols used in
+ packet header matches";
+ reference
+ "IANA Assigned Internet Protocol Numbers";
+ }
+
+ identity IP_TCP {
+ base IP_PROTOCOL;
+ description
+ "Transmission Control Protocol (6)";
+ }
+
+ identity IP_UDP {
+ base IP_PROTOCOL;
+ description
+ "User Datagram Protocol (17)";
+ }
+
+ identity IP_ICMP {
+ base IP_PROTOCOL;
+ description
+ "Internet Control Message Protocol (1)";
+ }
+
+ identity IP_IGMP {
+ base IP_PROTOCOL;
+ description
+ "Internet Group Membership Protocol (2)";
+ }
+
+ identity IP_PIM {
+ base IP_PROTOCOL;
+ description
+ "Protocol Independent Multicast (103)";
+ }
+
+ identity IP_RSVP {
+ base IP_PROTOCOL;
+ description
+ "Resource Reservation Protocol (46)";
+ }
+
+ identity IP_GRE {
+ base IP_PROTOCOL;
+ description
+ "Generic Routing Encapsulation (47)";
+ }
+
+ identity IP_AUTH {
+ base IP_PROTOCOL;
+ description
+ "Authentication header, e.g., for IPSEC (51)";
+ }
+
+ identity IP_L2TP {
+ base IP_PROTOCOL;
+ description
+ "Layer Two Tunneling Protocol v.3 (115)";
+ }
+
+
+
+ identity TCP_FLAGS {
+ description
+ "Common TCP flags used in packet header matches";
+ reference
+ "IETF RFC 793 - Transmission Control Protocol
+ IETF RFC 3168 - The Addition of Explicit Congestion
+ Notification (ECN) to IP";
+ }
+
+ identity TCP_SYN {
+ base TCP_FLAGS;
+ description
+ "TCP SYN flag";
+ }
+
+ identity TCP_FIN {
+ base TCP_FLAGS;
+ description
+ "TCP FIN flag";
+ }
+
+ identity TCP_RST {
+ base TCP_FLAGS;
+ description
+ "TCP RST flag";
+ }
+
+ identity TCP_PSH {
+ base TCP_FLAGS;
+ description
+ "TCP push flag";
+ }
+
+ identity TCP_ACK {
+ base TCP_FLAGS;
+ description
+ "TCP ACK flag";
+ }
+
+ identity TCP_URG {
+ base TCP_FLAGS;
+ description
+ "TCP urgent flag";
+ }
+
+ identity TCP_ECE {
+ base TCP_FLAGS;
+ description
+ "TCP ECN-Echo flag. If the SYN flag is set, indicates that
+ the TCP peer is ECN-capable, otherwise indicates that a
+ packet with Congestion Experienced flag in the IP header
+ is set";
+ }
+
+ identity TCP_CWR {
+ base TCP_FLAGS;
+ description
+ "TCP Congestion Window Reduced flag";
+ }
+
+ // typedef statements
+
+ typedef port-num-range {
+ type union {
+ type string {
+ pattern '^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?' +
+ '[0-9]?)\.\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?' +
+ '[0-9]?[0-9]?)$';
+ }
+ type oc-inet:port-number;
+ type enumeration {
+ enum ANY {
+ description
+ "Indicates any valid port number (e.g., wildcard)";
+ }
+ }
+ }
+ description
+ "Port numbers may be represented as a single value,
+ an inclusive range as <lower>..<higher>, or as ANY to
+ indicate a wildcard.";
+ }
+
+ typedef ip-protocol-type {
+ type union {
+ type uint8 {
+ range 0..254;
+ }
+ type identityref {
+ base IP_PROTOCOL;
+ }
+ }
+ description
+ "The IP protocol number may be expressed as a valid protocol
+ number (integer) or using a protocol type defined by the
+ IP_PROTOCOL identity";
+ }
+
+ typedef ethertype-type {
+ type union {
+ type uint16 {
+ range 1536..65535;
+ }
+ type identityref {
+ base ETHERTYPE;
+ }
+ }
+ description
+ "The Ethertype value may be expressed as a 16-bit number in
+ decimal notation, or using a type defined by the
+ ETHERTYPE identity";
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-packet-match.yang b/src/plugins/yang/openconfig/openconfig-packet-match.yang
new file mode 100644
index 0000000..7dcf037
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-packet-match.yang
@@ -0,0 +1,360 @@
+module openconfig-packet-match {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/header-fields";
+
+ prefix "oc-pkt-match";
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-yang-types { prefix oc-yang; }
+ import openconfig-packet-match-types { prefix oc-pkt-match-types; }
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines data related to packet header fields
+ used in matching operations, for example in ACLs. When a
+ field is omitted from a match expression, the effect is a
+ wildcard ('any') for that field.";
+
+ oc-ext:openconfig-version "1.1.0";
+
+ revision "2017-12-15" {
+ description
+ "Add MPLS packet field matches";
+ reference "1.1.0";
+ }
+
+ revision "2017-05-26" {
+ description
+ "Separated IP matches into AFs";
+ reference "1.0.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+ revision "2016-04-27" {
+ description
+ "Initial revision";
+ reference "TBD";
+ }
+
+
+ // Physical Layer fields
+ // ethernet-header
+ grouping ethernet-header-config {
+ description
+ "Configuration data of fields in Ethernet header.";
+
+ leaf source-mac {
+ type oc-yang:mac-address;
+ description
+ "Source IEEE 802 MAC address.";
+ }
+
+ leaf source-mac-mask {
+ type oc-yang:mac-address;
+ description
+ "Source IEEE 802 MAC address mask.";
+ }
+
+ leaf destination-mac {
+ type oc-yang:mac-address;
+ description
+ "Destination IEEE 802 MAC address.";
+ }
+
+ leaf destination-mac-mask {
+ type oc-yang:mac-address;
+ description
+ "Destination IEEE 802 MAC address mask.";
+ }
+
+ leaf ethertype {
+ type oc-pkt-match-types:ethertype-type;
+ description
+ "Ethertype field to match in Ethernet packets";
+ }
+ }
+
+ grouping ethernet-header-state {
+ description
+ "State information of fields in Ethernet header.";
+ }
+
+ grouping ethernet-header-top {
+ description
+ "Top level container for fields in Ethernet header.";
+
+ container l2 {
+ description
+ "Ethernet header fields";
+
+ container config {
+ description
+ "Configuration data";
+ uses ethernet-header-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State Information.";
+ uses ethernet-header-config;
+ uses ethernet-header-state;
+ }
+ }
+ }
+
+ grouping mpls-header-top {
+ description
+ "Top-level container for fields in an MPLS header.";
+
+ container mpls {
+ description
+ "MPLS header fields";
+
+ container config {
+ description
+ "Configuration parameters relating to fields within
+ the MPLS header.";
+ uses mpls-header-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to fields
+ within the MPLS header";
+ uses mpls-header-config;
+ }
+ }
+ }
+
+ grouping mpls-header-config {
+ description
+ "Configuration parameters relating to matches within
+ MPLS header fields.";
+
+ leaf traffic-class {
+ type uint8 {
+ range "0..7";
+ }
+ description
+ "The value of the MPLS traffic class (TC) bits,
+ formerly known as the EXP bits.";
+ }
+ }
+
+ grouping ip-protocol-fields-common-config {
+ description
+ "IP protocol fields common to IPv4 and IPv6";
+
+ leaf dscp {
+ type oc-inet:dscp;
+ description
+ "Value of diffserv codepoint.";
+ }
+
+ leaf protocol {
+ type oc-pkt-match-types:ip-protocol-type;
+ description
+ "The protocol carried in the IP packet, expressed either
+ as its IP protocol number, or by a defined identity.";
+ }
+
+ leaf hop-limit {
+ type uint8 {
+ range 0..255;
+ }
+ description
+ "The IP packet's hop limit -- known as TTL (in hops) in
+ IPv4 packets, and hop limit in IPv6";
+ }
+ }
+
+ // IP Layer
+ // ip-protocol-fields
+ grouping ipv4-protocol-fields-config {
+ description
+ "Configuration data of IP protocol fields
+ for IPv4";
+
+ leaf source-address {
+ type oc-inet:ipv4-prefix;
+ description
+ "Source IPv4 address prefix.";
+ }
+
+ leaf destination-address {
+ type oc-inet:ipv4-prefix;
+ description
+ "Destination IPv4 address prefix.";
+ }
+
+ uses ip-protocol-fields-common-config;
+
+ }
+
+ grouping ipv4-protocol-fields-state {
+ description
+ "State information of IP header fields for IPv4";
+ }
+
+ grouping ipv4-protocol-fields-top {
+ description
+ "IP header fields for IPv4";
+
+ container ipv4 {
+ description
+ "Top level container for IPv4 match field data";
+
+ container config {
+ description
+ "Configuration data for IPv4 match fields";
+ uses ipv4-protocol-fields-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information for IPv4 match fields";
+ uses ipv4-protocol-fields-config;
+ uses ipv4-protocol-fields-state;
+ }
+ }
+ }
+
+ grouping ipv6-protocol-fields-config {
+ description
+ "Configuration data for IPv6 match fields";
+
+ leaf source-address {
+ type oc-inet:ipv6-prefix;
+ description
+ "Source IPv6 address prefix.";
+ }
+
+ leaf source-flow-label {
+ type oc-inet:ipv6-flow-label;
+ description
+ "Source IPv6 Flow label.";
+ }
+
+ leaf destination-address {
+ type oc-inet:ipv6-prefix;
+ description
+ "Destination IPv6 address prefix.";
+ }
+
+ leaf destination-flow-label {
+ type oc-inet:ipv6-flow-label;
+ description
+ "Destination IPv6 Flow label.";
+ }
+
+ uses ip-protocol-fields-common-config;
+ }
+
+ grouping ipv6-protocol-fields-state {
+ description
+ "Operational state data for IPv6 match fields";
+ }
+
+ grouping ipv6-protocol-fields-top {
+ description
+ "Top-level grouping for IPv6 match fields";
+
+ container ipv6 {
+ description
+ "Top-level container for IPv6 match field data";
+
+ container config {
+ description
+ "Configuration data for IPv6 match fields";
+
+ uses ipv6-protocol-fields-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for IPv6 match fields";
+
+ uses ipv6-protocol-fields-config;
+ uses ipv6-protocol-fields-state;
+ }
+ }
+ }
+
+ // Transport fields
+ grouping transport-fields-config {
+ description
+ "Configuration data of transport-layer packet fields";
+
+ leaf source-port {
+ type oc-pkt-match-types:port-num-range;
+ description
+ "Source port or range";
+ }
+
+ leaf destination-port {
+ type oc-pkt-match-types:port-num-range;
+ description
+ "Destination port or range";
+ }
+
+ leaf-list tcp-flags {
+ type identityref {
+ base oc-pkt-match-types:TCP_FLAGS;
+ }
+ description
+ "List of TCP flags to match";
+ }
+ }
+
+ grouping transport-fields-state {
+ description
+ "State data of transport-fields";
+ }
+
+ grouping transport-fields-top {
+ description
+ "Destination transport-fields top level grouping";
+
+ container transport {
+ description
+ "Transport fields container";
+
+ container config {
+ description
+ "Configuration data";
+ uses transport-fields-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State data";
+ uses transport-fields-config;
+ uses transport-fields-state;
+ }
+ }
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-pf-forwarding-policies.yang b/src/plugins/yang/openconfig/openconfig-pf-forwarding-policies.yang
new file mode 100644
index 0000000..6b08c87
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-pf-forwarding-policies.yang
@@ -0,0 +1,385 @@
+submodule openconfig-pf-forwarding-policies {
+ belongs-to openconfig-policy-forwarding {
+ prefix "oc-pf";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-packet-match { prefix "oc-pmatch"; }
+ import openconfig-yang-types { prefix "oc-yang"; }
+ import openconfig-inet-types { prefix "oc-inet"; }
+
+ include openconfig-pf-path-groups;
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule contains configuration and operational state
+ relating to the definition of policy-forwarding policies.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2017-06-21" {
+ description
+ "Amend policy forwarding model based on ACL changes.";
+ reference "0.2.0";
+ }
+
+ revision "2017-02-28" {
+ description
+ "Initial public release of policy forwarding.";
+ reference "0.1.0";
+ }
+
+ revision "2016-11-08" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ grouping pf-forwarding-policy-structural {
+ description
+ "Structural grouping defining forwarding policies under the
+ policy- forwarding module.";
+
+ container policies {
+ description
+ "Forwarding policies defined to enact policy-based forwarding
+ on the local system.";
+
+ list policy {
+ key "policy-id";
+
+ description
+ "A forwarding policy is defined to have a set of match
+ criteria, allowing particular fields of a packet's header to
+ be matched, and a set of forwarding actions which determines
+ how the local system should forward the packet.";
+
+ leaf policy-id {
+ type leafref {
+ path "../config/policy-id";
+ }
+ description
+ "Reference to the identifier for the forwarding-policy.";
+ }
+
+ container config {
+ description
+ "Configuration options relating to the forwarding
+ policy.";
+ uses pf-forwarding-policy-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the forwarding
+ policy.";
+ uses pf-forwarding-policy-config;
+ }
+
+ container rules {
+ description
+ "The criteria that should be matched for a packet to be
+ forwarded according to the policy action.";
+
+ list rule {
+ key "sequence-id";
+
+ description
+ "A match rule for the policy. In the case that multiple
+ criteria are specified within a single rule, all criteria
+ must be met for the rule to be applied to a packet.";
+
+ leaf sequence-id {
+ type leafref {
+ path "../config/sequence-id";
+ }
+ description
+ "A unique sequence identifier for the match rule.";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the match
+ rule.";
+ uses pf-forwarding-policy-rule-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the match
+ rule.";
+ uses pf-forwarding-policy-rule-config;
+ uses pf-forwarding-policy-rule-state;
+ }
+
+ uses oc-pmatch:ethernet-header-top;
+ uses oc-pmatch:ipv4-protocol-fields-top;
+ uses oc-pmatch:ipv6-protocol-fields-top;
+ uses oc-pmatch:transport-fields-top;
+
+ container action {
+ description
+ "The forwarding policy action to be applied for
+ packets matching the rule.";
+
+ container config {
+ description
+ "Configuration parameters relating to the forwarding
+ rule's action.";
+ uses pf-forwarding-policy-action-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the
+ forwarding rule's action.";
+ uses pf-forwarding-policy-action-config;
+ }
+
+ uses pf-forwarding-policy-action-encapsulate-gre;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ grouping pf-forwarding-policy-config {
+ description
+ "Configuration parameters relating to the forwarding policy.";
+
+ leaf policy-id {
+ type string;
+ description
+ "A unique name identifying the forwarding policy. This name is
+ used when applying the policy to a particular interface.";
+ }
+ }
+
+ grouping pf-forwarding-policy-rule-config {
+ description
+ "Configuration parameters relating to a policy rule.";
+
+ leaf sequence-id {
+ type uint32;
+ description
+ "Unique sequence number for the policy rule.";
+ }
+ }
+
+ grouping pf-forwarding-policy-rule-state {
+ description
+ "Operational state parameters relating to a policy rule.";
+
+ leaf matched-pkts {
+ type oc-yang:counter64;
+ description
+ "Number of packets matched by the rule.";
+ }
+
+ leaf matched-octets {
+ type oc-yang:counter64;
+ description
+ "Bytes matched by the rule.";
+ }
+ }
+
+ grouping pf-forwarding-policy-action-config {
+ description
+ "Forwarding policy action configuration parameters.";
+
+ leaf discard {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to true, the local system should drop
+ packets that match the rule.";
+ }
+
+ leaf decapsulate-gre {
+ type boolean;
+ default false;
+ description
+ "When this leaf is set to true, the local system should remove
+ the GRE header from the packet matching the rule. Following
+ the decapsulation it should subsequently forward the
+ encapsulated packet according to the relevant lookup (e.g., if
+ the encapsulated packet is IP, the packet should be routed
+ according to the IP destination).";
+ }
+
+ leaf network-instance {
+ type leafref {
+
+ // We are at:
+ // $NIROOT/policy-forwarding/policies/
+ // policy/rules/rule/action/config/
+ // network-instance
+ path "../../../../../../../../config/name";
+ }
+ description
+ "When this leaf is set, packets matching the match criteria
+ for the forwarding rule should be looked up in the
+ network-instance that is referenced rather than the
+ network-instance with which the interface is associated.
+ Such configuration allows policy-routing into multiple
+ sub-topologies from a single ingress access interface, or
+ different send and receive contexts for a particular
+ interface (sometimes referred to as half-duplex VRF).";
+ }
+
+ leaf path-selection-group {
+ type leafref {
+ // We are at:
+ // $NIROOT/policy-forwarding/policies/
+ // policy/rules/rule/action/config/to-path-group
+ path "../../../../../../../path-selection-groups/" +
+ "path-selection-group/config/group-id";
+ }
+ description
+ "When path-selection-group is set, packets matching the
+ match criteria for the forwarding rule should be forwarded
+ only via one of the paths that is specified within the
+ referenced path-selection-group. The next-hop of the packet
+ within the routing context should be used to determine between
+ multiple paths that are specified within the group.";
+ }
+
+ leaf next-hop {
+ type oc-inet:ip-address;
+ description
+ "When an IP next-hop is specified in the next-hop field,
+ packets matching the match criteria for the forwarding rule
+ should be forwarded to the next-hop IP address, bypassing any
+ lookup on the local system.";
+ }
+ }
+
+ grouping pf-forwarding-policy-action-encapsulate-gre {
+ description
+ "Structural grouping covering the encapsulate-gre action of the
+ policy forwarding rule.";
+
+ container encapsulate-gre {
+ description
+ "Packets matching the policy rule should be GRE encapsulated
+ towards the set of targets defined within the target list. Where
+ more than one target is specified, or the target subnet expands
+ to more than one endpoint, packets should be load-balanced across
+ the destination addresses within the subnets.";
+
+ container config {
+ description
+ "Configuration parameters for the GRE encapsulation rules action.";
+ uses pf-forwarding-policy-action-gre-config;
+ }
+
+ container state {
+ description
+ "Operational state parameters for the GRE encapsulation rule
+ action.";
+ config false;
+ uses pf-forwarding-policy-action-gre-config;
+ }
+
+ container targets {
+ description
+ "Surrounding container for the list of GRE tunnel targets that
+ should be encapsulated towards.";
+
+ list target {
+ key "id";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "Reference to the unique identifier for the target.";
+ }
+
+ description
+ "Each target specified within this list should be treated as a
+ endpoint to which packets should be GRE encapsulated. Where the
+ set of destinations described within a single entry expands to
+ more than one destination IP address, packets should be load
+ shared across the destination using the local system's ECMP hashing
+ mechanisms.";
+
+ container config {
+ description
+ "Configuration parameters for the GRE target.";
+ uses pf-forwarding-policy-action-gre-target-config;
+ }
+
+ container state {
+ description
+ "Operational state parameters for the GRE target.";
+ config false;
+ uses pf-forwarding-policy-action-gre-target-config;
+ }
+ }
+ }
+ }
+ }
+
+ grouping pf-forwarding-policy-action-gre-config {
+ description
+ "Configuration parameters for the encapsulate-gre forwarding
+ policy action.";
+
+ leaf identifying-prefix {
+ type oc-inet:ip-prefix;
+ description
+ "An IP prefix that can be used to identify the group of
+ GRE endpoints that are being encapsulated towards. Systems
+ that require an IP identifier for the tunnel set
+ should use this prefix as the next-hop identifier.";
+ }
+ }
+
+ grouping pf-forwarding-policy-action-gre-target-config {
+ description
+ "Configuration parameters for each target of a GRE Encapsulation
+ rule";
+
+ leaf id {
+ type string;
+ description
+ "A unique identifier for the target.";
+ }
+
+ leaf source {
+ type oc-inet:ip-address;
+ description
+ "The source IP address that should be used when encapsulating
+ packets from the local system.";
+ }
+
+ leaf destination {
+ type oc-inet:ip-prefix;
+ description
+ "The set of destination addresses that should be encapsulated towards.
+ Where a subnet is specified, each address within the subnet should be
+ treated as an independent destination for encapsulated traffic. Packets
+ should be distributed with ECMP across the set of tunnel destination
+ addresses.";
+ }
+
+ leaf ip-ttl {
+ type uint8;
+ description
+ "The TTL that should be specified in the IP header of the GRE packet
+ encapsulating the packet matching the rule.";
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-pf-interfaces.yang b/src/plugins/yang/openconfig/openconfig-pf-interfaces.yang
new file mode 100644
index 0000000..41ba545
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-pf-interfaces.yang
@@ -0,0 +1,121 @@
+submodule openconfig-pf-interfaces {
+ belongs-to openconfig-policy-forwarding {
+ prefix "oc-pf";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-interfaces { prefix "oc-if"; }
+
+ include openconfig-pf-forwarding-policies;
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule contains groupings related to the association
+ between interfaces and policy forwarding rules.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2017-06-21" {
+ description
+ "Amend policy forwarding model based on ACL changes.";
+ reference "0.2.0";
+ }
+
+ revision "2017-02-28" {
+ description
+ "Initial public release of policy forwarding.";
+ reference "0.1.0";
+ }
+
+ revision "2016-11-08" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+
+ grouping pf-interfaces-structural {
+ description
+ "Structural grouping for interface to forwarding policy bindings
+ within the policy-forwarding model.";
+
+ container interfaces {
+ description
+ "Configuration and operational state relating policy
+ forwarding on interfaces.";
+
+ list interface {
+ key "interface-id";
+
+ description
+ "Configuration and operationals state relating to the
+ relationship between interfaces and policy-based forwarding
+ rules.";
+
+ leaf interface-id {
+ type leafref {
+ path "../config/interface-id";
+ }
+ description
+ "A reference to the unique identifier for the interface
+ being referenced by the policy.";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to an interface to
+ policy forwarding rule binding.";
+
+ uses pf-interface-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to an interface to
+ policy forwarding rule binding.";
+
+ uses pf-interface-config;
+ }
+
+ uses oc-if:interface-ref;
+ }
+ }
+ }
+
+ grouping pf-interface-config {
+ description
+ "Configuration parameters relating to an interface to policy
+ forwarding rule binding.";
+
+ leaf interface-id {
+ type oc-if:interface-id;
+ description
+ "A unique identifier for the interface.";
+ }
+
+ leaf apply-forwarding-policy {
+ type leafref {
+ // We are at /network-instances/network-instance/
+ // policy-forwarding/interfaces/interface/config/
+ // apply-forwarding-policy
+ path "../../../../policies/policy/" +
+ "config/policy-id";
+ }
+ description
+ "The policy to be applied on the interface. Packets ingress on
+ the referenced interface should be compared to the match
+ criteria within the specified policy, and in the case that
+ these criteria are met, the forwarding actions specified
+ applied. These policies should be applied following quality of
+ service classification, and ACL actions if such entities are
+ referenced by the corresponding interface.";
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-pf-path-groups.yang b/src/plugins/yang/openconfig/openconfig-pf-path-groups.yang
new file mode 100644
index 0000000..aa96595
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-pf-path-groups.yang
@@ -0,0 +1,125 @@
+submodule openconfig-pf-path-groups {
+ belongs-to openconfig-policy-forwarding {
+ prefix "oc-pf";
+ }
+
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule contains configuration and operational state
+ relating to path-selection-groups which are used to group
+ forwarding entities together to be used as policy forwarding
+ targets.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2017-06-21" {
+ description
+ "Amend policy forwarding model based on ACL changes.";
+ reference "0.2.0";
+ }
+
+ revision "2017-02-28" {
+ description
+ "Initial public release of policy forwarding.";
+ reference "0.1.0";
+ }
+
+ revision "2016-11-08" {
+ description
+ "Initial revision";
+ reference "0.0.1";
+ }
+
+ grouping pf-path-groups-structural {
+ description
+ "Structural grouping containing the definition of path groups
+ within the context of policy-based forwarding.";
+
+ container path-selection-groups {
+ description
+ "Surrounding container for the path selection groups defined
+ within the policy forwarding model.";
+
+ list path-selection-group {
+ key "group-id";
+
+ leaf group-id {
+ type leafref {
+ path "../config/group-id";
+ }
+ description
+ "Reference to a unique identifier for the path selection
+ group";
+
+ }
+
+ description
+ "A path selection group is a set of forwarding resources,
+ which are grouped as eligible paths for a particular
+ policy-based forwarding rule. A policy rule may select a
+ path-selection-group as the egress for a particular type of
+ traffic (e.g., DSCP value). The system then utilises its
+ standard forwarding lookup mechanism to select from the
+ paths that are specified within the group - for IP packets,
+ the destination IP address is used such that the packet is
+ routed to the entity within the path-selection-group that
+ corresponds to the next-hop for the destination IP address
+ of the packet; for L2 packets, the selection is based on the
+ destination MAC address. If multiple paths within the
+ selection group are eligible to be used for forwarding,
+ the packets are load-balanced between them according to
+ the system's usual load balancing logic.";
+
+ container config {
+ description
+ "Configuration parameters relating to the path selection
+ group.";
+ uses pf-path-selection-group-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the path
+ selection group.";
+ uses pf-path-selection-group-config;
+ }
+ }
+ }
+ }
+
+ grouping pf-path-selection-group-config {
+ description
+ "Configuration parameters relating to a path selection group.";
+
+ leaf group-id {
+ type string;
+ description
+ "A unique name for the path-selection-group";
+ }
+
+ leaf-list mpls-lsp {
+ type leafref {
+ // We are at /network-instances/network-instance/
+ // policy-forwarding/path-selection-groups/
+ // path-selection-group/config/mpls-lsp
+ path "../../../../../mpls/lsps/constrained-path/tunnels/" +
+ "tunnel/config/name";
+ }
+ description
+ "A set of MPLS constrained-path LSPs which should be
+ considered for the policy forwarding next-hop. In order to
+ select between the LSPs within the path-selection-group, the
+ system should determine which LSP provides the best path to
+ the next-hop for the routed packet.";
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-pf-srte.yang b/src/plugins/yang/openconfig/openconfig-pf-srte.yang
new file mode 100644
index 0000000..07e6cc5
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-pf-srte.yang
@@ -0,0 +1,280 @@
+module openconfig-pf-srte {
+ yang-version "1";
+ namespace "http://openconfig.net/yang/policy-forwarding/sr-te";
+ prefix "oc-pf-srte";
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-network-instance { prefix "oc-ni"; }
+ import openconfig-mpls-types { prefix "oc-mplst"; }
+ import openconfig-inet-types { prefix "oc-inet"; }
+ import openconfig-segment-routing { prefix "oc-sr"; }
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig Working group
+ www.openconfig.net";
+
+ description
+ "This module defines extensions to the OpenConfig policy forwarding
+ module to support static segment routing traffic engineering policy
+ definitions. Extensions are provided to match:
+
+ - Ingress binding SIDs, such that traffic can be mapped based on
+ an ingress label.
+ - A colour community and endpoint combination, such that the
+ routes can be resolved according to the policy forwarding
+ entries that are to be installed.
+
+ In addition, policy forwarding actions associated with next-hops are
+ added to the model. The next-hop set to be forwarded to is augmented
+ to cover a set of lists of segments. The most common application of
+ such segment lists is to express stacks of MPLS labels which are used
+ as SR segments. In addition, they may be used to expressed segments
+ in the form of IPv6 addresses.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision 2017-10-01 {
+ description
+ "Initial revision of the SR-TE policy SAFI model.";
+ reference "0.1.0";
+ }
+
+ grouping oc-pf-srte-match-top {
+ description
+ "Top-level grouping used for SR-TE policy match criteria within
+ a policy forwarding rule.";
+
+ container srte {
+ description
+ "Match criteria associated with Segment Routing Traffic Engineering
+ policies.";
+
+ container config {
+ description
+ "Configuration parameters associated with SR-TE policies.";
+ uses oc-pf-srte-match-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters associated with SR-TE policies.";
+ uses oc-pf-srte-match-config;
+ }
+ }
+ }
+
+ grouping oc-pf-srte-match-config {
+ description
+ "Configuration parameters specific to Segment Routing traffic
+ Engineering.";
+
+ leaf mpls-bsid {
+ type oc-mplst:mpls-label;
+ description
+ "The Binding SID (BSID) to be matched expressed as an MPLS label. Packets
+ that are ingress to the system with the top-most label matching
+ the SID value specified in this leaf should be forwarded according
+ to the policy. The top-most label (the specified Binding SID)
+ must be popped from the label stack by the system.";
+ }
+
+ leaf srte-endpoint {
+ type oc-inet:ip-address;
+ description
+ "When the policy forwarding rule is used for RIB resolution
+ to a Segment Routing Traffic Engineering path, the policy is used
+ when the required endpoint (which may be the protocol next-hop)
+ matches the endpoint address specified in this
+ leaf. When the leaf is set to all zeros (0.0.0.0 or ::), the endpoint
+ acts as a wildcard in the policy resolution.";
+ }
+
+ leaf srte-color {
+ type uint32;
+ description
+ "When the policy forwarding rule is used for RIB resolution to a
+ specific Segment Routing Traffic Engineering path, the policy is
+ used when the colour required in the policy (which may be specified
+ based on the value of a BGP extended colour community) matches the
+ value of this leaf. The colour being set to 0 indicates that the
+ colour is a wildcard in the policy resolution.";
+ }
+
+ leaf srte-preference {
+ type uint32;
+ description
+ "When there are multiple policy forwarding rules specified for
+ a particular SR-TE endpoint. The preference is used to resolve
+ between them. These rules may be learnt from a dynamic routing
+ protocol, or interface to the device, or from other static
+ entries configured on the system.";
+ }
+ }
+
+ grouping oc-pf-srte-segment-list-top {
+ description
+ "Top-level grouping for specifying segment lists under a policy
+ forwarding action.";
+
+ container segment-lists {
+ description
+ "A list of SR-TE segment lists that should be applied as an
+ action within this policy. Where a system selects the SR-TE
+ policy to be used, the list of segment lists that is specified
+ should be used as forwarding next-hops.";
+
+ list segment-list {
+ key "index";
+ description
+ "An individual segment list within the list of segment
+ lists used for SR-TE policies.";
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+ description
+ "Reference to the index leaf which act as a key to the
+ segment-list list.";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the SR-TE segment list.";
+ uses oc-pf-srte-segment-list-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the SR-TE
+ segment list.";
+ uses oc-pf-srte-segment-list-config;
+ }
+
+ container sids {
+ description
+ "Surrounding container for the list of SIDs that makes up the
+ segment list.";
+
+ list sid {
+ key "index";
+
+ description
+ "List of SIDs that make up the segment list. The segment list
+ is formed by ordering the set of SIDs that are specified by
+ their index in ascending numerical order.";
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+ description
+ "Reference to the SID's index within the segment list which
+ acts as the key of the list.";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the SID within the
+ segment list.";
+ uses oc-pf-srte-segment-list-sid-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the SID within
+ the segment list.";
+ uses oc-pf-srte-segment-list-sid-config;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ grouping oc-pf-srte-segment-list-config {
+ description
+ "Configuration parameters relating to a segment list.";
+
+ leaf index {
+ type uint64;
+ description
+ "Unique integer identifying the segment list within the set
+ of segment lists used for the SR-TE policy action.";
+ }
+
+ leaf weight {
+ type uint32;
+ description
+ "The weight of the segment list within the set of segment lists
+ specified for the policy. The traffic that is forwarded according
+ to the policy is distributed across the set of paths such that
+ each list receives weight/(sum of all weights) traffic.";
+ }
+ }
+
+ grouping oc-pf-srte-segment-list-sid-config {
+ description
+ "Configuration parameters relating to a SID within an SR-TE segment
+ list";
+
+ leaf index {
+ type uint64;
+ description
+ "The index of the SID within the segment list. The segment list is
+ applied by ordering the SID entries in ascending numerical order
+ beginning at 0.";
+ }
+
+ leaf value {
+ type oc-sr:sr-sid-type;
+ description
+ "The value of the SID that is to be used. Specified as an MPLS
+ label or IPv6 address.";
+ }
+
+ leaf mpls-ttl {
+ type uint8;
+ default 0;
+ description
+ "The TTL to be set if the type of the SID is an MPLS label. If the
+ value of the TTL is set to be 0, the value is picked by the local
+ implementation.";
+ }
+
+ leaf mpls-tc {
+ type uint8 {
+ range "0..7";
+ }
+ default 0;
+ description
+ "The value of the MPLS Traffic Class (TC) bits to be used if the
+ value of the SID is an MPLS label. In the case that the value is
+ set to 0, then the local implementation should choose the value.";
+ }
+ }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/oc-ni:policy-forwarding/" +
+ "oc-ni:policies/oc-ni:policy/oc-ni:rules/oc-ni:rule" {
+ description
+ "Add the SR-TE specific policy forwarding match criteria to the
+ policy forwarding model.";
+
+ uses oc-pf-srte-match-top;
+ }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/oc-ni:policy-forwarding/" +
+ "oc-ni:policies/oc-ni:policy/oc-ni:rules/oc-ni:rule/oc-ni:action" {
+ description
+ "Add the SR-TE specific policy forwarding actions to the
+ policy forwarding model.";
+
+ uses oc-pf-srte-segment-list-top;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-pim-types.yang b/src/plugins/yang/openconfig/openconfig-pim-types.yang
new file mode 100644
index 0000000..86cf78c
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-pim-types.yang
@@ -0,0 +1,74 @@
+module openconfig-pim-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/pim/types";
+
+ prefix "oc-pim-types";
+
+ // import some basic types
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines types related to the PIM protocol model.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-02-19" {
+ description
+ "Initial revision.";
+ reference "0.1.0";
+ }
+
+ // identity statements
+
+ identity PIM_MODE {
+ description
+ "Base identity for the operating modes of Protocol-Independent
+ Multicast.";
+ }
+
+ identity PIM_MODE_SPARSE {
+ base PIM_MODE;
+ description
+ "PIM sparse mode (PIM-SM).";
+ reference "RFC7761";
+ }
+
+ identity PIM_MODE_DENSE {
+ base PIM_MODE;
+ description
+ "PIM dense mode (PIM-DM).";
+ reference "RFC3973";
+ }
+
+ // typedef statements
+
+ typedef dr-priority-type {
+ type uint32;
+ description
+ "The port's designated router priority. Larger always preferred.
+ DR Priority is a 32-bit unsigned number, ranges 0-4294967295.";
+ reference "RFC7761 4.3.1 page 33";
+ }
+
+ typedef pim-interval-type {
+ type uint8 {
+ range 1..255;
+ }
+ units "seconds";
+ description
+ "Interval at which the router sends the PIM message toward the
+ upstream RPF neighbor.";
+ reference "RFC7761 4.5 page 44, 4.3.1 page 29";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-pim.yang b/src/plugins/yang/openconfig/openconfig-pim.yang
new file mode 100644
index 0000000..7389f9c
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-pim.yang
@@ -0,0 +1,464 @@
+module openconfig-pim {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/pim";
+
+ prefix "oc-pim";
+
+ // import some basic types/interfaces
+ import openconfig-pim-types { prefix oc-pim-types; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-acl { prefix oc-acl; }
+ import openconfig-types { prefix "oc-types"; }
+ import openconfig-extensions { prefix "oc-ext"; }
+ import ietf-inet-types { prefix "inet"; }
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "An OpenConfig model for Protocol Independent Multicast (PIM).";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-02-09" {
+ description
+ "Initial revision.";
+ reference "0.1.0";
+ }
+
+ grouping admin-config {
+ description
+ "Re-usable grouping to enable or disable a particular feature.";
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "When set to true, the functionality within which this
+ leaf is defined is enabled, when set to false it is
+ explicitly disabled.";
+ }
+ }
+
+ grouping pim-counters-state {
+ description
+ "Counters related to PIM messages.";
+
+ leaf hello-messages {
+ type uint32;
+ description
+ "Number of hello messages received.";
+ reference "RFC7761 4.9.2 page 108";
+ }
+
+ leaf join-prune-messages {
+ type uint32;
+ description
+ "Number of join/prune messages received.";
+ reference "RFC7761 4.5 page 44";
+ }
+
+ leaf bootstrap-messages {
+ type uint32;
+ description
+ "Number of bootstrap router messages received.";
+ reference "RFC7761 3.7 page 12";
+ }
+ }
+
+ grouping pim-interface-config {
+ description
+ "Configuration data for PIM on each interface.";
+
+ uses admin-config;
+
+ leaf interface-id {
+ type oc-if:interface-id;
+ description
+ "Reference to an interface on which PIM is enabled.";
+ }
+
+ leaf mode {
+ type identityref {
+ base oc-pim-types:PIM_MODE;
+ }
+ description
+ "PIM mode to use when delivering multicast traffic via this
+ interface.";
+ }
+
+ leaf bsr-border {
+ type boolean;
+ default false;
+ description
+ "When set to true the device will not send bootstrap router
+ messages over this interface. By default these are transmitted
+ over all PIM sparse mode (PIM-SM) enabled interfaces.";
+ }
+
+ leaf border-router {
+ type boolean;
+ default false;
+ description
+ "When set to true the interface is set as MBR (multicast border
+ router) and allows multicast traffic from sources that are
+ outside of the PIM domain.";
+ }
+
+
+ leaf dr-priority {
+ type oc-pim-types:dr-priority-type;
+ description
+ "The designated router priority of this interface. Larger always
+ preferred.";
+ }
+
+ leaf join-prune-interval {
+ type oc-pim-types:pim-interval-type;
+ description
+ "Interval at which the router sends the PIM join/prune messages
+ toward the upstream RPF neighbor.";
+ }
+
+ leaf hello-interval {
+ type oc-pim-types:pim-interval-type;
+ description
+ "Interval at which the router sends the PIM hello messages.";
+ }
+
+ leaf dead-timer {
+ type uint16 {
+ range 1..65535;
+ }
+ description
+ "Number of missed hello messages after which a neighbor is
+ expired.";
+ }
+ }
+
+ grouping pim-neighbor-state {
+ description
+ "PIM neighbor state.";
+
+ leaf neighbor-address {
+ type inet:ipv4-address;
+ description
+ "IPv4 address of neighbor router.";
+ }
+
+ leaf dr-address {
+ type inet:ipv4-address;
+ description
+ "IPv4 address of designated router.";
+ }
+
+ leaf neighbor-established {
+ type oc-types:timeticks64;
+ description
+ "This timestamp indicates the time that the
+ PIM neighbor adjacency established. The value is the
+ timestamp in seconds relative to the Unix Epoch
+ (Jan 1, 1970 00:00:00 UTC).
+
+ The PIM session uptime can be computed by clients
+ as the difference between this value and the
+ current time in UTC.";
+ }
+
+ leaf neighbor-expires {
+ type oc-types:timeticks64;
+ description
+ "This timestamp indicates the time that the
+ PIM neighbor adjacency will expire should hello
+ messages fail to arrive from the neighbor.
+ The value is the timestamp in seconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+
+ leaf mode {
+ type identityref {
+ base oc-pim-types:PIM_MODE;
+ }
+ description
+ "PIM mode in use when delivering multicast traffic
+ via this neighbor.";
+ }
+ }
+
+ grouping pim-neighbors-top {
+ description
+ "Details about PIM neighbors.";
+
+ container neighbors {
+ config false;
+ description
+ "Details about PIM neighbors.";
+
+ list neighbor {
+ key "neighbor-address";
+ description
+ "Details about a specific PIM neighbor.";
+
+ leaf neighbor-address {
+ type leafref {
+ path "../state/neighbor-address";
+ }
+ description
+ "IPv4 address of neighbor router.";
+ }
+
+ container state {
+ config false;
+ description
+ "Details about a specific PIM neighbor.";
+
+ uses pim-neighbor-state;
+ }
+ }
+ }
+ }
+
+ grouping pim-interfaces-top {
+ description
+ "Configuration and state data for PIM on each interface.";
+
+ container interfaces {
+ description
+ "Configuration and state data for PIM on each interface.";
+
+ list interface {
+ key "interface-id";
+ description
+ "This container defines interface PIM configuration and
+ state information.";
+
+ leaf interface-id {
+ type leafref {
+ path "../config/interface-id";
+ }
+ description
+ "Reference to an interface on which PIM is enabled.";
+ }
+
+ container config {
+ description
+ "PIM interface configuration.";
+
+ uses pim-interface-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information for PIM interfaces.";
+
+ uses pim-interface-config;
+ container counters {
+ description
+ "PIM counters for each interface.";
+
+ uses pim-counters-state;
+ }
+ }
+
+ uses pim-neighbors-top;
+ uses oc-if:interface-ref;
+ }
+ }
+ }
+
+ grouping pim-global-state {
+ description
+ "State and session data for PIM on each interface.";
+
+ leaf neighbor-count {
+ type uint8;
+ description
+ "Number of adjacent PIM neighbors.";
+ }
+
+ container counters {
+ description
+ "Global PIM counters.";
+
+ uses pim-counters-state;
+ }
+ }
+
+ grouping pim-sources-joined-top {
+ description
+ "List of multicast sources joined.";
+
+ container sources-joined {
+ config false;
+ description
+ "List of multicast sources joined.";
+
+ list source {
+ key "address";
+ description
+ "A multicast source that has been joined.";
+
+ leaf address {
+ type leafref {
+ path "../state/address";
+ }
+ description
+ "Source address of multicast.";
+ }
+
+ container state {
+ config false;
+ description
+ "State for a multicast source that has been joined.";
+
+ leaf address {
+ type inet:ipv4-address;
+ description
+ "Source address of multicast.";
+ }
+
+ leaf group {
+ type inet:ipv4-address;
+ description
+ "Multicast address.";
+ }
+
+ leaf upstream-interface-id {
+ type oc-if:interface-id;
+ description
+ "The upstream interface for this multicast source.";
+ }
+ }
+ }
+ }
+ }
+
+ grouping pim-global-ssm-config {
+ description
+ "Source specific multicast (SSM) configuration.";
+
+ leaf ssm-ranges {
+ type leafref {
+ path "/oc-acl:acl/oc-acl:acl-sets/oc-acl:acl-set/" +
+ "oc-acl:config/oc-acl:name";
+ }
+ description
+ "List of accepted source specific multicast (SSM) address
+ ranges.";
+ }
+ }
+
+ grouping pim-global-rp-addresses-config {
+ description
+ "Defines rendezvous points for sparse mode multicast.";
+
+ leaf address {
+ type inet:ipv4-address;
+ description
+ "IPv4 address of rendezvous point.";
+ }
+
+ leaf multicast-groups {
+ type string;
+ // TODO should this be an ACL or prefix-list reference or prefix list?
+ // Cisco it's an ACL, Juniper it's an inline prefix list
+ description
+ "List of multicast groups (multicast IP address ranges) for which
+ this entry will be used as a rendezvous point. When not
+ present the default is equivalent to all valid IP multicast
+ addresses.";
+ }
+ }
+
+ grouping pim-global-top {
+ description
+ "Top level grouping for global PIM configuration.";
+
+ container ssm {
+ description
+ "Source specific multicast (SSM).";
+
+ container config {
+ description
+ "Configuration for source specific multicast (SSM).";
+ uses pim-global-ssm-config;
+ }
+ container state {
+ config false;
+ description
+ "State for source specific multicast (SSM).";
+ uses pim-global-ssm-config;
+ }
+ }
+
+ container rendezvous-points {
+ description
+ "Defines rendezvous points for sparse mode multicast.";
+
+ list rendezvous-point {
+ key "address";
+ description
+ "Defines a rendezvous point (RP) for sparse mode multicast.";
+
+ leaf address {
+ type leafref {
+ path "../config/address";
+ }
+ description
+ "IPv4 address of rendezvous point.";
+ }
+
+ container config {
+ description
+ "Rendezvous point configuration.";
+ uses pim-global-rp-addresses-config;
+ }
+ container state {
+ config false;
+ description
+ "Rendezvous point state.";
+ uses pim-global-rp-addresses-config;
+ }
+ }
+ }
+
+ container state {
+ config false;
+ description
+ "Global PIM state.";
+ uses pim-global-state;
+ }
+
+ uses pim-sources-joined-top;
+ }
+
+ grouping pim-top {
+ description
+ "Top-level grouping for PIM.";
+
+ container pim {
+ description
+ "Top-level PIM configuration and operational state.";
+
+ container global {
+ description
+ "This container defines global PIM configuration and state
+ information.";
+ uses pim-global-top;
+ }
+
+ uses pim-interfaces-top;
+ }
+ }
+
+ // data definition statements
+}
diff --git a/src/plugins/yang/openconfig/openconfig-platform-cpu.yang b/src/plugins/yang/openconfig/openconfig-platform-cpu.yang
new file mode 100644
index 0000000..5ea25f1
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-platform-cpu.yang
@@ -0,0 +1,61 @@
+module openconfig-platform-cpu {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/platform/cpu";
+
+ prefix "oc-cpu";
+
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines data related to FAN components in the
+ OpenConfig platform model.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-01-30" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ grouping component-cpu-utilization {
+ description
+ "Per-component CPU statistics";
+
+ container utilization {
+ description
+ "Statistics representing CPU utilization of the
+ component.";
+
+ container state {
+ config false;
+ description
+ "Operational state variables relating to the utilization
+ of the CPU.";
+
+ uses oc-types:avg-min-max-instant-stats-pct;
+ }
+ }
+ }
+
+ augment "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:cpu" {
+ description
+ "Adding CPU utilization data to component model";
+
+ uses component-cpu-utilization;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-platform-ext.yang b/src/plugins/yang/openconfig/openconfig-platform-ext.yang
new file mode 100644
index 0000000..f47293e
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-platform-ext.yang
@@ -0,0 +1,72 @@
+module openconfig-platform-ext {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/platform/extension";
+
+ prefix "oc-platform-ext";
+
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines optional extensions to the OpenConfig
+ platform model.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-01-18" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+
+ grouping platform-component-ext-state {
+ description
+ "Operational state data for platform components";
+
+ leaf entity-id {
+ type uint32;
+ description
+ "A unique numeric identifier assigned by the system to the
+ component. This identifier may be used to represent the
+ corresponding SNMP Entity MIB identifier.";
+ }
+ }
+
+
+ // data definition statements
+
+ // augment statements
+
+ augment "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:state" {
+ description
+ "Adding extension state data to components";
+
+ uses platform-component-ext-state;
+ }
+
+ // rpc statements
+
+ // notification statements
+
+}
+
diff --git a/src/plugins/yang/openconfig/openconfig-platform-fan.yang b/src/plugins/yang/openconfig/openconfig-platform-fan.yang
new file mode 100644
index 0000000..92b5dbe
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-platform-fan.yang
@@ -0,0 +1,65 @@
+module openconfig-platform-fan {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/platform/fan";
+
+ prefix "oc-fan";
+
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines data related to FAN components in the
+ OpenConfig platform model.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2018-01-18" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping fan-state {
+ description
+ "Operational state data for fan components";
+
+ leaf speed {
+ type uint32;
+ units rpm;
+ description
+ "Current (instantaneous) fan speed";
+ }
+ }
+
+
+ // data definition statements
+
+ // augment statements
+
+ augment "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:fan/oc-platform:state" {
+ description
+ "Adding fan data to component model";
+
+ uses fan-state;
+ }
+
+}
+
diff --git a/src/plugins/yang/openconfig/openconfig-platform-linecard.yang b/src/plugins/yang/openconfig/openconfig-platform-linecard.yang
new file mode 100644
index 0000000..46d9c7f
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-platform-linecard.yang
@@ -0,0 +1,118 @@
+module openconfig-platform-linecard {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/platform/linecard";
+
+ prefix "oc-linecard";
+
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-platform-types { prefix oc-platform-types; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines data related to LINECARD components in
+ the openconfig-platform model";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2017-08-03" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping linecard-config {
+ description
+ "Configuration data for linecard components";
+
+ leaf power-admin-state {
+ type oc-platform-types:component-power-type;
+ default POWER_ENABLED;
+ description
+ "Enable or disable power to the linecard";
+ }
+ }
+
+ grouping linecard-state {
+ description
+ "Operational state data for linecard components";
+
+ leaf slot-id {
+ type string;
+ description
+ "Identifier for the slot or chassis position in which the
+ linecard is installed";
+ }
+ }
+
+ grouping linecard-top {
+ description
+ "Top-level grouping for linecard data";
+
+ container linecard {
+ description
+ "Top-level container for linecard data";
+
+ container config {
+ description
+ "Configuration data for linecards";
+
+ uses linecard-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for linecards";
+
+ uses linecard-config;
+ uses linecard-state;
+ }
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ augment "/oc-platform:components/oc-platform:component" {
+ description
+ "Adding linecard data to physical inventory";
+
+ uses linecard-top {
+ when "current()/oc-platform:state/" +
+ "oc-platform:type = 'LINECARD'" {
+ description
+ "Augment is active when component is of type LINECARD";
+ }
+ }
+ }
+
+ // rpc statements
+
+ // notification statements
+
+}
+
diff --git a/src/plugins/yang/openconfig/openconfig-platform-port.yang b/src/plugins/yang/openconfig/openconfig-platform-port.yang
new file mode 100644
index 0000000..2039a8e
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-platform-port.yang
@@ -0,0 +1,149 @@
+module openconfig-platform-port {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/platform/port";
+
+ prefix "oc-port";
+
+ // import some basic types
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-if-ethernet { prefix oc-eth; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines data related to PORT components in the openconfig-platform model";
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2018-01-20" {
+ description
+ "Added augmentation for interface-to-port reference";
+ reference "0.3.0";
+ }
+
+ revision "2017-11-17" {
+ description
+ "Corrected augmentation path for port data";
+ reference "0.2.0";
+ }
+
+ revision "2016-10-24" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping port-breakout-config {
+ description
+ "Configuration data for the port breakout mode";
+
+ leaf num-channels {
+ type uint8;
+ description
+ "Sets the number of channels to 'breakout' on a port
+ capable of channelization";
+ }
+
+ leaf channel-speed {
+ type identityref {
+ base oc-eth:ETHERNET_SPEED;
+ }
+ description
+ "Sets the channel speed on each channel -- the
+ supported values are defined by the
+ ETHERNET_SPEED identity";
+ }
+ }
+
+ grouping port-breakout-state {
+ description
+ "Operational state data for the port breakout mode ";
+ }
+
+ grouping port-breakout-top {
+ description
+ "Top-level grouping for port breakout data";
+
+ container breakout-mode {
+ description
+ "Top-level container for port breakout data";
+
+ container config {
+ description
+ "Configuration data for port breakout";
+
+ uses port-breakout-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for port breakout";
+
+ uses port-breakout-config;
+ uses port-breakout-state;
+ }
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ augment "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:port" {
+ description
+ "Adding port breakout data to physical platform data";
+
+ uses port-breakout-top {
+ when "./state/type = 'PORT'" {
+ description
+ "This data is valid only for PORT components";
+ }
+ }
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+ description
+ "Adds a reference from the base interface to the corresponding
+ port component in the device inventory.";
+
+ leaf hardware-port {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ description
+ "For non-channelized interfaces, references the hardware port
+ corresponding to the base interface.";
+ }
+ }
+
+ // rpc statements
+
+ // notification statements
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-platform-psu.yang b/src/plugins/yang/openconfig/openconfig-platform-psu.yang
new file mode 100644
index 0000000..eec4caa
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-platform-psu.yang
@@ -0,0 +1,135 @@
+module openconfig-platform-psu {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/platform/psu";
+
+ prefix "oc-platform-psu";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-platform { prefix oc-platform; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines a schema for power supply components in
+ the OpenConfig platform model.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2018-01-16" {
+ description
+ "Changed admin state leaf name";
+ reference "0.2.0";
+ }
+
+ revision "2017-12-21" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping psu-config {
+ description
+ "Configuration data for power supply components";
+
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Adminsitrative control on the on/off state of the power
+ supply unit.";
+ }
+ }
+
+ grouping psu-state {
+ description
+ "Operational state data for power supply components";
+
+
+ // TODO(aashaikh): May need to convert some of these to
+ // interval statistics once decided on which leaves to include.
+ leaf capacity {
+ type oc-types:ieeefloat32;
+ units watts;
+ description
+ "Maximum power capacity of the power supply.";
+ }
+
+ leaf input-current {
+ type oc-types:ieeefloat32;
+ units amps;
+ description
+ "The input current draw of the power supply.";
+ }
+
+ leaf input-voltage {
+ type oc-types:ieeefloat32;
+ units volts;
+ description
+ "Input voltage to the power supply.";
+ }
+
+ leaf output-current {
+ type oc-types:ieeefloat32;
+ units amps;
+ description
+ "The output current supplied by the power supply.";
+ }
+
+ leaf output-voltage {
+ type oc-types:ieeefloat32;
+ units volts;
+ description
+ "Output voltage supplied by the power supply.";
+ }
+
+ leaf output-power {
+ type oc-types:ieeefloat32;
+ units watts;
+ description
+ "Output power supplied by the power supply.";
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ augment "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:power-supply/oc-platform:config" {
+ description
+ "Adds power supply data to component operational state.";
+
+ uses psu-config;
+ }
+
+ augment "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:power-supply/oc-platform:state" {
+ description
+ "Adds power supply data to component operational state.";
+
+ uses psu-config;
+ uses psu-state;
+ }
+
+
+ // rpc statements
+
+ // notification statements
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-platform-transceiver.yang b/src/plugins/yang/openconfig/openconfig-platform-transceiver.yang
new file mode 100644
index 0000000..66b9071
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-platform-transceiver.yang
@@ -0,0 +1,492 @@
+module openconfig-platform-transceiver {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/platform/transceiver";
+
+ prefix "oc-transceiver";
+
+ // import some basic types
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-platform-port { prefix oc-port; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-transport-types { prefix oc-opt-types; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-yang-types { prefix oc-yang; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and operational state data
+ for transceivers (i.e., pluggable optics). The module should be
+ used in conjunction with the platform model where other
+ physical entity data are represented.
+
+ In the platform model, a component of type=TRANSCEIVER is
+ expected to be a subcomponent of a PORT component. This
+ module defines a concrete schema for the associated data for
+ components with type=TRANSCEIVER.";
+
+ oc-ext:openconfig-version "0.5.0";
+
+ revision "2018-05-15" {
+ description
+ "Remove internal-temp state leaf, since we prefer
+ the generic /components/component/state/temperature
+ container for temperature information.";
+ reference "0.5.0";
+ }
+
+ revision "2018-01-22" {
+ description
+ "Fixed physical-channel path reference";
+ reference "0.4.1";
+ }
+
+ revision "2017-09-18" {
+ description
+ "Use openconfig-yang-types module";
+ reference "0.4.0";
+ }
+
+ revision "2017-07-08" {
+ description
+ "Adds clarification on aggregate power measurement data";
+ reference "0.3.0";
+ }
+
+ revision "2016-12-22" {
+ description
+ "Adds preconfiguration data and clarified units";
+ reference "0.2.0";
+ }
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping optical-power-state {
+ description
+ "Reusable leaves related to optical power state -- these
+ are read-only state values. If avg/min/max statistics are
+ not supported, the target is expected to just supply the
+ instant value";
+
+ container output-power {
+ description
+ "The output optical power of a physical channel in units
+ of 0.01dBm, which may be associated with individual
+ physical channels, or an aggregate of multiple physical
+ channels (i.e., for the overall transceiver). For an
+ aggregate, this may be a measurement from a photodetector
+ or a a calculation performed on the device by summing up
+ all of the related individual physical channels.
+ Values include the instantaneous, average, minimum, and
+ maximum statistics. If avg/min/max statistics are not
+ supported, the target is expected to just supply the
+ instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container input-power {
+ description
+ "The input optical power of a physical channel in units
+ of 0.01dBm, which may be associated with individual
+ physical channels, or an aggregate of multiple physical
+ channels (i.e., for the overall transceiver). For an
+ aggregate, this may be a measurement from a photodetector
+ or a a calculation performed on the device by summing up
+ all of the related individual physical channels.
+ Values include the instantaneous, average, minimum, and
+ maximum statistics. If avg/min/max statistics are not
+ supported, the target is expected to just supply the
+ instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container laser-bias-current {
+ description
+ "The current applied by the system to the transmit laser to
+ achieve the output power. The current is expressed in mA
+ with up to two decimal precision. Values include the
+ instantaneous, average, minimum, and maximum statistics.
+ If avg/min/max statistics are not supported, the target is
+ expected to just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-mA;
+ }
+ }
+
+ grouping output-optical-frequency {
+ description
+ "Reusable leaves related to optical output power -- this is
+ typically configurable on line side and read-only on the
+ client-side";
+
+ leaf output-frequency {
+ type oc-opt-types:frequency-type;
+ description
+ "The frequency in MHz of the individual physical channel
+ (e.g. ITU C50 - 195.0THz and would be reported as
+ 195,000,000 MHz in this model). This attribute is not
+ configurable on most client ports.";
+ }
+ }
+
+
+ grouping physical-channel-config {
+ description
+ "Configuration data for physical client channels";
+
+ leaf index {
+ type uint16 {
+ range 0..max;
+ }
+ description
+ "Index of the physical channnel or lane within a physical
+ client port";
+ }
+
+ leaf description {
+ type string;
+ description
+ "Text description for the client physical channel";
+ }
+
+ leaf tx-laser {
+ type boolean;
+ description
+ "Enable (true) or disable (false) the transmit label for the
+ channel";
+ }
+
+ leaf target-output-power {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dBm;
+ description
+ "Target output optical power level of the optical channel,
+ expressed in increments of 0.01 dBm (decibel-milliwats)";
+ }
+ }
+
+ grouping physical-channel-state {
+ description
+ "Operational state data for client channels.";
+
+ uses output-optical-frequency;
+ uses optical-power-state;
+ }
+
+ grouping physical-channel-top {
+ description
+ "Top-level grouping for physical client channels";
+
+ container physical-channels {
+ description
+ "Enclosing container for client channels";
+
+ list channel {
+ key "index";
+ description
+ "List of client channels, keyed by index within a physical
+ client port. A physical port with a single channel would
+ have a single zero-indexed element";
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+ description
+ "Reference to the index number of the channel";
+ }
+
+ container config {
+ description
+ "Configuration data for physical channels";
+
+ uses physical-channel-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for channels";
+
+ uses physical-channel-config;
+ uses physical-channel-state;
+ }
+ }
+ }
+ }
+
+
+ grouping port-transceiver-config {
+ description
+ "Configuration data for client port transceivers";
+
+ leaf enabled {
+ type boolean;
+ description
+ "Turns power on / off to the transceiver -- provides a means
+ to power on/off the transceiver (in the case of SFP, SFP+,
+ QSFP,...) or enable high-power mode (in the case of CFP,
+ CFP2, CFP4) and is optionally supported (device can choose to
+ always enable). True = power on / high power, False =
+ powered off";
+ }
+
+ leaf form-factor-preconf {
+ type identityref {
+ base oc-opt-types:TRANSCEIVER_FORM_FACTOR_TYPE;
+ }
+ description
+ "Indicates the type of optical transceiver used on this
+ port. If the client port is built into the device and not
+ pluggable, then non-pluggable is the corresponding state. If
+ a device port supports multiple form factors (e.g. QSFP28
+ and QSFP+, then the value of the transceiver installed shall
+ be reported. If no transceiver is present, then the value of
+ the highest rate form factor shall be reported
+ (QSFP28, for example).
+
+ The form factor is included in configuration data to allow
+ pre-configuring a device with the expected type of
+ transceiver ahead of deployment. The corresponding state
+ leaf should reflect the actual transceiver type plugged into
+ the system.";
+ }
+
+ leaf ethernet-pmd-preconf {
+ type identityref {
+ base oc-opt-types:ETHERNET_PMD_TYPE;
+ }
+ description
+ "The Ethernet PMD is a property of the optical transceiver
+ used on the port, indicating the type of physical connection.
+ It is included in configuration data to allow pre-configuring
+ a port/transceiver with the expected PMD. The actual PMD is
+ indicated by the ethernet-pmd state leaf.";
+ }
+ }
+
+ grouping port-transceiver-state {
+ description
+ "Operational state data for client port transceivers";
+
+ leaf present {
+ type enumeration {
+ enum PRESENT {
+ description
+ "Transceiver is present on the port";
+ }
+ enum NOT_PRESENT {
+ description
+ "Transceiver is not present on the port";
+ }
+ }
+ description
+ "Indicates whether a transceiver is present in
+ the specified client port.";
+ }
+
+ leaf form-factor {
+ type identityref {
+ base oc-opt-types:TRANSCEIVER_FORM_FACTOR_TYPE;
+ }
+ description
+ "Indicates the type of optical transceiver used on this
+ port. If the client port is built into the device and not
+ pluggable, then non-pluggable is the corresponding state. If
+ a device port supports multiple form factors (e.g. QSFP28
+ and QSFP+, then the value of the transceiver installed shall
+ be reported. If no transceiver is present, then the value of
+ the highest rate form factor shall be reported
+ (QSFP28, for example).";
+ }
+
+ leaf connector-type {
+ type identityref {
+ base oc-opt-types:FIBER_CONNECTOR_TYPE;
+ }
+ description
+ "Connector type used on this port";
+ }
+
+ leaf vendor {
+ type string {
+ length 1..16;
+ }
+ description
+ "Full name of transceiver vendor. 16-octet field that
+ contains ASCII characters, left-aligned and padded on the
+ right with ASCII spaces (20h)";
+ }
+
+ leaf vendor-part {
+ type string {
+ length 1..16;
+ }
+ description
+ "Transceiver vendor's part number. 16-octet field that
+ contains ASCII characters, left-aligned and padded on the
+ right with ASCII spaces (20h). If part number is undefined,
+ all 16 octets = 0h";
+ }
+
+ leaf vendor-rev {
+ type string {
+ length 1..2;
+ }
+ description
+ "Transceiver vendor's revision number. 2-octet field that
+ contains ASCII characters, left-aligned and padded on the
+ right with ASCII spaces (20h)";
+ }
+
+ //TODO: these compliance code leaves should be active based on
+ //the type of port
+ leaf ethernet-pmd {
+ type identityref {
+ base oc-opt-types:ETHERNET_PMD_TYPE;
+ }
+ description
+ "Ethernet PMD (physical medium dependent sublayer) that the
+ transceiver supports. The SFF/QSFP MSAs have registers for
+ this and CFP MSA has similar.";
+ }
+
+ leaf sonet-sdh-compliance-code {
+ type identityref {
+ base oc-opt-types:SONET_APPLICATION_CODE;
+ }
+ description
+ "SONET/SDH application code supported by the port";
+ }
+
+ leaf otn-compliance-code {
+ type identityref {
+ base oc-opt-types:OTN_APPLICATION_CODE;
+ }
+ description
+ "OTN application code supported by the port";
+ }
+
+ leaf serial-no {
+ type string {
+ length 1..16;
+ }
+ description
+ "Transceiver serial number. 16-octet field that contains
+ ASCII characters, left-aligned and padded on the right with
+ ASCII spaces (20h). If part serial number is undefined, all
+ 16 octets = 0h";
+ }
+
+ leaf date-code {
+ type oc-yang:date-and-time;
+ description
+ "Representation of the transceiver date code, typically
+ stored as YYMMDD. The time portion of the value is
+ undefined and not intended to be read.";
+ }
+
+ leaf fault-condition {
+ type boolean;
+ description
+ "Indicates if a fault condition exists in the transceiver";
+ }
+
+ uses optical-power-state;
+
+ }
+
+ grouping port-transceiver-top {
+ description
+ "Top-level grouping for client port transceiver data";
+
+ container transceiver {
+ description
+ "Top-level container for client port transceiver data";
+
+ container config {
+ description
+ "Configuration data for client port transceivers";
+
+ uses port-transceiver-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for client port transceivers";
+
+ uses port-transceiver-config;
+ uses port-transceiver-state;
+ }
+ // physical channels are associated with a transceiver
+ // component
+ uses physical-channel-top;
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ augment "/oc-platform:components/oc-platform:component" {
+ description
+ "Adding transceiver data to physical inventory";
+
+ uses port-transceiver-top {
+ when "current()/oc-platform:state/" +
+ "oc-platform:type = 'TRANSCEIVER'" {
+ description
+ "Augment is active when component is of type TRANSCEIVER";
+ }
+ }
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+ //TODO: add 'when' or other condition to make sure this
+ //leafref points to a component of type TRANSCEIVER.
+ description
+ "Adds a reference from the base interface to its corresponding
+ physical channels.";
+
+ leaf-list physical-channel {
+ type leafref {
+ path "/oc-platform:components/" +
+ "oc-platform:component[oc-platform:name=current()/../oc-port:hardware-port]/" +
+ "oc-transceiver:transceiver/" +
+ "oc-transceiver:physical-channels/oc-transceiver:channel/" +
+ "oc-transceiver:index";
+ }
+ description
+ "For a channelized interface, list of references to the
+ physical channels (lanes) corresponding to the interface.";
+ }
+ }
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-platform-types.yang b/src/plugins/yang/openconfig/openconfig-platform-types.yang
new file mode 100644
index 0000000..a997439
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-platform-types.yang
@@ -0,0 +1,271 @@
+module openconfig-platform-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/platform-types";
+
+ prefix "oc-platform-types";
+
+ import openconfig-types { prefix oc-types; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines data types (e.g., YANG identities)
+ to support the OpenConfig component inventory model.";
+
+ oc-ext:openconfig-version "0.9.0";
+
+ revision "2018-05-05" {
+ description
+ "Added min-max-time to
+ avg-min-max-instant-stats-precision1-celsius,
+ added new CONTROLLER_CARD identity";
+ reference "0.9.0";
+ }
+
+ revision "2018-01-16" {
+ description
+ "Added new per-component common data; add temp alarm";
+ reference "0.8.0";
+ }
+
+ revision "2017-12-14" {
+ description
+ "Added anchor containers for component data, added new
+ component types";
+ reference "0.7.0";
+ }
+
+ revision "2017-08-16" {
+ description
+ "Added power state enumerated type";
+ reference "0.6.0";
+ }
+
+ revision "2016-12-22" {
+ description
+ "Added temperature state variable to component";
+ reference "0.5.0";
+ }
+
+ // grouping statements
+
+
+ grouping avg-min-max-instant-stats-precision1-celsius {
+ description
+ "Common grouping for recording temperature values in
+ Celsius with 1 decimal precision. Values include the
+ instantaneous, average, minimum, and maximum statistics";
+
+ leaf instant {
+ type decimal64 {
+ fraction-digits 1;
+ }
+ units celsius;
+ description
+ "The instantaneous value of the statistic.";
+ }
+
+ leaf avg {
+ type decimal64 {
+ fraction-digits 1;
+ }
+ units celsius;
+ description
+ "The arithmetic mean value of the statistic over the
+ sampling period.";
+ }
+
+ leaf min {
+ type decimal64 {
+ fraction-digits 1;
+ }
+ units celsius;
+ description
+ "The minimum value of the statistic over the sampling
+ period";
+ }
+
+ leaf max {
+ type decimal64 {
+ fraction-digits 1;
+ }
+ units celsius;
+ description
+ "The maximum value of the statistic over the sampling
+ period";
+ }
+
+ uses oc-types:stat-interval-state;
+ uses oc-types:min-max-time;
+ }
+
+ // identity statements
+
+ identity OPENCONFIG_HARDWARE_COMPONENT {
+ description
+ "Base identity for hardware related components in a managed
+ device. Derived identities are partially based on contents
+ of the IANA Entity MIB.";
+ reference
+ "IANA Entity MIB and RFC 6933";
+ }
+
+
+ identity OPENCONFIG_SOFTWARE_COMPONENT {
+ description
+ "Base identity for software-related components in a managed
+ device";
+ }
+
+ // hardware types
+
+ identity CHASSIS {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Chassis component, typically with multiple slots / shelves";
+ }
+
+ identity BACKPLANE {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Backplane component for aggregating traffic, typically
+ contained in a chassis component";
+ }
+
+ identity FABRIC {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Interconnect between ingress and egress ports on the
+ device (e.g., a crossbar switch).";
+ }
+
+ identity POWER_SUPPLY {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Component that is supplying power to the device";
+ }
+
+ identity FAN {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Cooling fan, or could be some other heat-reduction component";
+ }
+
+ identity SENSOR {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Physical sensor, e.g., a temperature sensor in a chassis";
+ }
+
+ identity FRU {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Replaceable hardware component that does not have a more
+ specific defined schema.";
+ }
+
+ identity LINECARD {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Linecard component, typically inserted into a chassis slot";
+ }
+
+ identity CONTROLLER_CARD {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "A type of linecard whose primary role is management or control
+ rather than data forwarding.";
+ }
+
+ identity PORT {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Physical port, e.g., for attaching pluggables and networking
+ cables";
+ }
+
+ identity TRANSCEIVER {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Pluggable module present in a port";
+ }
+
+ identity CPU {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Processing unit, e.g., a management processor";
+ }
+
+ identity STORAGE {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "A storage subsystem on the device (disk, SSD, etc.)";
+ }
+
+ identity INTEGRATED_CIRCUIT {
+ base OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "A special purpose processing unit, typically for traffic
+ switching/forwarding (e.g., switching ASIC, NPU, forwarding
+ chip, etc.)";
+ }
+
+ identity OPERATING_SYSTEM {
+ base OPENCONFIG_SOFTWARE_COMPONENT;
+ description
+ "Operating system running on a component";
+ }
+
+
+ identity COMPONENT_OPER_STATUS {
+ description
+ "Current operational status of a platform component";
+ }
+
+ identity ACTIVE {
+ base COMPONENT_OPER_STATUS;
+ description
+ "Component is enabled and active (i.e., up)";
+ }
+
+ identity INACTIVE {
+ base COMPONENT_OPER_STATUS;
+ description
+ "Component is enabled but inactive (i.e., down)";
+ }
+
+ identity DISABLED {
+ base COMPONENT_OPER_STATUS;
+ description
+ "Component is administratively disabled.";
+ }
+
+ // typedef statements
+
+ typedef component-power-type {
+ type enumeration {
+ enum POWER_ENABLED {
+ description
+ "Enable power on the component";
+ }
+ enum POWER_DISABLED {
+ description
+ "Disable power on the component";
+ }
+ }
+ description
+ "A generic type reflecting whether a hardware component
+ is powered on or off";
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-platform.yang b/src/plugins/yang/openconfig/openconfig-platform.yang
new file mode 100644
index 0000000..399cf24
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-platform.yang
@@ -0,0 +1,762 @@
+module openconfig-platform {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/platform";
+
+ prefix "oc-platform";
+
+ import openconfig-platform-types { prefix oc-platform-types; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-alarm-types { prefix oc-alarm-types; }
+ import openconfig-yang-types { prefix oc-yang; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines a data model for representing a system
+ component inventory, which can include hardware or software
+ elements arranged in an arbitrary structure. The primary
+ relationship supported by the model is containment, e.g.,
+ components containing subcomponents.
+
+ It is expected that this model reflects every field replacable
+ unit on the device at a minimum (i.e., additional information
+ may be supplied about non-replacable components).
+
+ Every element in the inventory is termed a 'component' with each
+ component expected to have a unique name and type, and optionally
+ a unique system-assigned identifier and FRU number. The
+ uniqueness is guaranteed by the system within the device.
+
+ Components may have properties defined by the system that are
+ modeled as a list of key-value pairs. These may or may not be
+ user-configurable. The model provides a flag for the system
+ to optionally indicate which properties are user configurable.
+
+ Each component also has a list of 'subcomponents' which are
+ references to other components. Appearance in a list of
+ subcomponents indicates a containment relationship as described
+ above. For example, a linecard component may have a list of
+ references to port components that reside on the linecard.
+
+ This schema is generic to allow devices to express their own
+ platform-specific structure. It may be augmented by additional
+ component type-specific schemas that provide a common structure
+ for well-known component types. In these cases, the system is
+ expected to populate the common component schema, and may
+ optionally also represent the component and its properties in the
+ generic structure.
+
+ The properties for each component may include dynamic values,
+ e.g., in the 'state' part of the schema. For example, a CPU
+ component may report its utilization, temperature, or other
+ physical properties. The intent is to capture all platform-
+ specific physical data in one location, including inventory
+ (presence or absence of a component) and state (physical
+ attributes or status).";
+
+ oc-ext:openconfig-version "0.12.0";
+
+ revision "2018-06-29" {
+ description
+ "Added location description for components";
+ reference "0.12.0";
+ }
+
+ revision "2018-06-03" {
+ description
+ "Added parent reference, empty flag and preconfiguration
+ for components";
+ reference "0.11.0";
+ }
+
+ revision "2018-04-20" {
+ description
+ "Added new per-component state data: mfg-date and removable";
+ reference "0.10.0";
+ }
+
+ revision "2018-01-30" {
+ description
+ "Amended approach for modelling CPU - rather than having
+ a local CPU utilisation state variable, a component with
+ a CPU should create a subcomponent of type CPU to report
+ statistics.";
+ reference "0.9.0";
+ }
+
+ revision "2018-01-16" {
+ description
+ "Added new per-component common data; add temp alarm;
+ moved hardware-port reference to port model";
+ reference "0.8.0";
+ }
+
+ revision "2017-12-14" {
+ description
+ "Added anchor containers for component data, added new
+ component types";
+ reference "0.7.0";
+ }
+
+ revision "2017-08-16" {
+ description
+ "Added power state enumerated type";
+ reference "0.6.0";
+ }
+
+ revision "2016-12-22" {
+ description
+ "Added temperature state variable to component";
+ reference "0.5.0";
+ }
+
+ // grouping statements
+
+
+ grouping platform-component-properties-config {
+ description
+ "System-defined configuration data for component properties";
+
+ leaf name {
+ type string;
+ description
+ "System-supplied name of the property -- this is typically
+ non-configurable";
+ }
+
+ leaf value {
+ type union {
+ type string;
+ type boolean;
+ type int64;
+ type uint64;
+ type decimal64 {
+ fraction-digits 2;
+ }
+ }
+ description
+ "Property values can take on a variety of types. Signed and
+ unsigned integer types may be provided in smaller sizes,
+ e.g., int8, uint16, etc.";
+ }
+ }
+
+ grouping platform-component-properties-state {
+ description
+ "Operational state data for component properties";
+
+ leaf configurable {
+ type boolean;
+ description
+ "Indication whether the property is user-configurable";
+ }
+ }
+
+ grouping platform-component-properties-top {
+ description
+ "Top-level grouping ";
+
+ container properties {
+ description
+ "Enclosing container ";
+
+ list property {
+ key "name";
+ description
+ "List of system properties for the component";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the property name.";
+ }
+
+ container config {
+ description
+ "Configuration data for each property";
+
+ uses platform-component-properties-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for each property";
+
+ uses platform-component-properties-config;
+ uses platform-component-properties-state;
+ }
+ }
+ }
+ }
+
+ grouping platform-subcomponent-ref-config {
+ description
+ "Configuration data for subcomponent references";
+
+ leaf name {
+ type leafref {
+ path "../../../../../component/config/name";
+ }
+ description
+ "Reference to the name of the subcomponent";
+ }
+ }
+
+ grouping platform-subcomponent-ref-state {
+ description
+ "Operational state data for subcomponent references";
+
+ }
+
+ grouping platform-subcomponent-ref-top {
+ description
+ "Top-level grouping for list of subcomponent references";
+
+ container subcomponents {
+ description
+ "Enclosing container for subcomponent references";
+
+ list subcomponent {
+ key "name";
+ description
+ "List of subcomponent references";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the name list key";
+ }
+
+ container config {
+ description
+ "Configuration data for the subcomponent";
+
+ uses platform-subcomponent-ref-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the subcomponent";
+
+ uses platform-subcomponent-ref-config;
+ uses platform-subcomponent-ref-state;
+ }
+ }
+ }
+ }
+
+ grouping platform-component-config {
+ description
+ "Configuration data for components";
+
+ leaf name {
+ type string;
+ description
+ "Device name for the component -- this may not be a
+ configurable parameter on many implementations. Where
+ component preconfiguration is supported, for example,
+ the component name may be configurable.";
+ }
+ }
+
+ grouping platform-component-state {
+ description
+ "Operational state data for device components.";
+
+ leaf type {
+ type union {
+ type identityref {
+ base oc-platform-types:OPENCONFIG_HARDWARE_COMPONENT;
+ }
+ type identityref {
+ base oc-platform-types:OPENCONFIG_SOFTWARE_COMPONENT;
+ }
+ }
+ description
+ "Type of component as identified by the system";
+ }
+
+ leaf id {
+ type string;
+ description
+ "Unique identifier assigned by the system for the
+ component";
+ }
+
+ leaf location {
+ type string;
+ description
+ "System-supplied description of the location of the
+ component within the system. This could be a bay position,
+ slot number, socket location, etc. For component types that
+ have an explicit slot-id attribute, such as linecards, the
+ system should populate the more specific slot-id.";
+ }
+
+ leaf description {
+ type string;
+ description
+ "System-supplied description of the component";
+ }
+
+ leaf mfg-name {
+ type string;
+ description
+ "System-supplied identifier for the manufacturer of the
+ component. This data is particularly useful when a
+ component manufacturer is different than the overall
+ device vendor.";
+ }
+
+ leaf mfg-date {
+ type oc-yang:date;
+ description
+ "System-supplied representation of the component's
+ manufacturing date.";
+ }
+
+ leaf hardware-version {
+ type string;
+ description
+ "For hardware components, this is the hardware revision of
+ the component.";
+ }
+
+ leaf firmware-version {
+ type string;
+ description
+ "For hardware components, this is the version of associated
+ firmware that is running on the component, if applicable.";
+ }
+
+ leaf software-version {
+ type string;
+ description
+ "For software components such as operating system or other
+ software module, this is the version of the currently
+ running software.";
+ }
+
+ leaf serial-no {
+ type string;
+ description
+ "System-assigned serial number of the component.";
+ }
+
+ leaf part-no {
+ type string;
+ description
+ "System-assigned part number for the component. This should
+ be present in particular if the component is also an FRU
+ (field replaceable unit)";
+ }
+
+ leaf removable {
+ type boolean;
+ description
+ "If true, this component is removable or is a field
+ replaceable unit";
+ }
+
+ leaf oper-status {
+ type identityref {
+ base oc-platform-types:COMPONENT_OPER_STATUS;
+ }
+ description
+ "If applicable, this reports the current operational status
+ of the component.";
+ }
+
+ leaf empty {
+ type boolean;
+ default false;
+ description
+ "The empty leaf may be used by the device to indicate that a
+ component position exists but is not populated. Using this
+ flag, it is possible for the management system to learn how
+ many positions are available (e.g., occupied vs. empty
+ linecard slots in a chassis).";
+ }
+
+ leaf parent {
+ type leafref {
+ path "../../config/name";
+ }
+ description
+ "Reference to the name of the parent component. Note that
+ this reference must be kept synchronized with the
+ corresponding subcomponent reference from the parent
+ component.";
+ }
+ }
+
+ grouping platform-component-temp-alarm-state {
+ description
+ "Temperature alarm data for platform components";
+
+ // TODO(aashaikh): consider if these leaves could be in a
+ // reusable grouping (not temperature-specific); threshold
+ // may always need to be units specific.
+
+ leaf alarm-status {
+ type boolean;
+ description
+ "A value of true indicates the alarm has been raised or
+ asserted. The value should be false when the alarm is
+ cleared.";
+ }
+
+ leaf alarm-threshold {
+ type uint32;
+ description
+ "The threshold value that was crossed for this alarm.";
+ }
+
+ leaf alarm-severity {
+ type identityref {
+ base oc-alarm-types:OPENCONFIG_ALARM_SEVERITY;
+ }
+ description
+ "The severity of the current alarm.";
+ }
+ }
+
+ grouping platform-component-power-state {
+ description
+ "Power-related operational state for device components.";
+
+ leaf allocated-power {
+ type uint32;
+ units watts;
+ description
+ "Power allocated by the system for the component.";
+ }
+
+ leaf used-power {
+ type uint32;
+ units watts;
+ description
+ "Actual power used by the component.";
+ }
+ }
+
+ grouping platform-component-temp-state {
+ description
+ "Temperature state data for device components";
+
+ container temperature {
+ description
+ "Temperature in degrees Celsius of the component. Values include
+ the instantaneous, average, minimum, and maximum statistics. If
+ avg/min/max statistics are not supported, the target is expected
+ to just supply the instant value";
+
+ uses oc-platform-types:avg-min-max-instant-stats-precision1-celsius;
+ uses platform-component-temp-alarm-state;
+ }
+ }
+
+ grouping platform-component-memory-state {
+ description
+ "Per-component memory statistics";
+
+ container memory {
+ description
+ "For components that have associated memory, these values
+ report information about available and utilized memory.";
+
+ leaf available {
+ type uint64;
+ units bytes;
+ description
+ "The available memory physically installed, or logically
+ allocated to the component.";
+ }
+
+ // TODO(aashaikh): consider if this needs to be a
+ // min/max/avg statistic
+ leaf utilized {
+ type uint64;
+ units bytes;
+ description
+ "The memory currently in use by processes running on
+ the component, not considering reserved memory that is
+ not available for use.";
+ }
+ }
+ }
+
+ grouping platform-anchors-top {
+ description
+ "This grouping is used to add containers for components that
+ are common across systems, but do not have a defined schema
+ within the openconfig-platform module. Containers should be
+ added to this grouping for components that are expected to
+ exist in multiple systems, with corresponding modules
+ augmenting the config/state containers directly.";
+
+ container chassis {
+ description
+ "Data for chassis components";
+
+ container config {
+ description
+ "Configuration data for chassis components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for chassis components";
+ }
+ }
+
+// TODO(aashaikh): linecard container is already defined in
+// openconfig-platform-linecard; will move to this module
+// in future.
+ /*
+ container linecard {
+ description
+ "Data for linecard components";
+
+ container config {
+ description
+ "Configuration data for linecard components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for linecard components";
+ }
+ }
+ */
+
+ container port {
+ description
+ "Data for physical port components";
+
+ container config {
+ description
+ "Configuration data for physical port components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for physical port components";
+ }
+ }
+
+// TODO(aashaikh): transceiver container is already defined in
+// openconfig-platform-transceiver; will move to this module
+// in future.
+ /*
+ container transceiver {
+ description
+ "Data for transceiver components";
+
+ container config {
+ description
+ "Configuration data for transceiver components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for transceiver components";
+ }
+ }
+ */
+
+ container power-supply {
+ description
+ "Data for power supply components";
+
+ container config {
+ description
+ "Configuration data for power supply components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for power supply components";
+ }
+ }
+
+ container fan {
+ description
+ "Data for fan components";
+
+ container config {
+ description
+ "Configuration data for fan components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for fan components";
+ }
+ }
+
+ container fabric {
+ description
+ "Data for fabric components";
+
+ container config {
+ description
+ "Configuration data for fabric components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for fabric components";
+ }
+ }
+
+ container storage {
+ description
+ "Data for storage components";
+
+ container config {
+ description
+ "Configuration data for storage components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for storage components";
+ }
+ }
+
+ container cpu {
+ description
+ "Data for cpu components";
+
+ container config {
+ description
+ "Configuration data for cpu components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for cpu components";
+ }
+ }
+
+ container integrated-circuit {
+ description
+ "Data for chip components, such as ASIC, NPUs, etc.";
+
+ container config {
+ description
+ "Configuration data for chip components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for chip components";
+ }
+ }
+
+ container backplane {
+ description
+ "Data for backplane components";
+
+ container config {
+ description
+ "Configuration data for backplane components";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for backplane components";
+ }
+ }
+ }
+
+ grouping platform-component-top {
+ description
+ "Top-level grouping for components in the device inventory";
+
+ container components {
+ description
+ "Enclosing container for the components in the system.";
+
+ list component {
+ key "name";
+ description
+ "List of components, keyed by component name.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "References the component name";
+ }
+
+ container config {
+ description
+ "Configuration data for each component";
+
+ uses platform-component-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for each component";
+
+ uses platform-component-config;
+ uses platform-component-state;
+ uses platform-component-temp-state;
+ uses platform-component-memory-state;
+ uses platform-component-power-state;
+ }
+
+ uses platform-component-properties-top;
+ uses platform-subcomponent-ref-top;
+ uses platform-anchors-top;
+ }
+ }
+ }
+
+
+ // data definition statements
+
+ uses platform-component-top;
+
+
+ // augments
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-policy-forwarding.yang b/src/plugins/yang/openconfig/openconfig-policy-forwarding.yang
new file mode 100644
index 0000000..63dbf78
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-policy-forwarding.yang
@@ -0,0 +1,119 @@
+module openconfig-policy-forwarding {
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/policy-forwarding";
+
+ prefix "oc-pf";
+
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ // Include submodules.
+ include openconfig-pf-forwarding-policies;
+ include openconfig-pf-path-groups;
+ include openconfig-pf-interfaces;
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and operational state data
+ relating to policy-based forwarding. Policy-based forwarding is
+ utilised when a system chooses how to forward packets (including
+ applying data-plane operations such as encapsulation or
+ decapsulation) based on policies other than destination L2 or L3
+ header. Typically, systems may implement:
+
+ - IP policy-based routing, where routing may be done based on the
+ source plus destination of an IP packet; information within the
+ L4 header; or some combination of both.
+ - Encapsulation or decapsulation based on certain policy
+ information - for example, matching particular IP destinations
+ and decapsulating GRE headers.
+ - Class-based selection of egress routes - such as class-based
+ selection of an egress MPLS path.
+
+ The policies that are defined in this model are applied to a
+ particular ingress context of a network element (e.g., interface)
+ and are defined to apply following other interface policy such as
+ QoS classification and access control lists.
+
+ This module defines:
+
+ - policy-forwarding
+ |
+ |--- policies
+ | |-- policy
+ | |-- [match criteria] How packets are defined to
+ | | match policy.
+ | |-- [forwarding-action] How packets matching should
+ | be forwarded.
+ |--- interfaces
+ | |-- interfaces
+ | | -- apply-forwarding-policy Forwarding policy to
+ | used on the interface.
+ |--- path-selection-groups
+ |-- path-selection-group A group of forwarding resources
+ that are grouped for purposes
+ of next-hop selection.
+
+ A forwarding-policy specifies the match criteria that it intends
+ to use to determine the packets that it reroutes - this may
+ consist of a number of criteria, such as DSCP. The action of the
+ policy results in a forwarding action being applied to matching
+ packets. For example, decapsulating the packet from a GRE header.
+ In order to enact the policy based on particular interfaces - the
+ forwarding-policy is applied to an interface via referencing it
+ within an 'apply-forwarding-policy' statement associated with an
+ interface.
+
+ In some cases (e.g., Class-Based Tunnel Selection) the forwarding
+ action does not resolve to a single egress action, and rather
+ normal forwarding rules are to be applied but considering a subset
+ of forwarding resources. In these cases, a path-selection-group
+ can be created, referencing the subset of forwarding paths that
+ should be used for the egress selection. In the case that a subset
+ of MPLS LSPs are eligible for, say, DSCP 46 marked packets, a
+ path-selection-group is created, referencing the subset of LSPs.
+ The forwarding action of the corresponding policy is set to
+ PATH_GROUP and references the configured group of LSPs.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2017-06-21" {
+ description
+ "Amend policy forwarding model based on ACL changes.";
+ reference "0.2.0";
+ }
+
+ revision "2017-02-28" {
+ description
+ "Initial public release of policy forwarding.";
+ reference "0.1.0";
+ }
+
+ revision "2016-11-08" {
+ description
+ "Initial revision.";
+ reference "0.0.1";
+ }
+
+
+ grouping policy-forwarding-top {
+ description
+ "Top-level grouping for Policy Forwarding";
+
+ container policy-forwarding {
+ description
+ "Configuration and operational state relating to policy-forwarding within
+ a network instance.";
+
+ uses pf-forwarding-policy-structural;
+ uses pf-interfaces-structural;
+ uses pf-path-groups-structural;
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-policy-types.yang b/src/plugins/yang/openconfig/openconfig-policy-types.yang
new file mode 100644
index 0000000..ef47f33
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-policy-types.yang
@@ -0,0 +1,220 @@
+module openconfig-policy-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/policy-types";
+
+ prefix "oc-pol-types";
+
+ // import some basic types
+ import ietf-yang-types { prefix yang; }
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module contains general data definitions for use in routing
+ policy. It can be imported by modules that contain protocol-
+ specific policy conditions and actions.";
+
+ oc-ext:openconfig-version "3.1.0";
+
+ revision "2018-06-05" {
+ description
+ "Add PIM, IGMP to INSTALL_PROTOCOL_TYPES identity";
+ reference "3.1.0";
+ }
+
+ revision "2017-07-14" {
+ description
+ "Replace policy choice node/type with policy-result
+ enumeration;simplified defined set naming;removed generic
+ IGP actions; migrate to OpenConfig types; added mode for
+ prefix sets";
+ reference "3.0.0";
+ }
+
+ revision "2016-05-12" {
+ description
+ "OpenConfig public release";
+ reference "2.0.1";
+ }
+
+ // identity statements
+
+ identity ATTRIBUTE_COMPARISON {
+ description
+ "base type for supported comparison operators on route
+ attributes";
+ }
+
+ identity ATTRIBUTE_EQ {
+ base ATTRIBUTE_COMPARISON;
+ description "== comparison";
+ }
+
+ identity ATTRIBUTE_GE {
+ base ATTRIBUTE_COMPARISON;
+ description ">= comparison";
+ }
+
+ identity ATTRIBUTE_LE {
+ base ATTRIBUTE_COMPARISON;
+ description "<= comparison";
+ }
+
+ typedef match-set-options-type {
+ type enumeration {
+ enum ANY {
+ description "match is true if given value matches any member
+ of the defined set";
+ }
+ enum ALL {
+ description "match is true if given value matches all
+ members of the defined set";
+ }
+ enum INVERT {
+ description "match is true if given value does not match any
+ member of the defined set";
+ }
+ }
+ default ANY;
+ description
+ "Options that govern the behavior of a match statement. The
+ default behavior is ANY, i.e., the given value matches any
+ of the members of the defined set";
+ }
+
+ typedef match-set-options-restricted-type {
+ type enumeration {
+ enum ANY {
+ description "match is true if given value matches any member
+ of the defined set";
+ }
+ enum INVERT {
+ description "match is true if given value does not match any
+ member of the defined set";
+ }
+ }
+ default ANY;
+ description
+ "Options that govern the behavior of a match statement. The
+ default behavior is ANY, i.e., the given value matches any
+ of the members of the defined set. Note this type is a
+ restricted version of the match-set-options-type.";
+ //TODO: restriction on enumerated types is only allowed in
+ //YANG 1.1. Until then, we will require this additional type
+ }
+
+ grouping attribute-compare-operators {
+ description "common definitions for comparison operations in
+ condition statements";
+
+ leaf operator {
+ type identityref {
+ base ATTRIBUTE_COMPARISON;
+ }
+ description
+ "type of comparison to be performed";
+ }
+
+ leaf value {
+ type uint32;
+ description
+ "value to compare with the community count";
+ }
+ }
+
+ typedef tag-type {
+ type union {
+ type uint32;
+ type yang:hex-string;
+ }
+ description "type for expressing route tags on a local system,
+ including IS-IS and OSPF; may be expressed as either decimal or
+ hexidecimal integer";
+ reference
+ "RFC 2178 OSPF Version 2
+ RFC 5130 A Policy Control Mechanism in IS-IS Using
+ Administrative Tags";
+ }
+
+ identity INSTALL_PROTOCOL_TYPE {
+ description
+ "Base type for routing protocols, including those which may
+ install prefixes into the RIB";
+ }
+
+ identity BGP {
+ base INSTALL_PROTOCOL_TYPE;
+ description
+ "BGP";
+ reference
+ "RFC 4271";
+ }
+
+ identity ISIS {
+ base INSTALL_PROTOCOL_TYPE;
+ description
+ "IS-IS";
+ reference
+ "ISO/IEC 10589";
+ }
+
+ identity OSPF {
+ base INSTALL_PROTOCOL_TYPE;
+ description
+ "OSPFv2";
+ reference
+ "RFC 2328";
+ }
+
+ identity OSPF3 {
+ base INSTALL_PROTOCOL_TYPE;
+ description
+ "OSPFv3";
+ reference
+ "RFC 5340";
+ }
+
+ identity STATIC {
+ base INSTALL_PROTOCOL_TYPE;
+ description
+ "Locally-installed static route";
+ }
+
+ identity DIRECTLY_CONNECTED {
+ base INSTALL_PROTOCOL_TYPE;
+ description
+ "A directly connected route";
+ }
+
+ identity LOCAL_AGGREGATE {
+ base INSTALL_PROTOCOL_TYPE;
+ description
+ "Locally defined aggregate route";
+ }
+
+ identity PIM {
+ base INSTALL_PROTOCOL_TYPE;
+ description
+ "Protocol Independent Multicast";
+ reference
+ "RFC 7761";
+ }
+
+ identity IGMP {
+ base INSTALL_PROTOCOL_TYPE;
+ description
+ "Internet Group Management Protocol";
+ reference
+ "RFC 3376";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-probes-types.yang b/src/plugins/yang/openconfig/openconfig-probes-types.yang
new file mode 100644
index 0000000..0b4e1bd
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-probes-types.yang
@@ -0,0 +1,75 @@
+module openconfig-probes-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/probes/types";
+
+ prefix "oc-probes-types";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines types related to the probes.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2017-09-05" {
+ description
+ "Initial public revision";
+ reference "0.1.0";
+ }
+
+ typedef test-type {
+ type enumeration {
+ enum ICMP {
+ description
+ "Send ICMP echo requests.";
+ }
+ enum ICMP6 {
+ description
+ "Send ICMP6 echo requests.";
+ }
+ enum ICMP_TIMESTAMP {
+ description
+ "Send ICMP timestamp requests.";
+ }
+ enum ICMP6_TIMESTAMP {
+ description
+ "Sedn ICMP6 timestamp requests.";
+ }
+ enum TCP {
+ description
+ "Send TPC packets.";
+ }
+ enum UDP {
+ description
+ "Send UDP packets.";
+ }
+ enum UDP_TIMESTAMP {
+ description
+ "Send UDP packets with timestamp.";
+ }
+ enum HTTP_GET {
+ description
+ "Execute HTTP GET requests.";
+ }
+ enum HTTP_GET_META {
+ description
+ "Execute HTTP GET requests of metadata.";
+ }
+ }
+ description
+ "Type definition with enumerations describing the basis of
+ the probe test type identifier";
+ }
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-probes.yang b/src/plugins/yang/openconfig/openconfig-probes.yang
new file mode 100644
index 0000000..8c179f3
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-probes.yang
@@ -0,0 +1,569 @@
+module openconfig-probes {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/probes";
+
+ prefix "oc-probes";
+
+ import ietf-yang-types { prefix yang; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-probes-types { prefix oc-probes-types; }
+
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and operational state data
+ for the probes.
+ A probe consists on a group of tests, each test being a
+ source-destination pair to poll. The destination can be either
+ IP Address (and eventually port) or URL, depending on the
+ nature of the test. The test can send ICMP, UDP, TCP, or HTTP
+ requests.
+ Each test groups a list of test items, the test results
+ being an overall view or average of the items list.
+ However, the test preserves only a limited set of history
+ items, whose length can be controlled using the history-size.";
+
+ oc-ext:openconfig-version "0.0.1";
+
+ revision "2017-09-05" {
+ description
+ "Initial public revision";
+ reference "0.0.1";
+ }
+
+grouping test-target {
+ description
+ "Groups the config and state containers
+ for an individual test.";
+
+ container target {
+ description
+ "The target configuration of the test.
+ The nature of the target depends on the probe type:
+ for HTTP probes we need to provide an URL to poll,
+ while ICMP probes require an IP address to monitor.";
+
+ container config {
+ description
+ "Configuration data for the test target.";
+
+ uses test-target-base;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational data for the test target.";
+
+ uses test-target-base;
+ }
+
+ }
+
+}
+
+ grouping test-target-base {
+ description
+ "Targe types for the probe test.";
+
+ leaf address {
+ type oc-inet:ip-address;
+ description
+ "IP address of the target, either IPv4 or IPv6.";
+ }
+
+ leaf port {
+ type oc-inet:port-number;
+ description
+ "Destination port.";
+ }
+
+ leaf url {
+ type oc-inet:url;
+ description
+ "Target URL to probe.";
+ }
+
+}
+
+ grouping probe-test-config-base {
+ description
+ "Definition of test details.";
+
+ leaf test-type {
+ type oc-probes-types:test-type;
+ description
+ "The type of the probe test.";
+ mandatory true;
+ }
+
+ leaf count {
+ type yang:counter64;
+ description
+ "The number of probes per test.";
+ }
+
+ leaf interval {
+ type yang:counter64;
+ description
+ "Time between two consecutive probes.";
+ }
+
+ leaf source {
+ type oc-inet:ip-address;
+ description
+ "Source address used when probing, either IPv4 or IPv6.";
+ }
+
+ leaf history-size {
+ type yang:counter64;
+ description
+ "The number of history entries stored.";
+ }
+
+ leaf source-port {
+ type oc-inet:port-number;
+ description
+ "Source number used.";
+ }
+
+ leaf dscp {
+ type oc-inet:dscp;
+ description
+ "DSCP code points";
+ }
+
+ }
+
+ grouping probe-test-state-history-item-base {
+ description
+ "The test item results counters and statistics.
+ An item presents the results of a single execution
+ of the test.
+ The results of the test depend on the values
+ of the total items, or an average over a certain
+ period of time.";
+
+ leaf id {
+ type yang:counter64;
+ description
+ "The test item ID.";
+ }
+
+ leaf timestamp {
+ type oc-types:timeticks64;
+ description
+ "The test timestamp.
+ This is not the timestamp when the test
+ was actually executed nither when it finished.
+ Should be the timestamp when the test has been scheduled.
+ It may not be the same with start-timestamp.";
+ }
+
+ leaf start-timestamp {
+ type oc-types:timeticks64;
+ description
+ "The timestamp when the test started.";
+ }
+
+ leaf end-timestamp {
+ type oc-types:timeticks64;
+ description
+ "The timestamp when the test finished.";
+ }
+
+ leaf test-duration {
+ type yang:counter64;
+ description
+ "The duration of the test, in microseconds.";
+ }
+
+ leaf failed {
+ type boolean;
+ description
+ "Whether the test failed or succeeded.";
+ }
+
+ leaf probes-sent {
+ type yang:counter64;
+ description
+ "Number of test probes sent.";
+ }
+
+ leaf probes-received {
+ type yang:counter64;
+ description
+ "Number of test probes received.";
+ }
+
+ leaf loss-percentage {
+ type oc-types:percentage;
+ description
+ "The loss percentage.";
+ }
+
+ leaf jitter {
+ type yang:counter64;
+ description
+ "The round trip jitter, in microseconds.";
+ }
+
+ leaf min-delay {
+ type yang:counter64;
+ description
+ "The minimum delay recorded during the test, in microseconds.";
+ }
+
+ leaf max-delay {
+ type yang:counter64;
+ description
+ "The maximum delay recorded during the test, in microseconds.";
+ }
+
+ leaf avg-delay {
+ type yang:counter64;
+ description
+ "The average delay recorded during the test, in microseconds.";
+ }
+
+ leaf stddev-delay {
+ type yang:counter64;
+ description
+ "The standard deviation of the delay of the test.";
+ }
+
+ }
+
+ grouping probe-test-state-history-item {
+ description
+ "A history item of the probe results.";
+
+ container state {
+
+ config false;
+
+ description
+ "A history item of the probe results: operational data only.";
+
+ uses probe-test-state-history-item-base;
+ }
+
+ }
+
+ grouping probe-test-state-history {
+
+ description
+ "The history of the test results.";
+
+ container items {
+
+ description
+ "The list of items in the probe history.
+ The length depends on the history size.";
+
+ list item {
+ key "id";
+ description
+ "List of history items.";
+
+ leaf id {
+ type leafref {
+ path "../state/id";
+ }
+ description
+ "Reference to the history entry ID.";
+ }
+
+ uses probe-test-state-history-item;
+ }
+
+ }
+
+ }
+
+ grouping probe-test-state-results {
+ description
+ "The test results counters and statistics.";
+
+ leaf timestamp {
+ type oc-types:timeticks64;
+ description
+ "The test timestamp.
+ This is not the timestamp when the test
+ was actually executed nither when it finished.
+ Should be the timestamp when the test has been scheduled.
+ It may not be the same with start-timestamp.";
+ }
+
+ leaf start-timestamp {
+ type oc-types:timeticks64;
+ description
+ "The timestamp when the test started.";
+ }
+
+ leaf last-test-timestamp {
+ type oc-types:timeticks64;
+ description
+ "The timestamp when the test finished.";
+ }
+
+ leaf test-duration {
+ type yang:counter64;
+ description
+ "The duration of the test, in microseconds.";
+ }
+
+ leaf failed {
+ type boolean;
+ description
+ "Whether the test failed or succeeded.";
+ }
+
+ leaf probes-sent {
+ type yang:counter64;
+ description
+ "Number of test probes sent.";
+ }
+
+ leaf probes-received {
+ type yang:counter64;
+ description
+ "Number of test probes received.";
+ }
+
+ leaf loss-percentage {
+ type oc-types:percentage;
+ description
+ "The loss percentage.";
+ }
+
+ leaf jitter {
+ type yang:counter64;
+ description
+ "The round trip jitter, in microseconds.";
+ }
+
+ leaf min-delay {
+ type yang:counter64;
+ description
+ "The minimum delay recorded during the test, in microseconds.";
+ }
+
+ leaf max-delay {
+ type yang:counter64;
+ description
+ "The maximum delay recorded during the test, in microseconds.";
+ }
+
+ leaf avg-delay {
+ type yang:counter64;
+ description
+ "The average delay recorded during the test, in microseconds.";
+ }
+
+ leaf stddev-delay {
+ type yang:counter64;
+ description
+ "The standard deviation of the delay of the test.";
+ }
+
+
+ }
+
+ grouping probe-test-state {
+
+ description
+ "Operational data and results for the probes.";
+
+ }
+
+ grouping probe-test-config {
+ description
+ "Definition of test details.";
+
+ leaf name {
+ type string;
+ description
+ "The name of the test probe";
+ mandatory true;
+ }
+
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Whether the test is enabled.";
+ }
+
+ uses probe-test-config-base;
+
+ }
+
+ grouping probe-tests-top {
+ description
+ "Top-level grouping for the tests withing a probe.";
+
+ list test {
+ key "name";
+ description
+ "List of tests associated with this probe.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container config {
+ description
+ "Configuration data for the test of this probe.";
+
+ uses probe-test-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data";
+
+ uses probe-test-config;
+ uses probe-test-state;
+ }
+
+ uses test-target;
+
+ container results {
+ description
+ "Contains the results of the tests.";
+
+ container state {
+
+ config false;
+
+ description
+ "Results of this test: operational data only";
+
+ uses probe-test-state-results;
+ }
+
+ container history {
+
+ config false;
+
+ description
+ "Historical data of the tests.";
+
+ uses probe-test-state-history;
+ }
+
+ }
+
+ }
+ // end list of probes
+
+ }
+
+ grouping probe-config {
+ description
+ "Definition of probe details.";
+
+ leaf name {
+ type string;
+ description
+ "The name of the probe.";
+ mandatory true;
+ }
+
+ leaf enabled {
+ type boolean;
+ default true;
+ description
+ "Whether the probe is enabled.";
+ }
+
+ }
+
+ grouping probe-state {
+ description
+ "Definition of probes operation data.";
+ }
+
+ grouping probes-top {
+ description
+ "Top-level grouping for probes model";
+
+ list probe {
+ key "name";
+ description
+ "List of probes configured.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container config {
+ description
+ "Configuration data for the probes.";
+
+ uses probe-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data";
+
+ uses probe-config;
+ uses probe-state;
+ }
+
+ container tests {
+
+ description
+ "The tests associated to be executed for the probe.";
+
+ uses probe-tests-top;
+ }
+
+ }
+ // end list of probes
+
+ }
+
+ grouping openconfig-probes-top {
+
+ description
+ "The top level grouping of the probes model.";
+
+ container probes {
+ description
+ "The container containing the list of probes.";
+
+ uses probes-top;
+ }
+
+ }
+
+ uses openconfig-probes-top;
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-procmon.yang b/src/plugins/yang/openconfig/openconfig-procmon.yang
new file mode 100644
index 0000000..fa3bbde
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-procmon.yang
@@ -0,0 +1,165 @@
+module openconfig-procmon {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/system/procmon";
+
+ prefix "oc-proc";
+
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-types { prefix oc-types; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module provides data definitions for process health
+ monitoring of one or more processes running on the system.";
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2017-09-18" {
+ description
+ "Updated to use OpenConfig types modules";
+ reference "0.3.0";
+ }
+
+ revision "2017-07-06" {
+ description
+ "Move to oc-inet types, add IETF attribution, add RADIUS
+ counters, changed password leaf names to indicate hashed";
+ reference "0.2.0";
+ }
+
+ revision "2017-01-29" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+
+ // grouping statements
+
+ grouping procmon-processes-top {
+ description
+ "Top level grouping for attributes for processes.";
+
+ container processes {
+ description
+ "Parameters related to all monitored processes";
+
+ list process {
+ key "pid";
+ config false;
+ description
+ "List of monitored processes";
+
+ leaf pid {
+ type leafref {
+ path "../state/pid";
+ }
+ description
+ "Reference to the process pid key";
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters related to monitored processes";
+
+ uses procmon-process-attributes-state;
+ }
+ }
+ }
+ }
+
+ grouping procmon-process-attributes-state {
+ description
+ "Attributes state definitions for a process";
+
+ leaf pid {
+ type uint64;
+ description
+ "The process pid";
+ }
+
+ leaf name {
+ type string;
+ description
+ "The process name";
+ }
+
+ leaf-list args {
+ type string;
+ description
+ "Current process command line arguments. Arguments with
+ a parameter (e.g., --option 10 or -option=10) should be
+ represented as a single element of the list with the
+ argument name and parameter together. Flag arguments, i.e.,
+ those without a parameter should also be in their own list
+ element.";
+ }
+
+ leaf start-time {
+ type uint64;
+ units "ns";
+ description
+ "The time at which this process started,
+ reported as nanoseconds since the UNIX epoch. The
+ system must be synchronized such that the start-time
+ can be reported accurately, otherwise it should not be
+ reported.";
+ }
+
+ leaf uptime {
+ type oc-types:timeticks64;
+ description
+ "Amount of time elapsed since this process started.";
+ }
+
+ leaf cpu-usage-user {
+ type oc-types:timeticks64;
+ description
+ "CPU time consumed by this process in user mode.";
+ }
+
+ leaf cpu-usage-system {
+ type oc-types:timeticks64;
+ description
+ "CPU time consumed by this process in kernel mode.";
+ }
+
+ leaf cpu-utilization {
+ type oc-types:percentage;
+ description
+ "The percentage of CPU that is being used by the process.";
+ }
+
+ leaf memory-usage {
+ type uint64;
+ units "bytes";
+ description
+ "Bytes allocated and still in use by the process";
+ }
+
+ leaf memory-utilization {
+ type oc-types:percentage;
+ description
+ "The percentage of RAM that is being used by the process.";
+ }
+ }
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+}
diff --git a/src/plugins/yang/openconfig/openconfig-qos-elements.yang b/src/plugins/yang/openconfig/openconfig-qos-elements.yang
new file mode 100644
index 0000000..b862db2
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-qos-elements.yang
@@ -0,0 +1,1304 @@
+submodule openconfig-qos-elements {
+
+ belongs-to openconfig-qos {
+ prefix "oc-qos";
+ }
+
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-qos-types { prefix oc-qos-types; }
+ import openconfig-packet-match { prefix oc-pkt-match; }
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-types { prefix oc-types; }
+
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This submodule defines configuration and operational state
+ data associated with QoS elements. The primary elements of
+ the model include:
+
+ classifiers: match packets with a specific characteristic
+
+ forwarding groups: logical class of packets that receive
+ common forwarding treatment
+
+ queues: collection of packets to be scheduled, including
+ a queue management scheme
+
+ schedulers: sequence of one more elements that schedule
+ packets for transmission, including policer and shaper
+ functions";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2016-12-16" {
+ description
+ "Fix incorrect interface-ref placement";
+ reference "0.2.0";
+ }
+
+ revision "2016-06-03" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ grouping qos-classifier-term-config {
+ description
+ "Configuration data for list of match criteria in a QoS
+ classifier";
+
+ leaf id {
+ type string;
+ description
+ "Identifier for the match term";
+ }
+ }
+
+ grouping qos-classifier-term-state {
+ description
+ "Operational state data for list of match criteria in a QoS
+ classifier";
+ }
+
+ grouping qos-classifier-term-action-config {
+ description
+ "Configuration parameters for actions for a classifier term.";
+
+ leaf target-group {
+ type leafref {
+ // Current location:
+ // /qos/classifiers/classifier/terms/term/actions/config/target-group
+ path "../../../../../../../forwarding-groups/forwarding-group/" +
+ "config/name";
+ }
+ description
+ "References the forwarding group or class to which the
+ matched packets should be assigned";
+ }
+ }
+
+ grouping qos-classifier-terms-top {
+ description
+ "Top-level grouping for list of match criteria in a QoS
+ classifier";
+
+ container terms {
+ description
+ "Enclosing container for ths list of terms";
+
+ list term {
+ key "id";
+ description
+ "List of match terms used in the classifier";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "Reference to id list key.";
+ }
+
+ container config {
+ description
+ "Configuration data for list of match criteria in a QoS
+ classifier";
+
+ uses qos-classifier-term-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for list of match criteria in a
+ QoS classifier";
+
+ uses qos-classifier-term-config;
+ uses qos-classifier-term-state;
+ }
+
+ container conditions {
+ description
+ "Conditions for the classifier term. Packets must match all of
+ the criteria specified within the match condition to be considered
+ matching the term.";
+
+ // TODO(robjs): Consider whether we should have classifiers
+ // that can match >1 different value of a field, or whether
+ // this should require different match terms within the
+ // classifier.
+ uses oc-pkt-match:ethernet-header-top;
+ uses oc-pkt-match:ipv4-protocol-fields-top;
+ uses oc-pkt-match:ipv6-protocol-fields-top;
+ uses oc-pkt-match:transport-fields-top;
+ uses oc-pkt-match:mpls-header-top;
+ }
+
+ container actions {
+ description
+ "Actions to be applied for packets matching the specified
+ classification rules.";
+
+ container config {
+ description
+ "Actions to be applied to packets that match the classifier
+ term.";
+
+ uses qos-classifier-term-action-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters associated with classifier term
+ actions";
+
+ uses qos-classifier-term-action-config;
+ }
+
+ container remark {
+ description
+ "Remark actions to be associated with packets that match the
+ classifier term. Where a packet matches these criteria, the
+ specified rewrite actions should be performed.";
+
+ uses qos-common-remark-actions;
+ }
+ }
+ }
+ }
+ }
+
+ grouping qos-classifier-config {
+ description
+ "Configuration data for classifiers";
+
+ leaf name {
+ type string;
+ description
+ "User-assigned name of the classifier";
+ }
+
+ leaf type {
+ type enumeration {
+ enum IPV4 {
+ description
+ "Classifier matches and operates
+ on packets with IPv4 headers.";
+ }
+ enum IPV6 {
+ description
+ "Classifier matches and operates
+ on packets with IPv6 headers.";
+ }
+ enum MPLS {
+ description
+ "Classifier matches and operates
+ on packets with MPLS headers.";
+ }
+ enum ETHERNET {
+ description
+ "Classifier matches and operates
+ on fields within the L2 ETHERNET
+ headers.";
+ }
+ }
+ description
+ "Type of classifier.";
+ }
+ }
+
+ grouping qos-classifier-state {
+ description
+ "Operational state data for classifiers";
+
+ }
+
+ grouping qos-classifier-top {
+ description
+ "Top-level grouping for classifier data";
+
+ container classifiers {
+ description
+ "Enclosing container for QoS classifiers";
+
+ list classifier {
+ key "name";
+ description
+ "List of classifier elements";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to list key name";
+ }
+
+ container config {
+ description
+ "Configuration data for classifers";
+
+ uses qos-classifier-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for classifiers";
+
+ uses qos-classifier-config;
+ uses qos-classifier-state;
+ }
+
+ uses qos-classifier-terms-top;
+ }
+ }
+ }
+
+ grouping qos-fabric-trace-config {
+ description
+ "Configuration data for fabric trace data";
+
+ leaf source {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component" +
+ "/oc-platform:config/oc-platform:name";
+ }
+ description
+ "Source component for fabric trace data";
+ }
+
+ leaf dest {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component" +
+ "/oc-platform:config/oc-platform:name";
+ }
+ description
+ "Destination component for fabric trace data";
+ }
+ }
+
+ grouping qos-forwarding-group-config {
+ description
+ "Configuration data for forwarding groups";
+
+ leaf name {
+ type string;
+ description
+ "Name of the forwarding group";
+ }
+
+ // TODO(robjs, Simon G): Discuss optionally moving
+ // this to a high/low priority indicator, if this
+ // is common across implementations.
+ leaf fabric-priority {
+ type uint8;
+ description
+ "Set the priority for the forwarding group for
+ local transmission through the device, e.g.,
+ across a switching fabric. Higher priorities
+ are considered to be better, such that traffic
+ with fabric priority 128 is considered to be
+ higher priority than that with fabric priority
+ 0.";
+ }
+
+ leaf output-queue {
+ type leafref {
+ path "../../../../queues/queue/config/name";
+ }
+ description
+ "Queue for packets in this forwarding group.";
+ }
+ }
+
+ grouping qos-forwarding-group-state {
+ description
+ "Operational state data for forwarding groups";
+ }
+
+ grouping qos-forwarding-group-top {
+ description
+ "Top-level grouping for forwarding group data";
+
+ container forwarding-groups {
+ description
+ "Enclosing container for list of forwarding groups";
+
+ list forwarding-group {
+ key "name";
+ description
+ "List of forwarding groups. Forwarding groups are
+ logical groups of traffic that will receive common
+ forwarding treatment.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to name list key";
+ }
+
+ container config {
+ description
+ "Configuration data for forwarding groups";
+
+ uses qos-forwarding-group-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for forwarding groups";
+
+ uses qos-forwarding-group-config;
+ uses qos-forwarding-group-state;
+ }
+ }
+ }
+ }
+
+ grouping qos-queue-red-common-config {
+ description
+ "Common configuration parameters applicable to RED and
+ its variants";
+
+ leaf enable-ecn {
+ type boolean;
+ default false;
+ description
+ "When set to true, the device should mark packets that are
+ ECN-capable rather than dropping them. The receiver is
+ expected to echo the congestion signal back to the sender
+ so that it may adjust its transmission rate accordingly.
+ When this leaf is false, the device drops packets according
+ to the RED/WRED probability, or all packets if the
+ average queue length is above the max threshold.";
+ }
+ }
+
+ grouping qos-queue-red-common-state {
+ description
+ "Common operational state data applicable to RED and
+ its variants";
+
+ }
+
+ grouping qos-queue-wred-config {
+ description
+ "Configuration data for WRED-managed queues";
+
+ // TODO(robjs, aashaikh): Add configuration for weighted RED
+ // within this grouping.
+ }
+
+ grouping qos-queue-wred-state {
+ description
+ "Operational state data for WRED-managed queues";
+ }
+
+ grouping qos-queue-wred-top {
+ description
+ "Top-level grouping for WRED-managed queues";
+
+ container wred {
+ description
+ "Top-level container for WRED data";
+
+ container config {
+ description
+ "Configuration data for WRED";
+
+ uses qos-queue-wred-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for WRED";
+
+ uses qos-queue-wred-config;
+ uses qos-queue-wred-state;
+ }
+ }
+ }
+
+ grouping qos-queue-red-config {
+ description
+ "Configuration data for queues managed with RED";
+
+ leaf minth {
+ type uint64;
+ units bytes;
+ description
+ "The mininum threshold parameter for a RED-managed queue.
+ When the average queue length is less than minth, all
+ packets are admitted to the queue.";
+ }
+
+ leaf maxth {
+ type uint64;
+ units bytes;
+ description
+ "The maximum threshold parameter for a RED-managed queue.
+ When the average queue length exceeds the maxth value, all
+ packets are dropped (or marked if ECN is enabled).";
+ }
+ }
+
+ grouping qos-queue-red-state {
+ description
+ "Operational state data for queues managed with RED";
+ }
+
+ grouping qos-queue-red-top {
+ description
+ "Top-level grouping for RED queues";
+
+ container red {
+ description
+ "Top-level container for data related to RED-managed
+ queues";
+
+ container config {
+ description
+ "Configuration data for RED queues";
+
+ uses qos-queue-red-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for RED queues";
+
+ uses qos-queue-red-config;
+ uses qos-queue-red-state;
+ }
+ }
+ }
+
+
+ grouping qos-queue-config {
+ description
+ "Configuration data for QoS egress queues";
+
+ leaf name {
+ type string;
+ description
+ "User-defined name of the queue";
+ }
+
+ leaf queue-type {
+ type identityref {
+ base oc-qos-types:QOS_QUEUE_TYPE;
+ }
+ description
+ "Sets the type of the queue";
+ }
+ }
+
+ grouping qos-queue-state {
+ description
+ "Operational state data for egress queues";
+ }
+
+ grouping qos-queue-top {
+ description
+ "Top-level grouping for queue elements";
+
+ container queues {
+ description
+ "Enclosing container for the list of queues";
+
+ list queue {
+ key "name";
+ description
+ "List of defined queues";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the queue name list key.";
+ }
+
+ container config {
+ description
+ "Configuration data for queues";
+
+ uses qos-queue-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for queues";
+
+ uses qos-queue-config;
+ uses qos-queue-state;
+ }
+
+ uses qos-queue-red-top {
+ when "../config/queue-type = 'oc-qos-types:RED'" {
+ description
+ "RED configuration is valid when the queue-type
+ is set accordingly.";
+ }
+ }
+ uses qos-queue-wred-top {
+ when "../config/queue-type = 'oc-qos-types:WRED'" {
+ description
+ "WRED configuration is valid when the queue-type
+ is set accordingly.";
+ }
+ }
+ }
+ }
+ }
+
+ grouping qos-scheduler-output-config {
+ description
+ "Configuration data for scheduler output operations";
+
+ leaf output-type {
+ type enumeration {
+ enum SCHEDULER {
+ description
+ "Scheduler output is a child scheduler, e.g. to
+ implement hierarchical schedulers.";
+ }
+ enum FWD_GROUP {
+ description
+ "Scheduler output is a forwarding group, e.g., when
+ performing ingress scheduling before packets traverse
+ a fabric to be processed by an egress forwarding
+ complex.";
+ }
+ enum INTERFACE {
+ description
+ "Scheduler output is an interface for forwarding.";
+ }
+ }
+ description
+ "Describes the type of output sink for the scheduler.";
+ }
+
+ leaf child-scheduler {
+ // TODO: consider whether both child (output) and parent
+ // (input) references are needed; consider whether child
+ // reference should separate in-profile and out-of-profile
+ type leafref {
+ // current loc:
+ // /qos/scheduler-policies/scheduler-policy/schedulers/scheduler/
+ // output/config/child-scheduler
+ path "../../../../../../../scheduler-policies/scheduler-policy/" +
+ "config/name";
+ }
+ when "../output-type = 'SCHEDULER'" {
+ description
+ "The child-scheduler leaf is valid only when
+ the output type of the scheduler is a child scheduler";
+ }
+ description
+ "When the scheduler output type is a child scheduler,
+ this leaf provides a reference to the downstream
+ scheduler.";
+ }
+
+ leaf output-fwd-group {
+ type leafref {
+ path "../../../../../../../forwarding-groups/forwarding-group" +
+ "/config/name";
+ }
+ when "../output-type = 'FWD_GROUP'" {
+ description
+ "The output-fwd-group leaf is valid only when
+ the output type of the scheduler is a forwarding group";
+ }
+ description
+ "When the scheduler output type is a forwarding group,
+ this leaf provides a reference to the forwarding group.";
+ }
+ }
+
+ grouping qos-scheduler-output-state {
+ description
+ "Operational state data for scheduler output";
+ }
+
+ grouping qos-scheduler-output-top {
+ description
+ "Top-level grouping for data related to scheduler output";
+
+ container output {
+ description
+ "Top-level container for scheduler output data";
+
+ container config {
+ description
+ "Configuration data for scheduler output";
+
+ uses qos-scheduler-output-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for scheduler output";
+
+ uses qos-scheduler-output-config;
+ uses qos-scheduler-output-state;
+ }
+ }
+ }
+
+ grouping qos-scheduler-inputs-config {
+ description
+ "Configuration data for scheduler input sources";
+
+ leaf id {
+ type string;
+ description
+ "User-defined identifier for the scheduler input";
+ }
+
+ leaf input-type {
+ type enumeration {
+ enum QUEUE {
+ description
+ "Input is a defined queue.";
+ }
+ enum IN_PROFILE {
+ description
+ "Input is in-profile traffic from a parent scheduler/
+ shaper";
+ }
+ enum OUT_PROFILE {
+ description
+ "Input is out-of-profile traffic from a parent
+ scheduler/shaper";
+ }
+ }
+ description
+ "Describes the type of input source for the scheduler";
+ }
+
+ leaf queue {
+ type leafref {
+ // current loc: /qos/scheduler-policies/scheduler-policy/schedulers/
+ // scheduler/inputs/input/config/queue
+ path "../../../../../../../../queues/queue/name";
+ }
+ when "../input-type = 'QUEUE'" {
+ description
+ "The queue leaf is valid only when
+ the input type of the scheduler is a queue";
+ }
+ description
+ "Reference to a queue that is an input source for the
+ scheduler";
+ }
+
+ leaf weight {
+ type uint64;
+ description
+ "For priority schedulers, this indicates the priority of
+ the corresponding input. Higher values indicate higher
+ priority. For weighted round-robin schedulers, this leaf
+ indicates the weight of the corresponding input.";
+ }
+ }
+
+ grouping qos-scheduler-inputs-state {
+ description
+ "Operational state data for scheduler input sources";
+ }
+
+ grouping qos-scheduler-inputs-top {
+ description
+ "Top-level grouping for defining inputs to a scheduler.";
+
+ container inputs {
+ description
+ "Enclosing container ";
+
+ list input {
+ key "id";
+ description
+ "List of input sources for the scheduler.";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "Reference to list key";
+ }
+
+ container config {
+ description
+ "Configuration data for scheduler input sources";
+
+ uses qos-scheduler-inputs-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for scheduler input sources";
+
+ uses qos-scheduler-inputs-config;
+ uses qos-scheduler-inputs-state;
+ }
+ }
+ }
+ }
+
+ grouping qos-scheduler-1r2c-config {
+ description
+ "Configuration data for 1 rate, 2 color scheduler.";
+
+ leaf cir {
+ type uint64;
+ units bps;
+ description
+ "Committed information rate for the single-rate token
+ bucket scheduler. This value represents the rate at which
+ tokens are added to the bucket.";
+ }
+
+ leaf cir-pct {
+ type oc-types:percentage;
+ description
+ "Committed information rate for the single-rate token
+ bucket scheduler. This value represents the rate at which
+ tokens are added to the bucket. It is expressed as a
+ percentage of the total bandwidth allocated to the
+ context in which the scheduler is referenced.";
+ }
+
+ leaf cir-pct-remaining {
+ type oc-types:percentage;
+ description
+ "Committed information rate for the single-rate token
+ bucket scheduler. This value represents the rate at which
+ tokens are added to the bucket. It is expressed as a
+ percentage of the unallocated bandwidth available in the
+ context in which the scheduled is referenced.";
+ }
+
+ leaf bc {
+ type uint32;
+ units bytes;
+ description
+ "Committed burst size for the single-rate token bucket
+ scheduler. This value represents the depth of the token
+ bucket.";
+ }
+
+ leaf queuing-behavior {
+ type oc-qos-types:queue-behavior;
+ description
+ "The type of scheduler that is being configured.";
+ }
+
+ // TODO(robjs): Add when statements to these parameters when the
+ // types of scheduler are agreed through review.
+ leaf max-queue-depth-bytes {
+ type uint32;
+ units bytes;
+ description
+ "When the scheduler is specified to be a shaper - the
+ maximum depth of the queue in bytes is the value
+ specified by this leaf.";
+ }
+
+ leaf max-queue-depth-packets {
+ type uint32;
+ units packets;
+ description
+ "When the scheduler is specified to be a shaper - the
+ maximum depth of the queue in packets is the value
+ specified by this leaf.";
+ }
+
+ leaf max-queue-depth-percent {
+ type oc-types:percentage;
+ description
+ "The queue depth specified as a percentage of the total
+ available buffer that is avaialble.";
+ }
+ }
+
+ grouping qos-scheduler-1r2c-top {
+ description
+ "Top-level grouping for 1 rate, 2 color shapers";
+
+ container one-rate-two-color {
+ description
+ "Top-level container for data related to a 1 rate, 2 color
+ shaper.";
+
+ container config {
+ description
+ "Configuration data for 1 rate, 2 color shapers";
+
+ uses qos-scheduler-1r2c-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for 1 rate, 2 color shapers";
+
+ uses qos-scheduler-1r2c-config;
+ }
+
+ container conform-action {
+ description
+ "Action to be applied to packets that are scheduled within the
+ CIR of the one-rate, two-colour scheduler. Packets that receive
+ a token from the in-CIR bucket are said to be conforming and
+ have all of the specified actions applied.";
+
+ container config {
+ description
+ "Configuration parameters relating to conforming packets for the
+ 1r2c scheduler.";
+
+ uses qos-common-remark-actions-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to conforming packets
+ for the 1r2c scheduler.";
+
+ uses qos-common-remark-actions-config;
+ }
+ }
+
+ container exceed-action {
+ description
+ "Action to be applied to packets that are scheduled above the CIR
+ of the one-rate, two-colour shaper. Packets that do not receive a
+ token from the in-CIR bucket are said to be exceeding, and have
+ all of the specified actions applied.";
+
+ container config {
+ description
+ "Configuration parameters relating to exceeding packets for
+ the 1r2c scheduler.";
+
+ uses qos-common-remark-actions-config;
+ uses qos-common-scheduler-actions-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to exceeding
+ packets for the 1r2c scheduler.";
+
+ uses qos-common-remark-actions-config;
+ uses qos-common-scheduler-actions-config;
+ }
+ }
+ }
+ }
+
+ grouping qos-scheduler-2r3c-config {
+ description
+ "Configuration data for 2 rate, 3 color policer";
+
+ leaf cir {
+ type uint64;
+ units bps;
+ description
+ "Committed information rate for the dual-rate token
+ bucket policer. This value represents the rate at which
+ tokens are added to the primary bucket.";
+ }
+
+ leaf cir-pct {
+ type oc-types:percentage;
+ description
+ "Committed information rate for the dual-rate token bucket
+ policer. This value represents the rate at which tokens
+ are added to the primary bucket. It is expressed as a
+ percentage of the total bandwidth available within the
+ context the scheduler is instantiated.";
+ }
+
+ leaf cir-pct-remaining {
+ type oc-types:percentage;
+ description
+ "Committed information rate for the dual-rate token
+ bucket policer. This value represents the rate at which
+ tokens are added to the primary bucket. It is expressed
+ as a percentage of the remaining bandwidth within the
+ context the scheduler is instantiated.";
+ }
+
+ leaf pir {
+ type uint64;
+ units bps;
+ description
+ "Peak information rate for the dual-rate token bucket
+ policer. This value represents the rate at which tokens
+ are added to the secondary bucket.";
+ }
+
+ leaf pir-pct {
+ type oc-types:percentage;
+ description
+ "Peak information rate for the dual-rate token bucket
+ policer. This value represents the rate at which tokens
+ are added to the secondary bucket. The value is expressed
+ as a percentage of the total bandwidth available in the
+ context in which the scheduler is instantiated.";
+ }
+
+ leaf pir-pct-remaining {
+ type oc-types:percentage;
+ description
+ "Peak information rate for the dual-rate token
+ bucket policer. This value represents the rate at which
+ tokens are added to the secondary bucket. It is expressed
+ as a percentage of the remaining bandwidth within the
+ context the scheduler is instantiated.";
+ }
+
+ leaf bc {
+ type uint32;
+ units bytes;
+ description
+ "Committed burst size for the dual-rate token bucket
+ policer. This value represents the depth of the token
+ bucket.";
+ }
+
+ leaf be {
+ type uint32;
+ units bytes;
+ description
+ "Excess burst size for the dual-rate token bucket policer.
+ This value represents the depth of the secondary bucket.";
+ }
+ }
+
+ grouping qos-scheduler-2r3c-top {
+ description
+ "Top-level grouping for 2 rate, 3 color policers..";
+
+ container two-rate-three-color {
+ description
+ "Top-level container for data for a 2 rate, 3 color policer.";
+
+ container config {
+ description
+ "Configuration data for 2 rate, 3 color policers.";
+
+ uses qos-scheduler-2r3c-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for 2 rate, 3 color policers.";
+
+ uses qos-scheduler-2r3c-config;
+ }
+
+ container conform-action {
+ description
+ "Action to be applied to the packets that are scheduled
+ within the CIR of the policer. All packets that receive
+ a token from this bucket have all actions specified
+ applied to them";
+
+ container config {
+ description
+ "Configuration parameters for the conform action of a
+ 2r3c policer.";
+ uses qos-common-remark-actions-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the conform
+ action of a 2r3c policer.";
+ uses qos-common-remark-actions-config;
+ }
+ }
+
+ container exceed-action {
+ description
+ "Action to be applied to the packets that are scheduled
+ within the PIR of the policer. Packets that receive a
+ token from within the PIR allocation have all the
+ specified actions applied to them";
+
+ container config {
+ description
+ "Configuration parameters relating to the action
+ applied to exceeding packets.";
+
+ uses qos-common-remark-actions-config;
+ uses qos-common-scheduler-actions-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the action
+ applied to exceeding packets.";
+
+ uses qos-common-remark-actions-config;
+ uses qos-common-scheduler-actions-config;
+ }
+ }
+
+ container violate-action {
+ description
+ "Action to be applied to the packets that are scheduled
+ above the PIR of the policer. Packets that do not receive
+ a token from either bucket have all specified actions
+ applied to them.";
+
+ container config {
+ description
+ "Configuration parameters relating to the action
+ applied to violating packets.";
+
+ uses qos-common-remark-actions-config;
+ uses qos-common-scheduler-actions-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the action
+ applied to violating packets.";
+
+ uses qos-common-remark-actions-config;
+ uses qos-common-scheduler-actions-config;
+ }
+ }
+ }
+ }
+
+ grouping qos-scheduler-config {
+ description
+ "Configuration data for QoS schedulers";
+
+ leaf sequence {
+ type uint32;
+ description
+ "Sequence number for the scheduler within the scheduler
+ policy. Schedulers are processed from lowest sequence
+ to highest.";
+ }
+
+ leaf type {
+ type identityref {
+ base oc-qos-types:QOS_SCHEDULER_TYPE;
+ }
+ description
+ "Sets the type of scheduler, i.e. the scheduling algorithm
+ used to serve inputs.";
+ }
+
+ leaf priority {
+ type enumeration {
+ enum STRICT {
+ description
+ "This scheduler term is considered as a strict priority
+ term - such that packets that arrive in the queue are
+ immediately serviced.";
+ }
+ }
+ description
+ "Priority of the scheduler within the scheduler policy.";
+ }
+ }
+
+ grouping qos-scheduler-state {
+ description
+ "Operational state data for QoS schedulers";
+ }
+
+ grouping qos-scheduler-policy-config {
+ description
+ "Configuration parameters relating to a scheduler policy";
+
+ leaf name {
+ type string;
+ description
+ "Name for the scheduler policy.";
+ }
+ }
+
+ grouping qos-scheduler-top {
+ description
+ "Top-level grouping for the set of defined QoS schedulers";
+
+ container scheduler-policies {
+ description
+ "Enclosing container for the list of configured scheduler policies.";
+
+ list scheduler-policy {
+ key "name";
+
+ description
+ "List of scheduler policies. A scheduler policy is a set of schedulers
+ that are to be applied together. Each scheduler within a scheduler
+ policy takes an input, and outputs it according to a scheduling
+ discipline that is specified within it. The schedulers consume
+ resources according to the specification that is provided - which
+ may be absolute resource limits, or relative.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the name of the scheduler policy";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to a scheduler policy.";
+ uses qos-scheduler-policy-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to a scheduler policy.";
+ uses qos-scheduler-policy-config;
+ }
+
+ container schedulers {
+ description
+ "Schedulers within the scheduler policy.";
+
+ list scheduler {
+ key "sequence";
+ description
+ "List of defined QoS traffic schedulers.";
+
+ leaf sequence {
+ type leafref {
+ path "../config/sequence";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container config {
+ description
+ "Configuration data for QoS schedulers";
+
+ uses qos-scheduler-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for QoS schedulers";
+
+ uses qos-scheduler-config;
+ uses qos-scheduler-state;
+ }
+
+ uses qos-scheduler-inputs-top;
+ uses qos-scheduler-output-top;
+ uses qos-scheduler-1r2c-top;
+ uses qos-scheduler-2r3c-top;
+ }
+ }
+ }
+ }
+ }
+
+ grouping qos-common-remark-actions {
+ description
+ "Common grouping specifying actions related to re-marking
+ packets";
+
+ container config {
+ description
+ "Configuration parameters relating to remarking packets.";
+ uses qos-common-remark-actions-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to remarking packets.";
+ uses qos-common-remark-actions-config;
+ }
+ }
+
+ grouping qos-common-scheduler-actions-config {
+ description
+ "Configuration data for common actions of a QoS scheduler.";
+
+ leaf drop {
+ type boolean;
+ description
+ "If set to true, packets within this context are dropped.";
+ }
+ }
+
+ grouping qos-common-remark-actions-config {
+ description
+ "Configuration data for QoS re-marking actions";
+
+ leaf set-dscp {
+ type uint8;
+ description
+ "Sets the 6-bit DSCP (differentiated services code point)
+ value in the IP packet header.";
+ reference
+ "RFC 2474 - Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers";
+ }
+
+ leaf set-dot1p {
+ type uint8;
+ description
+ "Sets the 3-bit class-of-service value in the
+ Ethernet packet header for 802.1Q VLAN-tagged packets,
+ also known as PCP (priority code point).";
+ reference
+ "IEEE 802.1Q-2014 - IEEE Standard for Local and metropolitan
+ area networks--Bridges and Bridged Networks";
+ }
+
+ leaf set-mpls-tc {
+ type uint8;
+ description
+ "Sets the 3-bit traffic class value (also referred to as EXP
+ or CoS) in MPLS packets.";
+ reference
+ "RFC 3270 - Multi-Protocol Label Switching (MPLS) Support of
+ Differentiated Services";
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-qos-interfaces.yang b/src/plugins/yang/openconfig/openconfig-qos-interfaces.yang
new file mode 100644
index 0000000..ae356a9
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-qos-interfaces.yang
@@ -0,0 +1,660 @@
+submodule openconfig-qos-interfaces {
+
+ belongs-to openconfig-qos {
+ prefix "oc-qos";
+ }
+
+ // import openconfig-qos-elements { prefix oc-qos; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-yang-types { prefix oc-yang; }
+
+ include openconfig-qos-elements;
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This submodule defines data related to quality-of-service
+ configuration and operational state associated with
+ interfaces.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2016-12-16" {
+ description
+ "Fix incorrect interface-ref placement";
+ reference "0.2.0";
+ }
+
+ revision "2016-06-03" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ grouping qos-interface-classifier-match-config {
+ description
+ "Configuration data for match terms in the classifier
+ associated with an interface";
+
+ leaf id {
+ type leafref {
+ // Current location:
+ // /qos/interfaces/interface/input/classifers/classifier/
+ // terms/term/config/id
+ path "../../../../../../../../../classifiers/" +
+ "classifier[name=current()/../../../../config/name]/" +
+ "terms/term/config/id";
+
+ }
+ description
+ "Reference to match terms in the classifier";
+ }
+ }
+
+ grouping qos-interface-classifier-match-state {
+ description
+ "Operational state data for match terms in the classifier
+ associated with an interface";
+
+ leaf matched-packets {
+ type oc-yang:counter64;
+ description
+ "Count of the number of packets matching this classifier
+ match term on the interface.";
+ }
+
+ leaf matched-octets {
+ type oc-yang:counter64;
+ description
+ "Count of the number of octets (bytes) matching this
+ classifier match term on the interface.";
+ }
+
+ }
+
+ grouping qos-interface-classifier-match-top {
+ description
+ "Top-level grouping for match terms in the classifier
+ associated with an interface";
+
+ container terms {
+ description
+ "Enclosing container for the list of match terms in the
+ classifier";
+
+ list term {
+ key "id";
+ description
+ "List of match terms in the classifier associated with the
+ interface";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "Reference to match term id list key";
+ }
+
+ container config {
+ description
+ "Configuration data for match terms in the classifier
+ associated with an interface";
+
+ uses qos-interface-classifier-match-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for match terms in the classifier
+ associated with an interface";
+
+ uses qos-interface-classifier-match-config;
+ uses qos-interface-classifier-match-state;
+ }
+ }
+ }
+ }
+
+ grouping qos-interface-classifier-top {
+ description
+ "Top-level grouping for a QoS classifier associated with an
+ interface";
+
+ container classifers {
+ description
+ "Classifiers to be applied to the interface.";
+
+ list classifier {
+ key "type";
+
+ description
+ "A list of classifiers that should be applied to the interface";
+
+ leaf type {
+ type leafref {
+ path "../config/type";
+ }
+ description
+ "Reference to the classifier name.";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the list of classifiers.";
+ uses qos-interface-classifers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for the list of classifiers.";
+ uses qos-interface-classifers-config;
+ }
+
+ uses qos-interface-classifier-match-top;
+ }
+ }
+ }
+
+ grouping qos-interface-classifers-config {
+ description
+ "Configuration parameters for the list of classifiers";
+
+ leaf name {
+ type leafref {
+ // current loc: /qos/interfaces/interface/input/classifiers/
+ // classifier/config/name
+ path "../../../../../../../classifiers/classifier/config/name";
+ }
+ description
+ "Reference to the classifier to be applied to ingress traffic on
+ the interface";
+ }
+
+ leaf type {
+ type enumeration {
+ enum IPV4 {
+ description
+ "Classifier matches IPv4 packets.";
+ value 4;
+ }
+ enum IPV6 {
+ description
+ "Classifier matches IPv6 packets.";
+ value 6;
+ }
+ enum MPLS {
+ description
+ "Classifier matches MPLS packets.";
+ }
+ }
+ description
+ "Type of packets matched by the classifier.";
+ }
+ }
+
+ grouping qos-interface-queue-config {
+ description
+ "Configuration data for the queue associated with the
+ interface";
+
+ leaf name {
+ // TODO(robjs): Previously we proposed that the queue name here is
+ // only a queue that has been configured. However, in some cases we
+ // may want to have queues that have not been configured exist.
+ //type leafref {
+ // path "../../../../../../queues/queue/config/name";
+ //}
+ type string;
+ description
+ "Reference to the queue associated with this interface.
+ A queue may be explicitly configured, or implicitly created
+ by the system based on default queues that are instantiated
+ by a hardware component, or are assumed to be default on
+ the system.";
+ }
+ }
+
+ grouping qos-interface-queue-state {
+ description
+ "Operational state data for the queue associated with the
+ interface";
+
+ leaf max-queue-len {
+ type oc-yang:counter64;
+ units bytes;
+ description
+ "Maximum observed queue length";
+ }
+
+ leaf avg-queue-len {
+ type oc-yang:counter64;
+ units bytes;
+ description
+ "Average observed queue length";
+
+ }
+
+ leaf transmit-pkts {
+ type oc-yang:counter64;
+ description
+ "Number of packets transmitted by this queue";
+ }
+
+ leaf transmit-octets {
+ type oc-yang:counter64;
+ description
+ "Number of octets trasmitted by this queue";
+ }
+
+ leaf dropped-pkts {
+ type oc-yang:counter64;
+ description
+ "Number of packets dropped by the queue due to overrun";
+ }
+ }
+
+ grouping qos-interface-queue-top {
+ description
+ "Top-level grouping for the queue associated with the
+ interface";
+
+ container queues {
+ description
+ "Surrounding container for a list of queues that are
+ instantiated on an interface.";
+
+ list queue {
+ key "name";
+
+ description
+ "Top-level container for the queue associated with this
+ interface";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the name of the queue
+ instantiated on the interface.";
+ }
+
+ container config {
+ description
+ "Configuration data for the queue associated with the
+ interface";
+
+ uses qos-interface-queue-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for the queue associated with the
+ interface";
+
+ uses qos-interface-queue-config;
+ uses qos-interface-queue-state;
+ }
+ }
+ }
+ }
+
+ grouping qos-interface-voqs-top {
+ description
+ "Structural grouping of virtual-output-queue operational state
+ for an interface.";
+
+ container virtual-output-queues {
+ description
+ "Surrounding container for the list of egress interfaces
+ for which virtual output queues are instantiated on this
+ interface.";
+
+ list voq-interface {
+ key "name";
+
+ description
+ "List of egress interfaces for which a virtual output
+ queue is instantiated at this interface.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Name used to refer to the egress interface.";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the interface
+ for which the VOQs are instantiated.";
+ uses qos-voqs-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the interface
+ for which the VOQs are instantiated.";
+ uses qos-voqs-config;
+ }
+
+ uses qos-interface-queue-top;
+ }
+ }
+ }
+
+ grouping qos-voqs-config {
+ description
+ "Configuration parameters relating to an egress interface for which
+ VOQs are established on an interface.";
+
+ leaf name {
+ type string;
+ description
+ "Name used to refer to the egress interface.";
+ }
+ }
+
+ grouping qos-interface-scheduler-policy-config {
+ description
+ "Configuration data for schedulers associated with
+ the interface";
+
+ leaf name {
+ type leafref {
+ // current loc:
+ // /qos/interfaces/interface/input/schedulers/scheduler/config/name
+ path "../../../../../../scheduler-policies/scheduler-policy/" +
+ "config/name";
+ }
+ description
+ "The scheduler policy to be applied to traffic on this interface.";
+ }
+ }
+
+ grouping qos-interface-scheduler-state {
+ description
+ "Operational state data for a scheduler within
+ a scheduler group applied to an interface.";
+
+ leaf sequence {
+ type leafref {
+ // current loc: /qos/interfaces/interface/input/scheduler-policy/
+ // schedulers/scheduler/state/sequence
+ path "../../../../../../../../scheduler-policies/" +
+ "scheduler-policy[name=current()/../../../../config/name]" +
+ "/schedulers/scheduler/config/sequence";
+ }
+ description
+ "Reference to the sequence ID of the scheduler within
+ the current scheduler policy.";
+ }
+
+ uses qos-scheduler-common-state;
+ }
+
+ grouping qos-scheduler-common-state {
+ description
+ "Common definitions of counters used in schedulers.";
+
+ leaf conforming-pkts {
+ type oc-yang:counter64;
+ description
+ "The number of packets that were considered conforming by
+ the scheduler.";
+ }
+
+ leaf conforming-octets {
+ type oc-yang:counter64;
+ description
+ "The number of octets in packets that were considered
+ conforming by the scheduler.";
+ }
+
+ leaf exceeding-pkts {
+ type oc-yang:counter64;
+ description
+ "The number of packets that were considered exceeding by
+ the scheduler.";
+ }
+
+ leaf exceeding-octets {
+ type oc-yang:counter64;
+ description
+ "The number of octets in packets that were considered
+ exceeding by the scheduler.";
+ }
+
+ leaf violating-pkts {
+ type oc-yang:counter64;
+ description
+ "The number of packets that were considered violating by
+ the policer.";
+ }
+
+ leaf violating-octets {
+ type oc-yang:counter64;
+ description
+ "The number of octets in packets that were considered
+ violating by the policer.";
+ }
+ }
+
+ grouping qos-interface-scheduler-top {
+ description
+ "Top-level grouping ";
+
+ container scheduler-policy {
+ description
+ "Scheduler policy associated with the interface.";
+
+ container config {
+ description
+ "Configuration parameters relating to a scheduler policy on
+ an interface.";
+ uses qos-interface-scheduler-policy-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to a scheduler policy
+ on an interface.";
+ uses qos-interface-scheduler-policy-config;
+ }
+
+ container schedulers {
+ config false;
+ description
+ "Schedulers within the applied scheduler-policy.";
+
+ list scheduler {
+ key "sequence";
+ description
+ "List of the schedulers that are part of the scheduler-policy
+ specified.";
+
+ leaf sequence {
+ type leafref {
+ path "../state/sequence";
+ }
+ description
+ "Reference to the sequence ID for the scheduler.";
+ }
+
+ container state {
+ description
+ "Operational state parameters relating to the scheduler
+ policy.";
+
+ uses qos-interface-scheduler-state;
+ }
+ }
+ }
+ }
+ }
+
+ grouping qos-interfaces-config {
+ description
+ "Configuration data for interfaces referenced in the QoS
+ model";
+
+ leaf interface-id {
+ type string;
+ description
+ "Identifier for the interface.";
+ }
+ }
+
+ grouping qos-interfaces-state {
+ description
+ "Operational state data for interfaces referenced in the QoS
+ model";
+
+ // definitions per-interface counters for QoS
+ }
+
+ grouping qos-interface-input-config {
+ description
+ "Configuration data for QoS on ingress interface";
+ }
+
+ grouping qos-interface-input-state {
+ description
+ "Operational state data for QoS on ingress interface";
+ }
+
+ grouping qos-interface-input-top {
+ description
+ "Top-level grouping for QoS on ingress interface";
+
+ container input {
+ description
+ "Top-level container for QoS data for the ingress
+ interface";
+
+ container config {
+ description
+ "Configuration data for QoS on ingress interface";
+
+ uses qos-interface-input-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for QoS on ingress interface";
+
+ uses qos-interface-input-config;
+ uses qos-interface-input-state;
+ }
+
+ uses qos-interface-classifier-top;
+ uses qos-interface-queue-top;
+ uses qos-interface-scheduler-top;
+ uses qos-interface-voqs-top;
+ }
+ }
+
+ grouping qos-interface-output-config {
+ description
+ "Configuration data for QoS on the egress interface";
+ }
+
+ grouping qos-interface-output-state {
+ description
+ "Operational state data for QoS on the egress interface";
+ }
+
+ grouping qos-interface-output-top {
+ description
+ "Top-level grouping for QoS on the egress interface";
+
+ container output {
+ description
+ "Top-level container for QoS data related to the egress
+ interface";
+
+ container config {
+ description
+ "Configuration data for QoS on the egress interface";
+
+ uses qos-interface-output-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for QoS on the egress interface";
+
+ uses qos-interface-output-config;
+ uses qos-interface-output-state;
+ }
+
+ uses oc-if:interface-ref;
+ uses qos-interface-classifier-top;
+ uses qos-interface-queue-top;
+ uses qos-interface-scheduler-top;
+ }
+ }
+
+ grouping qos-interfaces-top {
+ description
+ "Top-level grouping for interfaces referenced in the QoS
+ model";
+
+ container interfaces {
+ description
+ "Enclosing container for the list of interface references";
+
+ list interface {
+ key "interface-id";
+ description
+ "List of interfaces referenced by QoS entities.";
+
+ leaf interface-id {
+ type leafref {
+ path "../config/interface-id";
+ }
+ description
+ "Reference to the interface-id list key";
+ }
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses qos-interfaces-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data ";
+
+ uses qos-interfaces-config;
+ uses qos-interfaces-state;
+ }
+
+ uses oc-if:interface-ref;
+ uses qos-interface-input-top;
+ uses qos-interface-output-top;
+
+ }
+ }
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-qos-types.yang b/src/plugins/yang/openconfig/openconfig-qos-types.yang
new file mode 100644
index 0000000..291c557
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-qos-types.yang
@@ -0,0 +1,148 @@
+module openconfig-qos-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/qos-types";
+
+ prefix "oc-qos-types";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines types and identities used in OpenConfig
+ models related to quality-of-service (QoS)";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2016-12-16" {
+ description
+ "Fix incorrect interface-ref placement";
+ reference "0.2.0";
+ }
+
+ revision "2016-08-08" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ identity QOS_QUEUE_TYPE {
+ description
+ "Base identity for supported queue types, primarily
+ defined by their drop behavior / strategy";
+ }
+
+ identity DROP_TAIL {
+ base QOS_QUEUE_TYPE;
+ description
+ "When the queue is filled to capacity, newly arriving packets
+ are discarded until there is room in the queue to accept new
+ traffic. Packets are not differentiated, i.e., all packets
+ are treated identically.";
+ }
+
+ identity RED {
+ base QOS_QUEUE_TYPE;
+ description
+ "Queue management based on Random Early Detection (RED). RED
+ drops packets based on a drop probability that is based on the
+ average queue length, and settings of mininum and maximum
+ queue thresholds. On ECN-capable devices, packets may be
+ marked instead of dropped to signal congestion to the
+ sender.";
+ reference
+ "IETF RFC 2309 - Recommendations on Queue Management and
+ Congestion Avoidance in the Internet
+ IETF RFC 7567 - IETF Recommendations Regarding Active Queue
+ Management";
+ }
+
+ identity WRED {
+ base QOS_QUEUE_TYPE;
+ description
+ "Queue management based on a variant of RED in which the packet
+ drop probability is based on its traffic class.";
+ }
+
+ identity QOS_SCHEDULER_TYPE {
+ description
+ "Base identity to describe supported QoS scheduler types.";
+ }
+
+ identity ONE_RATE_TWO_COLOR {
+ base QOS_SCHEDULER_TYPE;
+ description
+ "Token bucket scheduler with a single rate (committed information
+ rate) and two colors (conforming and exceeding). The scheduler
+ behavior is governed by two parameters, the CIR which
+ determines the rate of token fill (bps) and the committed
+ burst size (depth of the token bucket in bytes).";
+ }
+
+ identity TWO_RATE_THREE_COLOR {
+ base QOS_SCHEDULER_TYPE;
+ description
+ "Token bucket scheduler with two buckets, one filled at the
+ committed information rate (CIR) in bps, and the second filled
+ at the peak information rate (PIR) in bps when the first
+ bucket is full. The first bucket depth is
+ the committed burst size (bytes), and the second is the
+ excess burst size (bytes). Traffic is categorized in three
+ colors as follows: traffic that falls within the
+ the CIR is conforming, traffic that is greater than the CIR
+ but less than the PIR is exceeding, and traffic that is
+ greater than PIR is violating.";
+ }
+
+ // typedef statements
+
+ typedef queue-behavior {
+ type enumeration {
+ enum SHAPE {
+ description
+ "Packets that exceed the CIR should be queued into a
+ buffer. The depth of the buffer is specified to be
+ max-queue-depth-bytes or max-queue-depth-packets.
+ Packets are subsequently scheduled from this queue
+ to the specified output. Only packets that overflow
+ the buffer have the exceed action applied to them.";
+ }
+ enum POLICE {
+ description
+ "Packets that exceed the CIR should be immediately
+ treated as exceeding the defined rate of the scheduler
+ and have the exceed action applied to them.";
+ }
+ }
+ description
+ "Type definition for different queueing behaviours that
+ are available to a scheduler.";
+ }
+
+ // grouping statements
+
+ // data definition statements
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-qos.yang b/src/plugins/yang/openconfig/openconfig-qos.yang
new file mode 100644
index 0000000..7bda3ae
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-qos.yang
@@ -0,0 +1,90 @@
+module openconfig-qos {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/qos";
+
+ prefix "oc-qos";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+
+ // include submodules
+ include openconfig-qos-interfaces;
+ include openconfig-qos-elements;
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and operational state data
+ related to network quality-of-service.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2016-12-16" {
+ description
+ "Fix incorrect interface-ref placement";
+ reference "0.2.0";
+ }
+
+ // grouping statements
+ grouping qos-config {
+ description
+ "Configuration data for global QoS";
+ }
+
+ grouping qos-state {
+ description
+ "Operational state data for global QoS";
+ }
+
+ grouping qos-top {
+ description
+ "Top-level grouping for QoS model";
+
+ container qos {
+ description
+ "Top-level container for QoS data";
+
+ container config {
+ description
+ "Configuration data for global QoS";
+
+ uses qos-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for global QoS";
+
+ uses qos-config;
+ uses qos-state;
+ }
+
+ uses qos-interfaces-top;
+ uses qos-classifier-top;
+ uses qos-forwarding-group-top;
+ uses qos-queue-top;
+ uses qos-scheduler-top;
+ }
+ }
+
+ // data definition statements
+
+ uses qos-top;
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-relay-agent.yang b/src/plugins/yang/openconfig/openconfig-relay-agent.yang
new file mode 100644
index 0000000..c0a2637
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-relay-agent.yang
@@ -0,0 +1,815 @@
+module openconfig-relay-agent {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/relay-agent";
+
+ prefix "oc-relay";
+
+ // import some basic types
+ import ietf-inet-types { prefix inet; }
+ import ietf-yang-types { prefix yang; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module describes a model for configuration and operational
+ state related to relay agents typically used for DHCP and BOOTP
+ packets. The supports both DHCP and DHCPv6 and device-wide and
+ per-interface settings.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2016-05-16" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+
+ // grouping statements
+
+ grouping agent-information-ipv4-common-config {
+ description
+ "Common configuration data for DHCP relay option";
+
+ leaf enable {
+ type boolean;
+ default false;
+ description
+ "Enable sending the DHCP option for Relay Agent information
+ -- option 82.";
+ reference
+ "RFC 3046 - DHCP Relay Agent Information Option";
+ }
+ }
+
+ grouping agent-information-ipv4-common-state {
+ description
+ "Common operational state data for DHCP relay option";
+
+ }
+
+ grouping agent-information-ipv4-global-top {
+ description
+ "Top-level grouping for agent information data at global level";
+
+ container agent-information-option {
+ description
+ "Top-level container for relay agent information option
+ data";
+
+ container config {
+ description
+ "Configuration data for the relay agent information
+ option";
+
+ uses agent-information-ipv4-common-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for agent information at global
+ level";
+
+ uses agent-information-ipv4-common-config;
+ uses agent-information-ipv4-common-state;
+ }
+ }
+ }
+
+ grouping agent-information-ipv4-interface-config {
+ description
+ "Configuration data for DCHP relay option on interfaces";
+
+ leaf circuit-id {
+ type string;
+ description
+ "Encodes an agent-local identifier of the circuit from which
+ a DHCP client-to-server packet was received. It is intended
+ for use by agents in relaying DHCP responses back to the
+ proper circuit. The circuit id is an opaque value";
+ reference
+ "RFC 3046 - DHCP Relay Agent Information Option";
+ }
+
+ leaf remote-id {
+ type string;
+ description
+ "Provides a mechanism to identify the remote host end of
+ the circuit. The remote-id should be thought of as an
+ opaque value, but must be globally unique.";
+ reference
+ "RFC 3046 - DHCP Relay Agent Information Option";
+ }
+ }
+
+ grouping agent-information-ipv4-interface-state {
+ description
+ "Operational state data for DHCP relay option on interfaces";
+
+ leaf sent-circuit-id {
+ type string;
+ description
+ "Reports the circuit-id sent by the system to the DHCP
+ server.";
+ }
+
+ leaf sent-remote-id {
+ type string;
+ description
+ "Reports the remote-id value sent by the system to the DHCP
+ server";
+ }
+ }
+
+ grouping agent-information-ipv4-interface-top {
+ description
+ "Top-level grouping for relay agent information option data";
+
+ container agent-information-option {
+ description
+ "Top-level container for relay agent information option
+ data";
+
+ container config {
+ description
+ "Configuration data for the relay agent information
+ option";
+
+ uses agent-information-ipv4-common-config;
+ uses agent-information-ipv4-interface-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses agent-information-ipv4-common-config;
+ uses agent-information-ipv4-interface-config;
+ uses agent-information-ipv4-common-state;
+ uses agent-information-ipv4-interface-state;
+ }
+ }
+ }
+
+ grouping agent-options-ipv6-common-config {
+ description
+ "Configuration data for DHCPv6 options";
+
+ leaf enable-interface-id {
+ type boolean;
+ default false;
+ description
+ "Enables DHCPv6 OPTION_INTERFACE_ID (18) to identify the
+ interface on which the client message was received.";
+ reference
+ "IETF RFC 3315 - Dynamic Host Configuration Protocol for
+ IPv6 (DHCPv6)";
+ }
+
+ leaf enable-remote-id {
+ type boolean;
+ default false;
+ description
+ "Sets DHCPv6 OPTION_REMOTE_ID (37). This option is the
+ DHCPv6 equivalent for the IPv4 (DHCPv4) Relay Agent Option's
+ Remote-ID suboption as specified in RFC 3046. The remote-id
+ field may be used to encode a user name, remote IP address,
+ interface/port identifier, etc.";
+ reference
+ "IETF RFC 4649 - Dynamic Host Configuration Protocol for
+ IPv6 (DHCPv6) Relay Agent Remote-ID Option";
+ }
+ }
+
+ grouping agent-options-ipv6-common-state {
+ description
+ "Operational state data for DHCPv6 options";
+ }
+
+ grouping agent-options-ipv6-interface-config {
+ description
+ "Configuration data for DHCPv6 options";
+
+ leaf interface-id {
+ type string;
+ description
+ "Sets DHCPv6 OPTION_INTERFACE_ID (18) to identify the
+ interface on which the client message was received.";
+ reference
+ "IETF RFC 3315 - Dynamic Host Configuration Protocol for
+ IPv6 (DHCPv6)";
+ }
+
+ leaf remote-id {
+ type string;
+ description
+ "Sets DHCPv6 OPTION_REMOTE_ID (37). This option is the
+ DHCPv6 equivalent for the IPv4 (DHCPv4) Relay Agent Option's
+ Remote-ID suboption as specified in RFC 3046. The remote-id
+ field may be used to encode a user name, remote IP address,
+ interface/port identifier, etc.";
+ reference
+ "IETF RFC 4649 - Dynamic Host Configuration Protocol for
+ IPv6 (DHCPv6) Relay Agent Remote-ID Option";
+ }
+ }
+
+ grouping agent-options-ipv6-interface-state {
+ description
+ "Operational state data for DHCPv6 options";
+
+ leaf sent-interface-id {
+ type string;
+ description
+ "Reflects the DHCPv6 OPTION_INTERFACE_ID (18) sent to the
+ server by the system.";
+ reference
+ "IETF RFC 3315 - Dynamic Host Configuration Protocol for
+ IPv6 (DHCPv6)";
+ }
+
+ leaf sent-remote-id {
+ type string;
+ description
+ "Reflects the DHCPv6 OPTION_REMOTE_ID (37) sent to the
+ server by the system.";
+ reference
+ "IETF RFC 4649 - Dynamic Host Configuration Protocol for
+ IPv6 (DHCPv6) Relay Agent Remote-ID Option";
+ }
+ }
+
+ grouping agent-options-ipv6-global-top {
+ description
+ "Top-level grouping for DHCPv6 options on interfaces";
+
+ container options {
+ description
+ "Top-level container for DHCPv6 agent options on interfaces";
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses agent-options-ipv6-common-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for DHCPv6 agent option on an
+ interface";
+
+ uses agent-options-ipv6-common-config;
+ uses agent-options-ipv6-common-state;
+ }
+ }
+ }
+
+ grouping agent-options-ipv6-interface-top {
+ description
+ "Top-level grouping for DHCPv6 options on interfaces";
+
+ container options {
+ description
+ "Top-level container for DHCPv6 agent options on interfaces";
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses agent-options-ipv6-common-config;
+ uses agent-options-ipv6-interface-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for DHCPv6 agent option on an
+ interface";
+
+ uses agent-options-ipv6-common-config;
+ uses agent-options-ipv6-interface-config;
+ uses agent-options-ipv6-common-state;
+ uses agent-options-ipv6-interface-state;
+ }
+ }
+ }
+
+ grouping relay-agent-common-config {
+ description
+ "Configuration data for global level relay agent options,
+ common across address families";
+
+ leaf enable-relay-agent {
+ type boolean;
+ default false;
+ description
+ "Enables DHCP/BOOTP relay agent on all interfaces";
+ }
+ }
+
+ grouping relay-agent-common-state {
+ description
+ "Operational state data for global level relay agent, common
+ across address families";
+ }
+
+ grouping relay-agent-ipv4-config {
+ description
+ "Configuration data for DHCPv4 relay agents";
+
+ uses relay-agent-common-config;
+ }
+
+ grouping relay-agent-ipv4-state {
+ description
+ "Configuration data for DHCPv4 relay agents";
+
+ uses relay-agent-common-state;
+ }
+
+
+ grouping relay-agent-ipv4-top {
+ description
+ "Top-level grouping for global relay agent data";
+
+ container dhcp {
+ description
+ "Top-level container for global relay agent data";
+
+ container config {
+ description
+ "Configuration data for global DHCPv4";
+
+ uses relay-agent-ipv4-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data global DHCPv4";
+
+ uses relay-agent-ipv4-config;
+ uses relay-agent-ipv4-state;
+ }
+
+ uses agent-information-ipv4-global-top;
+ uses relay-agent-ipv4-interfaces-top;
+ }
+ }
+
+ grouping relay-agent-ipv6-config {
+ description
+ "Configuration data for DHCPv6 relay agents";
+
+ uses relay-agent-common-config;
+ }
+
+ grouping relay-agent-ipv6-state {
+ description
+ "Configuration data for DHCPv6 relay agents";
+
+ uses relay-agent-common-state;
+ }
+
+ grouping relay-agent-ipv6-top {
+ description
+ "Top-level grouping for global relay agent data";
+
+ container dhcpv6 {
+ description
+ "Top-level container for global relay agent data";
+
+ container config {
+ description
+ "Configuration data for global DHCPv6";
+
+ uses relay-agent-ipv6-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data global DHCPv6";
+
+ uses relay-agent-ipv6-config;
+ uses relay-agent-ipv6-state;
+ }
+
+ uses agent-options-ipv6-global-top;
+ uses relay-agent-ipv6-interfaces-top;
+ }
+ }
+
+
+ grouping relay-agent-common-stats {
+ description
+ "Common DHCP / BOOTP message statistics for
+ DHCPv4 and DHCPv6";
+
+
+ leaf total-dropped {
+ type yang:counter64;
+ description
+ "Total number of DHCP packets dropped by the relay agent";
+ }
+
+ leaf invalid-opcode {
+ type yang:counter64;
+ description
+ "Number of DHCP packets dropped due to an invalid opcode";
+ }
+
+ leaf invalid-options {
+ type yang:counter64;
+ description
+ "Number of DHCP packets dropped due to an invalid option";
+ }
+ }
+
+ grouping relay-agent-ipv4-stats {
+ description
+ "DHCPv4 relay agent message statistics";
+
+ leaf bootrequest-received {
+ type yang:counter64;
+ description
+ "BOOTREQUEST messages received by the relay agent";
+ }
+
+ leaf dhcp-decline-received {
+ type yang:counter64;
+ description
+ "DHCP DECLINE messages received by the relay agent";
+ }
+
+ leaf dhcp-discover-received {
+ type yang:counter64;
+ description
+ "DHCP DISCOVER messages received by the relay agent";
+ }
+
+ leaf dhcp-inform-received {
+ type yang:counter64;
+ description
+ "DHCP INFORM messages received by the relay agent";
+ }
+
+ leaf dhcp-release-received {
+ type yang:counter64;
+ description
+ "DHCP RELEASE messages received by the relay agent";
+ }
+
+ leaf dhcp-request-received {
+ type yang:counter64;
+ description
+ "DHCP REQUEST messages received by the relay agent";
+ }
+
+ leaf bootrequest-sent {
+ type yang:counter64;
+ description
+ "BOOTREQUEST messages forwarded by the relay agent";
+ }
+
+ leaf bootreply-sent {
+ type yang:counter64;
+ description
+ "BOOTREPLY messages forwarded by the relay agent";
+ }
+
+ leaf dhcp-offer-sent {
+ type yang:counter64;
+ description
+ "DHCP OFFER messages sent by the relay agent";
+ }
+
+ leaf dhcp-ack-sent {
+ type yang:counter64;
+ description
+ "DHCP ACK messages sent by the relay agent";
+ }
+
+ leaf dhcp-nack-sent {
+ type yang:counter64;
+ description
+ "DHCP NACK messages sent by the relay agent";
+ }
+ }
+
+ grouping relay-agent-ipv6-stats {
+ description
+ "DHCPv4 relay agent message statistics";
+
+ leaf dhcpv6-solicit-received {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 SOLICIT messages received from clients
+ by the relay agent";
+ }
+
+ leaf dhcpv6-decline-received {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 DECLINE messages received from
+ clients by the relay agent";
+ }
+
+ leaf dhcpv6-request-received {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 request messages received from clients
+ by the relay agent";
+ }
+
+ leaf dhcpv6-release-received {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 release messages received from clients
+ by the relay agent";
+ }
+
+ leaf dhcpv6-confirm-received {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 confirm messages received from clients
+ by the relay agent";
+ }
+
+ leaf dhcpv6-rebind-received {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 rebind messages received from clients
+ by the relay agent";
+ }
+
+ leaf dhcpv6-info-request-received {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 information requests messages received from
+ clients by the relay agent";
+ }
+
+ leaf dhcpv6-relay-reply-received {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 relay reply messages received from servers
+ by the relay agent";
+ }
+
+ leaf dhcpv6-adverstise-sent {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 adverstise messages sent to clients by
+ the relay agent";
+ }
+
+ leaf dhcpv6-reply-sent {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 reply messages sent to clients by
+ the relay agent";
+ }
+
+ leaf dhcpv6-reconfigure-sent {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 reconfigure messages sent to clients by
+ the relay agent";
+ }
+
+ leaf dhcpv6-relay-forw-sent {
+ type yang:counter64;
+ description
+ "Number of DHCPv6 relay-forward messages sent to servers
+ by the relay agent";
+ }
+
+ }
+
+ grouping relay-agent-ipv4-interfaces-config {
+ description
+ "Configuration data for interfaces enabled for relaying";
+
+ leaf id {
+ type oc-if:interface-id;
+ description
+ "Name of the interface on which relay agent is active";
+ }
+
+ leaf enable {
+ type boolean;
+ description
+ "Enables the relay agent on the referenced interface.
+ At least one helper address should also be configured
+ for forwarding requested.";
+ }
+
+ leaf-list helper-address {
+ type inet:ip-address;
+ description
+ "List of IPv4 or IPv6 addresses of DHCP servers to which the
+ relay agent should forward DHCPv4 requests. The relay agent is
+ expected to forward DHCPv4/BOOTP requests to all listed
+ server addresses when DHCPv4 relaying is enabled globally, or
+ on the interface.";
+ }
+ }
+
+ grouping relay-agent-ipv4-interfaces-state {
+ description
+ "Operational state data for interfaces enabled for relaying";
+
+ container counters {
+ description
+ "Counters and statistics for relay agent operation.";
+
+ uses relay-agent-common-stats;
+ uses relay-agent-ipv4-stats;
+ }
+ }
+
+ grouping relay-agent-ipv4-interfaces-top {
+ description
+ "Top-level grouping for DHCPv4 relays on interfaces";
+
+ container interfaces {
+ description
+ "Enclosing container for the list of interface references.";
+
+ list interface {
+ key "id";
+ description
+ "List of interfaces on which the relay agent is
+ configured.";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "Reference to the interface list key";
+ }
+
+ container config {
+ description
+ "Configuration data for relay agent interfaces.";
+
+ uses relay-agent-ipv4-interfaces-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for relay agent interfaces.";
+
+ uses relay-agent-ipv4-interfaces-config;
+ uses relay-agent-ipv4-interfaces-state;
+ }
+
+ uses oc-if:interface-ref;
+ uses agent-information-ipv4-interface-top;
+ }
+ }
+ }
+
+ grouping relay-agent-ipv6-interfaces-config {
+ description
+ "Configuration data for interfaces enabled for relaying";
+
+ leaf id {
+ type oc-if:interface-id;
+ description
+ "Name of the interface on which relay agent is active";
+ }
+
+ leaf enable {
+ type boolean;
+ description
+ "Enables the relay agent on the referenced interface.
+ At least one helper address should also be configured
+ for forwarding requested.";
+ }
+
+ leaf-list helper-address {
+ type inet:ipv6-address;
+ description
+ "List of IPv6 addresses of DHCP servers to which the
+ relay agent should forward DHCPv6 requests. The relay agent
+ is expected to forward DHCPv4/BOOTP requests to all listed
+ server addresses when DHCPv6 relaying is enabled globally, or
+ on the interface.";
+ }
+ }
+
+ grouping relay-agent-ipv6-interfaces-state {
+ description
+ "Operational state data for interfaces enabled for relaying";
+
+ container counters {
+ description
+ "Counters and statistics for relay agent operation.";
+
+ uses relay-agent-common-stats;
+ uses relay-agent-ipv6-stats;
+ }
+ }
+
+ grouping relay-agent-ipv6-interfaces-top {
+ description
+ "Top-level grouping for DHCPv4 relays on interfaces";
+
+ container interfaces {
+ description
+ "Enclosing container for the list of interface references.";
+
+ list interface {
+ key "id";
+ description
+ "List of interfaces on which the relay agent is
+ configured.";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "Reference to the interface list key";
+ }
+
+ container config {
+ description
+ "Configuration data for relay agent interfaces.";
+
+ uses relay-agent-ipv6-interfaces-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for relay agent interfaces.";
+
+ uses relay-agent-ipv6-interfaces-config;
+ uses relay-agent-ipv6-interfaces-state;
+ }
+
+ uses oc-if:interface-ref;
+ uses agent-options-ipv6-interface-top;
+ }
+ }
+ }
+
+ grouping relay-agent-top {
+ description
+ "Top-level container for relay agent configuration and opstate
+ data.";
+
+ container relay-agent {
+ description
+ "Top level container for relay-agent configuration and
+ operational state data";
+
+ uses relay-agent-ipv4-top;
+ uses relay-agent-ipv6-top;
+ }
+ }
+
+ // data definition statements
+
+ uses relay-agent-top;
+
+ // augment statements
+
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-rib-bgp-attributes.yang b/src/plugins/yang/openconfig/openconfig-rib-bgp-attributes.yang
new file mode 100644
index 0000000..0f0512c
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-rib-bgp-attributes.yang
@@ -0,0 +1,907 @@
+submodule openconfig-rib-bgp-attributes {
+
+ belongs-to openconfig-rib-bgp {
+ prefix "oc-rib-bgp";
+ }
+
+
+ // import some basic types
+ import openconfig-bgp-types { prefix oc-bgpt; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-rib-bgp-types { prefix oc-bgprt; }
+ import openconfig-segment-routing { prefix oc-sr; }
+ import openconfig-inet-types { prefix oc-inet; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule contains common data definitions for BGP
+ attributes for use in BGP RIB tables.";
+
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2016-10-17" {
+ description
+ "OpenConfig BGP RIB refactor";
+ reference "0.3.0";
+ }
+
+
+ grouping bgp-as-path-attr-state {
+ description
+ "Data for representing BGP AS-PATH attribute";
+
+ leaf type {
+ type oc-bgpt:as-path-segment-type;
+ description
+ "The type of AS-PATH segment";
+ }
+
+ leaf-list member {
+ type oc-inet:as-number;
+ description
+ "List of the AS numbers in the AS-PATH segment";
+ }
+ }
+
+ grouping bgp-as-path-attr-top {
+ description
+ "Top-level grouping for AS-PATH attribute data";
+
+ container as-path {
+ description
+ "Enclosing container for the list of AS path segments.
+
+ In the Adj-RIB-In or Adj-RIB-Out, this list should show
+ the received or sent AS_PATH, respectively. For
+ example, if the local router is not 4-byte capable, this
+ value should consist of 2-octet ASNs or the AS_TRANS
+ (AS 23456) values received or sent in route updates.
+
+ In the Loc-RIB, this list should reflect the effective
+ AS path for the route, e.g., a 4-octet value if the
+ local router is 4-octet capable.";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)
+ RFC 6793 - BGP Support for Four-octet AS Number Space
+ RFC 5065 - Autonomous System Confederations for BGP";
+
+ list segment {
+ description
+ "Unkeyed list of AS PATH segments";
+
+ container state {
+ config false;
+ description
+ "Opstate data for AS-PATH segments";
+
+ uses bgp-as-path-attr-state;
+ }
+ }
+ }
+ }
+
+ grouping bgp-as4-path-attr-top {
+ description
+ "Top-level grouping for AS4-PATH attribute data";
+
+ container as4-path {
+ description
+ "This is the path encoded with 4-octet
+ AS numbers in the optional transitive AS4_PATH attribute.
+ This value is populated with the received or sent attribute
+ in Adj-RIB-In or Adj-RIB-Out, respectively. It should not
+ be populated in Loc-RIB since the Loc-RIB is expected to
+ store the effective AS-Path in the as-path leaf regardless
+ of being 4-octet or 2-octet.";
+ reference
+ "RFC 6793 - BGP Support for Four-octet AS Number Space";
+
+ list segment {
+ description
+ "Unkeyed list of AS PATH segments";
+
+ container state {
+ config false;
+ description
+ "Opstate data for AS-PATH segments";
+
+ uses bgp-as-path-attr-state;
+ }
+ }
+ }
+ }
+
+ grouping bgp-community-attr-state {
+ description
+ "Common definition of BGP community attributes";
+
+ leaf-list community {
+ type union {
+ type oc-bgpt:bgp-well-known-community-type;
+ type oc-bgpt:bgp-std-community-type;
+ }
+ description
+ "List of standard or well-known BGP community
+ attributes.";
+ }
+ }
+
+ grouping bgp-extended-community-attr-state {
+ description
+ "Common definition of BGP extended community attribute";
+
+ leaf-list ext-community {
+ type oc-bgpt:bgp-ext-community-recv-type;
+ description
+ "List of BGP extended community attributes. The received
+ extended community may be an explicitly modeled
+ type or unknown, represented by an 8-octet value
+ formatted according to RFC 4360.";
+ reference
+ "RFC 4360 - BGP Extended Communities Attribute";
+ }
+
+ }
+
+ grouping bgp-aggregator-attr-state {
+ description
+ "Operational state data for the BGP aggregator
+ attribute";
+
+ leaf as {
+ type oc-inet:as-number;
+ description
+ "AS number of the autnonomous system that performed the
+ aggregation.";
+ }
+
+ leaf as4 {
+ type oc-inet:as-number;
+ description
+ "AS number of the autnonomous system that performed the
+ aggregation (4-octet representation). This value is
+ populated if an upstream router is not 4-octet capable.
+ Its semantics are similar to the AS4_PATH optional
+ transitive attribute";
+ reference
+ "RFC 6793 - BGP Support for Four-octet AS Number Space";
+ }
+
+ leaf address {
+ type oc-inet:ipv4-address;
+ description
+ "IP address of the router that performed the
+ aggregation.";
+ }
+ }
+
+
+ grouping bgp-aggregator-attr-top {
+ description
+ "Common definition of the BGP aggregator attribute";
+
+ container aggregator {
+ description
+ "BGP attribute indicating the prefix has been aggregated by
+ the specified AS and router.";
+
+ container state {
+ config false;
+ description
+ "Operational state data for BGP aggregator attribute";
+
+ uses bgp-aggregator-attr-state;
+ }
+ }
+ }
+
+ grouping bgp-shared-common-attr-state {
+ description
+ "Route attributes shared across route table entries,
+ common to both LOC-Rib and Adj-RIB";
+
+
+ leaf origin {
+ type oc-bgpt:bgp-origin-attr-type;
+ description
+ "BGP attribute defining the origin of the path information.";
+ }
+
+ leaf atomic-aggregate {
+ type boolean;
+ description
+ "BGP attribute indicating that the prefix is an atomic
+ aggregate, i.e., the peer selected a less specific
+ route without selecting a more specific route that is
+ included in it.";
+ }
+
+ leaf next-hop {
+ type oc-inet:ip-address;
+ description
+ "BGP next hop attribute defining the IP address of the router
+ that should be used as the next hop to the destination";
+ }
+
+ leaf med {
+ type uint32;
+ description
+ "BGP multi-exit discriminator attribute used in BGP route
+ selection process";
+ }
+
+ leaf local-pref {
+ type uint32;
+ description
+ "BGP local preference attribute sent to internal peers to
+ indicate the degree of preference for externally learned
+ routes. The route with the highest local preference value
+ is preferred.";
+ }
+
+ leaf originator-id {
+ type oc-inet:ipv4-address;
+ description
+ "BGP attribute that provides the id as an IPv4 address
+ of the originator of the announcement.";
+ reference
+ "RFC 4456 - BGP Route Reflection: An Alternative to Full
+ Mesh Internal BGP (IBGP)";
+ }
+
+ leaf-list cluster-list {
+ type oc-inet:ipv4-address;
+ description
+ "Represents the reflection path that the route has passed.";
+ reference
+ "RFC 4456 - BGP Route Reflection: An Alternative to Full
+ Mesh Internal BGP (IBGP)";
+ }
+
+ leaf aigp {
+ type uint64;
+ description
+ "BGP path attribute representing the accumulated IGP metric
+ for the path";
+ reference
+ "RFC 7311 - The Accumulated IGP Metric Attribute for BGP";
+ }
+ }
+
+ grouping bgp-unknown-attr-flags-state {
+ description
+ "Operational state data for path attribute flags";
+
+ leaf optional {
+ type boolean;
+ description
+ "Defines whether the attribute is optional (if
+ set to true) or well-known (if set to false).
+ Set in the high-order bit of the BGP attribute
+ flags octet.";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+ }
+
+ leaf transitive {
+ type boolean;
+ description
+ "Defines whether an optional attribute is transitive
+ (if set to true) or non-transitive (if set to false). For
+ well-known attributes, the transitive flag MUST be set to
+ true. Set in the second high-order bit of the BGP attribute
+ flags octet.";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+ }
+
+ leaf partial {
+ type boolean;
+ description
+ "Defines whether the information contained in the optional
+ transitive attribute is partial (if set to true) or complete
+ (if set to false). For well-known attributes and for
+ optional non-transitive attributes, the partial flag
+ must be set to false. Set in the third high-order bit of
+ the BGP attribute flags octet.";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+ }
+
+ leaf extended {
+ type boolean;
+ description
+ "Defines whether the attribute length is one octet
+ (if set to false) or two octets (if set to true). Set in
+ the fourth high-order bit of the BGP attribute flags
+ octet.";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+ }
+ }
+
+ grouping bgp-unknown-attr-state {
+ description
+ "Operational state data for path attributes not shared
+ across route entries, common to LOC-RIB and Adj-RIB";
+
+ leaf attr-type {
+ type uint8;
+ description
+ "1-octet value encoding the attribute type code";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+ }
+
+ leaf attr-len {
+ type uint16;
+ description
+ "One or two octet attribute length field indicating the
+ length of the attribute data in octets. If the Extended
+ Length attribute flag is set, the length field is 2 octets,
+ otherwise it is 1 octet";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+ }
+
+ leaf attr-value {
+ type binary {
+ length 1..65535;
+ }
+ description
+ "Raw attribute value, not including the attribute
+ flags, type, or length. The maximum length
+ of the attribute value data is 2^16-1 per the max value
+ of the attr-len field (2 octets).";
+ reference
+ "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+ }
+ }
+
+ grouping bgp-unknown-attr-top {
+ description
+ "Unknown path attributes that are not expected to be shared
+ across route entries, common to LOC-RIB and Adj-RIB";
+
+ container unknown-attributes {
+ description
+ "Unknown path attributes that were received in the UPDATE
+ message which contained the prefix.";
+
+ list unknown-attribute {
+ key "attr-type";
+ description
+ "This list contains received attributes that are unrecognized
+ or unsupported by the local router. The list may be empty.";
+
+ leaf attr-type {
+ type leafref {
+ path "../state/attr-type";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container state {
+ description
+ "Operational state for unknown route attributes";
+
+ uses bgp-unknown-attr-flags-state;
+ uses bgp-unknown-attr-state;
+ }
+ }
+ }
+ }
+
+ grouping bgp-loc-rib-attr-state {
+ description
+ "Path attributes that are not expected to be shared across
+ route entries, specific to LOC-RIB";
+
+ }
+
+ grouping bgp-adj-rib-attr-state {
+ description
+ "Path attributes that are not expected to be shared across
+ route entries, specific to Adj-RIB";
+
+ leaf path-id {
+ type uint32;
+ description
+ "When the BGP speaker supports advertisement of multiple
+ paths for a prefix, the path identifier is used to
+ uniquely identify a route based on the combination of the
+ prefix and path id. In the Adj-RIB-In, the path-id value is
+ the value received in the update message. In the Loc-RIB,
+ if used, it should represent a locally generated path-id
+ value for the corresponding route. In Adj-RIB-Out, it
+ should be the value sent to a neighbor when add-paths is
+ used, i.e., the capability has been negotiated.";
+ reference
+ "draft-ietf-idr-add-paths - Advertisement of Multiple Paths
+ in BGP";
+ }
+ }
+
+ grouping bgp-tunnel-encapsulation-attr-top {
+ description
+ "Top-level definition of the BGP Tunnel encapsulation
+ attribute.";
+
+ container tunnel-encapsulation {
+ config false;
+ description
+ "The Tunnel Encapsulation attribute specifies a set of
+ tunnels to a remote destination. The attribute is TLV
+ based and allows description of a tunnel type, and the
+ relevant information to create the tunnel to the remote
+ destination.";
+
+ reference "RFC5512, draft-ietf-idr-tunnel-encaps";
+
+ container tunnels {
+ description
+ "Surrounding container for the set of tunnels included
+ within the tunnel encapsulation attribute.";
+
+ list tunnel {
+ key "type";
+ description
+ "List of the tunnels that are specified within the
+ attribute. Keyed on the type of tunnel that the
+ TLV describes.";
+
+ leaf type {
+ type leafref {
+ path "../state/type";
+ }
+ description
+ "Reference to the tunnel type specified within the
+ TLV's type field.";
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters of the tunnel attribute";
+
+ uses bgp-tunnel-encapsulation-attr-tunnel-state;
+ }
+
+ container subtlvs {
+ description
+ "Surrounding container for the list of sub-TLVs within
+ the tunnel encapsulation attribute.";
+
+ list subtlv {
+ key "type";
+ description
+ "List of the subTLVs that are specified within the
+ TLV instance inside the tunnel encapsulation attribute.";
+
+ leaf type {
+ type leafref {
+ path "../state/type";
+ }
+ description
+ "Reference to the sub-TLV type that is included within
+ the subTLV.";
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters of the subTLV of the tunnel attribute";
+
+ uses bgp-tunnel-encapsulation-attr-tunnel-subtlv-state;
+ }
+
+ container remote-endpoints {
+ when "../state/type = 'oc-bgprt:TUNNEL_REMOTE_ENDPOINT'" {
+ description
+ "Only allow the remote endpoint to be specified when the
+ subTLV is specified to describe remote endpoints.";
+ }
+
+ description
+ "The remote endpoints associated with the tunnel
+ described by the attribute.";
+
+ list remote-endpoint {
+ key "endpoint";
+ description
+ "List of the remote endpoints described within the TLV.";
+
+ leaf endpoint {
+ type leafref {
+ path "../state/endpoint";
+ }
+ description
+ "Reference to the IP address of the endpoint.";
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters of the remote endpoints described
+ by the attribute.";
+
+ uses bgp-tunnel-encapsulation-attr-tunnel-subtlv-endpoint-state;
+ }
+ }
+ }
+
+ container segment-lists {
+ when "../state/type = 'oc-bgprt:SRTE_SEGMENT_LIST'" {
+ description
+ "Only allow the segment lists to be specified when the sub-TLV
+ is of the relevant type.";
+ }
+
+ description
+ "Surrounding container for the list of segment lists that are
+ associated with a SR-TE Policy tunnel.";
+
+ list segment-list {
+ key "instance-id";
+
+ description
+ "List of segment lists that are specified within the
+ tunnel encapsulation attribute.";
+
+ leaf instance-id {
+ type leafref {
+ path "../state/instance-id";
+ }
+ description
+ "Reference to the instance identifier of the Segment List
+ that is included within the tunnel encapsulation
+ attribute.";
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to the Segment List within the
+ Tunnel Encapsulation attribute.";
+
+ uses bgp-tunnel-encapsulation-attr-tunnel-subtlv-segment-list-state;
+ }
+
+ container segments {
+ description
+ "Surrounding container for the list of segments within the
+ SR-TE segment list.";
+
+ list segment {
+ key "index";
+
+ description
+ "List of segments within the SR-TE segment list.";
+
+ leaf index {
+ type leafref {
+ path "../state/index";
+ }
+ description
+ "Reference to the index of the segment within the
+ segment list.";
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to the segment within
+ the segment list.";
+
+ uses bgp-tunnel-encapsulation-attr-tunnel-subtlv-segment-state;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ grouping bgp-tunnel-encapsulation-attr-tunnel-state {
+ description
+ "State parameters of the tunnel encapsulation attribute";
+
+ leaf type {
+ type identityref {
+ base "oc-bgprt:TUNNEL_ENCAPSULATION_TYPE";
+ }
+ description
+ "Type of the tunnel described within the tunnel encapsulation
+ attribute.";
+ }
+ }
+
+ grouping bgp-tunnel-encapsulation-attr-tunnel-subtlv-state {
+ description
+ "State parameters relating to subTLVs of the tunnel encapsulation
+ attribute.";
+
+ leaf type {
+ type identityref {
+ base "oc-bgprt:TUNNEL_ENCAPSULATION_SUBTLV_TYPE";
+ }
+ description
+ "Type of the sub-TLV within the tunnel encapsulation attribute";
+ }
+
+ leaf-list colors {
+ when "../type = 'oc-bgprt:TUNNEL_COLOR'" {
+ description
+ "Only allow list of colours to be specified when the sub-TLV
+ specifies colours associated with the tunnel encapsulation
+ attribute.";
+ }
+ type uint32;
+ description
+ "The colours associated with the tunnel encapsulation attribute,
+ as described by RFC5512.";
+ }
+
+ leaf preference {
+ when "../type = 'oc-bgprt:SRTE_PREFERENCE'" {
+ description
+ "Only allow the preference to be specified when the sub-TLV
+ specifies the preference associated with the tunnel encapsulation
+ attribute.";
+ }
+ type uint32;
+ default 100;
+ description
+ "The preference of the SR-TE policy described by the tunnel
+ encapsulation attribute. If unspecified, the preference
+ defaults to 100.";
+ }
+
+ leaf binding-sid {
+ when "../type = 'oc-bgprt:SRTE_BINDING_SID'" {
+ description
+ "Only allow the binding SID to be specified when the sub-TLV
+ is specified to be the of the relevant type.";
+ }
+ type oc-sr:sr-sid-type;
+ description
+ "Binding SID associated with the SR-TE policy";
+ }
+ }
+
+ grouping bgp-tunnel-encapsulation-attr-tunnel-subtlv-endpoint-state {
+ description
+ "State parameters relating to the remote endpoint described by a
+ tunnel encapsulation attribute.";
+
+ leaf as {
+ type oc-inet:as-number;
+ description
+ "The remote AS to which the IP address of the remote endpoint
+ belongs.";
+ }
+
+ leaf endpoint {
+ type oc-inet:ip-address;
+ description
+ "IP address of the remote endpoint.";
+ }
+ }
+
+ grouping bgp-tunnel-encapsulation-attr-tunnel-subtlv-segment-list-state {
+ description
+ "State parameters relating to an entry within a segment list within
+ a SR-TE policy segment list.";
+
+ leaf instance-id {
+ type uint64;
+ description
+ "Instance of the segment list within the sub-TLV";
+ }
+
+ leaf weight {
+ type uint32;
+ description
+ "The weight given to the path within the set of segment
+ lists that are included in the tunnel attribute sub-TLV.";
+ }
+ }
+
+ grouping bgp-tunnel-encapsulation-attr-tunnel-subtlv-segment-state {
+ description
+ "State parameters relating to a segment within the segment list.";
+
+ leaf index {
+ type uint64;
+ description
+ "Index of the segment within the segment list. The segments are
+ ordered in ascending order, beginning at 0.";
+ }
+
+ leaf type {
+ type enumeration {
+ enum MPLS_SID {
+ description
+ "The segment is specified as an MPLS label.";
+ value 1;
+ }
+ enum IPV6_SID {
+ description
+ "The segment is specified as an IPv6 address.";
+ value 2;
+ }
+ enum IPV4_NODE_ADDRESS {
+ description
+ "The segment is specified as an IPv4 node address with
+ optional SID.";
+ value 3;
+ }
+ enum IPV6_NODE_ADDRESS {
+ description
+ "The segment is specified as an IPv6 node address with
+ optional SID.";
+ value 4;
+ }
+ enum IPV4_LOCAL_INTF_ID {
+ description
+ "The segment is specified as an IPv4 address with a
+ local interface identifier along with an .";
+ value 5;
+ }
+ enum IPV4_LOCAL_REMOTE_ADDR {
+ description
+ "The segment is specified as an IPv4 local and remote
+ address with an optional SID.";
+ value 6;
+ }
+ enum IPV6_LOCAL_INTF_ID {
+ description
+ "The segment is specified as an IPv6 address with an
+ index, along with an optional SID.";
+ value 7;
+ }
+ enum IPV6_LOCAL_REMOTE_ADDR {
+ description
+ "The segmetn is specified as an IPv6 local and remote
+ address with an optional SID.";
+ value 8;
+ }
+ }
+ description
+ "The type of segment specified within the segment entry.";
+ }
+
+ leaf sid {
+ type oc-sr:sr-sid-type;
+ description
+ "SID value for the segment entry, specified as an MPLS label
+ or IPv6 address.";
+ }
+
+ leaf mpls-tc {
+ when "../type = 'MPLS_SID'" {
+ description
+ "The MPLS TC bits can only be specified when the segment
+ time is an MPLS label.";
+ }
+ type uint8 {
+ range "0..7";
+ }
+ description
+ "The MPLS TC bits used when the SID is specified as an MPLS
+ label. If set to zero, the receiving system specifies the
+ value of the TC bits.";
+ }
+
+ leaf mpls-bos {
+ when "../type = 'MPLS_SID'" {
+ description
+ "The MPLS BoS bit can only be specified when the segment
+ type is an MPLS label.";
+ }
+ type boolean;
+ description
+ "When this leaf is set to true the MPLS bottom-of-stack
+ (BoS) bit is set in the MPLS segment. The BoS bit should
+ always be set to zero by the sender.";
+ }
+
+ leaf mpls-ttl {
+ when "../type = 'MPLS_SID'" {
+ description
+ "The MPLS TTL can only be set when the segment type is
+ an MPLS label.";
+ }
+ type uint8;
+ description
+ "The MPLS time to live (TTL) to be set for the MPLS
+ segment. If set to 255, the receiver specifies the
+ TTL value that is used for packets sent with this
+ segment in the stack.";
+ }
+
+ leaf remote-ipv4-address {
+ when "../type = 'IPV4_NODE_ADDRESS' or ../type='../IPV4_ADDRESS_INDEX'" +
+ "or ../type='IPV4_LOCAL_INTF_ID' or " +
+ "../type='IPV4_LOCAL_REMOTE_ADDR'" {
+ description
+ "An IPv4 address can only be associated with the segment entry
+ when the type of the SID is a node address, or an IPv6 address
+ with an index.";
+ }
+ type oc-inet:ipv4-address;
+ description
+ "An IPv4 address specified as the remote node address. When the type
+ of the segment specifies only the remote address, no other addresses
+ are specified. When the type of the segment requires a local address,
+ this leaf specifies the remote IPv4 address.";
+ }
+
+ leaf local-ipv4-address {
+ when "../type = 'IPV4_LOCAL_REMOTE_ADDR'" {
+ description
+ "A local IPv4 address can only be specified when the segment is
+ specified by the local and remote IPv4 interface addresses.";
+ }
+ type oc-inet:ipv4-address;
+ description
+ "An IPv4 address of a local adjacency that is used to identify
+ the segment.";
+ }
+
+ leaf remote-ipv6-address {
+ when "../type = 'IPV6_NODE_ADDRESS' or ../type='IPV6_ADDRESS_INDEX'" +
+ "or ../type='IPV6_LOCAL_INTF_ID' or " +
+ "../type='IPV6_LOCAL_REMOTE_ADDR'" {
+ description
+ "An IPv6 address can only be specified with a segment entry
+ when the type of the SID is a node address, or an IPv6 address
+ with an index.";
+ }
+ type oc-inet:ipv6-address;
+ description
+ "An IPv6 address specified as the remote node address. When the type
+ of the segment specifies only the remote address, no other addresses
+ are specified. When the type of the segment requires a local address,
+ this leaf specifies the remote IPv6 address.";
+ }
+
+ leaf local-ipv6-address {
+ when "../type = 'IPV6_LOCAL_REMOTE_ADDR'" {
+ description
+ "A local IPv6 address can only be speciifed when the segment
+ is specified by the local and remote IPv6 interface addresses.";
+ }
+ type oc-inet:ipv6-address;
+ description
+ "An IPv6 address of a local adjacency that is used to identify the
+ segment.";
+ }
+
+ leaf local-interface-id {
+ when "../type = 'IPV4_LOCAL_INTF_ID' or ../type='IPV6_LOCAL_INTF_ID'" {
+ description
+ "A local interface identifier can only be specified when the
+ type of the segment is an IPv4 address with local interface ID,
+ or IPv6 address with local interface ID.";
+ }
+ type uint32;
+ description
+ "The local interface identifier to be utilised for the segment.";
+ reference
+ "draft-ietf-pce-segment-routing";
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-rib-bgp-ext.yang b/src/plugins/yang/openconfig/openconfig-rib-bgp-ext.yang
new file mode 100644
index 0000000..3c7cf35
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-rib-bgp-ext.yang
@@ -0,0 +1,166 @@
+module openconfig-rib-bgp-ext {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/rib/bgp-ext";
+
+ prefix "oc-bgprib-ext";
+
+ import openconfig-rib-bgp { prefix oc-bgprib; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-rib-bgp-types { prefix oc-bgpribt; }
+
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Defines additional data nodes for the OpenConfig BGP RIB model.
+ These items reflect extensions that are desirable features but
+ are not currently supported in a majority of BGP
+ implementations.";
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2016-10-17" {
+ description
+ "OpenConfig BGP RIB refactor";
+ reference "0.3.0";
+ }
+
+ revision "2016-04-11" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+
+ grouping rib-ext-route-annotations {
+ description
+ "Extended annotations for routes in the routing tables";
+
+ leaf reject-reason {
+ type union {
+ type identityref {
+ base oc-bgpribt:BGP_NOT_SELECTED_BESTPATH;
+ }
+ type identityref {
+ base oc-bgpribt:BGP_NOT_SELECTED_POLICY;
+ }
+ }
+ description
+ "Indicates the reason the route is not used, either due to
+ policy filtering or bestpath selection";
+ }
+ }
+
+ augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+ "oc-bgprib:afi-safi/oc-bgprib:ipv4-unicast/oc-bgprib:loc-rib/" +
+ "oc-bgprib:routes/oc-bgprib:route/oc-bgprib:state" {
+ description
+ "Add extended annotations to the Loc-RIB for IPv4";
+
+ uses rib-ext-route-annotations;
+ }
+
+ augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+ "oc-bgprib:afi-safi/oc-bgprib:ipv6-unicast/oc-bgprib:loc-rib/" +
+ "oc-bgprib:routes/oc-bgprib:route/oc-bgprib:state" {
+ description
+ "Add extended annotations to the Loc-RIB for IPv6";
+
+ uses rib-ext-route-annotations;
+ }
+
+ augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+ "oc-bgprib:afi-safi/oc-bgprib:ipv4-unicast/" +
+ "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+ "oc-bgprib:adj-rib-in-pre/oc-bgprib:routes/oc-bgprib:route" +
+ "/oc-bgprib:state" {
+ description
+ "Add extended annotations to Adj-RIB for IPv4";
+
+ uses rib-ext-route-annotations;
+ }
+
+ augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+ "oc-bgprib:afi-safi/oc-bgprib:ipv4-unicast/" +
+ "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+ "oc-bgprib:adj-rib-in-post/oc-bgprib:routes/oc-bgprib:route" +
+ "/oc-bgprib:state"{
+ description
+ "Add extended annotations to Adj-RIB for IPv4";
+
+ uses rib-ext-route-annotations;
+ }
+
+ augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+ "oc-bgprib:afi-safi/oc-bgprib:ipv4-unicast/" +
+ "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+ "oc-bgprib:adj-rib-out-pre/oc-bgprib:routes/oc-bgprib:route" +
+ "/oc-bgprib:state"{
+ description
+ "Add extended annotations to Adj-RIB for IPv4";
+
+ uses rib-ext-route-annotations;
+ }
+
+ augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+ "oc-bgprib:afi-safi/oc-bgprib:ipv4-unicast/" +
+ "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+ "oc-bgprib:adj-rib-out-post/oc-bgprib:routes/oc-bgprib:route" +
+ "/oc-bgprib:state"{
+ description
+ "Add extended annotations to Adj-RIB for IPv4";
+
+ uses rib-ext-route-annotations;
+ }
+
+ augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+ "oc-bgprib:afi-safi/oc-bgprib:ipv6-unicast/" +
+ "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+ "oc-bgprib:adj-rib-in-pre/oc-bgprib:routes/oc-bgprib:route" +
+ "/oc-bgprib:state"{
+ description
+ "Add extended annotations to Adj-RIB for IPv6";
+
+ uses rib-ext-route-annotations;
+ }
+
+ augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+ "oc-bgprib:afi-safi/oc-bgprib:ipv6-unicast/" +
+ "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+ "oc-bgprib:adj-rib-in-post/oc-bgprib:routes/oc-bgprib:route" +
+ "/oc-bgprib:state"{
+ description
+ "Add extended annotations to Adj-RIB for IPv6";
+
+ uses rib-ext-route-annotations;
+ }
+
+ augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+ "oc-bgprib:afi-safi/oc-bgprib:ipv6-unicast/" +
+ "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+ "oc-bgprib:adj-rib-out-pre/oc-bgprib:routes/oc-bgprib:route" +
+ "/oc-bgprib:state"{
+ description
+ "Add extended annotations to Adj-RIB for IPv6";
+
+ uses rib-ext-route-annotations;
+ }
+
+ augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+ "oc-bgprib:afi-safi/oc-bgprib:ipv6-unicast/" +
+ "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+ "oc-bgprib:adj-rib-out-post/oc-bgprib:routes/oc-bgprib:route" +
+ "/oc-bgprib:state"{
+ description
+ "Add extended annotations to Adj-RIB for IPv6";
+
+ uses rib-ext-route-annotations;
+ }
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-rib-bgp-shared-attributes.yang b/src/plugins/yang/openconfig/openconfig-rib-bgp-shared-attributes.yang
new file mode 100644
index 0000000..77a79b6
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-rib-bgp-shared-attributes.yang
@@ -0,0 +1,171 @@
+submodule openconfig-rib-bgp-shared-attributes {
+
+ belongs-to openconfig-rib-bgp {
+ prefix "oc-rib-bgp";
+ }
+
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+
+ include openconfig-rib-bgp-attributes;
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule contains structural data definitions for
+ attribute sets shared across routes.";
+
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2016-10-17" {
+ description
+ "OpenConfig BGP RIB refactor";
+ reference "0.3.0";
+ }
+
+
+ grouping attribute-sets-top {
+ description
+ "Top level grouping for list of common attribute sets";
+
+ container attr-sets {
+ description
+ "Enclosing container for the list of path attribute sets";
+
+ list attr-set {
+ key "index";
+
+ description
+ "List of path attributes that may be in use by multiple
+ routes in the table";
+
+ leaf index {
+ type leafref {
+ path "../state/index";
+ }
+ description
+ "Reference to list key";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state for common path attributes";
+
+ leaf index {
+ type uint64;
+ description
+ "System generated index for each attribute set. The
+ index is used to reference an attribute set from a
+ specific path. Multiple paths may reference the same
+ attribute set.";
+ }
+
+ uses bgp-shared-common-attr-state;
+ }
+ uses bgp-aggregator-attr-top;
+ uses bgp-as-path-attr-top;
+ uses bgp-as4-path-attr-top;
+ uses bgp-tunnel-encapsulation-attr-top;
+ }
+ }
+ }
+
+ grouping community-sets-top {
+ description
+ "Top level grouping for list of shared community attribute
+ sets";
+
+ container communities {
+ description
+ "Enclosing container for the list of community attribute
+ sets";
+
+ list community {
+ key "index";
+
+ description
+ "List of path attributes that may be in use by multiple
+ routes in the table";
+
+ leaf index {
+ type leafref {
+ path "../state/index";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state for shared BGP community attribute";
+
+ leaf index {
+ type uint64;
+ description
+ "System generated index for each attribute set. The
+ index is used to reference an attribute set from a
+ specific path. Multiple paths may reference the same
+ attribute set.";
+ }
+
+ uses bgp-community-attr-state;
+ }
+ }
+ }
+ }
+
+ grouping ext-community-sets-top {
+ description
+ "Top level grouping for list of extended community attribute
+ sets";
+
+ container ext-communities {
+ description
+ "Enclosing container for the list of extended community
+ attribute sets";
+
+ list ext-community {
+ key "index";
+
+ description
+ "List of path attributes that may be in use by multiple
+ routes in the table";
+
+ leaf index {
+ type leafref {
+ path "../state/index";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state for shared BGP extended community
+ attribute";
+
+ leaf index {
+ type uint64;
+ description
+ "System generated index for each attribute set. The
+ index is used to reference an attribute set from a
+ specific path. Multiple paths may reference the same
+ attribute set.";
+ }
+
+ uses bgp-extended-community-attr-state;
+ }
+ }
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-rib-bgp-table-attributes.yang b/src/plugins/yang/openconfig/openconfig-rib-bgp-table-attributes.yang
new file mode 100644
index 0000000..285f0a9
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-rib-bgp-table-attributes.yang
@@ -0,0 +1,113 @@
+submodule openconfig-rib-bgp-table-attributes {
+
+ belongs-to openconfig-rib-bgp {
+ prefix "oc-rib-bgp";
+ }
+
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-rib-bgp-types { prefix oc-bgpribt; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule contains common data definitions for data
+ related to a RIB entry, or RIB table.";
+
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2016-10-17" {
+ description
+ "OpenConfig BGP RIB refactor";
+ reference "0.3.0";
+ }
+
+
+
+ grouping bgp-common-route-annotations-state {
+ description
+ "Data definitions for flags and other information attached
+ to routes in both LOC-RIB and Adj-RIB";
+
+ leaf last-modified {
+ type oc-types:timeticks64;
+ description
+ "Timestamp when this path was last modified.
+
+ The value is the timestamp in seconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+
+ leaf valid-route {
+ type boolean;
+ description
+ "Indicates that the route is considered valid by the
+ local router";
+ }
+
+ leaf invalid-reason {
+ type identityref {
+ base oc-bgpribt:INVALID_ROUTE_REASON;
+ }
+ description
+ "If the route is rejected as invalid, this indicates the
+ reason.";
+ }
+
+ }
+
+ grouping bgp-loc-rib-route-annotations-state {
+ description
+ "Data definitions for information attached to routes in the
+ LOC-RIB";
+
+ // placeholder for route metadata specific to the LOC-RIB
+
+ }
+
+ grouping bgp-adj-rib-in-post-route-annotations-state {
+ description
+ "Data definitions for information attached to routes in the
+ Adj-RIB-in post-policy table";
+
+ leaf best-path {
+ type boolean;
+ description
+ "Current path was selected as the best path.";
+ }
+ }
+
+ grouping bgp-common-table-attrs-state {
+ description
+ "Common attributes attached to all routing tables";
+
+ // placeholder for metadata associated with all tables
+ }
+
+ grouping bgp-common-table-attrs-top {
+ description
+ "Operational state data for common attributes attached to
+ all routing tables";
+ // no enclosing container as this data will fit under an
+ // existing LOC-RIB container
+
+ container state {
+ config false;
+ description
+ "Operational state data for data related to the entire
+ LOC-RIB";
+
+ uses bgp-common-table-attrs-state;
+ }
+ }
+
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-rib-bgp-tables.yang b/src/plugins/yang/openconfig/openconfig-rib-bgp-tables.yang
new file mode 100644
index 0000000..f7a759d
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-rib-bgp-tables.yang
@@ -0,0 +1,883 @@
+submodule openconfig-rib-bgp-tables {
+
+ belongs-to openconfig-rib-bgp {
+ prefix "oc-rib-bgp";
+ }
+
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-policy-types { prefix oc-pol-types; }
+
+ include openconfig-rib-bgp-attributes;
+ include openconfig-rib-bgp-shared-attributes;
+ include openconfig-rib-bgp-table-attributes;
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This submodule contains structural data definitions for
+ BGP routing tables.";
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2016-10-17" {
+ description
+ "OpenConfig BGP RIB refactor";
+ reference "0.3.0";
+ }
+
+
+ grouping bgp-adj-rib-common-attr-refs {
+ description
+ "Definitions of common references to attribute sets for
+ multiple AFI-SAFIs for Adj-RIB tables";
+
+ leaf attr-index {
+ type leafref {
+ path "../../../../../../../../../../attr-sets/attr-set/" +
+ "state/index";
+ }
+ description
+ "Reference to the common attribute group for the
+ route";
+ }
+
+ leaf community-index {
+ type leafref {
+ path "../../../../../../../../../../communities/community/" +
+ "state/index";
+ }
+ description
+ "Reference to the community attribute for the route";
+ }
+
+ leaf ext-community-index {
+ type leafref {
+ path "../../../../../../../../../../ext-communities/" +
+ "ext-community/state/index";
+ }
+ description
+ "Reference to the extended community attribute for the
+ route";
+ }
+ }
+
+ grouping bgp-loc-rib-common-attr-refs {
+ description
+ "Definitions of common references to attribute sets for
+ multiple AFI-SAFIs for LOC-RIB tables";
+
+ leaf attr-index {
+ type leafref {
+ path "../../../../../../../../attr-sets/attr-set/" +
+ "state/index";
+ }
+ description
+ "Reference to the common attribute group for the
+ route";
+ }
+
+ leaf community-index {
+ type leafref {
+ path "../../../../../../../../communities/community/" +
+ "state/index";
+ }
+ description
+ "Reference to the community attribute for the route";
+ }
+
+ leaf ext-community-index {
+ type leafref {
+ path "../../../../../../../../ext-communities/" +
+ "ext-community/state/index";
+ }
+ description
+ "Reference to the extended community attribute for the
+ route";
+ }
+ }
+
+ grouping bgp-loc-rib-common-keys {
+ description
+ "Common references used in keys for IPv4 and IPv6
+ LOC-RIB entries";
+
+ leaf origin {
+ type union {
+ type oc-inet:ip-address;
+ type identityref {
+ base oc-pol-types:INSTALL_PROTOCOL_TYPE;
+ }
+ }
+ description
+ "Indicates the origin of the route. If the route is learned
+ from a neighbor, this value is the neighbor address. If
+ the route was injected or redistributed from another
+ protocol, the origin indicates the source protocol for the
+ route.";
+ }
+
+ leaf path-id {
+ type uint32;
+ default 0;
+ description
+ "If the route is learned from a neighbor, the path-id
+ corresponds to the path-id for the route in the
+ corresponding adj-rib-in-post table. If the route is
+ injected from another protocol, or the neighbor does not
+ support BGP add-paths, the path-id should be set
+ to zero, also the default value.";
+ }
+ }
+
+ grouping bgp-loc-rib-key-refs {
+ description
+ "Key references to support operational state structure for
+ the BGP LOC-RIB table";
+
+ leaf prefix {
+ type leafref {
+ path "../state/prefix";
+ }
+ description
+ "Reference to the prefix list key";
+ }
+
+ leaf origin {
+ type leafref {
+ path "../state/origin";
+ }
+ description
+ "Reference to the origin list key";
+ }
+
+ leaf path-id {
+ type leafref {
+ path "../state/path-id";
+ }
+ description
+ "Reference to the path-id list key";
+ }
+ }
+
+ grouping ipv4-loc-rib-top {
+ description
+ "Top-level grouping for IPv4 routing tables";
+
+ container loc-rib {
+ config false;
+ description
+ "Container for the IPv4 BGP LOC-RIB data";
+
+ uses bgp-common-table-attrs-top;
+
+ container routes {
+ description
+ "Enclosing container for list of routes in the routing
+ table.";
+
+ list route {
+ key "prefix origin path-id";
+
+ description
+ "List of routes in the table, keyed by the route
+ prefix, the route origin, and path-id. The route
+ origin can be either the neighbor address from which
+ the route was learned, or the source protocol that
+ injected the route. The path-id distinguishes routes
+ for the same prefix received from a neighbor (e.g.,
+ if add-paths is eanbled).";
+
+ uses bgp-loc-rib-key-refs;
+
+ container state {
+ description
+ "Operational state data for route entries in the
+ BGP LOC-RIB";
+
+ leaf prefix {
+ type oc-inet:ipv4-prefix;
+ description
+ "The IPv4 prefix corresponding to the route";
+ }
+
+ uses bgp-loc-rib-common-keys;
+ uses bgp-loc-rib-common-attr-refs;
+ uses bgp-loc-rib-attr-state;
+ uses bgp-common-route-annotations-state;
+ uses bgp-loc-rib-route-annotations-state;
+
+ }
+
+ uses bgp-unknown-attr-top;
+
+ }
+ }
+ }
+ }
+
+ grouping ipv6-loc-rib-top {
+ description
+ "Top-level grouping for IPv6 routing tables";
+
+ container loc-rib {
+ config false;
+ description
+ "Container for the IPv6 BGP LOC-RIB data";
+
+ uses bgp-common-table-attrs-top;
+
+ container routes {
+ description
+ "Enclosing container for list of routes in the routing
+ table.";
+
+ list route {
+ key "prefix origin path-id";
+
+ description
+ "List of routes in the table, keyed by the route
+ prefix, the route origin, and path-id. The route
+ origin can be either the neighbor address from which
+ the route was learned, or the source protocol that
+ injected the route. The path-id distinguishes routes
+ for the same prefix received from a neighbor (e.g.,
+ if add-paths is eanbled).";
+
+ uses bgp-loc-rib-key-refs;
+
+ container state {
+ description
+ "Operational state data for route entries in the
+ BGP LOC-RIB";
+
+ leaf prefix {
+ type oc-inet:ipv6-prefix;
+ description
+ "The IPv6 prefix corresponding to the route";
+ }
+
+ uses bgp-loc-rib-common-keys;
+ uses bgp-loc-rib-common-attr-refs;
+ uses bgp-loc-rib-attr-state;
+ uses bgp-common-route-annotations-state;
+ uses bgp-loc-rib-route-annotations-state;
+
+ }
+
+ uses bgp-unknown-attr-top;
+ }
+ }
+ }
+ }
+
+ grouping bgp-adj-rib-key-refs {
+ description
+ "Key references to support operational state structure for
+ the BGP Adj-RIB tables";
+
+ leaf prefix {
+ type leafref {
+ path "../state/prefix";
+ }
+ description
+ "Reference to the prefix list key";
+ }
+
+ leaf path-id {
+ type leafref {
+ path "../state/path-id";
+ }
+ description
+ "Reference to the path-id list key";
+ }
+ }
+
+ grouping ipv4-adj-rib-common {
+ description
+ "Common structural grouping for each IPv4 adj-RIB table";
+
+ uses bgp-common-table-attrs-top;
+
+ container routes {
+ config false;
+ description
+ "Enclosing container for list of routes in the routing
+ table.";
+
+ list route {
+ key "prefix path-id";
+
+ description
+ "List of routes in the table, keyed by a combination of
+ the route prefix and path-id to distinguish multiple
+ routes received from a neighbor for the same prefix,
+ e.g., when BGP add-paths is enabled.";
+
+ uses bgp-adj-rib-key-refs;
+
+ container state {
+ description
+ "Operational state data for BGP Adj-RIB entries";
+
+ leaf prefix {
+ type oc-inet:ipv4-prefix;
+ description
+ "Prefix for the route";
+ }
+
+ uses bgp-adj-rib-attr-state;
+ uses bgp-adj-rib-common-attr-refs;
+ uses bgp-common-route-annotations-state;
+ }
+
+ uses bgp-unknown-attr-top;
+
+ }
+ }
+ }
+
+ grouping ipv4-adj-rib-in-post {
+ description
+ "Common structural grouping for the IPv4 adj-rib-in
+ post-policy table";
+
+ uses bgp-common-table-attrs-top;
+
+ container routes {
+ config false;
+ description
+ "Enclosing container for list of routes in the routing
+ table.";
+
+ list route {
+ key "prefix path-id";
+
+ description
+ "List of routes in the table, keyed by a combination of
+ the route prefix and path-id to distinguish multiple
+ routes received from a neighbor for the same prefix,
+ e.g., when BGP add-paths is enabled.";
+
+ uses bgp-adj-rib-key-refs;
+
+ container state {
+ description
+ "Operational state data for BGP Adj-RIB entries";
+
+ leaf prefix {
+ type oc-inet:ipv4-prefix;
+ description
+ "Prefix for the route";
+ }
+
+ uses bgp-adj-rib-attr-state;
+ uses bgp-adj-rib-common-attr-refs;
+ uses bgp-common-route-annotations-state;
+ uses bgp-adj-rib-in-post-route-annotations-state;
+ }
+
+ uses bgp-unknown-attr-top;
+ }
+ }
+ }
+
+
+ grouping ipv4-adj-rib-top {
+ description
+ "Top-level grouping for Adj-RIB table";
+
+ container neighbors {
+ config false;
+ description
+ "Enclosing container for neighbor list";
+
+ list neighbor {
+ key "neighbor-address";
+ description
+ "List of neighbors (peers) of the local BGP speaker";
+
+ leaf neighbor-address {
+ type leafref {
+ path "../state/neighbor-address";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container state {
+ description
+ "Operational state for each neighbor BGP Adj-RIB";
+
+ leaf neighbor-address {
+ type oc-inet:ip-address;
+ description
+ "IP address of the BGP neighbor or peer";
+ }
+ }
+
+ container adj-rib-in-pre {
+ description
+ "Per-neighbor table containing the NLRI updates
+ received from the neighbor before any local input
+ policy rules or filters have been applied. This can
+ be considered the 'raw' updates from the neighbor.";
+
+ uses ipv4-adj-rib-common;
+
+ }
+
+ container adj-rib-in-post {
+ description
+ "Per-neighbor table containing the paths received from
+ the neighbor that are eligible for best-path selection
+ after local input policy rules have been applied.";
+
+ uses ipv4-adj-rib-in-post;
+ }
+
+ container adj-rib-out-pre {
+ description
+ "Per-neighbor table containing paths eligble for
+ sending (advertising) to the neighbor before output
+ policy rules have been applied";
+
+ uses ipv4-adj-rib-common;
+
+ }
+
+ container adj-rib-out-post {
+ description
+ "Per-neighbor table containing paths eligble for
+ sending (advertising) to the neighbor after output
+ policy rules have been applied";
+
+ uses ipv4-adj-rib-common;
+
+ }
+ }
+ }
+ }
+
+ grouping ipv6-adj-rib-common {
+ description
+ "Common structural grouping for each IPv6 adj-RIB table";
+
+ uses bgp-common-table-attrs-state;
+
+ container routes {
+ config false;
+ description
+ "Enclosing container for list of routes in the routing
+ table.";
+
+ list route {
+ key "prefix path-id";
+
+ description
+ "List of routes in the table";
+
+ uses bgp-adj-rib-key-refs;
+
+ container state {
+ description
+ "Operational state data for BGP Adj-RIB entries";
+
+ leaf prefix {
+ type oc-inet:ipv6-prefix;
+ description
+ "Prefix for the route";
+ }
+
+ uses bgp-adj-rib-attr-state;
+ uses bgp-adj-rib-common-attr-refs;
+ uses bgp-common-route-annotations-state;
+ }
+
+ uses bgp-unknown-attr-top;
+ }
+ }
+ }
+
+ grouping ipv6-adj-rib-in-post {
+ description
+ "Common structural grouping for the IPv6 adj-rib-in
+ post-policy table";
+
+ uses bgp-common-table-attrs-state;
+
+ container routes {
+ config false;
+ description
+ "Enclosing container for list of routes in the routing
+ table.";
+
+ list route {
+ key "prefix path-id";
+
+ description
+ "List of routes in the table";
+
+ uses bgp-adj-rib-key-refs;
+
+ container state {
+ description
+ "Operational state data for BGP Adj-RIB entries";
+
+ leaf prefix {
+ type oc-inet:ipv6-prefix;
+ description
+ "Prefix for the route";
+ }
+
+ uses bgp-adj-rib-attr-state;
+ uses bgp-adj-rib-common-attr-refs;
+ uses bgp-common-route-annotations-state;
+ uses bgp-adj-rib-in-post-route-annotations-state;
+ }
+
+ uses bgp-unknown-attr-top;
+ }
+ }
+ }
+
+ grouping ipv6-adj-rib-top {
+ description
+ "Top-level grouping for Adj-RIB table";
+
+ container neighbors {
+ config false;
+ description
+ "Enclosing container for neighbor list";
+
+ list neighbor {
+ key "neighbor-address";
+ description
+ "List of neighbors (peers) of the local BGP speaker";
+
+ leaf neighbor-address {
+ type leafref {
+ path "../state/neighbor-address";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container state {
+ description
+ "Operational state for each neighbor BGP Adj-RIB";
+
+ leaf neighbor-address {
+ type oc-inet:ip-address;
+ description
+ "IP address of the BGP neighbor or peer";
+ }
+ }
+
+ container adj-rib-in-pre {
+ description
+ "Per-neighbor table containing the NLRI updates
+ received from the neighbor before any local input
+ policy rules or filters have been applied. This can
+ be considered the 'raw' updates from the neighbor.";
+
+ uses ipv6-adj-rib-common;
+
+ }
+
+ container adj-rib-in-post {
+ description
+ "Per-neighbor table containing the paths received from
+ the neighbor that are eligible for best-path selection
+ after local input policy rules have been applied.";
+
+ uses ipv6-adj-rib-in-post;
+ }
+
+ container adj-rib-out-pre {
+ description
+ "Per-neighbor table containing paths eligble for
+ sending (advertising) to the neighbor before output
+ policy rules have been applied";
+
+ uses ipv6-adj-rib-common;
+
+ }
+
+ container adj-rib-out-post {
+ description
+ "Per-neighbor table containing paths eligble for
+ sending (advertising) to the neighbor after output
+ policy rules have been applied";
+
+ uses ipv6-adj-rib-common;
+
+ }
+ }
+ }
+ }
+
+ grouping ipvX-srte-policy-adjrib-top {
+ description
+ "Top-level grouping for the IPv4 and IPv6 AFI, SR-TE Policy SAFI
+ Adj-RIBs.";
+
+ container neighbors {
+ description
+ "Surrounding container for the list of neighbours that are
+ enabled for the IPv4 and IPv6 AFI, SR-TE Policy SAFI address
+ family.";
+
+ list neighbor {
+ key "neighbor-address";
+
+ description
+ "An individual neighbour that is enabled for the SR-TE
+ Policy SAFI.";
+
+ leaf neighbor-address {
+ type leafref {
+ path "../state/neighbor-address";
+ }
+ description
+ "Reference to the address of the neighbour for which the
+ Adj-RIBs specified are maintained.";
+ }
+
+ container state {
+ description
+ "Operational state parameters of the BGP neighbour for
+ which the SR-TE Policy SAFI is enabled.";
+ uses ipvX-srte-policy-adjrib-neighbor-state;
+ }
+
+ container adj-rib-in-pre {
+ description
+ "The Adj-RIB-In for the SR-TE Policy SAFI for the neighbour,
+ prior to any inbound policy constraints or modifications
+ having been applied.";
+ uses ipvX-srte-policy-adjrib-common;
+ }
+
+ container adj-rib-in-post {
+ description
+ "The Adj-RIB-In for the SR-TE Policy SAFI for the neighbour,
+ following any inbound policy constraints or modifications
+ being made.";
+ uses ipvX-srte-policy-adjrib-in-post;
+ }
+
+ container adj-rib-out-pre {
+ description
+ "The Adj-RIB-Out for the SR-TE Policy SAFI for the neighbour,
+ prior to any outgoing policy modifications or constraints
+ having been applied.";
+ uses ipvX-srte-policy-adjrib-common;
+ }
+
+ container adj-rib-out-post {
+ description
+ "The Adj-RIB-Out for the SR-TE Policy SAFI for the neighbour,
+ follow any outbound policy constraints or modifications being
+ made.";
+ uses ipvX-srte-policy-adjrib-common;
+ }
+ }
+ }
+ }
+
+ grouping ipvX-srte-policy-adjrib-neighbor-state {
+ description
+ "Common attributes for each neighbour for which the SR-TE
+ Policy SAFI RIBs are being maintained.";
+
+ leaf neighbor-address {
+ description
+ "The address of the neighbour for which the SR-TE policy
+ SAFI has been negotiated.";
+ type oc-inet:ip-address;
+ }
+ }
+
+ grouping ipvX-srte-policy-adjrib-common {
+ description
+ "Common structure containing the routes that are learnt via
+ the IPv4 or IPv6 SR-TE Policy SAFI.";
+
+ container routes {
+ description
+ "Surrounding container for the list of routes within the
+ SR-TE Policy SAFI.";
+
+ list route {
+ key "path-id endpoint color";
+
+ description
+ "The routes within the SR-TE Policy SAFI Adj-RIB. The
+ routes are keyed on the path-id - set to a non-zero
+ value only if ADD-PATHS is being used; the color; and
+ the endpoint. The colour and endpoint are extracted from
+ the NLRI.";
+
+ uses ipvX-srte-policy-common-keys;
+
+ container state {
+ description
+ "State parameters for entries within the Adj-RIB used
+ to store SR-TE Policy SAFI routes.";
+
+ uses ipvX-srte-policy-common-route-state;
+ uses bgp-adj-rib-common-attr-refs;
+ uses bgp-common-route-annotations-state;
+ }
+
+ uses bgp-unknown-attr-top;
+ }
+ }
+ }
+
+ grouping ipvX-srte-policy-common-route-state {
+ description
+ "Common attributes used SR-TE Policy SAFI routes.";
+
+ leaf path-id {
+ type uint32;
+ default 0;
+ description
+ "Identifier for the path when using BGP ADD-PATHS for the SR-TE
+ policy SAFI.";
+ }
+
+ leaf endpoint {
+ type oc-inet:ip-address;
+ description
+ "A unique identifier for the remote set of nodes. When the address
+ family is IPv4, the value is a 4-octet IPv4 address. When the
+ address family is IPv6, the value is a 16-octet IPv6 address.";
+ }
+
+ leaf color {
+ type uint32;
+ description
+ "A 4-octet value identifying the policy. Combined with the endpoint
+ the endpoint and colour represent the unique policy.";
+ }
+ }
+
+ grouping ipvX-srte-policy-common-keys {
+ description
+ "Common grouping of the keys used for lists of SR-TE policy
+ SAFI routes.";
+
+ leaf path-id {
+ type leafref {
+ path "../state/path-id";
+ }
+ description
+ "Reference to the path identifier for the SR-TE Policy SAFI
+ route. The value is only non-zero if ADD-PATHS is not being
+ used.";
+ }
+
+ leaf endpoint {
+ type leafref {
+ path "../state/endpoint";
+ }
+ description
+ "Reference to the endpoint used for the SR-TE Policy SAFI
+ route within the NLRI.";
+ }
+
+ leaf color {
+ type leafref {
+ path "../state/color";
+ }
+ description
+ "Reference to the colour used for the SR-TE policy SAFI
+ route within the NLRI.";
+ }
+ }
+
+ grouping ipvX-srte-policy-adjrib-in-post {
+ description
+ "Grouping for the post-policy Adj-RIB-In for SR-TE Policy SAFI routes";
+
+ container routes {
+ description
+ "The set of routes that are within the Adj-RIB-Out for the
+ neighbour.";
+
+ list route {
+ key "path-id endpoint color";
+
+ description
+ "The routes that are in the Adj-RIB-In-Post for the specified
+ BGP neighbour within the SR-TE Policy SAFI for the specified
+ address family.";
+
+ uses ipvX-srte-policy-common-keys;
+
+ container state {
+ description
+ "Operational state attributes related to the route within
+ the SR-TE Policy SAFI Adj-RIB-In-Post for the specified
+ neighbour.";
+
+ uses ipvX-srte-policy-common-route-state;
+ uses bgp-adj-rib-common-attr-refs;
+ uses bgp-common-route-annotations-state;
+ uses bgp-adj-rib-in-post-route-annotations-state;
+ }
+
+ uses bgp-unknown-attr-top;
+ }
+ }
+ }
+
+ grouping ipvX-srte-policy-locrib-top {
+ description
+ "Top-level grouping for the Loc-RIB for IPv4 or IPv6 Adj-RIB
+ for SR-TE Policy SAFI.";
+
+ container loc-rib {
+ description
+ "The Loc-RIB for the SR-TE Policy SAFI for IPv4 or IPv6 Unicast
+ AFIs.";
+
+ container routes {
+ description
+ "List of routes within the SR-TE Policy SAFI, for the IPv4 or
+ IPv6 AFI.";
+
+ list route {
+ key "path-id endpoint color";
+
+ description
+ "Route within the specified address family for the SR-TE
+ Policy SAFI.";
+
+ uses ipvX-srte-policy-common-keys;
+
+ container state {
+ description
+ "Operational state attributes for each route within the
+ IPv4 or IPv6 Unicast SR-TE Policy SAFI.";
+
+ uses ipvX-srte-policy-common-route-state;
+ uses bgp-loc-rib-common-attr-refs;
+ uses bgp-common-route-annotations-state;
+ }
+
+ uses bgp-unknown-attr-top;
+ }
+ }
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-rib-bgp-types.yang b/src/plugins/yang/openconfig/openconfig-rib-bgp-types.yang
new file mode 100644
index 0000000..3c0d1b0
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-rib-bgp-types.yang
@@ -0,0 +1,244 @@
+module openconfig-rib-bgp-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/rib/bgp-types";
+
+ prefix "oc-bgprib-types";
+
+ import openconfig-extensions { prefix oc-ext; }
+
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Defines identity and type defintions associated with
+ the OpenConfig BGP RIB modules";
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2016-10-17" {
+ description
+ "OpenConfig BGP RIB refactor";
+ reference "0.3.0";
+ }
+
+ revision "2016-04-11" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+ identity INVALID_ROUTE_REASON {
+ description
+ "Base identity for reason code for routes that are rejected as
+ invalid. Some derived entities are based on BMP v3";
+ reference "BGP Monitoring Protocol (draft-ietf-grow-bmp-07)";
+ }
+
+ identity INVALID_CLUSTER_LOOP {
+ base INVALID_ROUTE_REASON;
+ description
+ "Route was invalid due to CLUSTER_LIST loop";
+ }
+
+ identity INVALID_AS_LOOP {
+ base INVALID_ROUTE_REASON;
+ description
+ "Route was invalid due to AS_PATH loop";
+ }
+
+ identity INVALID_ORIGINATOR {
+ base INVALID_ROUTE_REASON;
+ description
+ "Route was invalid due to ORIGINATOR_ID, e.g., update has
+ local router as originator";
+ }
+
+ identity INVALID_CONFED {
+ base INVALID_ROUTE_REASON;
+ description
+ "Route was invalid due to a loop in the AS_CONFED_SEQUENCE or
+ AS_CONFED_SET attributes";
+ }
+
+ identity BGP_NOT_SELECTED_BESTPATH {
+ description
+ "Base identity for indicating reason a route was was not
+ selected by BGP route selection algorithm";
+ reference
+ "RFC 4271 - Section 9.1";
+ }
+
+ identity LOCAL_PREF_LOWER {
+ base BGP_NOT_SELECTED_BESTPATH;
+ description
+ "Route has a lower localpref attribute than current best path";
+ reference
+ "RFC 4271 - Section 9.1.2";
+ }
+
+ identity AS_PATH_LONGER {
+ base BGP_NOT_SELECTED_BESTPATH;
+ description
+ "Route has a longer AS path attribute than current best path";
+ reference
+ "RFC 4271 - Section 9.1.2.2 (a)";
+ }
+
+ identity ORIGIN_TYPE_HIGHER {
+ base BGP_NOT_SELECTED_BESTPATH;
+ description
+ "Route has a higher origin type, i.e., IGP origin is preferred
+ over EGP or incomplete";
+ reference
+ "RFC 4271 - Section 9.1.2.2 (b)";
+ }
+
+ identity MED_HIGHER {
+ base BGP_NOT_SELECTED_BESTPATH;
+ description
+ "Route has a higher MED, or metric, attribute than the current
+ best path";
+ reference
+ "RFC 4271 - Section 9.1.2.2 (c)";
+ }
+
+ identity PREFER_EXTERNAL {
+ base BGP_NOT_SELECTED_BESTPATH;
+ description
+ "Route source is via IGP, rather than EGP.";
+ reference
+ "RFC 4271 - Section 9.1.2.2 (d)";
+ }
+
+ identity NEXTHOP_COST_HIGHER {
+ base BGP_NOT_SELECTED_BESTPATH;
+ description
+ "Route has a higher interior cost to the next hop.";
+ reference
+ "RFC 4271 - Section 9.1.2.2 (e)";
+ }
+
+ identity HIGHER_ROUTER_ID {
+ base BGP_NOT_SELECTED_BESTPATH;
+ description
+ "Route was sent by a peer with a higher BGP Identifier value,
+ or router id";
+ reference
+ "RFC 4271 - Section 9.1.2.2 (f)";
+ }
+
+ identity HIGHER_PEER_ADDRESS {
+ base BGP_NOT_SELECTED_BESTPATH;
+ description
+ "Route was sent by a peer with a higher IP address";
+ reference
+ "RFC 4271 - Section 9.1.2.2 (g)";
+ }
+
+ identity BGP_NOT_SELECTED_POLICY {
+ description
+ "Base identity for reason code for routes that are rejected
+ due to policy";
+ }
+
+ identity REJECTED_IMPORT_POLICY {
+ base BGP_NOT_SELECTED_POLICY;
+ description
+ "Route was rejected after apply import policies";
+ }
+
+ identity TUNNEL_ENCAPSULATION_TYPE {
+ description
+ "Types of tunnel encapsulation, as described by the Tunnel
+ Encapsulation attribute";
+ reference
+ "RFC5512";
+ }
+
+ identity SRTE_POLICY_TUNNEL {
+ base TUNNEL_ENCAPSULATION_TYPE;
+ description
+ "Segment Routing Traffic Engineering Policy tunnel.";
+ reference
+ "draft-previdi-idr-segment-routing-te-policy";
+ }
+
+ identity TUNNEL_ENCAPSULATION_SUBTLV_TYPE {
+ description
+ "SubTLVs of the Tunnel Encapsulation attribute";
+ reference
+ "RFC5512";
+ }
+
+ identity TUNNEL_REMOTE_ENDPOINT {
+ base TUNNEL_ENCAPSULATION_SUBTLV_TYPE;
+ description
+ "Remote endpoint of the tunnel.";
+ reference
+ "RFC5512";
+ }
+
+ identity TUNNEL_COLOR {
+ base TUNNEL_ENCAPSULATION_SUBTLV_TYPE;
+ description
+ "Colour of the tunnel";
+ reference
+ "RFC5512";
+ }
+
+ identity SRTE_PREFERENCE {
+ base TUNNEL_ENCAPSULATION_SUBTLV_TYPE;
+ description
+ "Preference of the SR-TE policy entry described by
+ the tunnel encapsulation attribute.";
+ reference
+ "draft-previdi-idr-segment-routing-te-policy";
+ }
+
+ identity SRTE_BINDING_SID {
+ base TUNNEL_ENCAPSULATION_SUBTLV_TYPE;
+ description
+ "Binding SID to be used by the SR-TE policy described
+ by the tunnel encapsulation attribute.";
+ reference
+ "draft-previdi-idr-segment-routing-te-policy";
+ }
+
+ identity SRTE_SEGMENT_LIST {
+ base TUNNEL_ENCAPSULATION_SUBTLV_TYPE;
+ description
+ "Segment lists to be used by the SR-TE policy described
+ by the tunnel encapsulation attribute.";
+ reference
+ "draft-previdi-idr-segment-routing-te-policy";
+ }
+
+ identity SRTE_SEGMENT_LIST_SUBTLV {
+ description
+ "SubTLVs of the SR-TE Policy Segment List sub-TLV of the
+ Tunnel Encapsulation attribute.";
+ reference
+ "draft-previdi-idr-segment-routing-te-policy";
+ }
+
+ identity SRTE_SEGMENT_LIST_WEIGHT {
+ base SRTE_SEGMENT_LIST_SUBTLV;
+ description
+ "Weight of the segment list within the SR-TE policy";
+ reference
+ "draft-previdi-idr-segment-routing-te-policy";
+ }
+
+ identity SRTE_SEGMENT_LIST_SEGMENT {
+ base SRTE_SEGMENT_LIST_SUBTLV;
+ description
+ "An individual element within the SR-TE Policy Segment
+ List.";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-rib-bgp.yang b/src/plugins/yang/openconfig/openconfig-rib-bgp.yang
new file mode 100644
index 0000000..7fc4828
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-rib-bgp.yang
@@ -0,0 +1,209 @@
+module openconfig-rib-bgp {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/rib/bgp";
+
+ prefix "oc-rib-bgp";
+
+ // import some basic types
+ import openconfig-bgp-types { prefix oc-bgpt; }
+ import openconfig-extensions { prefix oc-ext; }
+
+ // include RIB submodules
+
+ // structure for LOC-RIB and Adj-RIB tables
+ include openconfig-rib-bgp-tables;
+
+ // structure of shared attribute groups
+ include openconfig-rib-bgp-shared-attributes;
+
+ // groupings of attributes in three categories:
+ // - shared across multiple routes
+ // - common to LOC-RIB and Adj-RIB, but not shared across routes
+ // - specific to LOC-RIB or Adj-RIB
+ include openconfig-rib-bgp-attributes;
+
+ // groupings of annotations for each route or table
+ include openconfig-rib-bgp-table-attributes;
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Defines a data model for representing BGP routing table (RIB)
+ contents. The model supports 5 logical RIBs per address family:
+
+ loc-rib: This is the main BGP routing table for the local routing
+ instance, containing best-path selections for each prefix. The
+ loc-rib table may contain multiple routes for a given prefix,
+ with an attribute to indicate which was selected as the best
+ path. Note that multiple paths may be used or advertised even if
+ only one path is marked as best, e.g., when using BGP
+ add-paths. An implementation may choose to mark multiple
+ paths in the RIB as best path by setting the flag to true for
+ multiple entries.
+
+ adj-rib-in-pre: This is a per-neighbor table containing the NLRI
+ updates received from the neighbor before any local input policy
+ rules or filters have been applied. This can be considered the
+ 'raw' updates from a given neighbor.
+
+ adj-rib-in-post: This is a per-neighbor table containing the
+ routes received from the neighbor that are eligible for
+ best-path selection after local input policy rules have been
+ applied.
+
+ adj-rib-out-pre: This is a per-neighbor table containing routes
+ eligible for sending (advertising) to the neighbor before output
+ policy rules have been applied.
+
+ adj-rib-out-post: This is a per-neighbor table containing routes
+ eligible for sending (advertising) to the neighbor after output
+ policy rules have been applied.";
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2016-10-17" {
+ description
+ "OpenConfig BGP RIB refactor";
+ reference "0.3.0";
+ }
+
+ revision "2016-04-11" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+
+
+ // grouping statements
+
+
+
+ grouping bgp-rib-state {
+ description
+ "Operational state data for the top level BGP RIB";
+
+ leaf afi-safi-name {
+ type identityref {
+ base oc-bgpt:AFI_SAFI_TYPE;
+ }
+ description "AFI,SAFI";
+ }
+ }
+
+ grouping bgp-rib-top {
+ description
+ "Top-level grouping for the BGP RIB";
+
+ container bgp-rib {
+ config false;
+ description
+ "Top level container for BGP RIBs";
+
+ uses attribute-sets-top;
+ uses community-sets-top;
+ uses ext-community-sets-top;
+
+ container afi-safis {
+ config false;
+ description
+ "Enclosing container for address family list";
+
+ list afi-safi {
+ key "afi-safi-name";
+ description
+ "list of afi-safi types";
+
+ leaf afi-safi-name {
+ type leafref {
+ path "../state/afi-safi-name";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for the BGP list";
+
+ uses bgp-rib-state;
+ }
+
+ container ipv4-unicast {
+ when "../afi-safi-name = 'oc-bgpt:IPV4_UNICAST'" {
+ description
+ "Include this container for IPv4 unicast RIB";
+ }
+ description
+ "Routing tables for IPv4 unicast -- active when the
+ afi-safi name is ipv4-unicast";
+
+ uses ipv4-loc-rib-top;
+ uses ipv4-adj-rib-top;
+ }
+
+ container ipv6-unicast {
+ when "../afi-safi-name = 'oc-bgpt:IPV6_UNICAST'" {
+ description
+ "Include this container for IPv6 unicast RIB";
+ }
+ description
+ "Routing tables for IPv6 unicast -- active when the
+ afi-safi name is ipv6-unicast";
+
+ uses ipv6-loc-rib-top;
+ uses ipv6-adj-rib-top;
+ }
+
+ container ipv4-srte-policy {
+ when "../afi-safi-name = 'oc-bgpt:SRTE_POLICY_IPV4'" {
+ description
+ "Include this container only for the IPv4 AFI, SR-TE Policy
+ SAFI.";
+ }
+ description
+ "Routing tables for the IPv4 Unicast, SR-TE Policy SAFI.";
+
+ uses ipvX-srte-policy-locrib-top;
+ uses ipvX-srte-policy-adjrib-top;
+ }
+
+ container ipv6-srte-policy {
+ when "../afi-safi-name = 'oc-bgpt:SRTE_POLICY_IPV6'" {
+ description
+ "Include this container only for the IPv6 AFI, SR-TE Policy
+ SAFI.";
+ }
+ description
+ "Routing tables for the IPv6 Unicast, SR-TE Policy SAFI.";
+
+ uses ipvX-srte-policy-locrib-top;
+ uses ipvX-srte-policy-adjrib-top;
+ }
+ }
+ }
+ }
+ }
+
+
+ // data definition statements
+
+ uses bgp-rib-top;
+
+ // augment statements
+
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-routing-policy.yang b/src/plugins/yang/openconfig/openconfig-routing-policy.yang
new file mode 100644
index 0000000..ca4c7ed
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-routing-policy.yang
@@ -0,0 +1,1097 @@
+module openconfig-routing-policy {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/routing-policy";
+
+ prefix "oc-rpol";
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-policy-types { prefix oc-pol-types; }
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module describes a YANG model for routing policy
+ configuration. It is a limited subset of all of the policy
+ configuration parameters available in the variety of vendor
+ implementations, but supports widely used constructs for managing
+ how routes are imported, exported, and modified across different
+ routing protocols. This module is intended to be used in
+ conjunction with routing protocol configuration models (e.g.,
+ BGP) defined in other modules.
+
+ Route policy expression:
+
+ Policies are expressed as a set of top-level policy definitions,
+ each of which consists of a sequence of policy statements. Policy
+ statements consist of simple condition-action tuples. Conditions
+ may include mutiple match or comparison operations, and similarly
+ actions may be multitude of changes to route attributes or a
+ final disposition of accepting or rejecting the route.
+
+ Route policy evaluation:
+
+ Policy definitions are referenced in routing protocol
+ configurations using import and export configuration statements.
+ The arguments are members of an ordered list of named policy
+ definitions which comprise a policy chain, and optionally, an
+ explicit default policy action (i.e., reject or accept).
+
+ Evaluation of each policy definition proceeds by evaluating its
+ corresponding individual policy statements in order. When a
+ condition statement in a policy statement is satisfied, the
+ corresponding action statement is executed. If the action
+ statement has either accept-route or reject-route actions, policy
+ evaluation of the current policy definition stops, and no further
+ policy definitions in the chain are evaluated.
+
+ If the condition is not satisfied, then evaluation proceeds to
+ the next policy statement. If none of the policy statement
+ conditions are satisfied, then evaluation of the current policy
+ definition stops, and the next policy definition in the chain is
+ evaluated. When the end of the policy chain is reached, the
+ default route disposition action is performed (i.e., reject-route
+ unless an an alternate default action is specified for the
+ chain).
+
+ Policy 'subroutines' (or nested policies) are supported by
+ allowing policy statement conditions to reference another policy
+ definition which applies conditions and actions from the
+ referenced policy before returning to the calling policy
+ statement and resuming evaluation. If the called policy
+ results in an accept-route (either explicit or by default), then
+ the subroutine returns an effective true value to the calling
+ policy. Similarly, a reject-route action returns false. If the
+ subroutine returns true, the calling policy continues to evaluate
+ the remaining conditions (using a modified route if the
+ subroutine performed any changes to the route).";
+
+ oc-ext:openconfig-version "3.1.0";
+
+ revision "2018-06-05" {
+ description
+ "Add PIM, IGMP to INSTALL_PROTOCOL_TYPES identity";
+ reference "3.1.0";
+ }
+
+ revision "2017-07-14" {
+ description
+ "Replace policy choice node/type with policy-result
+ enumeration;simplified defined set naming;removed generic
+ IGP actions; migrate to OpenConfig types; added mode for
+ prefix sets";
+ reference "3.0.0";
+ }
+
+ revision "2016-05-12" {
+ description
+ "OpenConfig public release";
+ reference "2.0.1";
+ }
+
+
+ // typedef statements
+
+ typedef default-policy-type {
+ // this typedef retained for name compatibiity with default
+ // import and export policy
+ type enumeration {
+ enum ACCEPT_ROUTE {
+ description
+ "Default policy to accept the route";
+ }
+ enum REJECT_ROUTE {
+ description
+ "Default policy to reject the route";
+ }
+ }
+ description
+ "Type used to specify route disposition in
+ a policy chain";
+ }
+
+ typedef policy-result-type {
+ type enumeration {
+ enum ACCEPT_ROUTE {
+ description "Policy accepts the route";
+ }
+ enum REJECT_ROUTE {
+ description "Policy rejects the route";
+ }
+ }
+ description
+ "Type used to specify route disposition in
+ a policy chain";
+ }
+
+
+ // grouping statements
+
+ grouping prefix-set-config {
+ description
+ "Configuration data for prefix sets used in policy
+ definitions.";
+
+ leaf name {
+ type string;
+ description
+ "name / label of the prefix set -- this is used to
+ reference the set in match conditions";
+ }
+
+ leaf mode {
+ type enumeration {
+ enum IPV4 {
+ description
+ "Prefix set contains IPv4 prefixes only";
+ }
+ enum IPV6 {
+ description
+ "Prefix set contains IPv6 prefixes only";
+ }
+ enum MIXED {
+ description
+ "Prefix set contains mixed IPv4 and IPv6 prefixes";
+ }
+ }
+ description
+ "Indicates the mode of the prefix set, in terms of which
+ address families (IPv4, IPv6, or both) are present. The
+ mode provides a hint, but the device must validate that all
+ prefixes are of the indicated type, and is expected to
+ reject the configuration if there is a discrepancy. The
+ MIXED mode may not be supported on devices that require
+ prefix sets to be of only one address family.";
+ }
+
+ }
+
+ grouping prefix-set-state {
+ description
+ "Operational state data for prefix sets";
+ }
+
+ grouping prefix-set-top {
+ description
+ "Top-level data definitions for a list of IPv4 or IPv6
+ prefixes which are matched as part of a policy";
+
+ container prefix-sets {
+ description
+ "Enclosing container ";
+
+ list prefix-set {
+ key "name";
+ description
+ "List of the defined prefix sets";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to prefix name list key";
+ }
+
+ container config {
+ description
+ "Configuration data for prefix sets";
+
+ uses prefix-set-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses prefix-set-config;
+ uses prefix-set-state;
+ }
+
+ uses prefix-top;
+ }
+ }
+ }
+
+ grouping prefix-config {
+ description
+ "Configuration data for a prefix definition";
+
+ leaf ip-prefix {
+ type oc-inet:ip-prefix;
+ mandatory true;
+ description
+ "The prefix member in CIDR notation -- while the
+ prefix may be either IPv4 or IPv6, most
+ implementations require all members of the prefix set
+ to be the same address family. Mixing address types in
+ the same prefix set is likely to cause an error.";
+ }
+
+ leaf masklength-range {
+ type string {
+ pattern '^([0-9]+\.\.[0-9]+)|exact$';
+ }
+ description
+ "Defines a range for the masklength, or 'exact' if
+ the prefix has an exact length.
+
+ Example: 10.3.192.0/21 through 10.3.192.0/24 would be
+ expressed as prefix: 10.3.192.0/21,
+ masklength-range: 21..24.
+
+ Example: 10.3.192.0/21 would be expressed as
+ prefix: 10.3.192.0/21,
+ masklength-range: exact";
+ }
+ }
+
+ grouping prefix-state {
+ description
+ "Operational state data for prefix definitions";
+ }
+
+ grouping prefix-top {
+ description
+ "Top-level grouping for prefixes in a prefix list";
+
+ container prefixes {
+ description
+ "Enclosing container for the list of prefixes in a policy
+ prefix list";
+
+ list prefix {
+ key "ip-prefix masklength-range";
+ description
+ "List of prefixes in the prefix set";
+
+ leaf ip-prefix {
+ type leafref {
+ path "../config/ip-prefix";
+ }
+ description
+ "Reference to the ip-prefix list key.";
+ }
+
+ leaf masklength-range {
+ type leafref {
+ path "../config/masklength-range";
+ }
+ description
+ "Reference to the masklength-range list key";
+ }
+
+ container config {
+ description
+ "Configuration data for prefix definition";
+
+ uses prefix-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for prefix definition";
+
+ uses prefix-config;
+ uses prefix-state;
+ }
+ }
+ }
+ }
+
+ grouping neighbor-set-config {
+ description
+ "Configuration data for neighbor set definitions";
+
+ leaf name {
+ type string;
+ description
+ "name / label of the neighbor set -- this is used to
+ reference the set in match conditions";
+ }
+
+ leaf-list address {
+ type oc-inet:ip-address;
+ description
+ "List of IP addresses in the neighbor set";
+ }
+ }
+
+ grouping neighbor-set-state {
+ description
+ "Operational state data for neighbor set definitions";
+ }
+
+ grouping neighbor-set-top {
+ description
+ "Top-level data definition for a list of IPv4 or IPv6
+ neighbors which can be matched in a routing policy";
+
+ container neighbor-sets {
+ description
+ "Enclosing container for the list of neighbor set
+ definitions";
+
+ list neighbor-set {
+ key "name";
+ description
+ "List of defined neighbor sets for use in policies.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the neighbor set name list key.";
+ }
+
+ container config {
+ description
+ "Configuration data for neighbor sets.";
+
+ uses neighbor-set-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for neighbor sets.";
+
+ uses neighbor-set-config;
+ uses neighbor-set-state;
+ }
+ }
+ }
+ }
+
+ grouping tag-set-config {
+ description
+ "Configuration data for tag set definitions.";
+
+ leaf name {
+ type string;
+ description
+ "name / label of the tag set -- this is used to reference
+ the set in match conditions";
+ }
+
+ leaf-list tag-value {
+ type oc-pol-types:tag-type;
+ description
+ "Value of the tag set member";
+ }
+ }
+
+ grouping tag-set-state {
+ description
+ "Operational state data for tag set definitions.";
+ }
+
+ grouping tag-set-top {
+ description
+ "Top-level data definitions for a list of tags which can
+ be matched in policies";
+
+ container tag-sets {
+ description
+ "Enclosing container for the list of tag sets.";
+
+ list tag-set {
+ key "name";
+ description
+ "List of tag set definitions.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the tag set name list key";
+ }
+
+ container config {
+ description
+ "Configuration data for tag sets";
+
+ uses tag-set-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for tag sets";
+
+ uses tag-set-config;
+ uses tag-set-state;
+ }
+ }
+ }
+ }
+
+ grouping generic-defined-sets {
+ description
+ "Data definitions for pre-defined sets of attributes used in
+ policy match conditions. These sets are generic and can
+ be used in matching conditions in different routing
+ protocols.";
+
+ uses prefix-set-top;
+ uses neighbor-set-top;
+ uses tag-set-top;
+ }
+
+ grouping match-set-options-group {
+ description
+ "Grouping containing options relating to how a particular set
+ should be matched";
+
+ leaf match-set-options {
+ type oc-pol-types:match-set-options-type;
+ description
+ "Optional parameter that governs the behaviour of the
+ match operation";
+ }
+ }
+
+ grouping match-set-options-restricted-group {
+ description
+ "Grouping for a restricted set of match operation modifiers";
+
+ leaf match-set-options {
+ type oc-pol-types:match-set-options-restricted-type;
+ description
+ "Optional parameter that governs the behaviour of the
+ match operation. This leaf only supports matching on ANY
+ member of the set or inverting the match. Matching on ALL is
+ not supported";
+ }
+ }
+
+ grouping match-interface-condition-config {
+ description
+ "Configuration data for interface match condition";
+
+ uses oc-if:interface-ref-common;
+ }
+
+ grouping match-interface-condition-state {
+ description
+ "Operational state data for interface match condition";
+ }
+
+ grouping match-interface-condition-top {
+ description
+ "Top-level grouping for the interface match condition";
+
+ container match-interface {
+ description
+ "Top-level container for interface match conditions";
+
+ container config {
+ description
+ "Configuration data for interface match conditions";
+
+ uses match-interface-condition-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for interface match conditions";
+
+ uses match-interface-condition-config;
+ uses match-interface-condition-state;
+ }
+
+ }
+ }
+
+ grouping prefix-set-condition-config {
+ description
+ "Configuration data for prefix-set conditions";
+
+ leaf prefix-set {
+ type leafref {
+ path "../../../../../../../../defined-sets/" +
+ "prefix-sets/prefix-set/config/name";
+ }
+ description "References a defined prefix set";
+ }
+ uses match-set-options-restricted-group;
+ }
+
+
+ grouping prefix-set-condition-state {
+ description
+ "Operational state data for prefix-set conditions";
+ }
+
+ grouping prefix-set-condition-top {
+ description
+ "Top-level grouping for prefix-set conditions";
+
+ container match-prefix-set {
+ description
+ "Match a referenced prefix-set according to the logic
+ defined in the match-set-options leaf";
+
+ container config {
+ description
+ "Configuration data for a prefix-set condition";
+
+ uses prefix-set-condition-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for a prefix-set condition";
+
+ uses prefix-set-condition-config;
+ uses prefix-set-condition-state;
+ }
+ }
+ }
+
+ grouping neighbor-set-condition-config {
+ description
+ "Configuration data for neighbor-set conditions";
+
+ leaf neighbor-set {
+ type leafref {
+ path "../../../../../../../../defined-sets/neighbor-sets/" +
+ "neighbor-set/name";
+ //TODO: require-instance should be added when it's
+ //supported in YANG 1.1
+ //require-instance true;
+ }
+ description "References a defined neighbor set";
+ }
+
+ uses match-set-options-restricted-group;
+ }
+
+ grouping neighbor-set-condition-state {
+ description
+ "Operational state data for neighbor-set conditions";
+ }
+
+ grouping neighbor-set-condition-top {
+ description
+ "Top-level grouping for neighbor-set conditions";
+
+ container match-neighbor-set {
+ description
+ "Match a referenced neighbor set according to the logic
+ defined in the match-set-options-leaf";
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses neighbor-set-condition-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses neighbor-set-condition-config;
+ uses neighbor-set-condition-state;
+ }
+ }
+ }
+
+ grouping tag-set-condition-config {
+ description
+ "Configuration data for tag-set condition statements";
+
+ leaf tag-set {
+ type leafref {
+ path "../../../../../../../../defined-sets/tag-sets/tag-set" +
+ "/name";
+ //TODO: require-instance should be added when it's
+ //supported in YANG 1.1
+ //require-instance true;
+ }
+ description "References a defined tag set";
+ }
+ uses match-set-options-restricted-group;
+ }
+
+ grouping tag-set-condition-state {
+ description
+ "Operational state data for tag-set condition statements";
+ }
+
+ grouping tag-set-condition-top {
+ description
+ "Top-level grouping for tag-set conditions";
+
+ container match-tag-set {
+ description
+ "Match a referenced tag set according to the logic defined
+ in the match-options-set leaf";
+
+ container config {
+ description
+ "Configuration data for tag-set conditions";
+
+ uses tag-set-condition-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data tag-set conditions";
+
+ uses tag-set-condition-config;
+ uses tag-set-condition-state;
+ }
+ }
+ }
+
+ grouping generic-conditions {
+ description "Condition statement definitions for checking
+ membership in a generic defined set";
+
+ uses match-interface-condition-top;
+ uses prefix-set-condition-top;
+ uses neighbor-set-condition-top;
+ uses tag-set-condition-top;
+
+ }
+
+ grouping generic-actions {
+ description
+ "Definitions for common set of policy action statements that
+ manage the disposition or control flow of the policy";
+
+ leaf policy-result {
+ type policy-result-type;
+ description
+ "Select the final disposition for the route, either
+ accept or reject.";
+ }
+ }
+
+
+ grouping policy-conditions-config {
+ description
+ "Configuration data for general policy conditions, i.e., those
+ not related to match-sets";
+
+ leaf call-policy {
+ type leafref {
+ path "../../../../../../../" +
+ "oc-rpol:policy-definitions/" +
+ "oc-rpol:policy-definition/oc-rpol:name";
+ //TODO: require-instance should be added when
+ //it is supported in YANG 1.1
+ //require-instance true;
+ }
+ description
+ "Applies the statements from the specified policy
+ definition and then returns control the current
+ policy statement. Note that the called policy may
+ itself call other policies (subject to
+ implementation limitations). This is intended to
+ provide a policy 'subroutine' capability. The
+ called policy should contain an explicit or a
+ default route disposition that returns an
+ effective true (accept-route) or false
+ (reject-route), otherwise the behavior may be
+ ambiguous and implementation dependent";
+ }
+
+ leaf install-protocol-eq {
+ type identityref {
+ base oc-pol-types:INSTALL_PROTOCOL_TYPE;
+ }
+ description
+ "Condition to check the protocol / method used to install
+ the route into the local routing table";
+ }
+ }
+
+ grouping policy-conditions-state {
+ description
+ "Operational state data for policy conditions";
+ }
+
+ grouping policy-conditions-top {
+ description
+ "Top-level grouping for policy conditions";
+
+ container conditions {
+ description
+ "Condition statements for the current policy statement";
+
+ container config {
+ description
+ "Configuration data for policy conditions";
+
+ uses policy-conditions-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for policy conditions";
+
+ uses policy-conditions-config;
+ uses policy-conditions-state;
+ }
+ uses generic-conditions;
+ }
+ }
+
+ grouping policy-statements-config {
+ description
+ "Configuration data for policy statements";
+
+ leaf name {
+ type string;
+ description
+ "name of the policy statement";
+ }
+ }
+
+ grouping policy-statements-state {
+ description
+ "Operational state data for policy statements";
+ }
+
+
+
+ grouping policy-actions-config {
+ description
+ "Configuration data for policy actions";
+
+ uses generic-actions;
+ }
+
+ grouping policy-actions-state {
+ description
+ "Operational state data for policy actions";
+ }
+
+ grouping policy-actions-top {
+ description
+ "Top-level grouping for policy actions";
+
+ container actions {
+ description
+ "Top-level container for policy action statements";
+
+ container config {
+ description
+ "Configuration data for policy actions";
+
+ uses policy-actions-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for policy actions";
+
+ uses policy-actions-config;
+ uses policy-actions-state;
+ }
+ }
+ }
+
+ grouping policy-statements-top {
+ description
+ "Top-level grouping for the policy statements list";
+
+ container statements {
+ description
+ "Enclosing container for policy statements";
+
+ list statement {
+ key "name";
+ // TODO: names of policy statements within a policy
+ // definition should probably be optional, however, YANG
+ // requires a unique id for lists
+ ordered-by user;
+ description
+ "Policy statements group conditions and actions
+ within a policy definition. They are evaluated in
+ the order specified (see the description of policy
+ evaluation at the top of this module.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to list key";
+ }
+
+ container config {
+ description
+ "Configuration data for policy statements";
+
+ uses policy-statements-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for policy statements";
+
+ uses policy-statements-config;
+ uses policy-statements-state;
+ }
+
+ uses policy-conditions-top;
+ uses policy-actions-top;
+ }
+ }
+ }
+
+ grouping defined-sets-top {
+ description
+ "Top-level grouping for defined set definitions";
+
+ container defined-sets {
+ description
+ "Predefined sets of attributes used in policy match
+ statements";
+
+ uses generic-defined-sets;
+ }
+ }
+
+ grouping policy-definitions-config {
+ description
+ "Configuration data for policy definitions";
+
+ leaf name {
+ type string;
+ description
+ "Name of the top-level policy definition -- this name
+ is used in references to the current policy";
+ }
+ }
+
+ grouping policy-definitions-state {
+ description
+ "Operational state data for policy definitions";
+ }
+
+ grouping policy-definitions-top {
+ description
+ "Top-level grouping for the policy definition list";
+
+ container policy-definitions {
+ description
+ "Enclosing container for the list of top-level policy
+ definitions";
+
+ list policy-definition {
+ key "name";
+ description
+ "List of top-level policy definitions, keyed by unique
+ name. These policy definitions are expected to be
+ referenced (by name) in policy chains specified in import
+ or export configuration statements.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container config {
+ description
+ "Configuration data for policy defintions";
+
+ uses policy-definitions-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for policy definitions";
+
+ uses policy-definitions-config;
+ uses policy-definitions-state;
+ }
+
+ uses policy-statements-top;
+ }
+ }
+ }
+
+ grouping routing-policy-top {
+ description
+ "Top level container for OpenConfig routing policy";
+
+ container routing-policy {
+ description
+ "Top-level container for all routing policy configuration";
+
+
+ uses defined-sets-top;
+
+ uses policy-definitions-top;
+ }
+ }
+
+ grouping apply-policy-import-config {
+ description
+ "Configuration data for applying import policies";
+
+ leaf-list import-policy {
+ type leafref {
+ path "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+ "oc-rpol:policy-definition/oc-rpol:name";
+ //TODO: require-instance should be added when it's
+ //supported in YANG 1.1
+ //require-instance true;
+ }
+ ordered-by user;
+ description
+ "list of policy names in sequence to be applied on
+ receiving a routing update in the current context, e.g.,
+ for the current peer group, neighbor, address family,
+ etc.";
+ }
+
+ leaf default-import-policy {
+ type default-policy-type;
+ default REJECT_ROUTE;
+ description
+ "explicitly set a default policy if no policy definition
+ in the import policy chain is satisfied.";
+ }
+
+ }
+
+ grouping apply-policy-export-config {
+ description
+ "Configuration data for applying export policies";
+
+ leaf-list export-policy {
+ type leafref {
+ path "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+ "oc-rpol:policy-definition/oc-rpol:name";
+ //TODO: require-instance should be added when it's
+ //supported in YANG 1.1
+ //require-instance true;
+ }
+ ordered-by user;
+ description
+ "list of policy names in sequence to be applied on
+ sending a routing update in the current context, e.g.,
+ for the current peer group, neighbor, address family,
+ etc.";
+ }
+
+ leaf default-export-policy {
+ type default-policy-type;
+ default REJECT_ROUTE;
+ description
+ "explicitly set a default policy if no policy definition
+ in the export policy chain is satisfied.";
+ }
+ }
+
+
+ grouping apply-policy-config {
+ description
+ "Configuration data for routing policies";
+
+ uses apply-policy-import-config;
+ uses apply-policy-export-config;
+
+ }
+
+
+
+ grouping apply-policy-state {
+ description
+ "Operational state associated with routing policy";
+
+ //TODO: identify additional state data beyond the intended
+ //policy configuration.
+ }
+
+ grouping apply-policy-group {
+ description
+ "Top level container for routing policy applications. This
+ grouping is intended to be used in routing models where
+ needed.";
+
+ container apply-policy {
+ description
+ "Anchor point for routing policies in the model.
+ Import and export policies are with respect to the local
+ routing table, i.e., export (send) and import (receive),
+ depending on the context.";
+
+ container config {
+ description
+ "Policy configuration data.";
+
+ uses apply-policy-config;
+ }
+
+ container state {
+
+ config false;
+ description
+ "Operational state for routing policy";
+
+ uses apply-policy-config;
+ uses apply-policy-state;
+ }
+ }
+ }
+
+ uses routing-policy-top;
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-rsvp-sr-ext.yang b/src/plugins/yang/openconfig/openconfig-rsvp-sr-ext.yang
new file mode 100644
index 0000000..f9af96d
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-rsvp-sr-ext.yang
@@ -0,0 +1,400 @@
+module openconfig-rsvp-sr-ext {
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/rsvp-sr-ext";
+ prefix "oc-sr-rsvp-ext";
+
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-types { prefix "oc-types"; }
+ import openconfig-network-instance { prefix "oc-ni"; }
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module adds extensions to the OpenConfig MPLS models to
+ provide extensions which allow the coexistence of RSVP-TE and
+ Segment Routing (SR) within the same network. It augments the
+ existing OpenConfig segment routing (SR) and RSVP-TE models
+ where required.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision 2018-04-13 {
+ description
+ "Replace boolean with modes for measure-sr-traffic.";
+ reference "0.2.0";
+ }
+
+ revision 2017-03-06 {
+ description
+ "Initial revision.";
+ reference "0.1.0";
+ }
+
+ grouping bandwidth-measurement-global-state {
+ description
+ "Operational state parameters for bandwidth measurement which
+ apply globally to the device.";
+
+ leaf effective-adjustment-interval {
+ type uint32;
+ units "seconds";
+ description
+ "The effective adjustment interval that is being used by
+ the system. In the case that the adjustment-interval leaf
+ is set to a non-integer multiple of the collection-interval,
+ and the system does not support this, the value of this leaf
+ should reflect the effective value of the adjustment interval
+ that it has selected. In the case where no rounding of the
+ adjustment interval has occurred, this value should have the
+ same value as the adjustment-inerval leaf.";
+ }
+ }
+
+ grouping bandwidth-measurement-global-config {
+ description
+ "Configuration parameters for bandwidth measurement which apply
+ globally to the device.";
+
+ leaf measure-sr-traffic {
+ type enumeration {
+ enum MEASURE_ONLY {
+ description
+ "Only measure the SR traffic being sent via an interface,
+ and do not flood it into the IGP.";
+ }
+ enum MEASURE_AND_FLOOD {
+ description
+ "Measure the SR traffic being sent via an interface and
+ flood it into the IGP.";
+ }
+ }
+ description
+ "Parameter enabling SR traffic measurement
+ and optional flooding into IGP.";
+ reference
+ "draft-sitaraman-sr-rsvp-coexistence-rec-01";
+ }
+
+ // TODO(robjs): For future extension, traffic accounting for
+ // non-SR, non-RSVP traffic could be added here. e.g., LDP,
+ // BGP-LU etc.
+
+ leaf collection-interval {
+ type uint32;
+ units "seconds";
+ description
+ "The interval at which the collection of interface
+ statistics relating to non-RSVP-TE traffic should be
+ performed";
+ reference
+ "draft-sitaraman-sr-rsvp-coexistence-rec-01";
+ }
+
+ leaf adjustment-interval {
+ type uint32;
+ units "seconds";
+ description
+ "The interval after which an adjustment to the utilised
+ bandwidth on the interface is made. This value must be
+ greater than, or equal to, the collection interval for
+ statistics. This value is referred to as N in
+ draft-sitaraman-sr-rsvp-coexistence-rec-01.
+
+ After N seconds have expired, the
+ arithmetic mean of the samples is taken, and this is
+ considered as the non-RSVP-TE utilisation of the
+ interface. In the case that the adjustment interval is
+ an integer >1 multiple of the collection interval, this
+ serves to provide smoothing of the collected bandwidth
+ statistics.";
+ reference
+ "draft-sitaraman-sr-rsvp-coexistence-rec-01";
+ }
+
+ leaf bandwidth-multiplier {
+ type decimal64 {
+ fraction-digits 4;
+ }
+ default 1.0000;
+ description
+ "A multiplier applied to the sampled bandwidth which
+ determines the value that is propagated to the IGP TED.
+ By default this value is 1.0000, and hence the actual
+ sampled value is flooded.";
+ }
+ }
+
+ grouping bandwidth-measurement-update-config {
+ description
+ "Configuration parameters related to when the bandwidth
+ measurement information is used to update the IGP TED.";
+
+ leaf update-trigger {
+ type enumeration {
+ enum ADJUSTED_MAX_RESERVABLE_PCT {
+ description
+ "Update of a new maximum reservable bandwidth IGP
+ TLV is based on the value changing >= X% of
+ the currently flooded adjusted-absolute-subscription-bw.
+ The percentage of this value that is used is specified
+ by the adjusted-max-reservable-bw-pct leaf.";
+ }
+ enum SR_TRAFFIC_PCT {
+ description
+ "Update of the new maximum reservable bandwidth IGP
+ TLV is based on the value changing >= X% of the last
+ calculated segment routing traffic utilisation for the
+ interface. The percentage delta of this value is
+ specified by the sr-traffic-pct leaf.";
+ }
+ }
+ description
+ "The trigger that should be used to determine when the IGP
+ TED is updated with new information as to the effective
+ maximum reservable bandwidth
+ (adjusted-absolute-subscription-bw)";
+ }
+
+ leaf adjusted-max-reservable-bw-pct {
+ when "../update-trigger = 'ADJUSTED_MAX_RESERVABLE_PCT'" {
+ description
+ "Only allow the adjusted-max-reservable-bw update trigger
+ to be specified when the update-trigger mode is specified
+ to be a percentage of the currently flooded value.";
+ }
+ type oc-types:percentage;
+ description
+ "The delta in the adjusted-max-reservable-bandwidth that
+ should trigger an update in the value which is flooded
+ through the IGP TED.
+ The delta is measured as a percentage of the
+ current adjusted value of the maximum reservable bandwidth
+ of the interface, as specified by the
+ adjusted-absolute-subscription-bw RSVP-TE leaf.";
+ reference
+ "draft-sitaraman-sr-rsvp-coexistence-rec-01";
+ }
+
+ leaf sr-traffic-pct {
+ when "../update-trigger = 'SR_TRAFFIC_PCT'" {
+ description
+ "Only allow the SR traffic percentage trigger to be
+ specified when the update trigger is defined to be a
+ percentage of the last calculated SR traffic value.";
+ }
+ type oc-types:percentage;
+ description
+ "The change in the calculated SR traffic on the interface
+ that should trigger an update in the value of the
+ maximum reservable bandwidth flooded through the IGP TED.
+ The value is specified as a percentage of the
+ last-calculated-sr-traffic state leaf.";
+ }
+ }
+
+ grouping bandwidth-measurement-global-structural {
+ description
+ "Structural grouping for the measurement of segment routing
+ traffic, and its advertisement into the IGP TED.";
+
+ container bandwidth-measurement {
+ description
+ "Configuration and operational state parameters related to
+ how bandwidth utilisation is measured and flooded into the
+ IGP.";
+
+ container config {
+ description
+ "Configuration parameters relating to bandwidth
+ measurement.";
+
+ uses bandwidth-measurement-global-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to bandwidth
+ measurement";
+
+ uses bandwidth-measurement-global-config;
+ uses bandwidth-measurement-global-state;
+ }
+
+ container update-trigger {
+ description
+ "Configuration and operational state parameters related
+ to the update trigger for flooding new bandwidth
+ information into the IGP.";
+
+ container config {
+ description
+ "Configuration parameters related to the bandwidth
+ measurement update trigger.";
+
+ uses bandwidth-measurement-update-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters related to the bandwidth
+ measurement update trigger.";
+
+ uses bandwidth-measurement-update-config;
+ }
+ }
+ }
+ }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+ "oc-ni:mpls/oc-ni:te-global-attributes" {
+ description
+ "Add the bandwidth measurement parameters to MPLS global
+ traffic engineering hierarchy.";
+
+ uses bandwidth-measurement-global-structural;
+ }
+
+ grouping bandwidth-measurement-rsvp-te-adjusted-state {
+ description
+ "Logical grouping augmented into the RSVP-TE hierarchy to
+ provide an operational state value which reflects the
+ adjusted RSVP-TE available bandwidth.";
+
+ leaf adjusted-absolute-subscription-bw {
+ type uint64;
+ units "kbps";
+ description
+ "The adjusted absolute value (in kbps) of the
+ bandwidth which is reservable to RSVP-TE on the
+ local system. In the case that the bandwidth-measurement
+ configuration does not account for non-RSVP-TE traffic
+ then this value is equal to the
+ calculated-absolute-subscription-bw, in the case that
+ non-RSVP-TE traffic is being accounted for, it is lower
+ such that calculated-absolute-subscription-bw -
+ adjusted-absolute-subscription-bw = the current calculated
+ non-RSVP-TE traffic.
+
+ This value reflects the last flooded value of the maximum
+ reservable bandwidth, or subscription.";
+ }
+ }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+ "oc-ni:mpls/oc-ni:signaling-protocols/oc-ni:rsvp-te/" +
+ "oc-ni:interface-attributes/oc-ni:interface/" +
+ "oc-ni:subscription/oc-ni:state" {
+
+ description
+ "Augmentation to add the adjusted RSVP-TE available bandwidth
+ state to the RSVP-TE signaling protocol.";
+
+ uses bandwidth-measurement-rsvp-te-adjusted-state;
+ }
+
+ grouping bandwidth-measurement-intf-structural {
+ description
+ "Structural grouping containing interface bandwidth
+ measurement configuration and operational state
+ parameters.";
+
+ container bandwidth-measurement {
+ description
+ "Configuration and operational state parameters relating to
+ per-interface bandwidth measurement. These parameters are
+ used in the case that RSVP-TE coexists with other MPLS
+ signaling protocols on an interface.";
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the containing
+ interface's bandwidth measurement.";
+
+ uses bandwidth-measurement-intf-state;
+ }
+ }
+ }
+
+ grouping bandwidth-measurement-intf-state {
+ description
+ "Operational state parameters per-interface for the measured
+ bandwidth on an interface";
+
+ leaf last-sample-time {
+ type oc-types:timeticks64;
+ description
+ "The time at which the last sample of bandwidth utilisation
+ for both RSVP-TE and non-RSVP-TE traffic was taken. This value
+ is represented in nanoseconds since the Unix epoch.";
+ }
+
+ leaf last-sample-measured-rsvp-util {
+ type uint64;
+ units "kbps";
+ description
+ "The measured RSVP-TE bandwidth utilisation at the last sample
+ (whose time is indicated in last-sample-time). This value is
+ expressed as a 64-bit unsigned integer representing the number
+ of kilobits per second that RSVP-TE traffic is consuming on
+ the interface.";
+ }
+
+ leaf last-sample-measured-sr-util {
+ type uint64;
+ units "kbps";
+ description
+ "The measured Segment Routing bandwidth utilisation at the
+ last sample (whose time is indicated in last-sample-time).
+ This value is expressed as a 64-bit unsigned integer
+ representing the number of kilobits per second that Segment
+ Routing traffic is consuming on the interface.";
+ }
+
+ leaf last-calculated-time {
+ type oc-types:timeticks64;
+ description
+ "The time at which the last calculated value for bandwidth
+ utilisation was performed.";
+ }
+
+ leaf last-calculated-sr-utilisation {
+ type uint64;
+ description
+ "The last calculated value of the Segment Routing utilisation
+ (taken post any averaging or adjustment that occurs). This
+ value is updated regardless of whether the value was flooded
+ or not.";
+ }
+
+ leaf last-flooded-time {
+ type oc-types:timeticks64;
+ description
+ "The time, expressed in nanoseconds since the epoch, at which
+ the bandwidth utilisation of non-RSVP-TE traffic resulted in
+ the value being flooded in the IGP. If the configuration of the
+ local system specifies a 0% change requires flooding, this leaf
+ will always reflect the value of the last-calculated-time. In
+ systems that have suppression due to a >0% delta being required
+ then it indicates the last time that the percentage threshold
+ was exceeded.";
+ }
+ }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/oc-ni:mpls" +
+ "/oc-ni:te-interface-attributes/oc-ni:interface" {
+ description
+ "Augment the per-interface bandwidth measurement parameters into the
+ MPLS hierarchy of network instance.";
+
+ uses bandwidth-measurement-intf-structural;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-segment-routing.yang b/src/plugins/yang/openconfig/openconfig-segment-routing.yang
new file mode 100644
index 0000000..f19b2d8
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-segment-routing.yang
@@ -0,0 +1,780 @@
+module openconfig-segment-routing {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/sr";
+ prefix "oc-sr";
+
+ // import some basic types
+ import openconfig-extensions { prefix "oc-ext"; }
+ import openconfig-mpls-types { prefix "oc-mpls-t"; }
+ import openconfig-interfaces { prefix "oc-if"; }
+ import ietf-inet-types { prefix "inet"; }
+ import ietf-yang-types { prefix "yang"; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "Configuration and operational state parameters relating to the
+ segment routing. This module defines a number of elements which are
+ instantiated in multiple places throughout the OpenConfig collection
+ of models.
+
+ Particularly:
+ - SRGB+LB dataplane instances - directly instantied by SR.
+ - SRGB+LB dataplane reservations - instantiated within MPLS and future SR
+ dataplanes.
+ - SR SID advertisements - instantiated within the relevant IGP.
+ - SR-specific counters - instantied within the relevant dataplane.";
+
+ oc-ext:openconfig-version "0.0.3";
+
+ revision "2017-01-12" {
+ description
+ "Minor compliance fixes.";
+ reference "0.0.3";
+ }
+
+ revision "2016-12-15" {
+ description
+ "Updated revision of SR module.";
+ reference "0.0.2";
+ }
+
+ revision "2016-07-28" {
+ description
+ "Initial revision of SR module.";
+ reference "0.0.1";
+ }
+
+ typedef sr-dataplane-type {
+ type enumeration {
+ enum MPLS {
+ description
+ "The entity uses MPLS labels as Segment Identifiers.";
+ }
+ enum IPV6 {
+ description
+ "The entity uses IPv6 prefixes as Segment Identifiers.";
+ }
+ }
+ description
+ "Types of data plane that can be used to instantiate a Segment
+ Routing block of SIDs.";
+ }
+
+ typedef sr-sid-type {
+ type union {
+ type oc-mpls-t:mpls-label;
+ type inet:ipv6-address-no-zone;
+ }
+ description
+ "The defined value of a segment identifier.";
+ }
+
+ grouping srgb-config {
+ description
+ "Configuration parameters relating to the SRGB.";
+
+ leaf local-id {
+ type string;
+ description
+ "Unique identifier for the segment routing global block on
+ the local system.";
+ }
+
+ leaf dataplane-type {
+ type sr-dataplane-type;
+ description
+ "The dataplane being used to instantiate the SRGB. When MPLS is specified
+ the set of MPLS label blocks that are defined in the mpls-label-blocks
+ list are used to make up the SRGB. When IPv6 is specified, the set of IPv6
+ prefixes specified in the ipv6-prefixes list are used.";
+ }
+
+ leaf-list mpls-label-blocks {
+ when "../dataplane-type = 'MPLS'" {
+ description
+ "Allow the MPLS label block to be specified only for SRGBs that are
+ using the MPLS dataplane.";
+ }
+ type leafref {
+ // We are at /network-instances/network-instance/segment-routing/
+ // srgbs/srgb/config/mpls-label-blocks
+ path "../../../../../mpls/global/reserved-label-blocks/" +
+ "reserved-label-block/config/local-id";
+ }
+ description
+ "A list of refences to the label blocks that are used to make
+ up the SRGB.";
+ }
+
+ leaf-list ipv6-prefixes {
+ when "../dataplane-type = 'IPV6'" {
+ description
+ "Allow IPv6 prefixes to be specified only when the dataplane
+ realisation of the SRGB is IPv6.";
+ }
+ type inet:ipv6-prefix;
+ description
+ "A list of IPv6 prefixes which are to be used for segment routing using
+ the IPv6 dataplane.";
+ }
+ }
+
+ grouping srgb-state {
+ description
+ "Operational state parameters relating to the SRGB.";
+
+ leaf size {
+ type uint32;
+ description
+ "The total number of SRGB entries that are available within the SRGB.";
+ }
+
+ leaf used {
+ type uint32;
+ description
+ "The total number of SRGB entries that have already been alocated by
+ protocols referencing the SRGB.";
+ }
+ }
+
+ grouping srlb-config {
+ description
+ "Configuration parameters relating to an SRLB.";
+
+ leaf local-id {
+ type string;
+ description
+ "A unique local identifier used for the Segment Routing Local Block.
+ The identifier is used when referencing the SRLB within other
+ contexts.";
+ }
+
+ leaf dataplane-type {
+ type sr-dataplane-type;
+ description
+ "The dataplane that is to be used for the Segment Routing Local Block.
+ When MPLS is specified, the local block corresponds to a block of MPLS
+ labels; when IPv6 is specified it corresponds to an IPv6 prefix.";
+ }
+
+ leaf mpls-label-block {
+ when "../dataplane-type = 'MPLS'" {
+ description
+ "Allow the MPLS label block to be specified only for SRLBs that are
+ using the MPLS dataplane.";
+ }
+ type leafref {
+ path "../../../../../mpls/global/reserved-label-blocks/" +
+ "reserved-label-block/config/local-id";
+ }
+ description
+ "A reference to the MPLS label block that is used to contain the
+ SIDs of the SRLB.";
+ }
+
+ leaf ipv6-prefix {
+ when "../dataplane-type = 'IPV6'" {
+ description
+ "Allow IPv6 prefixes to be specified only when the dataplane
+ realisation of the SRGB is IPv6.";
+ }
+ type inet:ipv6-prefix;
+ description
+ "The IPv6 prefix that is used for the SRLB.";
+ }
+ }
+
+ grouping sr-structural {
+ description
+ "Top-level structural grouping defining Segment Routing Global Blocks.";
+
+ container srgbs {
+ description
+ "Configuration and operational state parameters relating to the
+ SRGBs defined for the system.";
+
+ list srgb {
+ key "local-id";
+
+ description
+ "A single definition of an SRGB which may comprise of multiple
+ sets of dataplane addresses (IPv6 addresses, or MPLS labels).";
+
+ leaf local-id {
+ type leafref {
+ path "../config/local-id";
+ }
+ description
+ "A reference to the identifier for the SRGB.";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the SRGB.";
+ uses srgb-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to the SRGB.";
+ uses srgb-config;
+ uses srgb-state;
+ }
+ }
+ }
+
+ container srlbs {
+ description
+ "Configuration and operational state parameters relating to the
+ Segment Routing Local Blocks (SRLBs) defined for the system.";
+
+ list srlb {
+ key "local-id";
+
+ description
+ "A definition of a Segment Routing Local Block, defined to be
+ a set of Segment Identifiers (specified as MPLS labels or
+ IPv6 addreses) that are defined for local allocation by the
+ system. A block may optionally be advertised into an IGP.";
+
+ leaf local-id {
+ type leafref {
+ path "../config/local-id";
+ }
+ description
+ "Reference to the local identifier used for the SRLB.";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the SRLB.";
+ uses srlb-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parmeters relating to the SRLB.";
+ uses srlb-config;
+ }
+ }
+ }
+ }
+
+ grouping sr-mpls-top {
+ description
+ "Structural grouping defining SR definition within MPLS.";
+
+ container segment-routing {
+ description
+ "MPLS-specific Segment Routing configuration and operational state
+ parameters";
+
+ container aggregate-sid-counters {
+ description
+ "Per-SID counters aggregated across all interfaces on the local system";
+
+ list aggregate-sid-counter {
+ key "mpls-label";
+ config false;
+
+ description
+ "Counters aggregated across all of the interfaces of the local
+ system corresponding to traffic received or forwarded with a
+ particular SID";
+
+ leaf mpls-label {
+ type leafref {
+ path "../state/mpls-label";
+ }
+ description
+ "The MPLS label representing the segment identifier";
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters for per-SID statistics";
+ uses sr-mpls-sid-counters-state;
+ uses sr-mpls-common-counters;
+ }
+ }
+ }
+
+ container interfaces {
+ description
+ "Interface related Segment Routing parameters.";
+
+ list interface {
+ key "interface-id";
+
+ description
+ "Parameters and MPLS-specific configuration relating to Segment
+ Routing on an interface.";
+
+ leaf interface-id {
+ type leafref {
+ path "../config/interface-id";
+ }
+ description
+ "A reference to the ID for the interface for which SR is
+ configured";
+ }
+
+ container config {
+ description
+ "MPLS-specific Segment Routing configuration parameters
+ related to an interface.";
+ uses sr-mpls-interface-config;
+ }
+
+ container state {
+ config false;
+ description
+ "MPLS-specific Segment Routing operational state parameters
+ related to an interface.";
+ uses sr-mpls-interface-config;
+ uses sr-mpls-interface-state;
+ }
+
+ container sid-counters {
+ description
+ "Per-SID statistics for MPLS";
+
+ list sid-counter {
+ key "mpls-label";
+ config false;
+
+ description
+ "Per segment identifier counters for the MPLS dataplane.";
+
+ leaf mpls-label {
+ type leafref {
+ path "../state/mpls-label";
+ }
+ description
+ "The MPLS label representing the segment identifier";
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters for per-SID statistics";
+ uses sr-mpls-sid-counters-state;
+ uses sr-mpls-common-counters;
+ }
+
+ container forwarding-classes {
+ description
+ "Per-SID per-forwarding class counters for Segment Routing.";
+
+ list forwarding-class {
+ key "exp";
+ config false;
+
+ description
+ "SID entries for the forwarding class associated with the
+ referenced MPLS EXP.";
+
+ leaf exp {
+ type leafref {
+ path "../state/exp";
+ }
+ description
+ "Reference to the value of the EXP bits of the segment
+ identifier.";
+ }
+
+ container state {
+ config false;
+ description
+ "Per-SID, per forwarding class counters for Segment Routing
+ with the MPLS dataplane";
+
+ uses sr-mpls-interface-sid-fc-state;
+ uses sr-mpls-common-counters;
+ }
+ }
+ }
+ }
+ }
+ uses oc-if:interface-ref;
+ }
+ }
+ }
+ }
+
+ grouping sr-mpls-interface-config {
+ description
+ "MPLS-specific Segment Routing configuration for an interface";
+
+ leaf interface-id {
+ type string;
+ description
+ "A unique identifier for the interface.";
+ }
+ }
+
+ grouping sr-mpls-interface-state {
+ description
+ "MPLS-specific Segment Routing operational state parameters for an
+ interface";
+
+ uses sr-mpls-common-counters;
+ }
+
+ grouping sr-mpls-interface-sid-fc-state {
+ description
+ "Per-SID per forwarding class statistics for SR with the MPLS dataplane";
+
+ leaf exp {
+ type uint8 {
+ range "0..7";
+ }
+ description
+ "The value of the MPLS EXP (experimental) or Traffic Class bits that the
+ SID statistics relate to. Packets received with a MPLS label value
+ equal to the SID's MPLS label and EXP bits equal to the this value
+ should be counted towards the associated ingress statistics. Packets
+ that are forwarded to the destination MPLS label corresponding to the
+ SID should be counted towards this value. In the egress direction, where
+ forwarding follows a SID value that requires PHP at the local node,
+ packets should still be counted towards the egress counters.";
+ }
+ }
+
+ grouping sr-mpls-sid-counters-state {
+ description
+ "Per-SID statistics leaves";
+
+ leaf mpls-label {
+ type oc-mpls-t:mpls-label;
+ description
+ "The MPLS label used for the segment identifier";
+ }
+ }
+
+ grouping sr-mpls-common-counters {
+ description
+ "Per segment identifier counters used in the model";
+
+ leaf in-pkts {
+ type yang:counter64;
+ description
+ "A cumulative counter of the packets received within the context
+ which have matched a label corresponding to an SR Segment Identifier.";
+ }
+
+ leaf in-octets {
+ type yang:counter64;
+ description
+ "The cumulative counter of the total bytes received within the context
+ which have matched a label corresponding to an SR Segment Identifier";
+ }
+
+ leaf out-pkts {
+ type yang:counter64;
+ description
+ "A cumulative counter of the total number of packets transmitted by
+ the local system within the context which have a label imposed that
+ corresponds to an Segment Identifier.";
+ }
+
+ leaf out-octets {
+ type yang:counter64;
+ description
+ "A cumulative counter of the total bytes transmitted by the local
+ system within the context which have a label imported that
+ corresponds to an SR Segment Identifier.";
+ }
+ }
+
+ grouping sr-igp-config {
+ description
+ "Configuration parameters relating to segment routing within an
+ IGP.";
+
+ leaf enabled {
+ type boolean;
+ description
+ "When this leaf is set to true, the segment routing extensions are
+ utilised within the IGP.";
+ }
+
+ leaf srgb {
+ type leafref {
+ path "../../../../../../../segment-routing/srgbs/srgb/config/local-id";
+ }
+ description
+ "A reference to the Segment Routing Global Block (SRGB) that is
+ to be used by this IGP instance.";
+ }
+
+ leaf srlb {
+ // Leaf is defined at
+ // /network-instances/network-instance/protocols/protocol/<igp>/global/
+ // segment-routing/config
+ type leafref {
+ path "../../../../../../../segment-routing/srlbs/srlb/config/local-id";
+ }
+ description
+ "A reference to the Segment Routing Local Block (SRLB) that is to
+ be advertised by the IGP instance.";
+ }
+ }
+
+ grouping sr-igp-top {
+ description
+ "Per-instance configuration and state parameters for Segment Routing
+ in an IGP.";
+
+ container segment-routing {
+ description
+ "Configuration and operational state relating to segment routing.";
+
+ container config {
+ description
+ "Configuration parameters relating to the configuration of segment
+ routing for the IGP instance.";
+ uses sr-igp-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to segment routing for the
+ IGP instance.";
+ uses sr-igp-config;
+ }
+ }
+ }
+
+ grouping sr-igp-interface-prefix-sid-config {
+ description
+ "Configuration parameters relating to an IGP prefix SID advertisement";
+
+ leaf prefix {
+ type inet:ip-prefix;
+ description
+ "The IP prefix for which the IGP prefix SID should be advertised. The
+ value specified is a local prefix on the interface which is advertised
+ into the IGP.";
+ }
+
+ leaf sid-id {
+ type sr-sid-type;
+ description
+ "The Segment Identifier to be used when advertising the IGP Prefix SID.";
+ }
+
+ leaf label-options {
+ type enumeration {
+ enum NO_PHP {
+ description
+ "When this value is specified, the penultimate hop must not pop
+ the Prefix-SID label before forwarding it to the local system.";
+ }
+ enum EXPLICIT_NULL {
+ description
+ "When set, the penultimate hop must swap the prefix SID for the
+ relevant explicit null label before forwarding the packet.";
+ }
+ }
+ description
+ "The options associated with the IGP prefix SID for MPLS. The value
+ of this leaf specifies the option that the SID should be advertised
+ into the IGP with.";
+ }
+ }
+
+ grouping sr-igp-interface-adjsid-config {
+ description
+ "Configuration parameters relating to an Adj-SID on an interface";
+
+ leaf sid-id {
+ type union {
+ type sr-sid-type;
+ type enumeration {
+ enum DYNAMIC {
+ description
+ "The SID chosen for the Adjacency SID should be dynamically
+ allocated from the system's dynamic range of Segment
+ Identifiers. For MPLS, this range should be considered to be
+ those labels that do not fall within a reserved label block.";
+ }
+ }
+ }
+ description
+ "The value of the Adj-SID to be advertised. Where a static SID
+ identifier is specified, this should be advertised directly by the
+ system. Where the DYNAMIC value is specified, this should be treated
+ as a dynamically allocated value. When the MPLS data plane is in use
+ the dynamic value should not fall within a reserved-label-block.";
+ }
+
+ leaf protection-eligible {
+ type boolean;
+ default true;
+ description
+ "Whether the Adj-SID should be considered to be eligible for protection
+ using IP or MPLS FRR during a network failure. When this value is set to
+ true, the B-flag of the Adj-SID is set to 1, and the local system should
+ provide FRR paths for the associated label forwarding entry. When it is
+ set to false, the local system must not provide FRR for the specified
+ LFIB entry.";
+ }
+
+ leaf group {
+ type boolean;
+ default false;
+ description
+ "When set to true, the Adj-SID is indicated to be part of a group, and
+ the G flag is set to 1 in the corresponding advertisement in the IGP.";
+ }
+
+ leaf neighbor {
+ type inet:ip-address;
+ description
+ "The remote system on the interface with which the Adj-SID is
+ associated.";
+ }
+ }
+
+ grouping sr-igp-interface-adjsid-state {
+ description
+ "Operational state parameters relating to the adjacency SID for an
+ interface";
+
+ leaf allocated-dynamic-local {
+ type sr-sid-type;
+ description
+ "Where an Adjacency SID with a dynamic value is to be allocated by
+ the system, this leaf reports to the value of the Adj-SID allocated
+ to this interface.";
+ }
+ }
+
+ grouping sr-igp-interface-top {
+ description
+ "Per-interface configuration and operational state relating to an
+ interface within the IGP.";
+
+ container segment-routing {
+ description
+ "Configuration and operatioanl state parameters relating to segment
+ routing for an interface within the IGP.";
+
+ container prefix-sids {
+ description
+ "Configuration and operational state parameters relating to
+ the advertisement of a segment routing IGP-Prefix SID for this
+ interface.";
+
+ list prefix-sid {
+ key "prefix";
+
+ description
+ "An IGP prefix that should have a segment routing IGP-Prefix SID
+ allocated to it. The value of the SID is specified by the SID ID,
+ as an absolute value. If the absolute value falls within the SRGB,
+ the Global flag should be advertised by the system.";
+
+ leaf prefix {
+ type leafref {
+ path "../config/prefix";
+ }
+ description
+ "Reference to the prefix for which the IGP-Prefix SID is to be
+ advertised";
+ }
+
+ container config {
+ description
+ "Configuration parameters for the IGP Prefix SID.";
+ uses sr-igp-interface-prefix-sid-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters for the IGP-Prefix SID.";
+ uses sr-igp-interface-prefix-sid-config;
+ }
+ }
+ }
+
+ container adjacency-sids {
+ description
+ "Configuration and operational state parameters relating to
+ the advertisement of a segment routing adjacency SID for this
+ interface.";
+
+ list adjacency-sid {
+ key "neighbor sid-id";
+
+ description
+ "An Adjacency SID to be advertised for the specified interface.
+ The Adj-SID's identifier (the SID ID) must be unique, with flags
+ specified indicating the parameters that should be set for the SID.
+ Where a SID value is specified that is allocated from the SRGB, the
+ global flag must be set by the system.";
+
+ leaf sid-id {
+ type leafref {
+ path "../config/sid-id";
+ }
+ description
+ "Reference to the segment identifier to be used by the local
+ system.";
+ }
+
+ leaf neighbor {
+ type leafref {
+ path "../config/neighbor";
+ }
+ description
+ "Reference to the neighbor with which the Adjacency SID is
+ associated.";
+ }
+
+ container config {
+ description
+ "Configuraton parameters relating to the AdjSID.";
+ uses sr-igp-interface-adjsid-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state parameters relating to the AdjSID.";
+ uses sr-igp-interface-adjsid-config;
+ uses sr-igp-interface-adjsid-state;
+ }
+ }
+ }
+ }
+ }
+
+ grouping sr-top {
+ description
+ "Top level grouping for Segment Routing";
+
+ container segment-routing {
+ description
+ "Configuration and operational state parameters relating to
+ segment routing.";
+
+ uses sr-structural;
+ }
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-spanning-tree-types.yang b/src/plugins/yang/openconfig/openconfig-spanning-tree-types.yang
new file mode 100644
index 0000000..0ca9571
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-spanning-tree-types.yang
@@ -0,0 +1,225 @@
+module openconfig-spanning-tree-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/spanning-tree/types";
+
+ prefix "oc-stp-types";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines types related to the
+ spanning-tree protocol model.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2017-07-14" {
+ description
+ "Migrated to OpenConfig types; fixed missing applied state
+ in rapid-pvst";
+ reference "0.2.0";
+ }
+
+ revision "2016-10-03" {
+ description
+ "Initial public revision";
+ reference "0.1.0";
+ }
+
+ // identity statements
+
+ identity STP_PROTOCOL {
+ description
+ "base identity for support spanning tree protocol";
+ }
+
+ identity RSTP {
+ base STP_PROTOCOL;
+ description
+ "Rapid Spanning Tree Protocol";
+ reference "IEEE 802.1D 17";
+ }
+
+ identity MSTP {
+ base STP_PROTOCOL;
+ description
+ "Multiple Spanning Tree Protocol";
+ reference "IEEE 802.1Q 13";
+ }
+
+ identity RAPID_PVST {
+ base STP_PROTOCOL;
+ description
+ "Rapid Per Vlan Spanning Tree Protocol";
+ }
+
+ identity STP_PORT_STATE {
+ description
+ "base identity for the different Spanning Tree Protocol port
+ states";
+ reference
+ "IEEE 802.1D 7.4 Port States and the active topology";
+ }
+
+ identity DISABLED {
+ base STP_PORT_STATE;
+ description
+ "A port that is manually isolated from the network";
+ }
+
+ identity LISTENING {
+ base STP_PORT_STATE;
+ description
+ "Processing BPDUs and building active toplogy";
+ }
+
+ identity LEARNING {
+ base STP_PORT_STATE;
+ description
+ "Building bridging tables; no forwarding of data";
+ }
+
+ identity BLOCKING {
+ base STP_PORT_STATE;
+ description
+ "A port that would cause a loop if it were sending data,
+ so it is only receiving BPDUs, untill a topology change
+ removes the possibliity of a loop";
+ }
+
+ identity FORWARDING {
+ base STP_PORT_STATE;
+ description
+ "Sending and receiving data, normal operation";
+ }
+
+ identity STP_EDGE_PORT {
+ description
+ "base identity for the different edge port modes";
+ reference
+ "IEEE 802.1D 17.13.1";
+ }
+
+ identity EDGE_ENABLE {
+ base STP_EDGE_PORT;
+ description
+ "Enable edge port for the bridge port";
+ }
+
+ identity EDGE_DISABLE {
+ base STP_EDGE_PORT;
+ description
+ "Disable edge port for the bridge port";
+ }
+
+ identity EDGE_AUTO {
+ base STP_EDGE_PORT;
+ description
+ "Enable edge port autodetction for the bridge port";
+ }
+
+ identity STP_PORT_ROLE {
+ description
+ "Base identity for the different Spanning Tree Protocol port
+ roles";
+ reference
+ "IEEE 802.1D 17.7 Port Role assignments";
+ }
+
+ identity ROOT {
+ base STP_PORT_ROLE;
+ description
+ "The port that receives the best BPDU on a bridge is the
+ root port";
+ }
+
+ identity DESIGNATED {
+ base STP_PORT_ROLE;
+ description
+ "A port is designated if it can send the best BPDU on the
+ segment to which it is connected.";
+ }
+
+ identity ALTERNATE {
+ base STP_PORT_ROLE;
+ description
+ "An alternate port receives more useful BPDUs from another
+ bridge and is a port blocked";
+ }
+
+ identity BACKUP {
+ base STP_PORT_ROLE;
+ description
+ "A backup port receives more useful BPDUs from the same
+ bridge it is on and is a port blocked";
+ }
+
+ // typedef statements
+
+ typedef stp-bridge-priority-type {
+ type uint32 {
+ range 1..611440;
+ }
+ description
+ "The manageable component of the Bridge Identifier";
+ reference "IEEE 802.1D 17.13.7 Bridge Identifier Priority";
+ }
+
+ typedef stp-port-priority-type {
+ type uint8 {
+ range 1..240;
+ }
+ description
+ "The manageable component of the Port Identifier,
+ also known as the Port Priority";
+ reference
+ "IEEE 802.1D 17.13.10 Port Identifier Priority";
+ }
+
+ typedef stp-guard-type {
+ type enumeration {
+ enum ROOT {
+ description
+ "Enable root guard";
+ }
+ enum LOOP {
+ description
+ "Enable loop guard";
+ }
+ enum NONE {
+ description
+ "disable guard";
+ }
+ }
+ description
+ "Type definition for the different STP guard for the switch port";
+ reference "IEEE 802.1D 17.2";
+ }
+
+ typedef stp-link-type {
+ type enumeration {
+ enum P2P {
+ description
+ "Point-to-Point link";
+ }
+ enum SHARED {
+ description
+ "Shared link";
+ }
+ }
+ description
+ "Type definition for the different link types";
+ reference "IEEE 802.1D 17.2";
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-spanning-tree.yang b/src/plugins/yang/openconfig/openconfig-spanning-tree.yang
new file mode 100644
index 0000000..3a70d5e
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-spanning-tree.yang
@@ -0,0 +1,823 @@
+module openconfig-spanning-tree {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/spanning-tree";
+
+ prefix "oc-stp";
+
+ import openconfig-spanning-tree-types { prefix oc-stp-types; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-vlan-types { prefix oc-vlan-types; }
+ import openconfig-yang-types { prefix oc-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 spanning tree protocol.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2017-07-14" {
+ description
+ "Migrated to OpenConfig types; fixed missing applied state
+ in rapid-pvst";
+ reference "0.2.0";
+ }
+
+ revision "2016-10-03" {
+ description
+ "Initial public revision";
+ reference "0.1.0";
+ }
+
+
+ // identity statements
+
+
+ // grouping statements
+
+ grouping stp-interfaces-state {
+ description
+ "Grouping of STP operational data for bridge port";
+
+ leaf port-num {
+ type uint16;
+ description
+ "The port number of the bridge port";
+ reference "RFC4188 BRIDGE-MIB dot1dStpPort";
+ }
+
+ leaf role {
+ type identityref {
+ base oc-stp-types:STP_PORT_ROLE;
+ }
+ description
+ "The current role of the bridge port";
+ reference
+ "IEEE8021-MSTP-MIB ieee8021MstpPortRole";
+ }
+
+ leaf port-state {
+ type identityref {
+ base oc-stp-types:STP_PORT_STATE;
+ }
+ description
+ "The current state of the bridge port";
+ reference "RFC4188 BRIDGE-MIB dot1dStpPortState";
+ }
+
+ leaf designated-root-priority {
+ type oc-stp-types:stp-bridge-priority-type;
+ description
+ "The bridge priority of the bridge recorded as the
+ root in the configuration BPDUs transmitted by the designated
+ bridge for the segment to which the port is attached";
+ reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedRoot";
+ }
+
+ leaf designated-root-address {
+ type oc-yang:mac-address;
+ description
+ "The bridge address of the bridge recorded as the
+ root in the configuration BPDUs transmitted by the designated
+ bridge for the segment to which the port is attached";
+ reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedRoot";
+ }
+
+ leaf designated-cost {
+ type uint32;
+ description
+ "The path cost of the Designated Port of the
+ segment connected to this port";
+ reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedCost";
+ }
+
+ leaf designated-bridge-priority {
+ type oc-stp-types:stp-bridge-priority-type;
+ description
+ "The bridge priority of the bridge that this port considers
+ to be the designated bridge for this port's segment.";
+ reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedBridge";
+ }
+
+ leaf designated-bridge-address {
+ type oc-yang:mac-address;
+ description
+ "The bridge address of the bridge that this port considers
+ to be the designated bridge for this port's segment.";
+ reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedBridge";
+ }
+
+ leaf designated-port-priority {
+ type oc-stp-types:stp-port-priority-type;
+ description
+ "The Port priority of the port on the Designated
+ Bridge for this port's segment, two octet string";
+ reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedPort";
+ }
+
+ leaf designated-port-num {
+ type uint16;
+ description
+ "The Port number of the port on the Designated
+ Bridge for this port's segment, two octet string";
+ reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedPort";
+ }
+
+ leaf forward-transisitions {
+ type oc-yang:counter64;
+ description
+ "The number of times this port has transitioned
+ from the Learning state to the Forwarding state";
+ reference "RFC4188 BRIDGE-MIB dot1dStpPortForwardTransitions";
+ }
+
+ container counters {
+ description
+ "The BPDU packet transmition statistics";
+
+ leaf bpdu-sent {
+ type oc-yang:counter64;
+ description
+ "The number of BPDU packet sent";
+ }
+
+ leaf bpdu-received {
+ type oc-yang:counter64;
+ description
+ "The number of BPDU packet received";
+ }
+ }
+ }
+
+ grouping stp-interfaces-config {
+ description
+ "Grouping of STP configuration for bridge port";
+
+ leaf name {
+ type oc-if:base-interface-ref;
+ description
+ "Reference to the STP ethernet interface";
+ }
+
+ leaf cost {
+ type uint32 {
+ range 1..200000000;
+ }
+ description
+ "The port's contribution, when it is the Root Port,
+ to the Root Path Cost for the Bridge";
+ reference
+ "IEEE 802.1D 17.13.11 PortPathCost";
+ }
+
+ leaf port-priority {
+ type oc-stp-types:stp-port-priority-type;
+ description
+ "The manageable component of the Port Identifier,
+ also known as the Port Priority";
+ reference
+ "IEEE 802.1D 17.13.10 Port Identifier Priority";
+ }
+ }
+
+ grouping stp-interfaces-top {
+ description
+ "Grouping of STP configuration and operation data for
+ bridge port";
+
+ container interfaces {
+ description
+ "Enclosing container for the list of interface references";
+
+ list interface {
+ key "name";
+ description
+ "List of interfaces on which STP is enable";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container config {
+ description
+ "Configuration data for STP on each interface";
+
+ uses stp-interfaces-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for STP on each interface";
+
+ uses stp-interfaces-config;
+ uses stp-interfaces-state;
+ }
+ }
+ }
+ }
+
+ grouping bridge-priority-config {
+ description
+ "Grouping for bridge priority";
+
+ leaf bridge-priority {
+ type oc-stp-types:stp-bridge-priority-type;
+ description
+ "The manageable component of the Bridge Identifier";
+ reference
+ "IEEE 802.1D 17.13.7 Bridge Identifier Priority";
+ }
+ }
+
+ grouping stp-common-state {
+ description
+ "Grouping for common STP operation data";
+
+ leaf bridge-address {
+ type oc-yang:mac-address;
+ description
+ "A unique 48-bit Universally Administered MAC Address
+ assigned to the bridge";
+ reference
+ "IEEE 802.1D 7.12.5 Unique identification of a bridge";
+ }
+
+ leaf designated-root-priority {
+ type oc-stp-types:stp-bridge-priority-type;
+ description
+ "The bridge priority of the root of the spanning
+ tree, as determined by the Spanning Tree Protocol,
+ as executed by this node";
+ reference
+ "RFC4188 BRIDGE-MIB dot1dStpDesignatedRoot";
+ }
+
+ leaf designated-root-address {
+ type oc-yang:mac-address;
+ description
+ "The bridge address of the root of the spanning
+ tree, as determined by the Spanning Tree Protocol,
+ as executed by this node";
+ reference
+ "RFC4188 BRIDGE-MIB dot1dStpDesignatedRoot";
+ }
+
+ leaf root-port {
+ type uint16;
+ description
+ "The port number of the port which offers the lowest
+ cost path from this bridge to the root bridge";
+ reference
+ "RFC4188 BRIDGE-MIB dot1dStpRootPort";
+ }
+
+ leaf root-cost {
+ type uint32;
+ description
+ "The cost of the path to the root as seen from this bridge";
+ reference
+ "RFC4188 BRIDGE-MIB dot1dStpRootCost";
+ }
+
+ leaf hold-time {
+ type uint8;
+ description
+ "This time value determines the interval length
+ during which no more than two Configuration bridge
+ PDUs shall be transmitted by this node";
+ reference
+ "RFC4188 BRIDGE-MIB dot1dStpHoldTime";
+ }
+
+ leaf topology-changes {
+ type oc-yang:counter64;
+ description
+ "The total number of topology changes detected by
+ this bridge since the management entity was last
+ reset or initialized";
+ reference
+ "RFC4188 BRIDGE-MIB dot1dStpTopChanges";
+ }
+
+ leaf time-since-topology-change {
+ type oc-types:timeticks64;
+ description
+ "The time (in hundredths of a second) since the
+ last time a topology change was detected by the
+ bridge entity
+
+ The value is the timestamp in seconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ reference
+ "RFC4188 BRIDGE-MIB dot1dStpTimeSinceTopologyChange";
+ }
+ }
+
+ grouping stp-timer-config {
+ description
+ "Grouping for common STP parameters";
+
+ leaf hello-time {
+ type uint8 {
+ range 1..10;
+ }
+ units "seconds";
+ description
+ "The interval between periodic transmissions of
+ configuration messages by designated ports";
+ reference
+ "IEEE 802.1D 17.13.6 Bridge Hello Time";
+ }
+
+ leaf max-age {
+ type uint8 {
+ range 6..40;
+ }
+ units "seconds";
+ description
+ "The maximum age of the information transmitted by the
+ bridge when it is the root bridge";
+ reference
+ "IEEE 802.1D 17.13.8 Bridge Max Age";
+ }
+
+ leaf forwarding-delay {
+ type uint8 {
+ range 4..30;
+ }
+ units "seconds";
+ description
+ "The delay used by STP bridges to transition root and
+ designated ports to forwarding";
+ reference
+ "IEEE 802.1D 17.13.5 Bridge Forward Delay";
+ }
+
+ leaf hold-count {
+ type uint8 {
+ range 1..10;
+ }
+ default 6;
+ description
+ "the maximum number of BPDUs per second that the
+ switch can send from an interface";
+ reference
+ "IEEE 802.1D 17.13.12 Transmit Hold Count";
+ }
+ }
+
+ grouping stp-rapid-pvst-config {
+ description
+ "Configuration parameters relating to rapid PVST";
+
+ leaf vlan-id {
+ type oc-vlan-types:vlan-id;
+ description
+ "Interface VLAN ID";
+ }
+ }
+
+ grouping stp-rapid-pvst-top {
+ description
+ "Top grouping for rapid per vlan spanning tree configuration
+ and operation data";
+
+ list vlan {
+ key "vlan-id";
+ description
+ "List of the vlans";
+
+ leaf vlan-id {
+ type leafref {
+ path "../config/vlan-id";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container config {
+ description
+ "Configuration data for each vlan";
+
+ uses stp-rapid-pvst-config;
+ uses stp-timer-config;
+ uses bridge-priority-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational data for each vlan";
+
+ uses stp-rapid-pvst-config;
+ uses stp-timer-config;
+ uses bridge-priority-config;
+ uses stp-common-state;
+ }
+
+ uses stp-interfaces-top;
+ }
+ }
+
+ grouping mst-instance-config {
+ description
+ "Grouping for mstp instance configuration";
+
+ leaf mst-id {
+ type uint16 {
+ range "1..4094";
+ }
+ description
+ "In an MSTP Bridge, an MSTID, i.e., a value used to identify
+ a spanning tree (or MST) instance.";
+ reference
+ "IEEE8021-TC-MIB IEEE8021MstIdentifier";
+ }
+
+ leaf-list vlan {
+ type union {
+ type oc-vlan-types:vlan-id;
+ type oc-vlan-types:vlan-range;
+ }
+ description
+ "list of vlans mapped to the MST instance";
+ }
+ }
+
+ grouping mst-instance-top {
+ description
+ "Top level grouping for mstp instances";
+
+ list mst-instance {
+ key "mst-id";
+ description
+ "List of the mstp instances";
+
+ leaf mst-id {
+ type leafref {
+ path "../config/mst-id";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container config {
+ description
+ "Configuration data for MSTP instance";
+
+ uses mst-instance-config;
+ uses bridge-priority-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational data for MSTP instance";
+
+ uses mst-instance-config;
+ uses bridge-priority-config;
+ uses stp-common-state;
+ }
+
+ uses stp-interfaces-top;
+ }
+ }
+
+ grouping mstp-config {
+ description
+ "Grouping for MSTP configuration data";
+
+ leaf name {
+ type string {
+ length "1..32";
+ }
+ description
+ "The Configuration Name in the MST Configuration Identifier";
+ reference
+ "IEEE 802.1Q 13.8 MST Configuration Identifier (MCID)";
+ }
+
+ leaf revision {
+ type uint32;
+ description
+ "The Revision Level in the MST Configuration Identifier";
+ reference
+ "IEEE 802.1Q 13.8 MST Configuration Identifier";
+ }
+
+ leaf max-hop {
+ type uint8 {
+ range 1..255;
+ }
+ description
+ "The max hop determines the number of bridges in an MST
+ region that a BPDU can traverse before it is discarded";
+ reference
+ "IEEE 802.1Q 13.26.4 BridgeTimes";
+ }
+
+ uses stp-timer-config;
+ }
+
+ grouping mstp-state {
+ description
+ "Operational state data for MSTP";
+ }
+
+ grouping stp-mstp-top {
+ description
+ "Top grouping for MSTP configuration and operation data";
+
+ container config {
+ description
+ "Configuration data for MSTP";
+
+ uses mstp-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational data for MSTP";
+
+ uses mstp-config;
+ uses mstp-state;
+ }
+
+ container mst-instances {
+ description
+ "Configuration and operation data for MSTP instances";
+
+ uses mst-instance-top;
+ }
+ }
+
+ grouping stp-rstp-top {
+ description
+ "Top grouping for RSTP configuration and operation data";
+
+ container config {
+ description
+ "Configuration data for RSTP";
+
+ uses stp-timer-config;
+ uses bridge-priority-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for RSTP";
+
+ uses stp-timer-config;
+ uses bridge-priority-config;
+ uses stp-common-state;
+ }
+
+ uses stp-interfaces-top;
+ }
+
+ grouping stp-interface-common-config {
+ description
+ "Configuration data for interface specific STP features";
+
+ leaf name {
+ type oc-if:base-interface-ref;
+ description
+ "Reference to the STP Ethernet interface";
+ }
+
+ leaf edge-port {
+ type identityref {
+ base oc-stp-types:STP_EDGE_PORT;
+ }
+ description
+ "Configure the edge port state";
+ }
+
+ leaf link-type {
+ type oc-stp-types:stp-link-type;
+ description
+ "specifies the interface's link type";
+ }
+
+ leaf guard {
+ type oc-stp-types:stp-guard-type;
+ description
+ "Enable root guard or loop guard";
+ }
+
+ uses stp-bpdu-config;
+
+ }
+
+ grouping stp-interface-common-state {
+ description
+ "Operational state data for STP on interfaces";
+ }
+
+ grouping stp-interface-common-top {
+ description
+ "Top-level grouping for interface specific STP features";
+
+ list interface {
+ key "name";
+ description
+ "List of interfaces on which STP is enable";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container config {
+ description
+ "Configuration data for STP on each bridge port";
+
+ uses stp-interface-common-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for STP on each bridge port";
+
+ uses stp-interface-common-config;
+ uses stp-interface-common-state;
+ }
+ }
+ }
+
+ grouping stp-bpdu-config {
+ description
+ "Grouping for STP BPDU configuration";
+
+ leaf bpdu-guard {
+ type boolean;
+ description
+ "Enable edge port BPDU guard";
+ }
+
+ leaf bpdu-filter {
+ type boolean;
+ description
+ "Enable edge port BPDU filter";
+ }
+ }
+
+ grouping stp-global-config {
+ description
+ "Global spanning tree configuration";
+
+ leaf-list enabled-protocol {
+ type identityref {
+ base oc-stp-types:STP_PROTOCOL;
+ }
+ description
+ "List of the spanning tree protocols enabled on the
+ device";
+ }
+
+ leaf bridge-assurance {
+ type boolean;
+ description
+ "Enable bridge assurance to protect against unidirectional
+ link failure";
+ }
+
+ leaf etherchannel-misconfig-guard {
+ type boolean;
+ description
+ "EtherChannel guard detects a misconfigured EtherChannel
+ when interfaces on the switch are configured as an
+ EtherChannel while interfaces on the other device are not
+ or when not all the interfaces on the other device are in
+ the same EtherChannel.";
+ }
+
+ leaf bpduguard-timeout-recovery {
+ type uint8;
+ units "seconds";
+ description
+ "Amount of time, in seconds, the interface receiving BPDUs
+ is disabled. Once the timeout expires, the interface is
+ brought back into service.";
+ }
+
+ leaf loop-guard {
+ type boolean;
+ description
+ "The loop guard default setting for the bridge";
+ }
+
+ uses stp-bpdu-config;
+
+ }
+
+ grouping stp-global-state {
+ description
+ "Global operational state for STP";
+ }
+
+ grouping stp-global-base {
+ description
+ "Grouping for global spanning tree data";
+
+ container config {
+ description
+ "Global spanning tree configuration";
+ uses stp-global-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Global spanning tree state";
+ uses stp-global-config;
+ uses stp-global-state;
+ }
+ }
+
+ grouping stp-top {
+ description
+ "Top-level grouping for spanning-tree model";
+
+ container stp {
+ description
+ "Top-level container for spanning tree configuration and
+ state data";
+
+ container global {
+ description
+ "Global configuration and state data";
+
+ uses stp-global-base;
+ }
+
+ container rstp {
+
+ description
+ "Rapid Spanning-tree protocol configuration and operation
+ data";
+
+ uses stp-rstp-top;
+ }
+
+ container mstp {
+ description
+ "Multi Spanning-tree protocol configuration and operation
+ data";
+
+ uses stp-mstp-top;
+ }
+
+ container rapid-pvst {
+ description
+ "Rapid per vlan Spanning-tree protocol configuration and
+ operational data";
+
+ uses stp-rapid-pvst-top;
+ }
+
+ container interfaces {
+ description
+ "Enclosing container for the list of interface references";
+
+ uses stp-interface-common-top;
+ }
+ }
+ }
+
+ // data definition statements
+
+ uses stp-top;
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-system-logging.yang b/src/plugins/yang/openconfig/openconfig-system-logging.yang
new file mode 100644
index 0000000..14bb1c5
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-system-logging.yang
@@ -0,0 +1,492 @@
+module openconfig-system-logging {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/system/logging";
+
+ prefix "oc-log";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-inet-types { prefix oc-inet; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and operational state data
+ for common logging facilities on network systems.";
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2017-09-18" {
+ description
+ "Updated to use OpenConfig types modules";
+ reference "0.3.0";
+ }
+
+ revision "2017-07-06" {
+ description
+ "Move to oc-inet types, add IETF attribution, add RADIUS
+ counters, changed password leaf names to indicate hashed";
+ reference "0.2.0";
+ }
+
+ revision "2017-01-29" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ identity SYSLOG_FACILITY {
+ description
+ "Base identity for Syslog message facilities.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity ALL {
+ base SYSLOG_FACILITY;
+ description
+ "All supported facilities";
+ }
+
+ identity KERNEL {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for kernel messages";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity USER {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for user-level messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity MAIL {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for the mail system.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity SYSTEM_DAEMON {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for the system daemons.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity AUTH {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for security/authorization messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity SYSLOG {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for messages generated internally by syslogd
+ facility.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity AUTHPRIV {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for privileged security/authorization messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+
+ identity NTP {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for the NTP subsystem.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity AUDIT {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for log audit messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity CONSOLE {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for log alert messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity LOCAL0 {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for local use 0 messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity LOCAL1 {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for local use 1 messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity LOCAL2 {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for local use 2 messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity LOCAL3 {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for local use 3 messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity LOCAL4 {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for local use 4 messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity LOCAL5 {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for local use 5 messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity LOCAL6 {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for local use 6 messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity LOCAL7 {
+ base SYSLOG_FACILITY;
+ description
+ "The facility for local use 7 messages.";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ identity LOG_DESTINATION_TYPE {
+ description
+ "Base identity for destination for logging messages";
+ }
+
+ identity DEST_CONSOLE {
+ base LOG_DESTINATION_TYPE;
+ description
+ "Directs log messages to the console";
+ }
+
+ identity DEST_BUFFER {
+ base LOG_DESTINATION_TYPE;
+ description
+ "Directs log messages to and in-memory circular buffer";
+ }
+
+ identity DEST_FILE {
+ base LOG_DESTINATION_TYPE;
+ description
+ "Directs log messages to a local file";
+ }
+
+ identity DEST_REMOTE {
+ base LOG_DESTINATION_TYPE;
+ description
+ "Directs log messages to a remote syslog server";
+ }
+
+ // typedef statements
+
+ typedef syslog-severity {
+ type enumeration {
+ enum EMERGENCY {
+ description
+ "Emergency: system is unusable (0)";
+ }
+ enum ALERT {
+ description
+ "Alert: action must be taken immediately (1)";
+ }
+ enum CRITICAL {
+ description
+ "Critical: critical conditions (2)";
+ }
+ enum ERROR {
+ description
+ "Error: error conditions (3)";
+ }
+ enum WARNING {
+ description
+ "Warning: warning conditions (4)";
+ }
+ enum NOTICE {
+ description
+ "Notice: normal but significant condition(5)";
+ }
+ enum INFORMATIONAL {
+ description
+ "Informational: informational messages (6)";
+ }
+ enum DEBUG {
+ description
+ "Debug: debug-level messages (7)";
+ }
+ }
+ description
+ "Syslog message severities";
+ reference
+ "IETF RFC 5424 - The Syslog Protocol";
+ }
+
+ // grouping statements
+
+ grouping logging-selectors-config {
+ description
+ "Configuration data for logging selectors";
+
+ leaf facility {
+ type identityref {
+ base SYSLOG_FACILITY;
+ }
+ description
+ "Specifies the facility, or class of messages to log";
+ }
+
+ leaf severity {
+ type syslog-severity;
+ description
+ "Specifies that only messages of the given severity (or
+ greater severity) for the corresonding facility are logged";
+ }
+ }
+
+ grouping logging-selectors-state {
+ description
+ "Operational state data for logging selectors";
+ }
+
+ grouping logging-selectors-top {
+ description
+ "Top-level grouping for the logging selector list";
+
+ container selectors {
+ description
+ "Enclosing container ";
+
+ list selector {
+ key "facility severity";
+ description
+ "List of selectors for log messages";
+
+ leaf facility {
+ type leafref {
+ path "../config/facility";
+ }
+ description
+ "Reference to facility list key";
+ }
+
+ leaf severity {
+ type leafref {
+ path "../config/severity";
+ }
+ description
+ "Reference to severity list key";
+ }
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses logging-selectors-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses logging-selectors-config;
+ uses logging-selectors-state;
+ }
+ }
+ }
+ }
+
+ grouping logging-console-config {
+ description
+ "Configuration data for console logging";
+ }
+
+ grouping logging-console-state {
+ description
+ "Operational state data for console logging";
+ }
+
+ grouping logging-console-top {
+ description
+ "Top-level grouping for console logging data";
+
+ container console {
+ description
+ "Top-level container for data related to console-based
+ logging";
+
+ container config {
+ description
+ "Configuration data for console logging";
+
+ uses logging-console-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for console logging";
+
+ uses logging-console-config;
+ uses logging-console-state;
+ }
+
+ uses logging-selectors-top;
+ }
+ }
+
+ grouping logging-remote-config {
+ description
+ "Configuration data for remote log servers";
+
+ leaf host {
+ type oc-inet:host;
+ description
+ "IP address or hostname of the remote log server";
+ }
+
+ leaf source-address {
+ type oc-inet:ip-address;
+ description
+ "Source IP address for packets to the log server";
+ }
+
+ leaf remote-port {
+ type oc-inet:port-number;
+ default 514;
+ description
+ "Sets the destination port number for syslog UDP messages to
+ the server. The default for syslog is 514.";
+ }
+ }
+
+ grouping logging-remote-state {
+ description
+ "Operational state data for remote log servers";
+ }
+
+ grouping logging-remote-top {
+ description
+ "Top-level grouping for remote log servers";
+
+ container remote-servers {
+ description
+ "Enclosing container for the list of remote log servers";
+
+ list remote-server {
+ key "host";
+ description
+ "List of remote log servers";
+
+ leaf host {
+ type leafref {
+ path "../config/host";
+ }
+ description
+ "Reference to the host list key";
+ }
+
+ container config {
+ description
+ "Configuration data for remote log servers";
+
+ uses logging-remote-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for remote log servers";
+
+ uses logging-remote-config;
+ uses logging-remote-state;
+ }
+ uses logging-selectors-top;
+ }
+ }
+ }
+
+ grouping logging-top {
+ description
+ "Top-level grouping for logging data";
+
+ container logging {
+ description
+ "Top-level container for data related to logging / syslog";
+
+ uses logging-console-top;
+ uses logging-remote-top;
+ }
+ }
+ // data definition statements
+
+ // augment statements
+
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-system-management.yang b/src/plugins/yang/openconfig/openconfig-system-management.yang
new file mode 100644
index 0000000..67f8aab
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-system-management.yang
@@ -0,0 +1,126 @@
+module openconfig-system-management {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/system/management";
+
+ prefix "oc-sys-mgmt";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-inet-types { prefix oc-inet; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines configuration and operational state data
+ related to management services.";
+
+ oc-ext:openconfig-version "0.1.1";
+
+ revision "2018-08-28" {
+ description
+ "Update description of the ANY enum.";
+ reference "0.1.1";
+ }
+
+ revision "2018-07-26" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping system-grpc-server-config {
+ description
+ "Configuration data for the gRPC server";
+
+ leaf enable {
+ type boolean;
+ default true;
+ description
+ "Enables the gRPC server. The gRPC server is enabled by
+ default";
+ }
+
+ leaf port {
+ type oc-inet:port-number;
+ description
+ "TCP port on which the gRPC server should listen";
+ }
+
+ leaf transport-security {
+ type boolean;
+ description
+ "Enables gRPC transport security (e.g., TLS or SSL)";
+ }
+
+ leaf certificate-id {
+ type string;
+ description
+ "The certificate ID to be used for authentication";
+ }
+
+ leaf-list listen-addresses {
+ type union {
+ type oc-inet:ip-address;
+ type enumeration {
+ enum ANY {
+ description
+ "The gRPC daemon should listen on any address
+ bound to an interface on the system.";
+ }
+ }
+ }
+ description
+ "The IP addresses that the gRPC server should listen
+ on. This may be an IPv4 or an IPv6 address";
+ }
+ }
+
+ grouping system-grpc-server-top {
+ description
+ "Top-level grouping for system gRPC server data";
+
+ container grpc-server {
+ description
+ "Top-level container for the gRPC server";
+
+ container config {
+ description
+ "Configuration data for the system gRPC server";
+
+ uses system-grpc-server-config;
+ }
+
+ container state {
+ config false;
+
+ description
+ "Operational state data for the system gRPC server";
+
+ uses system-grpc-server-config;
+ }
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-system-terminal.yang b/src/plugins/yang/openconfig/openconfig-system-terminal.yang
new file mode 100644
index 0000000..dc44dc5
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-system-terminal.yang
@@ -0,0 +1,239 @@
+module openconfig-system-terminal {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/system/terminal";
+
+ prefix "oc-sys-term";
+
+ // import some basic types
+ 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
+ related to remote terminal services such as ssh and telnet.";
+
+ oc-ext:openconfig-version "0.3.0";
+
+ revision "2017-09-18" {
+ description
+ "Updated to use OpenConfig types modules";
+ reference "0.3.0";
+ }
+
+ revision "2017-07-06" {
+ description
+ "Move to oc-inet types, add IETF attribution, add RADIUS
+ counters, changed password leaf names to indicate hashed";
+ reference "0.2.0";
+ }
+
+ revision "2017-01-29" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping system-terminal-common-config {
+ description
+ "Common configuration data for terminal services";
+
+ leaf timeout {
+ type uint16;
+ units seconds;
+ description
+ "Set the idle timeout in seconds on terminal connections to
+ the system for the protocol.";
+ }
+
+ leaf rate-limit {
+ type uint16;
+ units "conn/min";
+ description
+ "Set a limit on the number of connection attempts per
+ minute to the system for the protocol.";
+ }
+
+ leaf session-limit {
+ type uint16;
+ description
+ "Set a limit on the number of simultaneous active terminal
+ sessions to the system for the protocol (e.g., ssh,
+ telnet, ...) ";
+ }
+ }
+
+ grouping system-terminal-common-state {
+ description
+ "Common operational state data for terminal services";
+ }
+
+ grouping system-terminal-common-top {
+ description
+ "Top-level grouping for common terminal service data";
+
+ container terminal-servers {
+ description
+ "Top-level container for terminal services";
+
+ container config {
+ description
+ "Configuration data for terminal services";
+
+ uses system-terminal-common-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses system-terminal-common-config;
+ uses system-terminal-common-state;
+ }
+ }
+ }
+
+ grouping system-ssh-server-config {
+ description
+ "Configuration data for system ssh configuration";
+
+ leaf enable {
+ type boolean;
+ default true;
+ description
+ "Enables the ssh server. The ssh server is enabled by
+ default.";
+ }
+
+ leaf protocol-version {
+ type enumeration {
+ enum V2 {
+ description
+ "Use SSH v2 only";
+ }
+ enum V1 {
+ description
+ "Use SSH v1 only";
+ }
+ enum V1_V2 {
+ description
+ "Use either SSH v1 or v2";
+ }
+ }
+ default V2;
+ description
+ "Set the protocol version for SSH connections to the system";
+ }
+
+ uses system-terminal-common-config;
+ }
+
+ grouping system-ssh-server-state {
+ description
+ "Operational state data for ssh server";
+ }
+
+ grouping system-ssh-server-top {
+ description
+ "Top-level grouping for ssh server data";
+
+ container ssh-server {
+ description
+ "Top-level container for ssh server";
+
+ container config {
+ description
+ "Configuration data for the system ssh server";
+
+ uses system-ssh-server-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the system ssh server";
+
+ uses system-ssh-server-config;
+ uses system-ssh-server-state;
+ }
+ }
+ }
+
+ grouping system-telnet-server-config {
+ description
+ "Configuration data for telnet server";
+
+ leaf enable {
+ type boolean;
+ default false;
+ description
+ "Enables the telnet server. Telnet is disabled by
+ default";
+ }
+ uses system-terminal-common-config;
+
+ }
+
+ grouping system-telnet-server-state {
+ description
+ "Operational state data for telnet server";
+ }
+
+ grouping system-telnet-server-top {
+ description
+ "Top-level grouping for telnet server ";
+
+ container telnet-server {
+ description
+ "Top-level container for telnet terminal servers";
+
+ container config {
+ description
+ "Configuration data for telnet";
+
+ uses system-telnet-server-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for telnet";
+
+ uses system-telnet-server-config;
+ uses system-telnet-server-state;
+ }
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-system.yang b/src/plugins/yang/openconfig/openconfig-system.yang
new file mode 100644
index 0000000..f4d4034
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-system.yang
@@ -0,0 +1,978 @@
+module openconfig-system {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/system";
+
+ prefix "oc-sys";
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-yang-types { prefix oc-yang; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-aaa { prefix oc-aaa; }
+ import openconfig-system-logging { prefix oc-log; }
+ import openconfig-system-management { prefix oc-sys-mgmt; }
+ import openconfig-system-terminal { prefix oc-sys-term; }
+ import openconfig-procmon { prefix oc-proc; }
+ import openconfig-alarms { prefix oc-alarms; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "Model for managing system-wide services and functions on
+ network devices.
+
+ Portions of this code were derived from IETF RFC 7317.
+ 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 "0.6.0";
+
+ revision "2018-07-17" {
+ description
+ "Add gRPC server data";
+ reference "0.6.0";
+ }
+
+ revision "2018-01-21" {
+ description
+ "Add cpu utilization data";
+ reference "0.5.0";
+ }
+
+ revision "2017-12-15" {
+ description
+ "Add alarms to the system model";
+ reference "0.4.0";
+ }
+
+ revision "2017-09-18" {
+ description
+ "Updated to use OpenConfig types modules";
+ reference "0.3.0";
+ }
+
+ revision "2017-07-06" {
+ description
+ "Move to oc-inet types, add IETF attribution, add RADIUS
+ counters, changed password leaf names to indicate hashed";
+ reference "0.2.0";
+ }
+
+ revision "2017-01-29" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ identity NTP_AUTH_TYPE {
+ description
+ "Base identity for encryption schemes supported for NTP
+ authentication keys";
+ }
+
+ identity NTP_AUTH_MD5 {
+ base NTP_AUTH_TYPE;
+ description
+ "MD5 encryption method";
+ }
+
+ // typedef statements
+
+ typedef timezone-name-type {
+ type string;
+ description
+ "A time zone name as used by the Time Zone Database,
+ sometimes referred to as the 'Olson Database'.
+
+ The exact set of valid values is an implementation-specific
+ matter. Client discovery of the exact set of time zone names
+ for a particular server is out of scope.";
+ reference
+ "BCP 175: Procedures for Maintaining the Time Zone Database";
+ }
+
+ // grouping statements
+
+ grouping system-clock-config {
+ description
+ "Configuration data for system-wide clock configuration";
+
+ leaf timezone-name {
+ type timezone-name-type;
+ description
+ "The TZ database name to use for the system, such
+ as 'Europe/Stockholm'.";
+ reference "IANA Time Zone Database
+ http://www.iana.org/time-zones";
+ }
+ }
+
+ grouping system-clock-state {
+ description
+ "Operational state data for system-wide clock configuration";
+ }
+
+ grouping system-clock-top {
+ description
+ "Top-level grouping for system-wide clock configuration";
+
+ container clock {
+ description
+ "Top-level container for clock configuration data";
+
+ container config {
+ description
+ "Configuration data for system clock";
+
+ uses system-clock-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for system clock";
+
+ uses system-clock-config;
+ uses system-clock-state;
+ }
+ }
+ }
+
+ grouping system-global-config {
+ description "system-wide configuration parameters";
+
+ leaf hostname {
+ type oc-inet:domain-name;
+ description
+ "The hostname of the device -- should be a single domain
+ label, without the domain.";
+ }
+
+ leaf domain-name {
+ type oc-inet:domain-name;
+ description
+ "Specifies the domain name used to form fully qualified name
+ for unqualified hostnames.";
+ }
+
+ leaf login-banner {
+ type string;
+ description
+ "The console login message displayed before the login prompt,
+ i.e., before a user logs into the system.";
+ }
+
+ leaf motd-banner {
+ type string;
+ description
+ "The console message displayed after a user logs into the
+ system. They system may append additional standard
+ information such as the current system date and time, uptime,
+ last login timestamp, etc.";
+ }
+ }
+
+ grouping system-global-state {
+ description
+ "Global operational state data for the system";
+
+ leaf current-datetime {
+ type oc-yang:date-and-time;
+ description
+ "The current system date and time.";
+ }
+
+ leaf boot-time {
+ type oc-types:timeticks64;
+ description
+ "This timestamp indicates the time that the system was last
+ restarted. The value is the timestamp in seconds relative
+ to the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+
+ }
+
+ grouping system-dns-config {
+ description "DNS / resolver related configuration data";
+
+ leaf-list search {
+ type oc-inet:domain-name;
+ ordered-by user;
+ description
+ "An ordered list of domains to search when resolving
+ a host name.";
+ }
+ }
+
+ grouping system-dns-state {
+ description
+ "Operational state data for system DNS resolver";
+
+ }
+
+ grouping system-dns-servers-config {
+ description
+ "Configuration data for DNS resolvers";
+
+ //RFC 7317 includes a single-value choice statement to for
+ //TCP and UDP transport. This has been removed since it the
+ //transport protocol is not generally available as an options
+ //on target devices. It may be added back if and when needed.
+
+ leaf address {
+ type oc-inet:ip-address;
+ description
+ "The address of the DNS server, can be either IPv4
+ or IPv6.";
+ }
+
+ leaf port {
+ type oc-inet:port-number;
+ default 53;
+ description
+ "The port number of the DNS server.";
+ }
+
+ //RFC 7317 includes resolver timeout and attempts options. These
+ //have been omitted as they are not available on many targets. If
+ //and when they are required, they may be added back in.
+ }
+
+ grouping system-dns-static-config {
+ description
+ "Configuration data for static host entries";
+
+ leaf hostname {
+ type string;
+ description
+ "Hostname for the static DNS entry";
+ }
+
+ leaf-list alias {
+ type string;
+ description
+ "Additional aliases for the hostname";
+ }
+
+ leaf-list ipv4-address {
+ type oc-inet:ipv4-address;
+ description
+ "List of IPv4 addressses for the host entry";
+ }
+
+ leaf-list ipv6-address {
+ type oc-inet:ipv6-address;
+ description
+ "List of IPv6 addresses for the host entry";
+ }
+ }
+
+ grouping system-dns-static-state {
+ description
+ "Operational state data for static host entries";
+ }
+
+ grouping system-dns-static-top {
+ description
+ "Top-level grouping for static DNS host entries";
+
+ container host-entries {
+ description
+ "Enclosing container for list of static host entries";
+
+ list host-entry {
+ key "hostname";
+ description
+ "List of static host entries";
+
+ leaf hostname {
+ type leafref {
+ path "../config/hostname";
+ }
+ description
+ "Reference to the hostname list key";
+ }
+
+ container config {
+ description
+ "Configuration data for static host entries";
+
+ uses system-dns-static-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for static host entries";
+
+ uses system-dns-static-config;
+ uses system-dns-static-state;
+ }
+ }
+ }
+ }
+
+ grouping system-dns-servers-state {
+ description
+ "Operational state data for DNS resolvers";
+
+ }
+
+ grouping system-dns-servers-top {
+ description
+ "Top-level grouping for the list of DNS resolvers.";
+
+ container servers {
+ description
+ "Enclosing container for DNS resolver list";
+
+ list server {
+ key "address";
+ ordered-by user;
+ description
+ "List of the DNS servers that the resolver should query.
+
+ When the resolver is invoked by a calling application, it
+ sends the query to the first name server in this list. If
+ no response has been received within 'timeout' seconds,
+ the resolver continues with the next server in the list.
+ If no response is received from any server, the resolver
+ continues with the first server again. When the resolver
+ has traversed the list 'attempts' times without receiving
+ any response, it gives up and returns an error to the
+ calling application.
+
+ Implementations MAY limit the number of entries in this
+ list.";
+
+ leaf address {
+ type leafref {
+ path "../config/address";
+ }
+ description
+ "References the configured address of the DNS server";
+ }
+
+ container config {
+ description
+ "Configuration data for each DNS resolver";
+
+ uses system-dns-servers-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for each DNS resolver";
+
+ uses system-dns-servers-config;
+ uses system-dns-servers-state;
+ }
+
+ }
+ }
+ }
+
+ grouping system-dns-top {
+ description
+ "Top-level grouping for DNS / resolver config and operational
+ state data";
+
+ container dns {
+ description
+ "Enclosing container for DNS resolver data";
+
+ container config {
+ description
+ "Configuration data for the DNS resolver";
+
+ uses system-dns-config;
+
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the DNS resolver";
+
+ uses system-dns-config;
+ uses system-dns-state;
+
+ }
+
+ uses system-dns-servers-top;
+ uses system-dns-static-top;
+ }
+ }
+
+ grouping system-ntp-server-config {
+ description
+ "Configuration data for NTP servers";
+
+ leaf address {
+ type oc-inet:host;
+ description
+ "The address or hostname of the NTP server.";
+ }
+
+ leaf port {
+ type oc-inet:port-number;
+ default 123;
+ description
+ "The port number of the NTP server.";
+ }
+
+ leaf version {
+ type uint8 {
+ range 1..4;
+ }
+ default 4;
+ description
+ "Version number to put in outgoing NTP packets";
+ }
+
+ leaf association-type {
+ type enumeration {
+ enum SERVER {
+ description
+ "Use client association mode. This device
+ will not provide synchronization to the
+ configured NTP server.";
+ }
+ enum PEER {
+ description
+ "Use symmetric active association mode.
+ This device may provide synchronization
+ to the configured NTP server.";
+ }
+ enum POOL {
+ description
+ "Use client association mode with one or
+ more of the NTP servers found by DNS
+ resolution of the domain name given by
+ the 'address' leaf. This device will not
+ provide synchronization to the servers.";
+ }
+ }
+ default SERVER;
+ description
+ "The desired association type for this NTP server.";
+ }
+ leaf iburst {
+ type boolean;
+ default false;
+ description
+ "Indicates whether this server should enable burst
+ synchronization or not.";
+ }
+ leaf prefer {
+ type boolean;
+ default false;
+ description
+ "Indicates whether this server should be preferred
+ or not.";
+ }
+ }
+
+ grouping system-ntp-server-state {
+ description
+ "Operational state data for NTP servers";
+
+ leaf stratum {
+ type uint8;
+ description
+ "Indicates the level of the server in the NTP hierarchy. As
+ stratum number increases, the accuracy is degraded. Primary
+ servers are stratum while a maximum value of 16 indicates
+ unsynchronized. The values have the following specific
+ semantics:
+
+ | 0 | unspecified or invalid
+ | 1 | primary server (e.g., equipped with a GPS receiver)
+ | 2-15 | secondary server (via NTP)
+ | 16 | unsynchronized
+ | 17-255 | reserved";
+ reference
+ "RFC 5905 - Network Time Protocol Version 4: Protocol and
+ Algorithms Specification";
+ }
+
+ leaf root-delay {
+ type uint32;
+ // TODO: reconsider units for these values -- the spec defines
+ // rootdelay and rootdisperson as 2 16-bit integers for seconds
+ // and fractional seconds, respectively. This gives a
+ // precision of ~15 us (2^-16). Using milliseconds here based
+ // on what implementations typically provide and likely lack
+ // of utility for less than millisecond precision with NTP
+ // time sync.
+ units "milliseconds";
+ description
+ "The round-trip delay to the server, in milliseconds.";
+ reference
+ "RFC 5905 - Network Time Protocol Version 4: Protocol and
+ Algorithms Specification";
+ }
+
+ leaf root-dispersion {
+ type uint64;
+ units "milliseconds";
+ description
+ "Dispersion (epsilon) represents the maximum error inherent
+ in the measurement";
+ reference
+ "RFC 5905 - Network Time Protocol Version 4: Protocol and
+ Algorithms Specification";
+ }
+
+ leaf offset {
+ type uint64;
+ units "milliseconds";
+ description
+ "Estimate of the current time offset from the peer. This is
+ the time difference between the local and reference clock.";
+ }
+
+ leaf poll-interval {
+ type uint32;
+ units "seconds";
+ description
+ "Polling interval of the peer";
+ }
+ }
+
+ grouping system-ntp-server-top {
+ description
+ "Top-level grouping for the list of NTP servers";
+
+ container servers {
+ description
+ "Enclosing container for the list of NTP servers";
+
+ list server {
+ key "address";
+ description
+ "List of NTP servers to use for system clock
+ synchronization. If '/system/ntp/enabled'
+ is 'true', then the system will attempt to
+ contact and utilize the specified NTP servers.";
+
+ leaf address {
+ type leafref {
+ path "../config/address";
+ }
+ description
+ "References the configured address or hostname of the
+ NTP server.";
+ }
+
+ container config {
+ description
+ "Configuration data for an NTP server.";
+
+ uses system-ntp-server-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for an NTP server.";
+
+ uses system-ntp-server-config;
+ uses system-ntp-server-state;
+ }
+
+ }
+ }
+ }
+
+ grouping system-ntp-auth-keys-config {
+ description
+ "Configuration data ";
+
+ leaf key-id {
+ type uint16;
+ description
+ "Integer identifier used by the client and server to
+ designate a secret key. The client and server must use
+ the same key id.";
+ }
+
+ leaf key-type {
+ type identityref {
+ base NTP_AUTH_TYPE;
+ }
+ description
+ "Encryption type used for the NTP authentication key";
+ }
+
+ leaf key-value {
+ type string;
+ description
+ "NTP authentication key value";
+ }
+ }
+
+ grouping system-ntp-auth-keys-state {
+ description
+ "Operational state data for NTP auth key data";
+ }
+
+ grouping system-ntp-auth-keys-top {
+ description
+ "Top-level grouping for NTP auth key data";
+
+ container ntp-keys {
+ description
+ "Enclosing container for list of NTP authentication keys";
+
+ list ntp-key {
+ key "key-id";
+ description
+ "List of NTP authentication keys";
+
+ leaf key-id {
+ type leafref {
+ path "../config/key-id";
+ }
+ description
+ "Reference to auth key-id list key";
+ }
+
+ container config {
+ description
+ "Configuration data for NTP auth keys";
+
+ uses system-ntp-auth-keys-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for NTP auth keys";
+
+ uses system-ntp-auth-keys-config;
+ uses system-ntp-auth-keys-state;
+ }
+ }
+ }
+ }
+
+ grouping system-ntp-config {
+ description
+ "Configuration data for system-wide NTP operation.";
+
+ leaf enabled {
+ type boolean;
+ default false;
+ description
+ "Enables the NTP protocol and indicates that the system should
+ attempt to synchronize the system clock with an NTP server
+ from the servers defined in the 'ntp/server' list.";
+ }
+
+ leaf ntp-source-address {
+ type oc-inet:ip-address;
+ description
+ "Source address to use on outgoing NTP packets";
+ }
+
+ leaf enable-ntp-auth {
+ type boolean;
+ default false;
+ description
+ "Enable or disable NTP authentication -- when enabled, the
+ system will only use packets containing a trusted
+ authentication key to synchronize the time.";
+ }
+ }
+
+ grouping system-ntp-state {
+ description
+ "Operational state data for system-wide NTP operation.";
+
+ leaf auth-mismatch {
+ type oc-yang:counter64;
+ description
+ "Count of the number of NTP packets received that were not
+ processed due to authentication mismatch.";
+ }
+ }
+
+ grouping system-ntp-top {
+ description
+ "Top-level grouping for configuration and state data for NTP";
+
+ container ntp {
+ description
+ "Top-level container for NTP configuration and state";
+
+ container config {
+ description
+ "Configuration data for NTP client.";
+
+ uses system-ntp-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for NTP services.";
+
+ uses system-ntp-config;
+ uses system-ntp-state;
+ }
+ uses system-ntp-auth-keys-top;
+ uses system-ntp-server-top;
+ }
+ }
+
+ grouping system-memory-config {
+ description
+ "Configuration data for system memory";
+ }
+
+ grouping system-memory-state {
+ description
+ "Operational state data for system memory";
+
+ leaf physical {
+ type uint64;
+ units bytes;
+ // TODO: consider making units in megabytes
+ description
+ "Reports the total physical memory available on the
+ system.";
+ }
+
+ leaf reserved {
+ type uint64;
+ units bytes;
+ description
+ "Memory reserved for system use";
+ }
+ }
+
+ grouping system-memory-top {
+ description
+ "Top-level grouping for system memory data definitions";
+
+ container memory {
+ description
+ "Top-level container for system memory data";
+
+ container config {
+ description
+ "Configuration data for system memory";
+
+ uses system-memory-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for system memory";
+
+ uses system-memory-config;
+ uses system-memory-state;
+ }
+ }
+ }
+
+ grouping system-cpu-state {
+ description
+ "Operational state data for the system CPU(s)";
+
+ leaf index {
+ type union {
+ type enumeration {
+ enum ALL {
+ description
+ "Index value indicating all CPUs in the system";
+ }
+ }
+ type uint32;
+ }
+ description
+ "The CPU index for each processor core on the system. On a
+ single-core system, the index should be zero. The ALL
+ index signifies an aggregation of the CPU utilization
+ statistics over all cores in the system.";
+ }
+
+ container total {
+ description
+ "Total CPU utilization.";
+
+ uses oc-types:avg-min-max-instant-stats-pct;
+ }
+
+ container user {
+ description
+ "Percentage of CPU time spent running in user space.";
+
+ uses oc-types:avg-min-max-instant-stats-pct;
+ }
+
+ container kernel {
+ description
+ "Percentage of CPU time spent running in kernel space.";
+
+ uses oc-types:avg-min-max-instant-stats-pct;
+ }
+
+ container nice {
+ description
+ "Percentage of CPU time spent running low-priority (niced)
+ user processes.";
+
+ uses oc-types:avg-min-max-instant-stats-pct;
+ }
+
+ container idle {
+ description
+ "Percentage of CPU time spent idle.";
+
+ uses oc-types:avg-min-max-instant-stats-pct;
+ }
+
+ container wait {
+ description
+ "Percentage of CPU time spent waiting for I/O.";
+
+ uses oc-types:avg-min-max-instant-stats-pct;
+ }
+
+ container hardware-interrupt {
+ description
+ "Percentage of CPU time spent servicing hardware interrupts.";
+
+ uses oc-types:avg-min-max-instant-stats-pct;
+ }
+
+ container software-interrupt {
+ description
+ "Percentage of CPU time spent servicing software interrupts";
+
+ uses oc-types:avg-min-max-instant-stats-pct;
+ }
+ }
+
+ grouping system-cpu-top {
+ description
+ "Top-level grouping for system CPU data";
+
+ container cpus {
+ config false;
+ description
+ "Enclosing container for the list of CPU cores on the
+ system";
+
+ list cpu {
+ key "index";
+ description
+ "List of CPU cores on the system (including logical CPUs
+ on hyperthreaded systems), keyed by either a numerical
+ index, or the ALL value for an entry representing the
+ aggregation across all CPUs.";
+
+ leaf index {
+ type leafref {
+ path "../state/index";
+ }
+ description
+ "Reference to list key";
+ }
+
+ container state {
+
+ description
+ "Operational state data for the system CPU(s)";
+
+ uses system-cpu-state;
+ }
+ }
+ }
+ }
+
+ grouping system-top {
+ description
+ "Top level system data containers";
+
+ container system {
+ description
+ "Enclosing container for system-related configuration and
+ operational state data";
+
+ container config {
+ description "Global configuration data for the system";
+
+ uses system-global-config;
+
+ }
+
+ container state {
+ config false;
+ description "Global operational state data for the system";
+
+ uses system-global-config;
+ uses system-global-state;
+ }
+
+ uses system-clock-top;
+ uses system-dns-top;
+ uses system-ntp-top;
+ uses oc-sys-mgmt:system-grpc-server-top;
+ uses oc-sys-term:system-ssh-server-top;
+ uses oc-sys-term:system-telnet-server-top;
+ uses oc-log:logging-top;
+ uses oc-aaa:aaa-top;
+ uses system-memory-top;
+ uses system-cpu-top;
+ uses oc-proc:procmon-processes-top;
+ uses oc-alarms:alarms-top;
+ }
+ }
+
+ // data definition statements
+
+ uses system-top;
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-telemetry-types.yang b/src/plugins/yang/openconfig/openconfig-telemetry-types.yang
new file mode 100644
index 0000000..375fed1
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-telemetry-types.yang
@@ -0,0 +1,115 @@
+module openconfig-telemetry-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/telemetry-types";
+
+ prefix "oc-telemetry-types";
+
+ import openconfig-extensions { prefix oc-ext; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines type and identities used by the OpenConfig
+ telemetry model.";
+
+ oc-ext:openconfig-version "0.4.1";
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes";
+ reference "0.4.1";
+ }
+
+ revision "2017-02-20" {
+ description
+ "Fixes for YANG 1.0 compliance, add types module";
+ reference "0.4.0";
+ }
+
+ revision "2016-04-05" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+
+
+ // identity statements
+
+ identity DATA_ENCODING_METHOD {
+ description
+ "Base identity for supported encoding for configuration and
+ operational state data";
+ }
+
+ identity ENC_XML {
+ base DATA_ENCODING_METHOD;
+ description
+ "XML encoding";
+ }
+
+ identity ENC_JSON_IETF {
+ base DATA_ENCODING_METHOD;
+ description
+ "JSON encoded based on IETF draft standard";
+ reference
+ "draft-ietf-netmod-yang-json";
+ }
+
+ identity ENC_PROTO3 {
+ base DATA_ENCODING_METHOD;
+ description
+ "Protocol buffers v3";
+ reference
+ "https://developers.google.com/protocol-buffers/docs/overview";
+ }
+
+ identity STREAM_PROTOCOL {
+ description "Base identity for a telemetry stream protocol";
+ }
+
+ identity STREAM_SSH {
+ base "STREAM_PROTOCOL";
+ description
+ "Telemetry stream is carried over a SSH connection";
+ }
+
+ identity STREAM_GRPC {
+ base "STREAM_PROTOCOL";
+ description
+ "Telemetry stream is carried over via the gRPC framework";
+ }
+
+ identity STREAM_JSON_RPC {
+ base "STREAM_PROTOCOL";
+ description
+ "Telemetry stream is carried via the JSON-RPC framework";
+ }
+
+ identity STREAM_THRIFT_RPC {
+ base "STREAM_PROTOCOL";
+ description
+ "Telemetry stream is carried via the Apache Thrift framework";
+ }
+
+ identity STREAM_WEBSOCKET_RPC {
+ base "STREAM_PROTOCOL";
+ description
+ "Telemetry stream is carried by the WebSocket framework";
+ }
+
+
+ // typedef statements
+
+
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-telemetry.yang b/src/plugins/yang/openconfig/openconfig-telemetry.yang
new file mode 100644
index 0000000..de26ec3
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-telemetry.yang
@@ -0,0 +1,771 @@
+module openconfig-telemetry {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/telemetry";
+
+ prefix "oc-telemetry";
+
+ // import some basic types
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-telemetry-types { prefix oc-telemetry-types; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group www.openconfig.net";
+
+ description
+ "Data model which creates the configuration for the telemetry
+ systems and functions on the device.";
+
+ oc-ext:openconfig-version "0.5.0";
+
+ revision "2018-08-17" {
+ description
+ "Update telemetry model to comply with the OpenConfig
+ style for lists and their containers. Remove subscription
+ exclusions.";
+ reference "0.5.0";
+ }
+
+ revision "2017-08-24" {
+ description
+ "Minor formatting fixes";
+ reference "0.4.1";
+ }
+
+ revision "2017-02-20" {
+ description
+ "Fixes for YANG 1.0 compliance, add types module";
+ reference "0.4.0";
+ }
+
+ revision "2016-04-05" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+ grouping telemetry-top {
+ description
+ "Top level grouping for telemetry configuration and operational
+ state data";
+
+ container telemetry-system {
+ description
+ "Top level configuration and state for the
+ device's telemetry system.";
+
+ container sensor-groups {
+ description
+ "Top level container for sensor-groups.";
+
+ list sensor-group {
+ key "sensor-group-id";
+ description
+ "List of telemetry sensory groups on the local
+ system, where a sensor grouping represents a resuable
+ grouping of multiple paths and exclude filters.";
+
+ leaf sensor-group-id {
+ type leafref {
+ path "../config/sensor-group-id";
+ }
+ description
+ "Reference to the name or identifier of the
+ sensor grouping";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to the
+ telemetry sensor grouping";
+ uses telemetry-sensor-group-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information relating to the telemetry
+ sensor group";
+ uses telemetry-sensor-group-config;
+ }
+
+ container sensor-paths {
+ description
+ "Top level container to hold a set of sensor
+ paths grouped together";
+
+ list sensor-path {
+ key "path";
+ description
+ "List of paths in the model which together
+ comprise a sensor grouping. Filters for each path
+ to exclude items are also provided.";
+
+ leaf path {
+ type leafref {
+ path "../config/path";
+ }
+ description
+ "Reference to the path of interest";
+ }
+
+ container config {
+ description
+ "Configuration parameters to configure a set
+ of data model paths as a sensor grouping";
+ uses telemetry-sensor-path-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Configuration parameters to configure a set
+ of data model paths as a sensor grouping";
+ uses telemetry-sensor-path-config;
+ }
+ }
+ }
+ }
+ }
+
+ container destination-groups {
+ description
+ "Top level container for destination group configuration
+ and state.";
+
+ list destination-group {
+ key "group-id";
+ description
+ "List of destination-groups. Destination groups allow the
+ reuse of common telemetry destinations across the
+ telemetry configuration. An operator references a
+ set of destinations via the configurable
+ destination-group-identifier.
+
+ A destination group may contain one or more telemetry
+ destinations";
+
+ leaf group-id {
+ type leafref {
+ path "../config/group-id";
+ }
+ description
+ "Unique identifier for the destination group";
+ }
+
+ container config {
+ description
+ "Top level config container for destination groups";
+ leaf group-id {
+ type string;
+ description
+ "Unique identifier for the destination group";
+ }
+ }
+
+ container state {
+ config false;
+ description
+ "Top level state container for destination groups";
+
+ leaf group-id {
+ type string;
+ description
+ "Unique identifier for destination group";
+ }
+ }
+
+ container destinations {
+ description
+ "The destination container lists the destination
+ information such as IP address and port of the
+ telemetry messages from the network element.";
+ list destination {
+ key "destination-address destination-port";
+ description
+ "List of telemetry stream destinations";
+
+ leaf destination-address {
+ type leafref {
+ path "../config/destination-address";
+ }
+ description
+ "Reference to the destination address of the
+ telemetry stream";
+ }
+
+ leaf destination-port {
+ type leafref {
+ path "../config/destination-port";
+ }
+ description
+ "Reference to the port number of the stream
+ destination";
+ }
+
+ container config {
+ description
+ "Configuration parameters relating to
+ telemetry destinations";
+ uses telemetry-stream-destination-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information associated with
+ telemetry destinations";
+ uses telemetry-stream-destination-config;
+ }
+ }
+ }
+ }
+ }
+
+ container subscriptions {
+ description
+ "This container holds information for both persistent
+ and dynamic telemetry subscriptions.";
+
+ container persistent-subscriptions {
+ description
+ "This container holds information relating to persistent
+ telemetry subscriptions. A persistent telemetry
+ subscription is configued locally on the device through
+ configuration, and is persistent across device restarts or
+ other redundancy changes.";
+
+ list persistent-subscription {
+ key "name";
+
+ description
+ "List of telemetry subscriptions. A telemetry
+ subscription consists of a set of collection
+ destinations, stream attributes, and associated paths to
+ state information in the model (sensor data)";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the identifier of the subscription
+ itself. The id will be the handle to refer to the
+ subscription once created";
+ }
+
+ container config {
+ description
+ "Config parameters relating to the telemetry
+ subscriptions on the local device";
+
+ uses telemetry-subscription-name-config;
+ uses telemetry-local-source-address-config;
+ uses telemetry-qos-marking-config;
+ uses telemetry-stream-protocol-config;
+ uses telemetry-stream-encoding-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State parameters relating to the telemetry
+ subscriptions on the local device";
+
+ uses telemetry-subscription-name-config;
+ uses telemetry-subscription-config;
+ uses telemetry-subscription-state;
+ uses telemetry-local-source-address-config;
+ uses telemetry-qos-marking-config;
+ uses telemetry-stream-protocol-config;
+ uses telemetry-stream-encoding-config;
+ }
+
+ container sensor-profiles {
+ description
+ "A sensor profile is a set of sensor groups or
+ individual sensor paths which are associated with a
+ telemetry subscription. This is the source of the
+ telemetry data for the subscription to send to the
+ defined collectors.";
+ list sensor-profile {
+ key "sensor-group";
+ description
+ "List of telemetry sensor groups used
+ in the subscription";
+
+ leaf sensor-group {
+ type leafref {
+ path "../config/sensor-group";
+ }
+ description
+ "Reference to the telemetry sensor group name";
+ }
+
+ container config {
+ description
+ "Configuration parameters related to the sensor
+ profile for a subscription";
+ uses telemetry-sensor-profile-config;
+ }
+
+ container state {
+ config false;
+ description
+ "State information relating to the sensor profile
+ for a subscription";
+ uses telemetry-sensor-profile-config;
+ }
+ }
+ }
+
+ container destination-groups {
+ description
+ "A subscription may specify destination addresses.
+ If the subscription supplies destination addresses,
+ the network element will be the initiator of the
+ telemetry streaming, sending it to the destination(s)
+ specified.
+
+ If the destination set is omitted, the subscription
+ preconfigures certain elements such as paths and
+ sample intervals under a specified subscription ID.
+ In this case, the network element will NOT initiate an
+ outbound connection for telemetry, but will wait for
+ an inbound connection from a network management
+ system.
+
+ It is expected that the network management system
+ connecting to the network element will reference
+ the preconfigured subscription ID when initiating
+ a subscription.";
+
+ list destination-group {
+ key "group-id";
+ description
+ "Identifier of the previously defined destination
+ group";
+
+ leaf group-id {
+ type leafref {
+ path "../config/group-id";
+ }
+ description
+ "The destination group id references a configured
+ group of destinations for the telemetry stream.";
+ }
+
+ container config {
+ description
+ "Configuration parameters related to telemetry
+ destinations.";
+
+ leaf group-id {
+ type leafref {
+ path "../../../../../../../destination-groups"
+ + "/destination-group/group-id";
+ }
+ description
+ "The destination group id references a reusable
+ group of destination addresses and ports for
+ the telemetry stream.";
+ }
+ }
+
+ container state {
+ config false;
+ description
+ "State information related to telemetry
+ destinations";
+
+ leaf group-id {
+ type leafref {
+ path "../../../../../../../destination-groups"
+ + "/destination-group/group-id";
+ }
+ description
+ "The destination group id references a reusable
+ group of destination addresses and ports for
+ the telemetry stream.";
+ }
+ }
+ }
+ }
+ }
+ }
+
+ container dynamic-subscriptions {
+ description
+ "This container holds information relating to dynamic
+ telemetry subscriptions. A dynamic subscription is
+ typically configured through an RPC channel, and does not
+ persist across device restarts, or if the RPC channel is
+ reset or otherwise torn down.";
+
+
+ list dynamic-subscription {
+ key "id";
+
+ config false;
+ description
+ "List representation of telemetry subscriptions that
+ are configured via an inline RPC, otherwise known
+ as dynamic telemetry subscriptions.";
+
+ leaf id {
+ type leafref {
+ path "../state/id";
+ }
+
+ description
+ "Reference to the identifier of the subscription
+ itself. The id will be the handle to refer to the
+ subscription once created";
+ }
+
+ container state {
+ config false;
+ description
+ "State information relating to dynamic telemetry
+ subscriptions.";
+
+ uses telemetry-subscription-config;
+ uses telemetry-stream-destination-config;
+ uses telemetry-stream-frequency-config;
+ uses telemetry-heartbeat-config;
+ uses telemetry-suppress-redundant-config;
+ uses telemetry-qos-marking-config;
+ uses telemetry-stream-protocol-config;
+ uses telemetry-stream-encoding-config;
+ }
+
+ container sensor-paths {
+ description
+ "Top level container to hold a set of sensor
+ paths grouped together";
+
+ list sensor-path {
+ key "path";
+ description
+ "List of paths in the model which together
+ comprise a sensor grouping. Filters for each path
+ to exclude items are also provided.";
+
+ leaf path {
+ type leafref {
+ path "../state/path";
+ }
+ description
+ "Reference to the path of interest";
+ }
+
+ container state {
+ config false;
+ description
+ "State information for a dynamic subscription's
+ paths of interest";
+ uses telemetry-sensor-path-config;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // identity statements
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping telemetry-sensor-path-config {
+ description
+ "Configuration parameters relating to the
+ grouping of data model paths comprising a
+ sensor grouping";
+ leaf path {
+ type string;
+ description
+ "Path to a section of operational state of interest
+ (the sensor).";
+ }
+
+ leaf exclude-filter {
+ type string;
+ description
+ "Filter to exclude certain values out of the state
+ values";
+ //May not be necessary. Could remove.
+ }
+ }
+
+ grouping telemetry-heartbeat-config {
+ description
+ "Configuration parameters relating to the
+ heartbeat of the telemetry subscription";
+ leaf heartbeat-interval {
+ type uint64;
+ description
+ "Maximum time interval in seconds that may pass
+ between updates from a device to a telemetry collector.
+ If this interval expires, but there is no updated data to
+ send (such as if suppress_updates has been configured), the
+ device must send a telemetry message to the collector.";
+ }
+ }
+
+ grouping telemetry-suppress-redundant-config {
+ description
+ "Configuration parameters relating to suppression of
+ redundant upstream updates";
+ leaf suppress-redundant {
+ type boolean;
+ description
+ "Boolean flag to control suppression of redundant
+ telemetry updates to the collector platform. If this flag is
+ set to TRUE, then the collector will only send an update at
+ the configured interval if a subscribed data value has
+ changed. Otherwise, the device will not send an update to
+ the collector until expiration of the heartbeat interval.";
+ }
+ }
+
+ grouping telemetry-sensor-profile-config {
+ description
+ "Configuration parameters relating to the sensor groups
+ used in the sensor profile";
+ leaf sensor-group {
+ type leafref {
+ path "../../../../../../../sensor-groups/sensor-group"
+ + "/config/sensor-group-id";
+ }
+ description
+ "Reference to the sensor group which is used in the profile";
+ }
+ uses telemetry-stream-subscription-config;
+ }
+
+ grouping telemetry-stream-subscription-config {
+ description
+ "Configuration used when the sensor is a stream based sensor.";
+
+ uses telemetry-stream-frequency-config;
+ uses telemetry-heartbeat-config;
+ uses telemetry-suppress-redundant-config;
+
+ }
+
+ grouping telemetry-qos-marking-config {
+ description
+ "Config parameters relating to the quality of service
+ marking on device generated telemetry packets";
+
+ leaf originated-qos-marking {
+ type oc-inet:dscp;
+ description
+ "DSCP marking of packets generated by the telemetry
+ subsystem on the network device.";
+ }
+ }
+
+
+ grouping telemetry-sensor-group-config {
+ description
+ "Config parameters related to the sensor groups
+ on the device";
+ leaf sensor-group-id {
+ type string;
+ description
+ "Name or identifier for the sensor group itself.
+ Will be referenced by other configuration specifying a
+ sensor group";
+ }
+ }
+
+ grouping telemetry-subscription-config {
+ description
+ "Configuration parameters relating to the telemetry
+ subscription";
+
+ leaf id {
+ type uint64;
+ description
+ "System generated identifer of the telemetry
+ subscription.";
+ }
+ }
+
+ grouping telemetry-subscription-name-config {
+ description
+ "Configuration parameters relating to the configured
+ name of the telemetry subscription. The name is a user
+ configured string value which uniquely identifies the
+ subscription in the configuration database.";
+
+ leaf name {
+ type string;
+ description
+ "User configured identifier of the telemetry
+ subscription. This value is used primarily for
+ subscriptions configured locally on the network
+ element.";
+ }
+ }
+
+ grouping telemetry-subscription-state {
+ description
+ "State values for the telemetry subscription";
+ //TODO add values
+ }
+
+ grouping telemetry-stream-protocol-config {
+ description
+ "Configuration parameters relating to the
+ transport protocol carrying telemetry
+ data.";
+
+ leaf protocol {
+ type identityref {
+ base oc-telemetry-types:STREAM_PROTOCOL;
+ }
+ description
+ "Selection of the transport protocol for the telemetry
+ stream.";
+ }
+ }
+
+ grouping telemetry-stream-encoding-config {
+ description
+ "Configuration parameters relating to the
+ encoding of telemetry data to and from the
+ network element. The encoding method controls
+ specifically the wire format of the telemetry
+ data, and also controls which RPC framework
+ may be in use to exchange telemetry data.";
+
+ leaf encoding {
+ type identityref {
+ base oc-telemetry-types:DATA_ENCODING_METHOD;
+ }
+ description
+ "Selection of the specific encoding or RPC framework
+ for telemetry messages to and from the network element.";
+ }
+ }
+
+ grouping telemetry-stream-destination-config {
+ description
+ "Configuration parameters for the stream destinations";
+ leaf destination-address {
+ type oc-inet:ip-address;
+ description
+ "IP address of the telemetry stream destination";
+ }
+ leaf destination-port {
+ type uint16;
+ description
+ "Protocol (udp or tcp) port number for the telemetry
+ stream destination";
+ }
+ }
+
+ grouping telemetry-stream-frequency-config {
+ description
+ "Config parameters for the frequency of updates to
+ the collector";
+ leaf sample-interval {
+ type uint64;
+ description
+ "Time in milliseconds between the device's sample of a
+ telemetry data source. For example, setting this to 100
+ would require the local device to collect the telemetry
+ data every 100 milliseconds. There can be latency or jitter
+ in transmitting the data, but the sample must occur at
+ the specified interval.
+
+ The timestamp must reflect the actual time when the data
+ was sampled, not simply the previous sample timestamp +
+ sample-interval.
+
+ If sample-interval is set to 0, the telemetry sensor
+ becomes event based. The sensor must then emit data upon
+ every change of the underlying data source.";
+ }
+ }
+
+ grouping telemetry-sensor-specification {
+ description
+ "Config related to creating telemetry sensor groups. A sensor
+ group is a related set of sensor paths and/or filters to
+ exclude items. A group is assigned a reusable identifer, so
+ it can be used in multiple telemetry subscriptions.";
+ list telemetry-sensor-group {
+ key "telemetry-sensor-group-id";
+ description
+ "List of telemetry sensor groups";
+
+ leaf telemetry-sensor-group-id {
+ type string;
+ description
+ "The sensor group identifer is a reusable handle which
+ identifies a single sensor group. It is referenced from
+ the subscription configuration.";
+ }
+ uses telemetry-sensor-paths;
+ }
+ }
+
+ grouping telemetry-sensor-paths {
+ description
+ "This grouping contains these paths to leaves or containers
+ in the data model which are the sources of telemetry
+ information.";
+
+ list telemetry-sensor-paths {
+ key "telemetry-sensor-path";
+ description
+ "A list of sensor paths and exclude filters which comprise
+ a sensor grouping";
+
+ leaf telemetry-sensor-path {
+ type string;
+ description
+ "The sensor path is a path to a portion of operational
+ state of interest in the data model";
+ }
+ }
+ }
+
+
+ grouping telemetry-local-source-address-config {
+ description
+ "Config relating to the local source address for telemetry
+ messages";
+ // TODO: Make this a reference to an interface.
+ leaf local-source-address {
+ type oc-inet:ip-address;
+ description
+ "The IP address which will be the source of packets from
+ the device to a telemetry collector destination.";
+ }
+ }
+
+ // data definition statements
+
+ uses telemetry-top;
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-terminal-device.yang b/src/plugins/yang/openconfig/openconfig-terminal-device.yang
new file mode 100644
index 0000000..27de12d
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-terminal-device.yang
@@ -0,0 +1,1370 @@
+module openconfig-terminal-device {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/terminal-device";
+
+ prefix "oc-opt-term";
+
+ import openconfig-types { prefix oc-types; }
+ import openconfig-transport-types { prefix oc-opt-types; }
+ import openconfig-if-ethernet { prefix oc-eth; }
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-platform-transceiver { prefix oc-transceiver; }
+ import openconfig-lldp { prefix oc-lldp; }
+ import openconfig-extensions { prefix oc-ext; }
+ import ietf-yang-types { prefix yang; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-yang-types { prefix oc-yang; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module describes a terminal optics device model for
+ managing the terminal systems (client and line side) in a
+ DWDM transport network.
+
+ Elements of the model:
+
+ physical port: corresponds to a physical, pluggable client
+ port on the terminal device. Examples includes 10G, 40G, 100G
+ (e.g., 10x10G, 4x25G or 1x100G) and 400G/1T in the future.
+ Physical client ports will have associated operational state or
+ PMs.
+
+ physical channel: a physical lane or channel in the
+ physical client port. Each physical client port has 1 or more
+ channels. An example is 100GBASE-LR4 client physical port having
+ 4x25G channels. Channels have their own optical PMs and can be
+ monitored independently within a client physical port (e.g.,
+ channel power). Physical client channels are defined in the
+ model as part of a physical client port, and are modeled
+ primarily for reading their PMs.
+
+ logical channel: a logical grouping of logical grooming elements
+ that may be assigned to subsequent grooming stages for
+ multiplexing / de-multiplexing, or to an optical channel for
+ line side transmission. The logical channels can represent, for
+ example, an ODU/OTU logical packing of the client
+ data onto the line side. Tributaries are similarly logical
+ groupings of demand that can be represented in this structure and
+ assigned to an optical channel. Note that different types of
+ logical channels may be present, each with their corresponding
+ PMs.
+
+ optical channel: corresponds to an optical carrier and is
+ assigned a wavelength/frequency. Optical channels have PMs
+ such as power, BER, and operational mode.
+
+ Directionality:
+
+ To maintain simplicity in the model, the configuration is
+ described from client-to-line direction. The assumption is that
+ equivalent reverse configuration is implicit, resulting in
+ the same line-to-client configuration.
+
+ Physical layout:
+
+ The model does not assume a particular physical layout of client
+ and line ports on the terminal device (e.g., such as number of
+ ports per linecard, separate linecards for client and line ports,
+ etc.).";
+
+ oc-ext:openconfig-version "1.4.0";
+
+ revision "2018-08-28" {
+ description
+ "Adds terminal device related Ethernet counters";
+ reference "1.4.0";
+ }
+
+ revision "2018-07-30" {
+ description
+ "Adds lldp snooping config leaf and augmented it to oc-lldp";
+ reference "1.3.0";
+ }
+
+ revision "2018-07-26" {
+ description
+ "Adds OTN protocol counter stats of errored-blocks and
+ fec-uncorrectable-blocks, adds ethernet-config-ext grouping
+ and uses it to augment oc-eth";
+ reference "1.2.0";
+ }
+
+ revision "2018-07-17" {
+ description
+ "Adds testing enum to link-state";
+ reference "1.1.0";
+ }
+
+ revision "2017-07-08" {
+ description
+ "Adds test-signal";
+ reference "1.0.0";
+ }
+
+ revision "2016-12-22" {
+ description
+ "Fixes and additions to terminal optics model";
+ reference "0.4.0";
+ }
+
+
+ grouping terminal-input-optical-power {
+ description
+ "Reusable leaves related to input optical power";
+
+ leaf input-power {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dBm;
+ description
+ "The input optical power of this port in units of 0.01dBm.
+ If the port is an aggregate of multiple physical channels,
+ this attribute is the total power or sum of all channels.";
+ }
+ }
+
+ grouping terminal-ethernet-protocol-config {
+ description
+ "Configuration data for logical channels with Ethernet
+ framing";
+
+ //TODO:currently a empty container
+ }
+
+ grouping terminal-ethernet-protocol-state {
+ description
+ "Ethernet-specific counters when logical channel
+ is using Ethernet protocol framing, e.g., 10GE, 100GE";
+
+ uses oc-eth:ethernet-interface-state-counters;
+ uses terminal-ethernet-protocol-state-counters;
+ }
+
+ grouping terminal-ethernet-protocol-state-counters {
+ description
+ "Ethernet-specific counters for terminal devices when
+ logical channel is using Ethernet protocol framing,
+ e.g., 10GE, 100GE";
+
+ // ingress counters
+
+ leaf in-pcs-bip-errors {
+ type oc-yang:counter64;
+ description
+ "The number of received bit interleaved parity (BIP) errors
+ at the physical coding sublayer (PCS). If the interface
+ consists of multiple lanes, this will be the sum of all
+ errors on the lane";
+ }
+
+ leaf in-pcs-errored-seconds {
+ type oc-yang:counter64;
+ description
+ "The number of seconds that physical coding sublayer (PCS)
+ errors have crossed a sytem defined threshold indicating the
+ link is erroring";
+ }
+
+ leaf in-pcs-severely-errored-seconds {
+ type oc-yang:counter64;
+ description
+ "The number of seconds that physical coding sublayer (PCS)
+ errors have crossed a system defined threshold indicating the
+ link is severely erroring";
+ }
+
+ leaf in-pcs-unavailable-seconds {
+ type oc-yang:counter64;
+ description
+ "The number of seconds that physical coding sublayer (PCS)
+ errors have crossed a system defined threshold indicating the
+ link is unavailable";
+ }
+
+ // egress counters
+
+ leaf out-pcs-bip-errors {
+ type oc-yang:counter64;
+ description
+ "The number of transmitted bit interleaved parity (BIP) errors
+ at the physical coding sublayer (PCS). If the interface
+ consists of multiple lanes, this will be the sum of all
+ errors on the lane";
+ }
+
+ leaf out-crc-errors {
+ type oc-yang:counter64;
+ description
+ "Number of FCS/CRC error check failures sent on the interface";
+ }
+
+ leaf out-block-errors {
+ type oc-yang:counter64;
+ description
+ "The number of transmitted errored blocks. Error detection
+ codes are capable of detecting whether one or more errors have
+ occurred in a given sequence of bits - the block. It is
+ normally not possible to determine the exact number of errored
+ bits within the block";
+ }
+ }
+
+ grouping terminal-ethernet-protocol-top {
+ description
+ "Top-level grouping for data related to Ethernet protocol
+ framing on logical channels";
+
+ container ethernet {
+ description
+ "Top level container for data related to Ethernet framing
+ for the logical channel";
+
+ container config {
+ description
+ "Configuration data for Ethernet protocol framing on
+ logical channels";
+
+ uses terminal-ethernet-protocol-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data for Ethernet protocol framing
+ on logical channels";
+
+ uses terminal-ethernet-protocol-state;
+ }
+ }
+ }
+
+ grouping terminal-otn-protocol-config {
+ description
+ "OTU configuration when logical channel
+ framing is using an OTU protocol, e.g., OTU1, OTU3, etc.";
+
+ leaf tti-msg-transmit {
+ type string;
+ description
+ "Trail trace identifier (TTI) message transmitted";
+ }
+
+ leaf tti-msg-expected {
+ type string;
+ description
+ "Trail trace identifier (TTI) message expected";
+ }
+
+ leaf tti-msg-auto {
+ type boolean;
+ description
+ "Trail trace identifier (TTI) transmit message automatically
+ created. If true, then setting a custom transmit message
+ would be invalid.";
+ }
+ }
+
+ grouping terminal-otn-protocol-counter-stats {
+ description
+ "Counter based statistics containers for logical channels
+ using OTN framing";
+
+ leaf errored-seconds {
+ type yang:counter64;
+ description
+ "The number of seconds that at least one errored blocks
+ occurs, at least one code violation occurs, loss of sync is
+ detected or loss of signal is detected";
+ }
+
+ leaf severely-errored-seconds {
+ type yang:counter64;
+ description
+ "The number of seconds that loss of frame is detected OR
+ the number of errored blocks, code violations, loss of sync
+ or loss of signal is detected exceeds a predefined
+ threshold";
+ }
+
+ leaf unavailable-seconds {
+ type yang:counter64;
+ description
+ "The number of seconds during which the link is unavailable";
+ }
+
+ leaf code-violations {
+ type yang:counter64;
+ description
+ "For ethernet or fiberchannel links, the number of 8b/10b
+ coding violations. For SONET/SDH, the number of BIP (bit
+ interleaved parity) errors";
+ }
+
+ leaf errored-blocks {
+ type yang:counter64;
+ description
+ "The number of errored blocks. Error detection codes are
+ capable to detect whether one or more errors have occurred
+ in a given sequence of bits - the block. It is normally not
+ possible to determine the exact number of errored bits within
+ the block.";
+ reference "ITU-T Rec. G.826";
+ }
+
+ leaf fec-uncorrectable-blocks {
+ type yang:counter64;
+ description
+ "The number of blocks that were uncorrectable by the FEC";
+ }
+
+ leaf fec-uncorrectable-words {
+ type yang:counter64;
+ description
+ "The number of words that were uncorrectable by the FEC";
+ }
+
+ leaf fec-corrected-bytes {
+ type yang:counter64;
+ description
+ "The number of bytes that were corrected by the FEC";
+ }
+
+ leaf fec-corrected-bits {
+ type yang:counter64;
+ description
+ "The number of bits that were corrected by the FEC";
+ }
+
+ leaf background-block-errors {
+ type yang:counter64;
+ description
+ "The number of background block errors";
+ }
+ }
+
+ grouping terminal-otn-protocol-multi-stats {
+ description
+ "Multi-value statistics containers for logical channels using
+ OTN framing (e.g., max, min, avg, instant)";
+
+ container pre-fec-ber {
+ description
+ "Bit error rate before forward error correction -- computed
+ value with 18 decimal precision. Note that decimal64
+ supports values as small as i x 10^-18 where i is an
+ integer. Values smaller than this should be reported as 0
+ to inidicate error free or near error free performance.
+ Values include the instantaneous, average, minimum, and
+ maximum statistics. If avg/min/max statistics are not
+ supported, the target is expected to just supply the
+ instant value";
+
+ uses oc-opt-types:avg-min-max-instant-stats-precision18-ber;
+ }
+
+ container post-fec-ber {
+ description
+ "Bit error rate after forward error correction -- computed
+ value with 18 decimal precision. Note that decimal64
+ supports values as small as i x 10^-18 where i is an
+ integer. Values smaller than this should be reported as 0
+ to inidicate error free or near error free performance.
+ Values include the instantaneous, average, minimum, and
+ maximum statistics. If avg/min/max statistics are not
+ supported, the target is expected to just supply the
+ instant value";
+
+ uses oc-opt-types:avg-min-max-instant-stats-precision18-ber;
+ }
+
+ container q-value {
+ description
+ "Quality value (factor) in dB of a channel with two
+ decimal precision. Values include the instantaneous,
+ average, minimum, and maximum statistics. If avg/min/max
+ statistics are not supported, the target is expected
+ to just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dB;
+ }
+
+ container esnr {
+ description
+ "Electrical signal to noise ratio. Baud rate
+ normalized signal to noise ratio based on
+ error vector magnitude in dB with two decimal
+ precision. Values include the instantaneous, average,
+ minimum, and maximum statistics. If avg/min/max
+ statistics are not supported, the target is expected
+ to just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dB;
+ }
+ }
+
+ grouping terminal-otn-protocol-state {
+ description
+ "OTU operational state when logical channel
+ framing is using an OTU protocol, e.g., OTU1, OTU3, etc.";
+
+
+ leaf tti-msg-recv {
+ type string;
+ description
+ "Trail trace identifier (TTI) message received";
+ }
+
+ leaf rdi-msg {
+ type string;
+ description
+ "Remote defect indication (RDI) message received";
+ }
+ uses terminal-otn-protocol-counter-stats;
+ uses terminal-otn-protocol-multi-stats;
+ }
+
+ grouping terminal-otn-protocol-top {
+ description
+ "Top-level grouping for data related to OTN protocol framing";
+
+ container otn {
+ description
+ "Top level container for OTU configuration when logical
+ channel framing is using an OTU protocol, e.g., OTU1, OTU3,
+ etc.";
+
+ container config {
+ description
+ "Configuration data for OTN protocol framing";
+
+ uses terminal-otn-protocol-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for OTN protocol PMs, statistics,
+ etc.";
+
+ uses terminal-otn-protocol-config;
+ uses terminal-otn-protocol-state;
+ }
+ }
+ }
+
+ grouping terminal-client-port-assignment-config {
+ description
+ "Configuration data for assigning physical client ports to
+ logical channels";
+
+ leaf index {
+ type uint32;
+ description
+ "Index of the client port assignment";
+ }
+
+ leaf description {
+ type string;
+ description
+ "Descriptive name for the client port-to-logical channel
+ mapping";
+ }
+
+ leaf logical-channel {
+ type leafref {
+ path "/oc-opt-term:terminal-device/oc-opt-term:logical-channels" +
+ "/oc-opt-term:channel/oc-opt-term:index";
+ }
+ description
+ "Reference to the logical channel for this
+ assignment";
+ }
+
+ leaf allocation {
+ type decimal64 {
+ fraction-digits 3;
+ }
+ units Gbps;
+ description
+ "Allocation of the client physical port to the assigned
+ logical channel expressed in Gbps. In most cases,
+ the full client physical port rate is assigned to a single
+ logical channel.";
+ }
+
+ }
+
+ grouping terminal-client-port-assignment-state {
+ description
+ "Operational state data for assigning physical client ports
+ to logical channels";
+ }
+
+ grouping terminal-client-port-assignment-top {
+ description
+ "Top-level grouping for the assigment of client physical ports
+ to logical channels";
+ //TODO: this grouping could be removed, instead reusing a common
+ //grouping for logical client assignment pointers
+
+ container logical-channel-assignments {
+ description
+ "Enclosing container for client port to logical client
+ mappings";
+
+ list assignment {
+ key "index";
+ description
+ "List of assignments to logical clients";
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+ description
+ "Reference to the index of this logical client
+ assignment";
+ }
+
+ container config {
+ description
+ "Configuration data for the logical client assignment";
+
+ uses terminal-client-port-assignment-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the logical client
+ assignment";
+
+ uses terminal-client-port-assignment-config;
+ uses terminal-client-port-assignment-state;
+ }
+ }
+ }
+ }
+
+
+ grouping terminal-logical-chan-assignment-config {
+ description
+ "Configuration data for assigning client logical channels
+ to line-side tributaries";
+
+ leaf index {
+ type uint32;
+ description
+ "Index of the current logical client channel to tributary
+ mapping";
+ }
+
+ leaf description {
+ type string;
+ description
+ "Name assigned to the logical client channel";
+ }
+
+ leaf assignment-type {
+ type enumeration {
+ enum LOGICAL_CHANNEL {
+ description
+ "Subsequent channel is a logical channel";
+ }
+ enum OPTICAL_CHANNEL {
+ description
+ "Subsequent channel is a optical channel / carrier";
+ }
+ }
+ description
+ "Each logical channel element may be assigned to subsequent
+ stages of logical elements to implement further grooming, or
+ can be assigned to a line-side optical channel for
+ transmission. Each assignment also has an associated
+ bandwidth allocation.";
+ }
+
+ leaf logical-channel {
+ type leafref {
+ path "/oc-opt-term:terminal-device/" +
+ "oc-opt-term:logical-channels/oc-opt-term:channel/" +
+ "oc-opt-term:index";
+ }
+ must "../assignment-type = 'LOGICAL_CHANNEL'" {
+ description
+ "The assignment-type must be set to LOGICAL_CHANNEL for
+ this leaf to be valid";
+ }
+ description
+ "Reference to another stage of logical channel elements.";
+ }
+
+ leaf optical-channel {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ must "../assignment-type = 'OPTICAL_CHANNEL'" {
+ description
+ "The assignment-type must be set to OPTICAL_CHANNEL for
+ this leaf to be valid";
+ }
+ description
+ "Reference to the line-side optical channel that should
+ carry the current logical channel element. Use this
+ reference to exit the logical element stage.";
+ }
+
+ leaf allocation {
+ type decimal64 {
+ fraction-digits 3;
+ }
+ units Gbps;
+ description
+ "Allocation of the logical client channel to the tributary
+ or sub-channel, expressed in Gbps";
+ }
+
+ }
+
+ grouping terminal-logical-chan-assignment-state {
+ description
+ "Operational state data for the assignment of logical client
+ channel to line-side tributary";
+ }
+
+ grouping terminal-logical-chan-assignment-top {
+ description
+ "Top-level grouping for the list of logical client channel-to-
+ tributary assignments";
+
+ container logical-channel-assignments {
+ //TODO: we need a commonly understood name for this logical
+ //channel structure
+ description
+ "Enclosing container for tributary assignments";
+
+ list assignment {
+ key "index";
+ description
+ "Logical channel elements may be assigned directly to
+ optical channels for line-side transmission, or can be
+ further groomed into additional stages of logical channel
+ elements. The grooming can multiplex (i.e., split the
+ current element into multiple elements in the subsequent
+ stage) or de-multiplex (i.e., combine the current element
+ with other elements into the same element in the subsequent
+ stage) logical elements in each stage.
+
+ Note that to support the ability to groom the logical
+ elements, the list of logical channel elements should be
+ populated with an entry for the logical elements at
+ each stage, starting with the initial assignment from the
+ respective client physical port.
+
+ Each logical element assignment consists of a pointer to
+ an element in the next stage, or to an optical channel,
+ along with a bandwidth allocation for the corresponding
+ assignment (e.g., to split or combine signal).";
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+ description
+ "Reference to the index for the current tributary
+ assignment";
+ }
+
+ container config {
+ description
+ "Configuration data for tributary assignments";
+
+ uses terminal-logical-chan-assignment-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for tributary assignments";
+
+ uses terminal-logical-chan-assignment-config;
+ uses terminal-logical-chan-assignment-state;
+ }
+ }
+ }
+ }
+
+ grouping terminal-logical-channel-ingress-config {
+ description
+ "Configuration data for ingress signal to logical channel";
+
+ leaf transceiver {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ description
+ "Reference to the transceiver carrying the input signal
+ for the logical channel. If specific physical channels
+ are mapped to the logical channel (as opposed to all
+ physical channels carried by the transceiver), they can be
+ specified in the list of physical channel references.";
+ }
+
+ leaf-list physical-channel {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-transceiver:transceiver/" +
+ "oc-transceiver:physical-channels/" +
+ "oc-transceiver:channel/oc-transceiver:index";
+ }
+ description
+ "This list should be populated with references
+ to the client physical channels that feed this logical
+ channel from the transceiver specified in the 'transceiver'
+ leaf, which must be specified. If this leaf-list is empty,
+ all physical channels in the transceiver are assumed to be
+ mapped to the logical channel.";
+ }
+ }
+
+ grouping terminal-logical-channel-ingress-state {
+ description
+ "Operational state data for ingress signal to logical channel";
+ }
+
+ grouping terminal-logical-channel-ingress-top {
+ description
+ "Top-level grouping for ingress signal to logical channel";
+
+ container ingress {
+ description
+ "Top-level container for specifying references to the
+ source of signal for the logical channel, either a
+ transceiver or individual physical channels";
+
+ container config {
+ description
+ "Configuration data for the signal source for the
+ logical channel";
+
+ uses terminal-logical-channel-ingress-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the signal source for the
+ logical channel";
+
+ uses terminal-logical-channel-ingress-config;
+ uses terminal-logical-channel-ingress-state;
+ }
+ }
+ }
+
+ grouping terminal-logical-channel-config {
+ description
+ "Configuration data for logical channels";
+
+ leaf index {
+ type uint32;
+ description
+ "Index of the current logical channel";
+ }
+
+ leaf description {
+ type string;
+ description
+ "Description of the logical channel";
+ }
+
+ leaf admin-state {
+ type oc-opt-types:admin-state-type;
+ description
+ "Sets the admin state of the logical channel";
+ }
+
+ leaf rate-class {
+ type identityref {
+ base oc-opt-types:TRIBUTARY_RATE_CLASS_TYPE;
+ }
+ description
+ "Rounded bit rate of the tributary signal. Exact bit rate
+ will be refined by protocol selection.";
+ }
+
+ leaf trib-protocol {
+ type identityref {
+ base oc-opt-types:TRIBUTARY_PROTOCOL_TYPE;
+ }
+ description
+ "Protocol framing of the tributary signal. If this
+ LogicalChannel is directly connected to a Client-Port or
+ Optical-Channel, this is the protocol of the associated port.
+ If the LogicalChannel is connected to other LogicalChannels,
+ the TributaryProtocol of the LogicalChannels will define a
+ specific mapping/demapping or multiplexing/demultiplexing
+ function.
+
+ Not all protocols are valid, depending on the value
+ of trib-rate-class. The expectation is that the NMS
+ will validate that a correct combination of rate class
+ and protocol are specfied. Basic combinations are:
+
+ rate class: 1G
+ protocols: 1GE
+
+ rate class: 2.5G
+ protocols: OC48, STM16
+
+ rate class: 10G
+ protocols: 10GE LAN, 10GE WAN, OC192, STM64, OTU2, OTU2e,
+ OTU1e, ODU2, ODU2e, ODU1e
+
+ rate class: 40G
+ protocols: 40GE, OC768, STM256, OTU3, ODU3
+
+ rate class: 100G
+ protocols: 100GE, 100G MLG, OTU4, OTUCn, ODU4";
+ }
+
+ leaf logical-channel-type {
+ type identityref {
+ base oc-opt-types:LOGICAL_ELEMENT_PROTOCOL_TYPE;
+ }
+ description
+ "The type / stage of the logical element determines the
+ configuration and operational state parameters (PMs)
+ available for the logical element";
+ }
+
+ leaf loopback-mode {
+ type oc-opt-types:loopback-mode-type;
+ description
+ "Sets the loopback type on the logical channel. Setting the
+ mode to something besides NONE activates the loopback in
+ the specified mode.";
+ }
+
+ leaf test-signal {
+ type boolean;
+ description
+ "When enabled the logical channel's DSP will generate a pseudo
+ randmon bit stream (PRBS) which can be used during testing.";
+ }
+ }
+
+
+ grouping terminal-logical-channel-state {
+ description
+ "Operational state data for logical client channels";
+
+ leaf link-state {
+ type enumeration {
+ enum UP {
+ description
+ "Logical channel is operationally up";
+ }
+ enum DOWN {
+ description
+ "Logical channel is operationally down";
+ }
+ enum TESTING {
+ description
+ "Logical channel is under test as a result of
+ enabling test-signal";
+ }
+ }
+ description
+ "Link-state of the Ethernet protocol on the logical channel,
+ SONET / SDH framed signal, etc.";
+ }
+
+ }
+
+ grouping terminal-logical-channel-top {
+ description
+ "Top-level grouping for logical channels";
+
+ container logical-channels {
+ description
+ "Enclosing container the list of logical channels";
+
+ list channel {
+ key "index";
+ description
+ "List of logical channels";
+ //TODO: naming for this list of logical elements should be
+ //revisited.
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+ description
+ "Reference to the index of the logical channel";
+ }
+
+ container config {
+ description
+ "Configuration data for logical channels";
+
+ uses terminal-logical-channel-config;
+
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for logical channels";
+
+ uses terminal-logical-channel-config;
+ uses terminal-logical-channel-state;
+ }
+
+ uses terminal-otn-protocol-top {
+ when "config/logical-channel-type = 'PROT_OTN'" {
+ description
+ "Include the OTN protocol data only when the
+ channel is using OTN framing.";
+ }
+ }
+ uses terminal-ethernet-protocol-top {
+ when "config/logical-channel-type = 'PROT_ETHERNET'" {
+ description
+ "Include the Ethernet protocol statistics only when the
+ protocol used by the link is Ethernet.";
+ }
+ }
+ uses terminal-logical-channel-ingress-top;
+ uses terminal-logical-chan-assignment-top;
+ }
+ }
+ }
+
+
+ grouping terminal-optical-channel-config {
+ description
+ "Configuration data for describing optical channels";
+
+ leaf frequency {
+ type oc-opt-types:frequency-type;
+ description
+ "Frequency of the optical channel, expressed in MHz";
+ }
+
+ leaf target-output-power {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dBm;
+ description
+ "Target output optical power level of the optical channel,
+ expressed in increments of 0.01 dBm (decibel-milliwats)";
+ }
+
+ leaf operational-mode {
+ type uint16;
+ description
+ "Vendor-specific mode identifier -- sets the operational
+ mode for the channel. The specified operational mode must
+ exist in the list of supported operational modes supplied
+ by the device";
+ //
+ // Ideally, this leaf should be a leafref to the supported
+ // operational modes, but YANG 1.0 does not allow a r/w
+ // leaf to be a leafref to a r/o leaf.
+ }
+
+
+ leaf line-port {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ description
+ "Reference to the line-side physical port that carries
+ this optical channel. The target port should be
+ a component in the physical inventory data model.";
+ }
+ }
+
+ grouping terminal-optical-channel-state {
+ description
+ "Operational state data for optical channels";
+
+ leaf group-id {
+ type uint32;
+ description
+ "If the device places constraints on which optical
+ channels must be managed together (e.g., transmitted on the
+ same line port), it can indicate that by setting the group-id
+ to the same value across related optical channels.";
+ }
+
+ uses oc-transceiver:optical-power-state;
+
+ container chromatic-dispersion {
+ description
+ "Chromatic Dispersion of an optical channel in
+ picoseconds / nanometer (ps/nm) as reported by receiver
+ with two decimal precision. Values include the instantaneous,
+ average, minimum, and maximum statistics. If avg/min/max
+ statistics are not supported, the target is expected to just
+ supply the instant value";
+
+ uses oc-opt-types:avg-min-max-instant-stats-precision2-ps-nm;
+ }
+
+ container polarization-mode-dispersion {
+ description
+ "Polarization Mode Dispersion of an optical channel
+ in picosends (ps) as reported by receiver with two decimal
+ precision. Values include the instantaneous, average,
+ minimum, and maximum statistics. If avg/min/max statistics
+ are not supported, the target is expected to just supply the
+ instant value";
+
+ uses oc-opt-types:avg-min-max-instant-stats-precision2-ps;
+ }
+
+ container second-order-polarization-mode-dispersion {
+ description
+ "Second Order Polarization Mode Dispersion of an optical
+ channel in picoseconds squared (ps^2) as reported by
+ receiver with two decimal precision. Values include the
+ instantaneous, average, minimum, and maximum statistics.
+ If avg/min/max statistics are not supported, the target
+ is expected to just supply the instant value";
+
+ uses oc-opt-types:avg-min-max-instant-stats-precision2-ps2;
+ }
+
+ container polarization-dependent-loss {
+ description
+ "Polarization Dependent Loss of an optical channel
+ in dB as reported by receiver with two decimal precision.
+ Values include the instantaneous, average, minimum, and
+ maximum statistics. If avg/min/max statistics are not
+ supported, the target is expected to just supply the
+ instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dB;
+ }
+ }
+
+ grouping terminal-optical-channel-top {
+ description
+ "Top-level grouping for optical channel data";
+
+ container optical-channel {
+ description
+ "Enclosing container for the list of optical channels";
+
+ container config {
+ description
+ "Configuration data for optical channels";
+
+ uses terminal-optical-channel-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for optical channels";
+
+ uses terminal-optical-channel-config;
+ uses terminal-optical-channel-state;
+ }
+ }
+ }
+
+ grouping terminal-operational-mode-config {
+ description
+ "Configuration data for vendor-supported operational modes";
+ }
+
+ grouping terminal-operational-mode-state {
+ description
+ "Operational state data for vendor-supported operational
+ modes";
+
+ leaf mode-id {
+ type uint16;
+ description
+ "Two-octet encoding of the vendor-defined operational
+ mode";
+ }
+
+ leaf description {
+ type string;
+ description
+ "Vendor-supplied textual description of the characteristics
+ of this operational mode to enable operators to select the
+ appropriate mode for the application.";
+ }
+
+ //TODO: examples of the kind of info that would be useful to
+ //report in the operational mode:
+ //Symbol rate (32G, 40G, 43G, 64G, etc.)
+ //Modulation (QPSK, 8-QAM, 16-QAM, etc.)
+ //Differential encoding (on, off/pilot symbol, etc)
+ //State of polarization tracking mode (default, med.
+ //high-speed, etc.)
+ //Pulse shaping (RRC, RC, roll-off factor)
+ //FEC mode (SD, HD, % OH)
+
+ leaf vendor-id {
+ type string;
+ description
+ "Identifier to represent the vendor / supplier of the
+ platform and the associated operational mode information";
+ }
+ }
+
+ grouping terminal-operational-mode-top {
+ description
+ "Top-level grouping for vendor-supported operational modes";
+
+ container operational-modes {
+ description
+ "Enclosing container for list of operational modes";
+
+ list mode {
+ key "mode-id";
+ config false;
+ description
+ "List of operational modes supported by the platform.
+ The operational mode provides a platform-defined summary
+ of information such as symbol rate, modulation, pulse
+ shaping, etc.";
+
+ leaf mode-id {
+ type leafref {
+ path "../state/mode-id";
+ }
+ description
+ "Reference to mode-id";
+ }
+
+ container config {
+ description
+ "Configuration data for operational mode";
+
+ uses terminal-operational-mode-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the platform-defined
+ operational mode";
+
+ uses terminal-operational-mode-config;
+ uses terminal-operational-mode-state;
+ }
+ }
+ }
+ }
+
+ grouping ethernet-config-ext {
+ description
+ "Extended ethernet config data on terminal device";
+
+ leaf client-fec {
+ type enumeration {
+ enum ENABLED {
+ description
+ "FEC is enabled";
+ }
+
+ enum DISABLED {
+ description
+ "FEC is disabled";
+ }
+
+ enum AUTO {
+ description
+ "System will automatically enable or disable FEC
+ according to the Ethernet compliance codes (PMD)
+ supported by transceivers";
+ }
+ }
+ default AUTO;
+ description
+ "Configure whether FEC will be manually or automatically
+ enabled or disabled on the client port";
+ }
+
+ leaf client-als {
+ type enumeration {
+ enum NONE {
+ description
+ "The client port will do nothing when a failure is
+ detected on the line port or the remote client port";
+ }
+ enum LASER_SHUTDOWN {
+ description
+ "The client port will shut down the laser to notify the
+ subtending Ethernet equipment of the failure detected on
+ the line port or the remote client port.";
+ }
+ enum ETHERNET {
+ description
+ "The client port will propagate the local fault or remote
+ fault signal to the subtending Ethernet equipment.";
+ }
+ }
+ default ETHERNET;
+ description
+ "Sets the client port behavior that defines if the actions
+ of automatic laser shutdown (als), ethernet fault
+ propagation, or nothing will be done upon the detection
+ of a failure on the line port or the upstream remote
+ client port.";
+ }
+
+ leaf als-delay {
+ type uint32;
+ units milliseconds;
+ default 0;
+ description
+ "The timer to delay the client-als actions on the client
+ port when a local or remote fault is detected on the line
+ port. The delay will only be valid when the client-als is
+ set to LASER_SHUTDOWN";
+ }
+ }
+
+ grouping terminal-device-config {
+ description
+ "Configuration data for transport terminal devices at a
+ device-wide level";
+ }
+
+ grouping terminal-device-state {
+ description
+ "Operational state data for transport terminal devices at a
+ device-wide level";
+ }
+
+ grouping terminal-device-top {
+ description
+ "Top-level grouping for data for terminal devices";
+
+ container terminal-device {
+ description
+ "Top-level container for the terminal device";
+
+ container config {
+ description
+ "Configuration data for global terminal-device";
+
+ uses terminal-device-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for global terminal device";
+
+ uses terminal-device-config;
+ uses terminal-device-state;
+ }
+
+ uses terminal-logical-channel-top;
+ uses terminal-operational-mode-top;
+
+ }
+ }
+
+
+ grouping lldp-interface-config {
+ description
+ "Extension to the configuration data for LLDP on each
+ optical terminal interface";
+
+ leaf snooping {
+ type boolean;
+ default "false";
+ description
+ "If true, LLDP PDUs are only received and processed on
+ the interface, but are not originated by the local agent.
+ The PDUs are not dropped by the interface after processing,
+ but relayed to the downstream link layer neighbors.
+ If false, LLDP PDUs are both received and originated on the
+ interface. The snooping mode is valid only when LLDP is
+ enabled on the interface. The snooping mode is useful
+ when an interface does not want its link layer neighbors to
+ discover itself since, for example, it is a lower-layer
+ interface";
+ }
+ }
+
+ // data definition statements
+
+ uses terminal-device-top;
+
+ // augment statements
+
+ augment "/oc-platform:components/oc-platform:component" {
+ when "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:state/oc-platform:type = 'OPTICAL_CHANNEL'" {
+ description
+ "Augment is active when component is of type
+ OPTICAL_CHANNEL";
+ }
+ description
+ "Adding optical channel data to physical inventory";
+
+ uses terminal-optical-channel-top {
+ }
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet" +
+ "/oc-eth:config" {
+ description
+ "Adds configuration data for client interfaces using Ethernet
+ framing";
+
+ uses ethernet-config-ext;
+ }
+
+ augment "/oc-lldp:lldp/oc-lldp:interfaces/oc-lldp:interface/" +
+ "oc-lldp:config" {
+ description
+ "Augment the lldp config data to support the snooping mode
+ for each optical terminal interface";
+
+ uses lldp-interface-config;
+ }
+}
diff --git a/src/plugins/yang/openconfig/openconfig-transport-line-common.yang b/src/plugins/yang/openconfig/openconfig-transport-line-common.yang
new file mode 100644
index 0000000..9db16b6
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-transport-line-common.yang
@@ -0,0 +1,317 @@
+module openconfig-transport-line-common {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/transport-line-common";
+
+ prefix "oc-line-com";
+
+ // import some basic types
+ import iana-if-type { prefix ift; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-transport-types { prefix oc-opt-types; }
+ import openconfig-platform-transceiver { prefix oc-transceiver; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module defines common data elements for OpenConfig data
+ models for optical transport line system elements, such as
+ amplifiers and ROADMs (wavelength routers).";
+
+ oc-ext:openconfig-version "0.4.1";
+
+ revision "2018-07-17" {
+ description
+ "Remove leaf 'enabled' from osc-config";
+ reference "0.4.1";
+ }
+
+ revision "2018-05-08" {
+ description
+ "Added leaf 'enabled' to osc-config and
+ leaf 'output-frequency' to osc-state";
+ reference "0.4.0";
+ }
+
+ revision "2017-09-08" {
+ description
+ "Correct bug with OSC interfaces";
+ reference "0.3.1";
+ }
+
+ revision "2017-07-08" {
+ description
+ "Add monitor port type and refs to hw ports, ";
+ reference "0.3.0";
+ }
+
+ revision "2017-03-28" {
+ description
+ "Added min/max/avg stats, status for media channels, OCM, APS";
+ reference "0.2.0";
+ }
+
+ revision "2016-03-31" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ identity OPTICAL_LINE_PORT_TYPE {
+ description
+ "Type definition for optical node port types";
+ }
+
+ identity INGRESS {
+ base OPTICAL_LINE_PORT_TYPE;
+ description
+ "Ingress port, corresponding to a signal entering
+ a line device such as an amplifier or wavelength
+ router.";
+ }
+
+ identity EGRESS {
+ base OPTICAL_LINE_PORT_TYPE;
+ description
+ "Egress port, corresponding to a signal exiting
+ a line device such as an amplifier or wavelength
+ router.";
+ }
+
+ identity ADD {
+ base OPTICAL_LINE_PORT_TYPE;
+ description
+ "Add port, corresponding to a signal injected
+ at a wavelength router.";
+ }
+
+ identity DROP {
+ base OPTICAL_LINE_PORT_TYPE;
+ description
+ "Drop port, corresponding to a signal dropped
+ at a wavelength router.";
+ }
+
+ identity MONITOR {
+ base OPTICAL_LINE_PORT_TYPE;
+ description
+ "Monitor port, corresponding to a signal used by an optical
+ channel monitor. This is used to represent the connection
+ that a channel monitor port is connected to. This
+ connection may be via physical cable and faceplate ports or
+ internal to the device";
+ }
+
+ // typedef statements
+
+ // grouping statements
+
+ grouping optical-osc-config {
+ description
+ "Configuration data for OSC interfaces";
+
+ leaf interface {
+ type oc-if:base-interface-ref;
+ description
+ "Reference to an OSC interface";
+ }
+ }
+
+ grouping optical-osc-state {
+ description
+ "Operational state data for OSC interfaces";
+
+ container input-power {
+ description
+ "The input optical power of this port in units
+ of 0.01dBm. If avg/min/max statistics are not supported,
+ the target is expected to just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container output-power {
+ description
+ "The output optical power of this port in units
+ of 0.01dBm. If avg/min/max statistics are not supported,
+ the target is expected to just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container laser-bias-current {
+ description
+ "The current applied by the system to the transmit laser to
+ achieve the output power. The current is expressed in mA
+ with up to one decimal precision. If avg/min/max statistics
+ are not supported, the target is expected to just supply
+ the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-mA;
+ }
+
+ uses oc-transceiver:output-optical-frequency;
+ }
+
+
+
+ grouping optical-osc-top {
+ description
+ "Top-level grouping for configuration and operational state
+ data for optical supervisory channels (OSC) for amplifiers,
+ WSS/ROADM, nodes, etc.";
+
+ container config {
+ description
+ "Configuration data for OSCs";
+
+ uses optical-osc-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for OSCs";
+
+ uses optical-osc-config;
+ uses optical-osc-state;
+ }
+ }
+
+
+ grouping transport-line-common-port-config {
+ description
+ "Configuration data for optical line ports";
+
+ leaf admin-state {
+ type oc-opt-types:admin-state-type;
+ description
+ "Sets the admin state of the optical-port";
+ }
+ }
+
+ grouping transport-line-common-port-state {
+ description
+ "Operational state data describing optical line ports";
+
+ leaf optical-port-type {
+ type identityref {
+ base OPTICAL_LINE_PORT_TYPE;
+ }
+ description
+ "Indicates the type of transport line port. This is an
+ informational field that should be made available by the
+ device (e.g., in the openconfig-platform model).";
+ }
+
+ container input-power {
+ description
+ "The total input optical power of this port in units
+ of 0.01dBm. If avg/min/max statistics are not supported,
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+
+ container output-power {
+ description
+ "The total output optical power of this port in units
+ of 0.01dBm. If avg/min/max statistics are not supported,
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+ }
+
+ grouping transport-line-common-port-top {
+ description
+ "Top-level grouping ";
+
+ container optical-port {
+ description
+ "Top-level container ";
+
+ container config {
+
+ description
+ "Operational config data for optical line ports";
+
+ uses transport-line-common-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for optical line ports";
+
+ uses transport-line-common-port-config;
+ uses transport-line-common-port-state;
+ }
+ }
+ }
+
+
+
+ // data definition statements
+
+ // uses optical-osc-top;
+
+ // augment statements
+
+ augment "/oc-platform:components/oc-platform:component" {
+ description
+ "Adding optical line port data to platform model";
+
+ uses transport-line-common-port-top {
+ when "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:state/oc-platform:type = 'PORT'" {
+ description
+ "Augment is active when component is of type
+ PORT";
+ }
+ }
+ }
+
+ //TODO:this is placeholder until SONET model is added
+ //to interfaces model
+ augment "/oc-if:interfaces/oc-if:interface" {
+ when "oc-if:config/oc-if:type = 'ift:sonet'" {
+ description "Additional interface configuration parameters when
+ the interface type is SONET/SDH";
+ }
+ description "Adds additional SONET/SDH-specific data to
+ osc model";
+
+ container sonet {
+ description
+ "Data related to SONET/SDH interfaces";
+ }
+ }
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-transport-line-protection.yang b/src/plugins/yang/openconfig/openconfig-transport-line-protection.yang
new file mode 100644
index 0000000..0e21a02
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-transport-line-protection.yang
@@ -0,0 +1,612 @@
+module openconfig-transport-line-protection {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/optical-transport-line-protection";
+
+ prefix "oc-line-protect";
+
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-platform { prefix oc-platform; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This model describes configuration and operational state data
+ for optical line protection elements, deployed as part of a
+ transport line system. An Automatic Protection Switch (APS)
+ is typically installed in the same device as the amplifiers
+ and wave-router, however an APS can also be a standalone
+ device. In both scenarios, it serves the same purpose of
+ providing protection using two dark fiber pairs to ensure the
+ amplifiers can still receive a signal if one of the two fiber
+ pairs is broken. The APS port details and directionality are
+ shown below. The three major attributes, together with their
+ modifiers, define the behavior of the APS and can be prioritized
+ in the descending order as shown in the following table";
+
+ //
+ // Automatic Protection Switch (APS) port details and directionality.
+ // _________
+ // | |
+ // | | <=== LINE-PRIMARY-IN
+ // | |
+ // COMMON-IN ===> | | ===> LINE-PRIMARY-OUT
+ // | |
+ // | APS |
+ // COMMON-OUT <=== | |
+ // | | <=== LINE-SECONDARY-IN
+ // | |
+ // | | ===> LINE-SECONDARY-OUT
+ // |_______|
+ //
+ //
+ // The interaction of configuration attributes that control the
+ // protection switching behavior
+ // +------------------+--------------------+------------------------+
+ // | Attribute | Modifier | Behavior |
+ // +------------------+--------------------+------------------------+
+ // | force-to-port | n/a | turns off switching |
+ // | | | by forcing to primary |
+ // | | | or secondary |
+ // +------------------+--------------------+------------------------+
+ // | relative-switch | relative-threshold | if set, overrides |
+ // | -threshold | -offset | primary and secondary |
+ // | | | switch thresholds |
+ // +------------------+--------------------+------------------------+
+ // | primary-switch | primary-switch | sets respective |
+ // | -threshold, | -hysteresis | threshold to switch |
+ // | secondary-switch | | to opposite port |
+ // | -threshold | | |
+ // +------------------+--------------------+------------------------+
+
+ oc-ext:openconfig-version "0.4.0";
+
+ revision "2018-07-25" {
+ description
+ "Added wait-to-restore-time, hold-off-time,
+ relative-switch-threshold, relative-switch-threshold-offset,
+ forced-to-port, removed secondary-switch-hysteresis, and
+ edited the description of primary-switch-threshold,
+ secondary-switch-threshold, and primary-switch-hysteresis";
+ reference "0.4.0";
+ }
+
+ revision "2017-09-08" {
+ description
+ "Correct bug with OSC interfaces";
+ reference "0.3.1";
+ }
+
+ revision "2017-07-08" {
+ description
+ "Support multiple OCMs, add monitor port type
+ and refs to hw ports, ";
+ reference "0.3.0";
+ }
+
+ revision "2017-03-28" {
+ description
+ "Added min/max/avg stats, status for media channels, OCM, APS";
+ reference "0.2.0";
+ }
+
+ revision "2016-08-05" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ identity APS_PATHS {
+ description
+ "Base identity for identifying the line paths on an
+ automatic protection switch";
+ }
+
+ identity PRIMARY {
+ base APS_PATHS;
+ description
+ "The primary line path connected to an automatic protection
+ switch port indicating the primary/preferred path";
+ }
+
+ identity SECONDARY {
+ base APS_PATHS;
+ description
+ "The secondary line path connected to an automatic protection
+ switch port indicating the secondary path";
+ }
+
+ // grouping statements
+
+ grouping aps-input-port-config {
+ description
+ "Grouping for config related to unidirectional automatic
+ protection switch input ports";
+
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "This leaf contains the configured, desired state of the
+ port. Disabling the port turns off alarm reporting for
+ the port";
+ }
+
+ leaf target-attenuation {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ description
+ "Target attenuation of the variable optical attenuator
+ associated with the port in increments of 0.01 dB.";
+ }
+ }
+
+ grouping aps-output-port-config {
+ description
+ "Grouping for config related to unidirectional automatic
+ protection switch output ports";
+
+ leaf target-attenuation {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ description
+ "Target attenuation of the variable optical attenuator
+ associated with the port in increments of 0.01 dB";
+ }
+ }
+
+ grouping aps-input-port-state {
+ description
+ "Grouping for state related to unidirectional automatic
+ protection switch input ports";
+
+ leaf attenuation {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ description
+ "The attenuation of the variable optical attenuator
+ associated with the port in increments of 0.01 dB.";
+ }
+
+ container optical-power {
+ description
+ "The optical input power of this port in units of
+ 0.01dBm. Optical input power represents the signal
+ traversing from an external destination into the module.
+ The power is measured before any attenuation. If avg/min/max
+ statistics are not supported, the target is expected to
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+ }
+
+ grouping aps-output-port-state {
+ description
+ "Grouping for state related to unidirectional automatic
+ protection switch output ports";
+
+ leaf attenuation {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ description
+ "The attenuation of the variable optical attenuator
+ associated with the port in increments of 0.01 dB";
+ }
+
+ container optical-power {
+ description
+ "The optical output power of this port in units of
+ 0.01dBm. Optical output power represents the signal
+ traversing from the module to an external destination. The
+ power is measured after any attenuation. If avg/min/max
+ statistics are not supported, the target is expected to
+ just supply the instant value";
+
+ uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+ }
+ }
+
+ grouping aps-ports {
+ description
+ "Top level grouping for automatic protection switch ports";
+
+ container line-primary-in {
+ description
+ "Container for information related to the line primary
+ input port";
+
+ container config {
+ description
+ "Configuration data for the line primary input port";
+
+ uses aps-input-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "State data for the line primary input port";
+
+ uses aps-input-port-config;
+ uses aps-input-port-state;
+ }
+
+ }
+
+ container line-primary-out {
+ description
+ "Container for information related to the line primary
+ output port";
+
+ container config {
+ description
+ "Configuration data for the line primary output port";
+
+ uses aps-output-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "State data for the line primary output port";
+
+ uses aps-output-port-config;
+ uses aps-output-port-state;
+ }
+ }
+
+ container line-secondary-in {
+ description
+ "Container for information related to the line secondary
+ input port";
+
+ container config {
+ description
+ "Configuration data for the line secondary input port";
+
+ uses aps-input-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "State data for the line secondary input port";
+
+ uses aps-input-port-config;
+ uses aps-input-port-state;
+ }
+ }
+
+ container line-secondary-out {
+ description
+ "Container for information related to the line secondary
+ output port";
+
+ container config {
+ description
+ "Configuration data for the line secondary output port";
+
+ uses aps-output-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "State data for the line secondary output port";
+
+ uses aps-output-port-config;
+ uses aps-output-port-state;
+ }
+ }
+
+ container common-in {
+ description
+ "Container for information related to the line common
+ input port";
+
+ container config {
+ description
+ "Configuration data for the line common input port";
+
+ uses aps-input-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "State data for the line common input port";
+
+ uses aps-input-port-config;
+ uses aps-input-port-state;
+ }
+ }
+
+ container common-output {
+ description
+ "Container for information related to the line common
+ output port";
+
+ container config {
+ description
+ "Configuration data for the line common output port";
+
+ uses aps-output-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "State data for the line common output port";
+
+ uses aps-output-port-config;
+ uses aps-output-port-state;
+ }
+ }
+ }
+
+ grouping aps-config {
+ description
+ "Configuration data for automatic protection switch modules";
+
+ leaf name {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ description
+ "Reference to the component name (in the platform model)
+ corresponding to this automatic protection switch module
+ in the device";
+ }
+
+ leaf revertive {
+ type boolean;
+ description
+ "Revertive behavior of the module. If True, then
+ automatically revert after protection switch once the
+ fault is restored. This leaf is not valid when the
+ relative-switch-threshold is in effect";
+ }
+
+ leaf wait-to-restore-time {
+ type uint32;
+ units milliseconds;
+ description
+ "The time that must elapse before an APS path
+ that has recovered from an signal failure (SF) or signal
+ degradation (SD) condition can be used again to transport
+ the normal traffic signal. During this time period, an SF or
+ SD condition shall override the wait-to-restore time period.
+ This leaf can only take effect when the revertive leaf
+ equals true";
+ }
+
+ leaf hold-off-time {
+ type uint32;
+ units milliseconds;
+ description
+ "The time delay between the declaration of an SF or SD
+ condition and the initiation of the protection switching
+ algorithm";
+ }
+
+ leaf primary-switch-threshold {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dBm;
+ description
+ "The threshold at which the primary line port will switch to
+ the opposite line port in increments of 0.01 dBm. If the
+ hardware supports only one switch threshold for primary and
+ and secondary ports then it is recommended to set both
+ primary-switch-threshold and secondary-switch-threshold to
+ the same value to be explicit. When the relative switch
+ threshold is enabled, i.e. set to a non-zero value, the
+ primary switch threshold will be overridden";
+ }
+
+ leaf primary-switch-hysteresis {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ default 0;
+ description
+ "The delta in dB between the primary-switch-threshold
+ and the signal received on the primary APS_PATH before
+ initiating a switch from the secondary APS_PATH to the
+ primary APS_PATH, in order to prevent toggling between ports
+ when an input signal is very close to the threshold. A zero
+ value means the switch hysteresis is disabled.";
+ }
+
+ leaf secondary-switch-threshold {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dBm;
+ description
+ "The threshold at which the secondary line port will switch to
+ the opposite line port in increments of 0.01 dBm. If the
+ hardware supports only one switch threshold for primary and
+ and secondary ports then it is recommended to set both
+ primary-switch-threshold and secondary-switch-threshold to
+ the same value to be explicit. When the relative switch
+ threshold is enabled, i.e. set to a non-zero value, the
+ secondary switch threshold will be overridden";
+ }
+
+ leaf relative-switch-threshold {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ default 0;
+ description
+ "The delta threshold in dB at which the current line port
+ will switch to the opposite line port. It can be set to
+ the value of 0dB. When set to 0dB, the threshold is ignored
+ and the system automatically applies the primary and
+ secondary switch thresholds. When set to a non-zero value,
+ it overrides the primary and secondary switch thresholds";
+ }
+
+ leaf relative-switch-threshold-offset {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ default 0;
+ description
+ "The offset of the relative switch threshold that compensates
+ the normal difference of receiving power between the primary
+ and secondary line ports. A negative offset corresponds to
+ the situation where the secondary line port receives a higher
+ power than the primary line port in normal condition, and a
+ positive offset means the opposite. The offset will only work
+ when the relative switch threshold is set to a non-zero
+ value";
+ }
+
+ leaf force-to-port {
+ type enumeration {
+ enum NONE {
+ description
+ "Do not force the switch to stay on any line port";
+ }
+ enum PRIMARY {
+ description
+ "Force the switch to stay on the primary line port";
+ }
+ enum SECONDARY {
+ description
+ "Force the switch to stay on the secondary line port";
+ }
+ }
+ default NONE;
+ description
+ "Explicitly set the switch to stay on a port regardless of
+ its operational condition";
+ }
+ }
+
+ grouping aps-state {
+ description
+ "State data for automatic protection switch modules";
+
+ leaf active-path {
+ type identityref {
+ base APS_PATHS;
+ }
+ description
+ "Indicates which line path on the protection switch is
+ currently the active path connected to the common port";
+ }
+ }
+
+ grouping automatic-protection-switch-top {
+ description
+ "Top level grouping for automatic protection switch data";
+
+ container aps-modules {
+ description
+ "Enclosing container for list of automatic protection
+ switch modules";
+
+ list aps-module {
+ key "name";
+ description
+ "List of automatic protection switch modules present
+ in the device";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "Reference to the config name list key";
+ }
+
+ container config {
+ description
+ "Configuration data for an automatic protection
+ switch module";
+
+ uses aps-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for an automatic protection
+ switch module";
+
+ uses aps-config;
+ uses aps-state;
+ }
+
+ container ports {
+ description
+ "Top level grouping for automatic protection switch ports";
+
+ uses aps-ports;
+ }
+ }
+ }
+ }
+
+ grouping transport-line-protection-top {
+ description
+ "Top level grouping for transport line protection data";
+
+ container aps {
+ description
+ "Top level grouping for automatic protection switch data";
+
+ uses automatic-protection-switch-top;
+ }
+ }
+
+ // data definition statements
+
+ uses transport-line-protection-top;
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-transport-types.yang b/src/plugins/yang/openconfig/openconfig-transport-types.yang
new file mode 100644
index 0000000..247b973
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-transport-types.yang
@@ -0,0 +1,834 @@
+module openconfig-transport-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/transport-types";
+
+ prefix "oc-opt-types";
+
+ import openconfig-platform-types { prefix oc-platform-types; }
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-types { prefix oc-types; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module contains general type definitions and identities
+ for optical transport models.";
+
+ oc-ext:openconfig-version "0.6.0";
+
+ revision "2018-05-16" {
+ description
+ "Added interval,min,max time to interval stats.";
+ reference "0.6.0";
+ }
+
+ revision "2017-08-16" {
+ description
+ "Added ODU Cn protocol type";
+ reference "0.5.0";
+ }
+
+ revision "2016-12-22" {
+ description
+ "Fixes and additions for terminal optics model";
+ reference "0.4.0";
+ }
+
+ // typedef statements
+
+ typedef frequency-type {
+ type uint64;
+ units "MHz";
+ description
+ "Type for optical spectrum frequency values";
+ }
+
+ typedef admin-state-type {
+ type enumeration {
+ enum ENABLED {
+ description
+ "Sets the channel admin state to enabled";
+ }
+ enum DISABLED {
+ description
+ "Sets the channel admin state to disabled";
+ }
+ enum MAINT {
+ description
+ "Sets the channel to maintenance / diagnostic mode";
+ }
+ }
+ description "Administrative state modes for
+ logical channels in the transponder model.";
+ }
+
+ typedef loopback-mode-type {
+ type enumeration {
+ enum NONE {
+ description
+ "No loopback is applied";
+ }
+ enum FACILITY {
+ description
+ "A loopback which directs traffic normally transmitted
+ on the port back to the device as if received on the same
+ port from an external source.";
+ }
+ enum TERMINAL {
+ description
+ "A loopback which directs traffic received from an external
+ source on the port back out the transmit side of the same
+ port.";
+ }
+ }
+ default NONE;
+ description
+ "Loopback modes for transponder logical channels";
+ }
+
+ // grouping statements
+
+ grouping avg-min-max-instant-stats-precision2-ps-nm {
+ description
+ "Common grouping for recording picosecond per nanometer
+ values with 2 decimal precision. Values include the
+ instantaneous, average, minimum, and maximum statistics.
+ Statistics are computed and reported based on a moving time
+ interval (e.g., the last 30s). If supported by the device,
+ the time interval over which the statistics are computed, and
+ the times at which the minimum and maximum values occurred,
+ are also reported.";
+
+ leaf instant {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps-nm;
+ description
+ "The instantaneous value of the statistic.";
+ }
+
+ leaf avg {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps-nm;
+ description
+ "The arithmetic mean value of the statistic over the
+ time interval.";
+ }
+
+ leaf min {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps-nm;
+ description
+ "The minimum value of the statistic over the time interval.";
+ }
+
+ leaf max {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps-nm;
+ description
+ "The maximum value of the statistic over the time interval.";
+ }
+
+ uses oc-types:stat-interval-state;
+ uses oc-types:min-max-time;
+ }
+
+ grouping avg-min-max-instant-stats-precision2-ps {
+ description
+ "Common grouping for recording picosecond values with
+ 2 decimal precision. Values include the
+ instantaneous, average, minimum, and maximum statistics.
+ Statistics are computed and reported based on a moving time
+ interval (e.g., the last 30s). If supported by the device,
+ the time interval over which the statistics are computed, and
+ the times at which the minimum and maximum values occurred,
+ are also reported.";
+
+ leaf instant {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps;
+ description
+ "The instantaneous value of the statistic.";
+ }
+
+ leaf avg {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps;
+ description
+ "The arithmetic mean value of the statistic over the
+ time interval.";
+ }
+
+ leaf min {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps;
+ description
+ "The minimum value of the statistic over the time interval.";
+ }
+
+ leaf max {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps;
+ description
+ "The maximum value of the statistic over the time interval.";
+ }
+
+ uses oc-types:stat-interval-state;
+ uses oc-types:min-max-time;
+ }
+
+ grouping avg-min-max-instant-stats-precision2-ps2 {
+ description
+ "Common grouping for recording picosecond^2 values with
+ 2 decimal precision. Values include the
+ instantaneous, average, minimum, and maximum statistics.
+ Statistics are computed and reported based on a moving time
+ interval (e.g., the last 30s). If supported by the device,
+ the time interval over which the statistics are computed, and
+ the times at which the minimum and maximum values occurred,
+ are also reported.";
+
+ leaf instant {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps^2;
+ description
+ "The instantaneous value of the statistic.";
+ }
+
+ leaf avg {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps^2;
+ description
+ "The arithmetic mean value of the statistic over the
+ time interval.";
+ }
+
+ leaf min {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps^2;
+ description
+ "The minimum value of the statistic over the time interval.";
+ }
+
+ leaf max {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units ps^2;
+ description
+ "The maximum value of the statistic over the time
+ interval.";
+ }
+
+ uses oc-types:stat-interval-state;
+ uses oc-types:min-max-time;
+ }
+
+ grouping avg-min-max-instant-stats-precision18-ber {
+ description
+ "Common grouping for recording bit error rate (BER) values
+ with 18 decimal precision. Note that decimal64 supports
+ values as small as i x 10^-18 where i is an integer. Values
+ smaller than this should be reported as 0 to inidicate error
+ free or near error free performance. Values include the
+ instantaneous, average, minimum, and maximum statistics.
+ Statistics are computed and reported based on a moving time
+ interval (e.g., the last 30s). If supported by the device,
+ the time interval over which the statistics are computed, and
+ the times at which the minimum and maximum values occurred,
+ are also reported.";
+
+ leaf instant {
+ type decimal64 {
+ fraction-digits 18;
+ }
+ units bit-errors-per-second;
+ description
+ "The instantaneous value of the statistic.";
+ }
+
+ leaf avg {
+ type decimal64 {
+ fraction-digits 18;
+ }
+ units bit-errors-per-second;
+ description
+ "The arithmetic mean value of the statistic over the
+ time interval.";
+ }
+
+ leaf min {
+ type decimal64 {
+ fraction-digits 18;
+ }
+ units bit-errors-per-second;
+ description
+ "The minimum value of the statistic over the time
+ interval.";
+ }
+
+ leaf max {
+ type decimal64 {
+ fraction-digits 18;
+ }
+ units bit-errors-per-second;
+ description
+ "The maximum value of the statistic over the time
+ interval.";
+ }
+
+ uses oc-types:stat-interval-state;
+ uses oc-types:min-max-time;
+ }
+
+ // identity statements
+
+ identity TRIBUTARY_PROTOCOL_TYPE {
+ description
+ "Base identity for protocol framing used by tributary
+ signals.";
+ }
+
+ identity PROT_1GE {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "1G Ethernet protocol";
+ }
+
+ identity PROT_OC48 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "OC48 protocol";
+ }
+
+ identity PROT_STM16 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "STM 16 protocol";
+ }
+
+ identity PROT_10GE_LAN {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "10G Ethernet LAN protocol";
+ }
+
+ identity PROT_10GE_WAN {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "10G Ethernet WAN protocol";
+ }
+
+ identity PROT_OC192 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "OC 192 (9.6GB) port protocol";
+ }
+
+ identity PROT_STM64 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "STM 64 protocol";
+ }
+
+ identity PROT_OTU2 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "OTU 2 protocol";
+ }
+
+ identity PROT_OTU2E {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "OTU 2e protocol";
+ }
+
+ identity PROT_OTU1E {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "OTU 1e protocol";
+ }
+
+ identity PROT_ODU2 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "ODU 2 protocol";
+ }
+
+ identity PROT_ODU2E {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "ODU 2e protocol";
+ }
+
+ identity PROT_40GE {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "40G Ethernet port protocol";
+ }
+
+ identity PROT_OC768 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "OC 768 protocol";
+ }
+
+ identity PROT_STM256 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "STM 256 protocol";
+ }
+
+ identity PROT_OTU3 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "OTU 3 protocol";
+ }
+
+ identity PROT_ODU3 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "ODU 3 protocol";
+ }
+
+ identity PROT_100GE {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "100G Ethernet protocol";
+ }
+
+ identity PROT_100G_MLG {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "100G MLG protocol";
+ }
+
+ identity PROT_OTU4 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "OTU4 signal protocol (112G) for transporting
+ 100GE signal";
+ }
+
+ identity PROT_OTUCN {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "OTU Cn protocol";
+ }
+
+ identity PROT_ODUCN {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "ODU Cn protocol";
+ }
+
+ identity PROT_ODU4 {
+ base TRIBUTARY_PROTOCOL_TYPE;
+ description "ODU 4 protocol";
+ }
+
+ identity TRANSCEIVER_FORM_FACTOR_TYPE {
+ description
+ "Base identity for identifying the type of pluggable optic
+ transceiver (i.e,. form factor) used in a port.";
+ }
+
+ identity CFP {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "C form-factor pluggable, that can support up to a
+ 100 Gb/s signal with 10x10G or 4x25G physical channels";
+ }
+
+ identity CFP2 {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "1/2 C form-factor pluggable, that can support up to a
+ 200 Gb/s signal with 10x10G, 4x25G, or 8x25G physical
+ channels";
+ }
+
+ identity CFP2_ACO {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "CFP2 analog coherent optics transceiver, supporting
+ 100 Gb, 200Gb, and 250 Gb/s signal.";
+ }
+
+ identity CFP4 {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "1/4 C form-factor pluggable, that can support up to a
+ 100 Gb/s signal with 10x10G or 4x25G physical channels";
+ }
+
+ identity QSFP {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "OriginalQuad Small Form-factor Pluggable transceiver that can
+ support 4x1G physical channels. Not commonly used.";
+ }
+
+ identity QSFP_PLUS {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "Quad Small Form-factor Pluggable transceiver that can support
+ up to 4x10G physical channels.";
+ }
+
+ identity QSFP28 {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "QSFP pluggable optic with support for up to 4x28G physical
+ channels";
+ }
+
+ identity CPAK {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "Cisco CPAK transceiver supporting 100 Gb/s.";
+ }
+
+ identity SFP {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "Small form-factor pluggable transceiver supporting up to
+ 10 Gb/s signal";
+ }
+
+ identity SFP_PLUS {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "Enhanced small form-factor pluggable transceiver supporting
+ up to 16 Gb/s signals, including 10 GbE and OTU2";
+ }
+
+ identity XFP {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "10 Gigabit small form factor pluggable transceiver supporting
+ 10 GbE and OTU2";
+ }
+
+ identity X2 {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "10 Gigabit small form factor pluggable transceiver supporting
+ 10 GbE using a XAUI inerface and 4 data channels.";
+ }
+
+ identity NON_PLUGGABLE {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "Represents a port that does not require a pluggable optic,
+ e.g., with on-board optics like COBO";
+ }
+
+ identity OTHER {
+ base TRANSCEIVER_FORM_FACTOR_TYPE;
+ description
+ "Represents a transceiver form factor not otherwise listed";
+ }
+
+ identity FIBER_CONNECTOR_TYPE {
+ description
+ "Type of optical fiber connector";
+ }
+
+ identity SC_CONNECTOR {
+ base FIBER_CONNECTOR_TYPE;
+ description
+ "SC type fiber connector";
+ }
+
+ identity LC_CONNECTOR {
+ base FIBER_CONNECTOR_TYPE;
+ description
+ "LC type fiber connector";
+ }
+
+ identity MPO_CONNECTOR {
+ base FIBER_CONNECTOR_TYPE;
+ description
+ "MPO (multi-fiber push-on/pull-off) type fiber connector
+ 1x12 fibers";
+ }
+
+ identity ETHERNET_PMD_TYPE {
+ description
+ "Ethernet compliance codes (PMD) supported by transceivers";
+ }
+
+ identity ETH_10GBASE_LRM {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 10GBASE_LRM";
+ }
+
+ identity ETH_10GBASE_LR {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 10GBASE_LR";
+ }
+
+ identity ETH_10GBASE_ZR {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 10GBASE_ZR";
+ }
+
+ identity ETH_10GBASE_ER {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 10GBASE_ER";
+ }
+
+ identity ETH_10GBASE_SR {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 10GBASE_SR";
+ }
+
+ identity ETH_40GBASE_CR4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 40GBASE_CR4";
+ }
+
+ identity ETH_40GBASE_SR4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 40GBASE_SR4";
+ }
+
+ identity ETH_40GBASE_LR4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 40GBASE_LR4";
+ }
+
+ identity ETH_40GBASE_ER4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 40GBASE_ER4";
+ }
+
+ identity ETH_40GBASE_PSM4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 40GBASE_PSM4";
+ }
+
+ identity ETH_4X10GBASE_LR {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 4x10GBASE_LR";
+ }
+
+ identity ETH_4X10GBASE_SR {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 4x10GBASE_SR";
+ }
+
+ identity ETH_100G_AOC {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 100G_AOC";
+ }
+
+ identity ETH_100G_ACC {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 100G_ACC";
+ }
+
+ identity ETH_100GBASE_SR10 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 100GBASE_SR10";
+ }
+
+ identity ETH_100GBASE_SR4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 100GBASE_SR4";
+ }
+
+ identity ETH_100GBASE_LR4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 100GBASE_LR4";
+ }
+
+ identity ETH_100GBASE_ER4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 100GBASE_ER4";
+ }
+
+ identity ETH_100GBASE_CWDM4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 100GBASE_CWDM4";
+ }
+
+ identity ETH_100GBASE_CLR4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 100GBASE_CLR4";
+ }
+
+ identity ETH_100GBASE_PSM4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 100GBASE_PSM4";
+ }
+
+ identity ETH_100GBASE_CR4 {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: 100GBASE_CR4";
+ }
+
+ identity ETH_UNDEFINED {
+ base ETHERNET_PMD_TYPE;
+ description "Ethernet compliance code: undefined";
+ }
+
+ identity SONET_APPLICATION_CODE {
+ description
+ "Supported SONET/SDH application codes";
+ }
+
+ identity VSR2000_3R2 {
+ base SONET_APPLICATION_CODE;
+ description
+ "SONET/SDH application code: VSR2000_3R2";
+ }
+
+ identity VSR2000_3R3 {
+ base SONET_APPLICATION_CODE;
+ description
+ "SONET/SDH application code: VSR2000_3R3";
+ }
+
+ identity VSR2000_3R5 {
+ base SONET_APPLICATION_CODE;
+ description
+ "SONET/SDH application code: VSR2000_3R5";
+ }
+
+ identity SONET_UNDEFINED {
+ base SONET_APPLICATION_CODE;
+ description
+ "SONET/SDH application code: undefined";
+ }
+
+ identity OTN_APPLICATION_CODE {
+ description
+ "Supported OTN application codes";
+ }
+
+ identity P1L1_2D1 {
+ base OTN_APPLICATION_CODE;
+ description
+ "OTN application code: P1L1_2D1";
+ }
+
+ identity P1S1_2D2 {
+ base OTN_APPLICATION_CODE;
+ description
+ "OTN application code: P1S1_2D2";
+ }
+
+ identity P1L1_2D2 {
+ base OTN_APPLICATION_CODE;
+ description
+ "OTN application code: P1L1_2D2";
+ }
+
+ identity OTN_UNDEFINED {
+ base OTN_APPLICATION_CODE;
+ description
+ "OTN application code: undefined";
+ }
+
+ identity TRIBUTARY_RATE_CLASS_TYPE {
+ description
+ "Rate of tributary signal _- identities will typically reflect
+ rounded bit rate.";
+ }
+
+ identity TRIB_RATE_1G {
+ base TRIBUTARY_RATE_CLASS_TYPE;
+ description
+ "1G tributary signal rate";
+ }
+
+ identity TRIB_RATE_2.5G {
+ base TRIBUTARY_RATE_CLASS_TYPE;
+ description
+ "2.5G tributary signal rate";
+ }
+
+ identity TRIB_RATE_10G {
+ base TRIBUTARY_RATE_CLASS_TYPE;
+ description
+ "10G tributary signal rate";
+ }
+
+ identity TRIB_RATE_40G {
+ base TRIBUTARY_RATE_CLASS_TYPE;
+ description
+ "40G tributary signal rate";
+ }
+
+ identity TRIB_RATE_100G {
+ base TRIBUTARY_RATE_CLASS_TYPE;
+ description
+ "100G tributary signal rate";
+ }
+
+ identity TRIB_RATE_150G {
+ base TRIBUTARY_RATE_CLASS_TYPE;
+ description
+ "150G tributary signal rate";
+ }
+
+ identity TRIB_RATE_200G {
+ base TRIBUTARY_RATE_CLASS_TYPE;
+ description
+ "200G tributary signal rate";
+ }
+
+ identity TRIB_RATE_250G {
+ base TRIBUTARY_RATE_CLASS_TYPE;
+ description
+ "250G tributary signal rate";
+ }
+
+ identity TRIB_RATE_300G {
+ base TRIBUTARY_RATE_CLASS_TYPE;
+ description
+ "300G tributary signal rate";
+ }
+
+ identity TRIB_RATE_400G {
+ base TRIBUTARY_RATE_CLASS_TYPE;
+ description
+ "400G tributary signal rate";
+ }
+
+ identity LOGICAL_ELEMENT_PROTOCOL_TYPE {
+ description
+ "Type of protocol framing used on the logical channel or
+ tributary";
+ }
+
+ identity PROT_ETHERNET {
+ base LOGICAL_ELEMENT_PROTOCOL_TYPE;
+ description
+ "Ethernet protocol framing";
+ }
+
+ identity PROT_OTN {
+ base LOGICAL_ELEMENT_PROTOCOL_TYPE;
+ description
+ "OTN protocol framing";
+ }
+
+ identity OPTICAL_CHANNEL {
+ base oc-platform-types:OPENCONFIG_HARDWARE_COMPONENT;
+ description
+ "Optical channels act as carriers for transport traffic
+ directed over a line system. They are represented as
+ physical components in the physical inventory model.";
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-types.yang b/src/plugins/yang/openconfig/openconfig-types.yang
new file mode 100644
index 0000000..01713b3
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-types.yang
@@ -0,0 +1,455 @@
+module openconfig-types {
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/openconfig-types";
+
+ prefix "oc-types";
+
+ // import statements
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module contains a set of general type definitions that
+ are used across OpenConfig models. It can be imported by modules
+ that make use of these types.";
+
+ oc-ext:openconfig-version "0.5.0";
+
+ revision "2018-05-05" {
+ description
+ "Add grouping of min-max-time and
+ included them to all stats with min/max/avg";
+ reference "0.5.0";
+ }
+
+ revision "2018-01-16" {
+ description
+ "Add interval to min/max/avg stats; add percentage stat";
+ reference "0.4.0";
+ }
+
+ revision "2017-08-16" {
+ description
+ "Apply fix for ieetfloat32 length parameter";
+ reference "0.3.3";
+ }
+
+ revision "2017-01-13" {
+ description
+ "Add ADDRESS_FAMILY identity";
+ reference "0.3.2";
+ }
+
+ revision "2016-11-14" {
+ description
+ "Correct length of ieeefloat32";
+ reference "0.3.1";
+ }
+
+ revision "2016-11-11" {
+ description
+ "Additional types - ieeefloat32 and routing-password";
+ reference "0.3.0";
+ }
+
+ revision "2016-05-31" {
+ description
+ "OpenConfig public release";
+ reference "0.2.0";
+ }
+
+ typedef percentage {
+ type uint8 {
+ range "0..100";
+ }
+ description
+ "Integer indicating a percentage value";
+ }
+
+ typedef std-regexp {
+ type string;
+ description
+ "This type definition is a placeholder for a standard
+ definition of a regular expression that can be utilised in
+ OpenConfig models. Further discussion is required to
+ consider the type of regular expressions that are to be
+ supported. An initial proposal is POSIX compatible.";
+ }
+
+ typedef timeticks64 {
+ type uint64;
+ description
+ "This type is based on the timeticks type defined in
+ RFC 6991, but with 64-bit width. It represents the time,
+ modulo 2^64, in hundredths of a second between two epochs.";
+ reference
+ "RFC 6991 - Common YANG Data Types";
+ }
+
+ typedef ieeefloat32 {
+ type binary {
+ length "4";
+ }
+ description
+ "An IEEE 32-bit floating point number. The format of this number
+ is of the form:
+ 1-bit sign
+ 8-bit exponent
+ 23-bit fraction
+ The floating point value is calculated using:
+ (-1)**S * 2**(Exponent-127) * (1+Fraction)";
+ }
+
+ typedef routing-password {
+ type string;
+ description
+ "This type is indicative of a password that is used within
+ a routing protocol which can be returned in plain text to the
+ NMS by the local system. Such passwords are typically stored
+ as encrypted strings. Since the encryption used is generally
+ well known, it is possible to extract the original value from
+ the string - and hence this format is not considered secure.
+ Leaves specified with this type should not be modified by
+ the system, and should be returned to the end-user in plain
+ text. This type exists to differentiate passwords, which
+ may be sensitive, from other string leaves. It could, for
+ example, be used by the NMS to censor this data when
+ viewed by particular users.";
+ }
+
+ typedef stat-interval {
+ type uint64;
+ units nanoseconds;
+ description
+ "A time interval over which a set of statistics is computed.
+ A common usage is to report the interval over which
+ avg/min/max stats are computed and reported.";
+ }
+
+ grouping stat-interval-state {
+ description
+ "Reusable leaf definition for stats computation interval";
+
+ leaf interval {
+ type oc-types:stat-interval;
+ description
+ "If supported by the system, this reports the time interval
+ over which the min/max/average statistics are computed by
+ the system.";
+ }
+ }
+
+ grouping min-max-time {
+ description
+ "Common grouping for recording the absolute time at which
+ the minimum and maximum values occurred in the statistics";
+
+ leaf min-time {
+ type oc-types:timeticks64;
+ description
+ "The absolute time at which the minimum value occurred.
+ The value is the timestamp in nanoseconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+
+ leaf max-time {
+ type oc-types:timeticks64;
+ description
+ "The absolute time at which the maximum value occurred.
+ The value is the timestamp in nanoseconds relative to
+ the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+ }
+
+ grouping avg-min-max-stats-precision1 {
+ description
+ "Common nodes for recording average, minimum, and
+ maximum values for a statistic. These values all have
+ fraction-digits set to 1. Statistics are computed
+ and reported based on a moving time interval (e.g., the last
+ 30s). If supported by the device, the time interval over which
+ the statistics are computed is also reported.";
+
+ leaf avg {
+ type decimal64 {
+ fraction-digits 1;
+ }
+ description
+ "The arithmetic mean value of the statistic over the
+ time interval.";
+ }
+
+ leaf min {
+ type decimal64 {
+ fraction-digits 1;
+ }
+ description
+ "The minimum value of the statistic over the time
+ interval.";
+ }
+
+ leaf max {
+ type decimal64 {
+ fraction-digits 1;
+ }
+ description
+ "The maximum value of the statitic over the time
+ interval.";
+ }
+
+ uses stat-interval-state;
+ uses min-max-time;
+ }
+
+ grouping avg-min-max-instant-stats-precision1 {
+ description
+ "Common grouping for recording an instantaneous statistic value
+ in addition to avg-min-max stats";
+
+ leaf instant {
+ type decimal64 {
+ fraction-digits 1;
+ }
+ description
+ "The instantaneous value of the statistic.";
+ }
+
+ uses avg-min-max-stats-precision1;
+ }
+
+ grouping avg-min-max-instant-stats-precision2-dB {
+ description
+ "Common grouping for recording dB values with 2 decimal
+ precision. Values include the instantaneous, average,
+ minimum, and maximum statistics. Statistics are computed
+ and reported based on a moving time interval (e.g., the last
+ 30s). If supported by the device, the time interval over which
+ the statistics are computed, and the times at which the minimum
+ and maximum values occurred, are also reported.";
+
+ leaf instant {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ description
+ "The instantaneous value of the statistic.";
+ }
+
+ leaf avg {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ description
+ "The arithmetic mean value of the statistic over the
+ time interval.";
+ }
+
+ leaf min {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ description
+ "The minimum value of the statistic over the time interval.";
+ }
+
+ leaf max {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dB;
+ description
+ "The maximum value of the statistic over the time
+ interval.";
+ }
+
+ uses stat-interval-state;
+ uses min-max-time;
+ }
+
+ grouping avg-min-max-instant-stats-precision2-dBm {
+ description
+ "Common grouping for recording dBm values with 2 decimal
+ precision. Values include the instantaneous, average,
+ minimum, and maximum statistics. Statistics are computed
+ and reported based on a moving time interval (e.g., the last
+ 30s). If supported by the device, the time interval over which
+ the statistics are computed, and the times at which the minimum
+ and maximum values occurred, are also reported.";
+
+ leaf instant {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dBm;
+ description
+ "The instantaneous value of the statistic.";
+ }
+
+ leaf avg {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dBm;
+ description
+ "The arithmetic mean value of the statistic over the
+ time interval.";
+ }
+
+ leaf min {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dBm;
+ description
+ "The minimum value of the statistic over the time
+ interval.";
+ }
+
+ leaf max {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units dBm;
+ description
+ "The maximum value of the statistic over the time interval.";
+ }
+
+ uses stat-interval-state;
+ uses min-max-time;
+ }
+
+ grouping avg-min-max-instant-stats-precision2-mA {
+ description
+ "Common grouping for recording mA values with 2 decimal
+ precision. Values include the instantaneous, average,
+ minimum, and maximum statistics. Statistics are computed
+ and reported based on a moving time interval (e.g., the last
+ 30s). If supported by the device, the time interval over which
+ the statistics are computed, and the times at which the minimum
+ and maximum values occurred, are also reported.";
+
+ leaf instant {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units mA;
+ description
+ "The instantaneous value of the statistic.";
+ }
+
+ leaf avg {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units mA;
+ description
+ "The arithmetic mean value of the statistic over the
+ time interval.";
+ }
+
+ leaf min {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units mA;
+ description
+ "The minimum value of the statistic over the time
+ interval.";
+ }
+
+ leaf max {
+ type decimal64 {
+ fraction-digits 2;
+ }
+ units mA;
+ description
+ "The maximum value of the statistic over the time
+ interval.";
+ }
+
+ uses stat-interval-state;
+ uses min-max-time;
+ }
+
+ grouping avg-min-max-instant-stats-pct {
+ description
+ "Common grouping for percentage statistics.
+ Values include the instantaneous, average,
+ minimum, and maximum statistics. Statistics are computed
+ and reported based on a moving time interval (e.g., the last
+ 30s). If supported by the device, the time interval over which
+ the statistics are computed, and the times at which the minimum
+ and maximum values occurred, are also reported.";
+
+ leaf instant {
+ type oc-types:percentage;
+ description
+ "The instantaneous percentage value.";
+ }
+
+ leaf avg {
+ type oc-types:percentage;
+ description
+ "The arithmetic mean value of the percentage measure of the
+ statistic over the time interval.";
+ }
+
+ leaf min {
+ type oc-types:percentage;
+ description
+ "The minimum value of the percentage measure of the
+ statistic over the time interval.";
+ }
+
+ leaf max {
+ type oc-types:percentage;
+ description
+ "The maximum value of the percentage measure of the
+ statistic over the time interval.";
+ }
+
+ uses stat-interval-state;
+ uses min-max-time;
+ }
+
+ identity ADDRESS_FAMILY {
+ description
+ "A base identity for all address families";
+ }
+
+ identity IPV4 {
+ base ADDRESS_FAMILY;
+ description
+ "The IPv4 address family";
+ }
+
+ identity IPV6 {
+ base ADDRESS_FAMILY;
+ description
+ "The IPv6 address family";
+ }
+
+ identity MPLS {
+ base ADDRESS_FAMILY;
+ description
+ "The MPLS address family";
+ }
+
+ identity L2_ETHERNET {
+ base ADDRESS_FAMILY;
+ description
+ "The 802.3 Ethernet address family";
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-vlan-types.yang b/src/plugins/yang/openconfig/openconfig-vlan-types.yang
new file mode 100644
index 0000000..6d9ab55
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-vlan-types.yang
@@ -0,0 +1,195 @@
+module openconfig-vlan-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/vlan-types";
+
+ prefix "oc-vlan-types";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module defines configuration and state variables for VLANs,
+ in addition to VLAN parameters associated with interfaces";
+
+ oc-ext:openconfig-version "3.0.0";
+
+ revision "2018-02-14" {
+ description
+ "Fix bug with name of 802.1ad identity.";
+ reference "3.0.0";
+ }
+
+ revision "2017-07-14" {
+ description
+ "Move top-level vlan data to network-instance; Update
+ identities to comply to style guide; fixed pattern
+ quoting; corrected trunk vlan types; added TPID config to
+ base interface.";
+ reference "2.0.0";
+ }
+
+ revision "2016-05-26" {
+ description
+ "OpenConfig public release";
+ reference "1.0.2";
+ }
+
+ // extension statements
+
+ // feature statements
+
+ // identity statements
+
+ identity TPID_TYPES {
+ description
+ "Base identity for TPID values that can override the VLAN
+ ethertype value";
+ }
+
+ identity TPID_0X8100 {
+ base TPID_TYPES;
+ description
+ "Default TPID value for 802.1q single-tagged VLANs.";
+ }
+
+ identity TPID_0X88A8 {
+ base TPID_TYPES;
+ description
+ "TPID value for 802.1ad provider bridging, QinQ or
+ stacked VLANs.";
+ }
+
+ identity TPID_0X9100 {
+ base TPID_TYPES;
+ description
+ "Alternate TPID value";
+ }
+
+ identity TPID_0X9200 {
+ base TPID_TYPES;
+ description
+ "Alternate TPID value";
+ }
+
+ // typedef statements
+
+ // TODO: typedefs should be defined in a vlan-types.yang file.
+ typedef vlan-id {
+ type uint16 {
+ range 1..4094;
+ }
+ description
+ "Type definition representing a single-tagged VLAN";
+ }
+
+ typedef vlan-range {
+ type string {
+ // range specified as [lower]..[upper]
+ pattern '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' +
+ '[1-9][0-9]{1,2}|[1-9])\.\.(409[0-4]|' +
+ '40[0-8][0-9]|[1-3][0-9]{3}|[1-9][0-9]{1,2}|' +
+ '[1-9])$';
+ }
+ description
+ "Type definition representing a range of single-tagged
+ VLANs. A range is specified as x..y where x and y are
+ valid VLAN IDs (1 <= vlan-id <= 4094). The range is
+ assumed to be inclusive, such that any VLAN-ID matching
+ x <= VLAN-ID <= y falls within the range.";
+ }
+
+ typedef qinq-id {
+ type string {
+ pattern
+ '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' +
+ '[1-9][0-9]{1,2}|[1-9])\.' +
+ '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' +
+ '[1-9][0-9]{1,2}|[1-9])|\*)$';
+ }
+ description
+ "Type definition representing a single double-tagged/QinQ VLAN
+ identifier. The format of a QinQ VLAN-ID is x.y where X is the
+ 'outer' VLAN identifier, and y is the 'inner' VLAN identifier.
+ Both x and y must be valid VLAN IDs (1 <= vlan-id <= 4094)
+ with the exception that y may be equal to a wildcard (*). In
+ cases where y is set to the wildcard, this represents all inner
+ VLAN identifiers where the outer VLAN identifier is equal to
+ x";
+ }
+
+ typedef qinq-id-range {
+ type union {
+ type string {
+ // match cases where the range is specified as x..y.z
+ pattern
+ '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' +
+ '[1-9][0-9]{1,2}|[1-9])\.\.' +
+ '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' +
+ '[1-9][0-9]{1,2}|[1-9])\.' +
+ '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' +
+ '[1-9][0-9]{1,2}|[1-9])|\*)$';
+ }
+ type string {
+ // match cases where the range is specified as x.y..z
+ pattern
+ '^(\*|(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' +
+ '[1-9][0-9]{1,2}|[1-9]))\.' +
+ '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' +
+ '[1-9][0-9]{1,2}|[1-9])\.\.' +
+ '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' +
+ '[1-9][0-9]{1,2}|[1-9])$';
+ }
+ }
+ description
+ "A type definition representing a range of double-tagged/QinQ
+ VLAN identifiers. The format of a QinQ VLAN-ID range can be
+ specified in three formats. Where the range is outer VLAN IDs
+ the range is specified as x..y.z. In this case outer VLAN
+ identifiers meeting the criteria x <= outer-vlan-id <= y are
+ accepted iff the inner VLAN-ID is equal to y - or any inner-tag
+ if the wildcard is specified. Alternatively the range can be
+ specified as x.y..z. In this case only VLANs with an
+ outer-vlan-id qual to x are accepted (x may again be the
+ wildcard). Inner VLANs are accepted if they meet the inequality
+ y <= inner-vlan-id <= z.";
+ }
+
+ typedef vlan-mode-type {
+ type enumeration {
+ enum ACCESS {
+ description "Access mode VLAN interface (No 802.1q header)";
+ }
+ enum TRUNK {
+ description "Trunk mode VLAN interface";
+ }
+ }
+ description
+ "VLAN interface mode (trunk or access)";
+ }
+
+ typedef vlan-ref {
+ type union {
+ type vlan-id;
+ type string;
+ // TODO: string should be changed to leafref to reference
+ // an existing VLAN. this is not allowed in YANG 1.0 but
+ // is expected to be in YANG 1.1.
+ // type leafref {
+ // path "vlan:vlans/vlan:vlan/vlan:config/vlan:name";
+ // }
+ }
+ description
+ "Reference to a VLAN by name or id";
+ }
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-vlan.yang b/src/plugins/yang/openconfig/openconfig-vlan.yang
new file mode 100644
index 0000000..97348c0
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-vlan.yang
@@ -0,0 +1,438 @@
+module openconfig-vlan {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/vlan";
+
+ prefix "oc-vlan";
+
+ // import some basic types
+ import openconfig-vlan-types { prefix oc-vlan-types; }
+ import openconfig-interfaces { prefix oc-if; }
+ import openconfig-if-ethernet { prefix oc-eth; }
+ import openconfig-if-aggregate { prefix oc-lag; }
+ import iana-if-type { prefix ift; }
+ import openconfig-extensions { prefix oc-ext; }
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ netopenconfig@googlegroups.com";
+
+ description
+ "This module defines configuration and state variables for VLANs,
+ in addition to VLAN parameters associated with interfaces";
+
+ oc-ext:openconfig-version "3.0.1";
+
+ revision "2018-06-05" {
+ description
+ "Fix bugs in when statements.";
+ reference "3.0.1";
+ }
+
+ revision "2018-02-14" {
+ description
+ "Fix bug with name of 802.1ad identity.";
+ reference "3.0.0";
+ }
+
+ revision "2017-07-14" {
+ description
+ "Move top-level vlan data to network-instance; Update
+ identities to comply to style guide; fixed pattern
+ quoting; corrected trunk vlan types; added TPID config to
+ base interface.";
+ reference "2.0.0";
+ }
+
+ revision "2016-05-26" {
+ description
+ "OpenConfig public release";
+ reference "1.0.2";
+ }
+
+ // grouping statements
+
+ grouping vlan-config {
+ description "VLAN configuration container.";
+
+ leaf vlan-id {
+ type oc-vlan-types:vlan-id;
+ description "Interface VLAN id.";
+ }
+
+ leaf name {
+ type string;
+ description "Interface VLAN name.";
+ }
+
+ leaf status {
+ type enumeration {
+ enum ACTIVE {
+ description "VLAN is active";
+ }
+ enum SUSPENDED {
+ description "VLAN is inactive / suspended";
+ }
+ }
+ default ACTIVE;
+ description "Admin state of the VLAN";
+ }
+
+ }
+
+ grouping vlan-state {
+ description "State variables for VLANs";
+
+ // placeholder
+
+ }
+
+ grouping vlan-tpid-config {
+ description
+ "TPID configuration for dot1q-enabled interfaces";
+
+ leaf tpid {
+ type identityref {
+ base oc-vlan-types:TPID_TYPES;
+ }
+ default oc-vlan-types:TPID_0X8100;
+ description
+ "Optionally set the tag protocol identifier field (TPID) that
+ is accepted on the VLAN";
+ }
+ }
+
+ grouping vlan-tpid-state {
+ description
+ "TPID opstate for dot1q-enabled interfaces";
+
+ // placeholder
+
+ }
+
+ grouping vlan-members-state {
+ description
+ "List of interfaces / subinterfaces belonging to the VLAN.";
+
+ container members {
+ description
+ "Enclosing container for list of member interfaces";
+
+ list member {
+ config false;
+ description
+ "List of references to interfaces / subinterfaces
+ associated with the VLAN.";
+
+ uses oc-if:base-interface-ref-state;
+ }
+ }
+ }
+
+ grouping vlan-switched-config {
+ description
+ "VLAN related configuration that is part of the physical
+ Ethernet interface.";
+
+ leaf interface-mode {
+ type oc-vlan-types:vlan-mode-type;
+ description
+ "Set the interface to access or trunk mode for
+ VLANs";
+ }
+
+ leaf native-vlan {
+ when "../interface-mode = 'TRUNK'" {
+ description
+ "Native VLAN is valid for trunk mode interfaces";
+ }
+ type oc-vlan-types:vlan-id;
+ description
+ "Set the native VLAN id for untagged frames arriving on
+ a trunk interface. Tagged frames sent on an interface
+ configured with a native VLAN should have their tags
+ stripped prior to transmission. This configuration is only
+ valid on a trunk interface.";
+ }
+
+ leaf access-vlan {
+ when "../interface-mode = 'ACCESS'" {
+ description
+ "Access VLAN assigned to the interfaces";
+ }
+ type oc-vlan-types:vlan-id;
+ description
+ "Assign the access vlan to the access port.";
+ }
+
+ leaf-list trunk-vlans {
+ when "../interface-mode = 'TRUNK'" {
+ description
+ "Allowed VLANs may be specified for trunk mode
+ interfaces.";
+ }
+ type union {
+ type oc-vlan-types:vlan-id;
+ type oc-vlan-types:vlan-range;
+ }
+ description
+ "Specify VLANs, or ranges thereof, that the interface may
+ carry when in trunk mode. If not specified, all VLANs are
+ allowed on the interface. Ranges are specified in the form
+ x..y, where x<y - ranges are assumed to be inclusive (such
+ that the VLAN range is x <= range <= y.";
+ }
+ }
+
+ grouping vlan-switched-state {
+ description
+ "VLAN related operational state that is part of Ethernet
+ interface state data";
+
+ //TODO: placeholder for operational state related to VLANs
+ //on the physical interface
+ }
+
+ grouping vlan-switched-top {
+ description
+ "Top-level grouping for VLAN data associated with an
+ Ethernet interface";
+
+ container switched-vlan {
+ description
+ "Enclosing container for VLAN interface-specific
+ data on Ethernet interfaces. These are for standard
+ L2, switched-style VLANs.";
+
+ container config {
+ description "Configuration parameters for VLANs";
+
+ uses vlan-switched-config;
+ }
+
+ container state {
+
+ config false;
+ description "State variables for VLANs";
+
+ uses vlan-switched-config;
+ uses vlan-switched-state;
+ }
+ }
+ }
+
+ grouping vlan-logical-config {
+ description
+ "VLAN related configuration that is part of subinterface
+ (logical interface) configuration. These are generally
+ L3 VLANs with an id that is local.";
+
+
+ leaf vlan-id {
+ type union {
+ type oc-vlan-types:vlan-id;
+ type oc-vlan-types:qinq-id;
+ }
+ description
+ "VLAN id for the subinterface -- specified inline for the
+ case of a local VLAN. The id is scoped to the
+ subinterface, and could be repeated on different
+ subinterfaces.";
+ }
+ }
+
+ grouping vlan-logical-state {
+ description
+ "VLAN related operational state that is part of logical
+ interface state data";
+
+ //TODO: placeholder to add VLAN-specific state variables on
+ //the subinterface
+ }
+
+ grouping vlan-top {
+ description "Top-level grouping for VLAN configuration";
+
+ container vlans {
+ description "Container for VLAN configuration and state
+ variables";
+
+ list vlan {
+ key "vlan-id";
+
+ description "Configured VLANs keyed by id";
+
+ leaf vlan-id {
+ type leafref {
+ path "../config/vlan-id";
+ }
+ description "references the configured vlan-id";
+ }
+
+ container config {
+ description "Configuration parameters for VLANs";
+
+ uses vlan-config;
+ }
+
+ container state {
+
+ config false;
+ description "State variables for VLANs";
+
+ uses vlan-config;
+ uses vlan-state;
+ }
+ uses vlan-members-state;
+ }
+ }
+ }
+
+ grouping vlan-logical-top {
+ description
+ "Top-level grouping for VLAN data associated with a
+ logical interface or subinterface";
+
+ container vlan {
+ description
+ "Enclosing container for VLAN interface-specific
+ data on subinterfaces";
+
+ container config {
+ description "Configuration parameters for VLANs";
+
+ uses vlan-logical-config;
+ }
+
+ container state {
+
+ config false;
+ description "State variables for VLANs";
+
+ uses vlan-logical-config;
+ uses vlan-logical-state;
+ }
+ }
+ }
+
+ grouping vlan-routed-config {
+ description
+ "Configuration data for routed vlans (SVI, IRB, etc.)";
+
+ leaf vlan {
+ type union {
+ // TODO: in YANG 1.1, unions support leafref types which
+ // should be used here to reference a configured VLAN by
+ // id or name
+ type uint16;
+ type string;
+ }
+ description
+ "References the VLAN for which this IP interface
+ provides routing services -- similar to a switch virtual
+ interface (SVI), or integrated routing and bridging interface
+ (IRB) in some implementations.";
+ }
+
+ }
+
+ grouping vlan-routed-state {
+ description
+ "Operational state data for routed vlan interfaces.";
+ }
+
+ grouping vlan-routed-top {
+ description
+ "Top-level grouping for routed vlan logical interfaces";
+
+ container routed-vlan {
+ description
+ "Top-level container for routed vlan interfaces. These
+ logical interfaces are also known as SVI (switched virtual
+ interface), IRB (integrated routing and bridging), RVI
+ (routed VLAN interface)";
+
+ container config {
+ description
+ "Configuration data for routed vlan interfaces";
+
+ uses vlan-routed-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses vlan-routed-config;
+ uses vlan-routed-state;
+ }
+ }
+ }
+
+ // data definition statements
+
+ // augment statements
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+ "oc-if:subinterface" {
+ description
+ "Adds VLAN settings to individual subinterfaces";
+
+ uses vlan-logical-top;
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:config" {
+ description
+ "Adds TPID / ethertype setting for the base interface";
+
+ uses vlan-tpid-config;
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+ description
+ "Adds TPID / ethertype opstate for the base interface";
+
+ uses vlan-tpid-config;
+ uses vlan-tpid-state;
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet" {
+ description
+ "Adds VLAN settings to individual Ethernet interfaces";
+
+ uses vlan-switched-top;
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-lag:aggregation" {
+ description "Adds VLAN settings to a LAG interface";
+
+ uses vlan-switched-top;
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface" {
+ description
+ "Adds configuration and state for routed VLAN interfaces";
+
+ uses vlan-routed-top {
+ when "current()/oc-if:config/oc-if:type = 'ift:l3ipvlan'" {
+ description
+ "Active when the interface is a logical interface providing
+ L3 routing for VLANs";
+ }
+ }
+ }
+
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-wavelength-router.yang b/src/plugins/yang/openconfig/openconfig-wavelength-router.yang
new file mode 100644
index 0000000..c6ad945
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-wavelength-router.yang
@@ -0,0 +1,360 @@
+module openconfig-wavelength-router {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/wavelength-router";
+
+ prefix "oc-wave-router";
+
+ // import some basic types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-transport-types { prefix oc-opt-types; }
+ import openconfig-types { prefix oc-types; }
+
+
+ // meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This model describes configuration and operational state data
+ for an optical transport line system node, or ROADM (incl. CDC
+ ROADMs, WSS, Dynamic Gain Equalizer/DGE).
+
+ Nodes are modeled as a configurable switching element with
+ ingress and egress ports, as well as a number of add/drop ports
+ that can be set up to direct portions of the optical spectrum
+ to the appropriate degrees.";
+
+ oc-ext:openconfig-version "0.3.2";
+
+ revision "2018-07-17" {
+ description
+ "Correct bug so that source/dest ports are components";
+ reference "0.3.2";
+ }
+
+ revision "2017-09-08" {
+ description
+ "Correct bug with OSC interfaces";
+ reference "0.3.1";
+ }
+
+ revision "2017-07-08" {
+ description
+ "Support multiple OCMs, add monitor port type
+ and refs to hw ports, ";
+ reference "0.3.0";
+ }
+
+ revision "2017-03-28" {
+ description
+ "Added min/max/avg stats, status for media channels, OCM, APS";
+ reference "0.2.0";
+ }
+
+ revision "2016-03-31" {
+ description
+ "Initial public release";
+ reference "0.1.0";
+ }
+
+
+
+ // grouping statements
+
+ grouping media-channel-port-config {
+ description
+ "Configuration data for a media channel source/dest port";
+
+ leaf port-name {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ description
+ "Reference to the corresponding node port";
+ }
+ }
+
+ grouping media-channel-port-state {
+ description
+ "Operational state data for a media channel source/dest port";
+ }
+
+ grouping media-channel-source-port-top {
+ description
+ "Top-level grouping for source of the media channel";
+
+ container source {
+ description
+ "Top-level container for media channel source";
+
+ container config {
+ description
+ "Configuration data for the media channel source";
+
+ uses media-channel-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the media channel source";
+
+ uses media-channel-port-config;
+ uses media-channel-port-state;
+ }
+ }
+ }
+
+ grouping media-channel-dest-port-top {
+ description
+ "Top-level grouping for destination of the media channel";
+
+ container dest {
+ description
+ "Top-level container for media channel destination";
+
+ container config {
+ description
+ "Configuration data for the media channel destination";
+
+ uses media-channel-port-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for the media channel destination";
+
+ uses media-channel-port-config;
+ uses media-channel-port-state;
+ }
+ }
+ }
+
+ grouping media-channel-psd-config {
+ description
+ "Configuration data for the media channel PSD";
+
+ leaf lower-frequency {
+ type oc-opt-types:frequency-type;
+ description
+ "Lower frequency of the specified PSD";
+ }
+
+ leaf upper-frequency {
+ type oc-opt-types:frequency-type;
+ description
+ "Upper frequency of the specified PSD";
+ }
+
+ leaf psd {
+ type oc-types:ieeefloat32;
+ units "nW/MHz";
+ description
+ "Power spectral density expressed in nanowatts per
+ megahertz, nW/MHz. These units allow the value to often
+ be greater than 1.0. It also avoids dealing with zero values
+ for 0dBm. For example, a 40GHz wide channel
+ with 0dBm power would be:
+ 0dBm = 1mW = 10^6nW
+ 40GHz = 40,000MHz
+ 0dBm/40GHz = 10^6nW/40,000MHz = 1000/40 = 25";
+ }
+ }
+
+ grouping media-channel-psd-state {
+ description
+ "Operational state data for the media channel PSD";
+ }
+
+ grouping media-channel-psd-top {
+ description
+ "Top-level grouping ";
+
+ container psd-distribution {
+ description
+ "Enclosing container for the list of values describing
+ the power spectral density distribution";
+
+ list psd-value {
+ key "lower-frequency upper-frequency";
+ description
+ "List of tuples describing the PSD distribution";
+
+ leaf lower-frequency {
+ type leafref {
+ path "../config/lower-frequency";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ leaf upper-frequency {
+ type leafref {
+ path "../config/upper-frequency";
+ }
+ description
+ "Reference to the list key";
+ }
+
+ container config {
+ description
+ "Configuration data for PSD";
+
+ uses media-channel-psd-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data for PSD";
+
+ uses media-channel-psd-config;
+ uses media-channel-psd-state;
+ }
+ }
+ }
+ }
+
+ grouping media-channel-config {
+ description
+ "Configuration data for media channel definitions";
+
+ leaf index {
+ type uint32;
+ description
+ "Identifier for the defined media channel";
+ }
+
+ leaf name {
+ type string;
+ description
+ "The user supplied name of the media channel";
+ }
+
+ leaf lower-frequency {
+ type oc-opt-types:frequency-type;
+ description
+ "The lower frequency for the spectrum defined by this media
+ channel";
+ }
+
+ leaf upper-frequency {
+ type oc-opt-types:frequency-type;
+ description
+ "The upper frequency for the spectrum defined by this media
+ channel";
+ }
+
+ leaf admin-status {
+ type oc-opt-types:admin-state-type;
+ description
+ "Sets the admin status of the media channel";
+ }
+
+ }
+
+ grouping media-channel-state {
+ description
+ "Operational state data for media channels ";
+
+ leaf oper-status {
+ type enumeration {
+ enum UP {
+ description
+ "Media channel is operationally up";
+ }
+ enum DOWN {
+ description
+ "Media channel is operationally down";
+ }
+ }
+ description
+ "Operational state of the media channel";
+ }
+
+ }
+
+ grouping media-channel-top {
+ description
+ "Top-level grouping for list of defined media channels";
+
+ container media-channels {
+ description
+ "Enclosing container for media channel list";
+
+ list channel {
+ key "index";
+ description
+ "List of media channels";
+
+ leaf index {
+ type leafref {
+ path "../config/index";
+ }
+ description
+ "Reference to index number of the media channel";
+ }
+
+ container config {
+ description
+ "Configuration data ";
+
+ uses media-channel-config;
+ }
+
+ container state {
+
+ config false;
+
+ description
+ "Operational state data ";
+
+ uses media-channel-config;
+ uses media-channel-state;
+ }
+
+ uses media-channel-source-port-top;
+ uses media-channel-dest-port-top;
+ uses media-channel-psd-top;
+ }
+ }
+ }
+
+ grouping wavelength-router-top {
+ description
+ "Top level grouping for the wavelength router";
+
+ container wavelength-router {
+ description
+ "Top-level container for wavelength router device";
+
+ uses media-channel-top;
+ }
+ }
+
+ // data definition statements
+
+ uses wavelength-router-top;
+
+ // augment statements
+
+ // rpc statements
+
+ // notification statements
+
+}
diff --git a/src/plugins/yang/openconfig/openconfig-wifi-mac.yang b/src/plugins/yang/openconfig/openconfig-wifi-mac.yang
new file mode 100644
index 0000000..3d51215
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-wifi-mac.yang
@@ -0,0 +1,1482 @@
+module openconfig-wifi-mac {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/wifi/mac";
+
+ // Assign this module a prefix to be used by other modules, when imported.
+ prefix "oc-wifi-mac";
+
+ import openconfig-yang-types { prefix oc-yang; }
+ // OC-specific types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-vlan-types { prefix oc-vlan-types; }
+ import openconfig-inet-types { prefix oc-inet; }
+ import openconfig-wifi-types { prefix oc-wifi-types; }
+ import openconfig-types { prefix oc-types; }
+
+ // Some required meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Model for managing MAC layer configuration of Radio interfaces.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2017-12-21" {
+ description
+ "Add mobility-domain and move/create bssid-state list for
+ counters.";
+ reference "0.2.0";
+ }
+
+ revision "2017-07-25" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ grouping ssid-common-config {
+ description
+ "Configuration items common to all logical SSIDs.";
+
+ leaf name {
+ type string;
+ description
+ "The name of the SSID.";
+ }
+
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "The desired operational state (up/down) of this SSID.";
+ }
+
+ leaf hidden {
+ type boolean;
+ default "false";
+ description
+ "Whether this SSID IE is hidden within Beacons.";
+ }
+
+ leaf vlan-id {
+ type oc-vlan-types:vlan-id;
+ description
+ "Optional VLAN tag used by the SSID. When unspecified, defaults
+ to untagged.";
+ }
+
+ leaf operating-frequency {
+ type identityref {
+ base oc-wifi-types:OPERATING_FREQUENCY;
+ }
+ default "oc-wifi-types:FREQ_2_5_GHZ";
+ description
+ "Operating frequency of this SSID. When none specified, the default is
+ dual-band.";
+ }
+
+ leaf-list basic-data-rates {
+ type identityref {
+ base oc-wifi-types:DATA_RATE;
+ }
+ description
+ "Basic data-rates for the SSID.";
+ }
+
+ leaf-list supported-data-rates {
+ type identityref {
+ base oc-wifi-types:DATA_RATE;
+ }
+ description
+ "Supported data-rates for the SSID.";
+ }
+ // MCS rates explicitly absent, as they are typically not pruned.
+
+ leaf broadcast-filter {
+ type boolean;
+ description
+ "Convert all downstream broadcast ARP to unicast
+ only if Station is associated to the AP. Drop packet
+ if Station is not associated to the AP. All other
+ broadcast, except DHCP, is dropped by the AP.
+
+ DHCP Offers/ACKs are converted to Unicast, over-the-air.";
+ }
+
+ leaf multicast-filter {
+ type boolean;
+ description
+ "Drop all downstream Multicast packets.";
+ }
+
+ leaf ipv6-ndp-filter {
+ type boolean;
+ description
+ "Neighbor Advertisements will be cached at the AP (or WLC)
+ and unicast in response to Neighbor Solicitations.
+
+ Router Advertisements, in response to a Router Solicitation
+ are converted to Unicast for over-the-air transmission.";
+ }
+
+ leaf ipv6-ndp-filter-timer {
+ type uint16;
+ units seconds;
+ description
+ "Time, in seconds, the ndp-filter will cache
+ Neighbor Advertisements (NA).";
+ }
+
+ leaf station-isolation {
+ type boolean;
+ description
+ "Block Station peer to peer communication.";
+ }
+
+ leaf opmode {
+ type enumeration {
+ enum OPEN {
+ description
+ "Open authentication.";
+ }
+ enum WPA2_PERSONAL {
+ description
+ "WPA2-Personal with PSK authentication.";
+ }
+ enum WPA2_ENTERPRISE {
+ description
+ "WPA2-Enterprise with 802.1X authentication.";
+ }
+ }
+ default "OPEN";
+ description
+ "The type of Layer2 authentication in use.";
+ }
+ // Note, legacy 802.11 auth methods (ie Shared Key) explicitly absent here.
+ // It should never be used.
+
+ leaf wpa2-psk {
+ when "../opmode = 'WPA2_PERSONAL'";
+ type string {
+ length "8..63";
+ }
+ description
+ "The passphrase used on this WPA2-Personal SSID.";
+ }
+
+ leaf server-group {
+ when "../opmode = 'WPA2_ENTERPRISE' or ../opmode = 'WPA2_PERSONAL'";
+ type string;
+ description
+ "Specifies the RADIUS server-group to be used,
+ as defined in the openconfig-aaa.yang model.
+
+ Including WPA2_PERSONAL as it can be accompained by MAB.";
+ }
+
+ leaf dva {
+ type boolean;
+ description
+ "Enable/disable Dynamic VLAN Assignment,
+ using 'Tunnel-Private-Group-Id' RADIUS attribute.";
+ }
+
+ leaf mobility-domain {
+ type string;
+ description
+ "Specify the mobility domain where PMK-R0 distribution will occur.
+ Specifically, which APs will recieve PMK-R0 if using 802.11r (FT).";
+ }
+
+ leaf dhcp-required {
+ type boolean;
+ description
+ "Allow a Station to access the network only if
+ a DHCP exchange has occurred.";
+ }
+
+ leaf qbss-load {
+ type boolean;
+ description
+ "Advertisement of the QBSS Load Information ELement.";
+ }
+
+ leaf advertise-apname {
+ type boolean;
+ description
+ "Advertise the AP hostname in Beacon and Probe Resp. frames.";
+ }
+
+ leaf csa {
+ type boolean;
+ default "true";
+ description
+ "Enable/Disable 802.11h channel-switch-announcement.";
+ }
+
+ leaf ptk-timeout {
+ type uint16;
+ units seconds;
+ description
+ "Time, in seconds, for the Pairwise Transient Key to be timed out.";
+ }
+
+ leaf gtk-timeout {
+ type uint16;
+ units seconds;
+ description
+ "TTL for the Group Temporal Key.";
+ }
+
+ leaf dot11k {
+ type boolean;
+ description
+ "802.11k neighbor-list enabled/disabled.";
+ }
+
+ leaf okc {
+ type boolean;
+ description
+ "Enable/disable Opportunistic Key Caching.";
+ }
+ }
+
+ grouping dot11v-config {
+ description
+ "802.11v configuration & state data.";
+
+ leaf dot11v-dms {
+ type boolean;
+ description
+ "802.11v Directed Multicast Service enabled/disabled.";
+ }
+
+ leaf dot11v-bssidle {
+ type boolean;
+ description
+ "802.11v BSS Max Idle enabled/disabled.";
+ }
+
+ leaf dot11v-bssidle-timeout {
+ type uint16;
+ units seconds;
+ description
+ "802.11v BSS Max Idle timeout.";
+ }
+
+ leaf dot11v-bsstransition {
+ type boolean;
+ description
+ "802.11v BSS Transition enabled/disabled.";
+ }
+ }
+
+ grouping dot11r-config {
+ description
+ "802.11r related configuration & state data.";
+
+ leaf dot11r {
+ type boolean;
+ description
+ "Enable/disable 802.11r FT.";
+ }
+
+ leaf dot11r-domainid {
+ type uint16;
+ description
+ "Mobility Domain ID.";
+ }
+
+ leaf dot11r-method {
+ type enumeration {
+ enum OVA {
+ description
+ "802.11r Over-the-AIR.";
+ }
+ enum ODS {
+ description
+ "802.11r Over-the-DS.";
+ }
+ }
+ default "OVA";
+ description
+ "The type of 802.11r FT in use.";
+ }
+
+ leaf dot11r-r1key-timeout {
+ type uint16;
+ units seconds;
+ description
+ "TTL for the Pairwise Master Key R1.";
+ }
+ // At present R1 Key distribution is left up to vendor. All APs in mgmnt
+ // subnet, all APs on WLC etc.
+ }
+
+ grouping dot1x-timers-config {
+ description
+ "Configurable 802.1X timers, per ESS.";
+
+ leaf max-auth-failures {
+ type uint8;
+ description
+ "Number of consecutive authentication failures,
+ via RADIUS Access-Reject, before Station
+ is blacklisted.";
+ }
+
+ leaf blacklist-time {
+ type uint16;
+ units seconds;
+ description
+ "Length of time, in seconds, a Station will be
+ blacklisted as a result of max-auth-failures.";
+ }
+ }
+
+ grouping wmm-config {
+ description
+ "WMM & QoS marking config, per BSS.";
+
+ leaf trust-dscp {
+ type boolean;
+ default "true";
+ description
+ "The AP should trust DSCP on 802.11 frames received
+ in this BSS.";
+ }
+
+ leaf-list wmm-vo-remark {
+ type uint8;
+ max-elements 8;
+ description
+ "Allowed DSCP markings for WMM AC_VO. Remark to lowest in this list
+ if DSCP marking falls outside of these allowed markings.
+
+ From 1 (min) to 8 (max) integers.";
+ }
+
+ leaf-list wmm-vi-remark {
+ type uint8;
+ max-elements 8;
+ description
+ "Allowed DSCP markings for WMM AC_VI. Remark to lowest in this list
+ if DSCP marking falls outside of these allowed markings.
+
+ From 1 (min) to 8 (max) integers.";
+ }
+
+ leaf-list wmm-be-remark {
+ type uint8;
+ max-elements 8;
+ description
+ "Allowed DSCP markings for WMM AC_BE. Remark to lowest in this list
+ if DSCP marking falls outside of these allowed markings.
+
+ From 1 (min) to 8 (max) integers.";
+ }
+
+ leaf-list wmm-bk-remark {
+ type uint8;
+ max-elements 8;
+ description
+ "Allowed DSCP markings for WMM AC_BK. Remark to lowest in this list
+ if DSCP marking falls outside of these allowed markings.
+
+ From 1 (min) to 8 (max) integers.";
+ }
+ }
+
+ grouping band-steering-config {
+ description
+ "Grouping for band-steering specific configuration.";
+
+ leaf band-steering {
+ type boolean;
+ description
+ "Enable/disable band-steering.";
+ }
+
+ leaf steering-rssi {
+ type int8;
+ description
+ "Minimum RSSI a dual-band Station's Probe Request
+ must be heard at on a 5GHz radio, in order for
+ band-steering to withhold 2.4GHz Probe Responses.";
+ }
+ }
+
+ grouping ssid-common-state {
+ description
+ "Grouping for defining ssid-specific operational state";
+
+ leaf bssid {
+ type oc-yang:mac-address;
+ description
+ "Represents the BSSID. Typically this is base-radio mac +/- in last
+ octet; though not strictly required.";
+ }
+
+ leaf bss-channel-utilization {
+ type oc-types:percentage;
+ description
+ "Total 802.11 channel utilization on this BSS. The total channel
+ utilization should include all time periods the AP spent actively
+ receiving and transmitting 802.11 frames on this BSS.";
+ }
+
+ leaf rx-bss-dot11-channel-utilization {
+ type oc-types:percentage;
+ description
+ "Rx channel utilization percent for this BSS.";
+ }
+
+ leaf tx-bss-dot11-channel-utilization {
+ type oc-types:percentage;
+ description
+ "Tx channel utilization percent for this BSS.";
+ }
+ }
+
+ grouping bss-common-state {
+ description
+ "Grouping for defining bss-specific operational state.";
+
+ leaf ess {
+ type leafref {
+ path "../../../../ssids/ssid/name";
+ }
+ description
+ "Name of the ESS this BSS is utilizing.";
+ }
+
+ leaf num-associated-clients {
+ type uint8;
+ description
+ "Number of associated STAs to this BSS.";
+ }
+ }
+
+ grouping bssid-counters-state {
+ description
+ "BSSID telemetry statistics.";
+
+ leaf bssid {
+ type oc-yang:mac-address;
+ description
+ "MAC of the BSS.";
+ }
+
+ container counters {
+ config false;
+ description
+ "BSS Counters.";
+
+ // Rx Counters
+ leaf rx-mgmt {
+ type oc-yang:counter64;
+ description
+ "Received 802.11 Management frames.";
+ }
+
+ leaf rx-control {
+ type oc-yang:counter64;
+ description
+ "Received 802.11 Control frames.";
+ }
+
+ container rx-data-dist {
+ description
+ "The distribution of Data frame sizes in bytes of successfully
+ recieved AMPDU, or MPDU for non-aggregated, frames.
+ The distribution should characterize frame sizes starting at 64 bytes
+ or less with the bin size doubling for each successive bin to a
+ maximum of 1MB or larger, as represented in the following table:
+
+ Lower Bound Upper Bound
+ 0 64
+ 65 128
+ 129 256
+ 257 512
+ 513 1024
+ 1025 2048
+ 2049 4096
+ 4097 8192
+ 8193 16384
+ 16385 32768
+ 32769 65536
+ 65537 131072
+ 131073 262144
+ 262145 524288
+ 524289 1048576";
+
+ leaf rx-0-64 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 0 to 64 Bytes.";
+ }
+
+ leaf rx-65-128 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 65 to 128 Bytes.";
+ }
+
+ leaf rx-129-256 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 129 to 256 Bytes.";
+ }
+
+ leaf rx-257-512 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 257 to 512 Bytes.";
+ }
+
+ leaf rx-513-1024 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 513 to 1024 Bytes.";
+ }
+
+ leaf rx-1025-2048 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 1025 to 2048 Bytes.";
+ }
+
+ leaf rx-2049-4096 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 2049 to 4096 Bytes.";
+ }
+
+ leaf rx-4097-8192 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 4097 to 8192 Bytes.";
+ }
+
+ leaf rx-8193-16384 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 8193 to 16384 Bytes.";
+ }
+
+ leaf rx-16385-32768 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 16385 to 32768 Bytes.";
+ }
+
+ leaf rx-32769-65536 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 32769 to 65536 Bytes.";
+ }
+
+ leaf rx-65537-131072 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU from 65537 to 131072 Bytes.";
+ }
+
+ leaf rx-131073-262144 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU from 131073 to 262144 Bytes.";
+ }
+
+ leaf rx-262145-524288 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU from 262145 to 524288 Bytes.";
+ }
+
+ leaf rx-524289-1048576 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU from 524289 to 1048576 Bytes.";
+ }
+ }
+
+ container rx-data-wmm {
+ description
+ "Received 802.11 Data frames, per WMM Access Category.";
+
+ leaf vi {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames marked as Access Category Video.";
+ }
+
+ leaf vo {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames marked as Access Category Voice.";
+ }
+
+ leaf be {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames marked as Access Category Best Effort.";
+ }
+
+ leaf bk {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames marked as Access Category Background.";
+ }
+ }
+
+ container rx-mcs {
+ description
+ "Received Data frames, per MCS Index. It is expected that vendors
+ bucketize 802.11n MCS frames in their matching 802.11ac buckets.
+
+ Example, 802.11n MCS 15 = 802.11ac MCS 7.
+ 802.11n MCS 20 = 802.11ac MCS 4.";
+
+ leaf mcs0 {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames at MCS 0.";
+ }
+
+ leaf mcs1 {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames at MCS 1.";
+ }
+
+ leaf mcs2 {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames at MCS 2.";
+ }
+
+ leaf mcs3 {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames at MCS 3.";
+ }
+
+ leaf mcs4 {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames at MCS 4.";
+ }
+
+ leaf mcs5 {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames at MCS 5.";
+ }
+
+ leaf mcs6 {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames at MCS 6.";
+ }
+
+ leaf mcs7 {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames at MCS 7.";
+ }
+
+ leaf mcs8 {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames at MCS 8.";
+ }
+
+ leaf mcs9 {
+ type oc-yang:counter64;
+ description
+ "Rx Data frames at MCS 9.";
+ }
+ }
+
+ leaf rx-retries {
+ type oc-yang:counter64;
+ description
+ "Total number of received frames with the Retry bit set, within this
+ BSS.";
+ }
+
+ leaf rx-retries-data {
+ type oc-yang:counter64;
+ description
+ "Number of received QoS Data frames with the Retry bit set";
+ }
+ leaf rx-retries-subframe {
+ type oc-yang:counter64;
+ description
+ "Aggregated MPDUs which had individual subframes that fail and require
+ retransmission.";
+ }
+
+ leaf rx-bytes-data {
+ type oc-yang:counter64;
+ description
+ "Bytes received from QoS Data frames";
+ }
+
+ // Tx Counters
+ leaf tx-mgmt {
+ type oc-yang:counter64;
+ description
+ "Transmitted 802.11 Management frames.";
+ }
+
+ leaf tx-control {
+ type oc-yang:counter64;
+ description
+ "Transmitted 802.11 Control frames.";
+ }
+
+ container tx-data-dist {
+ description
+ "The distribution of Data frame sizes in bytes of successfully transmitted
+ AMPDU, or MPDU for non-aggregated, frames.
+ The distribution should characterize frame sizes starting at 64 bytes
+ or less with the bin size doubling for each successive bin to a
+ maximum of 1MB or larger, as represented in the following table:
+
+ Lower Bound Upper Bound
+ 0 64
+ 65 128
+ 129 256
+ 257 512
+ 513 1024
+ 1025 2048
+ 2049 4096
+ 4097 8192
+ 8193 16384
+ 16385 32768
+ 32769 65536
+ 65537 131072
+ 131073 262144
+ 262145 524288
+ 524289 1048576";
+
+ leaf tx-0-64 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 0 to 64 Bytes.";
+ }
+
+ leaf tx-65-128 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 65 to 128 Bytes.";
+ }
+
+ leaf tx-129-256 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 129 to 256 Bytes.";
+ }
+
+ leaf tx-257-512 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 257 to 512 Bytes.";
+ }
+
+ leaf tx-513-1024 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 513 to 1024 Bytes.";
+ }
+
+ leaf tx-1025-2048 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 1025 to 2048 Bytes.";
+ }
+
+ leaf tx-2049-4096 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 2049 to 4096 Bytes.";
+ }
+
+ leaf tx-4097-8192 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 4097 to 8192 Bytes.";
+ }
+
+ leaf tx-8193-16384 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 8193 to 16384 Bytes.";
+ }
+
+ leaf tx-16385-32768 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 16385 to 32768 Bytes.";
+ }
+
+ leaf tx-32769-65536 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU or MPDUs from 32769 to 65536 Bytes.";
+ }
+
+ leaf tx-65537-131072 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU from 65537 to 131072 Bytes.";
+ }
+
+ leaf tx-131073-262144 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU from 131073 to 262144 Bytes.";
+ }
+
+ leaf tx-262145-524288 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU from 262145 to 524288 Bytes.";
+ }
+
+ leaf tx-524289-1048576 {
+ type oc-yang:counter64;
+ description
+ "Transmitted AMPDU from 524289 to 1048576 Bytes.";
+ }
+ }
+
+ container tx-data-wmm {
+ description
+ "Transmitted QoS Data frames, per WMM AC.";
+ leaf vi {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames marked as Access Category Video.";
+ }
+
+ leaf vo {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames marked as Access Category Voice.";
+ }
+
+ leaf bk {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames marked as Access Category Background.";
+ }
+
+ leaf be {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames marked as Access Category Best Effort.";
+ }
+ }
+
+ container tx-mcs {
+ description
+ "Transmitted Data frames, per MCS Index. It is expected that vendors
+ bucketize 802.11n MCS frames in their matching 802.11ac buckets.
+
+ Example, 802.11n MCS 15 = 802.11ac MCS 7.
+ 802.11n MCS 20 = 802.11ac MCS 4.";
+
+ leaf mcs0 {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames at MCS 0.";
+ }
+
+ leaf mcs1 {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames at MCS 1.";
+ }
+
+ leaf mcs2 {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames at MCS 2.";
+ }
+
+ leaf mcs3 {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames at MCS 3.";
+ }
+
+ leaf mcs4 {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames at MCS 4.";
+ }
+
+ leaf mcs5 {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames at MCS 5.";
+ }
+
+ leaf mcs6 {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames at MCS 6.";
+ }
+
+ leaf mcs7 {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames at MCS 7.";
+ }
+
+ leaf mcs8 {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames at MCS 8.";
+ }
+
+ leaf mcs9 {
+ type oc-yang:counter64;
+ description
+ "Tx Data frames at MCS 9.";
+ }
+ }
+
+ leaf tx-retries {
+ type oc-yang:counter64;
+ description
+ "Number of frames transmitted with the Retry bit set";
+ }
+
+ leaf tx-retries-data {
+ type oc-yang:counter64;
+ description
+ "Number of transmitted QoS Data frames with the Retry bit set";
+ }
+
+ leaf tx-retries-subframe {
+ type oc-yang:counter64;
+ description
+ "Aggregated MPDUs which had individual subframes that fail and require
+ retransmission.";
+ }
+
+ leaf tx-bytes-data {
+ type oc-yang:counter64;
+ description
+ "Bytes transmitted from QoS Data frames";
+ }
+ }
+ }
+
+ grouping clients-state {
+ description
+ "List of clients; followed by state data, per client.";
+
+ leaf mac {
+ type oc-yang:mac-address;
+ description
+ "MAC address of the client.";
+ }
+
+ container counters {
+ description
+ "Per-client counters.";
+
+ leaf tx-bytes {
+ type oc-yang:counter64;
+ description
+ "Tx Bytes to this client.";
+ }
+
+ leaf rx-bytes {
+ type oc-yang:counter64;
+ description
+ "Rx Bytes from this client.";
+ }
+
+ leaf rx-retries {
+ type oc-yang:counter64;
+ description
+ "Rx retried frames from this client.";
+ }
+
+ leaf tx-retries {
+ type oc-yang:counter64;
+ description
+ "Tx retried frames to this client.";
+ }
+ }
+ }
+
+ grouping client-connect-state {
+ description
+ "Grouping for connection state related data, per client.";
+
+ container state {
+ description
+ "Container for connection state related data, per client.";
+
+ leaf client-state {
+ type identityref {
+ base oc-wifi-types:CLIENT_STATE;
+ }
+ description
+ "Various states a Client STA may be in.";
+ }
+
+ leaf connection-time {
+ type uint16;
+ units seconds;
+ description
+ "Time, in seconds, since Client Association.";
+ }
+
+ leaf username {
+ type string;
+ description
+ "Username of Client; can be outer-identity (if PEAP),
+ CN of certificate (if EAP-TLS) etc.";
+ }
+
+ leaf hostname {
+ type string;
+ description
+ "Hostname of the client, as discovered via DHCP, mDNS
+ or otherwise.";
+ }
+
+ leaf ipv4-address {
+ type oc-inet:ipv4-address;
+ description
+ "IPv4 address of the client.";
+ }
+
+ leaf ipv6-address {
+ type oc-inet:ipv6-address;
+ description
+ "IPv6 address of the client.";
+ }
+
+ leaf operating-system {
+ type string;
+ description
+ "Optional/if known; the OS of the client.";
+ }
+ }
+ }
+
+ grouping dot11k-neighbors-state {
+ description
+ "Grouping for Client beacon reports. Requires 802.11k enabled.
+ See Sec. 5.2.7.1 of 802.11k-2008 Standard.";
+ container state {
+ description
+ "Container for Client beacon reports. Requires 802.11k enabled.
+ See Sec. 5.2.7.1 of 802.11k-2008 Standard.";
+
+ leaf neighbor-bssid {
+ type oc-yang:mac-address;
+ description
+ "The BSSID of this neighbor.";
+ }
+
+ leaf neighbor-channel {
+ type uint8;
+ description
+ "The channel of this neighbor.";
+ }
+
+ leaf neighbor-rssi {
+ type int8;
+ description
+ "The RSSI of this neighbor in dBm, expressed as a negative number.";
+ }
+
+ leaf neighbor-antenna {
+ type uint8;
+ description
+ "Antenna details for this neighbor.";
+ }
+
+ leaf channel-load-report {
+ type uint8;
+ description
+ "Channel load, as reported by Client to AP
+ normalized to 255. See Sec. 10.11.9.3 of 802.11ac-2013 Spec.";
+ }
+ }
+ }
+
+ grouping client-capabilities-state {
+ description
+ "Groupig for Client capabilities, as reported by Assoc. Req. or
+ Probe Req. frames. Capability is supported, if present.";
+ container state {
+ description
+ "Container for Client capabilities, as reported by Assoc. Req. or
+ Probe Req. frames. Capability is supported, if present.";
+ leaf-list client-capabilities {
+ type identityref {
+ base oc-wifi-types:CLIENT_CAPABILITIES;
+ }
+ description
+ "Features supported by client that are Optional
+ within the 802.11 specifications.";
+ }
+
+ leaf-list channel-support {
+ type uint8;
+ description
+ "List of supported channels.";
+ }
+ }
+ }
+
+ grouping client-rf-state {
+ description
+ "Grouping for RF related client state data.";
+ container state {
+ description
+ "Container for RF related client state data.";
+
+ leaf rssi {
+ type int8;
+ description
+ "The RSSI of this client in dBm. Expressed as negative number";
+ }
+
+ leaf snr {
+ type uint8;
+ description
+ "The SNR of AP to Client, in dB.";
+ }
+
+ leaf ss {
+ type uint8;
+ description
+ "Number of Spatial Streams supported by the client.";
+ }
+
+ leaf phy-rate {
+ type uint16;
+ description
+ "Last used PHY rate of connected client.";
+ }
+
+ leaf connection-mode {
+ type enumeration {
+ enum A {
+ description
+ "Client connected using 802.11a.";
+ }
+ enum B {
+ description
+ "Client connected using 802.11b.";
+ }
+ enum G {
+ description
+ "Client connected using 802.11g.";
+ }
+ enum N {
+ description
+ "Client connected using 802.11n.";
+ }
+ enum AC {
+ description
+ "Client connected using 802.11ac.";
+ }
+ }
+ description
+ "802.11 protocol used for the client's connection.";
+ }
+
+ leaf frequency {
+ type uint8;
+ description
+ "Frequency the client is utilizing. Typically, 2.4 or 5[GHz].";
+ }
+ }
+ }
+
+ grouping clients-top {
+ description
+ "Top-level grouping for clients operational state data.";
+
+ container clients {
+ description
+ "Top-level container for clients operational state data.";
+ list client {
+ key "mac";
+ config false;
+ description
+ "List of clients per BSS.";
+ leaf mac {
+ type leafref {
+ path "../state/mac";
+ }
+ config false;
+ description
+ "The clients WiFi MAC address.";
+ }
+
+ container state {
+ config false;
+ description
+ "Client state data.";
+ uses clients-state;
+ }
+
+ container client-rf {
+ config false;
+ description
+ "RF radio-data per non-AP STA.";
+
+ uses client-rf-state;
+ }
+
+ container client-capabilities {
+ config false;
+ description
+ "Capabilites as advertised by the Client.";
+
+ uses client-capabilities-state;
+ }
+
+ container dot11k-neighbors {
+ config false;
+ description
+ "80211.k nieghbor information given from the Client to
+ the infrastructure.";
+
+ uses dot11k-neighbors-state;
+ }
+
+ container client-connection {
+ config false;
+ description
+ "Connection-state and meta-data associated with the Client.";
+
+ uses client-connect-state;
+ }
+ }
+ }
+ }
+
+ grouping wmm-top {
+ description
+ "Top-level grouping for WMM configuration and operational
+ state data.";
+
+ container wmm {
+ description
+ "Top-level container for WMM configuration and
+ state container.";
+ container config {
+ description
+ "Container for WMM configuration elements.";
+ uses wmm-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Container for WMM state elements.";
+ uses wmm-config;
+ }
+ }
+ }
+
+ grouping dot11r-top {
+ description
+ "Top-level grouping for 802.11r configuration and
+ operational state data.";
+
+ container dot11r {
+ description
+ "Top-level container for 802.11r configuration and
+ state container.";
+ container config {
+ description
+ "Container for 802.11r configuration elements.";
+ uses dot11r-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Container for 802.11r state elements.";
+ uses dot11r-config;
+ }
+ }
+ }
+
+ grouping dot11v-top {
+ description
+ "Top-level grouping for 802.11v configuration and
+ operational state data.";
+
+ container dot11v {
+ description
+ "Top-level container for 802.11v configuration and
+ operational state data.";
+ container config {
+ description
+ "Container for 802.11v configuration elements.";
+ uses dot11v-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Container for 802.11r state elements.";
+ uses dot11v-config;
+ }
+ }
+ }
+
+ grouping dot1x-timers-top {
+ description
+ "Top-level grouping for dot1x configuration and
+ operational state data.";
+
+ container dot1x-timers {
+ description
+ "Top-level container for dot1x configuration
+ and operational state data.";
+ container config {
+ description
+ "Container for dot1x configuration elements.";
+ uses dot1x-timers-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Container for dot1x state elements.";
+ uses dot1x-timers-config;
+ }
+ }
+ }
+
+ grouping band-steering-top {
+ description
+ "Top-level grouping for band-steering configuration
+ and operational state data.";
+
+ container band-steering {
+ description
+ "Top-level container for band-steering configuration
+ and operational state data.";
+ container config {
+ description
+ "Container for band-steering configuration elements.";
+ uses band-steering-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Container for band-steering state elements.";
+ uses band-steering-config;
+ }
+ }
+ }
+
+ grouping bssid-counters-top {
+ description
+ "Top-level grouping for BSSID operational state data.";
+
+ container bssids {
+ description
+ "Top-level container for BSSID operational state data.";
+ list bssid {
+ key "bssid";
+ config false;
+ description
+ "List of BSSIDs.";
+ leaf bssid {
+ type leafref {
+ path "../state/bssid";
+ }
+ config false;
+ description
+ "The BSSID MAC address.";
+ }
+
+ container state {
+ config false;
+ description
+ "BSSID state data.";
+
+ uses bss-common-state;
+ uses bssid-counters-state;
+ }
+ }
+ }
+ }
+
+ grouping ssid-top {
+ description
+ "Top-level grouping for ssid configuration and operational state data.";
+
+ container ssids {
+ description
+ "Top level container for ssids, including configuration
+ and state data.";
+
+ list ssid {
+ key "name";
+ description
+ "The list of named ssids on the APs.";
+
+ leaf name {
+ type leafref {
+ path "../config/name";
+ }
+ description
+ "References the configured name of the ssid";
+ }
+
+ container config {
+ description
+ "Configurable items at the global, ssid level";
+
+ uses ssid-common-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data at the ssid level";
+
+ uses ssid-common-config;
+ uses ssid-common-state;
+ }
+ uses wmm-top;
+ uses dot11r-top;
+ uses dot11v-top;
+ uses clients-top;
+ uses dot1x-timers-top;
+ uses band-steering-top;
+ }
+ }
+ }
+ uses ssid-top;
+ uses bssid-counters-top;
+}
diff --git a/src/plugins/yang/openconfig/openconfig-wifi-phy.yang b/src/plugins/yang/openconfig/openconfig-wifi-phy.yang
new file mode 100644
index 0000000..7c4453c
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-wifi-phy.yang
@@ -0,0 +1,393 @@
+module openconfig-wifi-phy {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/wifi/phy";
+
+ // Assign this module a prefix to be used by other modules, when imported.
+ prefix "oc-wifi-phy";
+
+ // Imports
+ import openconfig-yang-types { prefix oc-yang; }
+ // OC-specific types
+ import openconfig-extensions { prefix oc-ext; }
+ import openconfig-types { prefix oc-types; }
+ import openconfig-wifi-types { prefix oc-wifi-types; }
+
+ // Some required meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "Model for managing PHY layer configuration of Radio interfaces.";
+
+ oc-ext:openconfig-version "0.2.0";
+
+ revision "2017-12-21" {
+ description
+ "Add last-seen to neighbor-table.";
+ reference "0.2.0";
+ }
+
+ revision "2017-11-06" {
+ description
+ "Add SSID to neighbor-table.";
+ reference "0.1.1";
+ }
+
+ revision "2017-07-25" {
+ description
+ "Initial revision.";
+ reference "0.1.0";
+ }
+
+ // Grouping statements
+ grouping radio-common-config {
+ description
+ "Configuration items common to all Radio interfaces, independent
+ of frequency";
+
+ leaf id {
+ type uint8;
+ description
+ "Unique ID of the radio.";
+ }
+
+ leaf operating-frequency {
+ type identityref {
+ base oc-wifi-types:OPERATING_FREQUENCY;
+ }
+ description
+ "Operating frequency of this radio.";
+ }
+
+ leaf enabled {
+ type boolean;
+ default "true";
+ description
+ "The desired operational state (up/down) of this radio interface.";
+ }
+
+ leaf transmit-power {
+ type uint8;
+ units dBm;
+ default 9;
+ description
+ "Transmit power of the radio, in dBm.";
+ }
+
+ leaf channel {
+ type uint8 {
+ range "1..165";
+ }
+ description
+ "Operating channel of this radio. If using channel-bonding this
+ will represent the Primary 20MHz channel of the 40,80,160MHz channel.";
+ }
+
+ leaf channel-width {
+ type uint8;
+ units MHz;
+ default 20;
+ description
+ "Operating channel-width of this radio.";
+ }
+
+ leaf dca {
+ type boolean;
+ default "true";
+ description
+ "Utilize Dynamic Channel Assignment on this Radio.";
+ }
+
+ leaf-list allowed-channels {
+ type oc-wifi-types:channels-type;
+ description
+ "Allowed channel list for this Radio to utilize.";
+ }
+
+ leaf dtp {
+ type boolean;
+ default "true";
+ description
+ "Utilize dynamic transmit-power on this Radio.";
+ }
+
+ leaf dtp-min {
+ when "../dtp = 'true'";
+ type uint8;
+ default '3';
+ description
+ "Minimum allowed transmit-power on this radio, if utilizing dtp.
+ Expressed in dBm.";
+ }
+
+ leaf dtp-max {
+ when "../dtp = 'true'";
+ type uint8;
+ default '15';
+ description
+ "Maximum allowed transmit-power on this radio, if utilizing dtp.
+ Expressed in dBm.";
+ }
+
+ leaf antenna-gain {
+ type int8;
+ description
+ "Antenna gain applied to this Radio; typically used when
+ external antennae connected.";
+ }
+
+ leaf scanning {
+ type boolean;
+ default "true";
+ description
+ "Whether the radio will perform off-channel scanning, to collect
+ neighboring RF information.";
+ }
+
+ leaf scanning-interval {
+ type uint8;
+ units seconds;
+ description
+ "How often, in seconds, the radio will go off-channel to perform
+ scanning.";
+ }
+
+ leaf scanning-dwell-time {
+ type uint16;
+ units milliseconds;
+ description
+ "Amount of time, in milliseconds, the radio will spend on a
+ channel during scanning-interval. If a Monitor-mode Radio, it will
+ cycle through scanning-allowed-channels spending this amount of time
+ on each.";
+ }
+
+ leaf scanning-defer-clients {
+ type uint8;
+ description
+ "Do not perform scanning if this amount of Stations are Associated
+ to the Radio.";
+ }
+
+ leaf scanning-defer-traffic {
+ type boolean;
+ description
+ "Do not perform scanning if any traffic received from an active Station
+ in the past 100ms marked as AC_VO or AC_VI.";
+ }
+ }
+
+ grouping radio-common-state {
+ description
+ "Grouping for defining radio-specific operational state";
+
+ leaf base-radio-mac {
+ type oc-yang:mac-address;
+ description
+ "Represents the 'burned-in' base-radio MAC
+ address for the a Radio interface.";
+ }
+
+ leaf dfs-hit-time {
+ type oc-types:timeticks64;
+ description
+ "Reports the time of the last DFS hit. The value is the timestamp
+ in seconds relative to the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+ }
+
+ leaf channel-change-reason {
+ type identityref {
+ base oc-wifi-types:CHANGE_REASON_TYPE;
+ }
+ description
+ "When an Access Point changes channels, this will
+ provide the reason that led to the change.";
+ }
+
+ leaf total-channel-utilization {
+ type oc-types:percentage;
+ description
+ "Total 802.11 and non-802.11 channel utilization on this Radio. The
+ total channel utilization should include all time periods the AP
+ spent actively receiving and transmitting 802.11 frames, and also
+ include all time spent with clear channel assessment (CCA) in a
+ busy state";
+ }
+
+ leaf rx-dot11-channel-utilization {
+ type oc-types:percentage;
+ description
+ "Received channel-utilization due to 802.11 frames";
+ }
+
+ leaf rx-noise-channel-utilization {
+ type oc-types:percentage;
+ description
+ "Received channel-utilization percentage due to Noise.";
+ }
+
+ leaf tx-dot11-channel-utilization {
+ type oc-types:percentage;
+ description
+ "Transmit channel-utilization percentage.";
+ }
+ }
+
+ grouping radio-counters-state {
+ description
+ "Radio telemetry statistics.";
+ container counters {
+ description
+ "A collection of radio-related statistics objects.";
+
+ // Rx Counters
+ leaf failed-fcs-frames {
+ type oc-yang:counter64;
+ description
+ "Number of frames that failed the FCS";
+ }
+
+ // Tx Counters
+ leaf noise-floor {
+ type int8;
+ description
+ "Noise Floor, as measured by this radio.";
+ }
+ }
+ }
+
+ // neighbor BSSID | SSID | RSSI | Channel | Center Channel | Last-seen
+ grouping neighbor-list-state {
+ description
+ "Operational state data relating to neighboring
+ BSSIDs and their received signal strength.";
+ leaf bssid {
+ type oc-yang:mac-address;
+ description
+ "Neighboring BSSID.";
+ }
+
+ leaf ssid {
+ type string;
+ description
+ "The SSID of this neighboring BSSID.";
+ }
+
+ leaf rssi {
+ type int8;
+ description
+ "The RSSI of this neighboring BSSID.";
+ }
+
+ leaf channel {
+ type uint16;
+ description
+ "The channel of this neighboring BSSID. This is to utilize 802.11ac
+ nomenclature. For example, 40MHz channel 36-40 represented as
+ channel 38. primary-channel used to identify the primary
+ 20MHz channel of the neighbor.";
+ }
+
+ leaf primary-channel {
+ type uint16;
+ description
+ "The primary 20MHz channel, if the neighbor is operating on bonded
+ channel.";
+ }
+
+ leaf last-seen {
+ type oc-types:timeticks64;
+ description
+ "Reports the time this reading was taken, indicating when this neighbor
+ was last seen. If a cache is used, it MUST be updated instantly when a
+ neighbor BSS changes channels, or a new BSS is seen. The value is the
+ timestamp in seconds relative to the Unix Epoch
+ (Jan 1, 1970 00:00:00 UTC).";
+ }
+ }
+
+ grouping neighbor-bssid-top {
+ description
+ "Top-level grouping for neighbor table
+ operational state data.";
+
+ container neighbors {
+ description
+ "Top-level container for RF neighbors.";
+ list neighbor {
+ key "bssid";
+ config false;
+ description
+ "The mac address, or BSSID, of a neighbor, and
+ their corresponding RSSI.";
+
+ leaf bssid {
+ type leafref {
+ path "../state/bssid";
+ }
+ config false;
+ description "Reference to neighbor bssid.";
+ }
+
+ container state {
+ config false;
+ description
+ "State container for RF neighbors.";
+ uses neighbor-list-state;
+ }
+ }
+ }
+ }
+
+ grouping radio-top {
+ description
+ "Top-level grouping for radio configuration and
+ operational state data";
+
+ container radios {
+ description
+ "Top level container for radios, including configuration
+ and state data.";
+
+ list radio {
+ key "id";
+ description
+ "The list of radios on the device.";
+
+ leaf id {
+ type leafref {
+ path "../config/id";
+ }
+ description
+ "References the configured id of the radio";
+ }
+
+ container config {
+ description
+ "Configurable items at the global, radio interface
+ level";
+
+ uses radio-common-config;
+ }
+
+ container state {
+ config false;
+ description
+ "Operational state data at the global radio level";
+
+ uses radio-common-config;
+ uses radio-common-state;
+ uses radio-counters-state;
+ }
+ uses neighbor-bssid-top;
+ }
+ }
+ }
+ uses radio-top;
+}
diff --git a/src/plugins/yang/openconfig/openconfig-wifi-types.yang b/src/plugins/yang/openconfig/openconfig-wifi-types.yang
new file mode 100644
index 0000000..01bf89c
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-wifi-types.yang
@@ -0,0 +1,295 @@
+module openconfig-wifi-types {
+
+ yang-version "1";
+
+ // namespace
+ namespace "http://openconfig.net/yang/wifi/types";
+
+ // Assign this module a prefix to be used by other modules, when imported.
+ prefix "oc-wifi-types";
+
+ import openconfig-extensions { prefix oc-ext; }
+
+ // Some required meta
+ organization "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module contains a set of WiFi-specific type definitions
+ that are used in the openconfig-wifi modules. It can be
+ imported by any module to make use of these types.";
+
+ oc-ext:openconfig-version "0.1.0";
+
+ revision "2017-07-25" {
+ description
+ "Initial revision";
+ reference "0.1.0";
+ }
+
+ //typdef statements
+ typedef channels-type {
+ type uint8 {
+ range "1..14 | 36 | 40 | 44| 48 | 52 | 56 | 60 | 64 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | 128 | 132 | 136 | 140 | 144 | 149 | 153 | 157 | 161 | 165";
+ }
+ description
+ "Type to specify all the WiFi channels available for use. This is
+ a superset of what may be allowed by any one particular regulatory
+ domain.";
+ }
+
+ // identity statements
+ identity CLIENT_STATE {
+ description
+ "Base type to specify the current state of a Client.";
+ }
+
+ identity ASSOCIATED {
+ base CLIENT_STATE;
+ description
+ "Client has finished 802.11 Association phase. This implies 'Open' system,
+ or 802.11 Authentication complete.";
+ }
+
+ identity L2AUTH_REQD {
+ base CLIENT_STATE;
+ description
+ "Client has Assocated, but not L2 Authenticated (e.g. 802.1X)";
+ }
+
+ identity L3AUTH_REQD {
+ base CLIENT_STATE;
+ description
+ "Client has Assocated, but not L3 Authenticated (e.g. Captive Portal)";
+ }
+
+ identity DHCP_REQD {
+ base CLIENT_STATE;
+ description
+ "Client has Associated & Authenticated, but has not obtained IP address.";
+ }
+
+ identity AUTHENTICATED {
+ base CLIENT_STATE;
+ description
+ "Client has fully Authenticated & permitted to access network resources.";
+ }
+
+ identity L2AUTH_FAILURE_REJECT {
+ base CLIENT_STATE;
+ description
+ "L2 failure, due to RADIUS Access-Reject.";
+ }
+
+ identity L2AUTH_FAILURE_TIMEOUT {
+ base CLIENT_STATE;
+ description
+ "L2 failure, due to RADIUS timeout.";
+ }
+
+ identity L3AUTH_FAILURE {
+ base CLIENT_STATE;
+ description
+ "L3 failure. Could be incorrect CP credentials or higher layer
+ Captive Portal issues.";
+ }
+
+ identity DHCP_FAILURE {
+ base CLIENT_STATE;
+ description
+ "Client has Associated & Authenticated but has failed to recieve an IP
+ address, utilizing DHCP.";
+ }
+
+ identity POWERSAVE {
+ base CLIENT_STATE;
+ description
+ "AP has recieved a PS frame, indicating the client is currently in a
+ powersave state.";
+ }
+
+ identity BLACKLISTED {
+ base CLIENT_STATE;
+ description
+ "This client has been blacklisted, through either L2 (MAC) or higher-level
+ (signature) mechanisms.";
+ }
+
+ identity AP_STATE {
+ description "The Up/Down state of an AP.";
+ }
+
+ identity UP {
+ base AP_STATE;
+ description
+ "The AP is in the up state.";
+ }
+
+ identity DOWN {
+ base AP_STATE;
+ description
+ "The AP is in the down state.";
+ }
+
+ identity UPGRADING {
+ base AP_STATE;
+ description
+ "The AP is in the Downgrading firmware state.";
+ }
+
+ // Possible basic-rates are: 1, 2, 5.5, 6, 9, 11, 12, 18, 24, 36, 48, 54 //
+ identity DATA_RATE {
+ description "base type to specify available Data-rates.";
+ }
+
+ identity RATE_1MB {
+ base DATA_RATE;
+ description "1 Mbps DSSS PHY";
+ }
+
+ identity RATE_2MB {
+ base DATA_RATE;
+ description "2 Mbps DSSS PHY";
+ }
+
+ identity RATE_5.5MB {
+ base DATA_RATE;
+ description "5.5 Mbps DSSS PHY";
+ }
+
+ identity RATE_6MB {
+ base DATA_RATE;
+ description "6 Mbps OFDM PHY";
+ }
+
+ identity RATE_9MB {
+ base DATA_RATE;
+ description "9 Mbps OFDM PHY";
+ }
+
+ identity RATE_11MB {
+ base DATA_RATE;
+ description "11 Mbps DSSS PHY";
+ }
+
+ identity RATE_12MB {
+ base DATA_RATE;
+ description "12 Mbps OFDM PHY";
+ }
+
+ identity RATE_18MB {
+ base DATA_RATE;
+ description "18 Mbps OFDM PHY";
+ }
+
+ identity RATE_24MB {
+ base DATA_RATE;
+ description "24 Mbps OFDM PHY";
+ }
+
+ identity RATE_36MB {
+ base DATA_RATE;
+ description "36 Mbps OFDM PHY";
+ }
+
+ identity RATE_48MB {
+ base DATA_RATE;
+ description "48 Mbps OFDM PHY";
+ }
+
+ identity RATE_54MB {
+ base DATA_RATE;
+ description "54 Mbps OFDM PHY";
+ }
+
+ identity OPERATING_FREQUENCY {
+ description "Operating frequency of a Radio or SSID.";
+ }
+
+ identity FREQ_2GHZ {
+ base OPERATING_FREQUENCY;
+ description "The Radio or SSID will operate at 2.4GHz only.";
+ }
+
+ identity FREQ_5GHZ {
+ base OPERATING_FREQUENCY;
+ description "The Radio or SSID will operate at 5GHz only.";
+ }
+
+ identity FREQ_2_5_GHZ {
+ base OPERATING_FREQUENCY;
+ description
+ "The Radio or SSID will be dual-band; operating in
+ both 2.4 & 5GHz frequencies.
+
+ Dual-band Radio typically refers to a Monitor-mode radio, hopping
+ between frequencies, dwelling for a configurable amount of time on
+ each frequency.";
+ }
+
+ identity CLIENT_CAPABILITIES {
+ description
+ "Client capabilities, as reported by Assoc. Req. or
+ Probe Req. frames.";
+ }
+
+ identity MU_BEAMFORMER {
+ base CLIENT_CAPABILITIES;
+ description "Whether this STA can MU-MIMO Beamform.";
+ }
+
+ identity MU_BEAMFORMEE {
+ base CLIENT_CAPABILITIES;
+ description "Whether this STA can Rx MU-MIMO Beamformed frames.";
+ }
+
+ identity DOT_11R {
+ base CLIENT_CAPABILITIES;
+ description
+ "Whether this STA supports 802.11r. Note, must be
+ enabled on BSS for this to be accurate.";
+ }
+
+ identity DOT_11V {
+ base CLIENT_CAPABILITIES;
+ description
+ "Whether this STA supports 802.11v BSS Transition. Note, must
+ be enabled on BSS for this to be accurate; unless Probe Req.
+ are observied in addition to Assoc. Req.";
+ }
+
+ identity CHANGE_REASON_TYPE {
+ description
+ "Base type to specify the reason an Access Point
+ has changed channels.";
+ }
+ identity DFS {
+ base CHANGE_REASON_TYPE;
+ description
+ "DFS hit occured.";
+ }
+
+ identity NOISE {
+ base CHANGE_REASON_TYPE;
+ description
+ "Excessive amounts of non-802.11 Noise occured.";
+ }
+
+ identity ERRORS {
+ base CHANGE_REASON_TYPE;
+ description
+ "Excessive reception of frames which
+ failed the FCS occured.";
+ }
+
+ identity BETTER-CHANNEL {
+ base CHANGE_REASON_TYPE;
+ description
+ "A less utilized channel exists. eg CCI avoidance
+ led to this channel-change.";
+ }
+ // Extend channel-change reasons here, when applicable.
+} \ No newline at end of file
diff --git a/src/plugins/yang/openconfig/openconfig-yang-types.yang b/src/plugins/yang/openconfig/openconfig-yang-types.yang
new file mode 100644
index 0000000..b3b2c16
--- /dev/null
+++ b/src/plugins/yang/openconfig/openconfig-yang-types.yang
@@ -0,0 +1,180 @@
+module openconfig-yang-types {
+
+ yang-version "1";
+ namespace "http://openconfig.net/yang/types/yang";
+ prefix "oc-yang";
+
+ import openconfig-extensions { prefix "oc-ext"; }
+
+ organization
+ "OpenConfig working group";
+
+ contact
+ "OpenConfig working group
+ www.openconfig.net";
+
+ description
+ "This module contains a set of extension types to the
+ YANG builtin types that are used across multiple
+ OpenConfig models.
+
+ Portions of this code were derived from IETF RFC 6021.
+ 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 "0.2.0";
+
+ revision 2018-04-24 {
+ description
+ "Add date typedef";
+ reference "0.2.0";
+ }
+
+ revision 2017-07-30 {
+ description
+ "Fixed unprintable character";
+ reference "0.1.2";
+ }
+
+ revision 2017-04-03 {
+ description
+ "Update copyright notice.";
+ reference "0.1.1";
+ }
+
+ revision 2017-01-26 {
+ description
+ "Initial module for inet types";
+ reference "0.1.0";
+ }
+
+ typedef dotted-quad {
+ type string {
+ pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|' +
+ '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]' +
+ '[0-9]|25[0-5])$';
+ }
+ description
+ "An unsigned 32-bit integer expressed as a dotted quad. The
+ format is four octets written as decimal numbers separated
+ with a period character.";
+ }
+
+ typedef hex-string {
+ type string {
+ pattern '^[0-9a-fA-F]*$';
+ }
+ description
+ "A string consisting of a hexadecimal characters.";
+ }
+
+ typedef counter32 {
+ type uint32;
+ description
+
+ "A 32-bit counter. A counter value is a monotonically increasing
+ value which is used to express a count of a number of
+ occurrences of a particular event or entity. When the counter
+ reaches its maximum value, in this case 2^32-1, it wraps to 0.
+
+ Discontinuities in the counter are generally triggered only when
+ the counter is reset to zero.";
+ }
+
+ typedef counter64 {
+ type uint64;
+ description
+
+ "A 64-bit counter. A counter value is a monotonically increasing
+ value which is used to express a count of a number of
+ occurrences of a particular event or entity. When a counter64
+ reaches its maximum value, 2^64-1, it loops to zero.
+ Discontinuities in a counter are generally triggered only when
+ the counter is reset to zero, through operator or system
+ intervention.";
+ }
+
+ typedef date-and-time {
+ type string {
+ pattern
+ '^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}' +
+ '(\.[0-9]+)?Z[+-][0-9]{2}:[0-9]{2}$';
+ }
+ description
+ "A date and time, expressed in the format described in RFC3339.
+ That is to say:
+
+ YYYY-MM-DDTHH:MM:SSZ+-hh:mm
+
+ where YYYY is the year, MM is the month expressed as a two-digit
+ month (zero padding if required), DD is the day of the month,
+ expressed as a two digit value. T is the literal character 'T',
+ HH is the hour of the day expressed as a two digit number, using
+ the 24-hour clock, MM is the minute of the hour expressed as a
+ two digit number. Z is the literal character 'Z', followed by a
+ timezone offset expressed in hours (hh) and minutes (mm), both
+ expressed as two digit numbers. The time offset is specified as
+ a positive or negative offset to UTC using the '+' or '-'
+ character preceding the offset.
+
+ Optionally, fractional seconds can be expressed after the minute
+ of the hour as a decimal number of unspecified precision
+ reflecting fractions of a second.";
+ reference
+ "RFC3339 - Date and Time on the Internet: Timestamps";
+ }
+
+ typedef date {
+ type string {
+ pattern '^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$';
+ }
+ description
+ "A full UTC date, expressed in the format described in RFC3339.
+ That is to say:
+
+ YYYY-MM-DD
+
+ where YYYY is the year, MM is the month expressed as a two-digit
+ month (zero padding if required), DD is the day of the month,
+ expressed as a two digit value.";
+
+ reference
+ "RFC3339 - Date and Time on the Internet: full-date";
+ }
+
+ typedef gauge64 {
+ type uint64;
+ description
+ "A gauge value may increase or decrease - and reflects a value
+ at a particular point in time. If the value of the variable
+ being modeled using the gauge exceeds its maximum - 2^64-1 in
+ this case - the gauge is set to its maximum value.";
+ }
+
+ typedef phys-address {
+ type string {
+ pattern '^([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?$';
+ }
+ description
+ "A physical layer address, expressed as a series of pairs of
+ hexadecimal digits.";
+ }
+
+ typedef mac-address {
+ type string {
+ pattern '^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}$';
+ }
+ description
+ "An IEEE 802 MAC address";
+ }
+}