From 50c70f74a33bc874688fa16e237dc8ef9e5efd9c Mon Sep 17 00:00:00 2001 From: Brandon Ewing Date: Tue, 5 May 2026 11:13:06 -0500 Subject: [PATCH] Add multicast-focused AFTs --- .../aft/openconfig-aft-ipv4-multicast.yang | 111 ++++++++++++++ .../aft/openconfig-aft-ipv6-multicast.yang | 111 ++++++++++++++ .../aft/openconfig-aft-mpls-multicast.yang | 143 ++++++++++++++++++ .../aft/openconfig-aft-network-instance.yang | 42 ++++- release/models/aft/openconfig-aft.yang | 80 +++++++++- 5 files changed, 485 insertions(+), 2 deletions(-) create mode 100644 release/models/aft/openconfig-aft-ipv4-multicast.yang create mode 100644 release/models/aft/openconfig-aft-ipv6-multicast.yang create mode 100644 release/models/aft/openconfig-aft-mpls-multicast.yang diff --git a/release/models/aft/openconfig-aft-ipv4-multicast.yang b/release/models/aft/openconfig-aft-ipv4-multicast.yang new file mode 100644 index 0000000000..91f43de4a7 --- /dev/null +++ b/release/models/aft/openconfig-aft-ipv4-multicast.yang @@ -0,0 +1,111 @@ +submodule openconfig-aft-ipv4-multicast { + belongs-to "openconfig-aft" { + prefix "oc-aft"; + } + + import openconfig-extensions { prefix "oc-ext"; } + import openconfig-inet-types { prefix "oc-inet"; } + import openconfig-yang-types { prefix "oc-yang"; } + + // Include common cross-AFT groupings from the common submodule. + include openconfig-aft-common; + + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "Submodule containing definitions of groupings for the abstract + forwarding table for IPv4 multicast."; + + oc-ext:openconfig-version "0.1.0"; + + revision "2026-05-05" { + description + "Initial revision of the IPv4 multicast abstract forwarding table."; + reference "0.1.0"; + } + + grouping aft-ipv4-multicast-structural { + description + "Structural grouping defining the schema for the IPv4 multicast + abstract forwarding table."; + + list ipv4-multicast-entry { + key "source-address group-address"; + + oc-ext:telemetry-atomic; + description + "List of the IPv4 multicast entries within the abstract + forwarding table. Each entry is keyed by the (source, group) + pair. The source-address 0.0.0.0 represents any-source (*,G) + entries used for shared-tree and BiDir RP forwarding."; + + leaf source-address { + type leafref { + path "../state/source-address"; + } + description + "Reference to the IPv4 source address. Use 0.0.0.0 for + any-source (*,G) entries."; + } + + leaf group-address { + type leafref { + path "../state/group-address"; + } + description + "Reference to the IPv4 multicast group address."; + } + + container state { + config false; + description + "Operational state parameters for the IPv4 multicast AFT + entry."; + uses aft-ipv4-multicast-entry-state; + } + + } + } + + grouping aft-ipv4-multicast-entry-state { + description + "Operational state parameters for the IPv4 multicast entry."; + + leaf source-address { + type oc-inet:ipv4-address; + description + "The IPv4 source address for this multicast entry. The value + 0.0.0.0 represents any-source (*,G) entries."; + } + + leaf group-address { + type oc-inet:ipv4-address; + description + "The IPv4 multicast group address for this entry."; + } + + uses aft-common-entry-state; + uses aft-common-ip-state; + + leaf rpf-discards { + type oc-yang:counter64; + description + "The number of packets discarded because the arrival interface + did not match the reverse-path interface programmed for this + entry."; + } + + leaf reverse-path-neighbor { + type oc-inet:ipv4-address; + description + "The IP address of the upstream neighbor used as the + reverse-path next-hop for this multicast entry. For + directly-connected sources this leaf may be absent."; + } + } +} diff --git a/release/models/aft/openconfig-aft-ipv6-multicast.yang b/release/models/aft/openconfig-aft-ipv6-multicast.yang new file mode 100644 index 0000000000..324e63ba72 --- /dev/null +++ b/release/models/aft/openconfig-aft-ipv6-multicast.yang @@ -0,0 +1,111 @@ +submodule openconfig-aft-ipv6-multicast { + belongs-to "openconfig-aft" { + prefix "oc-aft"; + } + + import openconfig-extensions { prefix "oc-ext"; } + import openconfig-inet-types { prefix "oc-inet"; } + import openconfig-yang-types { prefix "oc-yang"; } + + // Include common cross-AFT groupings from the common submodule. + include openconfig-aft-common; + + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "Submodule containing definitions of groupings for the abstract + forwarding table for IPv6 multicast."; + + oc-ext:openconfig-version "0.1.0"; + + revision "2026-05-05" { + description + "Initial revision of the IPv6 multicast abstract forwarding table."; + reference "0.1.0"; + } + + grouping aft-ipv6-multicast-structural { + description + "Structural grouping defining the schema for the IPv6 multicast + abstract forwarding table."; + + list ipv6-multicast-entry { + key "source-address group-address"; + + oc-ext:telemetry-atomic; + description + "List of the IPv6 multicast entries within the abstract + forwarding table. Each entry is keyed by the (source, group) + pair. The source-address :: represents any-source (*,G) + entries used for shared-tree and BiDir RP forwarding."; + + leaf source-address { + type leafref { + path "../state/source-address"; + } + description + "Reference to the IPv6 source address. Use :: for + any-source (*,G) entries."; + } + + leaf group-address { + type leafref { + path "../state/group-address"; + } + description + "Reference to the IPv6 multicast group address."; + } + + container state { + config false; + description + "Operational state parameters for the IPv6 multicast AFT + entry."; + uses aft-ipv6-multicast-entry-state; + } + + } + } + + grouping aft-ipv6-multicast-entry-state { + description + "Operational state parameters for the IPv6 multicast entry."; + + leaf source-address { + type oc-inet:ipv6-address; + description + "The IPv6 source address for this multicast entry. The value + :: represents any-source (*,G) entries."; + } + + leaf group-address { + type oc-inet:ipv6-address; + description + "The IPv6 multicast group address for this entry."; + } + + uses aft-common-entry-state; + uses aft-common-ip-state; + + leaf rpf-discards { + type oc-yang:counter64; + description + "The number of packets discarded because the arrival interface + did not match the reverse-path interface programmed for this + entry."; + } + + leaf reverse-path-neighbor { + type oc-inet:ipv6-address; + description + "The IPv6 address of the upstream neighbor used as the + reverse-path next-hop for this multicast entry. For + directly-connected sources this leaf may be absent."; + } + } +} diff --git a/release/models/aft/openconfig-aft-mpls-multicast.yang b/release/models/aft/openconfig-aft-mpls-multicast.yang new file mode 100644 index 0000000000..e3ef246d60 --- /dev/null +++ b/release/models/aft/openconfig-aft-mpls-multicast.yang @@ -0,0 +1,143 @@ +submodule openconfig-aft-mpls-multicast { + belongs-to "openconfig-aft" { + prefix "oc-aft"; + } + + import openconfig-extensions { prefix "oc-ext"; } + import openconfig-mpls-types { prefix "oc-mplst"; } + + // Include common cross-AFT groupings from the common submodule. + include openconfig-aft-common; + + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "Submodule containing definitions of groupings for the abstract + forwarding table for MPLS multicast (P2MP) label forwarding. + + This AFT type represents the forwarding state of MPLS P2MP transit + nodes, such as those running mLDP or RSVP-TE P2MP. At these nodes, + packets arrive with a specific incoming MPLS label and are replicated + to one or more outgoing interfaces, each potentially with a different + label stack. There is no IP-layer (source, group) state at transit + nodes; that state is captured in the ipv4-multicast and + ipv6-multicast AFT types at PE nodes."; + + oc-ext:openconfig-version "0.1.0"; + + revision "2026-05-05" { + description + "Initial revision of the MPLS multicast abstract forwarding table."; + reference "0.1.0"; + } + + grouping aft-mpls-multicast-structural { + description + "Structural grouping defining the schema for the MPLS multicast + abstract forwarding table."; + + list multicast-label-entry { + key "label"; + + oc-ext:telemetry-atomic; + description + "List of the MPLS multicast entries within the abstract + forwarding table. This list is keyed by the top-most incoming + MPLS label matched on the ingress packet."; + + leaf label { + type leafref { + path "../state/label"; + } + description + "Reference to the top-most MPLS label matched by the + entry."; + } + + container state { + config false; + description + "Operational state parameters for the MPLS multicast AFT + entry."; + uses aft-mpls-multicast-entry-state; + } + + uses aft-mpls-multicast-entry-label-state; + } + } + + grouping aft-mpls-multicast-entry-state { + description + "Operational state parameters for the MPLS multicast entry."; + + leaf label { + type oc-mplst:mpls-label; + description + "The top-most MPLS label that is matched on the ingress packet + to select this forwarding entry."; + } + + uses aft-common-entry-state; + uses aft-common-install-protocol; + } + + grouping aft-mpls-multicast-entry-label-state { + description + "Parameters relating to the MPLS label stack for a multicast + forwarding entry."; + + container decap-mpls-label-stacks { + description + "Surrounding container for the set of labels to be decapsulated + from the incoming packet before replication."; + + list decap-mpls-label-stack { + ordered-by user; + description + "The MPLS label stack to be popped from the ingress packet + before replication. The stack is encoded as an ordered list + such that the first entry is the label that is outer-most + (i.e., furthest from the bottom of the stack). This encoding + supports duplicate label values. + + A swap operation is reflected by entries in this + decap-mpls-label-stack and the encap-mpls-label-stack on + the associated next-hops."; + + key "id"; + + leaf id { + type leafref { + path "../state/id"; + } + description + "Reference to the list key."; + } + + container state { + config false; + description + "Operational state parameters for the decapsulated label + entry."; + + leaf id { + type uint8; + description + "Index identifying this label within the stack."; + } + + leaf label { + type oc-mplst:mpls-label; + description + "MPLS label value."; + } + } + } + } + } +} diff --git a/release/models/aft/openconfig-aft-network-instance.yang b/release/models/aft/openconfig-aft-network-instance.yang index 8ac495dcbc..fa5cdb09b3 100644 --- a/release/models/aft/openconfig-aft-network-instance.yang +++ b/release/models/aft/openconfig-aft-network-instance.yang @@ -19,7 +19,14 @@ module openconfig-aft-network-instance { when building the OpenConfig network instance model to add per-NI AFTs."; - oc-ext:openconfig-version "0.3.1"; + oc-ext:openconfig-version "0.4.0"; + + revision "2026-04-02" { + description + "Add next-hop-group augmentations for IPv4, IPv6, and MPLS + multicast AFT entry types."; + reference "0.4.0"; + } revision "2023-04-25" { description @@ -179,4 +186,37 @@ module openconfig-aft-network-instance { uses aft-entry-nexthop-group-state; } + + augment "/oc-ni:network-instances/oc-ni:network-instance/" + + "oc-ni:afts/oc-ni:ipv4-multicast/oc-ni:ipv4-multicast-entry/" + + "oc-ni:state" { + description + "Add leaves that require referencing of a network instance to the + operational state parameters of an entry within the IPv4 multicast + AFT."; + + uses aft-entry-nexthop-group-state; + } + + augment "/oc-ni:network-instances/oc-ni:network-instance/" + + "oc-ni:afts/oc-ni:ipv6-multicast/oc-ni:ipv6-multicast-entry/" + + "oc-ni:state" { + description + "Add leaves that require referencing of a network instance to the + operational state parameters of an entry within the IPv6 multicast + AFT."; + + uses aft-entry-nexthop-group-state; + } + + augment "/oc-ni:network-instances/oc-ni:network-instance/" + + "oc-ni:afts/oc-ni:mpls-multicast/oc-ni:multicast-label-entry/" + + "oc-ni:state" { + description + "Add leaves that require referencing of a network instance to the + operational state parameters of an entry within the MPLS multicast + AFT."; + + uses aft-entry-nexthop-group-state; + } } diff --git a/release/models/aft/openconfig-aft.yang b/release/models/aft/openconfig-aft.yang index 7595d72a67..1cbe157c69 100644 --- a/release/models/aft/openconfig-aft.yang +++ b/release/models/aft/openconfig-aft.yang @@ -22,6 +22,12 @@ module openconfig-aft { include openconfig-aft-common; // Include the state synced submodule. include openconfig-aft-state-synced; + // Include the IPv4 multicast AFT submodule. + include openconfig-aft-ipv4-multicast; + // Include the IPv6 multicast AFT submodule. + include openconfig-aft-ipv6-multicast; + // Include the MPLS multicast AFT submodule. + include openconfig-aft-mpls-multicast; organization "OpenConfig working group"; @@ -42,7 +48,17 @@ module openconfig-aft { is referred to as an Abstract Forwarding Table (AFT), rather than the FIB."; - oc-ext:openconfig-version "3.4.0"; + oc-ext:openconfig-version "3.5.0"; + + revision "2026-05-05" { + description + "Add ipv4-multicast, ipv6-multicast, and mpls-multicast AFT types + for representing the active multicast forwarding table. Supports + native IP multicast (PIM-SM/DM/SSM/BiDir, DVMRP), MPLS P2MP + ingress/egress PE (mLDP, RSVP-TE P2MP), and MPLS P2MP transit + nodes."; + reference "3.5.0"; + } revision "2026-03-10" { description @@ -277,6 +293,68 @@ module openconfig-aft { uses aft-ipv6-unicast-structural; } + container ipv4-multicast { + config false; + description + "The abstract forwarding table for IPv4 multicast. Entries + within this table are keyed by the (source, group) pair + matched by ingress packets. The source address 0.0.0.0 + represents any-source (*,G) entries. + + This table captures multicast forwarding state installed by + any protocol (PIM-SM, PIM-DM, PIM-SSM, PIM-BiDir, DVMRP, + BGP MVPN, static) and represents the active replication + state including the upstream reverse-path interface and the + list of outgoing interfaces. For MPLS P2MP ingress and + egress PE nodes, outgoing interfaces may carry MPLS label + stacks or indicate MPLS decapsulation respectively. + + MPLS P2MP transit node state, which has no IP-layer (S,G) + knowledge, is represented in the mpls-multicast table."; + + uses aft-ipv4-multicast-structural; + } + + container ipv6-multicast { + config false; + description + "The abstract forwarding table for IPv6 multicast. Entries + within this table are keyed by the (source, group) pair + matched by ingress packets. The source address :: + represents any-source (*,G) entries. + + This table captures multicast forwarding state installed by + any protocol (PIM-SM, PIM-DM, PIM-SSM, PIM-BiDir, BGP MVPN, + static) and represents the active replication state + including the upstream reverse-path interface and the list + of outgoing interfaces. For MPLS P2MP ingress and egress PE + nodes, outgoing interfaces may carry MPLS label stacks or + indicate MPLS decapsulation respectively. + + MPLS P2MP transit node state is represented in the + mpls-multicast table."; + + uses aft-ipv6-multicast-structural; + } + + container mpls-multicast { + config false; + description + "The abstract forwarding table for MPLS multicast (P2MP) + label forwarding. Entries within this table are keyed by + the top-most incoming MPLS label. + + This table represents the forwarding state of MPLS P2MP + transit nodes such as those running mLDP or RSVP-TE P2MP, + where packets arrive with a specific label and are + replicated to one or more outgoing interfaces each + potentially with a different label stack. IP-layer (S,G) + state at PE nodes is captured in the ipv4-multicast and + ipv6-multicast tables."; + + uses aft-mpls-multicast-structural; + } + container policy-forwarding { config false; description