ietf-routing

This YANG module defines essential components for the management of a routing subsystem. The model fully conforms to the Networ...

  • Version: 2018-03-13

    ietf-routing@2018-03-13


    
      module ietf-routing {
    
        yang-version 1.1;
    
        namespace
          "urn:ietf:params:xml:ns:yang:ietf-routing";
    
        prefix rt;
    
        import ietf-yang-types {
          prefix yang;
        }
        import ietf-interfaces {
          prefix if;
          description
            "An 'ietf-interfaces' module version that is compatible with
    the Network Management Datastore Architecture (NMDA)
    is required.";
        }
    
        organization
          "IETF NETMOD (Network Modeling) Working Group";
    
        contact
          "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
    WG List:  <mailto:rtgwg@ietf.org>
    
    Editor:   Ladislav Lhotka
    	  <mailto:lhotka@nic.cz>
    	  Acee Lindem
    	  <mailto:acee@cisco.com>
    	  Yingzhen Qu
    	  <mailto:yingzhen.qu@huawei.com>";
    
        description
          "This YANG module defines essential components for the management
    of a routing subsystem.  The model fully conforms to the Network
    Management Datastore Architecture (NMDA).
    
    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 8349; see
    the RFC itself for full legal notices.";
    
        revision "2018-03-13" {
          description
            "Network Management Datastore Architecture (NMDA) revision.";
          reference
            "RFC 8349: A YANG Data Model for Routing Management
            	  (NMDA Version)";
    
        }
    
        revision "2016-11-04" {
          description "Initial revision.";
          reference
            "RFC 8022: A YANG Data Model for Routing Management";
    
        }
    
    
        feature multiple-ribs {
          description
            "This feature indicates that the server supports
    user-defined RIBs.
    
    Servers that do not advertise this feature SHOULD provide
    exactly one system-controlled RIB per supported address family
    and also make it the default RIB.  This RIB then appears as an
    entry in the list '/routing/ribs/rib'.";
        }
    
        feature router-id {
          description
            "This feature indicates that the server supports an explicit
    32-bit router ID that is used by some routing protocols.
    
    Servers that do not advertise this feature set a router ID
    algorithmically, usually to one of the configured IPv4
    addresses.  However, this algorithm is implementation
    specific.";
        }
    
        identity address-family {
          description
            "Base identity from which identities describing address
    families are derived.";
        }
    
        identity ipv4 {
          base address-family;
          description
            "This identity represents an IPv4 address family.";
        }
    
        identity ipv6 {
          base address-family;
          description
            "This identity represents an IPv6 address family.";
        }
    
        identity control-plane-protocol {
          description
            "Base identity from which control-plane protocol identities are
    derived.";
        }
    
        identity routing-protocol {
          base control-plane-protocol;
          description
            "Identity from which Layer 3 routing protocol identities are
    derived.";
        }
    
        identity direct {
          base routing-protocol;
          description
            "Routing pseudo-protocol that provides routes to directly
    connected networks.";
        }
    
        identity static {
          base routing-protocol;
          description
            "'Static' routing pseudo-protocol.";
        }
    
        typedef route-preference {
          type uint32;
          description
            "This type is used for route preferences.";
        }
    
        container routing {
          description
            "Configuration parameters for the routing subsystem.";
          leaf router-id {
            type yang:dotted-quad;
            description
              "A 32-bit number in the form of a dotted quad that is used by
    some routing protocols identifying a router.";
            reference
              "RFC 2328: OSPF Version 2";
    
          }
    
          container interfaces {
            config false;
            description
              "Network-layer interfaces used for routing.";
            leaf-list interface {
              type if:interface-ref;
              description
                "Each entry is a reference to the name of a configured
    network-layer interface.";
            }
          }  // container interfaces
    
          container control-plane-protocols {
            description
              "Support for control-plane protocol instances.";
            list control-plane-protocol {
              key "type name";
              description
                "Each entry contains a control-plane protocol instance.";
              leaf type {
                type identityref {
                  base control-plane-protocol;
                }
                description
                  "Type of the control-plane protocol -- an identity
    derived from the 'control-plane-protocol'
    base identity.";
              }
    
              leaf name {
                type string;
                description
                  "An arbitrary name of the control-plane protocol
    instance.";
              }
    
              leaf description {
                type string;
                description
                  "Textual description of the control-plane protocol
    instance.";
              }
    
              container static-routes {
                when
                  "derived-from-or-self(../type, 'rt:static')" {
                  description
                    "This container is only valid for the 'static' routing
    protocol.";
                }
                description
                  "Support for the 'static' pseudo-protocol.
    
    Address-family-specific modules augment this node with
    their lists of routes.";
                container ipv6 {
                  description
                    "Support for a 'static' pseudo-protocol instance
    consists of a list of routes.";
                  list route {
                    key "destination-prefix";
                    description
                      "A list of static routes.";
                    leaf destination-prefix {
                      type inet:ipv6-prefix;
                      mandatory true;
                      description
                        "IPv6 destination prefix.";
                    }
    
                    leaf description {
                      type string;
                      description
                        "Textual description of the route.";
                    }
    
                    container next-hop {
                      description
                        "Next hop for the route.";
                      choice next-hop-options {
                        mandatory true;
                        description
                          "Options for next hops in static routes.
    
    It is expected that further cases will be added through
    augments from other modules.";
                        case simple-next-hop {
                          description
                            "This case represents a simple next hop consisting of the
    next-hop address and/or outgoing interface.
    
    Modules for address families MUST augment this case with a
    leaf containing a next-hop address of that address
    family.";
                          leaf outgoing-interface {
                            type if:interface-ref;
                            description
                              "Name of the outgoing interface.";
                          }
    
                          leaf next-hop-address {
                            type inet:ipv6-address;
                            description
                              "IPv6 address of the next hop.";
                          }
                        }  // case simple-next-hop
                        leaf special-next-hop {
                          type enumeration {
                            enum "blackhole" {
                              value 0;
                              description
                                "Silently discard the packet.";
                            }
                            enum "unreachable" {
                              value 1;
                              description
                                "Discard the packet and notify the sender with an error
    message indicating that the destination host is
    unreachable.";
                            }
                            enum "prohibit" {
                              value 2;
                              description
                                "Discard the packet and notify the sender with an error
    message indicating that the communication is
    administratively prohibited.";
                            }
                            enum "receive" {
                              value 3;
                              description
                                "The packet will be received by the local system.";
                            }
                          }
                          description
                            "Options for special next hops.";
                        }
                        container next-hop-list {
                          description
                            "Container for multiple next hops.";
                          list next-hop {
                            key "index";
                            description
                              "An entry in a next-hop list.
    
    Modules for address families MUST augment this list
    with a leaf containing a next-hop address of that
    address family.";
                            leaf index {
                              type string;
                              description
                                "A user-specified identifier utilized 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 outgoing-interface {
                              type if:interface-ref;
                              description
                                "Name of the outgoing interface.";
                            }
    
                            leaf next-hop-address {
                              type inet:ipv6-address;
                              description
                                "IPv6 address of the next hop.";
                            }
                          }  // list next-hop
                        }  // container next-hop-list
                      }  // choice next-hop-options
                    }  // container next-hop
                  }  // list route
                }  // container ipv6
    
                container ipv4 {
                  description
                    "Support for a 'static' pseudo-protocol instance
    consists of a list of routes.";
                  list route {
                    key "destination-prefix";
                    description
                      "A list of static routes.";
                    leaf destination-prefix {
                      type inet:ipv4-prefix;
                      mandatory true;
                      description
                        "IPv4 destination prefix.";
                    }
    
                    leaf description {
                      type string;
                      description
                        "Textual description of the route.";
                    }
    
                    container next-hop {
                      description
                        "Support for next-hop.";
                      choice next-hop-options {
                        mandatory true;
                        description
                          "Options for next hops in static routes.
    
    It is expected that further cases will be added through
    augments from other modules.";
                        case simple-next-hop {
                          description
                            "This case represents a simple next hop consisting of the
    next-hop address and/or outgoing interface.
    
    Modules for address families MUST augment this case with a
    leaf containing a next-hop address of that address
    family.";
                          leaf outgoing-interface {
                            type if:interface-ref;
                            description
                              "Name of the outgoing interface.";
                          }
    
                          leaf next-hop-address {
                            type inet:ipv4-address;
                            description
                              "IPv4 address of the next hop.";
                          }
                        }  // case simple-next-hop
                        leaf special-next-hop {
                          type enumeration {
                            enum "blackhole" {
                              value 0;
                              description
                                "Silently discard the packet.";
                            }
                            enum "unreachable" {
                              value 1;
                              description
                                "Discard the packet and notify the sender with an error
    message indicating that the destination host is
    unreachable.";
                            }
                            enum "prohibit" {
                              value 2;
                              description
                                "Discard the packet and notify the sender with an error
    message indicating that the communication is
    administratively prohibited.";
                            }
                            enum "receive" {
                              value 3;
                              description
                                "The packet will be received by the local system.";
                            }
                          }
                          description
                            "Options for special next hops.";
                        }
                        container next-hop-list {
                          description
                            "Container for multiple next hops.";
                          list next-hop {
                            key "index";
                            description
                              "An entry in a next-hop list.
    
    Modules for address families MUST augment this list
    with a leaf containing a next-hop address of that
    address family.";
                            leaf index {
                              type string;
                              description
                                "A user-specified identifier utilized 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 outgoing-interface {
                              type if:interface-ref;
                              description
                                "Name of the outgoing interface.";
                            }
    
                            leaf next-hop-address {
                              type inet:ipv4-address;
                              description
                                "IPv4 address of the next hop.";
                            }
                          }  // list next-hop
                        }  // container next-hop-list
                      }  // choice next-hop-options
                    }  // container next-hop
                  }  // list route
                }  // container ipv4
    
                container ipv4 {
                  description
                    "Configuration of a 'static' pseudo-protocol instance
    consists of a list of routes.";
                  list route {
                    key "destination-prefix";
                    description
                      "A list of static routes.";
                    leaf destination-prefix {
                      type inet:ipv4-prefix;
                      mandatory true;
                      description
                        "IPv4 destination prefix.";
                    }
    
                    leaf description {
                      type string;
                      description
                        "Textual description of the route.";
                    }
    
                    container next-hop {
                      description
                        "Configuration of next-hop.";
                      choice next-hop-options {
                        mandatory true;
                        description
                          "Options for next hops in static routes.
    
    It is expected that further cases will be added through
    augments from other modules.";
                        case simple-next-hop {
                          description
                            "This case represents a simple next hop consisting of the
    next-hop address and/or outgoing interface.
    
    Modules for address families MUST augment this case with a
    leaf containing a next-hop address of that address
    family.";
                          leaf outgoing-interface {
                            type if:interface-ref;
                            description
                              "Name of the outgoing interface.";
                          }
    
                          leaf next-hop-address {
                            type inet:ipv4-address;
                            description
                              "IPv4 address of the next hop.";
                          }
                        }  // case simple-next-hop
                        leaf special-next-hop {
                          type enumeration {
                            enum "blackhole" {
                              value 0;
                              description
                                "Silently discard the packet.";
                            }
                            enum "unreachable" {
                              value 1;
                              description
                                "Discard the packet and notify the sender with an error
    message indicating that the destination host is
    unreachable.";
                            }
                            enum "prohibit" {
                              value 2;
                              description
                                "Discard the packet and notify the sender with an error
    message indicating that the communication is
    administratively prohibited.";
                            }
                            enum "receive" {
                              value 3;
                              description
                                "The packet will be received by the local system.";
                            }
                          }
                          description
                            "Options for special next hops.";
                        }
                        container next-hop-list {
                          description
                            "Container for multiple next hops.";
                          list next-hop {
                            key "index";
                            description
                              "An entry in a next-hop list.
    
    Modules for address families MUST augment this list
    with a leaf containing a next-hop address of that
    address family.";
                            leaf index {
                              type string;
                              description
                                "A user-specified identifier utilized 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 outgoing-interface {
                              type if:interface-ref;
                              description
                                "Name of the outgoing interface.";
                            }
    
                            leaf next-hop-address {
                              type inet:ipv4-address;
                              description
                                "IPv4 address of the next hop.";
                            }
                          }  // list next-hop
                        }  // container next-hop-list
                      }  // choice next-hop-options
                    }  // container next-hop
                  }  // list route
                }  // container ipv4
              }  // container static-routes
    
              container bfd {
                description
                  "BFD top-level container.";
                container summary {
                  config false;
                  description
                    "BFD session statistics summary.";
                  leaf number-of-sessions {
                    type yang:gauge32;
                    description
                      "Number of BFD sessions.";
                  }
    
                  leaf number-of-sessions-up {
                    type yang:gauge32;
                    description
                      "Number of BFD sessions currently in the 'Up' state
    (as defined in RFC 5880).";
                  }
    
                  leaf number-of-sessions-down {
                    type yang:gauge32;
                    description
                      "Number of BFD sessions currently in the 'Down' or 'Init'
    state but not 'adminDown' (as defined in RFC 5880).";
                  }
    
                  leaf number-of-sessions-admin-down {
                    type yang:gauge32;
                    description
                      "Number of BFD sessions currently in the 'adminDown' state
    (as defined in RFC 5880).";
                  }
                }  // container summary
    
                container lag {
                  description
                    "BFD-over-LAG top-level container.";
                  container micro-bfd-ipv4-session-statistics {
                    description
                      "Micro-BFD IPv4 session counters.";
                    container summary {
                      config false;
                      description
                        "BFD session statistics summary.";
                      leaf number-of-sessions {
                        type yang:gauge32;
                        description
                          "Number of BFD sessions.";
                      }
    
                      leaf number-of-sessions-up {
                        type yang:gauge32;
                        description
                          "Number of BFD sessions currently in the 'Up' state
    (as defined in RFC 5880).";
                      }
    
                      leaf number-of-sessions-down {
                        type yang:gauge32;
                        description
                          "Number of BFD sessions currently in the 'Down' or 'Init'
    state but not 'adminDown' (as defined in RFC 5880).";
                      }
    
                      leaf number-of-sessions-admin-down {
                        type yang:gauge32;
                        description
                          "Number of BFD sessions currently in the 'adminDown' state
    (as defined in RFC 5880).";
                      }
                    }  // container summary
                  }  // container micro-bfd-ipv4-session-statistics
    
                  container micro-bfd-ipv6-session-statistics {
                    description
                      "Micro-BFD IPv6 session counters.";
                    container summary {
                      config false;
                      description
                        "BFD session statistics summary.";
                      leaf number-of-sessions {
                        type yang:gauge32;
                        description
                          "Number of BFD sessions.";
                      }
    
                      leaf number-of-sessions-up {
                        type yang:gauge32;
                        description
                          "Number of BFD sessions currently in the 'Up' state
    (as defined in RFC 5880).";
                      }
    
                      leaf number-of-sessions-down {
                        type yang:gauge32;
                        description
                          "Number of BFD sessions currently in the 'Down' or 'Init'
    state but not 'adminDown' (as defined in RFC 5880).";
                      }
    
                      leaf number-of-sessions-admin-down {
                        type yang:gauge32;
                        description
                          "Number of BFD sessions currently in the 'adminDown' state
    (as defined in RFC 5880).";
                      }
                    }  // container summary
                  }  // container micro-bfd-ipv6-session-statistics
    
                  container sessions {
                    description
                      "BFD-over-LAG sessions.";
                    list session {
                      key "lag-name";
                      description
                        "List of BFD-over-LAG sessions.";
                      leaf lag-name {
                        type if:interface-ref;
                        description
                          "Name of the LAG.";
                      }
    
                      leaf ipv4-dest-addr {
                        type inet:ipv4-address;
                        description
                          "IPv4 address of the peer, for IPv4 micro-BFD.";
                      }
    
                      leaf ipv6-dest-addr {
                        type inet:ipv6-address;
                        description
                          "IPv6 address of the peer, for IPv6 micro-BFD.";
                      }
    
                      leaf local-multiplier {
                        type multiplier;
                        default "3";
                        description
                          "Multiplier transmitted by the local system.";
                      }
    
                      choice interval-config-type {
                        default
                          "tx-rx-intervals";
                        description
                          "Two interval values or one value used for both transmit and
    receive.";
                        case tx-rx-intervals {
                          leaf desired-min-tx-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Desired minimum transmit interval of control packets.";
                          }
    
                          leaf required-min-rx-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Required minimum receive interval of control packets.";
                          }
                        }  // case tx-rx-intervals
    
                        case single-interval {
                          if-feature single-minimum-interval;
                          leaf min-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Desired minimum transmit interval and required
    minimum receive interval of control packets.";
                          }
                        }  // case single-interval
                      }  // choice interval-config-type
    
                      leaf demand-enabled {
                        if-feature demand-mode;
                        type boolean;
                        default "false";
                        description
                          "To enable Demand mode.";
                      }
    
                      leaf admin-down {
                        type boolean;
                        default "false";
                        description
                          "Indicates whether the BFD session is administratively
    down.";
                      }
    
                      container authentication {
                        if-feature authentication;
                        presence
                          "Enables BFD authentication (see Section 6.7
    of RFC 5880).";
                        description
                          "Parameters for BFD authentication.";
                        reference
                          "RFC 5880: Bidirectional Forwarding Detection (BFD),
                          Section 6.7";
    
                        leaf key-chain {
                          type key-chain:key-chain-ref;
                          description
                            "Name of the 'key-chain' as per RFC 8177.";
                        }
    
                        leaf meticulous {
                          type boolean;
                          description
                            "Enables a meticulous mode as per Section 6.7 of
    RFC 5880.";
                        }
                      }  // container authentication
    
                      leaf use-ipv4 {
                        type boolean;
                        description
                          "Using IPv4 micro-BFD.";
                      }
    
                      leaf use-ipv6 {
                        type boolean;
                        description
                          "Using IPv6 micro-BFD.";
                      }
    
                      list member-links {
                        key "member-link";
                        config false;
                        description
                          "Micro-BFD over a LAG.  This represents one
    member link.";
                        leaf member-link {
                          type if:interface-ref;
                          description
                            "Member link on which micro-BFD is running.";
                        }
    
                        container micro-bfd-ipv4 {
                          when
                            "../../use-ipv4 = 'true'" {
                            description
                              "Needed only if IPv4 is used.";
                          }
                          description
                            "Micro-BFD IPv4 session state on a member link.";
                          leaf path-type {
                            type identityref {
                              base path-type;
                            }
                            config false;
                            description
                              "BFD path type.  This indicates the path type that BFD is
    running on.";
                          }
    
                          leaf ip-encapsulation {
                            type boolean;
                            config false;
                            description
                              "Indicates whether BFD encapsulation uses IP.";
                          }
    
                          leaf local-discriminator {
                            type discriminator;
                            config false;
                            description
                              "Local discriminator.";
                          }
    
                          leaf remote-discriminator {
                            type discriminator;
                            config false;
                            description
                              "Remote discriminator.";
                          }
    
                          leaf remote-multiplier {
                            type multiplier;
                            config false;
                            description
                              "Remote multiplier.";
                          }
    
                          leaf demand-capability {
                            if-feature demand-mode;
                            type boolean;
                            config false;
                            description
                              "Local Demand mode capability.";
                          }
    
                          leaf source-port {
                            when
                              "../ip-encapsulation = 'true'" {
                              description
                                "Source port valid only when IP encapsulation is used.";
                            }
                            type inet:port-number;
                            config false;
                            description
                              "Source UDP port.";
                          }
    
                          leaf dest-port {
                            when
                              "../ip-encapsulation = 'true'" {
                              description
                                "Destination port valid only when IP encapsulation
    is used.";
                            }
                            type inet:port-number;
                            config false;
                            description
                              "Destination UDP port.";
                          }
    
                          container session-running {
                            config false;
                            description
                              "BFD 'session-running' information.";
                            leaf session-index {
                              type uint32;
                              description
                                "An index used to uniquely identify BFD sessions.";
                            }
    
                            leaf local-state {
                              type state;
                              description
                                "Local state.";
                            }
    
                            leaf remote-state {
                              type state;
                              description
                                "Remote state.";
                            }
    
                            leaf local-diagnostic {
                              type iana-bfd-types:diagnostic;
                              description
                                "Local diagnostic.";
                            }
    
                            leaf remote-diagnostic {
                              type iana-bfd-types:diagnostic;
                              description
                                "Remote diagnostic.";
                            }
    
                            leaf remote-authenticated {
                              type boolean;
                              description
                                "Indicates whether incoming BFD control packets are
    authenticated.";
                            }
    
                            leaf remote-authentication-type {
                              when
                                "../remote-authenticated = 'true'" {
                                description
                                  "Only valid when incoming BFD control packets are
    authenticated.";
                              }
                              if-feature authentication;
                              type iana-bfd-types:auth-type;
                              description
                                "Authentication type of incoming BFD control packets.";
                            }
    
                            leaf detection-mode {
                              type enumeration {
                                enum
                                  "async-with-echo" {
                                  value 1;
                                  description
                                    "Async with echo.";
                                }
                                enum
                                  "async-without-echo" {
                                  value 2;
                                  description
                                    "Async without echo.";
                                }
                                enum
                                  "demand-with-echo" {
                                  value 3;
                                  description
                                    "Demand with echo.";
                                }
                                enum
                                  "demand-without-echo" {
                                  value 4;
                                  description
                                    "Demand without echo.";
                                }
                              }
                              description
                                "Detection mode.";
                            }
    
                            leaf negotiated-tx-interval {
                              type uint32;
                              units
                                "microseconds";
                              description
                                "Negotiated transmit interval.";
                            }
    
                            leaf negotiated-rx-interval {
                              type uint32;
                              units
                                "microseconds";
                              description
                                "Negotiated receive interval.";
                            }
    
                            leaf detection-time {
                              type uint32;
                              units
                                "microseconds";
                              description
                                "Detection time.";
                            }
    
                            leaf echo-tx-interval-in-use {
                              when
                                "../../path-type = 'bfd-types:path-ip-sh'" {
                                description
                                  "Echo is supported for IP single-hop only.";
                              }
                              if-feature echo-mode;
                              type uint32;
                              units
                                "microseconds";
                              description
                                "Echo transmit interval in use.";
                            }
                          }  // container session-running
    
                          container session-statistics {
                            config false;
                            description
                              "BFD per-session statistics.";
                            leaf create-time {
                              type yang:date-and-time;
                              description
                                "Time and date when this session was created.";
                            }
    
                            leaf last-down-time {
                              type yang:date-and-time;
                              description
                                "Time and date of the last time this session went down.";
                            }
    
                            leaf last-up-time {
                              type yang:date-and-time;
                              description
                                "Time and date of the last time this session went up.";
                            }
    
                            leaf down-count {
                              type yang:counter32;
                              description
                                "The number of times this session has transitioned to the
    'down' state.";
                            }
    
                            leaf admin-down-count {
                              type yang:counter32;
                              description
                                "The number of times this session has transitioned to the
    'admin-down' state.";
                            }
    
                            leaf receive-packet-count {
                              type yang:counter64;
                              description
                                "Count of received packets in this session.  This includes
    valid and invalid received packets.";
                            }
    
                            leaf send-packet-count {
                              type yang:counter64;
                              description
                                "Count of sent packets in this session.";
                            }
    
                            leaf receive-invalid-packet-count {
                              type yang:counter64;
                              description
                                "Count of invalid received packets in this session.";
                            }
    
                            leaf send-failed-packet-count {
                              type yang:counter64;
                              description
                                "Count of packets that failed to be sent in this session.";
                            }
                          }  // container session-statistics
                        }  // container micro-bfd-ipv4
    
                        container micro-bfd-ipv6 {
                          when
                            "../../use-ipv6 = 'true'" {
                            description
                              "Needed only if IPv6 is used.";
                          }
                          description
                            "Micro-BFD IPv6 session state on a member link.";
                          leaf path-type {
                            type identityref {
                              base path-type;
                            }
                            config false;
                            description
                              "BFD path type.  This indicates the path type that BFD is
    running on.";
                          }
    
                          leaf ip-encapsulation {
                            type boolean;
                            config false;
                            description
                              "Indicates whether BFD encapsulation uses IP.";
                          }
    
                          leaf local-discriminator {
                            type discriminator;
                            config false;
                            description
                              "Local discriminator.";
                          }
    
                          leaf remote-discriminator {
                            type discriminator;
                            config false;
                            description
                              "Remote discriminator.";
                          }
    
                          leaf remote-multiplier {
                            type multiplier;
                            config false;
                            description
                              "Remote multiplier.";
                          }
    
                          leaf demand-capability {
                            if-feature demand-mode;
                            type boolean;
                            config false;
                            description
                              "Local Demand mode capability.";
                          }
    
                          leaf source-port {
                            when
                              "../ip-encapsulation = 'true'" {
                              description
                                "Source port valid only when IP encapsulation is used.";
                            }
                            type inet:port-number;
                            config false;
                            description
                              "Source UDP port.";
                          }
    
                          leaf dest-port {
                            when
                              "../ip-encapsulation = 'true'" {
                              description
                                "Destination port valid only when IP encapsulation
    is used.";
                            }
                            type inet:port-number;
                            config false;
                            description
                              "Destination UDP port.";
                          }
    
                          container session-running {
                            config false;
                            description
                              "BFD 'session-running' information.";
                            leaf session-index {
                              type uint32;
                              description
                                "An index used to uniquely identify BFD sessions.";
                            }
    
                            leaf local-state {
                              type state;
                              description
                                "Local state.";
                            }
    
                            leaf remote-state {
                              type state;
                              description
                                "Remote state.";
                            }
    
                            leaf local-diagnostic {
                              type iana-bfd-types:diagnostic;
                              description
                                "Local diagnostic.";
                            }
    
                            leaf remote-diagnostic {
                              type iana-bfd-types:diagnostic;
                              description
                                "Remote diagnostic.";
                            }
    
                            leaf remote-authenticated {
                              type boolean;
                              description
                                "Indicates whether incoming BFD control packets are
    authenticated.";
                            }
    
                            leaf remote-authentication-type {
                              when
                                "../remote-authenticated = 'true'" {
                                description
                                  "Only valid when incoming BFD control packets are
    authenticated.";
                              }
                              if-feature authentication;
                              type iana-bfd-types:auth-type;
                              description
                                "Authentication type of incoming BFD control packets.";
                            }
    
                            leaf detection-mode {
                              type enumeration {
                                enum
                                  "async-with-echo" {
                                  value 1;
                                  description
                                    "Async with echo.";
                                }
                                enum
                                  "async-without-echo" {
                                  value 2;
                                  description
                                    "Async without echo.";
                                }
                                enum
                                  "demand-with-echo" {
                                  value 3;
                                  description
                                    "Demand with echo.";
                                }
                                enum
                                  "demand-without-echo" {
                                  value 4;
                                  description
                                    "Demand without echo.";
                                }
                              }
                              description
                                "Detection mode.";
                            }
    
                            leaf negotiated-tx-interval {
                              type uint32;
                              units
                                "microseconds";
                              description
                                "Negotiated transmit interval.";
                            }
    
                            leaf negotiated-rx-interval {
                              type uint32;
                              units
                                "microseconds";
                              description
                                "Negotiated receive interval.";
                            }
    
                            leaf detection-time {
                              type uint32;
                              units
                                "microseconds";
                              description
                                "Detection time.";
                            }
    
                            leaf echo-tx-interval-in-use {
                              when
                                "../../path-type = 'bfd-types:path-ip-sh'" {
                                description
                                  "Echo is supported for IP single-hop only.";
                              }
                              if-feature echo-mode;
                              type uint32;
                              units
                                "microseconds";
                              description
                                "Echo transmit interval in use.";
                            }
                          }  // container session-running
    
                          container session-statistics {
                            config false;
                            description
                              "BFD per-session statistics.";
                            leaf create-time {
                              type yang:date-and-time;
                              description
                                "Time and date when this session was created.";
                            }
    
                            leaf last-down-time {
                              type yang:date-and-time;
                              description
                                "Time and date of the last time this session went down.";
                            }
    
                            leaf last-up-time {
                              type yang:date-and-time;
                              description
                                "Time and date of the last time this session went up.";
                            }
    
                            leaf down-count {
                              type yang:counter32;
                              description
                                "The number of times this session has transitioned to the
    'down' state.";
                            }
    
                            leaf admin-down-count {
                              type yang:counter32;
                              description
                                "The number of times this session has transitioned to the
    'admin-down' state.";
                            }
    
                            leaf receive-packet-count {
                              type yang:counter64;
                              description
                                "Count of received packets in this session.  This includes
    valid and invalid received packets.";
                            }
    
                            leaf send-packet-count {
                              type yang:counter64;
                              description
                                "Count of sent packets in this session.";
                            }
    
                            leaf receive-invalid-packet-count {
                              type yang:counter64;
                              description
                                "Count of invalid received packets in this session.";
                            }
    
                            leaf send-failed-packet-count {
                              type yang:counter64;
                              description
                                "Count of packets that failed to be sent in this session.";
                            }
                          }  // container session-statistics
                        }  // container micro-bfd-ipv6
                      }  // list member-links
                    }  // list session
                  }  // container sessions
                }  // container lag
    
                container mpls {
                  description
                    "BFD MPLS top-level container.";
                  container summary {
                    config false;
                    description
                      "BFD session statistics summary.";
                    leaf number-of-sessions {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions.";
                    }
    
                    leaf number-of-sessions-up {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions currently in the 'Up' state
    (as defined in RFC 5880).";
                    }
    
                    leaf number-of-sessions-down {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions currently in the 'Down' or 'Init'
    state but not 'adminDown' (as defined in RFC 5880).";
                    }
    
                    leaf number-of-sessions-admin-down {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions currently in the 'adminDown' state
    (as defined in RFC 5880).";
                    }
                  }  // container summary
    
                  container egress {
                    description
                      "Egress configuration.";
                    leaf enabled {
                      type boolean;
                      default "false";
                      description
                        "Indicates whether BFD is enabled.";
                    }
    
                    leaf local-multiplier {
                      type multiplier;
                      default "3";
                      description
                        "Multiplier transmitted by the local system.";
                    }
    
                    choice interval-config-type {
                      default "tx-rx-intervals";
                      description
                        "Two interval values or one value used for both transmit and
    receive.";
                      case tx-rx-intervals {
                        leaf desired-min-tx-interval {
                          type uint32;
                          units "microseconds";
                          default "1000000";
                          description
                            "Desired minimum transmit interval of control packets.";
                        }
    
                        leaf required-min-rx-interval {
                          type uint32;
                          units "microseconds";
                          default "1000000";
                          description
                            "Required minimum receive interval of control packets.";
                        }
                      }  // case tx-rx-intervals
    
                      case single-interval {
                        if-feature single-minimum-interval;
                        leaf min-interval {
                          type uint32;
                          units "microseconds";
                          default "1000000";
                          description
                            "Desired minimum transmit interval and required
    minimum receive interval of control packets.";
                        }
                      }  // case single-interval
                    }  // choice interval-config-type
    
                    container authentication {
                      if-feature authentication;
                      presence
                        "Enables BFD authentication (see Section 6.7
    of RFC 5880).";
                      description
                        "Parameters for BFD authentication.";
                      reference
                        "RFC 5880: Bidirectional Forwarding Detection (BFD),
                        Section 6.7";
    
                      leaf key-chain {
                        type key-chain:key-chain-ref;
                        description
                          "Name of the 'key-chain' as per RFC 8177.";
                      }
    
                      leaf meticulous {
                        type boolean;
                        description
                          "Enables a meticulous mode as per Section 6.7 of
    RFC 5880.";
                      }
                    }  // container authentication
                  }  // container egress
    
                  container session-groups {
                    description
                      "BFD-over-MPLS session groups.";
                    list session-group {
                      key "mpls-fec";
                      description
                        "Group of BFD MPLS sessions (for ECMP).  A group of
    sessions is for one FEC.  Each session has a different
    field in the UDP/IP header for ECMP.";
                      leaf mpls-fec {
                        type inet:ip-prefix;
                        description "MPLS FEC.";
                      }
    
                      leaf local-multiplier {
                        type multiplier;
                        default "3";
                        description
                          "Multiplier transmitted by the local system.";
                      }
    
                      choice interval-config-type {
                        default
                          "tx-rx-intervals";
                        description
                          "Two interval values or one value used for both transmit and
    receive.";
                        case tx-rx-intervals {
                          leaf desired-min-tx-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Desired minimum transmit interval of control packets.";
                          }
    
                          leaf required-min-rx-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Required minimum receive interval of control packets.";
                          }
                        }  // case tx-rx-intervals
    
                        case single-interval {
                          if-feature single-minimum-interval;
                          leaf min-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Desired minimum transmit interval and required
    minimum receive interval of control packets.";
                          }
                        }  // case single-interval
                      }  // choice interval-config-type
    
                      leaf demand-enabled {
                        if-feature demand-mode;
                        type boolean;
                        default "false";
                        description
                          "To enable Demand mode.";
                      }
    
                      leaf admin-down {
                        type boolean;
                        default "false";
                        description
                          "Indicates whether the BFD session is administratively
    down.";
                      }
    
                      container authentication {
                        if-feature authentication;
                        presence
                          "Enables BFD authentication (see Section 6.7
    of RFC 5880).";
                        description
                          "Parameters for BFD authentication.";
                        reference
                          "RFC 5880: Bidirectional Forwarding Detection (BFD),
                          Section 6.7";
    
                        leaf key-chain {
                          type key-chain:key-chain-ref;
                          description
                            "Name of the 'key-chain' as per RFC 8177.";
                        }
    
                        leaf meticulous {
                          type boolean;
                          description
                            "Enables a meticulous mode as per Section 6.7 of
    RFC 5880.";
                        }
                      }  // container authentication
    
                      list sessions {
                        config false;
                        description
                          "The BFD sessions for an MPLS FEC.  The local
    discriminator is unique for each session in the
    group.";
                        leaf path-type {
                          type identityref {
                            base path-type;
                          }
                          config false;
                          description
                            "BFD path type.  This indicates the path type that BFD is
    running on.";
                        }
    
                        leaf ip-encapsulation {
                          type boolean;
                          config false;
                          description
                            "Indicates whether BFD encapsulation uses IP.";
                        }
    
                        leaf local-discriminator {
                          type discriminator;
                          config false;
                          description
                            "Local discriminator.";
                        }
    
                        leaf remote-discriminator {
                          type discriminator;
                          config false;
                          description
                            "Remote discriminator.";
                        }
    
                        leaf remote-multiplier {
                          type multiplier;
                          config false;
                          description
                            "Remote multiplier.";
                        }
    
                        leaf demand-capability {
                          if-feature demand-mode;
                          type boolean;
                          config false;
                          description
                            "Local Demand mode capability.";
                        }
    
                        leaf source-port {
                          when
                            "../ip-encapsulation = 'true'" {
                            description
                              "Source port valid only when IP encapsulation is used.";
                          }
                          type inet:port-number;
                          config false;
                          description
                            "Source UDP port.";
                        }
    
                        leaf dest-port {
                          when
                            "../ip-encapsulation = 'true'" {
                            description
                              "Destination port valid only when IP encapsulation
    is used.";
                          }
                          type inet:port-number;
                          config false;
                          description
                            "Destination UDP port.";
                        }
    
                        container session-running {
                          config false;
                          description
                            "BFD 'session-running' information.";
                          leaf session-index {
                            type uint32;
                            description
                              "An index used to uniquely identify BFD sessions.";
                          }
    
                          leaf local-state {
                            type state;
                            description
                              "Local state.";
                          }
    
                          leaf remote-state {
                            type state;
                            description
                              "Remote state.";
                          }
    
                          leaf local-diagnostic {
                            type iana-bfd-types:diagnostic;
                            description
                              "Local diagnostic.";
                          }
    
                          leaf remote-diagnostic {
                            type iana-bfd-types:diagnostic;
                            description
                              "Remote diagnostic.";
                          }
    
                          leaf remote-authenticated {
                            type boolean;
                            description
                              "Indicates whether incoming BFD control packets are
    authenticated.";
                          }
    
                          leaf remote-authentication-type {
                            when
                              "../remote-authenticated = 'true'" {
                              description
                                "Only valid when incoming BFD control packets are
    authenticated.";
                            }
                            if-feature authentication;
                            type iana-bfd-types:auth-type;
                            description
                              "Authentication type of incoming BFD control packets.";
                          }
    
                          leaf detection-mode {
                            type enumeration {
                              enum
                                "async-with-echo" {
                                value 1;
                                description
                                  "Async with echo.";
                              }
                              enum
                                "async-without-echo" {
                                value 2;
                                description
                                  "Async without echo.";
                              }
                              enum
                                "demand-with-echo" {
                                value 3;
                                description
                                  "Demand with echo.";
                              }
                              enum
                                "demand-without-echo" {
                                value 4;
                                description
                                  "Demand without echo.";
                              }
                            }
                            description
                              "Detection mode.";
                          }
    
                          leaf negotiated-tx-interval {
                            type uint32;
                            units "microseconds";
                            description
                              "Negotiated transmit interval.";
                          }
    
                          leaf negotiated-rx-interval {
                            type uint32;
                            units "microseconds";
                            description
                              "Negotiated receive interval.";
                          }
    
                          leaf detection-time {
                            type uint32;
                            units "microseconds";
                            description
                              "Detection time.";
                          }
    
                          leaf echo-tx-interval-in-use {
                            when
                              "../../path-type = 'bfd-types:path-ip-sh'" {
                              description
                                "Echo is supported for IP single-hop only.";
                            }
                            if-feature echo-mode;
                            type uint32;
                            units "microseconds";
                            description
                              "Echo transmit interval in use.";
                          }
                        }  // container session-running
    
                        container session-statistics {
                          config false;
                          description
                            "BFD per-session statistics.";
                          leaf create-time {
                            type yang:date-and-time;
                            description
                              "Time and date when this session was created.";
                          }
    
                          leaf last-down-time {
                            type yang:date-and-time;
                            description
                              "Time and date of the last time this session went down.";
                          }
    
                          leaf last-up-time {
                            type yang:date-and-time;
                            description
                              "Time and date of the last time this session went up.";
                          }
    
                          leaf down-count {
                            type yang:counter32;
                            description
                              "The number of times this session has transitioned to the
    'down' state.";
                          }
    
                          leaf admin-down-count {
                            type yang:counter32;
                            description
                              "The number of times this session has transitioned to the
    'admin-down' state.";
                          }
    
                          leaf receive-packet-count {
                            type yang:counter64;
                            description
                              "Count of received packets in this session.  This includes
    valid and invalid received packets.";
                          }
    
                          leaf send-packet-count {
                            type yang:counter64;
                            description
                              "Count of sent packets in this session.";
                          }
    
                          leaf receive-invalid-packet-count {
                            type yang:counter64;
                            description
                              "Count of invalid received packets in this session.";
                          }
    
                          leaf send-failed-packet-count {
                            type yang:counter64;
                            description
                              "Count of packets that failed to be sent in this session.";
                          }
                        }  // container session-statistics
    
                        leaf mpls-dest-address {
                          type inet:ip-address;
                          config false;
                          description
                            "Destination address as per RFC 5884.
    Needed if IP encapsulation is used.";
                        }
                      }  // list sessions
                    }  // list session-group
                  }  // container session-groups
                }  // container mpls
    
                container ip-sh {
                  description
                    "BFD IP single-hop top-level container.";
                  container summary {
                    config false;
                    description
                      "BFD session statistics summary.";
                    leaf number-of-sessions {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions.";
                    }
    
                    leaf number-of-sessions-up {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions currently in the 'Up' state
    (as defined in RFC 5880).";
                    }
    
                    leaf number-of-sessions-down {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions currently in the 'Down' or 'Init'
    state but not 'adminDown' (as defined in RFC 5880).";
                    }
    
                    leaf number-of-sessions-admin-down {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions currently in the 'adminDown' state
    (as defined in RFC 5880).";
                    }
                  }  // container summary
    
                  container sessions {
                    description
                      "BFD IP single-hop sessions.";
                    list session {
                      key "interface dest-addr";
                      description
                        "List of IP single-hop sessions.";
                      leaf interface {
                        type if:interface-ref;
                        description
                          "Interface on which the BFD session is running.";
                      }
    
                      leaf dest-addr {
                        type inet:ip-address;
                        description
                          "IP address of the peer.";
                      }
    
                      leaf source-addr {
                        type inet:ip-address;
                        description
                          "Local IP address.";
                      }
    
                      leaf local-multiplier {
                        type multiplier;
                        default "3";
                        description
                          "Multiplier transmitted by the local system.";
                      }
    
                      choice interval-config-type {
                        default
                          "tx-rx-intervals";
                        description
                          "Two interval values or one value used for both transmit and
    receive.";
                        case tx-rx-intervals {
                          leaf desired-min-tx-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Desired minimum transmit interval of control packets.";
                          }
    
                          leaf required-min-rx-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Required minimum receive interval of control packets.";
                          }
                        }  // case tx-rx-intervals
    
                        case single-interval {
                          if-feature single-minimum-interval;
                          leaf min-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Desired minimum transmit interval and required
    minimum receive interval of control packets.";
                          }
                        }  // case single-interval
                      }  // choice interval-config-type
    
                      leaf demand-enabled {
                        if-feature demand-mode;
                        type boolean;
                        default "false";
                        description
                          "To enable Demand mode.";
                      }
    
                      leaf admin-down {
                        type boolean;
                        default "false";
                        description
                          "Indicates whether the BFD session is administratively
    down.";
                      }
    
                      container authentication {
                        if-feature authentication;
                        presence
                          "Enables BFD authentication (see Section 6.7
    of RFC 5880).";
                        description
                          "Parameters for BFD authentication.";
                        reference
                          "RFC 5880: Bidirectional Forwarding Detection (BFD),
                          Section 6.7";
    
                        leaf key-chain {
                          type key-chain:key-chain-ref;
                          description
                            "Name of the 'key-chain' as per RFC 8177.";
                        }
    
                        leaf meticulous {
                          type boolean;
                          description
                            "Enables a meticulous mode as per Section 6.7 of
    RFC 5880.";
                        }
                      }  // container authentication
    
                      leaf path-type {
                        type identityref {
                          base path-type;
                        }
                        config false;
                        description
                          "BFD path type.  This indicates the path type that BFD is
    running on.";
                      }
    
                      leaf ip-encapsulation {
                        type boolean;
                        config false;
                        description
                          "Indicates whether BFD encapsulation uses IP.";
                      }
    
                      leaf local-discriminator {
                        type discriminator;
                        config false;
                        description
                          "Local discriminator.";
                      }
    
                      leaf remote-discriminator {
                        type discriminator;
                        config false;
                        description
                          "Remote discriminator.";
                      }
    
                      leaf remote-multiplier {
                        type multiplier;
                        config false;
                        description
                          "Remote multiplier.";
                      }
    
                      leaf demand-capability {
                        if-feature demand-mode;
                        type boolean;
                        config false;
                        description
                          "Local Demand mode capability.";
                      }
    
                      leaf source-port {
                        when
                          "../ip-encapsulation = 'true'" {
                          description
                            "Source port valid only when IP encapsulation is used.";
                        }
                        type inet:port-number;
                        config false;
                        description
                          "Source UDP port.";
                      }
    
                      leaf dest-port {
                        when
                          "../ip-encapsulation = 'true'" {
                          description
                            "Destination port valid only when IP encapsulation
    is used.";
                        }
                        type inet:port-number;
                        config false;
                        description
                          "Destination UDP port.";
                      }
    
                      container session-running {
                        config false;
                        description
                          "BFD 'session-running' information.";
                        leaf session-index {
                          type uint32;
                          description
                            "An index used to uniquely identify BFD sessions.";
                        }
    
                        leaf local-state {
                          type state;
                          description
                            "Local state.";
                        }
    
                        leaf remote-state {
                          type state;
                          description
                            "Remote state.";
                        }
    
                        leaf local-diagnostic {
                          type iana-bfd-types:diagnostic;
                          description
                            "Local diagnostic.";
                        }
    
                        leaf remote-diagnostic {
                          type iana-bfd-types:diagnostic;
                          description
                            "Remote diagnostic.";
                        }
    
                        leaf remote-authenticated {
                          type boolean;
                          description
                            "Indicates whether incoming BFD control packets are
    authenticated.";
                        }
    
                        leaf remote-authentication-type {
                          when
                            "../remote-authenticated = 'true'" {
                            description
                              "Only valid when incoming BFD control packets are
    authenticated.";
                          }
                          if-feature authentication;
                          type iana-bfd-types:auth-type;
                          description
                            "Authentication type of incoming BFD control packets.";
                        }
    
                        leaf detection-mode {
                          type enumeration {
                            enum
                              "async-with-echo" {
                              value 1;
                              description
                                "Async with echo.";
                            }
                            enum
                              "async-without-echo" {
                              value 2;
                              description
                                "Async without echo.";
                            }
                            enum
                              "demand-with-echo" {
                              value 3;
                              description
                                "Demand with echo.";
                            }
                            enum
                              "demand-without-echo" {
                              value 4;
                              description
                                "Demand without echo.";
                            }
                          }
                          description
                            "Detection mode.";
                        }
    
                        leaf negotiated-tx-interval {
                          type uint32;
                          units "microseconds";
                          description
                            "Negotiated transmit interval.";
                        }
    
                        leaf negotiated-rx-interval {
                          type uint32;
                          units "microseconds";
                          description
                            "Negotiated receive interval.";
                        }
    
                        leaf detection-time {
                          type uint32;
                          units "microseconds";
                          description
                            "Detection time.";
                        }
    
                        leaf echo-tx-interval-in-use {
                          when
                            "../../path-type = 'bfd-types:path-ip-sh'" {
                            description
                              "Echo is supported for IP single-hop only.";
                          }
                          if-feature echo-mode;
                          type uint32;
                          units "microseconds";
                          description
                            "Echo transmit interval in use.";
                        }
                      }  // container session-running
    
                      container session-statistics {
                        config false;
                        description
                          "BFD per-session statistics.";
                        leaf create-time {
                          type yang:date-and-time;
                          description
                            "Time and date when this session was created.";
                        }
    
                        leaf last-down-time {
                          type yang:date-and-time;
                          description
                            "Time and date of the last time this session went down.";
                        }
    
                        leaf last-up-time {
                          type yang:date-and-time;
                          description
                            "Time and date of the last time this session went up.";
                        }
    
                        leaf down-count {
                          type yang:counter32;
                          description
                            "The number of times this session has transitioned to the
    'down' state.";
                        }
    
                        leaf admin-down-count {
                          type yang:counter32;
                          description
                            "The number of times this session has transitioned to the
    'admin-down' state.";
                        }
    
                        leaf receive-packet-count {
                          type yang:counter64;
                          description
                            "Count of received packets in this session.  This includes
    valid and invalid received packets.";
                        }
    
                        leaf send-packet-count {
                          type yang:counter64;
                          description
                            "Count of sent packets in this session.";
                        }
    
                        leaf receive-invalid-packet-count {
                          type yang:counter64;
                          description
                            "Count of invalid received packets in this session.";
                        }
    
                        leaf send-failed-packet-count {
                          type yang:counter64;
                          description
                            "Count of packets that failed to be sent in this session.";
                        }
                      }  // container session-statistics
                    }  // list session
                  }  // container sessions
    
                  list interfaces {
                    key "interface";
                    description
                      "List of interfaces.";
                    leaf interface {
                      type if:interface-ref;
                      description
                        "BFD information for this interface.";
                    }
    
                    container authentication {
                      if-feature authentication;
                      presence
                        "Enables BFD authentication (see Section 6.7
    of RFC 5880).";
                      description
                        "Parameters for BFD authentication.";
                      reference
                        "RFC 5880: Bidirectional Forwarding Detection (BFD),
                        Section 6.7";
    
                      leaf key-chain {
                        type key-chain:key-chain-ref;
                        description
                          "Name of the 'key-chain' as per RFC 8177.";
                      }
    
                      leaf meticulous {
                        type boolean;
                        description
                          "Enables a meticulous mode as per Section 6.7 of
    RFC 5880.";
                      }
                    }  // container authentication
                  }  // list interfaces
                }  // container ip-sh
    
                container ip-mh {
                  description
                    "BFD IP multihop top-level container.";
                  container summary {
                    config false;
                    description
                      "BFD session statistics summary.";
                    leaf number-of-sessions {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions.";
                    }
    
                    leaf number-of-sessions-up {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions currently in the 'Up' state
    (as defined in RFC 5880).";
                    }
    
                    leaf number-of-sessions-down {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions currently in the 'Down' or 'Init'
    state but not 'adminDown' (as defined in RFC 5880).";
                    }
    
                    leaf number-of-sessions-admin-down {
                      type yang:gauge32;
                      description
                        "Number of BFD sessions currently in the 'adminDown' state
    (as defined in RFC 5880).";
                    }
                  }  // container summary
    
                  container session-groups {
                    description
                      "BFD IP multihop session groups.";
                    list session-group {
                      key "source-addr dest-addr";
                      description
                        "Group of BFD IP multihop sessions (for ECMP).  A
    group of sessions is between one source and one
    destination.  Each session has a different field
    in the UDP/IP header for ECMP.";
                      leaf source-addr {
                        type inet:ip-address;
                        description
                          "Local IP address.";
                      }
    
                      leaf dest-addr {
                        type inet:ip-address;
                        description
                          "IP address of the peer.";
                      }
    
                      leaf local-multiplier {
                        type multiplier;
                        default "3";
                        description
                          "Multiplier transmitted by the local system.";
                      }
    
                      choice interval-config-type {
                        default
                          "tx-rx-intervals";
                        description
                          "Two interval values or one value used for both transmit and
    receive.";
                        case tx-rx-intervals {
                          leaf desired-min-tx-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Desired minimum transmit interval of control packets.";
                          }
    
                          leaf required-min-rx-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Required minimum receive interval of control packets.";
                          }
                        }  // case tx-rx-intervals
    
                        case single-interval {
                          if-feature single-minimum-interval;
                          leaf min-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Desired minimum transmit interval and required
    minimum receive interval of control packets.";
                          }
                        }  // case single-interval
                      }  // choice interval-config-type
    
                      leaf demand-enabled {
                        if-feature demand-mode;
                        type boolean;
                        default "false";
                        description
                          "To enable Demand mode.";
                      }
    
                      leaf admin-down {
                        type boolean;
                        default "false";
                        description
                          "Indicates whether the BFD session is administratively
    down.";
                      }
    
                      container authentication {
                        if-feature authentication;
                        presence
                          "Enables BFD authentication (see Section 6.7
    of RFC 5880).";
                        description
                          "Parameters for BFD authentication.";
                        reference
                          "RFC 5880: Bidirectional Forwarding Detection (BFD),
                          Section 6.7";
    
                        leaf key-chain {
                          type key-chain:key-chain-ref;
                          description
                            "Name of the 'key-chain' as per RFC 8177.";
                        }
    
                        leaf meticulous {
                          type boolean;
                          description
                            "Enables a meticulous mode as per Section 6.7 of
    RFC 5880.";
                        }
                      }  // container authentication
    
                      leaf tx-ttl {
                        type bfd-types:hops;
                        default "255";
                        description
                          "Hop count of outgoing BFD control packets.";
                      }
    
                      leaf rx-ttl {
                        type bfd-types:hops;
                        mandatory true;
                        description
                          "Minimum allowed hop count value for incoming BFD
    control packets.  Control packets whose hop count is
    lower than this value are dropped.";
                      }
    
                      list sessions {
                        config false;
                        description
                          "The multiple BFD sessions between a source and a
    destination.";
                        leaf path-type {
                          type identityref {
                            base path-type;
                          }
                          config false;
                          description
                            "BFD path type.  This indicates the path type that BFD is
    running on.";
                        }
    
                        leaf ip-encapsulation {
                          type boolean;
                          config false;
                          description
                            "Indicates whether BFD encapsulation uses IP.";
                        }
    
                        leaf local-discriminator {
                          type discriminator;
                          config false;
                          description
                            "Local discriminator.";
                        }
    
                        leaf remote-discriminator {
                          type discriminator;
                          config false;
                          description
                            "Remote discriminator.";
                        }
    
                        leaf remote-multiplier {
                          type multiplier;
                          config false;
                          description
                            "Remote multiplier.";
                        }
    
                        leaf demand-capability {
                          if-feature demand-mode;
                          type boolean;
                          config false;
                          description
                            "Local Demand mode capability.";
                        }
    
                        leaf source-port {
                          when
                            "../ip-encapsulation = 'true'" {
                            description
                              "Source port valid only when IP encapsulation is used.";
                          }
                          type inet:port-number;
                          config false;
                          description
                            "Source UDP port.";
                        }
    
                        leaf dest-port {
                          when
                            "../ip-encapsulation = 'true'" {
                            description
                              "Destination port valid only when IP encapsulation
    is used.";
                          }
                          type inet:port-number;
                          config false;
                          description
                            "Destination UDP port.";
                        }
    
                        container session-running {
                          config false;
                          description
                            "BFD 'session-running' information.";
                          leaf session-index {
                            type uint32;
                            description
                              "An index used to uniquely identify BFD sessions.";
                          }
    
                          leaf local-state {
                            type state;
                            description
                              "Local state.";
                          }
    
                          leaf remote-state {
                            type state;
                            description
                              "Remote state.";
                          }
    
                          leaf local-diagnostic {
                            type iana-bfd-types:diagnostic;
                            description
                              "Local diagnostic.";
                          }
    
                          leaf remote-diagnostic {
                            type iana-bfd-types:diagnostic;
                            description
                              "Remote diagnostic.";
                          }
    
                          leaf remote-authenticated {
                            type boolean;
                            description
                              "Indicates whether incoming BFD control packets are
    authenticated.";
                          }
    
                          leaf remote-authentication-type {
                            when
                              "../remote-authenticated = 'true'" {
                              description
                                "Only valid when incoming BFD control packets are
    authenticated.";
                            }
                            if-feature authentication;
                            type iana-bfd-types:auth-type;
                            description
                              "Authentication type of incoming BFD control packets.";
                          }
    
                          leaf detection-mode {
                            type enumeration {
                              enum
                                "async-with-echo" {
                                value 1;
                                description
                                  "Async with echo.";
                              }
                              enum
                                "async-without-echo" {
                                value 2;
                                description
                                  "Async without echo.";
                              }
                              enum
                                "demand-with-echo" {
                                value 3;
                                description
                                  "Demand with echo.";
                              }
                              enum
                                "demand-without-echo" {
                                value 4;
                                description
                                  "Demand without echo.";
                              }
                            }
                            description
                              "Detection mode.";
                          }
    
                          leaf negotiated-tx-interval {
                            type uint32;
                            units "microseconds";
                            description
                              "Negotiated transmit interval.";
                          }
    
                          leaf negotiated-rx-interval {
                            type uint32;
                            units "microseconds";
                            description
                              "Negotiated receive interval.";
                          }
    
                          leaf detection-time {
                            type uint32;
                            units "microseconds";
                            description
                              "Detection time.";
                          }
    
                          leaf echo-tx-interval-in-use {
                            when
                              "../../path-type = 'bfd-types:path-ip-sh'" {
                              description
                                "Echo is supported for IP single-hop only.";
                            }
                            if-feature echo-mode;
                            type uint32;
                            units "microseconds";
                            description
                              "Echo transmit interval in use.";
                          }
                        }  // container session-running
    
                        container session-statistics {
                          config false;
                          description
                            "BFD per-session statistics.";
                          leaf create-time {
                            type yang:date-and-time;
                            description
                              "Time and date when this session was created.";
                          }
    
                          leaf last-down-time {
                            type yang:date-and-time;
                            description
                              "Time and date of the last time this session went down.";
                          }
    
                          leaf last-up-time {
                            type yang:date-and-time;
                            description
                              "Time and date of the last time this session went up.";
                          }
    
                          leaf down-count {
                            type yang:counter32;
                            description
                              "The number of times this session has transitioned to the
    'down' state.";
                          }
    
                          leaf admin-down-count {
                            type yang:counter32;
                            description
                              "The number of times this session has transitioned to the
    'admin-down' state.";
                          }
    
                          leaf receive-packet-count {
                            type yang:counter64;
                            description
                              "Count of received packets in this session.  This includes
    valid and invalid received packets.";
                          }
    
                          leaf send-packet-count {
                            type yang:counter64;
                            description
                              "Count of sent packets in this session.";
                          }
    
                          leaf receive-invalid-packet-count {
                            type yang:counter64;
                            description
                              "Count of invalid received packets in this session.";
                          }
    
                          leaf send-failed-packet-count {
                            type yang:counter64;
                            description
                              "Count of packets that failed to be sent in this session.";
                          }
                        }  // container session-statistics
                      }  // list sessions
                    }  // list session-group
                  }  // container session-groups
                }  // container ip-mh
              }  // container bfd
    
              container igmp-snooping-instance {
                if-feature igmp-snooping;
                description
                  "IGMP snooping instance to configure igmp-snooping.";
                leaf l2-service-type {
                  type l2-service-type;
                  default "bridge";
                  description
                    "It indicates bridge or other services.";
                }
    
                leaf enabled {
                  type boolean;
                  default "false";
                  description
                    "Set the value to true to enable IGMP and MLD snooping.";
                }
    
                leaf forwarding-table-type {
                  type enumeration {
                    enum "mac" {
                      value 0;
                      description
                        "MAC-based lookup mode.";
                    }
                    enum "ip" {
                      value 1;
                      description
                        "IP-based lookup mode.";
                    }
                  }
                  default "ip";
                  description
                    "The default forwarding table type is ip.";
                }
    
                leaf explicit-tracking {
                  if-feature explicit-tracking;
                  type boolean;
                  default "false";
                  description
                    "Track the IGMPv3 and MLDv2 snooping membership reports
    from individual hosts.  It contributes to saving network
    resources and shortening leave latency.";
                }
    
                leaf lite-exclude-filter {
                  if-feature lite-exclude-filter;
                  type empty;
                  description
                    "For IGMP snooping, the presence of this
    leaf enables the support of the simplified EXCLUDE filter
    in the Lightweight IGMPv3 protocol, which simplifies the
    standard versions of IGMPv3.
    For MLD Snooping, the presence of this
    leaf enables the support of the simplified EXCLUDE filter
    in the Lightweight MLDv2 protocol, which simplifies the
    standard versions of MLDv2.";
                  reference
                    "RFC 5790: Lightweight Internet Group Management Protocol
                    Version 3 (IGMPv3) and Multicast Listener Discovery Version
                    2 (MLDv2) Protocols";
    
                }
    
                leaf send-query {
                  type boolean;
                  default "false";
                  description
                    "When it is true, this switch will send out a periodic IGMP
    General Query Message or MLD General Query Message.";
                }
    
                leaf fast-leave {
                  if-feature fast-leave;
                  type empty;
                  description
                    "When fast leave is enabled, the software assumes
    that no more than one host is present on each VLAN port.";
                }
    
                leaf last-member-query-interval {
                  type uint16 {
                    range "10..10230";
                  }
                  units "deciseconds";
                  default "10";
                  description
                    "Last Member Query Interval, which may be tuned to modify
    the leave latency of the network.
    It is represented in units of 1/10 second.";
                  reference
                    "RFC 3376: Internet Group Management Protocol, Version 3,
                    Section 8.8";
    
                }
    
                leaf query-interval {
                  type uint16;
                  units "seconds";
                  default "125";
                  description
                    "The Query Interval is the interval between General Queries
    sent by the Querier.";
                  reference
                    "RFC 3376: Internet Group Management Protocol, Version 3,
                    Sections 4.1.7, 8.2, and 8.14.2";
    
                }
    
                leaf query-max-response-time {
                  type uint16;
                  units "deciseconds";
                  default "100";
                  description
                    "Query maximum response time specifies the maximum time
    allowed before sending a responding report.
    It is represented in units of 1/10 second.";
                  reference
                    "RFC 3376: Internet Group Management Protocol, Version 3,
                    Sections 4.1.1, 8.3, and 8.14.3";
    
                }
    
                leaf require-router-alert {
                  if-feature require-router-alert;
                  type boolean;
                  default "false";
                  description
                    "When the value is true, a router alert should exist
    in the IP header of the IGMP or MLD packet.  If it
    doesn't exist, the IGMP or MLD packet will be ignored.";
                  reference
                    "RFC 3376: Internet Group Management Protocol, Version 3,
                    Sections 9.1, 9.2, and 9.3";
    
                }
    
                leaf robustness-variable {
                  type uint8 {
                    range "1..7";
                  }
                  default "2";
                  description
                    "Querier's Robustness Variable allows tuning for the
    expected packet loss on a network.";
                  reference
                    "RFC 3376: Internet Group Management Protocol, Version 3,
                    Sections 4.1.6, 8.1, and 8.14.1";
    
                }
    
                leaf-list static-bridge-mrouter-interface {
                  when
                    "derived-from-or-self(../l2-service-type,"ims:bridge")";
                  if-feature static-mrouter-interface;
                  type if:interface-ref;
                  description
                    "Static mrouter interface in bridge forwarding";
                }
    
                leaf igmp-version {
                  type uint8 {
                    range "1..3";
                  }
                  default "2";
                  description "IGMP version.";
                }
    
                leaf querier-source {
                  type inet:ipv4-address;
                  description
                    "The source address of the IGMP General Query message,
    which is sent out by this switch.";
                }
    
                list static-l2-multicast-group {
                  if-feature static-l2-multicast-group;
                  key "group source-addr";
                  description
                    "A static multicast route, (*,G) or (S,G).";
                  leaf group {
                    type rt-types:ipv4-multicast-group-address;
                    description
                      "Multicast group IPv4 address.";
                  }
    
                  leaf source-addr {
                    type rt-types:ipv4-multicast-source-address;
                    description
                      "Multicast source IPv4 address.";
                  }
    
                  leaf-list bridge-outgoing-interface {
                    when
                      "derived-from-or-self(../../l2-service-type,
                    "ims:bridge")";
                    type if:interface-ref;
                    description
                      "Outgoing interface in bridge forwarding.";
                  }
                }  // list static-l2-multicast-group
    
                leaf entries-count {
                  type yang:gauge32;
                  config false;
                  description
                    "The number of L2 multicast entries in IGMP and MLD
    snooping.";
                }
    
                leaf-list bridge-mrouter-interface {
                  when
                    "derived-from-or-self(../l2-service-type,"ims:bridge")";
                  type if:interface-ref;
                  config false;
                  description
                    "Indicates a list of mrouter interfaces dynamically learned
    in a bridge.  When this switch receives IGMP/MLD queries
    from a multicast router on an interface, the interface will
    become an mrouter interface for IGMP/MLD snooping.";
                }
    
                list group {
                  key "address";
                  config false;
                  description
                    "IGMP snooping information.";
                  leaf address {
                    type rt-types:ipv4-multicast-group-address;
                    description
                      "Multicast group IPv4 address.";
                  }
    
                  leaf mac-address {
                    type yang:phys-address;
                    description
                      "Destination MAC address for L2 multicast.";
                  }
    
                  leaf expire {
                    type rt-types:timer-value-seconds16;
                    units "seconds";
                    description
                      "The time left before multicast group timeout.";
                  }
    
                  leaf up-time {
                    type uint32;
                    units "seconds";
                    mandatory true;
                    description
                      "The time elapsed since the L2 multicast record was
    created.";
                  }
    
                  leaf last-reporter {
                    type inet:ipv4-address;
                    description
                      "Address of the last host that has sent a report to join
    the multicast group.";
                  }
    
                  list source {
                    key "address";
                    description
                      "Source IPv4 address for multicast stream.";
                    leaf address {
                      type rt-types:ipv4-multicast-source-address;
                      description
                        "Source IPv4 address for multicast stream.";
                    }
    
                    leaf-list bridge-outgoing-interface {
                      when
                        "derived-from-or-self(../../../l2-service-type,
                "ims:bridge")";
                      type if:interface-ref;
                      description
                        "Outgoing interface in bridge forwarding.";
                    }
    
                    leaf up-time {
                      type uint32;
                      units "seconds";
                      mandatory true;
                      description
                        "The time elapsed since L2 multicast record was created.";
                    }
    
                    leaf expire {
                      type rt-types:timer-value-seconds16;
                      units "seconds";
                      description
                        "The time left before multicast group timeout.";
                    }
    
                    leaf host-count {
                      if-feature explicit-tracking;
                      type yang:gauge32;
                      description
                        "The number of host addresses.";
                    }
    
                    leaf last-reporter {
                      type inet:ipv4-address;
                      description
                        "Address of the last host that has sent a report
    to join the multicast group.";
                    }
    
                    list host {
                      if-feature explicit-tracking;
                      key "address";
                      description
                        "List of multicast membership hosts
    of the specific multicast source group.";
                      leaf address {
                        type inet:ipv4-address;
                        description
                          "Multicast membership host address.";
                      }
    
                      leaf filter-mode {
                        type filter-mode-type;
                        mandatory true;
                        description
                          "Filter mode for a multicast membership
    host may be either include or exclude.";
                      }
                    }  // list host
                  }  // list source
                }  // list group
    
                container interfaces {
                  config false;
                  description
                    "Contains the interfaces associated with the IGMP snooping
    instance.";
                  list interface {
                    key "name";
                    description
                      "A list of interfaces associated with the IGMP snooping
    instance.";
                    leaf name {
                      type if:interface-ref;
                      description
                        "The name of the interface.";
                    }
    
                    container statistics {
                      description
                        "The interface statistics for IGMP snooping.";
                      leaf discontinuity-time {
                        type yang:date-and-time;
                        description
                          "The time on the most recent occasion at which any
    one or more of the statistic 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.";
                      }
    
                      container received {
                        description
                          "Number of received snooped IGMP packets.";
                        leaf query-count {
                          type yang:counter64;
                          description
                            "The number of Membership Query messages.";
                          reference
                            "RFC 2236: Internet Group Management Protocol, Version 2";
    
                        }
    
                        leaf membership-report-v1-count {
                          type yang:counter64;
                          description
                            "The number of Version 1 Membership Report messages.";
                          reference
                            "RFC 1112: Host extensions for IP multicasting";
    
                        }
    
                        leaf membership-report-v2-count {
                          type yang:counter64;
                          description
                            "The number of Version 2 Membership Report messages.";
                          reference
                            "RFC 2236: Internet Group Management Protocol, Version 2";
    
                        }
    
                        leaf membership-report-v3-count {
                          type yang:counter64;
                          description
                            "The number of Version 3 Membership Report messages.";
                          reference
                            "RFC 3376: Internet Group Management Protocol, Version 3";
    
                        }
    
                        leaf leave-count {
                          type yang:counter64;
                          description
                            "The number of Leave Group messages.";
                          reference
                            "RFC 2236: Internet Group Management Protocol, Version 2";
    
                        }
    
                        leaf pim-hello-count {
                          type yang:counter64;
                          description
                            "The number of PIM hello messages.";
                          reference
                            "RFC 7761: Protocol Independent Multicast - Sparse Mode
                            (PIM-SM): Protocol Specification (Revised)";
    
                        }
                      }  // container received
    
                      container sent {
                        description
                          "Number of sent snooped IGMP packets.";
                        leaf query-count {
                          type yang:counter64;
                          description
                            "The number of Membership Query messages.";
                          reference
                            "RFC 2236: Internet Group Management Protocol, Version 2";
    
                        }
    
                        leaf membership-report-v1-count {
                          type yang:counter64;
                          description
                            "The number of Version 1 Membership Report messages.";
                          reference
                            "RFC 1112: Host extensions for IP multicasting";
    
                        }
    
                        leaf membership-report-v2-count {
                          type yang:counter64;
                          description
                            "The number of Version 2 Membership Report messages.";
                          reference
                            "RFC 2236: Internet Group Management Protocol, Version 2";
    
                        }
    
                        leaf membership-report-v3-count {
                          type yang:counter64;
                          description
                            "The number of Version 3 Membership Report messages.";
                          reference
                            "RFC 3376: Internet Group Management Protocol, Version 3";
    
                        }
    
                        leaf leave-count {
                          type yang:counter64;
                          description
                            "The number of Leave Group messages.";
                          reference
                            "RFC 2236: Internet Group Management Protocol, Version 2";
    
                        }
    
                        leaf pim-hello-count {
                          type yang:counter64;
                          description
                            "The number of PIM hello messages.";
                          reference
                            "RFC 7761: Protocol Independent Multicast - Sparse Mode
                            (PIM-SM): Protocol Specification (Revised)";
    
                        }
                      }  // container sent
                    }  // container statistics
                  }  // list interface
                }  // container interfaces
    
                action clear-igmp-snooping-groups {
                  if-feature action-clear-groups;
                  description
                    "Clear IGMP snooping cache tables.";
                  input {
                    leaf group {
                      type union {
                        type enumeration {
                          enum "all-groups" {
                            value 0;
                            description
                              "All multicast group addresses.";
                          }
                        }
                        type rt-types:ipv4-multicast-group-address;
                      }
                      mandatory true;
                      description
                        "Multicast group IPv4 address.  If value
    'all-groups' is specified, all IGMP snooping
    group entries are cleared for the specified source
    address.";
                    }
    
                    leaf source {
                      type rt-types:ipv4-multicast-source-address;
                      mandatory true;
                      description
                        "Multicast source IPv4 address.  If value '*' is
    specified, all IGMP snooping source-group tables
    are cleared.";
                    }
                  }
                }  // rpc clear-igmp-snooping-groups
              }  // container igmp-snooping-instance
    
              container mld-snooping-instance {
                if-feature mld-snooping;
                description
                  "MLD snooping instance to configure mld-snooping.";
                leaf l2-service-type {
                  type l2-service-type;
                  default "bridge";
                  description
                    "It indicates bridge or other services.";
                }
    
                leaf enabled {
                  type boolean;
                  default "false";
                  description
                    "Set the value to true to enable IGMP and MLD snooping.";
                }
    
                leaf forwarding-table-type {
                  type enumeration {
                    enum "mac" {
                      value 0;
                      description
                        "MAC-based lookup mode.";
                    }
                    enum "ip" {
                      value 1;
                      description
                        "IP-based lookup mode.";
                    }
                  }
                  default "ip";
                  description
                    "The default forwarding table type is ip.";
                }
    
                leaf explicit-tracking {
                  if-feature explicit-tracking;
                  type boolean;
                  default "false";
                  description
                    "Track the IGMPv3 and MLDv2 snooping membership reports
    from individual hosts.  It contributes to saving network
    resources and shortening leave latency.";
                }
    
                leaf lite-exclude-filter {
                  if-feature lite-exclude-filter;
                  type empty;
                  description
                    "For IGMP snooping, the presence of this
    leaf enables the support of the simplified EXCLUDE filter
    in the Lightweight IGMPv3 protocol, which simplifies the
    standard versions of IGMPv3.
    For MLD Snooping, the presence of this
    leaf enables the support of the simplified EXCLUDE filter
    in the Lightweight MLDv2 protocol, which simplifies the
    standard versions of MLDv2.";
                  reference
                    "RFC 5790: Lightweight Internet Group Management Protocol
                    Version 3 (IGMPv3) and Multicast Listener Discovery Version
                    2 (MLDv2) Protocols";
    
                }
    
                leaf send-query {
                  type boolean;
                  default "false";
                  description
                    "When it is true, this switch will send out a periodic IGMP
    General Query Message or MLD General Query Message.";
                }
    
                leaf fast-leave {
                  if-feature fast-leave;
                  type empty;
                  description
                    "When fast leave is enabled, the software assumes
    that no more than one host is present on each VLAN port.";
                }
    
                leaf last-member-query-interval {
                  type uint16 {
                    range "10..10230";
                  }
                  units "deciseconds";
                  default "10";
                  description
                    "Last Member Query Interval, which may be tuned to modify
    the leave latency of the network.
    It is represented in units of 1/10 second.";
                  reference
                    "RFC 3376: Internet Group Management Protocol, Version 3,
                    Section 8.8";
    
                }
    
                leaf query-interval {
                  type uint16;
                  units "seconds";
                  default "125";
                  description
                    "The Query Interval is the interval between General Queries
    sent by the Querier.";
                  reference
                    "RFC 3376: Internet Group Management Protocol, Version 3,
                    Sections 4.1.7, 8.2, and 8.14.2";
    
                }
    
                leaf query-max-response-time {
                  type uint16;
                  units "deciseconds";
                  default "100";
                  description
                    "Query maximum response time specifies the maximum time
    allowed before sending a responding report.
    It is represented in units of 1/10 second.";
                  reference
                    "RFC 3376: Internet Group Management Protocol, Version 3,
                    Sections 4.1.1, 8.3, and 8.14.3";
    
                }
    
                leaf require-router-alert {
                  if-feature require-router-alert;
                  type boolean;
                  default "false";
                  description
                    "When the value is true, a router alert should exist
    in the IP header of the IGMP or MLD packet.  If it
    doesn't exist, the IGMP or MLD packet will be ignored.";
                  reference
                    "RFC 3376: Internet Group Management Protocol, Version 3,
                    Sections 9.1, 9.2, and 9.3";
    
                }
    
                leaf robustness-variable {
                  type uint8 {
                    range "1..7";
                  }
                  default "2";
                  description
                    "Querier's Robustness Variable allows tuning for the
    expected packet loss on a network.";
                  reference
                    "RFC 3376: Internet Group Management Protocol, Version 3,
                    Sections 4.1.6, 8.1, and 8.14.1";
    
                }
    
                leaf-list static-bridge-mrouter-interface {
                  when
                    "derived-from-or-self(../l2-service-type,"ims:bridge")";
                  if-feature static-mrouter-interface;
                  type if:interface-ref;
                  description
                    "Static mrouter interface in bridge forwarding";
                }
    
                leaf mld-version {
                  type uint8 {
                    range "1..2";
                  }
                  default "2";
                  description "MLD version.";
                }
    
                leaf querier-source {
                  type inet:ipv6-address;
                  description
                    "The source address of MLD General Query message, which
    is sent out by this switch.";
                }
    
                list static-l2-multicast-group {
                  if-feature static-l2-multicast-group;
                  key "group source-addr";
                  description
                    "A static multicast route, (*,G) or (S,G).";
                  leaf group {
                    type rt-types:ipv6-multicast-group-address;
                    description
                      "Multicast group IPv6 address.";
                  }
    
                  leaf source-addr {
                    type rt-types:ipv6-multicast-source-address;
                    description
                      "Multicast source IPv6 address.";
                  }
    
                  leaf-list bridge-outgoing-interface {
                    when
                      "derived-from-or-self(../../l2-service-type,
                    "ims:bridge")";
                    type if:interface-ref;
                    description
                      "Outgoing interface in bridge forwarding.";
                  }
                }  // list static-l2-multicast-group
    
                leaf entries-count {
                  type yang:gauge32;
                  config false;
                  description
                    "The number of L2 multicast entries in IGMP and MLD
    snooping.";
                }
    
                leaf-list bridge-mrouter-interface {
                  when
                    "derived-from-or-self(../l2-service-type,"ims:bridge")";
                  type if:interface-ref;
                  config false;
                  description
                    "Indicates a list of mrouter interfaces dynamically learned
    in a bridge.  When this switch receives IGMP/MLD queries
    from a multicast router on an interface, the interface will
    become an mrouter interface for IGMP/MLD snooping.";
                }
    
                list group {
                  key "address";
                  config false;
                  description
                    "MLD snooping statistics information.";
                  leaf address {
                    type rt-types:ipv6-multicast-group-address;
                    description
                      "Multicast group IPv6 address.";
                  }
    
                  leaf mac-address {
                    type yang:phys-address;
                    description
                      "Destination MAC address for L2 multicast.";
                  }
    
                  leaf expire {
                    type rt-types:timer-value-seconds16;
                    units "seconds";
                    description
                      "The time left before multicast group timeout.";
                  }
    
                  leaf up-time {
                    type uint32;
                    units "seconds";
                    mandatory true;
                    description
                      "The time elapsed since the L2 multicast record was
    created.";
                  }
    
                  leaf last-reporter {
                    type inet:ipv6-address;
                    description
                      "Address of the last host that has sent report
    to join the multicast group.";
                  }
    
                  list source {
                    key "address";
                    description
                      "Source IPv6 address for multicast stream.";
                    leaf address {
                      type rt-types:ipv6-multicast-source-address;
                      description
                        "Source IPv6 address for multicast stream.";
                    }
    
                    leaf-list bridge-outgoing-interface {
                      when
                        "derived-from-or-self(../../../l2-service-type,
                "ims:bridge")";
                      type if:interface-ref;
                      description
                        "Outgoing interface in bridge forwarding.";
                    }
    
                    leaf up-time {
                      type uint32;
                      units "seconds";
                      mandatory true;
                      description
                        "The time elapsed since L2 multicast record was created.";
                    }
    
                    leaf expire {
                      type rt-types:timer-value-seconds16;
                      units "seconds";
                      description
                        "The time left before multicast group timeout.";
                    }
    
                    leaf host-count {
                      if-feature explicit-tracking;
                      type yang:gauge32;
                      description
                        "The number of host addresses.";
                    }
    
                    leaf last-reporter {
                      type inet:ipv6-address;
                      description
                        "Address of the last host that has sent report
    to join the multicast group.";
                    }
    
                    list host {
                      if-feature explicit-tracking;
                      key "address";
                      description
                        "List of multicast membership hosts
    of the specific multicast source group.";
                      leaf address {
                        type inet:ipv6-address;
                        description
                          "Multicast membership host address.";
                      }
    
                      leaf filter-mode {
                        type filter-mode-type;
                        mandatory true;
                        description
                          "Filter mode for a multicast membership
    host may be either include or exclude.";
                      }
                    }  // list host
                  }  // list source
                }  // list group
    
                container interfaces {
                  config false;
                  description
                    "Contains the interfaces associated with the MLD snooping
    instance.";
                  list interface {
                    key "name";
                    description
                      "A list of interfaces associated with the MLD snooping
    instance.";
                    leaf name {
                      type if:interface-ref;
                      description
                        "The name of the interface.";
                    }
    
                    container statistics {
                      description
                        "The interface statistics for MLD snooping.";
                      leaf discontinuity-time {
                        type yang:date-and-time;
                        description
                          "The time on the most recent occasion at which
    any one or more of the statistic 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.";
                      }
    
                      container received {
                        description
                          "Number of received snooped MLD packets.";
                        leaf query-count {
                          type yang:counter64;
                          description
                            "The number of Multicast Listener Query messages.";
                          reference
                            "RFC 3810: Multicast Listener Discovery Version 2 (MLDv2)
                            for IPv6";
    
                        }
    
                        leaf report-v1-count {
                          type yang:counter64;
                          description
                            "The number of Version 1 Multicast Listener Report.";
                          reference
                            "RFC 2710: Multicast Listener Discovery (MLD) for IPv6";
    
                        }
    
                        leaf report-v2-count {
                          type yang:counter64;
                          description
                            "The number of Version 2 Multicast Listener Report.";
                          reference
                            "RFC 3810: Multicast Listener Discovery Version 2 (MLDv2)
                            for IPv6";
    
                        }
    
                        leaf done-count {
                          type yang:counter64;
                          description
                            "The number of Version 1 Multicast Listener Done.";
                          reference
                            "RFC 2710: Multicast Listener Discovery (MLD) for IPv6";
    
                        }
    
                        leaf pim-hello-count {
                          type yang:counter64;
                          description
                            "The number of PIM hello messages.";
                          reference
                            "RFC 7761: Protocol Independent Multicast - Sparse Mode
                            (PIM-SM): Protocol Specification (Revised)";
    
                        }
                      }  // container received
    
                      container sent {
                        description
                          "Number of sent snooped MLD packets.";
                        leaf query-count {
                          type yang:counter64;
                          description
                            "The number of Multicast Listener Query messages.";
                          reference
                            "RFC 3810: Multicast Listener Discovery Version 2 (MLDv2)
                            for IPv6";
    
                        }
    
                        leaf report-v1-count {
                          type yang:counter64;
                          description
                            "The number of Version 1 Multicast Listener Report.";
                          reference
                            "RFC 2710: Multicast Listener Discovery (MLD) for IPv6";
    
                        }
    
                        leaf report-v2-count {
                          type yang:counter64;
                          description
                            "The number of Version 2 Multicast Listener Report.";
                          reference
                            "RFC 3810: Multicast Listener Discovery Version 2 (MLDv2)
                            for IPv6";
    
                        }
    
                        leaf done-count {
                          type yang:counter64;
                          description
                            "The number of Version 1 Multicast Listener Done.";
                          reference
                            "RFC 2710: Multicast Listener Discovery (MLD) for IPv6";
    
                        }
    
                        leaf pim-hello-count {
                          type yang:counter64;
                          description
                            "The number of PIM hello messages.";
                          reference
                            "RFC 7761: Protocol Independent Multicast - Sparse Mode
                            (PIM-SM): Protocol Specification (Revised)";
    
                        }
                      }  // container sent
                    }  // container statistics
                  }  // list interface
                }  // container interfaces
    
                action clear-mld-snooping-groups {
                  if-feature action-clear-groups;
                  description
                    "Clear MLD snooping cache tables.";
                  input {
                    leaf group {
                      type union {
                        type enumeration {
                          enum "all-groups" {
                            value 0;
                            description
                              "All multicast group addresses.";
                          }
                        }
                        type rt-types:ipv6-multicast-group-address;
                      }
                      mandatory true;
                      description
                        "Multicast group IPv6 address.  If value 'all-groups'
    is specified, all MLD snooping group entries are
    cleared for the specified source address.";
                    }
    
                    leaf source {
                      type rt-types:ipv6-multicast-source-address;
                      mandatory true;
                      description
                        "Multicast source IPv6 address.  If value '*' is
    specified, all MLD snooping source-group tables
    are cleared.";
                    }
                  }
                }  // rpc clear-mld-snooping-groups
              }  // container mld-snooping-instance
    
              container igmp {
                if-feature feature-igmp;
                description
                  "IGMP configuration and operational state data.";
                container global {
                  description
                    "Global attributes.";
                  leaf enabled {
                    if-feature global-admin-enable;
                    type boolean;
                    default "true";
                    description
                      "When this grouping is used for IGMP, this leaf indicates
    whether IGMP is enabled ('true') or disabled ('false')
    in the routing instance.
    When this grouping is used for MLD, this leaf indicates
    whether MLD is enabled ('true') or disabled ('false')
    in the routing instance.";
                  }
    
                  leaf max-entries {
                    if-feature global-max-entries;
                    type uint32;
                    description
                      "When this grouping is used for IGMP, this leaf indicates
    the maximum number of entries in the IGMP instance.
    When this grouping is used for MLD, this leaf indicates
    the maximum number of entries in the MLD instance.
    If this leaf is not specified, the number of entries is not
    limited.";
                  }
    
                  leaf max-groups {
                    if-feature global-max-groups;
                    type uint32;
                    description
                      "When this grouping is used for IGMP, this leaf indicates
    the maximum number of groups in the IGMP instance.
    When this grouping is used for MLD, this leaf indicates
    the maximum number of groups in the MLD instance.
    If this leaf is not specified, the number of groups is not
    limited.";
                  }
    
                  leaf entries-count {
                    type uint32;
                    config false;
                    description
                      "When this grouping is used for IGMP, this leaf indicates
    the number of entries in the IGMP instance.
    When this grouping is used for MLD, this leaf indicates
    the number of entries in the MLD instance.";
                  }
    
                  leaf groups-count {
                    type uint32;
                    config false;
                    description
                      "When this grouping is used for IGMP, this leaf indicates
    the number of existing groups in the IGMP instance.
    When this grouping is used for MLD, this leaf indicates
    the number of existing groups in the MLD instance.";
                  }
    
                  container statistics {
                    config false;
                    description
                      "When this grouping is used for IGMP, this container contains
    the statistics for the IGMP instance.
    When this grouping is used for MLD, this leaf indicates
    the statistics for the MLD instance.";
                    leaf discontinuity-time {
                      type yang:date-and-time;
                      description
                        "The time on the most recent occasion at which any one
    or more of the statistic 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.";
                    }
    
                    container error {
                      description
                        "Statistics of errors.";
                      leaf total {
                        type yang:counter64;
                        description
                          "The number of total messages.";
                      }
    
                      leaf query {
                        type yang:counter64;
                        description
                          "The number of query messages.";
                      }
    
                      leaf report {
                        type yang:counter64;
                        description
                          "The number of report messages.";
                      }
    
                      leaf leave {
                        type yang:counter64;
                        description
                          "The number of leave messages.";
                      }
    
                      leaf checksum {
                        type yang:counter64;
                        description
                          "The number of checksum errors.";
                      }
    
                      leaf too-short {
                        type yang:counter64;
                        description
                          "The number of messages that are too short.";
                      }
                    }  // container error
    
                    container received {
                      description
                        "Statistics of received messages.";
                      leaf total {
                        type yang:counter64;
                        description
                          "The number of total messages.";
                      }
    
                      leaf query {
                        type yang:counter64;
                        description
                          "The number of query messages.";
                      }
    
                      leaf report {
                        type yang:counter64;
                        description
                          "The number of report messages.";
                      }
    
                      leaf leave {
                        type yang:counter64;
                        description
                          "The number of leave messages.";
                      }
                    }  // container received
    
                    container sent {
                      description
                        "Statistics of sent messages.";
                      leaf total {
                        type yang:counter64;
                        description
                          "The number of total messages.";
                      }
    
                      leaf query {
                        type yang:counter64;
                        description
                          "The number of query messages.";
                      }
    
                      leaf report {
                        type yang:counter64;
                        description
                          "The number of report messages.";
                      }
    
                      leaf leave {
                        type yang:counter64;
                        description
                          "The number of leave messages.";
                      }
                    }  // container sent
                  }  // container statistics
                }  // container global
    
                container interfaces {
                  description
                    "Containing a list of interfaces.";
                  leaf last-member-query-interval {
                    type uint16 {
                      range "1..1023";
                    }
                    units "seconds";
                    description
                      "When used in IGMP schema, this leaf indicates the Last
    Member Query Interval, which may be tuned to modify the
    leave latency of the network;
    when used in MLD schema, this leaf indicates the Last
    Listener Query Interval, which may be tuned to modify the
    leave latency of the network.
    This leaf is not applicable for version 1 of the IGMP.  For
    version 2 and version 3 of the IGMP, and for all versions of
    the MLD, the default value of this leaf is 1.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    reference
                      "Section 8.8 of RFC 2236: Internet Group Management Protocol,
                      Version 2.
                      Section 8.8 of RFC 3376: Internet Group Management Protocol,
                      Version 3.
                      Section 7.8 of RFC 2710: Multicast Listener Discovery (MLD)
                      for IPv6.
                      Section 9.8 of RFC 3810: Multicast Listener Discovery
                      Version 2 (MLDv2) for IPv6.";
    
                  }
    
                  leaf query-interval {
                    type uint16 {
                      range "1..31744";
                    }
                    units "seconds";
                    default "125";
                    description
                      "The Query Interval is the interval between General Queries
    sent by the Querier.  In RFC 3376, the Querier's Query
    Interval (QQI) is represented from the Querier's Query
    Interval Code (QQIC) in query message as follows:
    If QQIC < 128, QQI = QQIC.
    If QQIC >= 128, QQIC represents a floating-point value as
    follows:
     0 1 2 3 4 5 6 7
    +-+-+-+-+-+-+-+-+
    |1| exp | mant  |
    +-+-+-+-+-+-+-+-+
    QQI = (mant | 0x10) << (exp + 3).
    The maximum value of QQI is 31744.
    The default value is 125.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    reference
                      "Sections 4.1.7, 8.2, and 8.14.2 of RFC 3376: Internet Group
                      Management Protocol, Version 3";
    
                  }
    
                  leaf query-max-response-time {
                    type uint16 {
                      range "1..1023";
                    }
                    units "seconds";
                    default "10";
                    description
                      "Query maximum response time specifies the maximum time
    allowed before sending a responding report.
    The default value is 10.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    reference
                      "Sections 4.1.1, 8.3, and 8.14.3 of RFC 3376: Internet Group
                      Management Protocol, Version 3";
    
                  }
    
                  leaf require-router-alert {
                    if-feature intf-require-router-alert;
                    type boolean;
                    description
                      "Protocol packets should contain the router alert IP option.
    When this leaf is not configured, the server uses the
    following rules to determine the operational value of this
    leaf:
    if this grouping is used in IGMP schema and the value of the
    leaf 'version' is 1, the value 'false' is operationally used
    by the server;
    if this grouping is used in IGMP schema and the value of the
    leaf 'version' is 2 or 3, the value 'true' is operationally
    used by the server;
    if this grouping is used in MLD schema, the value 'true' is
    operationally used by the server.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                  }
    
                  leaf robustness-variable {
                    type uint8 {
                      range "1..7";
                    }
                    default "2";
                    description
                      "The Querier's Robustness Variable allows tuning for the
    expected packet loss on a network.
    The default value is 2.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    reference
                      "Sections 4.1.6, 8.1, and 8.14.1 of RFC 3376: Internet Group
                      Management Protocol, Version 3";
    
                  }
    
                  leaf version {
                    type uint8 {
                      range "1..3";
                    }
                    default "2";
                    description
                      "IGMP version.
    The default value is 2.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    reference
                      "RFC 1112: Host Extensions for IP Multicasting,
                       RFC 2236: Internet Group Management Protocol, Version 2,
                       RFC 3376: Internet Group Management Protocol, Version 3.";
    
                  }
    
                  leaf max-groups-per-interface {
                    if-feature intf-max-groups;
                    type uint32;
                    description
                      "The maximum number of groups associated with each interface.
    If this leaf is not specified, the number of groups is not
    limited.";
                  }
    
                  list interface {
                    key "interface-name";
                    description
                      "List of IGMP interfaces.";
                    leaf interface-name {
                      type if:interface-ref;
                      must
                        "/if:interfaces/if:interface[if:name = current()]/ip:ipv4" {
                        error-message
                          "The interface must have IPv4 configured, either enabled or disabled.";
                      }
                      description
                        "Reference to an entry in the global interface list.";
                    }
    
                    leaf last-member-query-interval {
                      type uint16 {
                        range "1..1023";
                      }
                      units "seconds";
                      must
                        "../version != 1 or (not(../version) and (../../version != 1 or not(../../version)))" {
                        error-message
                          "IGMPv1 does not support last-member-query-interval.";
                      }
                      description
                        "When used in IGMP schema, this leaf indicates the Last
    Member Query Interval, which may be tuned to modify the
    leave latency of the network;
    when used in MLD schema, this leaf indicates the Last
    Listener Query Interval, which may be tuned to modify the
    leave latency of the network.
    This leaf is not applicable for version 1 of the IGMP.  For
    version 2 and version 3 of the IGMP, and for all versions of
    the MLD, the default value of this leaf is 1.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                      reference
                        "Section 8.8 of RFC 2236: Internet Group Management Protocol,
                        Version 2.
                        Section 8.8 of RFC 3376: Internet Group Management Protocol,
                        Version 3.
                        Section 7.8 of RFC 2710: Multicast Listener Discovery (MLD)
                        for IPv6.
                        Section 9.8 of RFC 3810: Multicast Listener Discovery
                        Version 2 (MLDv2) for IPv6.";
    
                    }
    
                    leaf query-interval {
                      type uint16 {
                        range "1..31744";
                      }
                      units "seconds";
                      description
                        "The Query Interval is the interval between General Queries
    sent by the Querier.  In RFC 3376, the Querier's Query
    Interval (QQI) is represented from the Querier's Query
    Interval Code (QQIC) in query message as follows:
    If QQIC < 128, QQI = QQIC.
    If QQIC >= 128, QQIC represents a floating-point value as
    follows:
     0 1 2 3 4 5 6 7
    +-+-+-+-+-+-+-+-+
    |1| exp | mant  |
    +-+-+-+-+-+-+-+-+
    QQI = (mant | 0x10) << (exp + 3).
    The maximum value of QQI is 31744.
    The default value is 125.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                      reference
                        "Sections 4.1.7, 8.2, and 8.14.2 of RFC 3376: Internet Group
                        Management Protocol, Version 3";
    
                    }
    
                    leaf query-max-response-time {
                      type uint16 {
                        range "1..1023";
                      }
                      units "seconds";
                      description
                        "Query maximum response time specifies the maximum time
    allowed before sending a responding report.
    The default value is 10.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                      reference
                        "Sections 4.1.1, 8.3, and 8.14.3 of RFC 3376: Internet Group
                        Management Protocol, Version 3";
    
                    }
    
                    leaf require-router-alert {
                      if-feature intf-require-router-alert;
                      type boolean;
                      description
                        "Protocol packets should contain the router alert IP option.
    When this leaf is not configured, the server uses the
    following rules to determine the operational value of this
    leaf:
    if this grouping is used in IGMP schema and the value of the
    leaf 'version' is 1, the value 'false' is operationally used
    by the server;
    if this grouping is used in IGMP schema and the value of the
    leaf 'version' is 2 or 3, the value 'true' is operationally
    used by the server;
    if this grouping is used in MLD schema, the value 'true' is
    operationally used by the server.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    }
    
                    leaf robustness-variable {
                      type uint8 {
                        range "1..7";
                      }
                      description
                        "The Querier's Robustness Variable allows tuning for the
    expected packet loss on a network.
    The default value is 2.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                      reference
                        "Sections 4.1.6, 8.1, and 8.14.1 of RFC 3376: Internet Group
                        Management Protocol, Version 3";
    
                    }
    
                    leaf version {
                      type uint8 {
                        range "1..3";
                      }
                      description
                        "IGMP version.
    The default value is 2.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                      reference
                        "RFC 1112: Host Extensions for IP Multicasting,
                         RFC 2236: Internet Group Management Protocol, Version 2,
                         RFC 3376: Internet Group Management Protocol, Version 3.";
    
                    }
    
                    leaf enabled {
                      if-feature intf-admin-enable;
                      type boolean;
                      default "true";
                      description
                        "When this grouping is used for IGMP, this leaf indicates
    whether IGMP is enabled ('true') or disabled ('false')
    on the interface.
    When this grouping is used for MLD, this leaf indicates
    whether MLD is enabled ('true') or disabled ('false')
    on the interface.";
                    }
    
                    leaf group-policy {
                      type leafref {
                        path "/acl:acls/acl:acl/acl:name";
                      }
                      description
                        "When this grouping is used for IGMP, this leaf specifies
    the name of the access policy used to filter the
    IGMP membership.
    When this grouping is used for MLD, this leaf specifies
    the name of the access policy used to filter the
    MLD membership.
    The value space of this leaf is restricted to the existing
    policy instances defined by the referenced schema in
    RFC 8519.
    As specified by RFC 8519, the length of the name is between
    1 and 64; a device MAY further restrict the length of this
    name; space and special characters are not allowed.
    If this leaf is not specified, no policy is applied, and
    all packets received from this interface are accepted.";
                      reference
                        "RFC 8519: YANG Data Model for Network Access Control Lists
                        (ACLs)";
    
                    }
    
                    leaf immediate-leave {
                      if-feature intf-immediate-leave;
                      type empty;
                      description
                        "When this grouping is used for IGMP, the presence of this
    leaf requests IGMP to perform an immediate leave upon
    receiving an IGMPv2 leave message.
    If the router is IGMP-enabled, it sends an IGMP last member
    query with a last member query response time.  However, the
    router does not wait for the response time before it prunes
    the group.
    When this grouping is used for MLD, the presence of this
    leaf requests MLD to perform an immediate leave upon
    receiving an MLDv1 leave message.
    If the router is MLD-enabled, it sends an MLD last member
    query with a last member query response time.  However, the
    router does not wait for the response time before it prunes
    the group.";
                    }
    
                    leaf max-groups {
                      if-feature intf-max-groups;
                      type uint32;
                      description
                        "When this grouping is used for IGMP, this leaf indicates
    the maximum number of groups associated with the IGMP
    interface.
    When this grouping is used for MLD, this leaf indicates
    the maximum number of groups associated with the MLD
    interface.
    If this leaf is not specified, the number of groups is not
    limited.";
                    }
    
                    leaf max-group-sources {
                      if-feature intf-max-group-sources;
                      type uint32;
                      must
                        "../version = 3 or (not(../version) and (../../version = 3))" {
                        error-message
                          "The version of IGMP must be 3 to support the source-specific parameters.";
                      }
                      description
                        "The maximum number of group sources.
    If this leaf is not specified, the number of group sources
    is not limited.";
                    }
    
                    leaf source-policy {
                      if-feature intf-source-policy;
                      type leafref {
                        path "/acl:acls/acl:acl/acl:name";
                      }
                      must
                        "../version = 3 or (not(../version) and (../../version = 3))" {
                        error-message
                          "The version of IGMP must be 3 to support the source-specific parameters.";
                      }
                      description
                        "Name of the access policy used to filter sources.
    The value space of this leaf is restricted to the existing
    policy instances defined by the referenced schema in
    RFC 8519.
    As specified by RFC 8519, the length of the name is between
    1 and 64; a device MAY further restrict the length of this
    name; space and special characters are not allowed.
    If this leaf is not specified, no policy is applied, and
    all packets received from this interface are accepted.";
                    }
    
                    leaf verify-source-subnet {
                      if-feature intf-verify-source-subnet;
                      type empty;
                      description
                        "If present, the interface accepts packets with matching
    source IP subnet only.";
                    }
    
                    leaf explicit-tracking {
                      if-feature intf-explicit-tracking;
                      type empty;
                      must
                        "../version = 3 or (not(../version) and (../../version = 3))" {
                        error-message
                          "The version of IGMP must be 3 to support the explicit tracking function.";
                      }
                      description
                        "When this grouping is used for IGMP, the presence of this
    leaf enables an IGMP-based explicit membership tracking
    function for multicast routers and IGMP proxy devices
    supporting IGMPv3.
    When this grouping is used for MLD, the presence of this
    leaf enables an MLD-based explicit membership tracking
    function for multicast routers and MLD proxy devices
    supporting MLDv2.
    The explicit membership tracking function contributes to
    saving network resources and shortening leave latency.";
                      reference
                        "Section 3 of RFC 6636: Tuning the Behavior of the Internet
                        Group Management Protocol (IGMP) and Multicast Listener
                        Discovery (MLD) for Routers in Mobile and Wireless
                        Networks";
    
                    }
    
                    leaf lite-exclude-filter {
                      if-feature intf-lite-exclude-filter;
                      type empty;
                      must
                        "../version = 3 or (not(../version) and (../../version = 3))" {
                        error-message
                          "The version of IGMP must be 3 to support the simplified EXCLUDE filter in the Lightweight IGMPv3 protocol.";
                      }
                      description
                        "When this grouping is used for IGMP, the presence of this
    leaf enables the support of the simplified EXCLUDE filter
    in the Lightweight IGMPv3 protocol, which simplifies the
    standard versions of IGMPv3.
    When this grouping is used for MLD, the presence of this
    leaf enables the support of the simplified EXCLUDE filter
    in the Lightweight MLDv2 protocol, which simplifies the
    standard versions of MLDv2.";
                      reference
                        "RFC 5790: Lightweight Internet Group Management Protocol
                        Version 3 (IGMPv3) and Multicast Listener Discovery
                        Version 2 (MLDv2) Protocols";
    
                    }
    
                    leaf-list join-group {
                      if-feature intf-join-group;
                      type rt-types:ipv4-multicast-group-address;
                      description
                        "The router joins this multicast group on the interface.";
                    }
    
                    list ssm-map {
                      if-feature intf-ssm-map;
                      key "ssm-map-source-addr ssm-map-group-policy";
                      description
                        "The policy for (*,G) mapping to (S,G).";
                      leaf ssm-map-source-addr {
                        type ssm-map-ipv4-addr-type;
                        description
                          "Multicast source IPv4 address.";
                      }
    
                      leaf ssm-map-group-policy {
                        type string;
                        description
                          "Name of the policy used to define ssm-map rules.
    A device can restrict the length
    and value of this name, possibly space and special
    characters are not allowed.";
                      }
                    }  // list ssm-map
    
                    list static-group {
                      if-feature intf-static-group;
                      key "group-addr source-addr";
                      description
                        "A static multicast route, (*,G) or (S,G).
    The version of IGMP must be 3 to support (S,G).";
                      leaf group-addr {
                        type rt-types:ipv4-multicast-group-address;
                        description
                          "Multicast group IPv4 address.";
                      }
    
                      leaf source-addr {
                        type rt-types:ipv4-multicast-source-address;
                        description
                          "Multicast source IPv4 address.";
                      }
                    }  // list static-group
    
                    leaf oper-status {
                      type enumeration {
                        enum "up" {
                          value 0;
                          description
                            "Ready to pass packets.";
                        }
                        enum "down" {
                          value 1;
                          description
                            "The interface does not pass any packets.";
                        }
                      }
                      config false;
                      mandatory true;
                      description
                        "Indicates whether the operational state of the interface
    is up or down.";
                    }
    
                    leaf querier {
                      type inet:ipv4-address;
                      config false;
                      mandatory true;
                      description
                        "The querier address in the subnet.";
                    }
    
                    leaf-list joined-group {
                      if-feature intf-join-group;
                      type rt-types:ipv4-multicast-group-address;
                      config false;
                      description
                        "The routers that joined this multicast group.";
                    }
    
                    list group {
                      key "group-address";
                      config false;
                      description
                        "Multicast group membership information
    that joined on the interface.";
                      leaf group-address {
                        type rt-types:ipv4-multicast-group-address;
                        description
                          "Multicast group address.";
                      }
    
                      leaf expire {
                        type uint32;
                        units "seconds";
                        mandatory true;
                        description
                          "The time left before the multicast group state expires.";
                      }
    
                      leaf filter-mode {
                        type enumeration {
                          enum "include" {
                            value 0;
                            description
                              "In include mode, reception of packets sent
    to the specified multicast address is requested
    only from those IP source addresses listed in the
    source-list parameter";
                          }
                          enum "exclude" {
                            value 1;
                            description
                              "In exclude mode, reception of packets sent
    to the given multicast address is requested
    from all IP source addresses except those
    listed in the source-list parameter.";
                          }
                        }
                        mandatory true;
                        description
                          "Filter mode for a multicast group,
    may be either include or exclude.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        mandatory true;
                        description
                          "The elapsed time since the device created multicast group
    record.";
                      }
    
                      leaf last-reporter {
                        type inet:ipv4-address;
                        description
                          "The IPv4 address of the last host that has sent the
    report to join the multicast group.";
                      }
    
                      list source {
                        key "source-address";
                        description
                          "List of multicast source information
    of the multicast group.";
                        leaf source-address {
                          type inet:ipv4-address;
                          description
                            "Multicast source address in group record.";
                        }
    
                        leaf expire {
                          type uint32;
                          units "seconds";
                          mandatory true;
                          description
                            "The time left before multicast source-group state expires.";
                        }
    
                        leaf up-time {
                          type uint32;
                          units "seconds";
                          mandatory true;
                          description
                            "The elapsed time since the device created multicast
    source-group record.";
                        }
    
                        leaf host-count {
                          if-feature intf-explicit-tracking;
                          type uint32;
                          description
                            "The number of host addresses.";
                        }
    
                        leaf last-reporter {
                          type inet:ipv4-address;
                          description
                            "The IPv4 address of the last host that has sent the
    report to join the multicast source and group.";
                        }
    
                        list host {
                          if-feature intf-explicit-tracking;
                          key "host-address";
                          description
                            "List of hosts with the membership for the specific
    multicast source-group.";
                          leaf host-address {
                            type inet:ipv4-address;
                            description
                              "The IPv4 address of the host.";
                          }
    
                          leaf host-filter-mode {
                            type enumeration {
                              enum "include" {
                                value 0;
                                description
                                  "In include mode.";
                              }
                              enum "exclude" {
                                value 1;
                                description
                                  "In exclude mode.";
                              }
                            }
                            mandatory true;
                            description
                              "Filter mode for a multicast membership
    host may be either include or exclude.";
                          }
                        }  // list host
                      }  // list source
                    }  // list group
                  }  // list interface
                }  // container interfaces
    
                action clear-groups {
                  if-feature action-clear-groups;
                  description
                    "Clears the specified IGMP cache entries.";
                  input {
                    choice interface {
                      mandatory true;
                      description
                        "Indicates the interface(s) from which the cache
    entries are cleared.";
                      leaf interface-name {
                        type leafref {
                          path "/rt:routing/rt:control-plane-protocols/rt:control-plane-protocol/igmp-mld:igmp/igmp-mld:interfaces/igmp-mld:interface/igmp-mld:interface-name";
                        }
                        description
                          "Name of the IGMP interface.";
                      }
                      leaf all-interfaces {
                        type empty;
                        description
                          "IGMP groups from all interfaces are cleared.";
                      }
                    }  // choice interface
    
                    leaf group-address {
                      type union {
                        type enumeration {
                          enum "*" {
                            value 0;
                            description
                              "Any group address.";
                          }
                        }
                        type rt-types:ipv4-multicast-group-address;
                      }
                      mandatory true;
                      description
                        "Multicast group IPv4 address.
    If the value '*' is specified, all IGMP group entries
    are cleared.";
                    }
    
                    leaf source-address {
                      type rt-types:ipv4-multicast-source-address;
                      mandatory true;
                      description
                        "Multicast source IPv4 address.
    If the value '*' is specified, all IGMP source-group
    entries are cleared.";
                    }
                  }
                }  // rpc clear-groups
              }  // container igmp
    
              container mld {
                if-feature feature-mld;
                description
                  "MLD configuration and operational state data.";
                container global {
                  description
                    "Global attributes.";
                  leaf enabled {
                    if-feature global-admin-enable;
                    type boolean;
                    default "true";
                    description
                      "When this grouping is used for IGMP, this leaf indicates
    whether IGMP is enabled ('true') or disabled ('false')
    in the routing instance.
    When this grouping is used for MLD, this leaf indicates
    whether MLD is enabled ('true') or disabled ('false')
    in the routing instance.";
                  }
    
                  leaf max-entries {
                    if-feature global-max-entries;
                    type uint32;
                    description
                      "When this grouping is used for IGMP, this leaf indicates
    the maximum number of entries in the IGMP instance.
    When this grouping is used for MLD, this leaf indicates
    the maximum number of entries in the MLD instance.
    If this leaf is not specified, the number of entries is not
    limited.";
                  }
    
                  leaf max-groups {
                    if-feature global-max-groups;
                    type uint32;
                    description
                      "When this grouping is used for IGMP, this leaf indicates
    the maximum number of groups in the IGMP instance.
    When this grouping is used for MLD, this leaf indicates
    the maximum number of groups in the MLD instance.
    If this leaf is not specified, the number of groups is not
    limited.";
                  }
    
                  leaf entries-count {
                    type uint32;
                    config false;
                    description
                      "When this grouping is used for IGMP, this leaf indicates
    the number of entries in the IGMP instance.
    When this grouping is used for MLD, this leaf indicates
    the number of entries in the MLD instance.";
                  }
    
                  leaf groups-count {
                    type uint32;
                    config false;
                    description
                      "When this grouping is used for IGMP, this leaf indicates
    the number of existing groups in the IGMP instance.
    When this grouping is used for MLD, this leaf indicates
    the number of existing groups in the MLD instance.";
                  }
    
                  container statistics {
                    config false;
                    description
                      "When this grouping is used for IGMP, this container contains
    the statistics for the IGMP instance.
    When this grouping is used for MLD, this leaf indicates
    the statistics for the MLD instance.";
                    leaf discontinuity-time {
                      type yang:date-and-time;
                      description
                        "The time on the most recent occasion at which any one
    or more of the statistic 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.";
                    }
    
                    container error {
                      description
                        "Statistics of errors.";
                      leaf total {
                        type yang:counter64;
                        description
                          "The number of total messages.";
                      }
    
                      leaf query {
                        type yang:counter64;
                        description
                          "The number of query messages.";
                      }
    
                      leaf report {
                        type yang:counter64;
                        description
                          "The number of report messages.";
                      }
    
                      leaf leave {
                        type yang:counter64;
                        description
                          "The number of leave messages.";
                      }
    
                      leaf checksum {
                        type yang:counter64;
                        description
                          "The number of checksum errors.";
                      }
    
                      leaf too-short {
                        type yang:counter64;
                        description
                          "The number of messages that are too short.";
                      }
                    }  // container error
    
                    container received {
                      description
                        "Statistics of received messages.";
                      leaf total {
                        type yang:counter64;
                        description
                          "The number of total messages.";
                      }
    
                      leaf query {
                        type yang:counter64;
                        description
                          "The number of query messages.";
                      }
    
                      leaf report {
                        type yang:counter64;
                        description
                          "The number of report messages.";
                      }
    
                      leaf leave {
                        type yang:counter64;
                        description
                          "The number of leave messages.";
                      }
                    }  // container received
    
                    container sent {
                      description
                        "Statistics of sent messages.";
                      leaf total {
                        type yang:counter64;
                        description
                          "The number of total messages.";
                      }
    
                      leaf query {
                        type yang:counter64;
                        description
                          "The number of query messages.";
                      }
    
                      leaf report {
                        type yang:counter64;
                        description
                          "The number of report messages.";
                      }
    
                      leaf leave {
                        type yang:counter64;
                        description
                          "The number of leave messages.";
                      }
                    }  // container sent
                  }  // container statistics
                }  // container global
    
                container interfaces {
                  description
                    "Containing a list of interfaces.";
                  leaf last-member-query-interval {
                    type uint16 {
                      range "1..1023";
                    }
                    units "seconds";
                    default "1";
                    description
                      "When used in IGMP schema, this leaf indicates the Last
    Member Query Interval, which may be tuned to modify the
    leave latency of the network;
    when used in MLD schema, this leaf indicates the Last
    Listener Query Interval, which may be tuned to modify the
    leave latency of the network.
    This leaf is not applicable for version 1 of the IGMP.  For
    version 2 and version 3 of the IGMP, and for all versions of
    the MLD, the default value of this leaf is 1.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    reference
                      "Section 8.8 of RFC 2236: Internet Group Management Protocol,
                      Version 2.
                      Section 8.8 of RFC 3376: Internet Group Management Protocol,
                      Version 3.
                      Section 7.8 of RFC 2710: Multicast Listener Discovery (MLD)
                      for IPv6.
                      Section 9.8 of RFC 3810: Multicast Listener Discovery
                      Version 2 (MLDv2) for IPv6.";
    
                  }
    
                  leaf query-interval {
                    type uint16 {
                      range "1..31744";
                    }
                    units "seconds";
                    default "125";
                    description
                      "The Query Interval is the interval between General Queries
    sent by the Querier.  In RFC 3376, the Querier's Query
    Interval (QQI) is represented from the Querier's Query
    Interval Code (QQIC) in query message as follows:
    If QQIC < 128, QQI = QQIC.
    If QQIC >= 128, QQIC represents a floating-point value as
    follows:
     0 1 2 3 4 5 6 7
    +-+-+-+-+-+-+-+-+
    |1| exp | mant  |
    +-+-+-+-+-+-+-+-+
    QQI = (mant | 0x10) << (exp + 3).
    The maximum value of QQI is 31744.
    The default value is 125.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    reference
                      "Sections 4.1.7, 8.2, and 8.14.2 of RFC 3376: Internet Group
                      Management Protocol, Version 3";
    
                  }
    
                  leaf query-max-response-time {
                    type uint16 {
                      range "1..1023";
                    }
                    units "seconds";
                    default "10";
                    description
                      "Query maximum response time specifies the maximum time
    allowed before sending a responding report.
    The default value is 10.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    reference
                      "Sections 4.1.1, 8.3, and 8.14.3 of RFC 3376: Internet Group
                      Management Protocol, Version 3";
    
                  }
    
                  leaf require-router-alert {
                    if-feature intf-require-router-alert;
                    type boolean;
                    default "true";
                    description
                      "Protocol packets should contain the router alert IP option.
    When this leaf is not configured, the server uses the
    following rules to determine the operational value of this
    leaf:
    if this grouping is used in IGMP schema and the value of the
    leaf 'version' is 1, the value 'false' is operationally used
    by the server;
    if this grouping is used in IGMP schema and the value of the
    leaf 'version' is 2 or 3, the value 'true' is operationally
    used by the server;
    if this grouping is used in MLD schema, the value 'true' is
    operationally used by the server.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                  }
    
                  leaf robustness-variable {
                    type uint8 {
                      range "1..7";
                    }
                    default "2";
                    description
                      "The Querier's Robustness Variable allows tuning for the
    expected packet loss on a network.
    The default value is 2.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    reference
                      "Sections 4.1.6, 8.1, and 8.14.1 of RFC 3376: Internet Group
                      Management Protocol, Version 3";
    
                  }
    
                  leaf version {
                    type uint8 {
                      range "1..2";
                    }
                    default "2";
                    description
                      "MLD version.
    The default value is 2.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    reference
                      "RFC 2710: Multicast Listener Discovery (MLD) for IPv6,
                       RFC 3810: Multicast Listener Discovery Version 2 (MLDv2)
                      for IPv6.";
    
                  }
    
                  leaf max-groups-per-interface {
                    if-feature intf-max-groups;
                    type uint32;
                    description
                      "The maximum number of groups associated with each interface.
    If this leaf is not specified, the number of groups is not
    limited.";
                  }
    
                  list interface {
                    key "interface-name";
                    description
                      "List of MLD interfaces.";
                    leaf interface-name {
                      type if:interface-ref;
                      must
                        "/if:interfaces/if:interface[if:name = current()]/ip:ipv6" {
                        error-message
                          "The interface must have IPv6 configured, either enabled or disabled.";
                      }
                      description
                        "Reference to an entry in the global interface list.";
                    }
    
                    leaf last-member-query-interval {
                      type uint16 {
                        range "1..1023";
                      }
                      units "seconds";
                      description
                        "When used in IGMP schema, this leaf indicates the Last
    Member Query Interval, which may be tuned to modify the
    leave latency of the network;
    when used in MLD schema, this leaf indicates the Last
    Listener Query Interval, which may be tuned to modify the
    leave latency of the network.
    This leaf is not applicable for version 1 of the IGMP.  For
    version 2 and version 3 of the IGMP, and for all versions of
    the MLD, the default value of this leaf is 1.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                      reference
                        "Section 8.8 of RFC 2236: Internet Group Management Protocol,
                        Version 2.
                        Section 8.8 of RFC 3376: Internet Group Management Protocol,
                        Version 3.
                        Section 7.8 of RFC 2710: Multicast Listener Discovery (MLD)
                        for IPv6.
                        Section 9.8 of RFC 3810: Multicast Listener Discovery
                        Version 2 (MLDv2) for IPv6.";
    
                    }
    
                    leaf query-interval {
                      type uint16 {
                        range "1..31744";
                      }
                      units "seconds";
                      description
                        "The Query Interval is the interval between General Queries
    sent by the Querier.  In RFC 3376, the Querier's Query
    Interval (QQI) is represented from the Querier's Query
    Interval Code (QQIC) in query message as follows:
    If QQIC < 128, QQI = QQIC.
    If QQIC >= 128, QQIC represents a floating-point value as
    follows:
     0 1 2 3 4 5 6 7
    +-+-+-+-+-+-+-+-+
    |1| exp | mant  |
    +-+-+-+-+-+-+-+-+
    QQI = (mant | 0x10) << (exp + 3).
    The maximum value of QQI is 31744.
    The default value is 125.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                      reference
                        "Sections 4.1.7, 8.2, and 8.14.2 of RFC 3376: Internet Group
                        Management Protocol, Version 3";
    
                    }
    
                    leaf query-max-response-time {
                      type uint16 {
                        range "1..1023";
                      }
                      units "seconds";
                      description
                        "Query maximum response time specifies the maximum time
    allowed before sending a responding report.
    The default value is 10.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                      reference
                        "Sections 4.1.1, 8.3, and 8.14.3 of RFC 3376: Internet Group
                        Management Protocol, Version 3";
    
                    }
    
                    leaf require-router-alert {
                      if-feature intf-require-router-alert;
                      type boolean;
                      description
                        "Protocol packets should contain the router alert IP option.
    When this leaf is not configured, the server uses the
    following rules to determine the operational value of this
    leaf:
    if this grouping is used in IGMP schema and the value of the
    leaf 'version' is 1, the value 'false' is operationally used
    by the server;
    if this grouping is used in IGMP schema and the value of the
    leaf 'version' is 2 or 3, the value 'true' is operationally
    used by the server;
    if this grouping is used in MLD schema, the value 'true' is
    operationally used by the server.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                    }
    
                    leaf robustness-variable {
                      type uint8 {
                        range "1..7";
                      }
                      description
                        "The Querier's Robustness Variable allows tuning for the
    expected packet loss on a network.
    The default value is 2.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                      reference
                        "Sections 4.1.6, 8.1, and 8.14.1 of RFC 3376: Internet Group
                        Management Protocol, Version 3";
    
                    }
    
                    leaf version {
                      type uint8 {
                        range "1..2";
                      }
                      description
                        "MLD version.
    The default value is 2.
    This leaf may be configured at the interface level or the
    interface-global level, with precedence given to the value
    at the interface level.  If the leaf is not configured at
    either level, the default value is used.";
                      reference
                        "RFC 2710: Multicast Listener Discovery (MLD) for IPv6,
                         RFC 3810: Multicast Listener Discovery Version 2 (MLDv2)
                        for IPv6.";
    
                    }
    
                    leaf enabled {
                      if-feature intf-admin-enable;
                      type boolean;
                      default "true";
                      description
                        "When this grouping is used for IGMP, this leaf indicates
    whether IGMP is enabled ('true') or disabled ('false')
    on the interface.
    When this grouping is used for MLD, this leaf indicates
    whether MLD is enabled ('true') or disabled ('false')
    on the interface.";
                    }
    
                    leaf group-policy {
                      type leafref {
                        path "/acl:acls/acl:acl/acl:name";
                      }
                      description
                        "When this grouping is used for IGMP, this leaf specifies
    the name of the access policy used to filter the
    IGMP membership.
    When this grouping is used for MLD, this leaf specifies
    the name of the access policy used to filter the
    MLD membership.
    The value space of this leaf is restricted to the existing
    policy instances defined by the referenced schema in
    RFC 8519.
    As specified by RFC 8519, the length of the name is between
    1 and 64; a device MAY further restrict the length of this
    name; space and special characters are not allowed.
    If this leaf is not specified, no policy is applied, and
    all packets received from this interface are accepted.";
                      reference
                        "RFC 8519: YANG Data Model for Network Access Control Lists
                        (ACLs)";
    
                    }
    
                    leaf immediate-leave {
                      if-feature intf-immediate-leave;
                      type empty;
                      description
                        "When this grouping is used for IGMP, the presence of this
    leaf requests IGMP to perform an immediate leave upon
    receiving an IGMPv2 leave message.
    If the router is IGMP-enabled, it sends an IGMP last member
    query with a last member query response time.  However, the
    router does not wait for the response time before it prunes
    the group.
    When this grouping is used for MLD, the presence of this
    leaf requests MLD to perform an immediate leave upon
    receiving an MLDv1 leave message.
    If the router is MLD-enabled, it sends an MLD last member
    query with a last member query response time.  However, the
    router does not wait for the response time before it prunes
    the group.";
                    }
    
                    leaf max-groups {
                      if-feature intf-max-groups;
                      type uint32;
                      description
                        "When this grouping is used for IGMP, this leaf indicates
    the maximum number of groups associated with the IGMP
    interface.
    When this grouping is used for MLD, this leaf indicates
    the maximum number of groups associated with the MLD
    interface.
    If this leaf is not specified, the number of groups is not
    limited.";
                    }
    
                    leaf max-group-sources {
                      if-feature intf-max-group-sources;
                      type uint32;
                      must
                        "../version = 2 or (not(../version) and (../../version = 2 or not(../../version)))" {
                        error-message
                          "The version of MLD must be 2 to support the source-specific parameters.";
                      }
                      description
                        "The maximum number of group sources.
    If this leaf is not specified, the number of group sources
    is not limited.";
                    }
    
                    leaf source-policy {
                      if-feature intf-source-policy;
                      type leafref {
                        path "/acl:acls/acl:acl/acl:name";
                      }
                      must
                        "../version = 2 or (not(../version) and (../../version = 2 or not(../../version)))" {
                        error-message
                          "The version of MLD must be 2 to support the source-specific parameters.";
                      }
                      description
                        "Name of the access policy used to filter sources.
    The value space of this leaf is restricted to the existing
    policy instances defined by the referenced schema in
    RFC 8519.
    As specified by RFC 8519, the length of the name is between
    1 and 64; a device MAY further restrict the length of this
    name; space and special characters are not allowed.
    If this leaf is not specified, no policy is applied, and
    all packets received from this interface are accepted.";
                    }
    
                    leaf verify-source-subnet {
                      if-feature intf-verify-source-subnet;
                      type empty;
                      description
                        "If present, the interface accepts packets with matching
    source IP subnet only.";
                    }
    
                    leaf explicit-tracking {
                      if-feature intf-explicit-tracking;
                      type empty;
                      must
                        "../version = 2 or (not(../version) and (../../version = 2 or not(../../version)))" {
                        error-message
                          "The version of MLD must be 2 to support the explicit tracking function.";
                      }
                      description
                        "When this grouping is used for IGMP, the presence of this
    leaf enables an IGMP-based explicit membership tracking
    function for multicast routers and IGMP proxy devices
    supporting IGMPv3.
    When this grouping is used for MLD, the presence of this
    leaf enables an MLD-based explicit membership tracking
    function for multicast routers and MLD proxy devices
    supporting MLDv2.
    The explicit membership tracking function contributes to
    saving network resources and shortening leave latency.";
                      reference
                        "Section 3 of RFC 6636: Tuning the Behavior of the Internet
                        Group Management Protocol (IGMP) and Multicast Listener
                        Discovery (MLD) for Routers in Mobile and Wireless
                        Networks";
    
                    }
    
                    leaf lite-exclude-filter {
                      if-feature intf-lite-exclude-filter;
                      type empty;
                      must
                        "../version = 2 or (not(../version) and (../../version = 2 or not(../../version)))" {
                        error-message
                          "The version of MLD must be 2 to support the simplified EXCLUDE filter in the Lightweight MLDv2 protocol.";
                      }
                      description
                        "When this grouping is used for IGMP, the presence of this
    leaf enables the support of the simplified EXCLUDE filter
    in the Lightweight IGMPv3 protocol, which simplifies the
    standard versions of IGMPv3.
    When this grouping is used for MLD, the presence of this
    leaf enables the support of the simplified EXCLUDE filter
    in the Lightweight MLDv2 protocol, which simplifies the
    standard versions of MLDv2.";
                      reference
                        "RFC 5790: Lightweight Internet Group Management Protocol
                        Version 3 (IGMPv3) and Multicast Listener Discovery
                        Version 2 (MLDv2) Protocols";
    
                    }
    
                    leaf-list join-group {
                      if-feature intf-join-group;
                      type rt-types:ipv6-multicast-group-address;
                      description
                        "The router joins this multicast group on the interface.";
                    }
    
                    list ssm-map {
                      if-feature intf-ssm-map;
                      key "ssm-map-source-addr ssm-map-group-policy";
                      description
                        "The policy for (*,G) mapping to (S,G).";
                      leaf ssm-map-source-addr {
                        type ssm-map-ipv6-addr-type;
                        description
                          "Multicast source IPv6 address.";
                      }
    
                      leaf ssm-map-group-policy {
                        type string;
                        description
                          "Name of the policy used to define ssm-map rules.
    A device can restrict the length
    and value of this name, possibly space and special
    characters are not allowed.";
                      }
                    }  // list ssm-map
    
                    list static-group {
                      if-feature intf-static-group;
                      key "group-addr source-addr";
                      description
                        "A static multicast route, (*,G) or (S,G).
    The version of MLD must be 2 to support (S,G).";
                      leaf group-addr {
                        type rt-types:ipv6-multicast-group-address;
                        description
                          "Multicast group IPv6 address.";
                      }
    
                      leaf source-addr {
                        type rt-types:ipv6-multicast-source-address;
                        description
                          "Multicast source IPv6 address.";
                      }
                    }  // list static-group
    
                    leaf oper-status {
                      type enumeration {
                        enum "up" {
                          value 0;
                          description
                            "Ready to pass packets.";
                        }
                        enum "down" {
                          value 1;
                          description
                            "The interface does not pass any packets.";
                        }
                      }
                      config false;
                      mandatory true;
                      description
                        "Indicates whether the operational state of the interface
    is up or down.";
                    }
    
                    leaf querier {
                      type inet:ipv6-address;
                      config false;
                      mandatory true;
                      description
                        "The querier address in the subnet.";
                    }
    
                    leaf-list joined-group {
                      if-feature intf-join-group;
                      type rt-types:ipv6-multicast-group-address;
                      config false;
                      description
                        "The routers that joined this multicast group.";
                    }
    
                    list group {
                      key "group-address";
                      config false;
                      description
                        "Multicast group membership information
    that joined on the interface.";
                      leaf group-address {
                        type rt-types:ipv6-multicast-group-address;
                        description
                          "Multicast group address.";
                      }
    
                      leaf expire {
                        type uint32;
                        units "seconds";
                        mandatory true;
                        description
                          "The time left before the multicast group state expires.";
                      }
    
                      leaf filter-mode {
                        type enumeration {
                          enum "include" {
                            value 0;
                            description
                              "In include mode, reception of packets sent
    to the specified multicast address is requested
    only from those IP source addresses listed in the
    source-list parameter";
                          }
                          enum "exclude" {
                            value 1;
                            description
                              "In exclude mode, reception of packets sent
    to the given multicast address is requested
    from all IP source addresses except those
    listed in the source-list parameter.";
                          }
                        }
                        mandatory true;
                        description
                          "Filter mode for a multicast group,
    may be either include or exclude.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        mandatory true;
                        description
                          "The elapsed time since the device created multicast group
    record.";
                      }
    
                      leaf last-reporter {
                        type inet:ipv6-address;
                        description
                          "The IPv6 address of the last host that has sent the
    report to join the multicast group.";
                      }
    
                      list source {
                        key "source-address";
                        description
                          "List of multicast sources of the multicast group.";
                        leaf source-address {
                          type inet:ipv6-address;
                          description
                            "Multicast source address in group record.";
                        }
    
                        leaf expire {
                          type uint32;
                          units "seconds";
                          mandatory true;
                          description
                            "The time left before multicast source-group state expires.";
                        }
    
                        leaf up-time {
                          type uint32;
                          units "seconds";
                          mandatory true;
                          description
                            "The elapsed time since the device created multicast
    source-group record.";
                        }
    
                        leaf host-count {
                          if-feature intf-explicit-tracking;
                          type uint32;
                          description
                            "The number of host addresses.";
                        }
    
                        leaf last-reporter {
                          type inet:ipv6-address;
                          description
                            "The IPv6 address of the last host that has sent the
    report to join the multicast source and group.";
                        }
    
                        list host {
                          if-feature intf-explicit-tracking;
                          key "host-address";
                          description
                            "List of hosts with the membership for the specific
    multicast source-group.";
                          leaf host-address {
                            type inet:ipv6-address;
                            description
                              "The IPv6 address of the host.";
                          }
    
                          leaf host-filter-mode {
                            type enumeration {
                              enum "include" {
                                value 0;
                                description
                                  "In include mode.";
                              }
                              enum "exclude" {
                                value 1;
                                description
                                  "In exclude mode.";
                              }
                            }
                            mandatory true;
                            description
                              "Filter mode for a multicast membership
    host may be either include or exclude.";
                          }
                        }  // list host
                      }  // list source
                    }  // list group
                  }  // list interface
                }  // container interfaces
    
                action clear-groups {
                  if-feature action-clear-groups;
                  description
                    "Clears the specified MLD cache entries.";
                  input {
                    choice interface {
                      mandatory true;
                      description
                        "Indicates the interface(s) from which the cache
    entries are cleared.";
                      leaf interface-name {
                        type leafref {
                          path "/rt:routing/rt:control-plane-protocols/rt:control-plane-protocol/igmp-mld:mld/igmp-mld:interfaces/igmp-mld:interface/igmp-mld:interface-name";
                        }
                        description
                          "Name of the MLD interface.";
                      }
                      leaf all-interfaces {
                        type empty;
                        description
                          "MLD groups from all interfaces are cleared.";
                      }
                    }  // choice interface
    
                    leaf group-address {
                      type union {
                        type enumeration {
                          enum "*" {
                            value 0;
                            description
                              "Any group address.";
                          }
                        }
                        type rt-types:ipv6-multicast-group-address;
                      }
                      description
                        "Multicast group IPv6 address.
    If the value '*' is specified, all MLD group entries
    are cleared.";
                    }
    
                    leaf source-address {
                      type rt-types:ipv6-multicast-source-address;
                      description
                        "Multicast source IPv6 address.
    If the value '*' is specified, all MLD source-group
    entries are cleared.";
                    }
                  }
                }  // rpc clear-groups
              }  // container mld
    
              container bfd {
                description
                  "BFD top-level container.";
                container summary {
                  config false;
                  description
                    "BFD session statistics summary.";
                  leaf number-of-sessions {
                    type yang:gauge32;
                    description
                      "Number of BFD sessions.";
                  }
    
                  leaf number-of-sessions-up {
                    type yang:gauge32;
                    description
                      "Number of BFD sessions currently in the 'Up' state
    (as defined in RFC 5880).";
                  }
    
                  leaf number-of-sessions-down {
                    type yang:gauge32;
                    description
                      "Number of BFD sessions currently in the 'Down' or 'Init'
    state but not 'adminDown' (as defined in RFC 5880).";
                  }
    
                  leaf number-of-sessions-admin-down {
                    type yang:gauge32;
                    description
                      "Number of BFD sessions currently in the 'adminDown' state
    (as defined in RFC 5880).";
                  }
                }  // container summary
              }  // container bfd
            }  // list control-plane-protocol
    
            container pim {
              presence
                "Enables the PIM protocol.";
              description
                "PIM configuration and operational data.";
              container graceful-restart {
                description
                  "Container of graceful restart attributes.";
                leaf enabled {
                  type boolean;
                  default "false";
                  description
                    "Enable or disable graceful restart.";
                }
    
                leaf duration {
                  type uint16;
                  units "seconds";
                  default "60";
                  description
                    "Maximum time for graceful restart to finish.";
                }
              }  // container graceful-restart
    
              list address-family {
                key "address-family";
                description
                  "Each list entry for one address family.";
                leaf address-family {
                  type identityref {
                    base address-family;
                  }
                  mandatory true;
                  description "Address family.";
                }
    
                container graceful-restart {
                  description
                    "Container of graceful restart attributes.";
                  leaf enabled {
                    type boolean;
                    default "false";
                    description
                      "Enable or disable graceful restart.";
                  }
    
                  leaf duration {
                    type uint16;
                    units "seconds";
                    default "60";
                    description
                      "Maximum time for graceful restart to finish.";
                  }
                }  // container graceful-restart
    
                container statistics {
                  config false;
                  description
                    "A container defining statistics attributes.";
                  leaf discontinuity-time {
                    type yang:date-and-time;
                    description
                      "The time on the most recent occasion at which any one
    or more of the statistic 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.";
                  }
    
                  container error {
                    description
                      "Containing error statistics.";
                    leaf assert {
                      type yang:counter64;
                      description
                        "The number of Assert messages, with the message Type
    of 5 in RFC3973 and RFC7761.";
                    }
    
                    leaf bsr {
                      type yang:counter64;
                      description
                        "The number of Bootstrap messages, with the message Type
    of 4 in RFC3973 and RFC7761.";
                    }
    
                    leaf candidate-rp-advertisement {
                      type yang:counter64;
                      description
                        "The number of Candidate RP Advertisement messages, with the
    message Type of 8 in RFC3973 and RFC7761.";
                    }
    
                    leaf df-election {
                      type yang:counter64;
                      description
                        "The number of DF (Designated Forwarder) Election messages,
    with the message Type of 10 in RFC5015.";
                    }
    
                    leaf graft {
                      type yang:counter64;
                      description
                        "The number of Graft messages, with the message Type
    of 6 in RFC3973 and RFC7761.";
                    }
    
                    leaf graft-ack {
                      type yang:counter64;
                      description
                        "The number of Graft-Ack messages, with the message Type
    of 7 in RFC3973 and RFC7761.";
                    }
    
                    leaf hello {
                      type yang:counter64;
                      description
                        "The number of Hello messages, with the message Type
    of 0 in RFC3973 and RFC7761.";
                    }
    
                    leaf join-prune {
                      type yang:counter64;
                      description
                        "The number of Join/Prune messages, with the message Type
    of 3 in RFC3973 and RFC7761.";
                    }
    
                    leaf register {
                      type yang:counter64;
                      description
                        "The number of Register messages, with the message Type
    of 1 in RFC3973 and RFC7761.";
                    }
    
                    leaf register-stop {
                      type yang:counter64;
                      description
                        "The number of Register Stop messages, with the message Type
    of 2 in RFC3973 and RFC7761.";
                    }
    
                    leaf state-refresh {
                      type yang:counter64;
                      description
                        "The number of State Refresh messages, with the message Type
    of 9 in RFC3973.";
                    }
    
                    leaf checksum {
                      type yang:counter64;
                      description
                        "The number of PIM messages that were passed to PIM
    and contained checksum errors.";
                    }
    
                    leaf format {
                      type yang:counter64;
                      description
                        "The number of PIM messages that passed checksum
    validation but contained format errors, including
    the errors such as PIM Version, Type, and message
    length.";
                    }
                  }  // container error
    
                  container queue {
                    description
                      "Containing queue statistics.";
                    leaf size {
                      type uint32;
                      description
                        "The size of the input queue.";
                    }
    
                    leaf overflow {
                      type yang:counter32;
                      description
                        "The number of the input queue overflows.";
                    }
                  }  // container queue
    
                  container received {
                    description
                      "Containing statistics of received messages.";
                    leaf assert {
                      type yang:counter64;
                      description
                        "The number of Assert messages, with the message Type
    of 5 in RFC3973 and RFC7761.";
                    }
    
                    leaf bsr {
                      type yang:counter64;
                      description
                        "The number of Bootstrap messages, with the message Type
    of 4 in RFC3973 and RFC7761.";
                    }
    
                    leaf candidate-rp-advertisement {
                      type yang:counter64;
                      description
                        "The number of Candidate RP Advertisement messages, with the
    message Type of 8 in RFC3973 and RFC7761.";
                    }
    
                    leaf df-election {
                      type yang:counter64;
                      description
                        "The number of DF (Designated Forwarder) Election messages,
    with the message Type of 10 in RFC5015.";
                    }
    
                    leaf graft {
                      type yang:counter64;
                      description
                        "The number of Graft messages, with the message Type
    of 6 in RFC3973 and RFC7761.";
                    }
    
                    leaf graft-ack {
                      type yang:counter64;
                      description
                        "The number of Graft-Ack messages, with the message Type
    of 7 in RFC3973 and RFC7761.";
                    }
    
                    leaf hello {
                      type yang:counter64;
                      description
                        "The number of Hello messages, with the message Type
    of 0 in RFC3973 and RFC7761.";
                    }
    
                    leaf join-prune {
                      type yang:counter64;
                      description
                        "The number of Join/Prune messages, with the message Type
    of 3 in RFC3973 and RFC7761.";
                    }
    
                    leaf register {
                      type yang:counter64;
                      description
                        "The number of Register messages, with the message Type
    of 1 in RFC3973 and RFC7761.";
                    }
    
                    leaf register-stop {
                      type yang:counter64;
                      description
                        "The number of Register Stop messages, with the message Type
    of 2 in RFC3973 and RFC7761.";
                    }
    
                    leaf state-refresh {
                      type yang:counter64;
                      description
                        "The number of State Refresh messages, with the message Type
    of 9 in RFC3973.";
                    }
                  }  // container received
    
                  container sent {
                    description
                      "Containing statistics of sent messages.";
                    leaf assert {
                      type yang:counter64;
                      description
                        "The number of Assert messages, with the message Type
    of 5 in RFC3973 and RFC7761.";
                    }
    
                    leaf bsr {
                      type yang:counter64;
                      description
                        "The number of Bootstrap messages, with the message Type
    of 4 in RFC3973 and RFC7761.";
                    }
    
                    leaf candidate-rp-advertisement {
                      type yang:counter64;
                      description
                        "The number of Candidate RP Advertisement messages, with the
    message Type of 8 in RFC3973 and RFC7761.";
                    }
    
                    leaf df-election {
                      type yang:counter64;
                      description
                        "The number of DF (Designated Forwarder) Election messages,
    with the message Type of 10 in RFC5015.";
                    }
    
                    leaf graft {
                      type yang:counter64;
                      description
                        "The number of Graft messages, with the message Type
    of 6 in RFC3973 and RFC7761.";
                    }
    
                    leaf graft-ack {
                      type yang:counter64;
                      description
                        "The number of Graft-Ack messages, with the message Type
    of 7 in RFC3973 and RFC7761.";
                    }
    
                    leaf hello {
                      type yang:counter64;
                      description
                        "The number of Hello messages, with the message Type
    of 0 in RFC3973 and RFC7761.";
                    }
    
                    leaf join-prune {
                      type yang:counter64;
                      description
                        "The number of Join/Prune messages, with the message Type
    of 3 in RFC3973 and RFC7761.";
                    }
    
                    leaf register {
                      type yang:counter64;
                      description
                        "The number of Register messages, with the message Type
    of 1 in RFC3973 and RFC7761.";
                    }
    
                    leaf register-stop {
                      type yang:counter64;
                      description
                        "The number of Register Stop messages, with the message Type
    of 2 in RFC3973 and RFC7761.";
                    }
    
                    leaf state-refresh {
                      type yang:counter64;
                      description
                        "The number of State Refresh messages, with the message Type
    of 9 in RFC3973.";
                    }
                  }  // container sent
                }  // container statistics
    
                container topology-tree-info {
                  config false;
                  description
                    "Containing topology tree information.";
                  list ipv4-route {
                    when
                      "../../address-family = 'rt:ipv4'" {
                      description
                        "Only applicable to IPv4 address family.";
                    }
                    key "group source-address is-rpt";
                    description
                      "A list of IPv4 routes.";
                    leaf group {
                      type rt-types:ipv4-multicast-group-address;
                      description
                        "Group address.";
                    }
    
                    leaf source-address {
                      type rt-types:ipv4-multicast-source-address;
                      description
                        "Source address.";
                    }
    
                    leaf is-rpt {
                      type boolean;
                      description
                        "'true' if the tree is RPT (Rendezvous-Point Tree).";
                    }
    
                    leaf expiration {
                      type rt-types:timer-value-seconds16;
                      description
                        "When the route will expire.";
                    }
    
                    leaf incoming-interface {
                      type if:interface-ref;
                      description
                        "Reference to an entry in the global interface
    list.";
                    }
    
                    leaf is-spt {
                      type boolean;
                      description
                        "'true' if SPT (Shortest Path Tree) bit is set to indicate
    forwarding is taking place on the (S,G) Shortest Path Tree
    (SPT).";
                      reference
                        "RFC7761: Protocol Independent Multicast - Sparse Mode
                        (PIM-SM): Protocol Specification (Revised). Sec. 4.1.3.";
    
                    }
    
                    leaf mode {
                      type identityref {
                        base pim-mode;
                      }
                      description "PIM mode.";
                    }
    
                    leaf msdp-learned {
                      type boolean;
                      description
                        "'true' if route is learned from MSDP (Multicast Source
     Discovery Protocol).";
                    }
    
                    leaf rp-address {
                      type inet:ip-address;
                      description
                        "RP (Rendezvous Point) address.";
                    }
    
                    leaf rpf-neighbor {
                      type inet:ip-address;
                      description
                        "RPF (Reverse Path Forwarding) neighbor address.";
                    }
    
                    leaf up-time {
                      type rt-types:timeticks64;
                      description
                        "The number of time ticks (hundredths of a second) since the
    route last transitioned into the active state.";
                    }
    
                    list outgoing-interface {
                      key "name";
                      description
                        "A list of outgoing interfaces.";
                      leaf name {
                        type if:interface-ref;
                        description
                          "Interface name.";
                      }
    
                      leaf expiration {
                        type rt-types:timer-value-seconds16;
                        description
                          "Expiring time.";
                      }
    
                      leaf up-time {
                        type rt-types:timeticks64;
                        description
                          "The number of time ticks (hundredths of a second) since
    the oper-status of the interface was last changed to
    'up'.";
                      }
    
                      leaf jp-state {
                        type enumeration {
                          enum "no-info" {
                            value 0;
                            description
                              "The interface has no (*,G) Join state and no timers
    running.";
                          }
                          enum "join" {
                            value 1;
                            description
                              "The interface has Join state.";
                          }
                          enum "prune-pending" {
                            value 2;
                            description
                              "The router has received a Prune on this interface from
    a downstream neighbor and is waiting to see whether
    the prune will be overridden by another downstream
    router.  For forwarding purposes, the Prune-Pending
    state functions exactly like the Join state.";
                          }
                        }
                        description
                          "Join-prune state.";
                      }
                    }  // list outgoing-interface
                  }  // list ipv4-route
    
                  list ipv6-route {
                    when
                      "../../address-family = 'rt:ipv6'" {
                      description
                        "Only applicable to IPv6 address family.";
                    }
                    key "group source-address is-rpt";
                    description
                      "A list of IPv6 routes.";
                    leaf group {
                      type rt-types:ipv6-multicast-group-address;
                      description
                        "Group address.";
                    }
    
                    leaf source-address {
                      type rt-types:ipv6-multicast-source-address;
                      description
                        "Source address.";
                    }
    
                    leaf is-rpt {
                      type boolean;
                      description
                        "'true' if the tree is RPT (Rendezvous-Point Tree).";
                    }
    
                    leaf expiration {
                      type rt-types:timer-value-seconds16;
                      description
                        "When the route will expire.";
                    }
    
                    leaf incoming-interface {
                      type if:interface-ref;
                      description
                        "Reference to an entry in the global interface
    list.";
                    }
    
                    leaf is-spt {
                      type boolean;
                      description
                        "'true' if SPT (Shortest Path Tree) bit is set to indicate
    forwarding is taking place on the (S,G) Shortest Path Tree
    (SPT).";
                      reference
                        "RFC7761: Protocol Independent Multicast - Sparse Mode
                        (PIM-SM): Protocol Specification (Revised). Sec. 4.1.3.";
    
                    }
    
                    leaf mode {
                      type identityref {
                        base pim-mode;
                      }
                      description "PIM mode.";
                    }
    
                    leaf msdp-learned {
                      type boolean;
                      description
                        "'true' if route is learned from MSDP (Multicast Source
     Discovery Protocol).";
                    }
    
                    leaf rp-address {
                      type inet:ip-address;
                      description
                        "RP (Rendezvous Point) address.";
                    }
    
                    leaf rpf-neighbor {
                      type inet:ip-address;
                      description
                        "RPF (Reverse Path Forwarding) neighbor address.";
                    }
    
                    leaf up-time {
                      type rt-types:timeticks64;
                      description
                        "The number of time ticks (hundredths of a second) since the
    route last transitioned into the active state.";
                    }
    
                    list outgoing-interface {
                      key "name";
                      description
                        "A list of outgoing interfaces.";
                      leaf name {
                        type if:interface-ref;
                        description
                          "Interface name.";
                      }
    
                      leaf expiration {
                        type rt-types:timer-value-seconds16;
                        description
                          "Expiring time.";
                      }
    
                      leaf up-time {
                        type rt-types:timeticks64;
                        description
                          "The number of time ticks (hundredths of a second) since
    the oper-status of the interface was last changed to
    'up'.";
                      }
    
                      leaf jp-state {
                        type enumeration {
                          enum "no-info" {
                            value 0;
                            description
                              "The interface has no (*,G) Join state and no timers
    running.";
                          }
                          enum "join" {
                            value 1;
                            description
                              "The interface has Join state.";
                          }
                          enum "prune-pending" {
                            value 2;
                            description
                              "The router has received a Prune on this interface from
    a downstream neighbor and is waiting to see whether
    the prune will be overridden by another downstream
    router.  For forwarding purposes, the Prune-Pending
    state functions exactly like the Join state.";
                          }
                        }
                        description
                          "Join-prune state.";
                      }
                    }  // list outgoing-interface
                  }  // list ipv6-route
                }  // container topology-tree-info
    
                container rp {
                  description
                    "PIM RP configuration data.";
                  container static-rp {
                    description
                      "Containing static RP attributes.";
                    list ipv4-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      key "rp-address";
                      description
                        "A list of IPv4 RP addresses.";
                      leaf rp-address {
                        type inet:ipv4-address;
                        description
                          "Specifies a static RP address.";
                      }
    
                      container bidir {
                        presence
                          "Indicate the support of BIDIR mode.";
                        description
                          "PIM BIDIR configuration data.";
                        leaf policy-name {
                          type string;
                          description
                            "The string value is the name to uniquely identify a
    policy that contains one or more policy rules used to
    determine which multicast group addresses are mapped
    to this statically configured RP address.
    If a policy is not specified, the entire multicast address
    space is mapped.
    The definition of such a policy is outside the scope
    of this document.";
                        }
    
                        leaf override {
                          if-feature static-rp-override;
                          type boolean;
                          default "false";
                          description
                            "When there is a conflict between static RP and dynamic
    RP, setting this attribute to 'true' will ask the
    system to use static RP.";
                        }
                      }  // container bidir
    
                      container sm {
                        presence
                          "Indicate the support of sparse mode.";
                        description
                          "PIM SM configuration data.";
                        leaf policy-name {
                          type string;
                          description
                            "The string value is the name to uniquely identify a
    policy that contains one or more policy rules used to
    determine which multicast group addresses are mapped
    to this statically configured RP address.
    If a policy is not specified, the entire multicast address
    space is mapped.
    The definition of such a policy is outside the scope
    of this document.";
                        }
    
                        leaf override {
                          if-feature static-rp-override;
                          type boolean;
                          default "false";
                          description
                            "When there is a conflict between static RP and dynamic
    RP, setting this attribute to 'true' will ask the
    system to use static RP.";
                        }
                      }  // container sm
                    }  // list ipv4-rp
    
                    list ipv6-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      key "rp-address";
                      description
                        "A list of IPv6 RP addresses.";
                      leaf rp-address {
                        type inet:ipv6-address;
                        description
                          "Specifies a static RP address.";
                      }
    
                      container bidir {
                        presence
                          "Indicate the support of BIDIR mode.";
                        description
                          "PIM BIDIR configuration data.";
                        leaf policy-name {
                          type string;
                          description
                            "The string value is the name to uniquely identify a
    policy that contains one or more policy rules used to
    determine which multicast group addresses are mapped
    to this statically configured RP address.
    If a policy is not specified, the entire multicast address
    space is mapped.
    The definition of such a policy is outside the scope
    of this document.";
                        }
    
                        leaf override {
                          if-feature static-rp-override;
                          type boolean;
                          default "false";
                          description
                            "When there is a conflict between static RP and dynamic
    RP, setting this attribute to 'true' will ask the
    system to use static RP.";
                        }
                      }  // container bidir
    
                      container sm {
                        presence
                          "Indicate the support of sparse mode.";
                        description
                          "PIM SM configuration data.";
                        leaf policy-name {
                          type string;
                          description
                            "The string value is the name to uniquely identify a
    policy that contains one or more policy rules used to
    determine which multicast group addresses are mapped
    to this statically configured RP address.
    If a policy is not specified, the entire multicast address
    space is mapped.
    The definition of such a policy is outside the scope
    of this document.";
                        }
    
                        leaf override {
                          if-feature static-rp-override;
                          type boolean;
                          default "false";
                          description
                            "When there is a conflict between static RP and dynamic
    RP, setting this attribute to 'true' will ask the
    system to use static RP.";
                        }
                      }  // container sm
                    }  // list ipv6-rp
                  }  // container static-rp
    
                  container bsr {
                    if-feature bsr;
                    description
                      "Containing BSR (BootStrap Router) attributes.";
                    container bsr-candidate {
                      presence
                        "Present to serve as a BSR candidate";
                      description
                        "BSR candidate attributes.";
                      choice interface-or-address {
                        description
                          "Use either interface or ip-address.";
                        case interface {
                          if-feature candidate-interface;
                          leaf interface {
                            type if:interface-ref;
                            mandatory true;
                            description
                              "Interface to be used by BSR.";
                          }
                        }  // case interface
    
                        case ipv4-address {
                          when
                            "../../../pim-base:address-family = 'rt:ipv4'" {
                            description
                              "Only applicable to IPv4 address family.";
                          }
                          if-feature candidate-ipv4;
                          leaf ipv4-address {
                            type inet:ipv4-address;
                            mandatory true;
                            description
                              "IP address to be used by BSR.";
                          }
                        }  // case ipv4-address
    
                        case ipv6-address {
                          when
                            "../../../pim-base:address-family = 'rt:ipv6'" {
                            description
                              "Only applicable to IPv6 address family.";
                          }
                          if-feature candidate-ipv6;
                          leaf ipv6-address {
                            type inet:ipv6-address;
                            mandatory true;
                            description
                              "IP address to be used by BSR.";
                          }
                        }  // case ipv6-address
                      }  // choice interface-or-address
    
                      leaf hash-mask-length {
                        type uint8 {
                          range "0..128";
                        }
                        mandatory true;
                        description
                          "Value contained in BSR messages used by all routers to
    hash (map) to an RP.";
                      }
    
                      leaf priority {
                        type uint8 {
                          range "0..255";
                        }
                        default "64";
                        description
                          "BSR election priority among different candidate BSRs.
    A larger value has a higher priority over a smaller
    value.";
                      }
                    }  // container bsr-candidate
    
                    container rp-candidate {
                      description
                        "Containing RP candidate attributes.";
                      list interface {
                        if-feature candidate-interface;
                        key "name";
                        description
                          "A list of RP candidates";
                        leaf name {
                          type if:interface-ref;
                          description
                            "Interface that the RP candidate uses.";
                        }
    
                        leaf policy-name {
                          type string;
                          description
                            "The string value is the name to uniquely identify a
    policy that contains one or more policy rules used to
    accept or reject certain multicast groups.
    If a policy is not specified, the entire multicast address
    space is accepted.
    The definition of such a policy is outside the scope
    of this document.";
                        }
    
                        leaf mode {
                          type identityref {
                            base rp-mode;
                          }
                          description
                            "The mode of an RP, which can be SM (Sparse Mode) or BIDIR
    (bi-directional), each of them is defined in a saparate YNAG
    module. If a system supports an RP mode, the corresponding
    YANG module is implemented.
    When the value of this leaf is not specified, the default
    value is the supported mode if only one mode is implemented,
    or the default value is SM (Sparce Mode) if both SM and
    BIDIR are implemented.";
                        }
                      }  // list interface
    
                      list ipv4-address {
                        when
                          "../../../../pim-base:address-family = 'rt:ipv4'" {
                          description
                            "Only applicable to IPv4 address family.";
                        }
                        if-feature candidate-ipv4;
                        key "address";
                        description
                          "A list of RP candidate addresses.";
                        leaf address {
                          type inet:ipv4-address;
                          description
                            "IPv4 address that the RP candidate uses.";
                        }
    
                        leaf policy-name {
                          type string;
                          description
                            "The string value is the name to uniquely identify a
    policy that contains one or more policy rules used to
    accept or reject certain multicast groups.
    If a policy is not specified, the entire multicast address
    space is accepted.
    The definition of such a policy is outside the scope
    of this document.";
                        }
    
                        leaf mode {
                          type identityref {
                            base rp-mode;
                          }
                          description
                            "The mode of an RP, which can be SM (Sparse Mode) or BIDIR
    (bi-directional), each of them is defined in a saparate YNAG
    module. If a system supports an RP mode, the corresponding
    YANG module is implemented.
    When the value of this leaf is not specified, the default
    value is the supported mode if only one mode is implemented,
    or the default value is SM (Sparce Mode) if both SM and
    BIDIR are implemented.";
                        }
                      }  // list ipv4-address
    
                      list ipv6-address {
                        when
                          "../../../../pim-base:address-family = 'rt:ipv6'" {
                          description
                            "Only applicable to IPv6 address family.";
                        }
                        if-feature candidate-ipv6;
                        key "address";
                        description
                          "A list of RP candidate addresses.";
                        leaf address {
                          type inet:ipv6-address;
                          description
                            "IPv6 address that the RP candidate uses.";
                        }
    
                        leaf policy-name {
                          type string;
                          description
                            "The string value is the name to uniquely identify a
    policy that contains one or more policy rules used to
    accept or reject certain multicast groups.
    If a policy is not specified, the entire multicast address
    space is accepted.
    The definition of such a policy is outside the scope
    of this document.";
                        }
    
                        leaf mode {
                          type identityref {
                            base rp-mode;
                          }
                          description
                            "The mode of an RP, which can be SM (Sparse Mode) or BIDIR
    (bi-directional), each of them is defined in a saparate YNAG
    module. If a system supports an RP mode, the corresponding
    YANG module is implemented.
    When the value of this leaf is not specified, the default
    value is the supported mode if only one mode is implemented,
    or the default value is SM (Sparce Mode) if both SM and
    BIDIR are implemented.";
                        }
                      }  // list ipv6-address
                    }  // container rp-candidate
    
                    container bsr {
                      config false;
                      description
                        "BSR information.";
                      leaf address {
                        type inet:ip-address;
                        description
                          "BSR address";
                      }
    
                      leaf hash-mask-length {
                        type uint8 {
                          range "0..128";
                        }
                        description
                          "Hash mask length.";
                      }
    
                      leaf priority {
                        type uint8 {
                          range "0..255";
                        }
                        description "Priority.";
                      }
    
                      leaf up-time {
                        type rt-types:timeticks64;
                        description
                          "The number of time ticks (hundredths of a second)
    since the BSR became up.";
                      }
                    }  // container bsr
    
                    choice election-state {
                      if-feature bsr-election-state;
                      description
                        "BSR election state.";
                      leaf candidate-bsr-state {
                        type enumeration {
                          enum "candidate" {
                            value 0;
                            description
                              "The router is a candidate to be the BSR for the
    scope zone, but currently another router is the
    preferred BSR.";
                          }
                          enum "pending" {
                            value 1;
                            description
                              "The router is a candidate to be the BSR for the
    scope zone. Currently, no other router is the
    preferred BSR, but this router is not yet the
    elected BSR.  This is a temporary state that
    prevents rapid thrashing of the choice of BSR
    during BSR election.";
                          }
                          enum "elected" {
                            value 2;
                            description
                              "The router is the elected BSR for the scope zone
    and it must perform all the BSR functions.";
                          }
                        }
                        description
                          "Candidate-BSR state.";
                        reference
                          "RFC5059, Section 3.1.1.";
    
                      }
                      leaf non-candidate-bsr-state {
                        type enumeration {
                          enum "no-info" {
                            value 0;
                            description
                              "The router has no information about this scope
    zone.";
                          }
                          enum "accept-any" {
                            value 1;
                            description
                              "The router does not know of an active BSR, and
    will accept the first Bootstrap message it sees
    as giving the new BSR's identity and the
    RP-Set.";
                          }
                          enum "accept" {
                            value 2;
                            description
                              "The router knows the identity of the current
    BSR, and is using the RP-Set provided by that
    BSR. Only Bootstrap messages from that BSR or
    from a Candidate-BSR (C-BSR) with higher weight
    than the current BSR will be accepted.";
                          }
                        }
                        description
                          "Non-candidate-BSR state.";
                        reference
                          "RFC5059, Section 3.1.2.";
    
                      }
                    }  // choice election-state
    
                    leaf bsr-next-bootstrap {
                      type uint16;
                      units "seconds";
                      config false;
                      description
                        "The remaining time interval in seconds until the next
    bootstrap will be sent.";
                    }
    
                    container rp {
                      config false;
                      description
                        "State information of the RP.";
                      leaf rp-address {
                        type inet:ip-address;
                        description
                          "RP address.";
                      }
    
                      leaf policy-name {
                        type string;
                        description
                          "The string value is the name to uniquely identify a
    policy that contains one or more policy rules used to
    accept or reject certain multicast groups.
    If a policy is not specified, the entire multicast
    address space is accepted.
    The definition of such a policy is outside the scope
    of this document.";
                      }
    
                      leaf up-time {
                        type rt-types:timeticks64;
                        description
                          "The number of time ticks (hundredths of a second)
    since the RP became actively available.";
                      }
                    }  // container rp
    
                    leaf rp-candidate-next-advertisement {
                      type uint16;
                      units "seconds";
                      config false;
                      description
                        "The remaining time interval in seconds until the next
    RP candidate advertisement will be sent.";
                    }
                  }  // container bsr
    
                  container rp-list {
                    config false;
                    description
                      "Containing a list of RPs.";
                    list ipv4-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      key "rp-address mode";
                      description
                        "A list of IPv4 RP addresses.";
                      leaf rp-address {
                        type inet:ipv4-address;
                        description
                          "RP address.";
                      }
    
                      leaf mode {
                        type identityref {
                          base rp-mode;
                        }
                        description "RP mode.";
                      }
    
                      leaf info-source-address {
                        type inet:ipv4-address;
                        description
                          "The address where RP information is learned.";
                      }
    
                      leaf info-source-type {
                        type identityref {
                          base rp-info-source-type;
                        }
                        description
                          "The information source of an RP.";
                      }
    
                      leaf up-time {
                        type rt-types:timeticks64;
                        description
                          "The number of time ticks (hundredths of a second) since
    the RP became actively available.";
                      }
    
                      leaf expiration {
                        type rt-types:timer-value-seconds16;
                        description
                          "Expiration time.";
                      }
                    }  // list ipv4-rp
    
                    list ipv6-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      key "rp-address mode";
                      description
                        "A list of IPv6 RP addresses.";
                      leaf rp-address {
                        type inet:ipv6-address;
                        description
                          "RP address.";
                      }
    
                      leaf mode {
                        type identityref {
                          base rp-mode;
                        }
                        description "RP mode.";
                      }
    
                      leaf info-source-address {
                        type inet:ipv6-address;
                        description
                          "The address where RP information is learned.";
                      }
    
                      leaf info-source-type {
                        type identityref {
                          base rp-info-source-type;
                        }
                        description
                          "The information source of an RP.";
                      }
    
                      leaf up-time {
                        type rt-types:timeticks64;
                        description
                          "The number of time ticks (hundredths of a second) since
    the RP became actively available.";
                      }
    
                      leaf expiration {
                        type rt-types:timer-value-seconds16;
                        description
                          "Expiration time.";
                      }
                    }  // list ipv6-rp
                  }  // container rp-list
    
                  container rp-mappings {
                    config false;
                    description
                      "Containing a list of group-to-RP mappings.";
                    list ipv4-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      key "group-range rp-address";
                      description
                        "A list of group-to-RP mappings.";
                      leaf group-range {
                        type inet:ipv4-prefix;
                        description
                          "Group range presented in the format of prefix.";
                      }
    
                      leaf rp-address {
                        type inet:ipv4-address;
                        description
                          "RP address.";
                      }
    
                      leaf up-time {
                        type rt-types:timeticks64;
                        description
                          "The number of time ticks (hundredths of a second) since
    the RP mapping or the RP became actively available.";
                      }
    
                      leaf expiration {
                        type rt-types:timer-value-seconds16;
                        description
                          "Expiration time.";
                      }
                    }  // list ipv4-rp
    
                    list ipv6-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      key "group-range rp-address";
                      description
                        "A list of IPv6 RP addresses.";
                      leaf group-range {
                        type inet:ipv6-prefix;
                        description
                          "Group range presented in the format of prefix.";
                      }
    
                      leaf rp-address {
                        type inet:ipv6-address;
                        description
                          "RP address.";
                      }
    
                      leaf up-time {
                        type rt-types:timeticks64;
                        description
                          "The number of time ticks (hundredths of a second) since
    the RP mapping or the RP became actively available.";
                      }
    
                      leaf expiration {
                        type rt-types:timer-value-seconds16;
                        description
                          "Expiration time.";
                      }
                    }  // list ipv6-rp
                  }  // container rp-mappings
                }  // container rp
    
                container bidir {
                  presence
                    "Present to enable BIDIR mode.";
                  description
                    "PIM BIDIR configuration data.";
                }  // container bidir
    
                container rp {
                  description
                    "PIM RP configuration data.";
                  container static-rp {
                    description
                      "Containing static RP attributes.";
                    list ipv4-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      key "ipv4-address";
                      description
                        "A list of IPv4 RP addresses.";
                      leaf ipv4-address {
                        type inet:ipv4-address;
                        description
                          "Specifies a static RP address.";
                      }
                    }  // list ipv4-rp
    
                    list ipv6-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      key "ipv6-address";
                      description
                        "A list of IPv6 RP addresses.";
                      leaf ipv6-address {
                        type inet:ipv6-address;
                        description
                          "Specifies a static RP address.";
                      }
                    }  // list ipv6-rp
                  }  // container static-rp
    
                  container bsr {
                    if-feature bsr;
                    description
                      "Containing BSR (BootStrap Router) attributes.";
                    container bsr-candidate {
                      presence
                        "Present to serve as a BSR candidate";
                      description
                        "BSR candidate attributes.";
                      choice interface-or-address {
                        description
                          "Use either interface or ip-address.";
                        case interface {
                          if-feature candidate-interface;
                          leaf interface {
                            type if:interface-ref;
                            mandatory true;
                            description
                              "Interface to be used by BSR.";
                          }
                        }  // case interface
    
                        case ipv4-address {
                          when
                            "../../../pim-base:address-family = 'rt:ipv4'" {
                            description
                              "Only applicable to IPv4 address family.";
                          }
                          if-feature candidate-ipv4;
                          leaf ipv4-address {
                            type inet:ipv4-address;
                            mandatory true;
                            description
                              "IP address to be used by BSR.";
                          }
                        }  // case ipv4-address
    
                        case ipv6-address {
                          when
                            "../../../pim-base:address-family = 'rt:ipv6'" {
                            description
                              "Only applicable to IPv6 address family.";
                          }
                          if-feature candidate-ipv6;
                          leaf ipv6-address {
                            type inet:ipv6-address;
                            mandatory true;
                            description
                              "IP address to be used by BSR.";
                          }
                        }  // case ipv6-address
                      }  // choice interface-or-address
    
                      leaf hash-mask-length {
                        type uint8 {
                          range "0..128";
                        }
                        mandatory true;
                        description
                          "Value contained in BSR messages used by all routers to
    hash (map) to an RP.";
                      }
    
                      leaf priority {
                        type uint8 {
                          range "0..255";
                        }
                        mandatory true;
                        description
                          "BSR election priority among different candidate BSRs.
    A larger value has a higher priority over a smaller
    value.";
                      }
                    }  // container bsr-candidate
    
                    list rp-candidate-interface {
                      if-feature candidate-interface;
                      key "interface";
                      description
                        "A list of RP candidates";
                      leaf interface {
                        type if:interface-ref;
                        description
                          "Interface that the RP candidate uses.";
                      }
    
                      leaf policy {
                        type string;
                        description
                          "ACL (Access Control List) policy used to filter group
    addresses.";
                      }
    
                      leaf mode {
                        type identityref {
                          base rp-mode;
                        }
                        description "RP mode.";
                      }
                    }  // list rp-candidate-interface
    
                    list rp-candidate-ipv4-address {
                      when
                        "../../../pim-base:address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      if-feature candidate-ipv4;
                      key "ipv4-address";
                      description
                        "A list of RP candidates";
                      leaf ipv4-address {
                        type inet:ipv4-address;
                        description
                          "IPv4 address that the RP candidate uses.";
                      }
    
                      leaf policy {
                        type string;
                        description
                          "ACL (Access Control List) policy used to filter group
    addresses.";
                      }
    
                      leaf mode {
                        type identityref {
                          base rp-mode;
                        }
                        description "RP mode.";
                      }
                    }  // list rp-candidate-ipv4-address
    
                    list rp-candidate-ipv6-address {
                      when
                        "../../../pim-base:address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      if-feature candidate-ipv6;
                      key "ipv6-address";
                      description
                        "A list of RP candidates";
                      leaf ipv6-address {
                        type inet:ipv6-address;
                        description
                          "IPv6 address that the RP candidate uses.";
                      }
    
                      leaf policy {
                        type string;
                        description
                          "ACL (Access Control List) policy used to filter group
    addresses.";
                      }
    
                      leaf mode {
                        type identityref {
                          base rp-mode;
                        }
                        description "RP mode.";
                      }
                    }  // list rp-candidate-ipv6-address
                  }  // container bsr
                }  // container rp
    
                container dm {
                  presence
                    "Present to enable dense-mode.";
                  description
                    "PIM DM configuration data.";
                }  // container dm
    
                container sm {
                  description
                    "PIM SM configuration data.";
                  container asm {
                    description
                      "ASM (Any Source Multicast) attributes.";
                    container anycast-rp {
                      presence
                        "Present to enable anycast RP (Rendezvous Point).";
                      description
                        "Anycast RP attributes.";
                      container ipv4 {
                        when
                          "../../../../pim-base:address-family = 'rt:ipv4'" {
                          description
                            "Only applicable to IPv4 address family.";
                        }
                        description
                          "IPv4 attributes. Only applicable when
    pim-base:address-family is IPv4.";
                        list ipv4-anycast-rp {
                          key "anycast-address rp-address";
                          description
                            "A list of anycast RP settings.";
                          leaf anycast-address {
                            type inet:ipv4-address;
                            description
                              "IP address of the anycast RP set. This IP address
    is used by the multicast groups or sources to join
    or register.";
                          }
    
                          leaf rp-address {
                            type inet:ipv4-address;
                            description
                              "IP address of the router configured with anycast
    RP. This is the IP address where the Register
    messages are forwarded.";
                          }
                        }  // list ipv4-anycast-rp
                      }  // container ipv4
    
                      container ipv6 {
                        when
                          "../../../../pim-base:address-family = 'rt:ipv6'" {
                          description
                            "Only applicable to IPv6 address family.";
                        }
                        description
                          "IPv6 attributes. Only applicable when
    pim-base:address-family is IPv6.";
                        list ipv6-anycast-rp {
                          key "anycast-address rp-address";
                          description
                            "A list of anycast RP settings.";
                          leaf anycast-address {
                            type inet:ipv6-address;
                            description
                              "IP address of the anycast RP set. This IP address
    is used by the multicast groups or sources to join
    or register.";
                          }
    
                          leaf rp-address {
                            type inet:ipv6-address;
                            description
                              "IP address of the router configured with anycast
    RP. This is the IP address where the Register
    messages are forwarded.";
                          }
                        }  // list ipv6-anycast-rp
                      }  // container ipv6
                    }  // container anycast-rp
    
                    container spt-switch {
                      description
                        "SPT (Shortest Path Tree) switching attributes.";
                      container infinity {
                        if-feature spt-switch-infinity;
                        presence
                          "Present if SPT switchover threshold is set to
    infinity, according to the policy specified below.";
                        description
                          "The receiver's DR (Designated Router) never triggers
    the switchover from the RPT to the SPT.";
                        leaf policy-name {
                          if-feature spt-switch-policy;
                          type string;
                          description
                            "Switch policy.";
                        }
                      }  // container infinity
                    }  // container spt-switch
                  }  // container asm
    
                  container ssm {
                    presence
                      "Present to enable SSM (Source-Specific Multicast).";
                    description
                      "SSM (Source-Specific Multicast) attributes.";
                    leaf range-policy {
                      type string;
                      description
                        "Policy used to define SSM address range.";
                    }
                  }  // container ssm
                }  // container sm
              }  // list address-family
    
              container interfaces {
                description
                  "Containing a list of interfaces.";
                list interface {
                  key "name";
                  description
                    "List of pim interfaces.";
                  leaf name {
                    type if:interface-ref;
                    description
                      "Reference to an entry in the global interface
    list.";
                  }
    
                  list address-family {
                    key "address-family";
                    description
                      "Each list entry for one address family.";
                    leaf address-family {
                      type identityref {
                        base address-family;
                      }
                      mandatory true;
                      description
                        "Address family.";
                    }
    
                    container bfd {
                      if-feature bfd;
                      description
                        "BFD (Bidirectional Forwarding Detection)
    operation.";
                      leaf enabled {
                        type boolean;
                        default "false";
                        description
                          "Indicates whether BFD is enabled.";
                      }
    
                      leaf local-multiplier {
                        type multiplier;
                        default "3";
                        description
                          "Multiplier transmitted by the local system.";
                      }
    
                      choice interval-config-type {
                        default
                          "tx-rx-intervals";
                        description
                          "Two interval values or one value used for both transmit and
    receive.";
                        case tx-rx-intervals {
                          leaf desired-min-tx-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Desired minimum transmit interval of control packets.";
                          }
    
                          leaf required-min-rx-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Required minimum receive interval of control packets.";
                          }
                        }  // case tx-rx-intervals
    
                        case single-interval {
                          if-feature single-minimum-interval;
                          leaf min-interval {
                            type uint32;
                            units "microseconds";
                            default "1000000";
                            description
                              "Desired minimum transmit interval and required
    minimum receive interval of control packets.";
                          }
                        }  // case single-interval
                      }  // choice interval-config-type
                    }  // container bfd
    
                    leaf dr-priority {
                      if-feature intf-dr-priority;
                      type uint32;
                      default "1";
                      description
                        "DR (Designated Router) priority as the preference in
    the DR election process.";
                    }
    
                    leaf hello-interval {
                      if-feature intf-hello-interval;
                      type rt-types:timer-value-seconds16;
                      default "30";
                      description
                        "Periodic interval for Hello messages.
    If 'infinity' or 'not-set' is used, no periodic
    Hello messages are sent.";
                      reference
                        "RFC3973: Protocol Independent Multicast - Dense Mode
                        (PIM-DM): Protocol Specification (Revised).
                        Sec. 4.8.
                         RFC7761: Protocol Independent Multicast - Sparse
                        Mode (PIM-SM): Protocol Specification (Revised).
                        Sec. 4.11.";
    
                    }
    
                    choice hello-holdtime-or-multiplier {
                      description
                        "Holdtime is timer value to time out the neighbor
    state when the timer expires.
    The holdtime value can be specified either by the
    given holdtime value or by the calculation of the
    hello-interval multiplied by the given value of the
    multiplier.";
                      case holdtime {
                        if-feature intf-hello-holdtime;
                        leaf hello-holdtime {
                          type rt-types:timer-value-seconds16;
                          default "105";
                          description
                            "Hello holdtime is the amount of time to keep
    the neighbor reachable until a new Hello message
    is received.";
                        }
                      }  // case holdtime
    
                      case multiplier {
                        if-feature intf-hello-multiplier;
                        leaf hello-multiplier {
                          type rt-types:timer-multiplier;
                          default "3";
                          description
                            "Hello multiplier is the number by which the
    hello interval is multplied to obtain the Hello
    holdtime.
    The value of the Hello holdtime is calculated
    as:
    hello-holdtime =
    (multiplier + 0.5) * (hello-interval)";
                        }
                      }  // case multiplier
                    }  // choice hello-holdtime-or-multiplier
    
                    leaf jp-interval {
                      if-feature intf-jp-interval;
                      type rt-types:timer-value-seconds16;
                      default "60";
                      description
                        "Periodic interval between Join/Prune messages.
    If 'infinity' or 'not-set' is used, no periodic
    Join/Prune messages are sent.";
                    }
    
                    choice jp-holdtime-or-multiplier {
                      description
                        "Join/Prune holdtime is the amount of time a receiver
    must keep the Join/Prune state alive.
    The holdtime value can be specified either by the
    given holdtime value or by the calculation of the
    jp-interval multiplied by the given value of the
    multiplier.";
                      case holdtime {
                        if-feature intf-jp-holdtime;
                        leaf jp-holdtime {
                          type rt-types:timer-value-seconds16;
                          default "210";
                          description
                            "Join/Prune holdtime is the amount of time a
    receiver must keep the Join/Prune state alive.";
                        }
                      }  // case holdtime
    
                      case multiplier {
                        if-feature intf-jp-multiplier;
                        leaf jp-multiplier {
                          type rt-types:timer-multiplier;
                          default "3";
                          description
                            "Join prune multiplier is the number by which the
    join prune interval is multplied to obtain the
    Join/Prune holdtime.
    The value of the Join/Prune holdtime is
    calculated as:
    jp-holdtime =
    (multiplier + 0.5) * (jp-interval)";
                        }
                      }  // case multiplier
                    }  // choice jp-holdtime-or-multiplier
    
                    leaf override-interval {
                      if-feature intf-override-interval;
                      type uint16;
                      units "milliseconds";
                      default "2500";
                      description
                        "A short period after a Join or Prune to allow other
    routers on the LAN to override the Join or Prune.";
                    }
    
                    leaf propagation-delay {
                      if-feature intf-propagation-delay;
                      type uint16;
                      units "milliseconds";
                      default "500";
                      description
                        "Expected propagation delay over the local link.";
                    }
    
                    leaf oper-status {
                      type enumeration {
                        enum "up" {
                          value 0;
                          description
                            "The interface is ready to pass PIM messages.";
                        }
                        enum "down" {
                          value 1;
                          description
                            "The interface does not pass PIM messages.";
                        }
                      }
                      config false;
                      description
                        "PIM operational status on the interface.
    This status is PIM specific and separate from the
    operational status of the underlying interface.";
                    }
    
                    leaf gen-id {
                      type uint32;
                      config false;
                      description
                        "The value of the Generation ID this router uses to
    insert in the PIM Hello message sent on this
    interface.";
                    }
    
                    leaf hello-expiration {
                      type rt-types:timer-value-seconds16;
                      config false;
                      description
                        "Hello interval expiration time.";
                    }
    
                    container ipv4 {
                      when
                        "../address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      config false;
                      description
                        "Interface state attributes for IPv4.";
                      leaf-list address {
                        type inet:ipv4-address;
                        description
                          "List of addresses on which PIM is operating.";
                      }
    
                      leaf dr-address {
                        type inet:ipv4-address;
                        description
                          "DR (Designated Router) address.";
                      }
                    }  // container ipv4
    
                    container ipv6 {
                      when
                        "../address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      config false;
                      description
                        "Interface state attributes for IPv6.";
                      leaf-list address {
                        type inet:ipv6-address;
                        description
                          "List of addresses on which PIM is operating.";
                      }
    
                      leaf dr-address {
                        type inet:ipv6-address;
                        description
                          "DR (Designated Router) address.";
                      }
                    }  // container ipv6
    
                    container neighbors {
                      config false;
                      description
                        "Information learned from neighbors through this
    interface.";
                      list ipv4-neighbor {
                        when
                          "../../address-family = 'rt:ipv4'" {
                          description
                            "Only applicable to IPv4 address family.";
                        }
                        key "address";
                        description
                          "Neighbor state information.";
                        leaf address {
                          type inet:ipv4-address;
                          description
                            "Neighbor address.";
                        }
    
                        leaf bfd-state {
                          type bfd-types:state;
                          description
                            "BFD (Bidirectional Forwarding Detection) status.";
                        }
    
                        leaf expiration {
                          type rt-types:timer-value-seconds16;
                          description
                            "Neighbor expiring time.";
                        }
    
                        leaf dr-priority {
                          type uint32;
                          description
                            "DR (Designated Router) priority as the preference in the DR
    election process.";
                        }
    
                        leaf gen-id {
                          type uint32;
                          description
                            "The value of the Generation ID in the last Hello message
    from the neighbor.";
                        }
    
                        container lan-prune-delay {
                          description
                            "The information of the LAN Prune Delay option in the Hello
    message from the neighbor.";
                          leaf present {
                            type boolean;
                            description
                              "'true' if the LAN Prune Delay option is present in the
    last Hello message from the neighbor.";
                          }
    
                          leaf override-interval {
                            when
                              "../present = 'true'" {
                              description
                                "Available only when the leaf present is 'true'.";
                            }
                            type uint16;
                            units "milliseconds";
                            description
                              "The value of the Override_Interval field of the LAN Prune
    Delay option in the last Hello message from the neighbor.
    The neighbor uses this value to indicate a short period
    after a Join or Prune to allow other routers on the LAN
    to override the Join or Prune.";
                          }
    
                          leaf propagation-delay {
                            when
                              "../present = 'true'" {
                              description
                                "Available only when the leaf present is 'true'.";
                            }
                            type uint16;
                            units "milliseconds";
                            description
                              "The value of the Propagation_Delay field of the LAN Prune
    Delay option in the last Hello message from the neighbor.
    The value is the propagation delay over the local link
    expected by the neighbor.";
                          }
    
                          leaf t-bit {
                            when
                              "../present = 'true'" {
                              description
                                "Available only when the leaf present is 'true'.";
                            }
                            type boolean;
                            description
                              "'true' if the T bit is set in the LAN Prune Delay option
    in the last Hello message from the neighbor. This flag
    indicates the neighbor's capability to disable Join
    message suppression.";
                          }
                        }  // container lan-prune-delay
    
                        leaf up-time {
                          type rt-types:timeticks64;
                          description
                            "The number of time ticks (hundredths of a second) since
    the neighbor relationship has been formed as reachable
    without beeing timed out.";
                        }
                      }  // list ipv4-neighbor
    
                      list ipv6-neighbor {
                        when
                          "../../address-family = 'rt:ipv6'" {
                          description
                            "Only applicable to IPv6 address family.";
                        }
                        key "address";
                        description
                          "Neighbor state information.";
                        leaf address {
                          type inet:ipv6-address;
                          description
                            "Neighbor address.";
                        }
    
                        leaf bfd-state {
                          type bfd-types:state;
                          description
                            "BFD (Bidirectional Forwarding Detection) status.";
                        }
    
                        leaf expiration {
                          type rt-types:timer-value-seconds16;
                          description
                            "Neighbor expiring time.";
                        }
    
                        leaf dr-priority {
                          type uint32;
                          description
                            "DR (Designated Router) priority as the preference in the DR
    election process.";
                        }
    
                        leaf gen-id {
                          type uint32;
                          description
                            "The value of the Generation ID in the last Hello message
    from the neighbor.";
                        }
    
                        container lan-prune-delay {
                          description
                            "The information of the LAN Prune Delay option in the Hello
    message from the neighbor.";
                          leaf present {
                            type boolean;
                            description
                              "'true' if the LAN Prune Delay option is present in the
    last Hello message from the neighbor.";
                          }
    
                          leaf override-interval {
                            when
                              "../present = 'true'" {
                              description
                                "Available only when the leaf present is 'true'.";
                            }
                            type uint16;
                            units "milliseconds";
                            description
                              "The value of the Override_Interval field of the LAN Prune
    Delay option in the last Hello message from the neighbor.
    The neighbor uses this value to indicate a short period
    after a Join or Prune to allow other routers on the LAN
    to override the Join or Prune.";
                          }
    
                          leaf propagation-delay {
                            when
                              "../present = 'true'" {
                              description
                                "Available only when the leaf present is 'true'.";
                            }
                            type uint16;
                            units "milliseconds";
                            description
                              "The value of the Propagation_Delay field of the LAN Prune
    Delay option in the last Hello message from the neighbor.
    The value is the propagation delay over the local link
    expected by the neighbor.";
                          }
    
                          leaf t-bit {
                            when
                              "../present = 'true'" {
                              description
                                "Available only when the leaf present is 'true'.";
                            }
                            type boolean;
                            description
                              "'true' if the T bit is set in the LAN Prune Delay option
    in the last Hello message from the neighbor. This flag
    indicates the neighbor's capability to disable Join
    message suppression.";
                          }
                        }  // container lan-prune-delay
    
                        leaf up-time {
                          type rt-types:timeticks64;
                          description
                            "The number of time ticks (hundredths of a second) since
    the neighbor relationship has been formed as reachable
    without beeing timed out.";
                        }
                      }  // list ipv6-neighbor
                    }  // container neighbors
    
                    container bidir {
                      presence
                        "Present to enable BIDIR mode.";
                      description
                        "PIM BIDIR configuration data.";
                      container df-election {
                        if-feature intf-df-election;
                        description
                          "DF election attributes.";
                        leaf offer-multiplier {
                          type uint8;
                          description
                            "This is number of transmission attempts for DF election
    messages.
    When a DF election Offer or Winner message fails to be
    received, the message is retransmitted.
    The offer-multiplier sets the minimum number of DF
    election messages that MUST fail to be received for DF
    election to fail.
    If a router receives from a neighbor a better offer than
    its own, the router stops participating in the election
    for a period of offer-multiplier * offer-interval.
    Eventually, all routers except the best candidate stop
    sending Offer messages.";
                        }
                      }  // container df-election
                    }  // container bidir
    
                    container dm {
                      presence
                        "Present to enable dense-mode.";
                      description
                        "PIM DM configuration data.";
                    }  // container dm
    
                    container sm {
                      presence
                        "Present to enable sparse-mode.";
                      description
                        "PIM SM configuration data.";
                      leaf passive {
                        type empty;
                        description
                          "Specifies that no PIM messages are sent or accepted on
    this PIM interface, but the interface can be included in a
    multicast forwarding entry.";
                      }
                    }  // container sm
                  }  // list address-family
                }  // list interface
              }  // container interfaces
            }  // container pim
    
            container pim {
              presence
                "Container for PIM protocol.";
              description
                "PIM configuration data.";
              container graceful-restart {
                description
                  "Container of graceful restart attributes.";
                leaf enabled {
                  type boolean;
                  description
                    "Enable or disable graceful restart.";
                }
    
                leaf duration {
                  type uint16;
                  units "seconds";
                  description
                    "Maximum time for graceful restart to finish.";
                }
              }  // container graceful-restart
    
              list address-family {
                key "address-family";
                description
                  "Each list entry for one address family.";
                leaf address-family {
                  type identityref {
                    base address-family;
                  }
                  mandatory true;
                  description "Address family.";
                }
    
                container graceful-restart {
                  description
                    "Container of graceful restart attributes.";
                  leaf enabled {
                    type boolean;
                    description
                      "Enable or disable graceful restart.";
                  }
    
                  leaf duration {
                    type uint16;
                    units "seconds";
                    description
                      "Maximum time for graceful restart to finish.";
                  }
                }  // container graceful-restart
              }  // list address-family
    
              container interfaces {
                description
                  "Containing a list of interfaces.";
                list interface {
                  key "interface";
                  description
                    "List of pim interfaces.";
                  leaf interface {
                    type if:interface-ref;
                    description
                      "Reference to an entry in the global interface
    list.";
                  }
    
                  list address-family {
                    key "address-family";
                    description
                      "Each list entry for one address family.";
                    leaf address-family {
                      type identityref {
                        base address-family;
                      }
                      mandatory true;
                      description
                        "Address family.";
                    }
    
                    container bfd {
                      if-feature bfd;
                      description
                        "BFD (Bidirectional Forwarding Detection) operation.";
                      leaf enable {
                        type boolean;
                        description
                          "'true' to suppport BFD for the interface.";
                      }
                    }  // container bfd
    
                    leaf dr-priority {
                      if-feature intf-dr-priority;
                      type uint32;
                      description
                        "DR (Designated Router) priority";
                    }
    
                    leaf hello-interval {
                      if-feature intf-hello-interval;
                      type timer-value;
                      description
                        "Hello interval";
                    }
    
                    choice hello-holdtime-or-multiplier {
                      description
                        "Use holdtime or multiplier";
                      case holdtime {
                        if-feature intf-hello-holdtime;
                        leaf hello-holdtime {
                          type timer-value;
                          description
                            "Hello holdtime";
                        }
                      }  // case holdtime
    
                      case multiplier {
                        if-feature intf-hello-multiplier;
                        leaf hello-multiplier {
                          type rt-types:timer-multiplier;
                          description
                            "Hello multiplier is the number by which the hello
    interval is multplied to obtain the hold time";
                        }
                      }  // case multiplier
                    }  // choice hello-holdtime-or-multiplier
    
                    leaf jp-interval {
                      if-feature intf-jp-interval;
                      type timer-value;
                      description
                        "Join prune interval";
                    }
    
                    choice jp-holdtime-or-multiplier {
                      description
                        "Use holdtime or multiplier";
                      case holdtime {
                        if-feature intf-jp-holdtime;
                        leaf jp-holdtime {
                          type timer-value;
                          description
                            "Join prune holdtime";
                        }
                      }  // case holdtime
    
                      case multiplier {
                        if-feature intf-jp-multiplier;
                        leaf jp-multiplier {
                          type rt-types:timer-multiplier;
                          description
                            "Join prune multiplier is the number by which the join
    prune interval is multplied to obtain the hold time";
                        }
                      }  // case multiplier
                    }  // choice jp-holdtime-or-multiplier
    
                    leaf propagation-delay {
                      if-feature intf-propagation-delay;
                      type uint16;
                      units "milliseconds";
                      description
                        "Propagation description";
                    }
    
                    leaf override-interval {
                      if-feature intf-override-interval;
                      type uint16;
                      units "milliseconds";
                      description
                        "Override interval";
                    }
                  }  // list address-family
                }  // list interface
              }  // container interfaces
            }  // container pim
          }  // container control-plane-protocols
    
          container ribs {
            description "Support for RIBs.";
            list rib {
              key "name";
              description
                "Each entry contains a configuration for a RIB identified
    by the 'name' key.
    
    Entries having the same key as a system-controlled entry
    in the list '/routing/ribs/rib' are used for
    configuring parameters of that entry.  Other entries
    define additional user-controlled RIBs.";
              leaf name {
                type string;
                description
                  "The name of the RIB.
    
    For system-controlled entries, the value of this leaf
    must be the same as the name of the corresponding entry
    in the operational state.
    
    For user-controlled entries, an arbitrary name can be
    used.";
              }
    
              leaf address-family {
                type identityref {
                  base address-family;
                }
                mandatory true;
                description "Address family.";
              }
    
              leaf default-rib {
                if-feature multiple-ribs;
                type boolean;
                default "true";
                config false;
                description
                  "This flag has the value of 'true' if and only if the RIB
    is the default RIB for the given address family.
    
    By default, control-plane protocols place their routes
    in the default RIBs.";
              }
    
              container routes {
                config false;
                description
                  "Current contents of the RIB.";
                list route {
                  description
                    "A RIB route entry.  This data node MUST be augmented
    with information specific to routes of each address
    family.";
                  leaf route-preference {
                    type route-preference;
                    description
                      "This route attribute, also known as 'administrative
    distance', allows for selecting the preferred route
    among routes with the same destination prefix.  A
    smaller value indicates a route that is
    more preferred.";
                  }
    
                  container next-hop {
                    description
                      "Route's next-hop attribute.";
                    choice next-hop-options {
                      mandatory true;
                      description
                        "Options for next hops.
    
    It is expected that further cases will be added through
    augments from other modules, e.g., for recursive
    next hops.";
                      case simple-next-hop {
                        description
                          "This case represents a simple next hop consisting of the
    next-hop address and/or outgoing interface.
    
    Modules for address families MUST augment this case with a
    leaf containing a next-hop address of that address
    family.";
                        leaf outgoing-interface {
                          type if:interface-ref;
                          description
                            "Name of the outgoing interface.";
                        }
    
                        leaf next-hop-address {
                          type inet:ipv6-address;
                          description
                            "IPv6 address of the next hop.";
                        }
    
                        leaf next-hop-address {
                          type inet:ipv4-address;
                          description
                            "IPv4 address of the next hop.";
                        }
                      }  // case simple-next-hop
                      leaf special-next-hop {
                        type enumeration {
                          enum "blackhole" {
                            value 0;
                            description
                              "Silently discard the packet.";
                          }
                          enum "unreachable" {
                            value 1;
                            description
                              "Discard the packet and notify the sender with an error
    message indicating that the destination host is
    unreachable.";
                          }
                          enum "prohibit" {
                            value 2;
                            description
                              "Discard the packet and notify the sender with an error
    message indicating that the communication is
    administratively prohibited.";
                          }
                          enum "receive" {
                            value 3;
                            description
                              "The packet will be received by the local system.";
                          }
                        }
                        description
                          "Options for special next hops.";
                      }
                      container next-hop-list {
                        description
                          "Container for multiple next hops.";
                        list next-hop {
                          description
                            "An entry in a next-hop list.
    
    Modules for address families MUST augment this list
    with a leaf containing a next-hop address of that
    address family.";
                          leaf outgoing-interface {
                            type if:interface-ref;
                            description
                              "Name of the outgoing interface.";
                          }
    
                          leaf address {
                            type inet:ipv6-address;
                            description
                              "IPv6 address of the next hop.";
                          }
    
                          leaf address {
                            type inet:ipv4-address;
                            description
                              "IPv4 address of the next hop.";
                          }
                        }  // list next-hop
                      }  // container next-hop-list
                    }  // choice next-hop-options
                  }  // container next-hop
    
                  leaf source-protocol {
                    type identityref {
                      base routing-protocol;
                    }
                    mandatory true;
                    description
                      "Type of the routing protocol from which the route
    originated.";
                  }
    
                  leaf active {
                    type empty;
                    description
                      "The presence of this leaf indicates that the route is
    preferred among all routes in the same RIB that have the
    same destination prefix.";
                  }
    
                  leaf last-updated {
                    type yang:date-and-time;
                    description
                      "Timestamp of the last modification of the route.  If the
    route was never modified, it is the time when the route was
    inserted into the RIB.";
                  }
    
                  leaf destination-prefix {
                    type inet:ipv6-prefix;
                    description
                      "IPv6 destination prefix.";
                  }
    
                  leaf destination-prefix {
                    type inet:ipv4-prefix;
                    description
                      "IPv4 destination prefix.";
                  }
                }  // list route
              }  // container routes
    
              action active-route {
                description
                  "Return the active RIB route that is used for the
    destination address.
    
    Address-family-specific modules MUST augment input
    parameters with a leaf named 'destination-address'.";
                output {
                  container route {
                    description
                      "The active RIB route for the specified destination.
    
    If no route exists in the RIB for the destination
    address, no output is returned.
    
    Address-family-specific modules MUST augment this
    container with appropriate route contents.";
                    container next-hop {
                      description
                        "Route's next-hop attribute.";
                      choice next-hop-options {
                        mandatory true;
                        description
                          "Options for next hops.
    
    It is expected that further cases will be added through
    augments from other modules, e.g., for recursive
    next hops.";
                        case simple-next-hop {
                          description
                            "This case represents a simple next hop consisting of the
    next-hop address and/or outgoing interface.
    
    Modules for address families MUST augment this case with a
    leaf containing a next-hop address of that address
    family.";
                          leaf outgoing-interface {
                            type if:interface-ref;
                            description
                              "Name of the outgoing interface.";
                          }
    
                          leaf next-hop-address {
                            type inet:ipv6-address;
                            description
                              "IPv6 address of the next hop.";
                          }
    
                          leaf next-hop-address {
                            type inet:ipv4-address;
                            description
                              "IPv4 address of the next hop.";
                          }
                        }  // case simple-next-hop
                        leaf special-next-hop {
                          type enumeration {
                            enum "blackhole" {
                              value 0;
                              description
                                "Silently discard the packet.";
                            }
                            enum "unreachable" {
                              value 1;
                              description
                                "Discard the packet and notify the sender with an error
    message indicating that the destination host is
    unreachable.";
                            }
                            enum "prohibit" {
                              value 2;
                              description
                                "Discard the packet and notify the sender with an error
    message indicating that the communication is
    administratively prohibited.";
                            }
                            enum "receive" {
                              value 3;
                              description
                                "The packet will be received by the local system.";
                            }
                          }
                          description
                            "Options for special next hops.";
                        }
                        container next-hop-list {
                          description
                            "Container for multiple next hops.";
                          list next-hop {
                            description
                              "An entry in a next-hop list.
    
    Modules for address families MUST augment this list
    with a leaf containing a next-hop address of that
    address family.";
                            leaf outgoing-interface {
                              type if:interface-ref;
                              description
                                "Name of the outgoing interface.";
                            }
    
                            leaf next-hop-address {
                              type inet:ipv6-address;
                              description
                                "IPv6 address of the next hop.";
                            }
    
                            leaf next-hop-address {
                              type inet:ipv4-address;
                              description
                                "IPv4 address of the next hop.";
                            }
                          }  // list next-hop
                        }  // container next-hop-list
                      }  // choice next-hop-options
                    }  // container next-hop
    
                    leaf source-protocol {
                      type identityref {
                        base routing-protocol;
                      }
                      mandatory true;
                      description
                        "Type of the routing protocol from which the route
    originated.";
                    }
    
                    leaf active {
                      type empty;
                      description
                        "The presence of this leaf indicates that the route is
    preferred among all routes in the same RIB that have the
    same destination prefix.";
                    }
    
                    leaf last-updated {
                      type yang:date-and-time;
                      description
                        "Timestamp of the last modification of the route.  If the
    route was never modified, it is the time when the route was
    inserted into the RIB.";
                    }
    
                    leaf destination-prefix {
                      type inet:ipv6-prefix;
                      description
                        "IPv6 destination prefix.";
                    }
    
                    leaf destination-prefix {
                      type inet:ipv4-prefix;
                      description
                        "IPv4 destination prefix.";
                    }
                  }  // container route
                }
    
                input {
                  leaf destination-address {
                    type inet:ipv6-address;
                    description
                      "IPv6 destination address.";
                  }
    
                  leaf destination-address {
                    type inet:ipv4-address;
                    description
                      "IPv4 destination address.";
                  }
                }
              }  // rpc active-route
    
              leaf description {
                type string;
                description
                  "Textual description of the RIB.";
              }
            }  // list rib
          }  // container ribs
    
          container segment-routing {
            description
              "Segment Routing configuration.  This container
    is to be augmented by models for different SR
    data planes.";
            reference
              "RFC 8402: Segment Routing Architecture.";
    
          }  // container segment-routing
        }  // container routing
    
        container routing-state {
          config false;
          status obsolete;
          description
            "State data of the routing subsystem.";
          leaf router-id {
            type yang:dotted-quad;
            description
              "A 32-bit number in the form of a dotted quad that is used by
    some routing protocols identifying a router.";
            reference
              "RFC 2328: OSPF Version 2";
    
          }
    
          container interfaces {
            status obsolete;
            description
              "Network-layer interfaces used for routing.";
            leaf-list interface {
              type if:interface-state-ref;
              status obsolete;
              description
                "Each entry is a reference to the name of a configured
    network-layer interface.";
            }
          }  // container interfaces
    
          container control-plane-protocols {
            status obsolete;
            description
              "Container for the list of routing protocol instances.";
            list control-plane-protocol {
              key "type name";
              status obsolete;
              description
                "State data of a control-plane protocol instance.
    
    An implementation MUST provide exactly one
    system-controlled instance of the 'direct'
    pseudo-protocol.  Instances of other control-plane
    protocols MAY be created by configuration.";
              leaf type {
                type identityref {
                  base control-plane-protocol;
                }
                status obsolete;
                description
                  "Type of the control-plane protocol.";
              }
    
              leaf name {
                type string;
                status obsolete;
                description
                  "The name of the control-plane protocol instance.
    
    For system-controlled instances, this name is
    persistent, i.e., it SHOULD NOT change across
    reboots.";
              }
            }  // list control-plane-protocol
    
            container pim {
              description "PIM state data.";
              list address-family {
                key "address-family";
                description
                  "Each list entry for one address family.";
                leaf address-family {
                  type identityref {
                    base address-family;
                  }
                  mandatory true;
                  description "Address family.";
                }
    
                container statistics {
                  description
                    "A container defining statistics attributes.";
                  leaf discontinuity-time {
                    type yang:date-and-time;
                    description
                      "The time on the most recent occasion at which any one
    or more of the statistic 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.";
                  }
    
                  container error {
                    description
                      "Containing error statistics.";
                    leaf assert {
                      type yang:counter64;
                      description
                        "The number of assert messages.";
                    }
    
                    leaf bsr {
                      type yang:counter64;
                      description
                        "The number of BSR (Bootstrap Router) messages.";
                    }
    
                    leaf candidate-rp-advertisement {
                      type yang:counter64;
                      description
                        "The number of Candidate-RP-advertisement messages.";
                    }
    
                    leaf df-election {
                      type yang:counter64;
                      description
                        "The number of DF (Designated Forwarder) election messages.";
                    }
    
                    leaf hello {
                      type yang:counter64;
                      description
                        "The number of hello messages.";
                    }
    
                    leaf join-prune {
                      type yang:counter64;
                      description
                        "The number of join/prune messages.";
                    }
    
                    leaf register {
                      type yang:counter64;
                      description
                        "The number of register messages.";
                    }
    
                    leaf register-stop {
                      type yang:counter64;
                      description
                        "The number of register stop messages.";
                    }
    
                    leaf state-refresh {
                      type yang:counter64;
                      description
                        "The number of state refresh messages.";
                    }
                  }  // container error
    
                  container queue {
                    description
                      "Containing queue statistics.";
                    leaf size {
                      type uint32;
                      description
                        "The size of the input queue.";
                    }
    
                    leaf overflow {
                      type yang:counter32;
                      description
                        "The number of the input queue overflows.";
                    }
                  }  // container queue
    
                  container received {
                    description
                      "Containing statistics of received messages.";
                    leaf assert {
                      type yang:counter64;
                      description
                        "The number of assert messages.";
                    }
    
                    leaf bsr {
                      type yang:counter64;
                      description
                        "The number of BSR (Bootstrap Router) messages.";
                    }
    
                    leaf candidate-rp-advertisement {
                      type yang:counter64;
                      description
                        "The number of Candidate-RP-advertisement messages.";
                    }
    
                    leaf df-election {
                      type yang:counter64;
                      description
                        "The number of DF (Designated Forwarder) election messages.";
                    }
    
                    leaf hello {
                      type yang:counter64;
                      description
                        "The number of hello messages.";
                    }
    
                    leaf join-prune {
                      type yang:counter64;
                      description
                        "The number of join/prune messages.";
                    }
    
                    leaf register {
                      type yang:counter64;
                      description
                        "The number of register messages.";
                    }
    
                    leaf register-stop {
                      type yang:counter64;
                      description
                        "The number of register stop messages.";
                    }
    
                    leaf state-refresh {
                      type yang:counter64;
                      description
                        "The number of state refresh messages.";
                    }
                  }  // container received
    
                  container sent {
                    description
                      "Containing statistics of sent messages.";
                    leaf assert {
                      type yang:counter64;
                      description
                        "The number of assert messages.";
                    }
    
                    leaf bsr {
                      type yang:counter64;
                      description
                        "The number of BSR (Bootstrap Router) messages.";
                    }
    
                    leaf candidate-rp-advertisement {
                      type yang:counter64;
                      description
                        "The number of Candidate-RP-advertisement messages.";
                    }
    
                    leaf df-election {
                      type yang:counter64;
                      description
                        "The number of DF (Designated Forwarder) election messages.";
                    }
    
                    leaf hello {
                      type yang:counter64;
                      description
                        "The number of hello messages.";
                    }
    
                    leaf join-prune {
                      type yang:counter64;
                      description
                        "The number of join/prune messages.";
                    }
    
                    leaf register {
                      type yang:counter64;
                      description
                        "The number of register messages.";
                    }
    
                    leaf register-stop {
                      type yang:counter64;
                      description
                        "The number of register stop messages.";
                    }
    
                    leaf state-refresh {
                      type yang:counter64;
                      description
                        "The number of state refresh messages.";
                    }
                  }  // container sent
                }  // container statistics
    
                container topology-tree-info {
                  description
                    "Containing topology tree information.";
                  list ipv4-route {
                    when
                      "../../../address-family = 'rt:ipv4'" {
                      description
                        "Only applicable to IPv4 address family.";
                    }
                    key "group source-address is-rpt";
                    description
                      "A list of IPv4 routes.";
                    leaf group {
                      type rt-types:ipv4-multicast-group-address;
                      description
                        "Group address.";
                    }
    
                    leaf source-address {
                      type rt-types:ipv4-multicast-source-address;
                      description
                        "Source address.";
                    }
    
                    leaf is-rpt {
                      type boolean;
                      description
                        "'true' if the tree is RPT (Rendezvous-Point Tree).";
                    }
    
                    leaf expiration {
                      type timer-value;
                      description
                        "When the route will expire.";
                    }
    
                    leaf incoming-interface {
                      type if:interface-ref;
                      description
                        "Reference to an entry in the global interface
    list.";
                    }
    
                    leaf mode {
                      type pim-mode;
                      description "PIM mode.";
                    }
    
                    leaf msdp-learned {
                      type boolean;
                      description
                        "'true' if route is learned from MSDP (Multicast Source
     Discovery Protocol).";
                    }
    
                    leaf rp-address {
                      type inet:ip-address;
                      description
                        "RP (Rendezvous Point) address.";
                    }
    
                    leaf rpf-neighbor {
                      type inet:ip-address;
                      description
                        "RPF (Reverse Path Forwarding) neighbor address.";
                    }
    
                    leaf spt-bit {
                      type boolean;
                      description
                        "'true' if SPT (Shortest Path Tree) bit is set.";
                    }
    
                    leaf up-time {
                      type uint32;
                      units "seconds";
                      description
                        "Up time duration.";
                    }
    
                    list outgoing-interface {
                      key "name";
                      description
                        "A list of outgoing interfaces.";
                      leaf name {
                        type if:interface-ref;
                        description
                          "Interface name.";
                      }
    
                      leaf expiration {
                        type timer-value;
                        description
                          "Expiring information.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        description
                          "Up time duration.";
                      }
    
                      leaf jp-state {
                        type enumeration {
                          enum "no-info" {
                            value 0;
                            description
                              "The interface has Join state and no timers running";
                          }
                          enum "join" {
                            value 1;
                            description
                              "The interface has Join state.";
                          }
                          enum "prune-pending" {
                            value 2;
                            description
                              "The router has received a Prune on this interface from
    a downstream neighbor and is waiting to see whether
    the prune will be overridden by another downstream
    router.  For forwarding purposes, the Prune-Pending
    state functions exactly like the Join state.";
                          }
                        }
                        description
                          "Join-prune state.";
                      }
                    }  // list outgoing-interface
                  }  // list ipv4-route
    
                  list ipv6-route {
                    when
                      "../../../address-family = 'rt:ipv6'" {
                      description
                        "Only applicable to IPv6 address family.";
                    }
                    key "group source-address is-rpt";
                    description
                      "A list of IPv6 routes.";
                    leaf group {
                      type rt-types:ipv6-multicast-group-address;
                      description
                        "Group address.";
                    }
    
                    leaf source-address {
                      type rt-types:ipv6-multicast-source-address;
                      description
                        "Source address.";
                    }
    
                    leaf is-rpt {
                      type boolean;
                      description
                        "'true' if the tree is RPT (Rendezvous-Point Tree).";
                    }
    
                    leaf expiration {
                      type timer-value;
                      description
                        "When the route will expire.";
                    }
    
                    leaf incoming-interface {
                      type if:interface-ref;
                      description
                        "Reference to an entry in the global interface
    list.";
                    }
    
                    leaf mode {
                      type pim-mode;
                      description "PIM mode.";
                    }
    
                    leaf msdp-learned {
                      type boolean;
                      description
                        "'true' if route is learned from MSDP (Multicast Source
     Discovery Protocol).";
                    }
    
                    leaf rp-address {
                      type inet:ip-address;
                      description
                        "RP (Rendezvous Point) address.";
                    }
    
                    leaf rpf-neighbor {
                      type inet:ip-address;
                      description
                        "RPF (Reverse Path Forwarding) neighbor address.";
                    }
    
                    leaf spt-bit {
                      type boolean;
                      description
                        "'true' if SPT (Shortest Path Tree) bit is set.";
                    }
    
                    leaf up-time {
                      type uint32;
                      units "seconds";
                      description
                        "Up time duration.";
                    }
    
                    list outgoing-interface {
                      key "name";
                      description
                        "A list of outgoing interfaces.";
                      leaf name {
                        type if:interface-ref;
                        description
                          "Interface name.";
                      }
    
                      leaf expiration {
                        type timer-value;
                        description
                          "Expiring information.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        description
                          "Up time duration.";
                      }
    
                      leaf jp-state {
                        type enumeration {
                          enum "no-info" {
                            value 0;
                            description
                              "The interface has Join state and no timers running";
                          }
                          enum "join" {
                            value 1;
                            description
                              "The interface has Join state.";
                          }
                          enum "prune-pending" {
                            value 2;
                            description
                              "The router has received a Prune on this interface from
    a downstream neighbor and is waiting to see whether
    the prune will be overridden by another downstream
    router.  For forwarding purposes, the Prune-Pending
    state functions exactly like the Join state.";
                          }
                        }
                        description
                          "Join-prune state.";
                      }
                    }  // list outgoing-interface
                  }  // list ipv6-route
                }  // container topology-tree-info
    
                container rp {
                  description
                    "PIM RP state data.";
                  container static-rp {
                    description
                      "Containing static RP attributes.";
                    list ipv4-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      key "ipv4-address";
                      description
                        "A list of IPv4 RP addresses.";
                      leaf ipv4-address {
                        type inet:ipv4-address;
                        description
                          "Specifies a static RP address.";
                      }
    
                      container sm {
                        presence
                          "Indicate the support of sparse mode.";
                        description
                          "PIM SM configuration data.";
                        leaf policy-name {
                          type string;
                          description
                            "The string value is the name to uniquely identify a
    policy that contains one or more policy rules used to
    determine which multicast group addresses are mapped
    to this statically configured RP address.
    If a policy is not specified, the entire multicast address
    space is mapped.
    The definition of such a policy is outside the scope
    of this document.";
                        }
    
                        leaf override {
                          if-feature static-rp-override;
                          type boolean;
                          default "false";
                          description
                            "When there is a conflict between static RP and dynamic
    RP, setting this attribute to 'true' will ask the
    system to use static RP.";
                        }
                      }  // container sm
                    }  // list ipv4-rp
    
                    list ipv6-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      key "ipv6-address";
                      description
                        "A list of IPv6 RP addresses.";
                      leaf ipv6-address {
                        type inet:ipv6-address;
                        description
                          "Specifies a static RP address.";
                      }
    
                      container sm {
                        presence
                          "Indicate the support of sparse mode.";
                        description
                          "PIM SM configuration data.";
                        leaf policy-name {
                          type string;
                          description
                            "The string value is the name to uniquely identify a
    policy that contains one or more policy rules used to
    determine which multicast group addresses are mapped
    to this statically configured RP address.
    If a policy is not specified, the entire multicast address
    space is mapped.
    The definition of such a policy is outside the scope
    of this document.";
                        }
    
                        leaf override {
                          if-feature static-rp-override;
                          type boolean;
                          default "false";
                          description
                            "When there is a conflict between static RP and dynamic
    RP, setting this attribute to 'true' will ask the
    system to use static RP.";
                        }
                      }  // container sm
                    }  // list ipv6-rp
                  }  // container static-rp
    
                  container bsr {
                    if-feature bsr;
                    description
                      "Containing BSR (BootStrap Router) attributes.";
                    container bsr-candidate {
                      presence
                        "Present to serve as a BSR candidate";
                      description
                        "BSR candidate attributes.";
                      choice interface-or-address {
                        description
                          "Use either interface or ip-address.";
                        case interface {
                          if-feature candidate-interface;
                          leaf interface {
                            type if:interface-ref;
                            mandatory true;
                            description
                              "Interface to be used by BSR.";
                          }
                        }  // case interface
    
                        case ipv4-address {
                          when
                            "../../../pim-base:address-family = 'rt:ipv4'" {
                            description
                              "Only applicable to IPv4 address family.";
                          }
                          if-feature candidate-ipv4;
                          leaf ipv4-address {
                            type inet:ipv4-address;
                            mandatory true;
                            description
                              "IP address to be used by BSR.";
                          }
                        }  // case ipv4-address
    
                        case ipv6-address {
                          when
                            "../../../pim-base:address-family = 'rt:ipv6'" {
                            description
                              "Only applicable to IPv6 address family.";
                          }
                          if-feature candidate-ipv6;
                          leaf ipv6-address {
                            type inet:ipv6-address;
                            mandatory true;
                            description
                              "IP address to be used by BSR.";
                          }
                        }  // case ipv6-address
                      }  // choice interface-or-address
    
                      leaf hash-mask-length {
                        type uint8 {
                          range "0..128";
                        }
                        mandatory true;
                        description
                          "Value contained in BSR messages used by all routers to
    hash (map) to an RP.";
                      }
    
                      leaf priority {
                        type uint8 {
                          range "0..255";
                        }
                        mandatory true;
                        description
                          "BSR election priority among different candidate BSRs.
    A larger value has a higher priority over a smaller
    value.";
                      }
                    }  // container bsr-candidate
    
                    list rp-candidate-interface {
                      if-feature candidate-interface;
                      key "interface";
                      description
                        "A list of RP candidates";
                      leaf interface {
                        type if:interface-ref;
                        description
                          "Interface that the RP candidate uses.";
                      }
    
                      leaf policy {
                        type string;
                        description
                          "ACL (Access Control List) policy used to filter group
    addresses.";
                      }
    
                      leaf mode {
                        type identityref {
                          base rp-mode;
                        }
                        description "RP mode.";
                      }
                    }  // list rp-candidate-interface
    
                    list rp-candidate-ipv4-address {
                      when
                        "../../../pim-base:address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      if-feature candidate-ipv4;
                      key "ipv4-address";
                      description
                        "A list of RP candidates";
                      leaf ipv4-address {
                        type inet:ipv4-address;
                        description
                          "IPv4 address that the RP candidate uses.";
                      }
    
                      leaf policy {
                        type string;
                        description
                          "ACL (Access Control List) policy used to filter group
    addresses.";
                      }
    
                      leaf mode {
                        type identityref {
                          base rp-mode;
                        }
                        description "RP mode.";
                      }
                    }  // list rp-candidate-ipv4-address
    
                    list rp-candidate-ipv6-address {
                      when
                        "../../../pim-base:address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      if-feature candidate-ipv6;
                      key "ipv6-address";
                      description
                        "A list of RP candidates";
                      leaf ipv6-address {
                        type inet:ipv6-address;
                        description
                          "IPv6 address that the RP candidate uses.";
                      }
    
                      leaf policy {
                        type string;
                        description
                          "ACL (Access Control List) policy used to filter group
    addresses.";
                      }
    
                      leaf mode {
                        type identityref {
                          base rp-mode;
                        }
                        description "RP mode.";
                      }
                    }  // list rp-candidate-ipv6-address
    
                    container bsr {
                      description
                        "BSR information.";
                      leaf address {
                        type inet:ip-address;
                        description
                          "BSR address";
                      }
    
                      leaf hash-mask-length {
                        type uint8 {
                          range "0..128";
                        }
                        description
                          "Hash mask length.";
                      }
    
                      leaf priority {
                        type uint8 {
                          range "0..255";
                        }
                        description "Priority.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        description
                          "Up time duration.";
                      }
                    }  // container bsr
    
                    choice election-state {
                      if-feature bsr-election-state;
                      description
                        "BSR election state.";
                      leaf candidate-bsr-state {
                        type enumeration {
                          enum "candidate" {
                            value 0;
                            description
                              "The router is a candidate to be the BSR for the
    scope zone, but currently another router is the
    preferred BSR.";
                          }
                          enum "pending" {
                            value 1;
                            description
                              "The router is a candidate to be the BSR for the
    scope zone. Currently, no other router is the
    preferred BSR, but this router is not yet the
    elected BSR.  This is a temporary state that
    prevents rapid thrashing of the choice of BSR
    during BSR election.";
                          }
                          enum "elected" {
                            value 2;
                            description
                              "The router is the elected BSR for the scope zone
    and it MUST perform all the BSR functions.";
                          }
                        }
                        description
                          "Candidate-BSR state.";
                        reference
                          "RFC5059, Section 3.1.1.";
    
                      }
                      leaf non-candidate-bsr-state {
                        type enumeration {
                          enum "no-info" {
                            value 0;
                            description
                              "The router has no information about this scope
    zone.";
                          }
                          enum "accept-any" {
                            value 1;
                            description
                              "The router does not know of an active BSR, and will
    accept the first Bootstrap message it sees as giving
    the new BSR's identity and the RP-Set.";
                          }
                          enum "accept" {
                            value 2;
                            description
                              "The router knows the identity of the current BSR,
    and is using the RP-Set provided by that BSR. Only
    Bootstrap messages from that BSR or from a
    Candidate-BSR (C-BSR) with higher weight than the
    current BSR will be accepted.";
                          }
                        }
                        description
                          "Non-candidate-BSR state.";
                        reference
                          "RFC5059, Section 3.1.2.";
    
                      }
                    }  // choice election-state
    
                    leaf bsr-next-bootstrap {
                      type uint16;
                      units "seconds";
                      description
                        "The time when next bootstrap will be sent.";
                    }
    
                    container rp {
                      description
                        "State information of the RP.";
                      leaf rp-address {
                        type inet:ip-address;
                        description
                          "RP address.";
                      }
    
                      leaf group-policy {
                        type string;
                        description
                          "Group policy.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        description
                          "Up time duration.";
                      }
                    }  // container rp
    
                    leaf rp-candidate-next-advertisement {
                      type uint16;
                      units "seconds";
                      description
                        "When the next advertisement will be sent as RP candidate";
                    }
                  }  // container bsr
    
                  container rp-list {
                    description
                      "Containing a list of RPs.";
                    list ipv4-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      key "ipv4-address mode";
                      description
                        "A list of IPv4 RP addresses.";
                      leaf ipv4-address {
                        type inet:ipv4-address;
                        description
                          "RP address.";
                      }
    
                      leaf mode {
                        type identityref {
                          base rp-mode;
                        }
                        description "RP mode.";
                      }
    
                      leaf info-source-address {
                        type inet:ipv4-address;
                        description
                          "The address where RP information is learned.";
                      }
    
                      leaf info-source-type {
                        type identityref {
                          base rp-info-source-type;
                        }
                        description
                          "The information source of an RP.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        description
                          "Up time duration.";
                      }
                    }  // list ipv4-rp
    
                    list ipv6-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      key "ipv6-address mode";
                      description
                        "A list of IPv6 RP addresses.";
                      leaf ipv6-address {
                        type inet:ipv6-address;
                        description
                          "RP address.";
                      }
    
                      leaf mode {
                        type identityref {
                          base rp-mode;
                        }
                        description "RP mode.";
                      }
    
                      leaf info-source-address {
                        type inet:ipv6-address;
                        description
                          "The address where RP information is learned.";
                      }
    
                      leaf info-source-type {
                        type identityref {
                          base rp-info-source-type;
                        }
                        description
                          "The information source of an RP.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        description
                          "Up time duration.";
                      }
                    }  // list ipv6-rp
                  }  // container rp-list
    
                  container rp-mappings {
                    description
                      "Containing a list of group-to-RP mappings.";
                    list ipv4-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      key "group rp-address";
                      description
                        "A list of group-to-RP mappings.";
                      leaf group {
                        type inet:ipv4-prefix;
                        description
                          "Group prefix.";
                      }
    
                      leaf rp-address {
                        type inet:ipv4-address;
                        description
                          "RP address.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        description
                          "Up time duration.";
                      }
                    }  // list ipv4-rp
    
                    list ipv6-rp {
                      when
                        "../../../pim-base:address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      key "group rp-address";
                      description
                        "A list of IPv6 RP addresses.";
                      leaf group {
                        type inet:ipv6-prefix;
                        description
                          "Group prefix.";
                      }
    
                      leaf rp-address {
                        type inet:ipv6-address;
                        description
                          "RP address.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        description
                          "Up time duration.";
                      }
                    }  // list ipv6-rp
                  }  // container rp-mappings
                }  // container rp
    
                container dm {
                  presence
                    "Present to enable dense-mode.";
                  description
                    "PIM DM state data.";
                }  // container dm
    
                container sm {
                  description
                    "PIM SM configuration data.";
                  container asm {
                    description
                      "ASM (Any Source Multicast) attributes.";
                    container anycast-rp {
                      presence
                        "Present to enable anycast RP (Rendezvous Point).";
                      description
                        "Anycast RP attributes.";
                      container ipv4 {
                        when
                          "../../../../pim-base:address-family = 'rt:ipv4'" {
                          description
                            "Only applicable to IPv4 address family.";
                        }
                        description
                          "IPv4 attributes. Only applicable when
    pim-base:address-family is IPv4.";
                        list ipv4-anycast-rp {
                          key "anycast-address rp-address";
                          description
                            "A list of anycast RP settings.";
                          leaf anycast-address {
                            type inet:ipv4-address;
                            description
                              "IP address of the anycast RP set. This IP address
    is used by the multicast groups or sources to join
    or register.";
                          }
    
                          leaf rp-address {
                            type inet:ipv4-address;
                            description
                              "IP address of the router configured with anycast
    RP. This is the IP address where the Register
    messages are forwarded.";
                          }
                        }  // list ipv4-anycast-rp
                      }  // container ipv4
    
                      container ipv6 {
                        when
                          "../../../../pim-base:address-family = 'rt:ipv6'" {
                          description
                            "Only applicable to IPv6 address family.";
                        }
                        description
                          "IPv6 attributes. Only applicable when
    pim-base:address-family is IPv6.";
                        list ipv6-anycast-rp {
                          key "anycast-address rp-address";
                          description
                            "A list of anycast RP settings.";
                          leaf anycast-address {
                            type inet:ipv6-address;
                            description
                              "IP address of the anycast RP set. This IP address
    is used by the multicast groups or sources to join
    or register.";
                          }
    
                          leaf rp-address {
                            type inet:ipv6-address;
                            description
                              "IP address of the router configured with anycast
    RP. This is the IP address where the Register
    messages are forwarded.";
                          }
                        }  // list ipv6-anycast-rp
                      }  // container ipv6
                    }  // container anycast-rp
    
                    container spt-switch {
                      description
                        "SPT (Shortest Path Tree) switching attributes.";
                      container infinity {
                        if-feature spt-switch-infinity;
                        presence
                          "Present if SPT switchover threshold is set to
    infinity, according to the policy specified below.";
                        description
                          "The receiver's DR (Designated Router) never triggers
    the switchover from the RPT to the SPT.";
                        leaf policy-name {
                          if-feature spt-switch-policy;
                          type string;
                          description
                            "Switch policy.";
                        }
                      }  // container infinity
                    }  // container spt-switch
                  }  // container asm
    
                  container ssm {
                    presence
                      "Present to enable SSM (Source-Specific Multicast).";
                    description
                      "SSM (Source-Specific Multicast) attributes.";
                    leaf range-policy {
                      type string;
                      description
                        "Policy used to define SSM address range.";
                    }
                  }  // container ssm
                }  // container sm
              }  // list address-family
    
              container interfaces {
                description
                  "Containing a list of interfaces.";
                list interface {
                  key "interface";
                  description
                    "List of pim interfaces.";
                  leaf interface {
                    type if:interface-ref;
                    description
                      "Reference to an entry in the global interface
    list.";
                  }
    
                  list address-family {
                    key "address-family";
                    description
                      "Each list entry for one address family.";
                    leaf address-family {
                      type identityref {
                        base address-family;
                      }
                      mandatory true;
                      description
                        "Address family.";
                    }
    
                    container bfd {
                      if-feature bfd;
                      description
                        "BFD (Bidirectional Forwarding Detection) operation.";
                      leaf enable {
                        type boolean;
                        description
                          "'true' to suppport BFD for the interface.";
                      }
                    }  // container bfd
    
                    leaf dr-priority {
                      if-feature intf-dr-priority;
                      type uint32;
                      description
                        "DR (Designated Router) priority";
                    }
    
                    leaf hello-interval {
                      if-feature intf-hello-interval;
                      type timer-value;
                      description
                        "Hello interval";
                    }
    
                    choice hello-holdtime-or-multiplier {
                      description
                        "Use holdtime or multiplier";
                      case holdtime {
                        if-feature intf-hello-holdtime;
                        leaf hello-holdtime {
                          type timer-value;
                          description
                            "Hello holdtime";
                        }
                      }  // case holdtime
    
                      case multiplier {
                        if-feature intf-hello-multiplier;
                        leaf hello-multiplier {
                          type rt-types:timer-multiplier;
                          description
                            "Hello multiplier is the number by which the hello
    interval is multplied to obtain the hold time";
                        }
                      }  // case multiplier
                    }  // choice hello-holdtime-or-multiplier
    
                    leaf jp-interval {
                      if-feature intf-jp-interval;
                      type timer-value;
                      description
                        "Join prune interval";
                    }
    
                    choice jp-holdtime-or-multiplier {
                      description
                        "Use holdtime or multiplier";
                      case holdtime {
                        if-feature intf-jp-holdtime;
                        leaf jp-holdtime {
                          type timer-value;
                          description
                            "Join prune holdtime";
                        }
                      }  // case holdtime
    
                      case multiplier {
                        if-feature intf-jp-multiplier;
                        leaf jp-multiplier {
                          type rt-types:timer-multiplier;
                          description
                            "Join prune multiplier is the number by which the join
    prune interval is multplied to obtain the hold time";
                        }
                      }  // case multiplier
                    }  // choice jp-holdtime-or-multiplier
    
                    leaf propagation-delay {
                      if-feature intf-propagation-delay;
                      type uint16;
                      units "milliseconds";
                      description
                        "Propagation description";
                    }
    
                    leaf override-interval {
                      if-feature intf-override-interval;
                      type uint16;
                      units "milliseconds";
                      description
                        "Override interval";
                    }
    
                    container ipv4 {
                      when
                        "../address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      description
                        "Interface state attributes for IPv4.";
                      leaf-list address {
                        type inet:ipv4-address;
                        description
                          "List of addresses.";
                      }
    
                      leaf dr-address {
                        type inet:ipv4-address;
                        description
                          "DR (Designated Router) address.";
                      }
                    }  // container ipv4
    
                    container ipv6 {
                      when
                        "../address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      description
                        "Interface state attributes for IPv6.";
                      leaf-list address {
                        type inet:ipv6-address;
                        description
                          "List of addresses.";
                      }
    
                      leaf dr-address {
                        type inet:ipv6-address;
                        description
                          "DR (Designated Router) address.";
                      }
                    }  // container ipv6
    
                    leaf oper-status {
                      type enumeration {
                        enum "up" {
                          value 0;
                          description
                            "Ready to pass packets.";
                        }
                        enum "down" {
                          value 1;
                          description
                            "The interface does not pass any packets.";
                        }
                      }
                      description
                        "Operational status.";
                    }
    
                    leaf hello-expiration {
                      type timer-value;
                      description
                        "Hello interval expiration time.";
                    }
    
                    list neighbor-ipv4 {
                      when
                        "../address-family = 'rt:ipv4'" {
                        description
                          "Only applicable to IPv4 address family.";
                      }
                      key "address";
                      description
                        "Neighbor state information.";
                      leaf address {
                        type inet:ipv4-address;
                        description
                          "Neighbor address.";
                      }
    
                      leaf bfd-status {
                        type enumeration {
                          enum "up" {
                            value 0;
                            description
                              "BFD (Bidirectional Forwarding Detection) is up.";
                          }
                          enum "down" {
                            value 1;
                            description
                              "BFD (Bidirectional Forwarding Detection) is down.";
                          }
                        }
                        description
                          "BFD (Bidirectional Forwarding Detection) status.";
                      }
    
                      leaf expiration {
                        type timer-value;
                        description
                          "Neighbor expiring information.";
                      }
    
                      leaf dr-priority {
                        type uint32;
                        description
                          "DR (Designated Router) priority";
                      }
    
                      leaf gen-id {
                        type uint32;
                        description
                          "Generation ID.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        description
                          "Up time duration.";
                      }
                    }  // list neighbor-ipv4
    
                    list neighbor-ipv6 {
                      when
                        "../address-family = 'rt:ipv6'" {
                        description
                          "Only applicable to IPv6 address family.";
                      }
                      key "address";
                      description
                        "Neighbor state information.";
                      leaf address {
                        type inet:ipv6-address;
                        description
                          "Neighbor address.";
                      }
    
                      leaf bfd-status {
                        type enumeration {
                          enum "up" {
                            value 0;
                            description
                              "BFD (Bidirectional Forwarding Detection) is up.";
                          }
                          enum "down" {
                            value 1;
                            description
                              "BFD (Bidirectional Forwarding Detection) is down.";
                          }
                        }
                        description
                          "BFD (Bidirectional Forwarding Detection) status.";
                      }
    
                      leaf expiration {
                        type timer-value;
                        description
                          "Neighbor expiring information.";
                      }
    
                      leaf dr-priority {
                        type uint32;
                        description
                          "DR (Designated Router) priority";
                      }
    
                      leaf gen-id {
                        type uint32;
                        description
                          "Generation ID.";
                      }
    
                      leaf up-time {
                        type uint32;
                        units "seconds";
                        description
                          "Up time duration.";
                      }
                    }  // list neighbor-ipv6
    
                    container dm {
                      presence
                        "Present to enable dense-mode.";
                      description
                        "PIM DM state data.";
                    }  // container dm
    
                    container sm {
                      presence
                        "Present to enable sparse-mode.";
                      description
                        "PIM SM configuration data.";
                      leaf passive {
                        type empty;
                        description
                          "Specifies that no PIM messages are sent or accepted on
    this PIM interface, but the interface can be included in a
    multicast forwarding entry.";
                      }
                    }  // container sm
                  }  // list address-family
                }  // list interface
              }  // container interfaces
            }  // container pim
          }  // container control-plane-protocols
    
          container ribs {
            status obsolete;
            description "Container for RIBs.";
            list rib {
              key "name";
              min-elements 1;
              status obsolete;
              description
                "Each entry represents a RIB identified by the 'name'
    key.  All routes in a RIB MUST belong to the same address
    family.
    
    An implementation SHOULD provide one system-controlled
    default RIB for each supported address family.";
              leaf name {
                type string;
                status obsolete;
                description
                  "The name of the RIB.";
              }
    
              leaf address-family {
                type identityref {
                  base address-family;
                }
                mandatory true;
                description "Address family.";
              }
    
              leaf default-rib {
                if-feature multiple-ribs;
                type boolean;
                default "true";
                status obsolete;
                description
                  "This flag has the value of 'true' if and only if the
    RIB is the default RIB for the given address family.
    
    By default, control-plane protocols place their routes
    in the default RIBs.";
              }
    
              container routes {
                status obsolete;
                description
                  "Current contents of the RIB.";
                list route {
                  status obsolete;
                  description
                    "A RIB route entry.  This data node MUST be augmented
    with information specific to routes of each address
    family.";
                  leaf route-preference {
                    type route-preference;
                    status obsolete;
                    description
                      "This route attribute, also known as 'administrative
    distance', allows for selecting the preferred route
    among routes with the same destination prefix.  A
    smaller value indicates a route that is
    more preferred.";
                  }
    
                  container next-hop {
                    status obsolete;
                    description
                      "Route's next-hop attribute.";
                    choice next-hop-options {
                      mandatory true;
                      description
                        "Options for next hops.
    
    It is expected that further cases will be added through
    augments from other modules, e.g., for recursive
    next hops.";
                      case simple-next-hop {
                        description
                          "This case represents a simple next hop consisting of the
    next-hop address and/or outgoing interface.
    
    Modules for address families MUST augment this case with a
    leaf containing a next-hop address of that address
    family.";
                        leaf outgoing-interface {
                          type if:interface-ref;
                          description
                            "Name of the outgoing interface.";
                        }
    
                        leaf next-hop-address {
                          type inet:ipv6-address;
                          status obsolete;
                          description
                            "IPv6 address of the next hop.";
                        }
    
                        leaf next-hop-address {
                          type inet:ipv4-address;
                          status obsolete;
                          description
                            "IPv4 address of the next hop.";
                        }
    
                        leaf next-hop-address {
                          type inet:ipv4-address;
                          description
                            "IPv4 address of the next hop.";
                        }
                      }  // case simple-next-hop
                      leaf special-next-hop {
                        type enumeration {
                          enum "blackhole" {
                            value 0;
                            description
                              "Silently discard the packet.";
                          }
                          enum "unreachable" {
                            value 1;
                            description
                              "Discard the packet and notify the sender with an error
    message indicating that the destination host is
    unreachable.";
                          }
                          enum "prohibit" {
                            value 2;
                            description
                              "Discard the packet and notify the sender with an error
    message indicating that the communication is
    administratively prohibited.";
                          }
                          enum "receive" {
                            value 3;
                            description
                              "The packet will be received by the local system.";
                          }
                        }
                        description
                          "Options for special next hops.";
                      }
                      container next-hop-list {
                        description
                          "Container for multiple next hops.";
                        list next-hop {
                          description
                            "An entry in a next-hop list.
    
    Modules for address families MUST augment this list
    with a leaf containing a next-hop address of that
    address family.";
                          leaf outgoing-interface {
                            type if:interface-ref;
                            description
                              "Name of the outgoing interface.";
                          }
    
                          leaf address {
                            type inet:ipv6-address;
                            status obsolete;
                            description
                              "IPv6 address of the next hop.";
                          }
    
                          leaf address {
                            type inet:ipv4-address;
                            status obsolete;
                            description
                              "IPv4 address of the next hop.";
                          }
    
                          leaf address {
                            type inet:ipv4-address;
                            description
                              "IPv4 address of the next-hop.";
                          }
                        }  // list next-hop
                      }  // container next-hop-list
                    }  // choice next-hop-options
                  }  // container next-hop
    
                  leaf source-protocol {
                    type identityref {
                      base routing-protocol;
                    }
                    mandatory true;
                    description
                      "Type of the routing protocol from which the route
    originated.";
                  }
    
                  leaf active {
                    type empty;
                    description
                      "The presence of this leaf indicates that the route is
    preferred among all routes in the same RIB that have the
    same destination prefix.";
                  }
    
                  leaf last-updated {
                    type yang:date-and-time;
                    description
                      "Timestamp of the last modification of the route.  If the
    route was never modified, it is the time when the route was
    inserted into the RIB.";
                  }
    
                  leaf metric {
                    type uint32;
                    description
                      "This leaf describes isis metric of a route.";
                  }
    
                  leaf-list tag {
                    type uint32;
                    description
                      "This leaf describes list of tags associated
    with the route.";
                  }
    
                  leaf route-type {
                    type enumeration {
                      enum "l2-up-internal" {
                        value 0;
                        description
                          "Level 2 internal route
    and not leaked to a lower level";
                      }
                      enum "l1-up-internal" {
                        value 1;
                        description
                          "Level 1 internal route
    and not leaked to a lower level";
                      }
                      enum "l2-up-external" {
                        value 2;
                        description
                          "Level 2 external route
    and not leaked to a lower level";
                      }
                      enum "l1-up-external" {
                        value 3;
                        description
                          "Level 1 external route
    and not leaked to a lower level";
                      }
                      enum "l2-down-internal" {
                        value 4;
                        description
                          "Level 2 internal route
    and leaked to a lower level";
                      }
                      enum "l1-down-internal" {
                        value 5;
                        description
                          "Level 1 internal route
    and leaked to a lower level";
                      }
                      enum "l2-down-external" {
                        value 6;
                        description
                          "Level 2 external route
    and leaked to a lower level";
                      }
                      enum "l1-down-external" {
                        value 7;
                        description
                          "Level 1 external route
    and leaked to a lower level";
                      }
                    }
                    description
                      "This leaf describes the type of isis route.";
                  }
    
                  leaf destination-prefix {
                    type inet:ipv6-prefix;
                    status obsolete;
                    description
                      "IPv6 destination prefix.";
                  }
    
                  leaf destination-prefix {
                    type inet:ipv4-prefix;
                    status obsolete;
                    description
                      "IPv4 destination prefix.";
                  }
    
                  leaf destination-prefix {
                    type inet:ipv4-prefix;
                    description
                      "IPv4 destination prefix.";
                  }
                }  // list route
              }  // container routes
    
              action active-route {
                status obsolete;
                description
                  "Return the active RIB route that is used for the
    destination address.
    
    Address-family-specific modules MUST augment input
    parameters with a leaf named 'destination-address'.";
                output {
                  container route {
                    status obsolete;
                    description
                      "The active RIB route for the specified
    destination.
    
    If no route exists in the RIB for the destination
    address, no output is returned.
    
    Address-family-specific modules MUST augment this
    container with appropriate route contents.";
                    container next-hop {
                      status obsolete;
                      description
                        "Route's next-hop attribute.";
                      choice next-hop-options {
                        mandatory true;
                        description
                          "Options for next hops.
    
    It is expected that further cases will be added through
    augments from other modules, e.g., for recursive
    next hops.";
                        case simple-next-hop {
                          description
                            "This case represents a simple next hop consisting of the
    next-hop address and/or outgoing interface.
    
    Modules for address families MUST augment this case with a
    leaf containing a next-hop address of that address
    family.";
                          leaf outgoing-interface {
                            type if:interface-ref;
                            description
                              "Name of the outgoing interface.";
                          }
    
                          leaf next-hop-address {
                            type inet:ipv6-address;
                            status obsolete;
                            description
                              "IPv6 address of the next hop.";
                          }
    
                          leaf next-hop-address {
                            type inet:ipv4-address;
                            status obsolete;
                            description
                              "IPv4 address of the next hop.";
                          }
    
                          leaf next-hop-address {
                            type inet:ipv4-address;
                            description
                              "IPv4 address of the next hop.";
                          }
                        }  // case simple-next-hop
                        leaf special-next-hop {
                          type enumeration {
                            enum "blackhole" {
                              value 0;
                              description
                                "Silently discard the packet.";
                            }
                            enum "unreachable" {
                              value 1;
                              description
                                "Discard the packet and notify the sender with an error
    message indicating that the destination host is
    unreachable.";
                            }
                            enum "prohibit" {
                              value 2;
                              description
                                "Discard the packet and notify the sender with an error
    message indicating that the communication is
    administratively prohibited.";
                            }
                            enum "receive" {
                              value 3;
                              description
                                "The packet will be received by the local system.";
                            }
                          }
                          description
                            "Options for special next hops.";
                        }
                        container next-hop-list {
                          description
                            "Container for multiple next hops.";
                          list next-hop {
                            description
                              "An entry in a next-hop list.
    
    Modules for address families MUST augment this list
    with a leaf containing a next-hop address of that
    address family.";
                            leaf outgoing-interface {
                              type if:interface-ref;
                              description
                                "Name of the outgoing interface.";
                            }
    
                            leaf next-hop-address {
                              type inet:ipv6-address;
                              status obsolete;
                              description
                                "IPv6 address of the next hop.";
                            }
    
                            leaf next-hop-address {
                              type inet:ipv4-address;
                              status obsolete;
                              description
                                "IPv4 address of the next hop.";
                            }
    
                            leaf next-hop-address {
                              type inet:ipv4-address;
                              description
                                "IPv4 address of the next hop.";
                            }
                          }  // list next-hop
                        }  // container next-hop-list
                      }  // choice next-hop-options
                    }  // container next-hop
    
                    leaf source-protocol {
                      type identityref {
                        base routing-protocol;
                      }
                      mandatory true;
                      description
                        "Type of the routing protocol from which the route
    originated.";
                    }
    
                    leaf active {
                      type empty;
                      description
                        "The presence of this leaf indicates that the route is
    preferred among all routes in the same RIB that have the
    same destination prefix.";
                    }
    
                    leaf last-updated {
                      type yang:date-and-time;
                      description
                        "Timestamp of the last modification of the route.  If the
    route was never modified, it is the time when the route was
    inserted into the RIB.";
                    }
    
                    leaf destination-prefix {
                      type inet:ipv6-prefix;
                      status obsolete;
                      description
                        "IPv6 destination prefix.";
                    }
    
                    leaf destination-prefix {
                      type inet:ipv4-prefix;
                      status obsolete;
                      description
                        "IPv4 destination prefix.";
                    }
    
                    leaf destination-prefix {
                      type inet:ipv4-prefix;
                      description
                        "IPv4 destination prefix.";
                    }
                  }  // container route
                }
    
                input {
                  leaf destination-address {
                    type inet:ipv6-address;
                    status obsolete;
                    description
                      "IPv6 destination address.";
                  }
    
                  leaf destination-address {
                    type inet:ipv4-address;
                    status obsolete;
                    description
                      "IPv4 destination address.";
                  }
    
                  leaf destination-address {
                    type inet:ipv4-address;
                    description
                      "IPv4 destination address.";
                  }
                }
              }  // rpc active-route
            }  // list rib
          }  // container ribs
        }  // container routing-state
      }  // module ietf-routing
    

© 2023 YumaWorks, Inc. All rights reserved.