--- /dev/null
+module frr-pim-rp {
+ yang-version "1.1";
+ namespace "http://frrouting.org/yang/pim-rp";
+
+ prefix frr-pim-rp;
+
+ import ietf-inet-types {
+ prefix "inet";
+ }
+
+ import ietf-routing-types {
+ prefix "rt-types";
+ }
+
+ import frr-routing {
+ prefix "frr-rt";
+ }
+
+ import frr-pim {
+ prefix "frr-pim";
+ }
+
+ organization
+ "Free Range Routing";
+
+ contact
+ "FRR Users List: <mailto:frog@lists.frrouting.org>
+ FRR Development List: <mailto:dev@lists.frrouting.org>";
+
+ description
+ "The module defines a collection of YANG definitions common for
+ all PIM (Protocol Independent Multicast) RP (Rendezvous Point) model.";
+
+ revision 2017-03-09 {
+ description
+ "Initial revision.";
+ reference
+ "RFC XXXX: A YANG Data Model for PIM RP";
+ }
+
+ typedef ipv4-multicast-group-address-prefix {
+ type inet:ipv4-prefix{
+ pattern '(2((2[4-9])|(3[0-9]))\.)(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(/(([4-9])|([1-2][0-9])|(3[0-2])))';
+ }
+ description
+ "This type represents an IPv4 multicast group prefix,
+ which is in the range from 224.0.0.0 to 239.255.255.255.";
+ }
+
+ typedef ipv6-multicast-group-address-prefix {
+ type inet:ipv6-prefix {
+ pattern
+ '(((FF|ff)[0-9a-fA-F]{2}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/((1[6-9])|([2-9][0-9])|(1[0-1][0-9])|(12[0-8])))';
+ pattern
+ '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(/.+)';
+ }
+ description
+ "This type represents an IPv6 multicast group prefix,
+ which is in the range of FF00::/8.";
+ }
+
+ typedef ip-multicast-group-address-prefix {
+ description "The IP-Multicast-Group-Address-Prefix type represents an IP multicast address
+ prefix and is IP version neutral. The format of the textual representations implies the IP
+ version. It includes a prefix-length, separated by a '/' sign.";
+ type union {
+ type ipv4-multicast-group-address-prefix;
+ type ipv6-multicast-group-address-prefix;
+ }
+ } // typedef ip-multicast-group-address-prefix
+
+ typedef plist-ref {
+ type string;
+ }
+
+ /*
+ * Groupings
+ */
+ grouping static-rp-container {
+ description
+ "Grouping of static RP container.";
+
+ container static-rp {
+ description
+ "Containing static RP attributes.";
+
+ list rp-list {
+ key "rp-address";
+ description
+ "A list of RP addresses.";
+
+ leaf rp-address {
+ type inet:ip-address;
+ description
+ "Specifies a static RP address.";
+ }
+
+ choice group-list-or-prefix-list {
+ description "Use group-list or prefix-list";
+ case group-list {
+ leaf-list group-list{
+ type ip-multicast-group-address-prefix;
+ description
+ "List of multicast group address.";
+ }
+ }
+ case prefix-list {
+ leaf prefix-list {
+ type plist-ref;
+ description
+ "Group prefix-list filter";
+ }
+ }
+ }
+ }
+ } // static-rp
+ } // static-rp-container
+
+ /*
+ * Configuration data nodes
+ */
+ augment "/frr-rt:routing/frr-rt:control-plane-protocols/"
+ + "frr-rt:control-plane-protocol/frr-pim:pim/"
+ + "frr-pim:address-family" {
+ description "PIM RP augmentation.";
+
+ container rp {
+ description
+ "PIM RP configuration data.";
+ uses static-rp-container;
+ } // rp
+ } // augment
+}
--- /dev/null
+module frr-pim {
+ yang-version "1.1";
+ namespace "http://frrouting.org/yang/pim";
+
+ prefix frr-pim;
+
+ import frr-interface {
+ prefix frr-interface;
+ }
+
+ import frr-routing {
+ prefix "frr-rt";
+ }
+
+ import ietf-routing-types {
+ prefix "rt-types";
+ }
+
+ import ietf-inet-types {
+ prefix "inet";
+ }
+
+ organization
+ "Free Range Routing";
+
+ contact
+ "FRR Users List: <mailto:frog@lists.frrouting.org>
+ FRR Development List: <mailto:dev@lists.frrouting.org>";
+
+ description
+ "The module defines a collection of YANG definitions common for
+ PIM (Protocol Independent Multicast) model.";
+
+ revision 2017-03-09 {
+ description
+ "Initial revision.";
+ reference
+ "RFC XXXX: A YANG Data Model for PIM";
+ }
+
+ identity pimd {
+ base frr-rt:routing-protocol;
+ description
+ "'Pim' routing pseudo-protocol.";
+ }
+
+ typedef plist-ref {
+ type string;
+ }
+
+ /*
+ * Groupings
+ */
+
+ grouping global-pim-config-attributes {
+ description
+ "A grouping defining pim global attributes.";
+
+ leaf ecmp {
+ type empty;
+ description
+ "Enable PIM ECMP.";
+ }
+
+ leaf ecmp-rebalance {
+ type empty;
+ description
+ "Enable PIM ECMP Rebalance.";
+ }
+
+ leaf join-prune-interval {
+ type uint16 {
+ range "60..600";
+ }
+ default "60";
+ description
+ "Join Prune Send Interval in seconds.";
+ }
+
+ leaf keep-alive-timer {
+ type uint16 {
+ range "31..60000";
+ }
+ default "210";
+ description
+ "Keep alive Timer in seconds.";
+ }
+
+ leaf rp-keep-alive-timer {
+ type uint16 {
+ range "31..60000";
+ }
+ default "210";
+ description
+ "RP keep alive Timer in seconds.";
+ }
+
+ leaf packets {
+ type uint8 {
+ range "1..100";
+ }
+ default "3";
+ description
+ "Number of packets to process at one time per fd.";
+ }
+
+ leaf register-suppress-time {
+ type uint16 {
+ range "5..60000";
+ }
+ default "60";
+ description
+ "Register Suppress Timer.";
+ }
+ }
+
+ grouping per-af-global-pim-config-attributes {
+ description
+ "A grouping defining per address family pim global attributes";
+
+ leaf send-v6-secondary {
+ when "../frr-pim:address-family = 'frr-rt:ipv4'" {
+ description
+ "Only applicable to IPv4 address family.";
+ }
+ type empty;
+ description
+ "Send v6 secondary addresses.";
+ }
+
+ container spt-switchover {
+ description
+ "SPT-Switchover.";
+
+ leaf spt-action {
+ type enumeration {
+ enum "PIM_SPT_IMMEDIATE" {
+ value 0;
+ description
+ "Immediate switch to SPT Tree.";
+ }
+ enum "PIM_SPT_INFINITY" {
+ value 1;
+ description
+ "Never switch to SPT Tree.";
+ }
+ }
+ default "PIM_SPT_IMMEDIATE";
+ description
+ "SPT-Switchover action";
+ }
+
+ leaf spt-infinity-prefix-list {
+ when "../spt-action = 'PIM_SPT_INFINITY'" {
+ description
+ "This leaf is only valid when the spt action
+ is PIM_SPT_INFINITY.";
+ }
+ type plist-ref;
+ description
+ "Prefix-List to control which groups to switch.";
+ }
+ }
+
+ leaf ssm-prefix-list {
+ type plist-ref;
+ description
+ "Prefix-list used to define Source-Specific Multicast address range.";
+ }
+
+ leaf-list ssm-pingd-source-ip {
+ type inet:ip-address;
+ description
+ "Enable ssmpingd operation.";
+ }
+
+ container msdp-mesh-group {
+ presence
+ "Configure MSDP mesh-group.";
+
+ leaf mesh-group-name {
+ type string;
+ description
+ "MSDP mesh group name.";
+ }
+
+ leaf-list member-ip {
+ type inet:ip-address;
+ description
+ "Peer ip address.";
+ }
+
+ leaf source-ip {
+ type inet:ip-address;
+ description
+ "Source ip address for the TCP connection.";
+ }
+ }
+
+ list msdp-peer {
+ key "peer-ip";
+ description
+ "Configure MSDP peer.";
+
+ leaf peer-ip {
+ type inet:ip-address;
+ description
+ "MSDP peer IP address.";
+ }
+
+ leaf source-ip {
+ type inet:ip-address;
+ description
+ "MSDP source IP address.";
+ }
+ }
+
+ container mlag {
+ description
+ "Multi-chassis link aggregation.";
+
+ leaf peerlink-rif {
+ type frr-interface:interface-ref;
+ description
+ "Outgoing interface name.";
+ }
+
+ leaf reg-address {
+ type inet:ip-address;
+ description
+ "reg address.";
+ }
+
+ leaf my-role {
+ type enumeration {
+ enum "MLAG_ROLE_NONE" {
+ value 0;
+ description
+ "MLAG role none.";
+ }
+ enum "MLAG_ROLE_PRIMARY" {
+ value 1;
+ description
+ "MLAG role primary.";
+ }
+
+ enum "MLAG_ROLE_SECONDARY" {
+ value 2;
+ description
+ "MLAG role secondary.";
+ }
+ }
+ default "MLAG_ROLE_NONE";
+ description
+ "Mlag role.";
+ }
+
+ leaf peer-state {
+ type boolean;
+ default "false";
+ description
+ "Peer state";
+ }
+ }
+
+ leaf register-accept-list {
+ type plist-ref;
+ description
+ "Only accept registers from a specific source prefix list.";
+ }
+ } // per-af-global-pim-config-attributes
+
+ grouping interface-pim-config-attributes {
+ description
+ "A grouping defining pim interface attributes.";
+
+ leaf pim-enable {
+ type empty;
+ description
+ "Enable PIM flag on the interface.";
+ }
+
+ leaf dr-priority {
+ type uint32 {
+ range "1..4294967295";
+ }
+ default 1;
+ description
+ "DR (Designated Router) priority";
+ }
+
+ leaf hello-interval {
+ type uint16 {
+ range "1..180";
+ }
+ default "30";
+ description
+ "Hello interval";
+ }
+
+ leaf hello-holdtime {
+ type uint16 {
+ range "1..180";
+ }
+ description
+ "Hello holdtime";
+ }
+
+ container bfd {
+ presence
+ "Enable BFD support on the interface.";
+
+ leaf min-rx-interval {
+ type uint16 {
+ range "50..60000";
+ }
+ default "300";
+ description
+ "Required min receive interval";
+ }
+
+ leaf min-tx-interval {
+ type uint16 {
+ range "50..60000";
+ }
+ default "300";
+ description
+ "Desired min transmit interval";
+ }
+
+ leaf detect_mult {
+ type uint8 {
+ range "2..255";
+ }
+ default "3";
+ description
+ "Detect Multiplier";
+ }
+ }
+
+ leaf bsm {
+ type empty;
+ description
+ "Enables BSM support on the interface.";
+ }
+
+ leaf unicast-bsm {
+ type empty;
+ description
+ "Accept/Send unicast BSM on the interface.";
+ }
+
+ leaf active-active {
+ type empty;
+ description
+ "Mark interface as Active-Active for MLAG operations.";
+ }
+ } // interface-pim-config-attributes
+
+ grouping per-af-interface-pim-config-attributes {
+ description
+ "A grouping defining pim interface attributes per address family.";
+
+ leaf use-source {
+ type inet:ip-address;
+ description
+ "Primary address of the interface set by user.";
+ }
+
+ leaf multicast-boundary-oil {
+ type plist-ref;
+ description
+ "Prefix-List to define multicast boundary";
+ }
+
+ list mroute {
+ key "source-addr group-addr";
+ description
+ "Add multicast route.";
+
+ leaf oif {
+ type frr-interface:interface-ref;
+ description
+ "Outgoing interface name.";
+ }
+
+ leaf source-addr {
+ type inet:ip-address;
+ description
+ "Multicast source address.";
+ }
+
+ leaf group-addr {
+ type rt-types:ip-multicast-group-address;
+ description
+ "Multicast group address.";
+ }
+ }
+ } // per-af-interface-pim-config-attributes
+
+ /*
+ * Global Configuration data nodes
+ */
+ augment "/frr-rt:routing/frr-rt:control-plane-protocols/"
+ + "frr-rt:control-plane-protocol" {
+ container pim {
+ when "../frr-rt:type = 'frr-pim:pimd'" {
+ description
+ "This container is only valid for the 'pim' routing
+ protocol.";
+ }
+ description
+ "PIM configuration data.";
+
+ uses global-pim-config-attributes;
+
+ list address-family {
+ key "address-family";
+ description
+ "Each list entry for one address family.";
+ uses frr-rt:address-family;
+ uses per-af-global-pim-config-attributes;
+
+ } //address-family
+ } // pim
+ } // augment
+
+ /*
+ * Per-interface configuration data
+ */
+ augment "/frr-interface:lib/frr-interface:interface" {
+ container pim {
+ description
+ "PIM interface parameters.";
+ uses interface-pim-config-attributes;
+ list address-family {
+ key "address-family";
+ description
+ "Each list entry for one address family.";
+ uses frr-rt:address-family;
+ uses per-af-interface-pim-config-attributes;
+ }
+ }
+ }
+}
+