module ietf-igmp-mld {
namespace "urn:ietf:params:xml:ns:yang:ietf-igmp-mld";
// replace with IANA namespace when assigned
prefix igmp-mld;
import ietf-inet-types {
prefix "inet";
}
import ietf-yang-types {
prefix "yang";
}
import ietf-routing {
prefix "rt";
}
import ietf-interfaces {
prefix "if";
}
import ietf-ip {
prefix ip;
}
organization
"IETF PIM Working Group";
contact
"WG Web:
WG List:
WG Chair: Stig Venaas
WG Chair: Mike McBride
Editors: ";
description
"The module defines a collection of YANG definitions common for
IGMP and MLD.";
revision 2016-10-28 {
description
"Initial revision.";
reference
"RFC XXXX: A YANG Data Model for IGMP and MLD";
}
/*
* Features
*/
feature global-admin-enable {
description
"Support global configuration to enable or disable protocol.";
}
feature global-interface-config {
description
"Support global configuration applied for all interfaces.";
}
feature global-max-entries {
description
"Support configuration of global max-entries.";
}
feature global-max-groups {
description
"Support configuration of global max-groups.";
}
feature intf-admin-enable {
description
"Support configuration of interface administrative enabling.";
}
feature intf-immediate-leave {
description
"Support configuration of interface immediate-leave.";
}
feature intf-join-group {
description
"Support configuration of interface join-group.";
}
feature intf-max-groups {
description
"Support configuration of interface max-groups.";
}
feature intf-max-group-sources {
description
"Support configuration of interface max-group-sources.";
}
feature intf-require-router-alert {
description
"Support configuration of interface require-router-alert.";
}
feature intf-source-policy {
description
"Support configuration of interface source policy.";
}
feature intf-ssm-map {
description
"Support configuration of interface ssm-map.";
}
feature intf-static-group {
description
"Support configuration of interface static-group.";
}
feature intf-verify-source-subnet {
description
"Support configuration of interface verify-source-subnet.";
}
feature per-interface-config {
description
"Support per interface configuration.";
}
feature rpc-clear-groups {
description
"Support rpc's to clear groups.";
}
/*
* Typedefs
*/
typedef ssm-map-ipv4-addr-type {
type union {
type enumeration {
enum 'policy' {
description
"Source address is specified in SSM map policy.";
}
}
type inet:ipv4-address;
}
description
"Multicast source IP address type for SSM map.";
} // source-ipv4-addr-type
typedef ssm-map-ipv6-addr-type {
type union {
type enumeration {
enum 'policy' {
description
"Source address is specified in SSM map policy.";
}
}
type inet:ipv6-address;
}
description
"Multicast source IP address type for SSM map.";
} // source-ipv6-addr-type
typedef source-ipv4-addr-type {
type union {
type enumeration {
enum '*' {
description
"Any source address.";
}
}
type inet:ipv4-address;
}
description
"Multicast source IP address type.";
} // source-ipv4-addr-type
typedef source-ipv6-addr-type {
type union {
type enumeration {
enum '*' {
description
"Any source address.";
}
}
type inet:ipv6-address;
}
description
"Multicast source IP address type.";
} // source-ipv6-addr-type
/*
* Identities
*/
/*
* Groupings
*/
grouping global-config-attributes {
description "Global IGMP and MLD configuration.";
leaf enable {
if-feature global-admin-enable;
type boolean;
description
"true to enable IGMP in the routing instance;
false to disable IGMP in the routing instance.";
}
leaf max-entries {
if-feature global-max-entries;
type uint32;
description
"The maximum number of entries in IGMP.";
}
leaf max-groups {
if-feature global-max-groups;
type uint32;
description
"The maximum number of groups that IGMP can join.";
}
} // global-config-attributes
grouping global-state-attributes {
description "Global IGMP and MLD state attributes.";
leaf entries-count {
type uint32;
description
"The number of entries in IGMP.";
}
leaf groups-count {
type uint32;
description
"The number of groups that IGMP can join.";
}
container statistics {
description "Global statistics.";
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.";
uses global-statistics-error;
}
container received {
description "Statistics of received messages.";
uses global-statistics-sent-received;
}
container sent {
description "Statistics of sent messages.";
uses global-statistics-sent-received;
}
} // statistics
} // global-state-attributes
grouping global-statistics-error {
description
"A grouping defining statistics attributes for errors.";
uses global-statistics-sent-received;
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.";
}
} // global-statistics-error
grouping global-statistics-sent-received {
description
"A grouping defining statistics attributes.";
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.";
}
} // global-statistics-sent-received
grouping interfaces-config-attributes {
description
"Configuration attributes applied to interfaces whose
per interface attributes are not existing.";
leaf last-member-query-interval {
type uint16 {
range "1..65535";
}
description
"Last Member Query Interval, which may be tuned to modify the
leave latency of the network.";
reference "RFC3376. Sec. 8.8.";
}
leaf max-groups-per-interface {
if-feature intf-max-groups;
type uint32;
description
"The maximum number of groups that IGMP can join.";
}
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;
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 intf-require-router-alert;
type boolean;
description
"";
}
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 version.";
reference "RFC1112, RFC2236, RFC3376.";
}
} // interfaces-config-attributes
grouping interface-config-attributes-igmp {
description "Per interface igmp configuration for IGMP.";
uses interface-config-attributes-igmp-mld;
leaf-list join-group {
if-feature intf-join-group;
type inet:ipv4-address;
description
"The router joins this multicast group on the interface.";
}
list ssm-map {
if-feature intf-ssm-map;
key "source-addr group-policy";
description "";
leaf source-addr {
type ssm-map-ipv4-addr-type;
description
"Multicast source IP address.";
}
leaf group-policy {
type string;
description
"Name of the access policy used to filter IGMP
membership.";
}
}
list static-group {
if-feature intf-static-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.";
}
}
} // interface-config-attributes-igmp
grouping interface-config-attributes-igmp-mld {
description
"Per interface configuration for both IGMP and MLD.";
leaf enable {
if-feature intf-admin-enable;
type boolean;
description
"true to enable IGMP on the interface;
false to disable IGMP on the interface.";
}
leaf group-policy {
type string;
description
"Name of the access policy used to filter IGMP membership.";
}
leaf immediate-leave {
if-feature intf-immediate-leave;
type empty;
description
"If present, IGMP perform an immediate leave upon receiving an
IGMP Version 2 (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
off the group.";
}
leaf last-member-query-interval {
type uint16 {
range "1..65535";
}
description
"Last Member Query Interval, which may be tuned to modify the
leave latency of the network.";
reference "RFC3376. Sec. 8.8.";
}
leaf max-groups {
if-feature intf-max-groups;
type uint32;
description
"The maximum number of groups that IGMP can join.";
}
leaf max-group-sources {
if-feature intf-max-group-sources;
type uint32;
description
"The maximum number of group sources.";
}
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;
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 intf-require-router-alert;
type boolean;
description
"";
}
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 source-policy {
if-feature intf-source-policy;
type string;
description
"Name of the access policy used to filter sources.";
}
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 version {
type uint8 {
range "1..3";
}
description "IGMP version.";
reference "RFC1112, RFC2236, RFC3376.";
}
} // interface-config-attributes-igmp-mld
grouping interface-config-attributes-mld {
description "Per interface igmp configuration for mld.";
uses interface-config-attributes-igmp-mld;
leaf-list join-group {
if-feature intf-join-group;
type inet:ipv6-address;
description
"The router joins this multicast group on the interface.";
}
list ssm-map {
if-feature intf-ssm-map;
key "source-addr group-policy";
description "";
leaf source-addr {
type ssm-map-ipv6-addr-type;
description
"Multicast source IP address.";
}
leaf group-policy {
type string;
description
"Name of the access policy used to filter IGMP
membership.";
}
}
list static-group {
if-feature intf-static-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.";
}
}
} // interface-config-attributes-mld
grouping interface-state-attributes-igmp {
description
"Per interface state attributes for IGMP.";
uses interface-state-attributes-igmp-mld;
leaf dr {
type inet:ipv4-address;
description "";
}
leaf querier {
type inet:ipv4-address;
description "";
}
leaf-list joined-group {
if-feature intf-join-group;
type inet:ipv4-address;
description
"The routers that joined this multicast group.";
}
list group {
key "address";
description "";
leaf address {
type inet:ipv4-address;
description
"";
}
uses interface-state-group-attributes-igmp-mld;
leaf-list host {
type inet:ipv4-address;
description
"";
}
leaf last-reporter {
type inet:ipv4-address;
description "";
}
list source {
key "address";
description "";
leaf address {
type inet:ipv4-address;
description "";
}
uses interface-state-source-attributes-igmp-mld;
leaf last-reporter {
type inet:ipv4-address;
description "";
}
} // list source
} // list group
} // interface-state-attributes-igmp
grouping interface-state-attributes-igmp-mld {
description
"Per interface state attributes for both IGMP and MLD.";
leaf oper-status {
type enumeration {
enum up {
description
"Ready to pass packets.";
}
enum down {
description
"The interface does not pass any packets.";
}
}
description "";
}
} // interface-config-attributes-igmp-mld
grouping interface-state-attributes-mld {
description
"Per interface state attributes for MLD.";
uses interface-state-attributes-igmp-mld;
leaf querier {
type inet:ipv6-address;
description "";
}
leaf-list joined-group {
if-feature intf-join-group;
type inet:ipv6-address;
description
"The routers that joined this multicast group.";
}
list group {
key "address";
description "";
leaf address {
type inet:ipv6-address;
description
"";
}
uses interface-state-group-attributes-igmp-mld;
leaf-list host {
type inet:ipv6-address;
description
"";
}
leaf last-reporter {
type inet:ipv6-address;
description "";
}
list source {
key "address";
description "";
leaf address {
type inet:ipv6-address;
description "";
}
uses interface-state-source-attributes-igmp-mld;
leaf last-reporter {
type inet:ipv6-address;
description "";
}
} // list source
} // list group
} // interface-state-attributes-mld
grouping interface-state-group-attributes-igmp-mld {
description
"Per interface state attributes for both IGMP and MLD
groups.";
leaf expire {
type uint32;
units seconds;
description "";
}
leaf filter-mode {
type enumeration {
enum "include" {
description
"";
}
enum "exclude" {
description
"";
}
}
description "";
}
leaf host-count {
type uint32;
description "";
}
leaf up-time {
type uint32;
units seconds;
description "";
}
} // interface-state-group-attributes-igmp-mld
grouping interface-state-source-attributes-igmp-mld {
description
"Per interface state attributes for both IGMP and MLD
groups.";
leaf expire {
type uint32;
units seconds;
description "";
}
leaf up-time {
type uint32;
units seconds;
description "";
}
} // interface-state-source-attributes-igmp-mld
/*
* Configuration data nodes
*/
augment "/rt:routing/rt:control-plane-protocols"
{
description
"IGMP and MLD augmentation to routing instance configuration.";
container igmp {
description
"IGMP configuration data.";
container global {
description
"Global attributes.";
uses global-config-attributes;
}
container interfaces {
description
"Containing a list of interfaces.";
uses interfaces-config-attributes {
if-feature global-interface-config;
}
list interface {
key "interface";
description
"List of IGMP interfaces.";
leaf interface {
type if:interface-ref;
must "/if:interfaces/if:interface[if:name = current()]/"
+ "ip:ipv4" {
description
"The interface must have IPv4 enabled.";
}
description
"Reference to an entry in the global interface
list.";
}
uses interface-config-attributes-igmp {
if-feature per-interface-config;
}
} // interface
} // interfaces
} // igmp
container mld {
description
"MLD configuration data.";
container global {
description
"Global attributes.";
uses global-config-attributes;
}
container interfaces {
description
"Containing a list of interfaces.";
uses interfaces-config-attributes {
if-feature global-interface-config;
}
list interface {
key "interface";
description
"List of MLD interfaces.";
leaf interface {
type if:interface-ref;
must "/if:interfaces/if:interface[if:name = current()]/"
+ "ip:ipv6" {
description
"The interface must have IPv4 enabled.";
}
description
"Reference to an entry in the global interface
list.";
}
uses interface-config-attributes-mld {
if-feature per-interface-config;
}
} // interface
} // interfaces
} // mld
} // augment
/*
* Operational state data nodes
*/
augment "/rt:routing-state/rt:control-plane-protocols"
{
description
"IGMP and MLD augmentation to routing instance state.";
container igmp {
description
"IGMP configuration data.";
container global {
description
"Global attributes.";
uses global-config-attributes;
uses global-state-attributes;
}
container interfaces {
description
"Containing a list of interfaces.";
uses interfaces-config-attributes {
if-feature global-interface-config;
}
list interface {
key "interface";
description
"List of IGMP interfaces.";
leaf interface {
type if:interface-ref;
must "/if:interfaces/if:interface[if:name = current()]/"
+ "ip:ipv4" {
description
"The interface must have IPv4 enabled.";
}
description
"Reference to an entry in the global interface
list.";
}
uses interface-config-attributes-igmp {
if-feature per-interface-config;
}
uses interface-state-attributes-igmp;
} // interface
} // interfaces
} // igmp
container mld {
description
"MLD configuration data.";
container global {
description
"Global attributes.";
uses global-config-attributes;
uses global-state-attributes;
}
container interfaces {
description
"Containing a list of interfaces.";
uses interfaces-config-attributes {
if-feature global-interface-config;
}
list interface {
key "interface";
description
"List of MLD interfaces.";
leaf interface {
type if:interface-ref;
must "/if:interfaces/if:interface[if:name = current()]/"
+ "ip:ipv6" {
description
"The interface must have IPv4 enabled.";
}
description
"Reference to an entry in the global interface
list.";
}
uses interface-config-attributes-mld {
if-feature per-interface-config;
}
uses interface-state-attributes-mld;
} // interface
} // interfaces
} // mld
} // augment
/*
* RPCs
*/
rpc clear-igmp-groups {
if-feature rpc-clear-groups;
description
"Clears the specified IGMP cache tables.";
input {
leaf interface {
type leafref {
path "/rt:routing/rt:control-plane-protocols/"
+ "igmp/interfaces/interface/"
+ "interface";
}
description
"Name of the IGMP interface.
If it is not specified, groups from all interfaces are
cleared.";
}
leaf group {
type inet:ipv4-address;
description
"Multicast group IPv4 address.
If it is not specified, all IGMP group tables are
cleared.";
}
leaf source {
type inet:ipv4-address;
description
"Multicast source IPv4 address.
If it is not specified, all IGMP source-group tables are
cleared.";
}
}
} // rpc clear-igmp-groups
rpc clear-mld-groups {
if-feature rpc-clear-groups;
description
"Clears the specified MLD cache tables.";
input {
leaf interface {
type leafref {
path "/rt:routing/rt:control-plane-protocols/"
+ "mld/interfaces/interface/"
+ "interface";
}
description
"Name of the MLD interface.
If it is not specified, groups from all interfaces are
cleared.";
}
leaf group {
type inet:ipv6-address;
description
"Multicast group IPv6 address.
If it is not specified, all MLD group tables are
cleared.";
}
leaf source {
type inet:ipv6-address;
description
"Multicast source IPv6 address.
If it is not specified, all MLD source-group tables are
cleared.";
}
}
} // rpc clear-mld-groups
/*
* Notifications
*/
}