diff options
author | Michal Cmarada <michal.cmarada@pantheon.tech> | 2018-06-15 13:09:56 +0200 |
---|---|---|
committer | Marek Gradzki <mgradzki@cisco.com> | 2018-06-19 18:54:51 +0000 |
commit | 3edc384ac6cbeb68d36dbb4a51aa027c3bd3257d (patch) | |
tree | 78e4ae88f89e08756ae469d068c45e2e7a059c2f /srv6/srv6-api/src/main/yang/hc2vpp-ietf-srv6-static@2018-03-01.yang | |
parent | b44b5a2a1ee8ba193265708272be97fd6f11d010 (diff) |
HC2VPP-288 - add SRv6 module (writers only)
Changes:
- add new module for SRv6
- add models for SRv6 configuration:
from https://datatracker.ietf.org/doc/draft-raza-spring-srv6-yang/
- hc2vpp-ietf-srv6-base@2018-03-01.yang
- hc2vpp-ietf-srv6-static@2018-03-01.yang
- ietf-srv6-types@2018-03-01.yang
- implements Configuration of local sids and their end functions.
- implements support for FIB table management (HC2VPP-345)
Models hc2vpp-ietf-srv6-base and hc2vpp-ietf-srv6-static
are changed (HC2VPP-332):
- imports for routing models (HC2VPP-298)
- presence in end function containers was added to fix
mandatory child verification if parent container is not present
Change-Id: Ib74e48023b671383f076b84773e26ce7c5ae282a
Signed-off-by: Michal Cmarada <michal.cmarada@pantheon.tech>
Signed-off-by: Jan Srnicek <jan.srnicek@pantheon.tech>
Diffstat (limited to 'srv6/srv6-api/src/main/yang/hc2vpp-ietf-srv6-static@2018-03-01.yang')
-rw-r--r-- | srv6/srv6-api/src/main/yang/hc2vpp-ietf-srv6-static@2018-03-01.yang | 832 |
1 files changed, 832 insertions, 0 deletions
diff --git a/srv6/srv6-api/src/main/yang/hc2vpp-ietf-srv6-static@2018-03-01.yang b/srv6/srv6-api/src/main/yang/hc2vpp-ietf-srv6-static@2018-03-01.yang new file mode 100644 index 000000000..3ba936688 --- /dev/null +++ b/srv6/srv6-api/src/main/yang/hc2vpp-ietf-srv6-static@2018-03-01.yang @@ -0,0 +1,832 @@ +module hc2vpp-ietf-srv6-static { + + namespace "urn:ietf:params:xml:ns:yang:ietf-srv6-static"; + prefix srv6-static; + + import ietf-interfaces { + prefix "if"; + } + + import ietf-inet-types { + prefix inet; + } + + // TODO: hc2vpp-298 - Renamed imports, because hc2vpp uses modified versions of these models. + import hc2vpp-ietf-routing { + prefix "rt"; + } + + import ietf-srv6-types { + prefix srv6-types; + } + + // TODO: hc2vpp-332 - Renamed imports, because hc2vpp uses modified versions of these models. + import hc2vpp-ietf-srv6-base { + prefix srv6; + } + + organization + "IETF SPRING Working Group"; + contact + "WG Web: <http://tools.ietf.org/wg/spring/> + WG List: <mailto:spring@ietf.org> + + + Editor: Kamran Raza + <mailto:skraza@cisco.com> + + Editor: Jaganbabu Rajamanickam + <maito:jrajaman@cisco.com> + + Editor: Xufeng Liu + <mailto:Xufeng_Liu@jabil.com> + + Editor: Zhibo Hu + <mailto:huzhibo@huawei.com> + + Editor: Iftekhar Hussain + <mailto:IHussain@infinera.com> + + Editor: Himanshu Shah + <mailto:hshah@ciena.com> + + Editor: Daniel Voyer + <mailto:daniel.voyer@bell.ca> + + Editor: Hani Elmalky + <mailto:hani.elmalky@ericsson.com> + + Editor: Satoru Matsushima + <mailto:satoru.matsushima@gmail.com> + + Editor: Katsuhiro Horiba + <mailto:katsuhiro.horiba@g.softbank.co.jp> + + Editor: Ahmed AbdelSalam + <mailto:ahmed.abdelsalam@gssi.it> + + "; + + description + "This YANG module defines the essential elements for the + management of Static application for Segment-Routing with + IPv6 dataplane (SRv6). + + Copyright (c) 2017 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)."; + + reference "RFC XXXX"; + + revision 2018-03-01 { + description + "Updated to align with SRv6 network programming draft rev 04"; + reference + "RFC XXXX: YANG Data Model for SRv6"; + } + + revision 2017-11-12 { + description + "Initial revision."; + reference + "RFC XXXX: YANG Data Model for SRv6"; + } + + /* + * Config and State + */ + + + grouping path-attrs-v6 { + description + "IPv6 Path properties"; + + leaf interface { + type if:interface-ref; + description "The outgoing interface"; + } + + leaf next-hop { + type inet:ipv6-address; + description "The IP address of the next-hop"; + } + + uses srv6:path-attrs-cmn; + } + + grouping path-attrs-v4 { + description + "IPv4 Path properties"; + + leaf interface { + type if:interface-ref; + description "The outgoing interface"; + } + + leaf next-hop { + type inet:ipv4-address; + description "The IP address of the next-hop"; + } + + uses srv6:path-attrs-cmn; + } + + grouping path-attrs-mpls { + description + "MPLS Path properties"; + + leaf interface { + type if:interface-ref; + description "The outgoing interface"; + } + + leaf next-hop { + type inet:ip-address; + description "The IP address of the next-hop"; + } + + uses srv6:path-attrs-cmn; + } + + grouping multi-paths-v6 { + description "Multipath grouping"; + + container paths { + description "List of outgoing paths"; + list path { + key path-index; + description "The list of paths associated with the SID"; + + leaf path-index { + type uint8; + description "Index of the path"; + } + + uses path-attrs-v6; + container encap { + description "Encapsulation on path"; + uses srv6:path-out-sids; + } + } + } + } + + + grouping multi-paths-v4 { + description "Multipath grouping"; + + container paths { + description "List of outgoing paths"; + list path { + key path-index; + description "The list of paths associated with the SID"; + + leaf path-index { + type uint8; + description "Index of the path"; + } + + uses path-attrs-v4; + container encap { + description "Encapsulation on path"; + uses srv6:path-out-sids; + } + } + } + } + + grouping multi-paths-mpls { + description "Multipath grouping"; + + container paths { + description "List of outgoing paths"; + list path { + key path-index; + description "The list of paths associated with the SID"; + + leaf path-index { + type uint8; + description "Index of the path"; + } + + uses path-attrs-mpls; + container encap { + description "Encapsulation on path"; + uses srv6:path-out-labels; + } + } + } + } + + grouping srv6-sid-config { + description + + "Configuration parameters relating to SRv6 sid."; + + leaf opcode { + type srv6-types:srv6-func-opcode-unreserved; + description + "SRv6 function opcode."; + } + leaf end-behavior-type { + type identityref { + base srv6-types:srv6-endpoint-type; + } + mandatory true; + description + "Type of SRv6 end behavior."; + } + + container end { + when "../end-behavior-type = 'End'" { + description + "This container is valid only when the user chooses End + behavior (variant: no PSP, no USP)."; + } + description + "The Endpoint function is the most basic function. + FIB lookup on updated DA and forward accordingly + to the matched entry. + This is the SRv6 instantiation of a Prefix SID + (variant: no PSP, no USP)"; + + } + + container end_psp { + when "../end-behavior-type = 'End_PSP'" { + description + "This container is valid only when the user chooses End + behavior (variant: PSP only)."; + } + description + "The Endpoint function is the most basic function. + FIB lookup on updated DA and forward accordingly + to the matched entry. + This is the SRv6 instantiation of a Prefix SID + (variant: PSP only)"; + + } + + container end_usp { + when "../end-behavior-type = 'End_USP'" { + + description + "This container is valid only when the user chooses End + behavior (variant: USP only)."; + } + description + "The Endpoint function is the most basic function. + FIB lookup on updated DA and forward accordingly + to the matched entry. + This is the SRv6 instantiation of a Prefix SID + (variant: USP only)"; + + } + + container end_psp_usp { + when "../end-behavior-type = 'End_PSP_USP'" { + description + "This container is valid only when the user chooses End + behavior (variant: PSP/USP)."; + } + description + "The Endpoint function is the most basic function. + FIB lookup on updated DA and forward accordingly + to the matched entry. + This is the SRv6 instantiation of a Prefix SID + (variant: PSP/USP)"; + + } + + container end-t { + when "../end-behavior-type = 'End.T'" { + description + "This container is valid only when the user chooses + End.T behavior (variant: no PSP, no USP)."; + } + description + "Endpoint with specific IPv6 table lookup (variant: no PSP, no USP). + Lookup the next segment in IPv6 table T + associated with the SID and forward via + the matched table entry. + The End.T is used for multi-table operation + in the core."; + // TODO: HC2VPP-332 - Uncommented presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + leaf lookup-table-ipv6 { + type srv6-types:table-id; + mandatory true; + description + "Table Id for lookup on updated DA (next segment)"; + + } + } + + container end-t_psp { + when "../end-behavior-type = 'End.T_PSP'" { + description + "This container is valid only when the user chooses + End.T behavior (variant: PSP only)."; + } + description + "Endpoint with specific IPv6 table lookup (variant: PSP only). + Lookup the next segment in IPv6 table T + associated with the SID and forward via + the matched table entry. + The End.T is used for multi-table operation + in the core."; + // TODO: HC2VPP-332 - Uncommented presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + + leaf lookup-table-ipv6 { + type srv6-types:table-id; + mandatory true; + description + "Table Id for lookup on updated DA (next segment)"; + } + } + + + container end-t_usp { + when "../end-behavior-type = 'End.T_USP'" { + description + "This container is valid only when the user chooses + End.T behavior (variant: USP only)."; + } + description + "Endpoint with specific IPv6 table lookup (variant: USP only). + Lookup the next segment in IPv6 table T + associated with the SID and forward via + the matched table entry. + The End.T is used for multi-table operation + in the core."; + // TODO: HC2VPP-332 - Uncommented presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + + leaf lookup-table-ipv6 { + type srv6-types:table-id; + mandatory true; + description + + "Table Id for lookup on updated DA (next segment)"; + } + } + + container end-t_psp_usp { + when "../end-behavior-type = 'End.T_PSP_USP'" { + description + "This container is valid only when the user chooses + End.T behavior (variant: USP/PSP)."; + } + description + "Endpoint with specific IPv6 table lookup (variant: USP/PSP). + Lookup the next segment in IPv6 table T + associated with the SID and forward via + the matched table entry. + The End.T is used for multi-table operation + in the core."; + // TODO: HC2VPP-332 - Uncommented presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + + leaf lookup-table-ipv6 { + type srv6-types:table-id; + mandatory true; + description + "Table Id for lookup on updated DA (next segment)"; + } + } + + container end-x { + when "../end-behavior-type = 'End.X'" { + description + "This container is valid only when the user chooses + End.X behavior (variant: no USP/PSP)"; + } + description + "Endpoint with cross-connect to an array of + layer-3 adjacencies (variant: no USP/PSP). + Forward to layer-3 adjacency bound to the SID S. + The End.X function is required to express any + traffic-engineering policy."; + + leaf protected { + type boolean; + default false; + description "Is Adj-SID protected?"; + } + + uses multi-paths-v6; + + } + + container end-x_psp { + when "../end-behavior-type = 'End.X_PSP'" { + description + "This container is valid only when the user chooses + End.X behavior (variant: PSP only)"; + } + description + "Endpoint with cross-connect to an array of + layer-3 adjacencies (variant: PSP only). + Forward to layer-3 adjacency bound to the SID S. + The End.X function is required to express any + traffic-engineering policy."; + + leaf protected { + type boolean; + default false; + description "Is Adj-SID protected?"; + } + + uses multi-paths-v6; + } + + container end-x_usp { + when "../end-behavior-type = 'End.X_USP'" { + description + "This container is valid only when the user chooses + End.X behavior (variant: USP only)"; + } + description + "Endpoint with cross-connect to an array of + layer-3 adjacencies (variant: USP only). + Forward to layer-3 adjacency bound to the SID S. + The End.X function is required to express any + traffic-engineering policy."; + + leaf protected { + type boolean; + default false; + description "Is Adj-SID protected?"; + } + + uses multi-paths-v6; + } + + container end-x_psp_usp { + when "../end-behavior-type = 'End.X_PSP_USP'" { + + description + "This container is valid only when the user chooses + End.X behavior (variant: PSP/USP)"; + } + description + "Endpoint with cross-connect to an array of + layer-3 adjacencies (variant: PSP/USP). + Forward to layer-3 adjacency bound to the SID S. + The End.X function is required to express any + traffic-engineering policy."; + + leaf protected { + type boolean; + default false; + description "Is Adj-SID protected?"; + } + + uses multi-paths-v6; + } + + + container end-b6 { + when "../end-behavior-type = 'End.B6'" { + description + "This container is valid only when the user chooses + End.B6 behavior."; + } + description + "Endpoint bound to an SRv6 Policy. + Insert SRH based on the policy and forward the + packet toward the first hop configured in the policy. + This is the SRv6 instantiation of a Binding SID."; + // TODO: HC2VPP-332 - Uncommented presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + + leaf policy-name { + type string; + mandatory true; + description "SRv6 policy name."; + } + + uses multi-paths-v6; + } + + container end-b6-encaps { + when "../end-behavior-type = 'End.B6.Encaps'" { + description + "This container is valid only when the user chooses + + End_B6_Encaps behavior."; + } + description + "This is a variation of the End.B6 behavior where + the SRv6 Policy also includes an IPv6 Source + Address. + Insert SRH based on the policy and update the + source IP and forward the packet toward the + first hop configured in the policy. + Instead of simply inserting an SRH with the + policy (End.B6), this behavior also adds an + outer IPv6 header."; + // TODO: HC2VPP-332 - Uncommented presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + + leaf policy-name { + type string; + mandatory true; + description "SRv6 policy name."; + } + leaf source-address { + type inet:ipv6-address; + mandatory true; + description + "IPv6 source address for Encap."; + } + + uses multi-paths-v6; + } + + container end-bm { + when "../end-behavior-type = 'End.BM'" { + description + "This container is valid only when the user chooses + End.BM behavior."; + } + description + "Endpoint bound to an SR-MPLS Policy. + push an MPLS label stack <L1, L2, L3> on the + received packet and forward the according to + Lable L1. + This is an SRv6 instantiation of an SR-MPLS Binding SID."; + // TODO: HC2VPP-332 - Uncommented presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + + leaf policy-name { + type string; + mandatory true; + + description "SRv6 policy name"; + } + uses multi-paths-mpls; + } + + container end-dx6 { + when "../end-behavior-type = 'End.DX6'" { + description + "This container is valid only when the user chooses + End.DX6 behavior."; + } + description + "Endpoint with decapsulation and cross-connect to + an array of IPv6 adjacencies. Pop the (outer) + IPv6 header and its extension headers and forward + to layer-3 adjacency bound to the SID S. + The End.DX6 used in the L3VPN use-case."; + + uses multi-paths-v6; + } + container end-dx4 { + when "../end-behavior-type = 'End.DX4'" { + description + "This container is valid only when the user chooses + End.DX4 behavior."; + } + description + "Endpoint with decapsulation and cross-connect to + an array of IPv4 adjacencies. + Pop the (outer) IPv6 header and its extension + header and forward to layer-3 adjacency bound + to the SID S. + This would be equivalent to the per-CE VPN + label in MPLS."; + + uses multi-paths-v4; + } + container end-dt6 { + when "../end-behavior-type = 'End.DT6'" { + description + "This container is valid only when the user chooses + End.DT6 behavior."; + } + description + "Endpoint with decapsulation and specific IPv6 table + lookup. + Pop the (outer) IPv6 header and its extension + headers. + + Lookup the exposed inner IPv6 DA in IPv6 + table T and forward via the matched table entry. + End.DT6 function is used in L3VPN use-case."; + // TODO: HC2VPP-332 - Uncommented presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + + leaf lookup-table-ipv6 { + type srv6-types:table-id; + mandatory true; + description "IPv6 table"; + } + } + container end-dt4 { + when "../end-behavior-type = 'End.DT4'" { + description + "This container is valid only when the user chooses + End.DT4 behavior."; + } + description + "Endpoint with decapsulation and specific + IPv4 table lookup. + Pop the (outer) IPv6 header and its extension + headers. + Lookup the exposed inner IPv4 DA in IPv4 + table T and forward via the matched table entry. + This would be equivalent to the per-VRF VPN label + in MPLS."; + // TODO: HC2VPP-332 - Uncommented presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + + leaf lookup-table-ipv4 { + type srv6-types:table-id; + mandatory true; + description "IPv4 table"; + } + } + container end-dt46 { + when "../end-behavior-type = 'End.DT46'" { + description + "This container is valid only when the user chooses + End.DT46 behavior."; + } + description + "Endpoint with decapsulation and specific + IP table lookup. + Depending on the protocol type (IPv4 or IPv6) + of the inner ip packet and the specific VRF name + forward the packet. + + This would be equivalent to the per-VRF VPN + label in MPLS."; + // TODO: HC2VPP-332 - Uncommented presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + + leaf lookup-table-ipv4 { + type srv6-types:table-id; + mandatory true; + description "IPv4 table"; + } + leaf lookup-table-ipv6 { + type srv6-types:table-id; + mandatory true; + description "IPv6 table"; + } + } + + container end-dx2 { + when "../end-behavior-type = 'End.DX2'" { + description + "This container is valid only when the user chooses + End.DX2 behavior."; + } + description + "This is an Endpoint with decapsulation and Layer-2 + cross-connect to OIF. + Pop the (outer) IPv6 header and its extension headers. + Forward the resulting frame via OIF associated to the SID. + The End.DX2 function is the L2VPN use-case"; + // TODO: HC2VPP-332 - Added presence in container so mandatory child is enforced + // only when container is present. Caused by Yangtools not enforcing when statement (YANGTOOLS-688). + presence "Mandatory child only if container is present"; + + container paths { + description "List of outgoing paths"; + + leaf interface { + type if:interface-ref; + mandatory true; + description "Layer-2 cross-connect to Out interface."; + } + } + } + /* TODO + container end-dx2v { + when "../end-behavior-type = 'End.DX2V'" { + description + "This container is valid only when the user chooses + End.DX2V behavior."; + } + description + + "Endpoint with decapsulation and specific VLAN + L2 table lookup. + Pop the (outer) IPv6 header + and its extension headers lookup the exposed + inner VLANs in L2 table T forward via the + matched table entry. + The End.DX2V is used for EVPN Flexible cross-connect + use-cases"; + leaf end-dx2v { + type empty; + description + "End_DX2V behavior"; + } + } + container end-dt2u { + when "../end-behavior-type = 'End.DT2U'" { + description + "This container is valid only when the user chooses + End.DT2U behavior."; + } + description + "Endpoint with decapsulation and specific + unicast MAC L2 table lookup. + Pop the (outer) IPv6 header and its extension headers. + Learn the exposed inner MAC SA in L2 table T. + Lookup the exposed inner MAC DA in L2 table T. + Forward via the matched T entry else to all L2OIF in T. + The End.DT2U is used for EVPN Bridging unicast use cases"; + leaf end-dt2u { + type empty; + description + "End_DT2U behavior"; + } + } + container end-dt2m { + when "../end-behavior-type = 'End.DT2M'" { + description + "This container is valid only when the user chooses + End.DT2M behavior."; + } + description + "Endpoint with decapsulation and specific L2 table flooding. + Pop the (outer) IPv6 header and its extension headers. + Learn the exposed inner MAC SA in L2 table T. + Forward on all L2OIF excluding the one specified in Arg.FE2. + The End.DT2M is used for EVPN Bridging BUM use case with + ESI filtering capability."; + leaf end-dt2m { + + type empty; + description + "End_DT2M behavior"; + } + } +*/ + + container end-otp { + when "../end-behavior-type = 'End.OTP'" { + description + "This container is valid only when the user chooses + End.OTP behavior."; + } + description + "Endpoint for OAM with timestamp and punt behavior"; + } + } + + grouping srv6-static-cfg { + description + "Grouping configuration and operation for SRv6 sid."; + + list sid { + key "opcode"; + description "Local SID list"; + + uses srv6-sid-config; + } + } + + augment "/rt:routing/srv6:srv6/srv6:locators/srv6:locator" { + description + "This augments locator leaf withing SRv6."; + + container static { + description "Static SRv6"; + + /* Local SIDs */ + container local-sids { + description + "SRv6-static local-SIDs"; + + uses srv6-static-cfg; + /* no state for now; SID state accessible through base model */ + } + + } + } + +} // module |