netconfcentral logo

ietf-igmp-mld-snooping@2017-10-25



  module ietf-igmp-mld-snooping {

    yang-version 1;

    namespace
      "urn:ietf:params:xml:ns:yang:ietf-igmp-mld-snooping";

    prefix ims;

    import ietf-inet-types {
      prefix inet;
    }
    import ietf-yang-types {
      prefix yang;
    }
    import ietf-interfaces {
      prefix if;
    }
    import ietf-l2vpn {
      prefix l2vpn;
    }

    organization "IETF PIM Working Group";

    contact
      "WG Web:   <http://tools.ietf.org/wg/pim/>
      WG List:  <mailto:pim@ietf.org>

      WG Chair: Stig Venaas
                <mailto:stig@venaas.com>

      WG Chair: Mike McBride
                <mailto:mmcbride7@gmail.com>

      Editors:  Hongji Zhao
            <mailto:hongji.zhao@ericsson.com>

            Xufeng Liu
            <mailto:Xufeng_Liu@jabil.com>

            Yisong Liu
            <mailto:liuyisong@huawei.com>

            Anish Peter
            <mailto:anish.ietf@gmail.com>

            Mahesh Sivakumar
            <mailto:masivaku@cisco.com>

            ";

    description
      "The module defines a collection of YANG definitions common for
     IGMP and MLD Snooping.";

    revision "2017-10-25" {
      description
        "Change model definition to fit NMDA standard.";
      reference
        "RFC XXXX: A YANG Data Model for IGMP and MLD Snooping";

    }

    revision "2017-08-14" {
      description
        "using profile to cooperate with ieee-dot1Q-bridge module";
      reference
        "RFC XXXX: A YANG Data Model for IGMP and MLD Snooping";

    }

    revision "2017-06-28" {
      description
        "augment /rt:routing/rt:control-plane-protocols
      augment /rt:routing-state/rt:control-plane-protocols";
      reference
        "RFC XXXX: A YANG Data Model for IGMP and MLD Snooping";

    }

    revision "2017-02-05" {
      description "Initial revision.";
      reference
        "RFC XXXX: A YANG Data Model for IGMP and MLD Snooping";

    }


    feature admin-enable {
      description
        "Support configuration to enable or disable IGMP and MLD
Snooping.";
    }

    feature fast-leave {
      description
        "Support configuration of fast-leave.";
    }

    feature join-group {
      description
        "Support configuration of join-group.";
    }

    feature require-router-alert {
      description
        "Support configuration of require-router-alert.";
    }

    feature static-l2-multicast-group {
      description
        "Support configuration of L2 multicast static-group.";
    }

    feature per-instance-config {
      description
        "Support configuration of each VLAN or VPLS instance or EVPN
instance.";
    }

    feature rpc-clear-groups {
      description
        "Support to clear statistics by RPC for IGMP and MLD
Snooping.";
    }

    feature explicit-tracking {
      description
        "Support configuration of per instance explicit-tracking
hosts.";
    }

    feature exclude-lite {
      description
        "Support configuration of per instance exclude-lite.";
    }

    typedef name-type {
      type string {
        length "0..32";
      }
      description
        "A text string of up to 32 characters, of locally determined
        significance.";
    }

    typedef vlan-index-type {
      type uint32 {
        range "1..4094 | 4096..4294967295";
      }
      description
        "A value used to index per-VLAN tables. Values of 0 and 4095
        are not permitted. The range of valid VLAN indices. If the
        value is greater than 4095, then it represents a VLAN with
        scope local to the particular agent, i.e., one without a
        global VLAN-ID assigned to it. Such VLANs are outside the
        scope of IEEE 802.1Q, but it is convenient to be able to
        manage them in the same way using this YANG module.";
      reference
        "IEEE Std 802.1Q-2014: Virtual Bridged Local Area Networks.";

    }

    typedef igmp-snooping-instance-ref {
      type leafref {
        path "/igmp-snooping-instances/igmp-snooping-instance/name";
      }
      description
        "This type is used by data models that need to reference igmp
snooping instance.";
    }

    typedef mld-snooping-instance-ref {
      type leafref {
        path "/mld-snooping-instances/mld-snooping-instance/name";
      }
      description
        "This type is used by data models that need to reference mld
snooping instance.";
    }

    typedef l2vpn-instance-ac-ref {
      type leafref {
        path "/l2vpn:l2vpn/l2vpn:instances/l2vpn:instance/l2vpn:endpoint/l2vpn:ac/l2vpn:name";
      }
      description "l2vpn-instance-ac-ref";
    }

    typedef l2vpn-instance-pw-ref {
      type leafref {
        path "/l2vpn:l2vpn/l2vpn:instances/l2vpn:instance/l2vpn:endpoint/l2vpn:pw/l2vpn:name";
      }
      description "l2vpn-instance-pw-ref";
    }

    typedef source-ipv4-addr-type {
      type union {
        type enumeration {
          enum "*" {
            value 0;
            description
              "Any source address.";
          }
        }
        type inet:ipv4-address;
      }
      description
        "Multicast source IP address type.";
    }

    typedef source-ipv6-addr-type {
      type union {
        type enumeration {
          enum "*" {
            value 0;
            description
              "Any source address.";
          }
        }
        type inet:ipv6-address;
      }
      description
        "Multicast source IP address type.";
    }

    grouping general-state-attributes {
      description
        "Statistics of IGMP and MLD Snooping ";
      container statistics {
        config false;
        description
          "The statistics of IGMP and MLD Snooping related packets.";
        container received {
          description
            "Statistics of received messages.";
          uses general-statistics-sent-received;
        }  // container received

        container sent {
          description
            "Statistics of sent messages.";
          uses general-statistics-sent-received;
        }  // container sent
      }  // container statistics
    }  // grouping general-state-attributes

    grouping instance-config-attributes-igmp-snooping {
      description
        "IGMP snooping configuration for each VLAN or VPLS
instance or EVPN instance.";
      uses instance-config-attributes-igmp-mld-snooping;

      leaf querier-source {
        type inet:ipv4-address;
        description
          "Use the IGMP snooping querier to support IGMP
snooping in a VLAN where PIM and IGMP are not configured.
                  The IP address is used as the source address in
messages.";
      }

      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 inet:ipv4-address;
          description
            "Multicast group IP address";
        }

        leaf source-addr {
          type source-ipv4-addr-type;
          description
            "Multicast source IP address.";
        }

        leaf-list bridge-outgoing-interface {
          when "ims:type = 'bridge'";
          type if:interface-ref;
          description
            "Outgoing interface in bridge fowarding";
        }

        leaf-list vpls-outgoing-ac {
          when "ims:type = 'vpls'";
          type l2vpn-instance-ac-ref;
          description
            "Outgoing ac in vpls fowarding";
        }

        leaf-list vpls-outgoing-pw {
          when "ims:type = 'vpls'";
          type l2vpn-instance-pw-ref;
          description
            "Outgoing pw in vpls fowarding";
        }
      }  // list static-l2-multicast-group
    }  // grouping instance-config-attributes-igmp-snooping

    grouping instance-config-attributes-igmp-mld-snooping {
      description
        "IGMP and MLD Snooping configuration of each VLAN.";
      leaf enable {
        if-feature admin-enable;
        type boolean;
        description
          "Set the value to true to enable IGMP and MLD Snooping in
the VLAN instance.";
      }

      leaf forwarding-mode {
        type enumeration {
          enum "mac" {
            value 0;
            description "";
          }
          enum "ip" {
            value 1;
            description "";
          }
        }
        description
          "The default forwarding mode for IGMP and MLD
Snooping is ip.
                   cisco command is as below
                   Router(config-vlan-config)# multicast snooping lookup
{ ip | mac }  ";
      }

      leaf explicit-tracking {
        if-feature explicit-tracking;
        type boolean;
        description
          "Tracks IGMP & MLD Snooping v3 membership reports
from individual hosts for each port of each VLAN or VSI.";
      }

      leaf exclude-lite {
        if-feature exclude-lite;
        type boolean;
        description
          "lightweight IGMPv3 and MLDv2 protocols, which simplify the
             standard versions of IGMPv3 and MLDv2.";
        reference
          "RFC5790";

      }

      leaf send-query {
        type boolean;
        default 'true';
        description
          "Enable quick response for topo changes.
             To support IGMP snooping in a VLAN where PIM and IGMP are
not configured.
               It cooperates with param querier-source. ";
      }

      leaf fast-leave {
        if-feature fast-leave;
        type empty;
        description
          "When fast leave is enabled, the IGMP software assumes that
no more than one host is present on each VLAN port.";
      }

      leaf last-member-query-interval {
        type uint16 {
          range "1..65535";
        }
        units "seconds";
        default '1';
        description
          "Last Member Query Interval, which may be tuned to modify
the
               leave latency of the network.";
        reference
          "RFC3376. Sec. 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
          "RFC3376. Sec. 4.1.7, 8.2, 8.14.2.";

      }

      leaf query-max-response-time {
        type uint16;
        units "seconds";
        default '10';
        description
          "Query maximum response time specifies the maximum time
               allowed before sending a responding report.";
        reference
          "RFC3376. Sec. 4.1.1, 8.3, 8.14.3.";

      }

      leaf require-router-alert {
        if-feature require-router-alert;
        type boolean;
        default 'false';
        description
          "When the value is true, router alert exists in the IP head
of IGMP or MLD packet.";
      }

      leaf robustness-variable {
        type uint8 {
          range "2..7";
        }
        default '2';
        description
          "Querier's Robustness Variable allows tuning for the
expected
               packet loss on a network.";
        reference
          "RFC3376. Sec. 4.1.6, 8.1, 8.14.1.";

      }

      leaf version {
        type uint8 {
          range "1..3";
        }
        description
          "IGMP and MLD Snooping version.";
      }

      leaf-list static-bridge-mrouter-interface {
        when "ims:type = 'bridge'";
        if-feature static-l2-multicast-group;
        type if:interface-ref;
        description
          "static mrouter interface in bridge fowarding";
      }

      leaf-list static-vpls-mrouter-interface {
        when "ims:type = 'vpls'";
        if-feature static-l2-multicast-group;
        type l2vpn-instance-pw-ref;
        description
          "static mrouter interface in vpls fowarding";
      }
    }  // grouping instance-config-attributes-igmp-mld-snooping

    grouping instance-config-attributes-mld-snooping {
      description
        "MLD snooping configuration of each VLAN.";
      uses instance-config-attributes-igmp-mld-snooping;

      leaf querier-source {
        type inet:ipv6-address;
        description
          "Use the MLD snooping querier to support MLD snooping where PIM
and MLD are not configured.
          The IP address is used as the source address in messages.";
      }

      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 inet:ipv6-address;
          description
            "Multicast group IP address";
        }

        leaf source-addr {
          type source-ipv6-addr-type;
          description
            "Multicast source IP address.";
        }

        leaf-list bridge-outgoing-interface {
          when "ims:type = 'bridge'";
          type if:interface-ref;
          description
            "Outgoing interface in bridge fowarding";
        }

        leaf-list vpls-outgoing-ac {
          when "ims:type = 'vpls'";
          type l2vpn-instance-ac-ref;
          description
            "Outgoing ac in vpls fowarding";
        }

        leaf-list vpls-outgoing-pw {
          when "ims:type = 'vpls'";
          type l2vpn-instance-pw-ref;
          description
            "Outgoing pw in vpls fowarding";
        }
      }  // list static-l2-multicast-group
    }  // grouping instance-config-attributes-mld-snooping

    grouping instance-state-group-attributes-igmp-mld-snooping {
      description
        "Attributes for both IGMP and MLD snooping groups.";
      leaf mac-address {
        type yang:phys-address;
        description
          "Destination mac address for L2 multicast
forwarding.";
      }

      leaf expire {
        type uint32;
        units "seconds";
        description
          "The time left before multicast group timeout.";
      }

      leaf up-time {
        type uint32;
        units "seconds";
        description
          "The time after the device created L2 multicast record.";
      }
    }  // grouping instance-state-group-attributes-igmp-mld-snooping

    grouping instance-state-attributes-igmp-snooping {
      description
        "State attributes for IGMP snooping for each VLAN or VPLS
instance or EVPN instance.";
      uses instance-state-attributes-igmp-mld-snooping;

      list group {
        key "address";
        config false;
        description
          "IGMP snooping information";
        leaf address {
          type inet:ipv4-address;
          description
            "Multicast group IP address";
        }

        uses instance-state-group-attributes-igmp-mld-snooping;

        leaf last-reporter {
          type inet:ipv4-address;
          description
            "The last host address which has sent the
               report to join the multicast group.";
        }

        list source {
          key "address";
          description
            "Source IP address for multicast stream";
          leaf address {
            type inet:ipv4-address;
            description
              "Source IP address for multicast stream";
          }

          uses instance-state-source-attributes-igmp-mld-snooping;

          leaf last-reporter {
            type inet:ipv4-address;
            description
              "The last host address which has sent the
                 report to join the multicast source and group.";
          }

          list host {
            if-feature explicit-tracking;
            key "host-address";
            description
              "List of multicast membership hosts
                 of the specific multicast source-group.";
            leaf host-address {
              type inet:ipv4-address;
              description
                "Multicast membership host address.";
            }

            leaf host-filter-mode {
              type enumeration {
                enum "include" {
                  value 0;
                  description
                    "In include mode";
                }
                enum "exclude" {
                  value 1;
                  description
                    "In exclude mode.";
                }
              }
              description
                "Filter mode for a multicast membership
                   host may be either include or exclude.";
            }
          }  // list host
        }  // list source
      }  // list group

      uses general-state-attributes;
    }  // grouping instance-state-attributes-igmp-snooping

    grouping instance-state-attributes-igmp-mld-snooping {
      description
        "State attributes for both IGMP and MLD Snooping of each
VLAN or VPLS instance or EVPN instance.";
      leaf entries-count {
        type uint32;
        config false;
        description
          "The number of L2 multicast entries in IGMP and MLD
Snooping.";
      }

      leaf-list bridge-mrouter-interface {
        when "ims:type = 'bridge'";
        type if:interface-ref;
        config false;
        description
          " mrouter interface in bridge fowarding";
      }

      leaf-list vpls-mrouter-interface {
        when "ims:type = 'vpls'";
        type l2vpn-instance-pw-ref;
        config false;
        description
          " mrouter interface in vpls fowarding";
      }
    }  // grouping instance-state-attributes-igmp-mld-snooping

    grouping instance-state-attributes-mld-snooping {
      description
        "State attributes for MLD snooping of each VLAN.";
      uses instance-state-attributes-igmp-mld-snooping;

      list group {
        key "address";
        config false;
        description
          "MLD snooping statistics information";
        leaf address {
          type inet:ipv6-address;
          description
            "Multicast group IP address";
        }

        uses instance-state-group-attributes-igmp-mld-snooping;

        leaf last-reporter {
          type inet:ipv6-address;
          description
            "The last host address which has sent the
               report to join the multicast group.";
        }

        list source {
          key "address";
          description
            "Source IP address for multicast stream";
          leaf address {
            type inet:ipv6-address;
            description
              "Source IP address for multicast stream";
          }

          uses instance-state-source-attributes-igmp-mld-snooping;

          leaf last-reporter {
            type inet:ipv6-address;
            description
              "The last host address which has sent the report to join
the multicast source and group.";
          }

          list host {
            if-feature explicit-tracking;
            key "host-address";
            description
              "List of multicast membership hosts
                 of the specific multicast source-group.";
            leaf host-address {
              type inet:ipv6-address;
              description
                "Multicast membership host address.";
            }

            leaf host-filter-mode {
              type enumeration {
                enum "include" {
                  value 0;
                  description
                    "In include mode";
                }
                enum "exclude" {
                  value 1;
                  description
                    "In exclude mode.";
                }
              }
              description
                "Filter mode for a multicast membership
                   host may be either include or exclude.";
            }
          }  // list host
        }  // list source
      }  // list group

      uses general-state-attributes;
    }  // grouping instance-state-attributes-mld-snooping

    grouping instance-state-source-attributes-igmp-mld-snooping {
      description
        "State attributes for both IGMP and MLD Snooping of each VLAN
or VPLS instance or EVPN instance.";
      leaf-list bridge-outgoing-interface {
        when "ims:type = 'bridge'";
        type if:interface-ref;
        description
          "Outgoing interface in bridge fowarding";
      }

      leaf-list vpls-outgoing-ac {
        when "ims:type = 'vpls'";
        type l2vpn-instance-ac-ref;
        description
          "Outgoing ac in vpls fowarding";
      }

      leaf-list vpls-outgoing-pw {
        when "ims:type = 'vpls'";
        type l2vpn-instance-pw-ref;
        description
          "Outgoing pw in vpls fowarding";
      }

      leaf up-time {
        type uint32;
        units "seconds";
        description
          "The time after the device created L2 multicast
record";
      }

      leaf expire {
        type uint32;
        units "seconds";
        description
          "The time left before multicast group timeout.";
      }

      leaf host-count {
        if-feature explicit-tracking;
        type uint32;
        description
          "The number of host addresses.";
      }
    }  // grouping instance-state-source-attributes-igmp-mld-snooping

    grouping general-statistics-error {
      description
        "A grouping defining statistics attributes for errors.";
      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.";
      }
    }  // grouping general-statistics-error

    grouping general-statistics-sent-received {
      description
        "A grouping defining statistics attributes.";
      leaf query {
        type yang:counter64;
        description
          "The number of query messages.";
      }

      leaf membership-report-v1 {
        type yang:counter64;
        description
          "The number of membership report v1 messages.";
      }

      leaf membership-report-v2 {
        type yang:counter64;
        description
          "The number of membership report v2 messages.";
      }

      leaf membership-report-v3 {
        type yang:counter64;
        description
          "The number of membership report v3 messages.";
      }

      leaf leave {
        type yang:counter64;
        description
          "The number of leave messages.";
      }

      leaf pim {
        type yang:counter64;
        description
          "The number of pim hello messages.";
      }
    }  // grouping general-statistics-sent-received

    grouping endpoint-grp {
      description
        "A grouping that defines the structure of "
          + "an endpoint";
      choice ac-or-pw-or-redundancy-grp {
        description
          "A choice of attachment circuit or "
            + "pseudowire or redundancy group";
        case ac {
          description
            "Attachment circuit(s) as an endpoint";
          list ac {
            key "name";
            description
              "An L2VPN instance's "
                + "attachment circuit list";
            leaf name {
              type string;
              description
                "Name of attachment circuit.  "
                  + "This field is intended to "
                  + "reference standardized "
                  + "layer-2 definitions.";
            }

            leaf igmp-snooping-instance {
              type igmp-snooping-instance-ref;
              description
                "Configure igmp-snooping instance under
the bridge view";
            }

            leaf mld-snooping-instance {
              type mld-snooping-instance-ref;
              description
                "Configure mld-snooping instance under the
bridge view";
            }
          }  // list ac
        }  // case ac

        case pw {
          description
            "Pseudowire(s) as an endpoint";
          list pw {
            key "name";
            description
              "An L2VPN instance's "
                + "pseudowire(s) list";
            leaf name {
              type string;
              description
                "Name of Pseudowire.";
            }

            leaf igmp-snooping-instance {
              type igmp-snooping-instance-ref;
              description
                "Configure igmp-snooping instance under
the bridge view";
            }

            leaf mld-snooping-instance {
              type mld-snooping-instance-ref;
              description
                "Configure mld-snooping instance under the
bridge view";
            }
          }  // list pw
        }  // case pw

        case redundancy-grp {
          description
            "Redundancy group as an endpoint";
          choice primary {
            mandatory true;
            description "primary options";
            case primary-ac {
              description "primary-ac";
              container primary-ac {
                description "Primary AC";
                leaf name {
                  type string;
                  description
                    "Name of attachment circuit.  ";
                }

                leaf igmp-snooping-instance {
                  type igmp-snooping-instance-ref;
                  description
                    "Configure igmp-snooping instance
under the bridge view";
                }

                leaf mld-snooping-instance {
                  type mld-snooping-instance-ref;
                  description
                    "Configure mld-snooping instance
under the bridge view";
                }
              }  // container primary-ac
            }  // case primary-ac
            list primary-pw {
              key "name";
              description "primary-pw";
              leaf name {
                type string;
                description
                  "Name of Pseudowire.";
              }

              leaf igmp-snooping-instance {
                type igmp-snooping-instance-ref;
                description
                  "Configure igmp-snooping instance
under the bridge view";
              }

              leaf mld-snooping-instance {
                type mld-snooping-instance-ref;
                description
                  "Configure mld-snooping instance
under the bridge view";
              }
            }  // list primary-pw
          }  // choice primary

          choice backup {
            description "backup options";
            case backup-ac {
              description "backup-ac";
              container backup-ac {
                description "Backup AC";
                leaf name {
                  type string;
                  description
                    "Name of attachment circuit.  ";
                }

                leaf igmp-snooping-instance {
                  type igmp-snooping-instance-ref;
                  description
                    "Configure igmp-snooping instance
under the bridge view";
                }

                leaf mld-snooping-instance {
                  type mld-snooping-instance-ref;
                  description
                    "Configure mld-snooping instance
under the bridge view";
                }
              }  // container backup-ac
            }  // case backup-ac

            case backup-pw {
              description "backup-pw";
              list backup-pw {
                key "name";
                description "backup-pw";
                leaf name {
                  type string;
                  description
                    "Name of Pseudowire.";
                }

                leaf igmp-snooping-instance {
                  type igmp-snooping-instance-ref;
                  description
                    "Configure igmp-snooping instance
under the bridge view";
                }

                leaf mld-snooping-instance {
                  type mld-snooping-instance-ref;
                  description
                    "Configure mld-snooping instance
under the bridge view";
                }
              }  // list backup-pw
            }  // case backup-pw
          }  // choice backup
        }  // case redundancy-grp
      }  // choice ac-or-pw-or-redundancy-grp
    }  // grouping endpoint-grp

    container igmp-snooping-instances {
      description
        "igmp-snooping-instance list";
      list igmp-snooping-instance {
        key "name";
        description
          "IGMP Snooping instance to configure the igmp-
snooping.";
        leaf name {
          type string;
          description
            "Name of the igmp-snooping-instance to configure the igmp
snooping.";
        }

        leaf id {
          type uint32;
          description
            "It is vlan_id or vpls_id.
         When igmp-snooping-instance is applied under bridge view, its
value is 0.";
        }

        leaf type {
          type enumeration {
            enum "bridge" {
              value 0;
              description "bridge";
            }
            enum "vpls" {
              value 1;
              description "vpls";
            }
          }
          description
            "The type indicates bridge or vpls.";
        }

        uses instance-config-attributes-igmp-snooping;

        uses instance-state-attributes-igmp-snooping;
      }  // list igmp-snooping-instance
    }  // container igmp-snooping-instances

    container mld-snooping-instances {
      description
        "mld-snooping-instance list";
      list mld-snooping-instance {
        key "name";
        description
          "MLD Snooping instance to configure the mld-snooping.";
        leaf name {
          type string;
          description
            "Name of the mld-snooping-instance to configure the mld
snooping.";
        }

        leaf id {
          type uint32;
          description
            "It is vlan_id or vpls_id.
         When mld-snooping-instance is applied under bridge view, its
value is 0.";
        }

        leaf type {
          type enumeration {
            enum "bridge" {
              value 0;
              description "bridge";
            }
            enum "vpls" {
              value 1;
              description "vpls";
            }
          }
          description
            "The type indicates bridge or vpls.";
        }

        uses instance-config-attributes-mld-snooping;

        uses instance-state-attributes-mld-snooping;
      }  // list mld-snooping-instance
    }  // container mld-snooping-instances

    container bridges {
      description
        "Apply igmp-mld-snooping instance in the bridge scenario";
      list bridge {
        key "name";
        description "bridge list";
        leaf name {
          type name-type;
          description "bridge name";
        }

        leaf igmp-snooping-instance {
          type igmp-snooping-instance-ref;
          description
            "Configure igmp-snooping instance under the
bridge view";
        }

        leaf mld-snooping-instance {
          type mld-snooping-instance-ref;
          description
            "Configure mld-snooping instance under the
bridge view";
        }

        list component {
          key "name";
          description " ";
          leaf name {
            type string;
            description
              "The name of the Component.";
          }

          container bridge-vlan {
            description "bridge vlan";
            list vlan {
              key "vid";
              description "";
              leaf vid {
                type vlan-index-type;
                description
                  "The VLAN identifier to which this entry
applies.";
              }

              leaf igmp-snooping-instance {
                type igmp-snooping-instance-ref;
                description
                  "Configure igmp-snooping instance
under the vlan view";
              }

              leaf mld-snooping-instance {
                type mld-snooping-instance-ref;
                description
                  "Configure mld-snooping instance
under the vlan view";
              }

              container interfaces {
                description
                  "Interface configuration parameters.";
                list interface {
                  key "name";
                  description
                    "The list of configured interfaces on the
device.";
                  leaf name {
                    type string;
                    description
                      "The name of the interface.";
                  }

                  leaf igmp-snooping-instance {
                    type igmp-snooping-instance-ref;
                    description
                      "Configure igmp-snooping
instance under the interface view";
                  }

                  leaf mld-snooping-instance {
                    type mld-snooping-instance-ref;
                    description
                      "Configure mld-snooping
instance under the interface view";
                  }
                }  // list interface
              }  // container interfaces
            }  // list vlan
          }  // container bridge-vlan
        }  // list component
      }  // list bridge
    }  // container bridges

    container l2vpn-instances {
      description
        "Apply igmp-mld-snooping instance in the vpls
scenario";
      list l2vpn-instance {
        key "name";
        description
          "An VPLS service instance";
        leaf name {
          type string;
          description
            "Name of VPLS service instance";
        }

        leaf igmp-snooping-instance {
          type igmp-snooping-instance-ref;
          description
            "Configure igmp-snooping instance under the
l2vpn-instance view";
        }

        leaf mld-snooping-instance {
          type mld-snooping-instance-ref;
          description
            "Configure mld-snooping instance under the
l2vpn-instance view";
        }

        list endpoint {
          key "name";
          description "An endpoint";
          leaf name {
            type string;
            description "endpoint name";
          }

          leaf igmp-snooping-instance {
            type igmp-snooping-instance-ref;
            description
              "Configure igmp-snooping instance under the
interface view";
          }

          leaf mld-snooping-instance {
            type mld-snooping-instance-ref;
            description
              "Configure mld-snooping instance under the
interface view";
          }

          uses endpoint-grp;
        }  // list endpoint
      }  // list l2vpn-instance
    }  // container l2vpn-instances

    rpc clear-igmp-snooping-groups {
      if-feature rpc-clear-groups;
      description
        "Clears the specified IGMP Snooping cache tables.";
      input {
        leaf id {
          type uint32;
          description
            "VLAN ID, VPLS ID, or EVPN ID";
        }

        leaf group {
          type inet:ipv4-address;
          description
            "Multicast group IPv4 address.
               If it is not specified, all IGMP snooping group tables
are
               cleared.";
        }

        leaf source {
          type inet:ipv4-address;
          description
            "Multicast source IPv4 address.
               If it is not specified, all IGMP snooping source-group
tables are
               cleared.";
        }
      }
    }  // rpc clear-igmp-snooping-groups

    rpc clear-mld-snooping-groups {
      if-feature rpc-clear-groups;
      description
        "Clears the specified MLD Snooping cache tables.";
      input {
        leaf id {
          type uint32;
          description
            "VLAN ID, VPLS ID, or EVPN ID";
        }

        leaf group {
          type inet:ipv6-address;
          description
            "Multicast group IPv6 address.
               If it is not specified, all MLD snooping group tables are
               cleared.";
        }

        leaf source {
          type inet:ipv6-address;
          description
            "Multicast source IPv6 address.
               If it is not specified, all MLD snooping source-group
tables are
               cleared.";
        }
      }
    }  // rpc clear-mld-snooping-groups
  }  // module ietf-igmp-mld-snooping