From 62c76339c224896e13d2996b96ac06bfb8cb4563 Mon Sep 17 00:00:00 2001 From: vdhingra Date: Tue, 3 Dec 2019 06:00:51 -0800 Subject: [PATCH] staticd: yang defination Yang files for staticd to use northbound APIs Signed-off-by: vishaldhingra vdhingra@vmware.com Santosh P K sapk@vmware.com --- lib/subdir.am | 7 + yang/frr-staticd.yang | 224 ++++++++ ...-deviations-ietf-ipv4-unicast-routing.yang | 184 +++++++ ...-deviations-ietf-ipv6-unicast-routing.yang | 184 +++++++ .../frr-deviations-ietf-rib-extension.yang | 125 +++++ yang/ietf/ietf-ipv4-unicast-routing.yang | 388 ++++++++++++++ .../ietf/ietf-ipv6-router-advertisements.yang | 501 ++++++++++++++++++ yang/ietf/ietf-ipv6-unicast-routing.yang | 401 ++++++++++++++ yang/ietf/ietf-rib-extension.yang | 354 +++++++++++++ yang/subdir.am | 8 + 10 files changed, 2376 insertions(+) create mode 100644 yang/frr-staticd.yang create mode 100644 yang/ietf/frr-deviations-ietf-ipv4-unicast-routing.yang create mode 100644 yang/ietf/frr-deviations-ietf-ipv6-unicast-routing.yang create mode 100644 yang/ietf/frr-deviations-ietf-rib-extension.yang create mode 100644 yang/ietf/ietf-ipv4-unicast-routing.yang create mode 100644 yang/ietf/ietf-ipv6-router-advertisements.yang create mode 100644 yang/ietf/ietf-ipv6-unicast-routing.yang create mode 100644 yang/ietf/ietf-rib-extension.yang diff --git a/lib/subdir.am b/lib/subdir.am index 23b1950384ac..8808d33bc7d5 100644 --- a/lib/subdir.am +++ b/lib/subdir.am @@ -104,8 +104,15 @@ lib_libfrr_la_SOURCES = \ nodist_lib_libfrr_la_SOURCES = \ yang/frr-interface.yang.c \ yang/frr-route-types.yang.c \ + yang/frr-staticd.yang.c \ yang/ietf/ietf-routing-types.yang.c \ yang/frr-module-translator.yang.c \ + yang/ietf/ietf-ipv4-unicast-routing.yang.c \ + yang/ietf/ietf-ipv6-unicast-routing.yang.c \ + yang/ietf/ietf-rib-extension.yang.c \ + yang/ietf/frr-deviations-ietf-rib-extension.yang.c \ + yang/ietf/frr-deviations-ietf-ipv4-unicast-routing.yang.c \ + yang/ietf/frr-deviations-ietf-ipv6-unicast-routing.yang.c \ # end vtysh_scan += \ diff --git a/yang/frr-staticd.yang b/yang/frr-staticd.yang new file mode 100644 index 000000000000..123c20837a15 --- /dev/null +++ b/yang/frr-staticd.yang @@ -0,0 +1,224 @@ +module frr-staticd { + yang-version "1.1"; + namespace "http://frrouting.org/yang/staticd"; + + prefix frr-staticd; + + import ietf-routing-types { + prefix "ietf-rt-types"; + } + + import ietf-routing { + prefix "ietf-rt"; + } + + import ietf-inet-types { + prefix "ietf-inet"; + } + + import ietf-ipv4-unicast-routing { + prefix "ietf-v4ur"; + } + + import ietf-ipv6-unicast-routing { + prefix "ietf-v6ur"; + } + + import frr-vrf { + prefix "frr-vrf"; + } + + import frr-interface { + prefix "frr-interface"; + } + + organization + "Free Range Routing"; + + contact + "FRR Users List: + FRR Development List: "; + + description + "This module defines a model for managing FRR staticd information. + This YANG module augments the ietf-routing with additional + nexthop information"; + + revision 2019-12-03 { + description + "Initial revision."; + } + + grouping nexthop-common-attributes { + leaf table-id { + type uint32 { + range "1..4294967295"; + } + description + "Routing table id to retrieve."; + } + leaf distance { + type uint8 { + range "1..255"; + } + description + "Admin distance based on routing protocol."; + } + leaf mpls-label { + type ietf-rt-types:mpls-label; + description + "Nexthop's MPLS label stack."; + } + leaf nexthop-vrf { + type string { + length "1..16"; + } + description + "The nexthop vrf name, if different from the route."; + } + } + + grouping frr-staticd-ipv4-nexthop { + + choice next-hop-type { + case gateway { + leaf next-hop-address { + type ietf-inet:ipv4-address; + description + "IPv4 address of the next hop."; + } + leaf gw-interface { + type frr-interface:interface-ref; + description + "Name of the outgoing interface."; + } + leaf onlink { + type boolean; + default false; + description + "Nexthop is directly connected."; + } + } + case ifname { + leaf outgoing-interface { + type frr-interface:interface-ref; + description + "Name of the outgoing interface."; + } + } + case Null0 { + leaf Null0 { + type boolean; + default false; + description + "Null interface"; + } + } + case reject { + leaf reject { + type boolean; + default false; + description + "Emit an ICMP unreachable when matched"; + } + } + case blackhole { + leaf blackhole { + type boolean; + default false; + description + "Silently discard pkts when matched"; + } + } + } + + uses nexthop-common-attributes; + + } + + + grouping frr-staticd-ipv6-nexthop { + + choice next-hop-type { + case gateway { + leaf next-hop-address { + type ietf-inet:ipv6-address; + description + "IPv6 address of the next hop."; + } + leaf gw-interface { + type string { + length "1..16"; + } + description + "Name of the outgoing interface."; + } + leaf onlink { + type boolean; + default false; + description + "Nexthop is directly connected."; + } + } + case ifname { + leaf outgoing-interface { + type string { + length "1..16"; + } + description + "Name of the outgoing interface."; + } + } + case Null0 { + leaf Null0 { + type boolean; + default false; + description + "Null interface"; + } + } + case reject { + leaf reject { + type boolean; + default false; + description + "Emit an ICMP unreachable when matched"; + } + } + case blackhole { + leaf blackhole { + type boolean; + default false; + description + "Silently discard pkts when matched"; + } + } + } + + uses nexthop-common-attributes; + + } + + + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes/ietf-v4ur:ipv4/" + + "ietf-v4ur:route/ietf-v4ur:next-hop/ietf-v4ur:next-hop-options/" + + "ietf-v4ur:next-hop-list/ietf-v4ur:next-hop-list/ietf-v4ur:next-hop" + { + description + "Augment static route configuration 'next-hop-list'."; + uses frr-staticd-ipv4-nexthop; + } + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes/ietf-v6ur:ipv6/" + + "ietf-v6ur:route/ietf-v6ur:next-hop/ietf-v6ur:next-hop-options/" + + "ietf-v6ur:next-hop-list/ietf-v6ur:next-hop-list/ietf-v6ur:next-hop" + { + description + "Augment static route configuration 'next-hop-list'."; + uses frr-staticd-ipv6-nexthop; + } +} diff --git a/yang/ietf/frr-deviations-ietf-ipv4-unicast-routing.yang b/yang/ietf/frr-deviations-ietf-ipv4-unicast-routing.yang new file mode 100644 index 000000000000..1e896ee1fa12 --- /dev/null +++ b/yang/ietf/frr-deviations-ietf-ipv4-unicast-routing.yang @@ -0,0 +1,184 @@ +module frr-deviations-ietf-ipv4-unicast-routing { + yang-version 1.1; + namespace "http://frrouting.org/yang/frr-deviations-ietf-ipv4-unicast-routing"; + prefix frr-deviations-ietf-ipv4-unicast-routing; + + import ietf-routing { + prefix ietf-rt; + } + + import frr-vrf { + prefix frr-vrf; + } + + import ietf-ipv4-unicast-routing { + prefix "ietf-v4ur"; + } + + organization + "Free Range Routing"; + + contact + "FRR Users List: + FRR Development List: "; + + description + "This module defines deviation statements for the ietf-routing + module."; + + revision 2019-12-03 { + description + "Initial revision."; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route" + + "/ietf-v4ur:destination-prefix" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route/" + + "ietf-rt:next-hop/ietf-rt:next-hop-options/ietf-rt:simple-next-hop" + + "/ietf-v4ur:next-hop-address" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route/" + + "ietf-rt:next-hop/ietf-rt:next-hop-options/ietf-rt:next-hop-list/" + + "ietf-rt:next-hop-list/ietf-rt:next-hop" + + "/ietf-v4ur:address"{ + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/ietf-rt:input" + + "/ietf-v4ur:destination-address" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route" + + "/ietf-v4ur:destination-prefix" { + deviate not-supported; + } + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route/ietf-rt:next-hop/ietf-rt:next-hop-options/" + + "ietf-rt:simple-next-hop" + + "/ietf-v4ur:next-hop-address" { + deviate not-supported; + } + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route/ietf-rt:next-hop/ietf-rt:next-hop-options/" + + "ietf-rt:next-hop-list/ietf-rt:next-hop-list/ietf-rt:next-hop" + + "/ietf-v4ur:next-hop-address" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v4ur:ipv4/ietf-v4ur:route/ietf-v4ur:description" { + deviate not-supported; + } + + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v4ur:ipv4/ietf-v4ur:route/ietf-v4ur:next-hop/" + + "ietf-v4ur:next-hop-options/ietf-v4ur:simple-next-hop/ietf-v4ur:next-hop-address" { + deviate not-supported; + } + + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v4ur:ipv4/ietf-v4ur:route/ietf-v4ur:next-hop/" + + "ietf-v4ur:next-hop-options/ietf-v4ur:simple-next-hop/ietf-v4ur:outgoing-interface" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v4ur:ipv4/ietf-v4ur:route/ietf-v4ur:next-hop/" + + "ietf-v4ur:next-hop-options/ietf-v4ur:simple-next-hop" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v4ur:ipv4/ietf-v4ur:route/ietf-v4ur:next-hop/" + + "ietf-v4ur:next-hop-options/ietf-v4ur:special-next-hop" { + deviate not-supported; + } + + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v4ur:ipv4/ietf-v4ur:route/ietf-v4ur:next-hop/" + + "ietf-v4ur:next-hop-options/ietf-v4ur:next-hop-list/" + + "ietf-v4ur:next-hop-list/ietf-v4ur:next-hop/ietf-v4ur:next-hop-address" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v4ur:ipv4/ietf-v4ur:route/ietf-v4ur:next-hop/" + + "ietf-v4ur:next-hop-options/ietf-v4ur:next-hop-list/" + + "ietf-v4ur:next-hop-list/ietf-v4ur:next-hop/ietf-v4ur:outgoing-interface" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route" + + "/ietf-v4ur:destination-prefix" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route/" + + "ietf-rt:next-hop/ietf-rt:next-hop-options/ietf-rt:simple-next-hop" + + "/ietf-v4ur:next-hop-address" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route/" + + "ietf-rt:next-hop/ietf-rt:next-hop-options/ietf-rt:next-hop-list/" + + "ietf-rt:next-hop-list/ietf-rt:next-hop" + + "/ietf-v4ur:address" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:input" + + "/ietf-v4ur:destination-address" { + deviate not-supported; + } + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route" + + "/ietf-v4ur:destination-prefix" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route/ietf-rt:next-hop/ietf-rt:next-hop-options/" + + "ietf-rt:simple-next-hop" + + "/ietf-v4ur:next-hop-address" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route/ietf-rt:next-hop/ietf-rt:next-hop-options/" + + "ietf-rt:next-hop-list/ietf-rt:next-hop-list/ietf-rt:next-hop" + + "/ietf-v4ur:next-hop-address" { + deviate not-supported; + } +} diff --git a/yang/ietf/frr-deviations-ietf-ipv6-unicast-routing.yang b/yang/ietf/frr-deviations-ietf-ipv6-unicast-routing.yang new file mode 100644 index 000000000000..8ec2903a8115 --- /dev/null +++ b/yang/ietf/frr-deviations-ietf-ipv6-unicast-routing.yang @@ -0,0 +1,184 @@ +module frr-deviations-ietf-ipv6-unicast-routing { + yang-version 1.1; + namespace "http://frrouting.org/yang/frr-deviations-ietf-ipv6-unicast-routing"; + prefix frr-deviations-ietf-ipv6-unicast-routing; + + import ietf-routing { + prefix ietf-rt; + } + + import frr-vrf { + prefix frr-vrf; + } + + import ietf-ipv6-unicast-routing { + prefix "ietf-v6ur"; + } + + organization + "Free Range Routing"; + + contact + "FRR Users List: + FRR Development List: "; + + description + "This module defines deviation statements for the ietf-routing + module."; + + revision 2019-12-03 { + description + "Initial revision."; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route" + + "/ietf-v6ur:destination-prefix" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route/" + + "ietf-rt:next-hop/ietf-rt:next-hop-options/ietf-rt:simple-next-hop" + + "/ietf-v6ur:next-hop-address" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route/" + + "ietf-rt:next-hop/ietf-rt:next-hop-options/ietf-rt:next-hop-list/" + + "ietf-rt:next-hop-list/ietf-rt:next-hop" + + "/ietf-v6ur:address"{ + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/ietf-rt:input" + + "/ietf-v6ur:destination-address" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route" + + "/ietf-v6ur:destination-prefix" { + deviate not-supported; + } + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route/ietf-rt:next-hop/ietf-rt:next-hop-options/" + + "ietf-rt:simple-next-hop" + + "/ietf-v6ur:next-hop-address" { + deviate not-supported; + } + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route/ietf-rt:next-hop/ietf-rt:next-hop-options/" + + "ietf-rt:next-hop-list/ietf-rt:next-hop-list/ietf-rt:next-hop" + + "/ietf-v6ur:next-hop-address" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v6ur:ipv6/ietf-v6ur:route/ietf-v6ur:description" { + deviate not-supported; + } + + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v6ur:ipv6/ietf-v6ur:route/ietf-v6ur:next-hop/" + + "ietf-v6ur:next-hop-options/ietf-v6ur:simple-next-hop/ietf-v6ur:next-hop-address" { + deviate not-supported; + } + + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v6ur:ipv6/ietf-v6ur:route/ietf-v6ur:next-hop/" + + "ietf-v6ur:next-hop-options/ietf-v6ur:simple-next-hop/ietf-v6ur:outgoing-interface" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v6ur:ipv6/ietf-v6ur:route/ietf-v6ur:next-hop/" + + "ietf-v6ur:next-hop-options/ietf-v6ur:simple-next-hop" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v6ur:ipv6/ietf-v6ur:route/ietf-v6ur:next-hop/" + + "ietf-v6ur:next-hop-options/ietf-v6ur:special-next-hop" { + deviate not-supported; + } + + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v6ur:ipv6/ietf-v6ur:route/ietf-v6ur:next-hop/" + + "ietf-v6ur:next-hop-options/ietf-v6ur:next-hop-list/" + + "ietf-v6ur:next-hop-list/ietf-v6ur:next-hop/ietf-v6ur:next-hop-address" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes" + + "/ietf-v6ur:ipv6/ietf-v6ur:route/ietf-v6ur:next-hop/" + + "ietf-v6ur:next-hop-options/ietf-v6ur:next-hop-list/" + + "ietf-v6ur:next-hop-list/ietf-v6ur:next-hop/ietf-v6ur:outgoing-interface" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route" + + "/ietf-v6ur:destination-prefix" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route/" + + "ietf-rt:next-hop/ietf-rt:next-hop-options/ietf-rt:simple-next-hop" + + "/ietf-v6ur:next-hop-address" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:routes/ietf-rt:route/" + + "ietf-rt:next-hop/ietf-rt:next-hop-options/ietf-rt:next-hop-list/" + + "ietf-rt:next-hop-list/ietf-rt:next-hop" + + "/ietf-v6ur:address" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:input" + + "/ietf-v6ur:destination-address" { + deviate not-supported; + } + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route" + + "/ietf-v6ur:destination-prefix" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route/ietf-rt:next-hop/ietf-rt:next-hop-options/" + + "ietf-rt:simple-next-hop" + + "/ietf-v6ur:next-hop-address" { + deviate not-supported; + } + + deviation "/ietf-rt:routing-state/ietf-rt:ribs/ietf-rt:rib/ietf-rt:active-route/" + + "ietf-rt:output/ietf-rt:route/ietf-rt:next-hop/ietf-rt:next-hop-options/" + + "ietf-rt:next-hop-list/ietf-rt:next-hop-list/ietf-rt:next-hop" + + "/ietf-v6ur:next-hop-address" { + deviate not-supported; + } +} diff --git a/yang/ietf/frr-deviations-ietf-rib-extension.yang b/yang/ietf/frr-deviations-ietf-rib-extension.yang new file mode 100644 index 000000000000..80fb530c1f6b --- /dev/null +++ b/yang/ietf/frr-deviations-ietf-rib-extension.yang @@ -0,0 +1,125 @@ +module frr-deviations-ietf-rib-extension { + yang-version "1.1"; + namespace "http://frrouting.org/yang/frr-deviations-ietf-rib-extension"; + + prefix frr-deviations-ietf-rib-extension; + + import ietf-routing { + prefix "ietf-rt"; + } + + import frr-vrf { + prefix "frr-vrf"; + } + + import ietf-ipv4-unicast-routing { + prefix "ietf-v4ur"; + } + + import ietf-ipv6-unicast-routing { + prefix "ietf-v6ur"; + } + + import ietf-rib-extension { + prefix "ietf-rib-ext"; + } + + organization + "Free Range Routing"; + + contact + "FRR Users List: + FRR Development List: "; + + description + "This module defines deviation statements for the ietf-routing + module."; + + revision 2019-12-03 { + description + "Initial revision."; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes/ietf-v4ur:ipv4/" + + "ietf-v4ur:route/ietf-v4ur:next-hop/ietf-v4ur:next-hop-options/" + + "ietf-v4ur:simple-next-hop/ietf-rib-ext:preference" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes/ietf-v4ur:ipv4/" + + "ietf-v4ur:route/ietf-v4ur:next-hop/ietf-v4ur:next-hop-options/" + + "ietf-v4ur:simple-next-hop/ietf-rib-ext:tag" { + deviate not-supported; + } + + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes/ietf-v4ur:ipv4/" + + "ietf-v4ur:route/ietf-v4ur:next-hop/ietf-v4ur:next-hop-options/" + + "ietf-v4ur:next-hop-list/ietf-v4ur:next-hop-list/ietf-v4ur:next-hop/ietf-rib-ext:preference" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes/ietf-v6ur:ipv6/" + + "ietf-v6ur:route/ietf-v6ur:next-hop/ietf-v6ur:next-hop-options/" + + "ietf-v6ur:simple-next-hop/ietf-rib-ext:preference" + { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes/ietf-v6ur:ipv6/" + + "ietf-v6ur:route/ietf-v6ur:next-hop/ietf-v6ur:next-hop-options/" + + "ietf-v6ur:simple-next-hop/ietf-rib-ext:tag" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:control-plane-protocols/" + + "ietf-rt:control-plane-protocol/ietf-rt:static-routes/ietf-v6ur:ipv6/" + + "ietf-v6ur:route/ietf-v6ur:next-hop/ietf-v6ur:next-hop-options/" + + "ietf-v6ur:next-hop-list/ietf-v6ur:next-hop-list/ietf-v6ur:next-hop/ietf-rib-ext:preference" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/ietf-rib-ext:rib-summary-statistics" { + deviate not-supported; + } + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/" + + "ietf-rt:routes/ietf-rt:route/ietf-rib-ext:metric" { + deviate not-supported; + } + + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/" + + "ietf-rt:routes/ietf-rt:route/ietf-rib-ext:tag" { + deviate not-supported; + } + + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/" + + "ietf-rt:routes/ietf-rt:route/ietf-rib-ext:application-tag" { + deviate not-supported; + } + + + deviation "/frr-vrf:lib/frr-vrf:vrf" + + "/ietf-rt:routing/ietf-rt:ribs/ietf-rt:rib/" + + "ietf-rt:routes/ietf-rib-ext:repair-route" { + deviate not-supported; + } + +} diff --git a/yang/ietf/ietf-ipv4-unicast-routing.yang b/yang/ietf/ietf-ipv4-unicast-routing.yang new file mode 100644 index 000000000000..3ab5bd425be3 --- /dev/null +++ b/yang/ietf/ietf-ipv4-unicast-routing.yang @@ -0,0 +1,388 @@ +module ietf-ipv4-unicast-routing { + yang-version "1.1"; + namespace + "urn:ietf:params:xml:ns:yang:ietf-ipv4-unicast-routing"; + prefix "v4ur"; + + import ietf-routing { + prefix "rt"; + description + "An 'ietf-routing' module version that is compatible with + the Network Management Datastore Architecture (NMDA) + is required."; + } + + import ietf-inet-types { + prefix "inet"; + } + + import frr-vrf { + prefix frr-vrf; + } + + organization + "IETF NETMOD (Network Modeling) Working Group"; + contact + "WG Web: + WG List: + + Editor: Ladislav Lhotka + + Acee Lindem + + Yingzhen Qu + "; + + description + "This YANG module augments the 'ietf-routing' module with basic + parameters for IPv4 unicast routing. The model fully conforms + to the Network Management Datastore Architecture (NMDA). + + Copyright (c) 2018 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 8349; see + the RFC itself for full legal notices."; + + revision 2018-03-13 { + description + "Network Management Datastore Architecture (NMDA) revision."; + reference + "RFC 8349: A YANG Data Model for Routing Management + (NMDA Version)"; + } + + revision 2016-11-04 { + description + "Initial revision."; + reference + "RFC 8022: A YANG Data Model for Routing Management"; + } + + /* Identities */ + + identity ipv4-unicast { + base rt:ipv4; + description + "This identity represents the IPv4 unicast address family."; + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route" { + when "derived-from-or-self(../../rt:address-family, " + + "'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + description + "This leaf augments an IPv4 unicast route."; + leaf destination-prefix { + type inet:ipv4-prefix; + description + "IPv4 destination prefix."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/" + + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" { + when "derived-from-or-self(../../../rt:address-family, " + + "'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + description + "Augments the 'simple-next-hop' case in IPv4 unicast routes."; + leaf next-hop-address { + type inet:ipv4-address; + description + "IPv4 address of the next hop."; + } + } + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/" + + "rt:next-hop/rt:next-hop-options/rt:next-hop-list/" + + "rt:next-hop-list/rt:next-hop" { + when "derived-from-or-self(../../../../../rt:address-family, " + + "'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + description + "This leaf augments the 'next-hop-list' case of IPv4 unicast + routes."; + leaf address { + type inet:ipv4-address; + description + "IPv4 address of the next hop."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:active-route/rt:input" { + when "derived-from-or-self(../rt:address-family, " + + "'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast RIBs."; + } + description + "This augment adds the input parameter of the 'active-route' + action."; + leaf destination-address { + type inet:ipv4-address; + description + "IPv4 destination address."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route" { + when "derived-from-or-self(../../rt:address-family, " + + "'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + description + "This augment adds the destination prefix to the reply of the + 'active-route' action."; + leaf destination-prefix { + type inet:ipv4-prefix; + description + "IPv4 destination prefix."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:simple-next-hop" { + when "derived-from-or-self(../../../rt:address-family, " + + "'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + description + "Augments the 'simple-next-hop' case in the reply to the + 'active-route' action."; + leaf next-hop-address { + type inet:ipv4-address; + description + "IPv4 address of the next hop."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" { + when "derived-from-or-self(../../../../../rt:address-family, " + + "'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + description + "Augments the 'next-hop-list' case in the reply to the + 'active-route' action."; + leaf next-hop-address { + type inet:ipv4-address; + description + "IPv4 address of the next hop."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:control-plane-protocols/" + + "rt:control-plane-protocol/rt:static-routes" { + description + "This augment defines the 'static' pseudo-protocol + with data specific to IPv4 unicast."; + container ipv4 { + description + "Support for a 'static' pseudo-protocol instance + consists of a list of routes."; + list route { + key "destination-prefix"; + description + "A list of static routes."; + leaf destination-prefix { + type inet:ipv4-prefix; + mandatory true; + description + "IPv4 destination prefix."; + } + leaf description { + type string; + description + "Textual description of the route."; + } + container next-hop { + description + "Support for next-hop."; + uses rt:next-hop-content { + augment "next-hop-options/simple-next-hop" { + description + "Augments the 'simple-next-hop' case in IPv4 static + routes."; + leaf next-hop-address { + type inet:ipv4-address; + description + "IPv4 address of the next hop."; + } + } + augment "next-hop-options/next-hop-list/next-hop-list/" + + "next-hop" { + description + "Augments the 'next-hop-list' case in IPv4 static + routes."; + leaf next-hop-address { + type inet:ipv4-address; + description + "IPv4 address of the next hop."; + } + } + } + } + } + } + } + + /* + * The subsequent data nodes are obviated and obsoleted + * by the Network Management Datastore Architecture + * as described in RFC 8342. + */ + augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" { + when "derived-from-or-self(../../rt:address-family, " + + "'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + status obsolete; + description + "This leaf augments an IPv4 unicast route."; + leaf destination-prefix { + type inet:ipv4-prefix; + status obsolete; + description + "IPv4 destination prefix."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/" + + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" { + when "derived-from-or-self( + ../../../rt:address-family, 'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + status obsolete; + description + "Augments the 'simple-next-hop' case in IPv4 unicast routes."; + leaf next-hop-address { + type inet:ipv4-address; + status obsolete; + description + "IPv4 address of the next hop."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/" + + "rt:next-hop/rt:next-hop-options/rt:next-hop-list/" + + "rt:next-hop-list/rt:next-hop" { + when "derived-from-or-self(../../../../../rt:address-family, + 'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + status obsolete; + description + "This leaf augments the 'next-hop-list' case of IPv4 unicast + routes."; + leaf address { + type inet:ipv4-address; + status obsolete; + description + "IPv4 address of the next hop."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/" + + "rt:input" { + when "derived-from-or-self(../rt:address-family, + 'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast RIBs."; + } + status obsolete; + description + "This augment adds the input parameter of the 'active-route' + action."; + leaf destination-address { + type inet:ipv4-address; + status obsolete; + description + "IPv4 destination address."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route" { + when "derived-from-or-self(../../rt:address-family, + 'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + status obsolete; + description + "This augment adds the destination prefix to the reply of the + 'active-route' action."; + leaf destination-prefix { + type inet:ipv4-prefix; + status obsolete; + description + "IPv4 destination prefix."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:simple-next-hop" { + when "derived-from-or-self(../../../rt:address-family, + 'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + status obsolete; + description + "Augments the 'simple-next-hop' case in the reply to the + 'active-route' action."; + leaf next-hop-address { + type inet:ipv4-address; + status obsolete; + description + "IPv4 address of the next hop."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" { + when "derived-from-or-self(../../../../../rt:address-family, + 'v4ur:ipv4-unicast')" { + description + "This augment is valid only for IPv4 unicast."; + } + status obsolete; + description + "Augments the 'next-hop-list' case in the reply to the + 'active-route' action."; + leaf next-hop-address { + type inet:ipv4-address; + status obsolete; + description + "IPv4 address of the next hop."; + } + } +} diff --git a/yang/ietf/ietf-ipv6-router-advertisements.yang b/yang/ietf/ietf-ipv6-router-advertisements.yang new file mode 100644 index 000000000000..294e231d764c --- /dev/null +++ b/yang/ietf/ietf-ipv6-router-advertisements.yang @@ -0,0 +1,501 @@ +submodule ietf-ipv6-router-advertisements { + yang-version "1.1"; + + belongs-to ietf-ipv6-unicast-routing { + prefix "v6ur"; + } + + import ietf-inet-types { + prefix "inet"; + } + + import ietf-interfaces { + prefix "if"; + description + "An 'ietf-interfaces' module version that is compatible with + the Network Management Datastore Architecture (NMDA) + is required."; + } + + import ietf-ip { + prefix "ip"; + description + "An 'ietf-ip' module version that is compatible with + the Network Management Datastore Architecture (NMDA) + is required."; + } + + organization + "IETF NETMOD (Network Modeling) Working Group"; + contact + "WG Web: + WG List: + + Editor: Ladislav Lhotka + + Acee Lindem + + Yingzhen Qu + "; + + description + "This YANG module augments the 'ietf-ip' module with + parameters for IPv6 Router Advertisements. The model fully + conforms to the Network Management Datastore + Architecture (NMDA). + + Copyright (c) 2018 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 8349; see + the RFC itself for full legal notices."; + + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)"; + + revision 2018-03-13 { + description + "Network Management Datastore Architecture (NMDA) revision."; + reference + "RFC 8349: A YANG Data Model for Routing Management + (NMDA Version)"; + } + + revision 2016-11-04 { + description + "Initial revision."; + reference + "RFC 8022: A YANG Data Model for Routing Management"; + } + + augment "/if:interfaces/if:interface/ip:ipv6" { + description + "Augments interface configuration with parameters of IPv6 + Router Advertisements."; + container ipv6-router-advertisements { + description + "Support for IPv6 Router Advertisements."; + leaf send-advertisements { + type boolean; + default "false"; + description + "A flag indicating whether or not the router sends + periodic Router Advertisements and responds to + Router Solicitations."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - AdvSendAdvertisements"; + } + leaf max-rtr-adv-interval { + type uint16 { + range "4..65535"; + } + units "seconds"; + default "600"; + description + "The maximum time allowed between sending unsolicited + multicast Router Advertisements from the interface."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - MaxRtrAdvInterval"; + } + leaf min-rtr-adv-interval { + type uint16 { + range "3..1350"; + } + units "seconds"; + must ". <= 0.75 * ../max-rtr-adv-interval" { + description + "The value MUST NOT be greater than 75% of + 'max-rtr-adv-interval'."; + } + description + "The minimum time allowed between sending unsolicited + multicast Router Advertisements from the interface. + + The default value to be used operationally if this + leaf is not configured is determined as follows: + + - if max-rtr-adv-interval >= 9 seconds, the default + value is 0.33 * max-rtr-adv-interval; + + - otherwise, it is 0.75 * max-rtr-adv-interval."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - MinRtrAdvInterval"; + } + leaf managed-flag { + type boolean; + default "false"; + description + "The value to be placed in the 'Managed address + configuration' flag field in the Router + Advertisement."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - AdvManagedFlag"; + } + leaf other-config-flag { + type boolean; + default "false"; + description + "The value to be placed in the 'Other configuration' + flag field in the Router Advertisement."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - AdvOtherConfigFlag"; + } + leaf link-mtu { + type uint32; + default "0"; + description + "The value to be placed in MTU options sent by the + router. A value of zero indicates that no MTU options + are sent."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - AdvLinkMTU"; + } + leaf reachable-time { + type uint32 { + range "0..3600000"; + } + units "milliseconds"; + default "0"; + description + "The value to be placed in the Reachable Time field in + the Router Advertisement messages sent by the router. + A value of zero means unspecified (by this router)."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - AdvReachableTime"; + } + leaf retrans-timer { + type uint32; + units "milliseconds"; + default "0"; + description + "The value to be placed in the Retrans Timer field in + the Router Advertisement messages sent by the router. + A value of zero means unspecified (by this router)."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - AdvRetransTimer"; + } + leaf cur-hop-limit { + type uint8; + description + "The value to be placed in the Cur Hop Limit field in + the Router Advertisement messages sent by the router. + A value of zero means unspecified (by this router). + + If this parameter is not configured, the device SHOULD + use the IANA-specified value for the default IPv4 + Time to Live (TTL) parameter that was in effect at the + time of implementation."; + reference + "RFC 3232: Assigned Numbers: RFC 1700 is Replaced by + an On-line Database + RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - AdvCurHopLimit + IANA: IP Parameters + (https://www.iana.org/assignments/ip-parameters)"; + } + leaf default-lifetime { + type uint16 { + range "0..65535"; + } + units "seconds"; + description + "The value to be placed in the Router Lifetime field of + Router Advertisements sent from the interface, in + seconds. It MUST be either zero or between + max-rtr-adv-interval and 9000 seconds. A value of zero + indicates that the router is not to be used as a + default router. These limits may be overridden by + specific documents that describe how IPv6 operates over + different link layers. + + If this parameter is not configured, the device SHOULD + use a value of 3 * max-rtr-adv-interval."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - AdvDefaultLifetime"; + } + container prefix-list { + description + "Support for prefixes to be placed in Prefix + Information options in Router Advertisement messages + sent from the interface. + + Prefixes that are advertised by default but do not + have their entries in the child 'prefix' list are + advertised with the default values of all parameters. + + The link-local prefix SHOULD NOT be included in the + list of advertised prefixes."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + - AdvPrefixList"; + list prefix { + key "prefix-spec"; + description + "Support for an advertised prefix entry."; + leaf prefix-spec { + type inet:ipv6-prefix; + description + "IPv6 address prefix."; + } + choice control-adv-prefixes { + default "advertise"; + description + "Either (1) the prefix is explicitly removed from the + set of advertised prefixes or (2) the parameters with + which the prefix is advertised are specified (default + case)."; + leaf no-advertise { + type empty; + description + "The prefix will not be advertised. + + This can be used for removing the prefix from + the default set of advertised prefixes."; + } + case advertise { + leaf valid-lifetime { + type uint32; + units "seconds"; + default "2592000"; + description + "The value to be placed in the Valid Lifetime + in the Prefix Information option. The + designated value of all 1's (0xffffffff) + represents infinity."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 + (IPv6) - AdvValidLifetime"; + } + leaf on-link-flag { + type boolean; + default "true"; + description + "The value to be placed in the on-link flag + ('L-bit') field in the Prefix Information + option."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 + (IPv6) - AdvOnLinkFlag"; + } + leaf preferred-lifetime { + type uint32; + units "seconds"; + must ". <= ../valid-lifetime" { + description + "This value MUST NOT be greater than + valid-lifetime."; + } + default "604800"; + description + "The value to be placed in the Preferred + Lifetime in the Prefix Information option. + The designated value of all 1's (0xffffffff) + represents infinity."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 + (IPv6) - AdvPreferredLifetime"; + } + leaf autonomous-flag { + type boolean; + default "true"; + description + "The value to be placed in the Autonomous Flag + field in the Prefix Information option."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 + (IPv6) - AdvAutonomousFlag"; + } + } + } + } + } + } + } + + /* + * The subsequent data nodes are obviated and obsoleted + * by the Network Management Datastore Architecture + * as described in RFC 8342. + */ + augment "/if:interfaces-state/if:interface/ip:ipv6" { + status obsolete; + description + "Augments interface state data with parameters of IPv6 + Router Advertisements."; + container ipv6-router-advertisements { + status obsolete; + description + "Parameters of IPv6 Router Advertisements."; + leaf send-advertisements { + type boolean; + status obsolete; + description + "A flag indicating whether or not the router sends + periodic Router Advertisements and responds to + Router Solicitations."; + } + leaf max-rtr-adv-interval { + type uint16 { + range "4..1800"; + } + units "seconds"; + status obsolete; + description + "The maximum time allowed between sending unsolicited + multicast Router Advertisements from the interface."; + } + leaf min-rtr-adv-interval { + type uint16 { + range "3..1350"; + } + units "seconds"; + status obsolete; + description + "The minimum time allowed between sending unsolicited + multicast Router Advertisements from the interface."; + } + leaf managed-flag { + type boolean; + status obsolete; + description + "The value that is placed in the 'Managed address + configuration' flag field in the Router Advertisement."; + } + leaf other-config-flag { + type boolean; + status obsolete; + description + "The value that is placed in the 'Other configuration' flag + field in the Router Advertisement."; + } + leaf link-mtu { + type uint32; + status obsolete; + description + "The value that is placed in MTU options sent by the + router. A value of zero indicates that no MTU options + are sent."; + } + leaf reachable-time { + type uint32 { + range "0..3600000"; + } + units "milliseconds"; + status obsolete; + description + "The value that is placed in the Reachable Time field in + the Router Advertisement messages sent by the router. A + value of zero means unspecified (by this router)."; + } + leaf retrans-timer { + type uint32; + units "milliseconds"; + status obsolete; + description + "The value that is placed in the Retrans Timer field in the + Router Advertisement messages sent by the router. A value + of zero means unspecified (by this router)."; + } + leaf cur-hop-limit { + type uint8; + status obsolete; + description + "The value that is placed in the Cur Hop Limit field in the + Router Advertisement messages sent by the router. A value + of zero means unspecified (by this router)."; + } + leaf default-lifetime { + type uint16 { + range "0..9000"; + } + units "seconds"; + status obsolete; + description + "The value that is placed in the Router Lifetime field of + Router Advertisements sent from the interface, in seconds. + A value of zero indicates that the router is not to be + used as a default router."; + } + container prefix-list { + status obsolete; + description + "A list of prefixes that are placed in Prefix Information + options in Router Advertisement messages sent from the + interface. + + By default, these are all prefixes that the router + advertises via routing protocols as being on-link for the + interface from which the advertisement is sent."; + list prefix { + key "prefix-spec"; + status obsolete; + description + "Advertised prefix entry and its parameters."; + leaf prefix-spec { + type inet:ipv6-prefix; + status obsolete; + description + "IPv6 address prefix."; + } + leaf valid-lifetime { + type uint32; + units "seconds"; + status obsolete; + description + "The value that is placed in the Valid Lifetime in the + Prefix Information option. The designated value of + all 1's (0xffffffff) represents infinity. + + An implementation SHOULD keep this value constant in + consecutive advertisements, except when it is + explicitly changed in configuration."; + } + leaf on-link-flag { + type boolean; + status obsolete; + description + "The value that is placed in the on-link flag ('L-bit') + field in the Prefix Information option."; + } + leaf preferred-lifetime { + type uint32; + units "seconds"; + status obsolete; + description + "The value that is placed in the Preferred Lifetime in + the Prefix Information option, in seconds. The + designated value of all 1's (0xffffffff) represents + infinity. + + An implementation SHOULD keep this value constant in + consecutive advertisements, except when it is + explicitly changed in configuration."; + } + leaf autonomous-flag { + type boolean; + status obsolete; + description + "The value that is placed in the Autonomous Flag field + in the Prefix Information option."; + } + } + } + } + } +} diff --git a/yang/ietf/ietf-ipv6-unicast-routing.yang b/yang/ietf/ietf-ipv6-unicast-routing.yang new file mode 100644 index 000000000000..85e0b4b031f8 --- /dev/null +++ b/yang/ietf/ietf-ipv6-unicast-routing.yang @@ -0,0 +1,401 @@ +module ietf-ipv6-unicast-routing { + yang-version "1.1"; + namespace + "urn:ietf:params:xml:ns:yang:ietf-ipv6-unicast-routing"; + prefix "v6ur"; + + import ietf-routing { + prefix "rt"; + description + "An 'ietf-routing' module version that is compatible with + the Network Management Datastore Architecture (NMDA) + is required."; + } + + import ietf-inet-types { + prefix "inet"; + description + "An 'ietf-interfaces' module version that is compatible with + the Network Management Datastore Architecture (NMDA) + is required."; + } + +/* + include ietf-ipv6-router-advertisements { + revision-date 2018-03-13; + } +*/ + + import frr-vrf { + prefix frr-vrf; + } + + organization + "IETF NETMOD (Network Modeling) Working Group"; + contact + "WG Web: + WG List: + + Editor: Ladislav Lhotka + + Acee Lindem + + Yingzhen Qu + "; + + description + "This YANG module augments the 'ietf-routing' module with basic + parameters for IPv6 unicast routing. The model fully conforms + to the Network Management Datastore Architecture (NMDA). + + Copyright (c) 2018 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 8349; see + the RFC itself for full legal notices."; + + revision 2018-03-13 { + description + "Network Management Datastore Architecture (NMDA) revision."; + reference + "RFC 8349: A YANG Data Model for Routing Management + (NMDA Version)"; + } + + /* Identities */ + + revision 2016-11-04 { + description + "Initial revision."; + reference + "RFC 8022: A YANG Data Model for Routing Management"; + } + + identity ipv6-unicast { + base rt:ipv6; + description + "This identity represents the IPv6 unicast address family."; + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route" { + when "derived-from-or-self(../../rt:address-family, " + + "'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + description + "This leaf augments an IPv6 unicast route."; + leaf destination-prefix { + type inet:ipv6-prefix; + description + "IPv6 destination prefix."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/" + + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" { + when "derived-from-or-self(../../../rt:address-family, " + + "'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + description + "Augments the 'simple-next-hop' case in IPv6 unicast routes."; + leaf next-hop-address { + type inet:ipv6-address; + description + "IPv6 address of the next hop."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/" + + "rt:next-hop/rt:next-hop-options/rt:next-hop-list/" + + "rt:next-hop-list/rt:next-hop" { + when "derived-from-or-self(../../../../../rt:address-family, " + + "'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + description + "This leaf augments the 'next-hop-list' case of IPv6 unicast + routes."; + leaf address { + type inet:ipv6-address; + description + "IPv6 address of the next hop."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:active-route/rt:input" { + when "derived-from-or-self(../rt:address-family, " + + "'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast RIBs."; + } + description + "This augment adds the input parameter of the 'active-route' + action."; + leaf destination-address { + type inet:ipv6-address; + description + "IPv6 destination address."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route" { + when "derived-from-or-self(../../rt:address-family, " + + "'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + description + "This augment adds the destination prefix to the reply of the + 'active-route' action."; + leaf destination-prefix { + type inet:ipv6-prefix; + description + "IPv6 destination prefix."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:simple-next-hop" { + when "derived-from-or-self(../../../rt:address-family, " + + "'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + description + "Augments the 'simple-next-hop' case in the reply to the + 'active-route' action."; + leaf next-hop-address { + type inet:ipv6-address; + description + "IPv6 address of the next hop."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" { + when "derived-from-or-self(../../../../../rt:address-family, " + + "'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + description + "Augments the 'next-hop-list' case in the reply to the + 'active-route' action."; + leaf next-hop-address { + type inet:ipv6-address; + description + "IPv6 address of the next hop."; + } + } + + /* Data node augmentations */ + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:control-plane-protocols/" + + "rt:control-plane-protocol/rt:static-routes" { + description + "This augment defines the 'static' pseudo-protocol + with data specific to IPv6 unicast."; + container ipv6 { + description + "Support for a 'static' pseudo-protocol instance + consists of a list of routes."; + list route { + key "destination-prefix"; + description + "A list of static routes."; + leaf destination-prefix { + type inet:ipv6-prefix; + mandatory true; + description + "IPv6 destination prefix."; + } + leaf description { + type string; + description + "Textual description of the route."; + } + container next-hop { + description + "Next hop for the route."; + uses rt:next-hop-content { + augment "next-hop-options/simple-next-hop" { + description + "Augments the 'simple-next-hop' case in IPv6 static + routes."; + leaf next-hop-address { + type inet:ipv6-address; + description + "IPv6 address of the next hop."; + } + } + augment "next-hop-options/next-hop-list/next-hop-list/" + + "next-hop" { + description + "Augments the 'next-hop-list' case in IPv6 static + routes."; + leaf next-hop-address { + type inet:ipv6-address; + description + "IPv6 address of the next hop."; + } + } + } + } + } + } + } + + /* + * The subsequent data nodes are obviated and obsoleted + * by the Network Management Datastore Architecture + * as described in RFC 8342. + */ + augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route" { + when "derived-from-or-self(../../rt:address-family, + 'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + status obsolete; + description + "This leaf augments an IPv6 unicast route."; + leaf destination-prefix { + type inet:ipv6-prefix; + status obsolete; + description + "IPv6 destination prefix."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/" + + "rt:next-hop/rt:next-hop-options/rt:simple-next-hop" { + when "derived-from-or-self(../../../rt:address-family, + 'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + status obsolete; + description + "Augments the 'simple-next-hop' case in IPv6 unicast routes."; + leaf next-hop-address { + type inet:ipv6-address; + status obsolete; + description + "IPv6 address of the next hop."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:routes/rt:route/" + + "rt:next-hop/rt:next-hop-options/rt:next-hop-list/" + + "rt:next-hop-list/rt:next-hop" { + when "derived-from-or-self(../../../../../rt:address-family, + 'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + status obsolete; + description + "This leaf augments the 'next-hop-list' case of IPv6 unicast + routes."; + leaf address { + type inet:ipv6-address; + status obsolete; + description + "IPv6 address of the next hop."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/" + + "rt:active-route/rt:input" { + when "derived-from-or-self(../rt:address-family, + 'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast RIBs."; + } + status obsolete; + description + "This augment adds the input parameter of the 'active-route' + action."; + leaf destination-address { + type inet:ipv6-address; + status obsolete; + description + "IPv6 destination address."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route" { + when "derived-from-or-self(../../rt:address-family, + 'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + status obsolete; + description + "This augment adds the destination prefix to the reply of the + 'active-route' action."; + leaf destination-prefix { + type inet:ipv6-prefix; + status obsolete; + description + "IPv6 destination prefix."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:simple-next-hop" { + when "derived-from-or-self(../../../rt:address-family, + 'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + status obsolete; + description + "Augments the 'simple-next-hop' case in the reply to the + 'active-route' action."; + leaf next-hop-address { + type inet:ipv6-address; + status obsolete; + description + "IPv6 address of the next hop."; + } + } + augment "/rt:routing-state/rt:ribs/rt:rib/rt:active-route/" + + "rt:output/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" { + when "derived-from-or-self(../../../../../rt:address-family, + 'v6ur:ipv6-unicast')" { + description + "This augment is valid only for IPv6 unicast."; + } + status obsolete; + description + "Augments the 'next-hop-list' case in the reply to the + 'active-route' action."; + leaf next-hop-address { + type inet:ipv6-address; + status obsolete; + description + "IPv6 address of the next hop."; + } + } +} diff --git a/yang/ietf/ietf-rib-extension.yang b/yang/ietf/ietf-rib-extension.yang new file mode 100644 index 000000000000..a64100c4fcd9 --- /dev/null +++ b/yang/ietf/ietf-rib-extension.yang @@ -0,0 +1,354 @@ +module ietf-rib-extension { + yang-version "1.1"; + namespace "urn:ietf:params:xml:ns:yang:ietf-rib-extension"; + + prefix rib-ext; + + import ietf-inet-types { + prefix "inet"; + } + + import ietf-interfaces { + prefix "if"; + } + + import ietf-routing { + prefix "rt"; + } + + import ietf-ipv4-unicast-routing { + prefix "v4ur"; + } + + import ietf-ipv6-unicast-routing { + prefix "v6ur"; + } + + import frr-vrf { + prefix "frr-vrf"; + } + + organization + "IETF RTGWG - Routing Working Group"; + + contact + "WG Web: + WG List: + + Author: Acee Lindem + + Author: Yingzhen Qu + "; + + description + "This YANG module extends the generic data model for + RIB by augmenting the ietf-netmod-routing-cfg + model. It is intended that the module will be extended + by vendors to define vendor-specific RIB parameters. + + This YANG model conforms to the Network Management + Datastore Architecture (NDMA) as described in RFC 8242. + + Copyright (c) 2018 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; + see the RFC itself for full legal notices."; + + revision 2019-03-11 { + description + "Initial RFC Version"; + reference + "RFC XXXX: A YANG Data Model for RIB Extensions."; + } + + /* Groupings */ + grouping rib-statistics { + description "Statistics grouping used for RIB augmentation"; + container rib-summary-statistics { + config false; + description "Container for RIB statistics"; + leaf total-routes { + type uint32; + description + "Total routes in the RIB from all protocols"; + } + leaf total-active-routes { + type uint32; + description + "Total active routes in the RIB"; + } + leaf total-route-memory { + type uint64; + description + "Total memory for all routes in the RIB from all + protocol clients"; + } + list protocol-rib-statistics { + description "List protocol statistics"; + leaf rib-protocol { + type identityref { + base rt:routing-protocol; + } + description "Routing protocol for statistics"; + } + leaf protocol-total-routes { + type uint32; + description + "Total number routes for protocol in the RIB"; + } + leaf protocol-active-routes { + type uint32; + description + "Number active routes for protocol in the RIB"; + } + leaf protocol-route-memory { + type uint64; + description + "Total memory for all routes in the RIB for protocol"; + } + } + } + } + + grouping next-hop { + description + "Next-hop grouping"; + leaf interface { + type if:interface-ref; + description + "Outgoing interface"; + } + leaf address { + type inet:ip-address; + description + "IPv4 or IPv6 Address of the next-hop"; + } + } + + grouping attributes { + description + "Common attributes applicable to all paths"; + leaf metric { + type uint32; + description "Route metric"; + } + leaf tag { + type uint32; + description "Route tag"; + } + leaf application-tag { + type uint32; + description "Additional Application-Specific Route tag. This + additional tag can be used by applications that + require semantics and policy different from that + of the tag. For example, the tag is usually + automatically advertised in OSPF AS-External + Link State Advertisements (LSAs) while this + application specific tag is not unless done so + explicitly."; + } + } + grouping path-attribute { + description + "Path attribute grouping"; + leaf repair-path { + type leafref { + path "/rt:routing/rt:ribs/rt:rib/" + + "rt:routes/repair-route/id"; + } + description + "IP Fast ReRoute (IPFRR) repair path, use a path + from repair-route list"; + reference + "RFC 5714: IP Fast Reroute Framework."; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:control-plane-protocols/" + + "rt:control-plane-protocol/rt:static-routes/v4ur:ipv4/" + + "v4ur:route/v4ur:next-hop/v4ur:next-hop-options/" + + "v4ur:simple-next-hop" + { + description + "Augment 'simple-next-hop' case in IPv4 unicast route."; + leaf preference { + type uint32; + default "1"; + description "Route preference - Used to select among multiple + static routes with a lower preference next-hop + preferred and equal preference paths yielding + Equal Cost Multi-Path (ECMP)."; + } + leaf tag { + type uint32; + default "0"; + description "Route tag"; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:control-plane-protocols/" + + "rt:control-plane-protocol/rt:static-routes/v4ur:ipv4/" + + "v4ur:route/v4ur:next-hop/v4ur:next-hop-options/" + + "v4ur:next-hop-list/v4ur:next-hop-list/v4ur:next-hop" + { + description + "Augment static route configuration 'next-hop-list'."; + + leaf preference { + type uint32; + default "1"; + description "Route preference - Used to select among multiple + static routes with a lower preference next-hop + preferred and equal preference paths yielding + Equal Cost Multi-Path (ECMP)."; + } + leaf tag { + type uint32; + default "0"; + description "Route tag"; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:control-plane-protocols/" + + "rt:control-plane-protocol/rt:static-routes/v6ur:ipv6/" + + "v6ur:route/v6ur:next-hop/v6ur:next-hop-options/" + + "v6ur:simple-next-hop" + { + description + "Augment 'simple-next-hop' case in IPv6 unicast route."; + leaf preference { + type uint32; + default "1"; + description "Route preference - Used to select among multiple + static routes with a lower preference next-hop + preferred and equal preference paths yielding + Equal Cost Multi-Path (ECMP)."; + } + leaf tag { + type uint32; + default "0"; + description "Route tag"; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:control-plane-protocols/" + + "rt:control-plane-protocol/rt:static-routes/v6ur:ipv6/" + + "v6ur:route/v6ur:next-hop/v6ur:next-hop-options/" + + "v6ur:next-hop-list/v6ur:next-hop-list/v6ur:next-hop" + { + description + "Augment static route configuration 'next-hop-list'."; + + leaf preference { + type uint32; + default "1"; + description "Route preference - Used to select among multiple + static routes with a lower preference next-hop + preferred and equal preference paths yielding + Equal Cost Multi-Path (ECMP)."; + } + leaf tag { + type uint32; + default "0"; + description "Route tag"; + } + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib" + { + description "Augment a RIB with statistics"; + uses rib-statistics; + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/" + + "rt:routes/rt:route" + { + description + "Augment a route in RIB with tag."; + uses attributes; + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/" + + "rt:routes" + { + description + "Augment a route with a list of repair-paths."; + list repair-route { + key "id"; + description + "A repair-path entry, which can be referenced + by a repair-path."; + leaf id { + type string; + description + "A unique identifier."; + } + + container next-hop { + description + "Route's next-hop attribute."; + leaf outgoing-interface { + type if:interface-state-ref; + description + "Name of the outgoing interface."; + } + leaf next-hop-address { + type inet:ip-address; + description + "IP address of the next hop."; + } + } + leaf metric { + type uint32; + description "Route metric"; + } + } + } +/* + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/" + + "rt:routes/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:simple-next-hop" + { + description + "Add more parameters to a path."; + uses path-attribute; + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/" + + "rt:routes/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:special-next-hop" + { + description + "Add more parameters to a path."; + uses path-attribute; + } + + augment "/frr-vrf:lib/frr-vrf:vrf" + + "/rt:routing/rt:ribs/rt:rib/" + + "rt:routes/rt:route/rt:next-hop/rt:next-hop-options/" + + "rt:next-hop-list/rt:next-hop-list/rt:next-hop" + { + description + "This case augments the 'next-hop-options' in the routing + model."; + uses path-attribute; + } +*/ +} diff --git a/yang/subdir.am b/yang/subdir.am index b69239560ffe..c1477a7b536d 100644 --- a/yang/subdir.am +++ b/yang/subdir.am @@ -24,6 +24,14 @@ dist_yangmodels_DATA += yang/frr-test-module.yang dist_yangmodels_DATA += yang/frr-interface.yang dist_yangmodels_DATA += yang/frr-route-types.yang dist_yangmodels_DATA += yang/ietf/ietf-routing-types.yang +dist_yangmodels_DATA += yang/frr-staticd.yang +dist_yangmodels_DATA += yang/ietf/ietf-ipv4-unicast-routing.yang +dist_yangmodels_DATA += yang/ietf/ietf-ipv6-unicast-routing.yang +dist_yangmodels_DATA += yang/ietf/ietf-ipv6-router-advertisements.yang +dist_yangmodels_DATA += yang/ietf/ietf-rib-extension.yang +dist_yangmodels_DATA += yang/ietf/frr-deviations-ietf-rib-extension.yang +dist_yangmodels_DATA += yang/ietf/frr-deviations-ietf-ipv4-unicast-routing.yang +dist_yangmodels_DATA += yang/ietf/frr-deviations-ietf-ipv6-unicast-routing.yang if BFDD dist_yangmodels_DATA += yang/frr-bfdd.yang