idnits 2.17.1 draft-mcallister-pim-yang-01.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- ** There are 11 instances of too long lines in the document, the longest one being 2 characters in excess of 72. Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year == Line 454 has weird spacing: '...v4-addr ine...' == Line 456 has weird spacing: '...v6-addr ine...' == Line 466 has weird spacing: '...-length uin...' == Line 469 has weird spacing: '...terface if:...' == Line 473 has weird spacing: '...address ine...' == (7 more instances...) == The document doesn't use any RFC 2119 keywords, yet has text resembling RFC 2119 boilerplate text. -- The document date (October 19, 2015) is 3105 days in the past. Is this intentional? Checking references for intended status: Proposed Standard ---------------------------------------------------------------------------- (See RFCs 3967 and 4897 for information about using normative references to lower-maturity documents in RFCs) == Outdated reference: A later version (-20) exists of draft-ietf-netmod-rfc6087bis-04 -- Obsolete informational reference (is this intentional?): RFC 4601 (Obsoleted by RFC 7761) -- Obsolete informational reference (is this intentional?): RFC 6087 (Obsoleted by RFC 8407) == Outdated reference: A later version (-25) exists of draft-ietf-netmod-routing-cfg-20 Summary: 1 error (**), 0 flaws (~~), 10 warnings (==), 3 comments (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 PIM Working Group X. Liu 3 Internet-Draft Ericsson 4 Intended status: Standards Track P. McAllister 5 Expires: April 21, 2016 Metaswitch Networks 6 A. Peter 7 Juniper Networks 8 October 19, 2015 10 A YANG data model for Protocol-Independent Multicast (PIM) 11 draft-mcallister-pim-yang-01 13 Abstract 15 This document defines a YANG data model that can be used to configure 16 Protocol Independent Multicast (PIM) devices. 18 Status of This Memo 20 This Internet-Draft is submitted in full conformance with the 21 provisions of BCP 78 and BCP 79. 23 Internet-Drafts are working documents of the Internet Engineering 24 Task Force (IETF). Note that other groups may also distribute 25 working documents as Internet-Drafts. The list of current Internet- 26 Drafts is at http://datatracker.ietf.org/drafts/current/. 28 Internet-Drafts are draft documents valid for a maximum of six months 29 and may be updated, replaced, or obsoleted by other documents at any 30 time. It is inappropriate to use Internet-Drafts as reference 31 material or to cite them other than as "work in progress." 33 This Internet-Draft will expire on April 21, 2016. 35 Copyright Notice 37 Copyright (c) 2015 IETF Trust and the persons identified as the 38 document authors. All rights reserved. 40 This document is subject to BCP 78 and the IETF Trust's Legal 41 Provisions Relating to IETF Documents 42 (http://trustee.ietf.org/license-info) in effect on the date of 43 publication of this document. Please review these documents 44 carefully, as they describe your rights and restrictions with respect 45 to this document. Code Components extracted from this document must 46 include Simplified BSD License text as described in Section 4.e of 47 the Trust Legal Provisions and are provided without warranty as 48 described in the Simplified BSD License. 50 Table of Contents 52 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 53 1.1. Requirements Language . . . . . . . . . . . . . . . . . . 3 54 1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 55 2. Design of Data Model . . . . . . . . . . . . . . . . . . . . 3 56 2.1. Scope of model . . . . . . . . . . . . . . . . . . . . . 3 57 2.2. Optional capabilities . . . . . . . . . . . . . . . . . . 3 58 2.3. Top-level structure . . . . . . . . . . . . . . . . . . . 4 59 2.4. Position of address family in hierarchy . . . . . . . . . 5 60 3. Unresolved Issues . . . . . . . . . . . . . . . . . . . . . . 5 61 3.1. Current status of work in progress . . . . . . . . . . . 5 62 3.2. Group range mappings . . . . . . . . . . . . . . . . . . 5 63 3.3. Issues blocked on other model designers . . . . . . . . . 6 64 4. Module Structure . . . . . . . . . . . . . . . . . . . . . . 6 65 4.1. PIM base module . . . . . . . . . . . . . . . . . . . . . 6 66 4.2. PIM RP module . . . . . . . . . . . . . . . . . . . . . . 10 67 4.3. PIM-SM module . . . . . . . . . . . . . . . . . . . . . . 12 68 4.4. PIM-DM module . . . . . . . . . . . . . . . . . . . . . . 13 69 4.5. PIM-BIDIR module . . . . . . . . . . . . . . . . . . . . 14 70 5. PIM YANG Modules . . . . . . . . . . . . . . . . . . . . . . 15 71 5.1. PIM base module . . . . . . . . . . . . . . . . . . . . . 15 72 5.2. PIM RP module . . . . . . . . . . . . . . . . . . . . . . 34 73 5.3. PIM-SM module . . . . . . . . . . . . . . . . . . . . . . 48 74 5.4. PIM-DM module . . . . . . . . . . . . . . . . . . . . . . 53 75 5.5. PIM-BIDIR module . . . . . . . . . . . . . . . . . . . . 56 76 6. TODO list . . . . . . . . . . . . . . . . . . . . . . . . . . 59 77 7. Security Considerations . . . . . . . . . . . . . . . . . . . 60 78 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 60 79 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 60 80 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 60 81 10.1. Normative References . . . . . . . . . . . . . . . . . . 60 82 10.2. Informative References . . . . . . . . . . . . . . . . . 60 83 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 61 85 1. Introduction 87 YANG [RFC6020] [RFC6087] is a data definition language that was 88 introduced to model the configuration and running state of a device 89 managed using NETCONF [RFC6241]. YANG is now also being used as a 90 component of wider management interfaces, such as CLIs. 92 This document defines a draft YANG data model that can be used to 93 configure and manage Protocol-Independent Multicast (PIM) devices. 94 Currently this model is incomplete, but it will support the core PIM 95 protocol, as well as many other features mentioned in separate PIM 96 RFCs. Non-core features are defined as optional in the provided data 97 model. 99 1.1. Requirements Language 101 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", 102 "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" and "OPTIONAL" in this 103 document are to be interpreted as described in BCP 14, RFC 2119 104 [RFC2119]. 106 1.2. Terminology 108 The terminology for describing YANG data models is found in 109 [RFC6020]. 111 This draft employs YANG tree diagrams, which are explained in 112 [I-D.ietf-netmod-rfc6087bis]. 114 2. Design of Data Model 116 2.1. Scope of model 118 The model covers PIM Sparse Mode [RFC4601], including the Source- 119 Specfic subset [RFC3569], Dense Mode [RFC3973], and Bi-directional 120 PIM [RFC5015]. 122 The PIM extensions represented in the model include BSR [RFC5059] and 123 Anycast RP [RFC4610]. 125 The representation of some of these features is not completely 126 specified in this draft of the data model. This model is being 127 circulated in its current form for early oversight and review of the 128 basic hierarchy. 130 The operational state fields and notifications of this model are also 131 incomplete, though the structure of what has been written may be 132 taken as representative of the structure of the model when complete. 134 This model does not cover other multicast protocols such as IGMP/MLD, 135 MSDP, mVPN, or m-LDP in-band signalling. It does not cover any 136 configuration required to generate the MRIB. These will be covered 137 by future Internet Drafts. 139 2.2. Optional capabilities 141 This model is designed to represent the capabilities of PIM devices 142 with various specifications, including some with basic subsets of the 143 PIM protocol. The main design goals of this draft are that any major 144 now-existing implementation may be said to support the base model, 145 and that the configuration of all implementations meeting the 146 specification is easy to express through some combination of the 147 features in the base model and simple vendor augmentations. 149 There is also value in widely-supported features being standardized, 150 to save work for individual vendors, and so that mapping between 151 different vendors' configuration is not needlessly complicated. 152 Therefore these modules declare a number of features representing 153 capabilities that not all deployed devices support. 155 The extensive use of feature declarations should also substantially 156 simplify the capability negotiation process for a vendor's PIM 157 implementation. 159 On the other hand, operational state parameters are not so widely 160 designated as features, as there are many cases where the defaulting 161 of an operational state parameter would not cause any harm to the 162 system, and it is much more likely that an implementation without 163 native support for a piece of operational state would be able to 164 derive a suitable value for a state variable that is not natively 165 supported. 167 For the same reason, wide constant ranges (for example, timer maxima 168 and minima) will be used in the model. It is expected that vendors 169 will augment the model with any specific restrictions that might be 170 required. Vendors may also extend the features list with proprietary 171 extensions. 173 2.3. Top-level structure 175 This model defines several separate modules for modelling PIM 176 configuration, defined below. Again, this separation will make it 177 easier to express the specific capabilities of a PIM device. 179 The hierarchy of PIM configuration is designed so that objects that 180 are only relevant for one situation or feature are collected in a 181 container for that feature. For example, the configuration for PIM- 182 SM that is not relevant for an SSM-only implementation is collected 183 in an ASM container. 185 Where fields are not genuinely essential to protocol operation, they 186 are marked as optional. Some fields will be essential but have a 187 default specified, so they need not be explicitly configured. 189 This module structure also applies, where applicable, to the 190 operational state and notifications of the model. 192 2.4. Position of address family in hierarchy 194 The current draft contains address-family as a node in the hierarchy 195 multiple times: both under the interface list, and under the PIM 196 instance. This is similar to the IS-IS yang draft model. 198 The reasoning for this is to make it easier for implementations in 199 which configuration options are not supported for specific address 200 families. 202 For these implementations, the restriction that interface 203 configuration must be address-family independent must either be 204 expressed as a vendor augmentation of an address-family-independent 205 parameter above the address-family level, or by a constraint on the 206 base model objects of a form similar to: 208 must ". = ../../address-family[address-family='ipv4']/ 209 interface[interface=current()/sibling:interface]/dr-priority" { 210 error-app-tag dr-priority-mismatch; error-message "Error: IPv6 DR 211 priority must match IPv4 DR priority "; } 213 3. Unresolved Issues 215 3.1. Current status of work in progress 217 The model so far details how the PIM modules interact and covers the 218 higher levels of their hierarchy. Some details of interface 219 configuration, RP configuration, and PIM-ASM-specific parameters are 220 also complete. 222 For a list of the most substantial areas still to cover, please see 223 the "TODO list" section below. 225 3.2. Group range mappings 227 There is currently no convenient way in the operational state model 228 to map from a group address to the PIM mode and RP information that 229 it will be forwarded according to, which complicates reasoning about 230 the running state and the diagnosis of conflicting policy 231 configuration. 233 A hypothetical group range state reporting object indexed by group 234 range would be desirable for this purpose, but would be inconvenient 235 for many implementations that index the relevant information on RP 236 address (not applicable for DM or unroutable group-ranges), and 237 difficult to express directly in YANG (as it is difficult to express 238 a container indexed on an arbitrary, proprietary policy structure). 240 3.3. Issues blocked on other model designers 242 Some questions must be resolved with reference to other yang models, 243 and so the resolution may be blocked on a decision from another body. 244 Currently these issues are: 246 1. The position of BFD in the configuration; does the BFD model 247 augment various different protocols, or do the protocols have to 248 augment themselves individually to support BFD? 250 2. The abstract concepts of a "set of IP addresses" or "set of IP 251 prefixes", as represented in implementations by prefixes, ACLs or 252 policy statements, is a general concept out of the scope of this 253 document. It will presumably have a yang data-type the 254 instantiation of which is vendor-specific. 256 4. Module Structure 258 4.1. PIM base module 260 The PIM base module defines the router-wide configuration options not 261 specific to any PIM mode, and is included by the other modules. 262 There are a couple of things worth mentioning here regarding where 263 the PIM model fits in the overall routing hierarchy: 265 1. Our current direction is to agree to a routing-instance-centric 266 (VRF) model as opposed to protocol-centric mainly because it fits 267 well into the routing-instance model, and it is easier to map 268 from the VRF-centric to the protocol-centric than the other way 269 around due to forward references. 271 2. The PIM base model will augment "/rt:routing/rt:routing-instance/ 272 rt:routing-protocols:" as opposed to augmenting "/rt:routing/ 273 rt:routing-instance/rt:routing-protocols:/rt:routing-protocol" as 274 the latter would allow multiple protocol instances per VRF, which 275 does not make sense for PIM. 277 module: ietf-pim-base 278 augment /rt:routing/rt:routing-instance/rt:routing-protocols: 279 +--rw pim 280 +--rw graceful-restart 281 | +--rw enabled? boolean 282 | +--rw duration? uint16 283 +--rw address-family* [address-family] 284 | +--rw address-family identityref 285 | +--rw graceful-restart 286 | +--rw enabled? boolean 287 | +--rw duration? uint16 288 +--rw interfaces 289 +--rw interface* [interface] 290 +--rw interface if:interface-ref 291 +--rw address-family* [address-family] 292 +--rw address-family identityref 293 +--rw dr-priority? uint32 {intf-dr-priority}? 294 +--rw hello-interval? uint16 {intf-hello-interval}? 295 +--rw (hello-holdtime-or-multipler)? 296 | +--:(holdtime) {intf-hello-holdtime}? 297 | | +--rw hello-holdtime? uint16 298 | +--:(multipler) {intf-hello-multipler}? 299 | +--rw hello-multipler? uint8 300 +--rw jp-interval? uint16 {intf-jp-interval}? 301 +--rw (jp-holdtime-or-multipler)? 302 | +--:(holdtime) {intf-jp-holdtime}? 303 | | +--rw jp-holdtime? uint16 304 | +--:(multipler) {intf-jp-multipler}? 305 | +--rw jp-multipler? uint8 306 +--rw propagation-delay? uint16 {intf-propagation-delay}? 307 +--rw override-interval? uint16 {intf-override-interval}? 308 augment /rt:routing-state/rt:routing-instance/rt:routing-protocols: 309 +--ro pim 310 +--ro address-family* [address-family] 311 | +--ro address-family identityref 312 | +--ro statistics 313 | | +--ro discontinuity-time? yang:date-and-time 314 | | +--ro error 315 | | | +--ro assert? yang:counter32 316 | | | +--ro bsr? yang:counter32 317 | | | +--ro candidate-rp-advertisement? yang:counter32 318 | | | +--ro hello? yang:counter32 319 | | | +--ro join-prune? yang:counter32 320 | | | +--ro register? yang:counter32 321 | | | +--ro register-stop? yang:counter32 322 | | | +--ro state-refresh? yang:counter32 323 | | +--ro queue 324 | | | +--ro size? uint32 325 | | | +--ro overflow? yang:counter32 326 | | +--ro received 327 | | | +--ro assert? yang:counter32 328 | | | +--ro bsr? yang:counter32 329 | | | +--ro candidate-rp-advertisement? yang:counter32 330 | | | +--ro hello? yang:counter32 331 | | | +--ro join-prune? yang:counter32 332 | | | +--ro register? yang:counter32 333 | | | +--ro register-stop? yang:counter32 334 | | | +--ro state-refresh? yang:counter32 335 | | +--ro sent 336 | | +--ro assert? yang:counter32 337 | | +--ro bsr? yang:counter32 338 | | +--ro candidate-rp-advertisement? yang:counter32 339 | | +--ro hello? yang:counter32 340 | | +--ro join-prune? yang:counter32 341 | | +--ro register? yang:counter32 342 | | +--ro register-stop? yang:counter32 343 | | +--ro state-refresh? yang:counter32 344 | +--ro topology-tree-info 345 | +--ro ipv4-route* [group source-addr is-rpt] 346 | | +--ro group inet:ipv4-address 347 | | +--ro source-addr union 348 | | +--ro is-rpt boolean 349 | | +--ro expire? uint32 350 | | +--ro incoming-interface? if:interface-ref 351 | | +--ro mode? pim-mode 352 | | +--ro msdp-learned? boolean 353 | | +--ro rp-address? inet:ip-address 354 | | +--ro rpf-neighbor? inet:ip-address 355 | | +--ro spt-bit? boolean 356 | | +--ro up-time? uint32 357 | | +--ro outgoing-interface* [name] 358 | | +--ro name if:interface-ref 359 | | +--ro expire? yang:timeticks 360 | | +--ro up-time? yang:timeticks 361 | | +--ro jp-state? enumeration 362 | +--ro ipv6-route* [group source-addr is-rpt] 363 | +--ro group inet:ipv6-address 364 | +--ro source-addr union 365 | +--ro is-rpt boolean 366 | +--ro expire? uint32 367 | +--ro incoming-interface? if:interface-ref 368 | +--ro mode? pim-mode 369 | +--ro msdp-learned? boolean 370 | +--ro rp-address? inet:ip-address 371 | +--ro rpf-neighbor? inet:ip-address 372 | +--ro spt-bit? boolean 373 | +--ro up-time? uint32 374 | +--ro outgoing-interface* [name] 375 | +--ro name if:interface-ref 376 | +--ro expire? yang:timeticks 377 | +--ro up-time? yang:timeticks 378 | +--ro jp-state? enumeration 379 +--ro interfaces 380 +--ro interface* [interface] 381 +--ro interface if:interface-ref 382 +--ro address-family* [address-family] 383 +--ro address-family identityref 384 +--ro dr-priority? uint32 {intf-dr-priority}? 385 +--ro hello-interval? uint16 {intf-hello-interval}? 386 +--ro (hello-holdtime-or-multipler)? 387 | +--:(holdtime) {intf-hello-holdtime}? 388 | | +--ro hello-holdtime? uint16 389 | +--:(multipler) {intf-hello-multipler}? 390 | +--ro hello-multipler? uint8 391 +--ro jp-interval? uint16 {intf-jp-interval}? 392 +--ro (jp-holdtime-or-multipler)? 393 | +--:(holdtime) {intf-jp-holdtime}? 394 | | +--ro jp-holdtime? uint16 395 | +--:(multipler) {intf-jp-multipler}? 396 | +--ro jp-multipler? uint8 397 +--ro propagation-delay? uint16 {intf-propagation-delay}? 398 +--ro override-interval? uint16 {intf-override-interval}? 399 +--ro ipv4 400 | +--ro address* inet:ipv4-address 401 | +--ro dr-addr? inet:ipv4-address 402 +--ro ipv6 403 | +--ro address* inet:ipv6-address 404 | +--ro dr-addr? inet:ipv6-address 405 +--ro oper-status? enumeration 406 +--ro hello-expire? uint32 407 +--ro neighbor-ipv4* [address] 408 | +--ro address inet:ipv4-address 409 | +--ro bfd-status? enumeration 410 | +--ro expire? uint32 411 | +--ro dr-priority? uint32 412 | +--ro gen-id? uint32 413 | +--ro up-time? uint32 414 +--ro neighbor-ipv6* [address] 415 +--ro address inet:ipv6-address 416 +--ro bfd-status? enumeration 417 +--ro expire? uint32 418 +--ro dr-priority? uint32 419 +--ro gen-id? uint32 420 +--ro up-time? uint32 421 notifications: 422 +---n pim-neighbor-event 423 | +--ro event-type? neighbor-event-type 424 | +--ro routing-instance-state-ref? rt:routing-instance-state-ref 425 | +--ro interface-state-ref? leafref 426 | +--ro interface-af-state-ref? leafref 427 | +--ro neighbor-ipv4-state-ref? leafref 428 | +--ro neighbor-ipv6-state-ref? leafref 429 | +--ro up-time? uint32 430 +---n pim-interface-event 431 +--ro event-type? interface-event-type 432 +--ro routing-instance-state-ref? rt:routing-instance-state-ref 433 +--ro interface-state-ref? leafref 434 +--ro ipv4 435 | +--ro address* inet:ipv4-address 436 | +--ro dr-addr? inet:ipv4-address 437 +--ro ipv6 438 +--ro address* inet:ipv6-address 439 +--ro dr-addr? inet:ipv6-address 441 4.2. PIM RP module 443 The PIM RP module contains configuration information scoped to RPs or 444 ranges of group addresses. This does not belong in the hierarchy 445 under any PIM mode, but is augmented by the individual mode-specific 446 modules as appropriate. 448 module: ietf-pim-rp 449 augment /rt:routing/rt:routing-instance/rt:routing-protocols/pim-base:pim 450 /pim-base:address-family: 451 +--rw rp 452 +--rw static-rp 453 | +--rw ipv4-rp* [ipv4-addr] 454 | | +--rw ipv4-addr inet:ipv4-address 455 | +--rw ipv6-rp* [ipv6-addr] 456 | +--rw ipv6-addr inet:ipv6-address 457 +--rw bsr {bsr}? 458 +--rw bsr-candidate! 459 | +--rw (interface-or-address)? 460 | | +--:(interface) {candidate-interface}? 461 | | | +--rw interface if:interface-ref 462 | | +--:(ipv4-address) {candidate-ipv4}? 463 | | | +--rw ipv4-address inet:ipv4-address 464 | | +--:(ipv6-address) {candidate-ipv6}? 465 | | +--rw ipv6-address inet:ipv6-address 466 | +--rw hash-mask-length uint8 467 | +--rw priority uint8 468 +--rw rp-candidate-interface* [interface] {candidate-interface}? 469 | +--rw interface if:interface-ref 470 | +--rw policy? string 471 | +--rw mode? identityref 472 +--rw rp-candidate-ipv4-address* [ipv4-address] {candidate-ipv4}? 473 | +--rw ipv4-address inet:ipv4-address 474 | +--rw policy? string 475 | +--rw mode? identityref 476 +--rw rp-candidate-ipv6-address* [ipv6-address] {candidate-ipv6}? 477 +--rw ipv6-address inet:ipv6-address 478 +--rw policy? string 479 +--rw mode? identityref 480 augment /rt:routing-state/rt:routing-instance/rt:routing-protocols/ 481 pim-base:pim/pim-base:address-family: 482 +--ro rp 483 +--ro bsr {bsr}? 484 | +--ro bsr-candidate! 485 | | +--ro (interface-or-address)? 486 | | | +--:(interface) {candidate-interface}? 487 | | | | +--ro interface if:interface-ref 488 | | | +--:(ipv4-address) {candidate-ipv4}? 489 | | | | +--ro ipv4-address inet:ipv4-address 490 | | | +--:(ipv6-address) {candidate-ipv6}? 491 | | | +--ro ipv6-address inet:ipv6-address 492 | | +--ro hash-mask-length uint8 493 | | +--ro priority uint8 494 | +--ro rp-candidate-interface* [interface] {candidate-interface}? 495 | | +--ro interface if:interface-ref 496 | | +--ro policy? string 497 | | +--ro mode? identityref 498 | +--ro rp-candidate-ipv4-address* [ipv4-address] {candidate-ipv4}? 499 | | +--ro ipv4-address inet:ipv4-address 500 | | +--ro policy? string 501 | | +--ro mode? identityref 502 | +--ro rp-candidate-ipv6-address* [ipv6-address] {candidate-ipv6}? 503 | | +--ro ipv6-address inet:ipv6-address 504 | | +--ro policy? string 505 | | +--ro mode? identityref 506 | +--ro bsr 507 | | +--ro addr? inet:ip-address 508 | | +--ro hash-mask-length? uint8 509 | | +--ro priority? uint8 510 | | +--ro up-time? uint32 511 | +--ro (election-state)? {bsr-election-state}? 512 | | +--:(candidate) 513 | | | +--ro candidate-bsr-state? enumeration 514 | | +--:(non-candidate) 515 | | +--ro non-candidate-bsr-state? enumeration 516 | +--ro bsr-next-bootstrap? uint16 517 | +--ro rp 518 | | +--ro rp-address? inet:ip-address 519 | | +--ro group-policy? string 520 | | +--ro up-time? uint32 521 | +--ro rp-candidate-next-advertisement? uint16 522 +--ro rp-list 523 | +--ro ipv4-rp* [ipv4-addr] 524 | | +--ro ipv4-addr inet:ipv4-address 525 | | +--ro info-source-addr? inet:ipv4-address 526 | | +--ro info-source-type? enumeration 527 | | +--ro up-time? uint32 528 | | +--ro expire? uint16 529 | +--ro ipv6-rp* [ipv6-addr] 530 | +--ro ipv6-addr inet:ipv6-address 531 | +--ro info-source-addr? inet:ipv6-address 532 | +--ro info-source-type? enumeration 533 | +--ro up-time? uint32 534 | +--ro expire? uint16 535 +--ro rp-mappings 536 +--ro ipv4-rp* [group rp-addr] 537 | +--ro group inet:ipv4-prefix 538 | +--ro rp-addr inet:ipv4-address 539 | +--ro info-source-addr? inet:ipv4-address 540 | +--ro info-source-type? enumeration 541 | +--ro up-time? uint32 542 | +--ro expire? uint16 543 +--ro ipv6-rp* [group rp-addr] 544 +--ro group inet:ipv6-prefix 545 +--ro rp-addr inet:ipv6-address 546 +--ro info-source-addr? inet:ipv6-address 547 +--ro info-source-type? enumeration 548 +--ro up-time? uint32 549 +--ro expire? uint16 550 notifications: 551 +---n pim-rp-event 552 +--ro event-type? rp-event-type 553 +--ro routing-instance-state-ref? rt:routing-instance-state-ref 554 +--ro instance-af-state-ref? leafref 555 +--ro group? inet:ip-address 556 +--ro rp-address? inet:ip-address 557 +--ro is-rpt? boolean 558 +--ro mode? pim-base:pim-mode 559 +--ro message-origin? inet:ip-address 561 4.3. PIM-SM module 563 This module covers Sparse Mode configuration, including PIM-ASM and 564 PIM-SSM. 566 module: ietf-pim-sm 567 augment /rt:routing/rt:routing-instance/rt:routing-protocols/ 568 pim-base:pim/pim-base:address-family: 569 +--rw sm 570 +--rw asm 571 | +--rw anycast-rp! 572 | | +--rw ipv4 573 | | | +--rw ipv4-anycast-rp* [anycast-addr rp-addr] 574 | | | +--rw anycast-addr inet:ipv4-address 575 | | | +--rw rp-addr inet:ipv4-address 576 | | +--rw ipv6 577 | | +--rw ipv6-anycast-rip* [anycast-addr rp-addr] 578 | | +--rw anycast-addr inet:ipv6-address 579 | | +--rw rp-addr inet:ipv6-address 580 | +--rw spt-switch 581 | +--rw infinity! {spt-switch-infinity}? 582 | +--rw policy-name? string {spt-switch-policy}? 583 +--rw ssm! 584 +--rw range-poligy? string 585 augment /rt:routing/rt:routing-instance/rt:routing-protocols/ 586 pim-base:pim/pim-base:interfaces/pim-base:interface/ 587 pim-base:address-family: 588 +--rw sm! 589 +--rw passive? empty 590 augment /rt:routing/rt:routing-instance/rt:routing-protocols/ 591 pim-base:pim/pim-base:address-family/pim-rp:rp/pim-rp:static-rp/ 592 pim-rp:ipv4-rp: 593 +--rw sm! 594 +--rw policy-name? string 595 +--rw override? boolean {static-rp-override}? 596 augment /rt:routing/rt:routing-instance/rt:routing-protocols/ 597 pim-base:pim/pim-base:address-family/pim-rp:rp/pim-rp:static-rp/ 598 pim-rp:ipv6-rp: 599 +--rw sm! 600 +--rw policy-name? string 601 +--rw override? boolean {static-rp-override}? 602 augment /rt:routing-state/rt:routing-instance/rt:routing-protocols/ 603 pim-base:pim/pim-base:address-family: 604 +--ro sm 606 4.4. PIM-DM module 608 This module will cover Dense Mode configuration. 610 module: ietf-pim-dm 611 augment /rt:routing/rt:routing-instance/rt:routing-protocols/ 612 pim-base:pim/pim-base:address-family: 613 +--rw dm! 614 augment /rt:routing/rt:routing-instance/rt:routing-protocols/ 615 pim-base:pim/pim-base:interfaces/pim-base:interface/ 616 pim-base:address-family: 617 +--rw dm! 618 augment /rt:routing-state/rt:routing-instance/rt:routing-protocols/ 619 pim-base:pim/pim-base:address-family: 620 +--ro dm 622 4.5. PIM-BIDIR module 624 This module will cover Bidirectional PIM configuration. 626 module: ietf-pim-bidir 627 augment /rt:routing/rt:routing-instance/rt:routing-protocols/ 628 pim-base:pim/pim-base:address-family: 629 +--rw bidir 630 augment /rt:routing/rt:routing-instance/rt:routing-protocols/ 631 pim-base:pim/pim-base:interfaces/pim-base:interface/ 632 pim-base:address-family: 633 +--rw bidir! 634 +--rw df-election {intf-df-election}? 635 +--rw offer-interval? uint32 636 +--rw backoff-interval? uint32 637 +--rw offer-multipler? uint8 638 augment /rt:routing/rt:routing-instance/rt:routing-protocols/ 639 pim-base:pim/pim-base:address-family/pim-rp:rp/pim-rp:static-rp/ 640 pim-rp:ipv4-rp: 641 +--rw bidir! 642 +--rw policy-name? string 643 +--rw override? boolean {static-rp-override}? 644 augment /rt:routing/rt:routing-instance/rt:routing-protocols/ 645 pim-base:pim/pim-base:address-family/pim-rp:rp/pim-rp:static-rp/ 646 pim-rp:ipv6-rp: 647 +--rw bidir! 648 +--rw policy-name? string 649 +--rw override? boolean {static-rp-override}? 650 augment /rt:routing-state/rt:routing-instance/rt:routing-protocols/ 651 pim-base:pim/pim-base:address-family: 652 +--ro bidir 654 5. PIM YANG Modules 656 5.1. PIM base module 658 660 module ietf-pim-base { 661 namespace "urn:ietf:params:xml:ns:yang:ietf-pim-base"; 662 // replace with IANA namespace when assigned 663 prefix pim-base; 665 import ietf-inet-types { 666 prefix "inet"; 667 } 669 import ietf-yang-types { 670 prefix "yang"; 671 } 673 import ietf-interfaces { 674 prefix "if"; 675 } 677 import ietf-routing { 678 prefix "rt"; 679 } 681 organization 682 "IETF PIM Working Group"; 684 contact 685 "WG Web: 686 WG List: 688 WG Chair: Stig Venaas 689 691 WG Chair: Mike McBride 692 694 Editors: "; 696 description 697 "The module defines a collection of YANG definitions common for 698 all PIM modes."; 700 revision 2015-10-08 { 701 description 702 "Initial revision."; 703 reference 704 "RFC XXXX: A YANG Data Model for PIM"; 705 } 707 /* 708 * Features 709 */ 710 feature global-graceful-restart { 711 description 712 "Global configuraiont for graceful restart support as per 713 RFC5306."; 714 } 716 feature intf-dr-priority { 717 description 718 "Support configuration of interface dr priority."; 719 } 721 feature intf-hello-holdtime { 722 description 723 "Support configuration of interface hello holdtime."; 724 } 726 feature intf-hello-interval { 727 description 728 "Support configuration of interface hello interval."; 729 } 731 feature intf-hello-multipler { 732 description 733 "Support configuration of interface hello multipler."; 734 } 736 feature intf-jp-interval { 737 description 738 "Support configuration of interface join prune interval."; 739 } 741 feature intf-jp-holdtime { 742 description 743 "Support configuration of interface join prune holdtime."; 744 } 746 feature intf-jp-multipler { 747 description 748 "Support configuration of interface join prune multipler."; 750 } 752 feature intf-propagation-delay { 753 description 754 "Support configuration of interface propagation delay."; 755 } 757 feature intf-override-interval { 758 description 759 "Support configuration of interface override interval."; 760 } 762 feature per-af-graceful-restart { 763 description 764 "Per AF configuraiont for graceful restart support as per 765 RFC5306."; 766 } 768 /* 769 * Typedefs 770 */ 771 typedef interface-event-type { 772 type enumeration { 773 enum up { 774 description 775 "Neighbor status changed to up."; 776 } 777 enum down { 778 description 779 "Neighbor status changed to down."; 780 } 781 enum new-dr { 782 description 783 "A new DR was elected on the connected network."; 784 } 785 enum new-df { 786 description 787 "A new DF was elected on the connected network."; 788 } 789 } 790 description "Operational status event type for notifications."; 791 } 793 typedef neighbor-event-type { 794 type enumeration { 795 enum up { 796 description 797 "Neighbor status changed to up."; 799 } 800 enum down { 801 description 802 "Neighbor status changed to down."; 803 } 804 } 805 description "Operational status event type for notifications."; 806 } 808 typedef pim-mode { 809 type enumeration { 810 enum none { 811 description 812 "PIM is not operating."; 813 } 814 enum ssm { 815 description 816 "Source-Specific Multicast (SSM) with PIM Sparse Mode."; 817 } 818 enum asm { 819 description 820 "Any Source Multicast (ASM) with PIM Sparse Mode."; 821 } 822 enum bidir { 823 description 824 "Bidirectional PIM."; 825 } 826 enum dm { 827 description 828 "PIM Dense Mode."; 829 } 830 enum other { 831 description 832 "Any other PIM mode."; 833 } 834 } 835 description 836 "The PIM mode in which a group is operating."; 837 } 839 typedef timer-value { 840 type union { 841 type uint16; 842 type enumeration { 843 enum "infinity" { 844 description "The timer is set to infinity."; 845 } 846 enum "no-expiry" { 847 description "The timer is not set."; 848 } 849 } 850 } 851 units seconds; 852 description "Timer value type."; 853 } // timer-value 855 /* 856 * Identities 857 */ 859 /* 860 * Groupings 861 */ 862 grouping global-attributes { 863 description 864 "A Grouping defining global configuration attributes."; 865 uses graceful-restart-container { 866 if-feature global-graceful-restart; 867 } 868 } // global-attributes 870 grouping graceful-restart-container { 871 description 872 "A grouping defining a container of graceful restart 873 attributes."; 874 container graceful-restart { 875 leaf enabled { 876 type boolean; 877 description 878 "Enable or disable graceful restart."; 879 } 880 leaf duration { 881 type uint16; 882 units "seconds"; 883 description 884 "Maximum time for graceful restart to finish."; 885 } 886 description 887 "Container of graceful restart attributes."; 888 } 889 } // graceful-restart-container 891 grouping interface-config-attributes { 892 description 893 "A grouping defining interface attributes."; 894 leaf dr-priority { 895 if-feature intf-dr-priority; 896 type uint32; 897 description "DR priority"; 898 } 899 leaf hello-interval { 900 if-feature intf-hello-interval; 901 type uint16; 902 description "Hello interval"; 903 } 904 choice hello-holdtime-or-multipler { 905 description "Use holdtime or multipler"; 906 case holdtime { 907 if-feature intf-hello-holdtime; 908 leaf hello-holdtime { 909 type uint16; 910 description "Hello holdtime"; 911 } 912 } 913 case multipler { 914 if-feature intf-hello-multipler; 915 leaf hello-multipler { 916 type uint8; 917 description "Hello multipler"; 918 } 919 } 920 } 921 leaf jp-interval { 922 if-feature intf-jp-interval; 923 type uint16; 924 description "Join prune interval"; 925 } 926 choice jp-holdtime-or-multipler { 927 description "Use holdtime or multipler"; 928 case holdtime { 929 if-feature intf-jp-holdtime; 930 leaf jp-holdtime { 931 type uint16; 932 description "Join prune holdtime"; 933 } 934 } 935 case multipler { 936 if-feature intf-jp-multipler; 937 leaf jp-multipler { 938 type uint8; 939 description "Join prune multipler"; 940 } 941 } 942 } 943 leaf propagation-delay { 944 if-feature intf-propagation-delay; 945 type uint16; 946 description "Propagation description"; 947 } 948 leaf override-interval { 949 if-feature intf-override-interval; 950 type uint16; 951 description "Override interval"; 952 } 953 } // interface-config-attributes 955 grouping interface-state-attributes { 956 description 957 "A grouping defining interface attributes."; 958 container ipv4 { 959 when "../../../address-family = 'rt:ipv4'" { 960 description 961 "Only applicable to ipv4 address family."; 962 } 963 description ""; 964 leaf-list address { 965 type inet:ipv4-address; 966 description ""; 967 } 968 leaf dr-addr { 969 type inet:ipv4-address; 970 description ""; 971 } 972 } 973 container ipv6 { 974 when "../../../address-family = 'rt:ipv6'" { 975 description 976 "Only applicable to ipv6 address family."; 977 } 978 description ""; 979 leaf-list address { 980 type inet:ipv6-address; 981 description ""; 982 } 983 leaf dr-addr { 984 type inet:ipv6-address; 985 description ""; 986 } 987 } 988 uses interface-state-af-attributes; 989 } // interface-state-attributes 990 grouping interface-state-af-attributes { 991 description 992 "A grouping defining interface per af attributes."; 994 leaf oper-status { 995 type enumeration { 996 enum up { 997 description 998 "Ready to pass packets."; 999 } 1000 enum down { 1001 description 1002 "The interface does not pass any packets."; 1003 } 1004 } 1005 description ""; 1006 } 1008 leaf hello-expire { 1009 type uint32; 1010 description "Hello interval exiration time."; 1011 } 1013 list neighbor-ipv4 { 1014 when "../../../address-family = 'rt:ipv4'" { 1015 description 1016 "Only applicable to ipv4 address family."; 1017 } 1018 key "address"; 1019 description ""; 1020 leaf address { 1021 type inet:ipv4-address; 1022 description ""; 1023 } 1024 uses neighbor-state-af-attributes; 1025 } // list neighbor-ipv4 1027 list neighbor-ipv6 { 1028 when "../../../address-family = 'rt:ipv6'" { 1029 description 1030 "Only applicable to ipv6 address family."; 1031 } 1032 key "address"; 1033 description ""; 1034 leaf address { 1035 type inet:ipv6-address; 1036 description ""; 1037 } 1038 uses neighbor-state-af-attributes; 1039 } // list neighbor-ipv4 1040 } // interface-state-af-attributes 1042 grouping multicast-route-attributes { 1043 description 1044 "A grouping defining multicast route attributes."; 1046 leaf expire { 1047 type uint32; 1048 units seconds; 1049 description ""; 1050 } 1051 leaf incoming-interface { 1052 type if:interface-ref; 1053 description 1054 "Reference to an entry in the global interface 1055 list."; 1056 } 1057 leaf mode { 1058 type pim-mode; 1059 description ""; 1060 } 1061 leaf msdp-learned { 1062 type boolean; 1063 description ""; 1064 } 1065 leaf rp-address { 1066 type inet:ip-address; 1067 description ""; 1068 } 1069 leaf rpf-neighbor { 1070 type inet:ip-address; 1071 description ""; 1072 } 1073 leaf spt-bit { 1074 type boolean; 1075 description ""; 1076 } 1077 leaf up-time { 1078 type uint32; 1079 units seconds; 1080 description ""; 1081 } 1082 list outgoing-interface { 1083 key "name"; 1084 description 1085 "A list of outgoing interfaces."; 1087 leaf name { 1088 type if:interface-ref; 1089 description 1090 "Interface name"; 1091 } 1093 leaf expire { 1094 type yang:timeticks; 1095 description "Expiring information."; 1096 } 1098 leaf up-time { 1099 type yang:timeticks; 1100 description ""; 1101 } 1103 leaf jp-state { 1104 type enumeration { 1105 enum "no-info" { 1106 description 1107 "The interface has Join state and no timers running"; 1108 } 1109 enum "join" { 1110 description 1111 "The interface has Join state."; 1112 } 1113 enum "prune-pending" { 1114 description 1115 "The router has received a Prune on this interface from 1116 a downstream neighbor and is waiting to see whether 1117 the prune will be overridden by another downstream 1118 router. For forwarding purposes, the Prune-Pending 1119 state functions exactly like the Join state."; 1120 } 1121 } 1122 description ""; 1123 } 1124 } 1125 } // multicast-route-attributes 1127 grouping neighbor-state-af-attributes { 1128 description 1129 "A grouping defining neighbor per af attributes."; 1130 leaf bfd-status { 1131 type enumeration { 1132 enum up { 1133 description 1134 ""; 1136 } 1137 enum down { 1138 description 1139 ""; 1140 } 1141 } 1142 description ""; 1143 } 1144 leaf expire { 1145 type uint32; 1146 units seconds; 1147 description "Neighbor expiring information."; 1148 } 1149 leaf dr-priority { 1150 type uint32; 1151 description "DR priority"; 1152 } 1153 leaf gen-id { 1154 type uint32; 1155 description "Generation ID."; 1156 } 1157 leaf up-time { 1158 type uint32; 1159 units seconds; 1160 description ""; 1161 } 1162 } // neighbor-state-af-attributes 1164 grouping per-af-attributes { 1165 description 1166 "A grouping defining per address family attributes."; 1167 uses graceful-restart-container { 1168 if-feature per-af-graceful-restart; 1169 } 1170 } // per-af-attributes 1172 grouping pim-instance-state-ref { 1173 description 1174 "An absolute reference to a PIM instance."; 1175 leaf routing-instance-state-ref { 1176 type rt:routing-instance-state-ref; 1177 description 1178 "Reference to the routing instance state."; 1179 } 1180 } // pim-instance-state-ref 1182 grouping pim-instance-af-state-ref { 1183 description 1184 "An absolute reference to a PIM instance address family."; 1185 uses pim-instance-state-ref; 1186 leaf instance-af-state-ref { 1187 type leafref { 1188 path "/rt:routing-state/rt:routing-instance" 1189 + "[rt:name = current()/../routing-instance-state-ref]/" 1190 + "rt:routing-protocols/pim-base:pim/" 1191 + "pim-base:address-family/pim-base:address-family"; 1192 } 1193 description 1194 "Reference to a PIM instance address family."; 1195 } 1196 } // pim-instance-state-af-ref 1198 grouping pim-interface-state-ref { 1199 description 1200 "An absolute reference to a PIM interface state."; 1201 uses pim-instance-state-ref; 1202 leaf interface-state-ref { 1203 type leafref { 1204 path "/rt:routing-state/rt:routing-instance" 1205 + "[rt:name = current()/../routing-instance-state-ref]/" 1206 + "rt:routing-protocols/pim-base:pim/pim-base:interfaces/" 1207 + "pim-base:interface/pim-base:interface"; 1208 } 1209 description 1210 "Reference to a PIM interface."; 1211 } 1212 } // pim-interface-state-ref 1214 grouping pim-neighbor-state-ref { 1215 description 1216 "An absolute reference to a PIM neighbor state."; 1217 uses pim-interface-state-ref; 1218 leaf interface-af-state-ref { 1219 type leafref { 1220 path "/rt:routing-state/rt:routing-instance" 1221 + "[rt:name = current()/../routing-instance-state-ref]/" 1222 + "rt:routing-protocols/pim-base:pim/pim-base:interfaces/" 1223 + "pim-base:interface" 1224 + "[pim-base:interface = " 1225 + "current()/../interface-state-ref]/" 1226 + "pim-base:address-family/pim-base:address-family"; 1227 } 1228 description 1229 "Reference to a PIM interface address family."; 1230 } 1231 leaf neighbor-ipv4-state-ref { 1232 when "../interface-af-state-ref = 'rt:ipv4'" { 1233 description ""; 1234 } 1235 type leafref { 1236 path "/rt:routing-state/rt:routing-instance" 1237 + "[rt:name = current()/../routing-instance-state-ref]/" 1238 + "rt:routing-protocols/pim-base:pim/pim-base:interfaces/" 1239 + "pim-base:interface" 1240 + "[pim-base:interface = " 1241 + "current()/../interface-state-ref]/" 1242 + "pim-base:address-family" 1243 + "[pim-base:address-family = " 1244 + "current()/../interface-af-state-ref]/" 1245 + "pim-base:neighbor-ipv4/pim-base:address"; 1246 } 1247 description 1248 "Reference to a PIM IPv4 neighbor."; 1249 } 1250 leaf neighbor-ipv6-state-ref { 1251 when "../interface-af-state-ref = 'rt:ipv6'" { 1252 description ""; 1253 } 1254 type leafref { 1255 path "/rt:routing-state/rt:routing-instance" 1256 + "[rt:name = current()/../routing-instance-state-ref]/" 1257 + "rt:routing-protocols/pim-base:pim/pim-base:interfaces/" 1258 + "pim-base:interface" 1259 + "[pim-base:interface = " 1260 + "current()/../interface-state-ref]/" 1261 + "pim-base:address-family" 1262 + "[pim-base:address-family = " 1263 + "current()/../interface-af-state-ref]/" 1264 + "pim-base:neighbor-ipv6/pim-base:address"; 1265 } 1266 description 1267 "Reference to a PIM IPv6 neighbor."; 1268 } 1269 } // pim-neighbor-state-ref 1271 grouping statistics-container { 1272 description 1273 "A container defining statistics attributes."; 1274 container statistics { 1275 description ""; 1276 leaf discontinuity-time { 1277 type yang:date-and-time; 1278 description 1279 "The time on the most recent occasion at which any one 1280 or more of the statistic counters suffered a 1281 discontinuity. If no such discontinuities have occurred 1282 since the last re-initialization of the local 1283 management subsystem, then this node contains the time 1284 the local management subsystem re-initialized itself."; 1285 } 1286 container error { 1287 description ""; 1288 uses statistics-error; 1289 } 1290 container queue { 1291 description ""; 1292 uses statistics-queue; 1293 } 1294 container received { 1295 description ""; 1296 uses statistics-sent-received; 1297 } 1298 container sent { 1299 description ""; 1300 uses statistics-sent-received; 1301 } 1302 } 1303 } // statistics-container 1305 grouping statistics-error { 1306 description 1307 "A grouping defining error statistics 1308 attributes."; 1309 uses statistics-sent-received; 1310 } // statistics-error 1312 grouping statistics-queue { 1313 description 1314 "A grouping defining queue statistics 1315 attributes."; 1316 leaf size { 1317 type uint32; 1318 description 1319 "The size of the input queue."; 1320 } 1321 leaf overflow { 1322 type yang:counter32; 1323 description 1324 "The number of the input queue overflows."; 1325 } 1326 } // statistics-queue 1327 grouping statistics-sent-received { 1328 description 1329 "A grouping defining sent and received statistics 1330 attributes."; 1331 leaf assert { 1332 type yang:counter32; 1333 description 1334 "The number of assert messages."; 1335 } 1336 leaf bsr { 1337 type yang:counter32; 1338 description 1339 "The number of bsr messages."; 1340 } 1341 leaf candidate-rp-advertisement { 1342 type yang:counter32; 1343 description 1344 "The number of Candidate-RP-advertisement messages."; 1345 } 1346 leaf hello { 1347 type yang:counter32; 1348 description 1349 "The number of hello messages."; 1350 } 1351 leaf join-prune { 1352 type yang:counter32; 1353 description 1354 "The number of join/prune messages."; 1355 } 1356 leaf register { 1357 type yang:counter32; 1358 description 1359 "The number of register messages."; 1360 } 1361 leaf register-stop { 1362 type yang:counter32; 1363 description 1364 "The number of register stop messages."; 1365 } 1366 leaf state-refresh { 1367 type yang:counter32; 1368 description 1369 "The number of state refresh messages."; 1370 } 1371 } // statistics-sent-received 1373 /* 1374 * Configuration data nodes 1375 */ 1377 augment "/rt:routing/rt:routing-instance/" 1378 + "rt:routing-protocols" { 1379 description 1380 "PIM augmentation to routing instance configuration."; 1382 container pim { 1383 description 1384 "PIM configuration data."; 1386 uses global-attributes; 1388 list address-family { 1389 key "address-family"; 1390 description 1391 "Each list entry for one address family."; 1392 uses rt:address-family; 1393 uses per-af-attributes; 1395 } // address-family 1397 container interfaces { 1398 description 1399 "Containing a list of interfaces."; 1400 list interface { 1401 key "interface"; 1402 description 1403 "List of pim interfaces."; 1404 leaf interface { 1405 type if:interface-ref; 1406 description 1407 "Reference to an entry in the global interface 1408 list."; 1409 } 1410 list address-family { 1411 key "address-family"; 1412 description 1413 "Each list entry for one address family."; 1414 uses rt:address-family; 1415 uses interface-config-attributes; 1416 } // address-family 1417 } // interface 1418 } // interfaces 1419 } // pim 1420 } // augment 1422 /* 1423 * Operational state data nodes 1424 */ 1426 augment "/rt:routing-state/rt:routing-instance/" 1427 + "rt:routing-protocols" { 1428 description 1429 "PIM augmentation to routing instance state."; 1430 container pim { 1431 description 1432 "PIM state data."; 1434 list address-family { 1435 key "address-family"; 1436 description 1437 "Each list entry for one address family."; 1438 uses rt:address-family; 1440 uses statistics-container; 1442 container topology-tree-info { 1443 description ""; 1444 list ipv4-route { 1445 when "../../../address-family = 'rt:ipv4'" { 1446 description 1447 "Only applicable to ipv4 address family."; 1448 } 1449 key "group source-addr is-rpt"; 1450 description ""; 1451 leaf group { 1452 type inet:ipv4-address; 1453 description ""; 1454 } 1455 leaf source-addr { 1456 type union { 1457 type enumeration { 1458 enum '*' { 1459 description ""; 1460 } 1461 } 1462 type inet:ipv4-address; 1463 } 1464 description ""; 1465 } 1466 leaf is-rpt { 1467 type boolean; 1468 description ""; 1469 } 1470 uses multicast-route-attributes; 1471 } // ipv4-route 1473 list ipv6-route { 1474 when "../../../address-family = 'rt:ipv6'" { 1475 description 1476 "Only applicable to ipv4 address family."; 1477 } 1478 key "group source-addr is-rpt"; 1479 description ""; 1480 leaf group { 1481 type inet:ipv6-address; 1482 description ""; 1483 } 1484 leaf source-addr { 1485 type union { 1486 type enumeration { 1487 enum '*' { 1488 description ""; 1489 } 1490 } 1491 type inet:ipv4-address; 1492 } 1493 description ""; 1494 } 1495 leaf is-rpt { 1496 type boolean; 1497 description ""; 1498 } 1500 uses multicast-route-attributes; 1501 } // ipv6-route 1502 } // routes 1503 } // address-family 1505 container interfaces { 1506 description 1507 "Containing a list of interfaces."; 1508 list interface { 1509 key "interface"; 1510 description 1511 "List of pim interfaces."; 1512 leaf interface { 1513 type if:interface-ref; 1514 description 1515 "Reference to an entry in the global interface 1516 list."; 1517 } 1518 list address-family { 1519 key "address-family"; 1520 description 1521 "Each list entry for one address family."; 1522 uses rt:address-family; 1523 uses interface-config-attributes; 1524 uses interface-state-attributes; 1525 } // address-family 1526 } // interface 1527 } // interfaces 1528 } // pim 1529 } // augment 1531 /* 1532 * RPCs 1533 */ 1535 /* 1536 * Notifications 1537 */ 1538 notification pim-neighbor-event { 1539 description "Notification event for neighbor."; 1540 leaf event-type { 1541 type neighbor-event-type; 1542 description "Event type."; 1543 } 1544 uses pim-neighbor-state-ref; 1545 leaf up-time { 1546 type uint32; 1547 units seconds; 1548 description ""; 1549 } 1550 } 1551 notification pim-interface-event { 1552 description "Notification event for interface."; 1553 leaf event-type { 1554 type interface-event-type; 1555 description "Event type."; 1556 } 1557 uses pim-interface-state-ref; 1558 container ipv4 { 1559 description ""; 1560 leaf-list address { 1561 type inet:ipv4-address; 1562 description ""; 1563 } 1564 leaf dr-addr { 1565 type inet:ipv4-address; 1566 description ""; 1567 } 1568 } 1569 container ipv6 { 1570 description ""; 1571 leaf-list address { 1572 type inet:ipv6-address; 1573 description ""; 1574 } 1575 leaf dr-addr { 1576 type inet:ipv6-address; 1577 description ""; 1578 } 1579 } 1580 } 1581 } 1582 1584 5.2. PIM RP module 1586 1588 module ietf-pim-rp { 1589 namespace "urn:ietf:params:xml:ns:yang:ietf-pim-rp"; 1590 // replace with IANA namespace when assigned 1591 prefix pim-rp; 1593 import ietf-inet-types { 1594 prefix "inet"; 1595 } 1597 import ietf-interfaces { 1598 prefix "if"; 1599 } 1601 import ietf-routing { 1602 prefix "rt"; 1603 } 1605 import ietf-pim-base { 1606 prefix "pim-base"; 1607 } 1609 organization 1610 "IETF PIM Working Group"; 1612 contact 1613 "WG Web: 1614 WG List: 1616 WG Chair: Stig Venaas 1617 1619 WG Chair: Mike McBride 1620 1622 Editors: "; 1624 description 1625 "The YANG module defines a PIM RP (Rendezvous Point) model."; 1627 revision 2015-10-08 { 1628 description 1629 "Initial revision."; 1630 reference 1631 "RFC XXXX: A YANG Data Model for PIM"; 1632 } 1634 /* 1635 * Features 1636 */ 1637 feature bsr { 1638 description 1639 "This feature indicates that the system supports BSR."; 1640 } 1642 feature bsr-election-state { 1643 description 1644 "This feature indicates that the system supports providing 1645 BSR election state."; 1646 } 1648 feature static-rp-override { 1649 description 1650 "This feature indicates that the system supports configuration 1651 of static RP override."; 1652 } 1654 feature candidate-interface { 1655 description 1656 "This feature indicates that the system supports using 1657 an interface to configure a BSR or RP candidate."; 1658 } 1659 feature candidate-ipv4 { 1660 description 1661 "This feature indicates that the system supports using 1662 an IPv4 address to configure a BSR or RP candidate."; 1663 } 1665 feature candidate-ipv6 { 1666 description 1667 "This feature indicates that the system supports using 1668 an IPv6 address to configure a BSR or RP candidate."; 1669 } 1671 /* 1672 * Typedefs 1673 */ 1674 typedef rp-event-type { 1675 type enumeration { 1676 enum invalid-jp { 1677 description 1678 "An invalid JP message has been received."; 1679 } 1680 enum invalid-register { 1681 description 1682 "An invalid register message has been received."; 1683 } 1684 enum mapping-created { 1685 description 1686 "A new mapping has been created."; 1687 } 1688 enum mapping-deleted { 1689 description 1690 "A mapping has been deleted."; 1691 } 1692 } 1693 description "Operational status event type for notifications."; 1694 } 1696 /* 1697 * Identities 1698 */ 1699 identity rp-mode { 1700 description 1701 "The mode of an RP, which can be SM (Sparse Mode) or 1702 BIDIR (bi-directional)."; 1703 } 1705 /* 1706 * Groupings 1707 */ 1708 grouping bsr-config-attributes { 1709 description 1710 "Gouring of BSR config attributes."; 1711 container bsr-candidate { 1712 presence 1713 "Present to serve as a BSR candidate"; 1714 description 1715 "BSR candidate attributes."; 1717 choice interface-or-address { 1718 description 1719 "Use either interface or ip-address."; 1720 case interface { 1721 if-feature candidate-interface; 1722 leaf interface { 1723 type if:interface-ref; 1724 mandatory true; 1725 description 1726 "Interface to be used by BSR."; 1727 } 1728 } 1729 case ipv4-address { 1730 when "../../../../address-family = 'rt:ipv4'" { 1731 description 1732 "Only applicable to ipv4 address family."; 1733 } 1734 if-feature candidate-ipv4; 1735 leaf ipv4-address { 1736 type inet:ipv4-address; 1737 mandatory true; 1738 description 1739 "IP address to be used by BSR."; 1740 } 1741 } 1742 case ipv6-address { 1743 when "../../../../address-family = 'rt:ipv6'" { 1744 description 1745 "Only applicable to ipv6 address family."; 1746 } 1747 if-feature candidate-ipv6; 1748 leaf ipv6-address { 1749 type inet:ipv6-address; 1750 mandatory true; 1751 description 1752 "IP address to be used by BSR."; 1753 } 1755 } 1756 } 1758 leaf hash-mask-length{ 1759 type uint8 { 1760 range "0..32"; 1761 } 1762 mandatory true; 1763 description 1764 "Value contained in BSR messages used by all routers to 1765 hash (map) to an RP."; 1766 } 1768 leaf priority { 1769 type uint8 { 1770 range "0..255"; 1771 } 1772 mandatory true; 1773 description 1774 "BSR election priority among different candidate BSRs. 1775 A larger value has a higher priority over a smaller 1776 value."; 1777 } 1778 } // bsr-candidate 1780 list rp-candidate-interface { 1781 if-feature candidate-interface; 1782 key "interface"; 1783 description 1784 "A list of RP candidates"; 1785 leaf interface { 1786 type if:interface-ref; 1787 description 1788 "Interface that the RP candidate uses."; 1789 } 1790 uses rp-candidate-attributes; 1791 } 1793 list rp-candidate-ipv4-address { 1794 when "../../../address-family = 'rt:ipv4'" { 1795 description 1796 "Only applicable to ipv4 address family."; 1797 } 1798 if-feature candidate-ipv4; 1799 key "ipv4-address"; 1800 description 1801 "A list of RP candidates"; 1802 leaf ipv4-address { 1803 type inet:ipv4-address; 1804 description 1805 "IPv4 address that the RP candidate uses."; 1806 } 1807 uses rp-candidate-attributes; 1808 } 1810 list rp-candidate-ipv6-address { 1811 when "../../../address-family = 'rt:ipv6'" { 1812 description 1813 "Only applicable to ipv6 address family."; 1814 } 1815 if-feature candidate-ipv6; 1816 key "ipv6-address"; 1817 description 1818 "A list of RP candidates"; 1819 leaf ipv6-address { 1820 type inet:ipv6-address; 1821 description 1822 "IPv6 address that the RP candidate uses."; 1823 } 1824 uses rp-candidate-attributes; 1825 } 1826 } // bsr-config-attributes 1828 grouping bsr-state-attributes { 1829 description 1830 "Gouring of BSR state attributes."; 1831 container bsr { 1832 description 1833 "BSR information."; 1834 leaf addr { 1835 type inet:ip-address; 1836 description "BSR address"; 1837 } 1838 leaf hash-mask-length { 1839 type uint8; 1840 description ""; 1841 } 1842 leaf priority { 1843 type uint8 { 1844 range "0..255"; 1845 } 1846 description ""; 1847 } 1848 leaf up-time { 1849 type uint32; 1850 units seconds; 1851 description ""; 1852 } 1853 } 1854 choice election-state { 1855 if-feature bsr-election-state; 1856 description "BSR election state."; 1857 case candidate { 1858 leaf candidate-bsr-state { 1859 type enumeration { 1860 enum "candidate" { 1861 description 1862 "The router is a candidate to be the BSR for the 1863 scope zone, but currently another router is the 1864 preferred BSR."; 1865 } 1866 enum "pending" { 1867 description 1868 "The router is a candidate to be the BSR for the 1869 scope zone. Currently, no other router is the 1870 preferred BSR, but this router is not yet the 1871 elected BSR. This is a temporary state that 1872 prevents rapid thrashing of the choice of BSR 1873 during BSR election."; 1874 } 1875 enum "elected" { 1876 description 1877 "The router is the elected BSR for the scope zone 1878 and it must perform all the BSR functions."; 1879 } 1880 } 1881 description 1882 "Candidate-BSR state."; 1883 reference 1884 "RFC5059, Section 3.1.1."; 1885 } 1886 } 1887 case "non-candidate" { 1888 leaf non-candidate-bsr-state { 1889 type enumeration { 1890 enum "no-info" { 1891 description 1892 "The router has no information about this scope 1893 zone."; 1894 } 1895 enum "accept-any" { 1896 description 1897 "The router does not know of an active BSR, and will 1898 accept the first Bootstrap message it sees as giving 1899 the new BSR's identity and the RP-Set."; 1900 } 1901 enum "accept" { 1902 description 1903 "The router knows the identity of the current BSR, 1904 and is using the RP-Set provided by that BSR. Only 1905 Bootstrap messages from that BSR or from a C-BSR 1906 with higher weight than the current BSR will be 1907 accepted."; 1908 } 1909 } 1910 description 1911 "Non-candidate-BSR state."; 1912 reference 1913 "RFC5059, Section 3.1.2."; 1914 } 1915 } 1916 } // election-state 1917 leaf bsr-next-bootstrap { 1918 type uint16; 1919 units seconds; 1920 description ""; 1921 } 1923 container rp { 1924 description 1925 "State information of the RP."; 1926 leaf rp-address { 1927 type inet:ip-address; 1928 description ""; 1929 } 1930 leaf group-policy { 1931 type string; 1932 description ""; 1933 } 1934 leaf up-time { 1935 type uint32; 1936 description ""; 1937 } 1938 } 1939 leaf rp-candidate-next-advertisement { 1940 type uint16; 1941 units seconds; 1942 description ""; 1943 } 1944 } // bsr-state-attributes 1946 grouping rp-state-attributes { 1947 description 1948 "Gouring of static RP attributes."; 1949 leaf info-source-type { 1950 type enumeration { 1951 enum static { 1952 description 1953 ""; 1954 } 1955 enum bootstrap { 1956 description 1957 ""; 1958 } 1959 } 1960 description ""; 1961 } // info-source-type 1962 leaf up-time { 1963 type uint32; 1964 units seconds; 1965 description ""; 1966 } 1967 leaf expire { 1968 type uint16; 1969 units seconds; 1970 description ""; 1971 } 1972 } // rp-state-attributes 1974 grouping static-rp-attributes { 1975 description 1976 "Gouring of static RP attributes, used in augmenting modules."; 1977 leaf policy-name { 1978 type string; 1979 description 1980 "Static RP policy."; 1981 } 1982 leaf override { 1983 if-feature static-rp-override; 1984 type boolean; 1985 description 1986 "When there is a conflict between static RP and dynamic 1987 RP, setting this attribute to 'true' will ask the 1988 system to use static RP."; 1989 } 1990 } // static-rp-attributes 1992 grouping rp-candidate-attributes { 1993 description 1994 "Gouring of RP candidate attributes."; 1996 leaf policy { 1997 type string; 1998 description 1999 "ACL policy used to filter group addresses."; 2000 } 2001 leaf mode { 2002 type identityref { 2003 base rp-mode; 2004 } 2005 description 2006 "RP mode."; 2007 } 2008 } // rp-candidate-attributes 2010 /* 2011 * Configuration data nodes 2012 */ 2014 augment "/rt:routing/rt:routing-instance/" 2015 + "rt:routing-protocols/pim-base:pim/" 2016 + "pim-base:address-family" { 2017 description "PIM RP augmentation."; 2019 container rp { 2020 description 2021 "PIM RP configuration data."; 2023 container static-rp { 2024 description 2025 "Containing static RP attributes."; 2026 list ipv4-rp { 2027 when "../../../address-family = 'rt:ipv4'" { 2028 description 2029 "Only applicable to ipv4 address family."; 2030 } 2031 key "ipv4-addr"; 2032 description 2033 "A list of IPv4 RP addresses."; 2034 leaf ipv4-addr { 2035 type inet:ipv4-address; 2036 description 2037 "Specifies a static RP address."; 2038 } 2039 } 2041 list ipv6-rp { 2042 when "../../../address-family = 'rt:ipv6'" { 2043 description 2044 "Only applicable to ipv6 address family."; 2045 } 2046 key "ipv6-addr"; 2047 description 2048 "A list of IPv6 RP addresses."; 2049 leaf ipv6-addr { 2050 type inet:ipv6-address; 2051 description 2052 "Specifies a static RP address."; 2053 } 2054 } 2055 } // static-rp 2057 container bsr { 2058 if-feature bsr; 2059 description 2060 "Containing BSR (BootStrap Router) attributes."; 2061 uses bsr-config-attributes; 2062 } // bsr 2063 } // rp 2064 } // augment 2066 /* 2067 * Operational state data nodes 2068 */ 2070 augment "/rt:routing-state/rt:routing-instance/" 2071 + "rt:routing-protocols/pim-base:pim/" 2072 + "pim-base:address-family" { 2073 description 2074 "PIM SM state."; 2076 container rp { 2077 description 2078 "PIM RP state data."; 2080 container bsr { 2081 if-feature bsr; 2082 description 2083 "Containing BSR (BootStrap Router) attributes."; 2084 uses bsr-config-attributes; 2085 uses bsr-state-attributes; 2086 } // bsr 2088 container rp-list { 2089 description 2090 "Containing a list RPs."; 2091 list ipv4-rp { 2092 when "../../../address-family = 'rt:ipv4'" { 2093 description 2094 "Only applicable to ipv4 address family."; 2095 } 2096 key "ipv4-addr"; 2097 description 2098 "A list of IPv4 RP addresses."; 2099 leaf ipv4-addr { 2100 type inet:ipv4-address; 2101 description 2102 "RP address."; 2103 } 2104 leaf info-source-addr { 2105 type inet:ipv4-address; 2106 description 2107 "The address where RP information is learned."; 2108 } 2109 uses rp-state-attributes; 2110 } 2112 list ipv6-rp { 2113 when "../../../address-family = 'rt:ipv6'" { 2114 description 2115 "Only applicable to ipv6 address family."; 2116 } 2117 key "ipv6-addr"; 2118 description 2119 "A list of IPv6 RP addresses."; 2120 leaf ipv6-addr { 2121 type inet:ipv6-address; 2122 description 2123 "RP address."; 2124 } 2125 leaf info-source-addr { 2126 type inet:ipv6-address; 2127 description 2128 "The address where RP information is learned."; 2129 } 2130 uses rp-state-attributes; 2131 } 2132 } // rp-list 2134 container rp-mappings { 2135 description 2136 "Containing a list group-to-RP mappings."; 2137 list ipv4-rp { 2138 when "../../../address-family = 'rt:ipv4'" { 2139 description 2140 "Only applicable to ipv4 address family."; 2141 } 2142 key "group rp-addr"; 2143 description 2144 "A list of group-to-RP mappings."; 2145 leaf group { 2146 type inet:ipv4-prefix; 2147 description 2148 "Group prefix."; 2149 } 2150 leaf rp-addr { 2151 type inet:ipv4-address; 2152 description 2153 "RP address."; 2154 } 2155 leaf info-source-addr { 2156 type inet:ipv4-address; 2157 description 2158 "The address where RP information is learned."; 2159 } 2160 uses rp-state-attributes; 2161 } 2163 list ipv6-rp { 2164 when "../../../address-family = 'rt:ipv6'" { 2165 description 2166 "Only applicable to ipv6 address family."; 2167 } 2168 key "group rp-addr"; 2169 description 2170 "A list of IPv6 RP addresses."; 2171 leaf group { 2172 type inet:ipv6-prefix; 2173 description 2174 "Group prefix."; 2175 } 2176 leaf rp-addr { 2177 type inet:ipv6-address; 2178 description 2179 "RP address."; 2180 } 2181 leaf info-source-addr { 2182 type inet:ipv6-address; 2183 description 2184 "The address where RP information is learned."; 2185 } 2186 uses rp-state-attributes; 2187 } 2189 } // rp-mappings 2190 } // rp 2191 } // augment 2193 /* 2194 * RPCs 2195 */ 2197 /* 2198 * Notifications 2199 */ 2200 notification pim-rp-event { 2201 description "Notification event for RP."; 2202 leaf event-type { 2203 type rp-event-type; 2204 description "Event type."; 2205 } 2206 uses pim-base:pim-instance-af-state-ref; 2207 leaf group { 2208 type inet:ip-address; 2209 description ""; 2210 } 2211 leaf rp-address { 2212 type inet:ip-address; 2213 description ""; 2214 } 2215 leaf is-rpt { 2216 type boolean; 2217 description ""; 2218 } 2219 leaf mode { 2220 type pim-base:pim-mode; 2221 description ""; 2222 } 2223 leaf message-origin { 2224 type inet:ip-address; 2225 description ""; 2226 } 2227 } 2228 } 2229 2231 5.3. PIM-SM module 2233 2235 module ietf-pim-sm { 2236 namespace "urn:ietf:params:xml:ns:yang:ietf-pim-sm"; 2237 // replace with IANA namespace when assigned 2238 prefix pim-sm; 2240 import ietf-inet-types { 2241 prefix "inet"; 2242 } 2244 import ietf-routing { 2245 prefix "rt"; 2246 } 2248 import ietf-pim-base { 2249 prefix "pim-base"; 2250 } 2252 import ietf-pim-rp { 2253 prefix "pim-rp"; 2254 } 2256 organization 2257 "IETF PIM Working Group"; 2259 contact 2260 "WG Web: 2261 WG List: 2263 WG Chair: Stig Venaas 2264 2266 WG Chair: Mike McBride 2267 2269 Editors: "; 2271 description 2272 "The YANG module defines a sparse mode PIM model."; 2274 revision 2015-10-08 { 2275 description 2276 "Initial revision."; 2277 reference 2278 "RFC XXXX: A YANG Data Model for PIM"; 2279 } 2281 /* 2282 * Features 2283 */ 2284 feature spt-switch-infinity { 2285 description 2286 "This feature indicates that the system supports configuration 2287 choice whether to trigger the switchover from the rpt to the 2288 spt."; 2289 } 2291 feature spt-switch-policy { 2292 description 2293 "This feature indicates that the system supports configuring 2294 policy for the switchover from the rpt to the spt."; 2295 } 2297 /* 2298 * Identities 2299 */ 2300 identity sm { 2301 base pim-rp:rp-mode; 2302 description 2303 "SM (Spars Mode)."; 2304 } 2306 /* 2307 * Groupings 2308 */ 2309 grouping static-rp-sm-container { 2310 description 2311 "Gouping that contains SM attributes for static RP."; 2312 container sm { 2313 presence 2314 "Indicate the support of sparse mode."; 2315 description 2316 "PIM SM configuration data."; 2318 uses pim-rp:static-rp-attributes; 2319 } // sm 2320 } // static-rp-sm-container 2322 /* 2323 * Configuration data nodes 2324 */ 2326 augment "/rt:routing/rt:routing-instance/" 2327 + "rt:routing-protocols/pim-base:pim/" 2328 + "pim-base:address-family" { 2329 description "PIM SM augmentation."; 2331 container sm { 2332 description 2333 "PIM SM configuration data."; 2335 container asm { 2336 description 2337 "ASM (Any Source Multicast) attributes."; 2339 container anycast-rp { 2340 presence 2341 "Present to enable anycast RP."; 2342 description 2343 "Anycast RP attributes."; 2345 container ipv4 { 2346 when "../../../../address-family = 'rt:ipv4'" { 2347 description 2348 "Only applicable to ipv4 address family."; 2349 } 2350 description 2351 "IPv4 attributes. Only applicable when 2352 pim-base:address-family is ipv4."; 2353 list ipv4-anycast-rp { 2354 key "anycast-addr rp-addr"; 2355 description 2356 "A list of anycast RP setttings."; 2357 leaf anycast-addr { 2358 type inet:ipv4-address; 2359 description 2360 "IP address of the anycast RP set. This IP address 2361 is used by the multicast groups or sources to join 2362 or register."; 2363 } 2365 leaf rp-addr { 2366 type inet:ipv4-address; 2367 description 2368 "IP address of the router configured with anycast 2369 RP. This is the IP address where the Register 2370 messages are forwarded."; 2371 } 2372 } 2373 } 2374 container ipv6 { 2375 when "../../../../address-family = 'rt:ipv6'" { 2376 description 2377 "Only applicable to ipv6 address family."; 2378 } 2379 description 2380 "IPv6 attributes. Only applicable when 2381 pim-base:address-family is ipv6."; 2382 list ipv6-anycast-rip { 2383 key "anycast-addr rp-addr"; 2384 description 2385 "A list of anycast RP setttings."; 2386 leaf anycast-addr { 2387 type inet:ipv6-address; 2388 description 2389 "IP address of the anycast RP set. This IP address 2390 is used by the multicast groups or sources to join 2391 or register."; 2392 } 2394 leaf rp-addr { 2395 type inet:ipv6-address; 2396 description 2397 "IP address of the router configured with anycast 2398 RP. This is the IP address where the Register 2399 messages are forwarded."; 2400 } 2401 } 2402 } 2403 } 2405 container spt-switch { 2406 description 2407 "SPT (Shortest Path Tree) switching attributes."; 2408 container infinity { 2409 if-feature spt-switch-infinity; 2410 presence "Present if spt-switch is set to infinity."; 2411 description 2412 "The receiver's dr never triggers the 2413 switchover from the rpt to the spt."; 2414 leaf policy-name { 2415 if-feature spt-switch-policy; 2416 type string; 2417 description 2418 "Switch policy."; 2419 } 2420 } // infinity 2421 } 2423 } // asm 2425 container ssm { 2426 presence 2427 "Present to enable SSM (Source-Specific Multicast)."; 2428 description 2429 "SSM (Source-Specific Multicast) attributes."; 2431 leaf range-poligy { 2432 type string; 2433 description 2434 "Policy used to define SSM address range."; 2435 } 2436 } // ssm 2437 } // sm 2438 } // augment 2440 augment "/rt:routing/rt:routing-instance/" 2441 + "rt:routing-protocols/pim-base:pim/" 2442 + "pim-base:interfaces/pim-base:interface/" 2443 + "pim-base:address-family" { 2444 description "PIM SM augmentation."; 2446 container sm { 2447 presence "Present to enable sparse-mode."; 2448 description 2449 "PIM SM configuration data."; 2451 leaf passive { 2452 type empty; 2453 description 2454 "Specifies that no PIM messages are sent out of the PIM 2455 interface, but the interface can be included in a multicast 2456 forwarding entry."; 2457 } 2458 } // sm 2459 } // augment 2461 augment "/rt:routing/rt:routing-instance/" 2462 + "rt:routing-protocols/pim-base:pim/" 2463 + "pim-base:address-family/pim-rp:rp/" 2464 + "pim-rp:static-rp/pim-rp:ipv4-rp" { 2465 description "PIM SM augmentation."; 2467 uses static-rp-sm-container; 2468 } // augment 2470 augment "/rt:routing/rt:routing-instance/" 2471 + "rt:routing-protocols/pim-base:pim/" 2472 + "pim-base:address-family/pim-rp:rp/" 2473 + "pim-rp:static-rp/pim-rp:ipv6-rp" { 2474 description "PIM SM augmentation."; 2476 uses static-rp-sm-container; 2477 } // augment 2479 /* 2480 * Operational state data nodes 2481 */ 2483 augment "/rt:routing-state/rt:routing-instance/" 2484 + "rt:routing-protocols/pim-base:pim/" 2485 + "pim-base:address-family" { 2486 description 2487 "PIM SM state."; 2489 container sm { 2490 description 2491 "PIM SM state data."; 2492 } // sm 2493 } // augment 2495 /* 2496 * RPCs 2497 */ 2499 /* 2500 * Notifications 2501 */ 2502 } 2503 2505 5.4. PIM-DM module 2507 2509 module ietf-pim-dm { 2510 namespace "urn:ietf:params:xml:ns:yang:ietf-pim-dm"; 2511 // replace with IANA namespace when assigned 2512 prefix pim-dm; 2514 import ietf-routing { 2515 prefix "rt"; 2517 } 2519 import ietf-pim-base { 2520 prefix "pim-base"; 2521 } 2523 organization 2524 "IETF PIM Working Group"; 2526 contact 2527 "WG Web: 2528 WG List: 2530 WG Chair: Stig Venaas 2531 2533 WG Chair: Mike McBride 2534 2536 Editors: "; 2538 description 2539 "The YANG module defines a DM (Dense Mode) PIM model."; 2541 revision 2015-10-08 { 2542 description 2543 "Initial revision."; 2544 reference 2545 "RFC XXXX: A YANG Data Model for PIM"; 2546 } 2548 /* 2549 * Features 2550 */ 2552 /* 2553 * Identities 2554 */ 2556 /* 2557 * Groupings 2558 */ 2560 /* 2561 * Configuration data nodes 2562 */ 2564 augment "/rt:routing/rt:routing-instance/" 2565 + "rt:routing-protocols/pim-base:pim/" 2566 + "pim-base:address-family" { 2567 description "PIM DM augmentation."; 2569 container dm { 2570 presence "Present to enable dense-mode."; 2571 description 2572 "PIM DM configuration data."; 2573 } // Dm 2574 } // augment 2576 augment "/rt:routing/rt:routing-instance/" 2577 + "rt:routing-protocols/pim-base:pim/" 2578 + "pim-base:interfaces/pim-base:interface/" 2579 + "pim-base:address-family" { 2580 description "PIM DM augmentation to PIM base interface."; 2582 container dm { 2583 presence "Present to enable dense-mode."; 2584 description 2585 "PIM DM configuration data."; 2586 } // sm 2587 } // augment 2589 /* 2590 * Operational state data nodes 2591 */ 2593 augment "/rt:routing-state/rt:routing-instance/" 2594 + "rt:routing-protocols/pim-base:pim/" 2595 + "pim-base:address-family" { 2596 description 2597 "PIM DM state."; 2598 container dm { 2599 description 2600 "PIM DM state data."; 2601 } // dm 2602 } // augment 2604 /* 2605 * RPCs 2606 */ 2608 /* 2609 * Notifications 2610 */ 2611 } 2612 2614 5.5. PIM-BIDIR module 2616 2618 module ietf-pim-bidir { 2619 namespace "urn:ietf:params:xml:ns:yang:ietf-pim-bidir"; 2620 // replace with IANA namespace when assigned 2621 prefix pim-bidir; 2623 import ietf-routing { 2624 prefix "rt"; 2625 } 2627 import ietf-pim-base { 2628 prefix "pim-base"; 2629 } 2631 import ietf-pim-rp { 2632 prefix "pim-rp"; 2633 } 2635 organization 2636 "IETF PIM Working Group"; 2638 contact 2639 "WG Web: 2640 WG List: 2642 WG Chair: Stig Venaas 2643 2645 WG Chair: Mike McBride 2646 2648 Editors: "; 2650 description 2651 "The YANG module defines a BIDIR (Bidirectional) mode PIM 2652 model."; 2654 revision 2015-10-08 { 2655 description 2656 "Initial revision."; 2657 reference 2658 "RFC XXXX: A YANG Data Model for PIM"; 2659 } 2660 /* 2661 * Features 2662 */ 2663 feature intf-df-election { 2664 description 2665 "Support configuration of interface DF election."; 2666 } 2668 /* 2669 * Identities 2670 */ 2671 identity bidir { 2672 base pim-rp:rp-mode; 2673 description 2674 "BIDIR (Bidirectional) mode."; 2675 } 2677 /* 2678 * Groupings 2679 */ 2680 grouping static-rp-bidir-container { 2681 description 2682 "Gouping that contains BIDIR attributes for static RP."; 2683 container bidir { 2684 presence 2685 "Indicate the support of BIDIR mode."; 2686 description 2687 "PIM BIDIR configuration data."; 2689 uses pim-rp:static-rp-attributes; 2690 } // bidir 2691 } // static-rp-bidir-container 2693 /* 2694 * Configuration data nodes 2695 */ 2697 augment "/rt:routing/rt:routing-instance/" 2698 + "rt:routing-protocols/pim-base:pim/" 2699 + "pim-base:address-family" { 2700 description "PIM BIDIR augmentation."; 2702 container bidir { 2703 description 2704 "PIM BIDIR configuration data."; 2705 } // bidir 2706 } // augment 2707 augment "/rt:routing/rt:routing-instance/" 2708 + "rt:routing-protocols/pim-base:pim/" 2709 + "pim-base:interfaces/pim-base:interface/" 2710 + "pim-base:address-family" { 2711 description "PIM BIDIR augmentation."; 2713 container bidir { 2714 presence "Present to enable BIDIR mode."; 2715 description 2716 "PIM BIDIR configuration data."; 2718 container df-election { 2719 if-feature intf-df-election; 2720 description 2721 "DF election attributes."; 2722 leaf offer-interval { 2723 type uint32; 2724 description "Offer interval"; 2725 } 2726 leaf backoff-interval { 2727 type uint32; 2728 description "Backoff interval"; 2729 } 2730 leaf offer-multipler { 2731 type uint8; 2732 description "Offer multipler"; 2733 } 2734 } // df-election 2735 } // bidir 2736 } // augment 2738 augment "/rt:routing/rt:routing-instance/" 2739 + "rt:routing-protocols/pim-base:pim/" 2740 + "pim-base:address-family/pim-rp:rp/" 2741 + "pim-rp:static-rp/pim-rp:ipv4-rp" { 2742 description "PIM BIDIR augmentation."; 2744 uses static-rp-bidir-container; 2745 } // augment 2747 augment "/rt:routing/rt:routing-instance/" 2748 + "rt:routing-protocols/pim-base:pim/" 2749 + "pim-base:address-family/pim-rp:rp/" 2750 + "pim-rp:static-rp/pim-rp:ipv6-rp" { 2751 description "PIM BIDIR augmentation."; 2753 uses static-rp-bidir-container; 2754 } // augment 2755 /* 2756 * Operational state data nodes 2757 */ 2759 augment "/rt:routing-state/rt:routing-instance/" 2760 + "rt:routing-protocols/pim-base:pim/" 2761 + "pim-base:address-family" { 2762 description 2763 "PIM BIDIR state."; 2765 container bidir { 2766 description 2767 "PIM BIDIR state data."; 2768 } // bidir 2769 } // augment 2771 /* 2772 * RPCs 2773 */ 2775 /* 2776 * Notifications 2777 */ 2778 } 2779 2781 6. TODO list 2783 In this draft, several aspects of the model are incomplete. The PIM- 2784 DM and BI-DIR modules are just placeholders for now to demonstrate 2785 the hierarchy of the model. Other things the draft will include when 2786 complete but does not yet include: 2788 o Interaction with BFD protocol 2790 o Constraints (constant ranges, validation) 2792 o State-limiting and policy 2794 o Statistics. 2796 For these subjects, we will employ the same design principles of 2797 expressing a highly general model; vendors may use features and add 2798 augmentations in order to express which subsets of this general model 2799 are valid in their implementations. 2801 7. Security Considerations 2803 The data model defined does not introduce any security implications. 2805 This draft does not change any underlying security issues inherent in 2806 [I-D.ietf-netmod-routing-cfg]. 2808 8. IANA Considerations 2810 TBD 2812 9. Acknowledgements 2814 The authors would like to thank Steve Baillargeon, Guo Feng, Hu 2815 Fangwei, Robert Kebler, Tanmoy Kundu, Liu Yisong, Mahesh Sivakumar, 2816 and Stig Venaas for their valuable contributions. 2818 10. References 2820 10.1. Normative References 2822 [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate 2823 Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/ 2824 RFC2119, March 1997, 2825 . 2827 [RFC6020] Bjorklund, M., Ed., "YANG - A Data Modeling Language for 2828 the Network Configuration Protocol (NETCONF)", RFC 6020, 2829 DOI 10.17487/RFC6020, October 2010, 2830 . 2832 [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., 2833 and A. Bierman, Ed., "Network Configuration Protocol 2834 (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, 2835 . 2837 [I-D.ietf-netmod-rfc6087bis] 2838 Bierman, A., "Guidelines for Authors and Reviewers of YANG 2839 Data Model Documents", draft-ietf-netmod-rfc6087bis-04 2840 (work in progress), July 2015. 2842 10.2. Informative References 2844 [RFC3569] Bhattacharyya, S., Ed., "An Overview of Source-Specific 2845 Multicast (SSM)", RFC 3569, DOI 10.17487/RFC3569, July 2846 2003, . 2848 [RFC3973] Adams, A., Nicholas, J., and W. Siadak, "Protocol 2849 Independent Multicast - Dense Mode (PIM-DM): Protocol 2850 Specification (Revised)", RFC 3973, DOI 10.17487/RFC3973, 2851 January 2005, . 2853 [RFC4601] Fenner, B., Handley, M., Holbrook, H., and I. Kouvelas, 2854 "Protocol Independent Multicast - Sparse Mode (PIM-SM): 2855 Protocol Specification (Revised)", RFC 4601, DOI 10.17487/ 2856 RFC4601, August 2006, 2857 . 2859 [RFC4610] Farinacci, D. and Y. Cai, "Anycast-RP Using Protocol 2860 Independent Multicast (PIM)", RFC 4610, DOI 10.17487/ 2861 RFC4610, August 2006, 2862 . 2864 [RFC5015] Handley, M., Kouvelas, I., Speakman, T., and L. Vicisano, 2865 "Bidirectional Protocol Independent Multicast (BIDIR- 2866 PIM)", RFC 5015, DOI 10.17487/RFC5015, October 2007, 2867 . 2869 [RFC5059] Bhaskar, N., Gall, A., Lingard, J., and S. Venaas, 2870 "Bootstrap Router (BSR) Mechanism for Protocol Independent 2871 Multicast (PIM)", RFC 5059, DOI 10.17487/RFC5059, January 2872 2008, . 2874 [RFC6087] Bierman, A., "Guidelines for Authors and Reviewers of YANG 2875 Data Model Documents", RFC 6087, DOI 10.17487/RFC6087, 2876 January 2011, . 2878 [I-D.ietf-netmod-routing-cfg] 2879 Lhotka, L. and A. Lindem, "A YANG Data Model for Routing 2880 Management", draft-ietf-netmod-routing-cfg-20 (work in 2881 progress), October 2015. 2883 Authors' Addresses 2885 Liu Xufeng 2886 Ericsson 2887 1595 Spring Hill Road, Suite 500 2888 Vienna VA 22182 2889 USA 2891 EMail: xufeng.liu@ericsson.com 2892 Pete McAllister 2893 Metaswitch Networks 2894 100 Church Street 2895 Enfield EN2 6BQ 2896 UK 2898 EMail: pete.mcallister@metaswitch.com 2900 Anish Peter 2901 Juniper Networks 2902 Electra, Exora Business Park 2903 Bangalore, KA 560103 2904 India 2906 EMail: anishp@juniper.net