From 02b38cabd1f05a9100ae674482e124f5d97a07dc Mon Sep 17 00:00:00 2001 From: Manas Kumar Mandal Date: Fri, 14 Aug 2026 19:48:44 -0700 Subject: [PATCH 1/2] Initial draft EVPN MH HW FRR model Signed-off-by: Manas Kumar Mandal --- doc/tunnel/SAI-Proposal-EVPN-Multihoming.md | 282 +++++++++++++++++- doc/tunnel/figures/sai_evpnmh_hw_frr_flow.png | Bin 0 -> 27046 bytes .../figures/sai_evpnmh_hw_frr_model.png | Bin 0 -> 61040 bytes inc/saibridge.h | 122 ++++++++ inc/saiswitch.h | 9 + inc/saitunnel.h | 13 + 6 files changed, 421 insertions(+), 5 deletions(-) create mode 100644 doc/tunnel/figures/sai_evpnmh_hw_frr_flow.png create mode 100644 doc/tunnel/figures/sai_evpnmh_hw_frr_model.png diff --git a/doc/tunnel/SAI-Proposal-EVPN-Multihoming.md b/doc/tunnel/SAI-Proposal-EVPN-Multihoming.md index 282367091..eec16c5ef 100644 --- a/doc/tunnel/SAI-Proposal-EVPN-Multihoming.md +++ b/doc/tunnel/SAI-Proposal-EVPN-Multihoming.md @@ -24,6 +24,7 @@ - [4.3 DF Workflow](#43-df-workflow) - [4.4 Fast failover workflow](#44-fast-failover-workflow) - [4.5 Single Active Redundancy workflow](#45-single-active-redundancy-workflow) + - [4.6 Hardware fast reroute workflow](#46-hardware-fast-reroute-workflow) # Revision @@ -32,6 +33,7 @@ | ---- | --------- | ------------------------------------------------ | ------------------ | | 0.1 | Sep 23' 2024 | Jai Kumar, Rajesh Sankaran | Initial draft | | 0.2 | Oct 23' 2024 | Rajesh Sankaran | Changed DF, single active attributes | +| 0.3 | Aug 14' 2026 | Manas Kumar Mandal | Added hardware-based fast reroute (protection mode, protection state, switchover notification) for L3VNI routed traffic to a cross-switch multihomed bridge port | # 1.0 Introduction @@ -64,6 +66,7 @@ The scope of this document is EVPN MH support for VxLAN networks. 6. It shall be possible to implement the split horizon functionality as described in RFC 7432. 8. It shall be possible to implement single active redundancy mode as described in RFC 7432. 7. It shall be possible to implement a fast failover in the event of an ES going down. +9. It shall be possible for the hardware to autonomously reroute traffic - including L3VNI routed traffic whose next hop resolves to a locally attached, cross-switch multihomed ES/bridge port - to an ECMP group of remote VTEPs upon primary path failure, without waiting on control plane intervention, and to notify the control plane once the switchover has been committed in hardware. # 3.0 EVPN-MH SAI Components @@ -312,6 +315,206 @@ typedef enum _sai_vlan_member_attr_t ``` +### 3.2.6 Hardware Fast ReRoute (FRR) support + +Section 3.2.4 describes a control-plane-driven ("software") switchover: the NOS detects that an Ethernet Segment (ES) +went down and explicitly sets `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER` to redirect traffic to the +protection next hop group. + +This is extended here to cover the case where a packet is *routed* (e.g. an L3VNI/symmetric-IRB lookup) to a host +reachable over a bridge port that represents an ES which is multihomed across switches (i.e. the same ES/LAG is +also present on one or more remote PEs). When the local ES/bridge port goes down, the hardware itself - without +waiting for control-plane intervention - reroutes the routed traffic to a next hop group of remote VTEPs (an ECMP +group of VXLAN tunnels towards the other PEs of the ES), the same protection next hop group already introduced in +3.2.4. The NOS is notified asynchronously once the switchover has been committed, so it can reconcile control-plane +state (e.g. re-advertise/withdraw EVPN routes) after the fact instead of driving the switchover itself. + +![SAI Object Model - Hardware Fast ReRoute of Routed Traffic](figures/sai_evpnmh_hw_frr_model.png "Figure 1: SAI Object Model - Hardware Fast ReRoute of Routed Traffic") +__Figure 1: SAI Object Model - Hardware Fast ReRoute of Routed Traffic__ + +The route lookup resolves to a RIF/neighbor pair, which in turn resolves to the primary bridge port (`SAI_BRIDGE_PORT_TYPE_PORT`) +for the ES. That bridge port carries `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE` and +`SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_NEXT_HOP_GROUP_ID`, pointing to a `SAI_NEXT_HOP_GROUP_TYPE_BRIDGE_PORT` +next hop group whose members (one per remote PE of the ES) are `SAI_NEXT_HOP_TYPE_BRIDGE_PORT` next hops resolving +through VXLAN tunnels. On primary path failure, hardware redirects the already-resolved route/neighbor traffic to +this next hop group without a new route lookup. + +The route/neighbor DMAC resolved for the (now down) primary bridge port does not apply once traffic is redirected to +a remote-VTEP tunnel. A new tunnel attribute supplies the inner destination MAC to use for routed traffic +encapsulated by a P2P VXLAN tunnel, defaulting to the switch-wide VXLAN router MAC. It follows the same split SAI +already applies to the tunnel destination IP: a P2P tunnel terminates on exactly one remote PE, so the value belongs +on the tunnel alongside `SAI_TUNNEL_ATTR_ENCAP_DST_IP`, whereas a P2MP tunnel is shared by multiple next hops that +each carry their own destination in `SAI_NEXT_HOP_ATTR_IP` and their own inner destination MAC in +`SAI_NEXT_HOP_ATTR_TUNNEL_MAC`. The two attributes are therefore complementary, selected by +`SAI_TUNNEL_ATTR_PEER_MODE`, rather than two overlapping ways to set the same field. The tunnels used here are P2P, +one per remote PE of the ES, so the tunnel attribute applies. + +``` +typedef enum _sai_tunnel_attr_t +{ +... + /** + * @brief VXLAN tunnel MAC + * + * Inner destination MAC used for routed packets encapsulated by this + * P2P VXLAN tunnel. + * + * @type sai_mac_t + * @flags CREATE_AND_SET + * @default attrvalue SAI_SWITCH_ATTR_VXLAN_DEFAULT_ROUTER_MAC + * @validonly SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_VXLAN and SAI_TUNNEL_ATTR_PEER_MODE == SAI_TUNNEL_PEER_MODE_P2P + */ + SAI_TUNNEL_ATTR_VXLAN_TUNNEL_MAC, +... +} +``` + +A new attribute controls whether the switchover for a bridge port is driven by software (existing behavior, default) +or autonomously by hardware, and if by hardware, whether it automatically reverts to the primary path once it +recovers. + +``` +typedef enum _sai_bridge_port_protection_mode_t +{ + /** Software switchover. Control plane determines the switchover behavior */ + SAI_BRIDGE_PORT_PROTECTION_MODE_SOFTWARE, + + /** Hardware switchover. Switches back to the bridge port once it recovers */ + SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE, + + /** Hardware switchover. Does not switch back to the bridge port once it recovers */ + SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE_NON_REVERTIVE, + +} sai_bridge_port_protection_mode_t; + +typedef enum _sai_bridge_port_attr_t +{ +... + /** + * @brief Protection switchover mode + * + * Applies only when SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_NEXT_HOP_GROUP_ID + * is set; otherwise the value is ignored. + * + * @type sai_bridge_port_protection_mode_t + * @flags CREATE_AND_SET + * @default SAI_BRIDGE_PORT_PROTECTION_MODE_SOFTWARE + * @validonly SAI_BRIDGE_PORT_ATTR_TYPE == SAI_BRIDGE_PORT_TYPE_PORT + */ + SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE, +... +} +``` + +The companion proposal `doc/SAI-Proposal-HW-FRR.md` signals hardware-managed protection differently, by giving the +backup group the type `SAI_NEXT_HOP_GROUP_TYPE_HW_PROTECTION` within an enclosing +`SAI_NEXT_HOP_GROUP_TYPE_PROTECTION` group. That works there because both the primary and the backup are next hop +groups, so the pair has a containing object whose type can carry the hint. In the case described here the primary +path is the bridge port itself rather than a next hop group member, and the bridge port is the only object that sees +both sides of the pair, so the policy is expressed as an attribute on it. The type slot of the protection group is +in any case unavailable: it must be `SAI_NEXT_HOP_GROUP_TYPE_BRIDGE_PORT` (3.2.1) in order to hold +`SAI_NEXT_HOP_TYPE_BRIDGE_PORT` members, and the two values are mutually exclusive in the same enum. An attribute is +also the better operational fit, since `SAI_NEXT_HOP_GROUP_ATTR_TYPE` is `CREATE_ONLY` - a type-based hint could not +be moved between software and hardware control at run time - and a single type value could not carry the +revertive/non-revertive distinction without a separate group type per combination. + +A read-only attribute reports which path (primary bridge port or protection next hop group) is currently committed +in hardware, under either protection mode: + +``` +typedef enum _sai_bridge_port_protection_state_t +{ + /** Primary path is committed in hardware */ + SAI_BRIDGE_PORT_PROTECTION_STATE_PRIMARY, + + /** Protection path is committed in hardware */ + SAI_BRIDGE_PORT_PROTECTION_STATE_PROTECTION, + +} sai_bridge_port_protection_state_t; + +typedef enum _sai_bridge_port_attr_t +{ +... + /** + * @brief Protection switchover state + * + * Path currently committed in hardware. Valid only for + * SAI_BRIDGE_PORT_TYPE_PORT; otherwise, or when no protection next hop + * group is associated, returns SAI_BRIDGE_PORT_PROTECTION_STATE_PRIMARY. + * + * @type sai_bridge_port_protection_state_t + * @flags READ_ONLY + */ + SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE, +... +} +``` + +Finally, a notification callback informs the NOS whenever hardware commits a switchover, so that the control plane +can reconcile its state instead of having to poll `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE`. A +notification is emitted after the data plane selection is committed; a +`SAI_BRIDGE_PORT_PROTECTION_EVENT_SWITCHOVER_FAILED` notification reports the unchanged +authoritative `current_state`. Notifications are advisory - `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE` +remains the source of truth. A hardware-origin timestamp is left out for now, pending SAI defining a clock contract. + +Notifications cover hardware-initiated transitions only. A switchover the NOS requests through +`SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER` reports its outcome synchronously in the return status of +`set_bridge_port_attribute()`, and the resulting path is readable immediately from +`SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE`, so no asynchronous event is needed for that case. + +``` +typedef enum _sai_bridge_port_protection_event_t +{ + /** Primary path failed */ + SAI_BRIDGE_PORT_PROTECTION_EVENT_PRIMARY_FAILURE, + + /** Primary path recovered */ + SAI_BRIDGE_PORT_PROTECTION_EVENT_PRIMARY_RECOVERY, + + /** Switchover attempt failed. Committed state is unchanged */ + SAI_BRIDGE_PORT_PROTECTION_EVENT_SWITCHOVER_FAILED, + +} sai_bridge_port_protection_event_t; + +typedef struct _sai_bridge_port_hw_protection_switchover_notification_data_t +{ + /** @objects SAI_OBJECT_TYPE_BRIDGE_PORT */ + sai_object_id_t bridge_port_id; + + /** Protection state before the switchover */ + sai_bridge_port_protection_state_t previous_state; + + /** Protection state after the switchover */ + sai_bridge_port_protection_state_t current_state; + + /** Reason for the switchover */ + sai_bridge_port_protection_event_t reason; + +} sai_bridge_port_hw_protection_switchover_notification_data_t; + +typedef void (*sai_bridge_port_hw_protection_switchover_notification_fn)( + _In_ uint32_t count, + _In_ const sai_bridge_port_hw_protection_switchover_notification_data_t *events); +``` + +The callback is registered as a switch attribute, mirroring the existing next hop group HW protection notification +(`SAI_SWITCH_ATTR_NEXT_HOP_GROUP_HW_PROTECTION_SWITCHOVER_NOTIFY`): + +``` +typedef enum _sai_switch_attr_t +{ +... + /** + * @brief Bridge port HW protection switchover notification callback function passed to the adapter. + * + * @type sai_pointer_t sai_bridge_port_hw_protection_switchover_notification_fn + * @flags CREATE_AND_SET + * @default NULL + */ + SAI_SWITCH_ATTR_BRIDGE_PORT_HW_PROTECTION_SWITCHOVER_NOTIFY, +... +} +``` # 4.0 Sample Workflow @@ -321,7 +524,7 @@ This section describes the SAI object usage for different EVPN MH scenarios. ## 4.1 Known Unicast workflow ![EVPN Multihoming](figures/sai_evpnmh_unicast.png "Figure 1: Known Unicast Packet Flow") -__Figure 1: Known Unicast Packet Flow__ +__Figure 2: Known Unicast Packet Flow__ At VTEP5 the following objects are created. @@ -491,7 +694,7 @@ At VTEP5 the following objects are created. PR. It is being elaborated here for completeness. ![EVPN Multihoming](figures/sai_evpnmh_splithorizon.png "Figure 1: Split Horizon") -__Figure 2: Split Horizon Flow__ +__Figure 3: Split Horizon Flow__ At VTEP1 the following SAI objects with sub types are created. @@ -544,7 +747,7 @@ __Figure 2: Split Horizon Flow__ ## 4.3 DF workflow ![EVPN Multihoming](figures/sai_evpnmh_df.png "Figure 1: Designated Forwarder") -__Figure 3: Designated Forwarder Flow__ +__Figure 4: Designated Forwarder Flow__ - DF settings - At VTEP1 lag_bp_oid for LAG is marked as NON_DF. @@ -563,7 +766,7 @@ __Figure 3: Designated Forwarder Flow__ ## 4.4 Fast Failover workflow ![EVPN Multihoming](figures/sai_evpnmh_failover.png "Figure 1: Failover") -__Figure 4: Failover Flow__ +__Figure 5: Failover Flow__ At VTEP1, the following objects are created. @@ -595,7 +798,7 @@ At VTEP1, the following objects are created. ## 4.5 Single Active Redundancy workflow ![EVPN Multihoming](figures/sai_evpnmh_singleactive.png "Figure 1: Single Active redundancy") -__Figure 5: Single Active Redundancy Flow__ +__Figure 6: Single Active Redundancy Flow__ - Bridgeport settings to achieve single active redundancy @@ -615,7 +818,76 @@ __Figure 5: Single Active Redundancy Flow__ ``` +## 4.6 Hardware fast reroute workflow + +This workflow illustrates the case introduced in 3.2.6: LAG-1, the ES connecting to the dual/multi-homed CE, is +present on both VTEP1 and VTEP4 (i.e. the bridge port representing LAG-1 is multihomed across switches). A packet +routed at VTEP1 (e.g. an L3VNI/symmetric-IRB lookup) resolves its next hop to a host attached over `bp_lag_oid_1`. +If LAG-1 goes down locally on VTEP1, hardware alone reroutes that routed traffic to VTEP4 over the VXLAN fabric, +without waiting for the NOS to detect the failure and reprogram anything. + +![Hardware Fast ReRoute Flow](figures/sai_evpnmh_hw_frr_flow.png "Figure 7: Hardware Fast ReRoute Flow") +__Figure 7: Hardware Fast ReRoute Flow__ + +At VTEP1, the following objects are created. + + - `bp_lag_oid_1` of type `SAI_BRIDGE_PORT_TYPE_PORT` for the local LAG-1 attachment of the ES. + + - Tunnel, next hop, and next hop group objects towards VTEP4 (the other PE for this ES), as described in 4.1 for + known unicast, yielding `nh_grp_oid_2` of type `SAI_NEXT_HOP_GROUP_TYPE_BRIDGE_PORT`. + + - The protection next hop group, protection mode, and (at switch init) the switchover notification callback are + set on `bp_lag_oid_1`: + +``` + sai_attribute_t attr; + + attr.id = SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_NEXT_HOP_GROUP_ID; + attr.value.oid = nh_grp_oid_2; + status = sai_bridge_api->set_bridge_port_attribute(bp_lag_oid_1, &attr); + + attr.id = SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE; + attr.value.s32 = SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE; /* or _HARDWARE_NON_REVERTIVE */ + status = sai_bridge_api->set_bridge_port_attribute(bp_lag_oid_1, &attr); + + /* Registered once, at switch initialization */ + sai_attribute_t switch_attr; + switch_attr.id = SAI_SWITCH_ATTR_BRIDGE_PORT_HW_PROTECTION_SWITCHOVER_NOTIFY; + switch_attr.value.ptr = (void *)on_bridge_port_hw_protection_switchover; + status = sai_switch_api->set_switch_attribute(gSwitchId, &switch_attr); + +``` + + - When LAG-1 fails, the ASIC autonomously commits the switchover to `nh_grp_oid_2` and invokes the registered + callback. The NOS treats the notification as advisory and reconciles by reading back + `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE` (e.g. before updating EVPN route advertisements for the ES). + +``` + void on_bridge_port_hw_protection_switchover( + uint32_t count, + const sai_bridge_port_hw_protection_switchover_notification_data_t *events) + { + for (uint32_t i = 0; i < count; i++) + { + /* events[i].bridge_port_id == bp_lag_oid_1 + * events[i].previous_state == SAI_BRIDGE_PORT_PROTECTION_STATE_PRIMARY + * events[i].current_state == SAI_BRIDGE_PORT_PROTECTION_STATE_PROTECTION + * events[i].reason == SAI_BRIDGE_PORT_PROTECTION_EVENT_PRIMARY_FAILURE + */ + + sai_attribute_t attr; + attr.id = SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE; + sai_bridge_api->get_bridge_port_attribute(events[i].bridge_port_id, 1, &attr); + /* reconcile control-plane state against attr.value.s32 */ + } + } + +``` + - If `SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE` was used and LAG-1 recovers, hardware automatically reverts and a + second notification is delivered with `reason == SAI_BRIDGE_PORT_PROTECTION_EVENT_PRIMARY_RECOVERY`. With + `SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE_NON_REVERTIVE`, the traffic stays on `nh_grp_oid_2` until the NOS + explicitly reverts it (e.g. via `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER`). diff --git a/doc/tunnel/figures/sai_evpnmh_hw_frr_flow.png b/doc/tunnel/figures/sai_evpnmh_hw_frr_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..52bfb67b18d37577d9f428cb7f67cf61910b5eb7 GIT binary patch literal 27046 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 P(6Np5jgJ-RIo|v)!~IEJ literal 0 HcmV?d00001 diff --git a/doc/tunnel/figures/sai_evpnmh_hw_frr_model.png b/doc/tunnel/figures/sai_evpnmh_hw_frr_model.png new file mode 100644 index 0000000000000000000000000000000000000000..275df94a8126e78a139beab8dbc1243883f0c662 GIT binary patch literal 61040 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 UvTgEL2I?V-a%!>_(iWlr183S>UjP6A literal 0 HcmV?d00001 diff --git a/inc/saibridge.h b/inc/saibridge.h index 342efd7c0..58441069c 100644 --- a/inc/saibridge.h +++ b/inc/saibridge.h @@ -104,6 +104,89 @@ typedef enum _sai_bridge_port_tagging_mode_t } sai_bridge_port_tagging_mode_t; +/** + * @brief Attribute data for #SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE + */ +typedef enum _sai_bridge_port_protection_mode_t +{ + /** Software switchover. Control plane determines the switchover behavior */ + SAI_BRIDGE_PORT_PROTECTION_MODE_SOFTWARE, + + /** Hardware switchover. Switches back to the bridge port once it recovers */ + SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE, + + /** Hardware switchover. Does not switch back to the bridge port once it recovers */ + SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE_NON_REVERTIVE, + +} sai_bridge_port_protection_mode_t; + +/** + * @brief Attribute data for #SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE + */ +typedef enum _sai_bridge_port_protection_state_t +{ + /** Primary path is committed in hardware */ + SAI_BRIDGE_PORT_PROTECTION_STATE_PRIMARY, + + /** Protection path is committed in hardware */ + SAI_BRIDGE_PORT_PROTECTION_STATE_PROTECTION, + +} sai_bridge_port_protection_state_t; + +/** + * @brief Defines the reason for a bridge port HW protection switchover + * + * Reported only for hardware-initiated transitions. A switchover requested + * through #SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER reports its + * outcome synchronously and raises no notification. + */ +typedef enum _sai_bridge_port_protection_event_t +{ + /** Primary path failed */ + SAI_BRIDGE_PORT_PROTECTION_EVENT_PRIMARY_FAILURE, + + /** Primary path recovered */ + SAI_BRIDGE_PORT_PROTECTION_EVENT_PRIMARY_RECOVERY, + + /** Switchover attempt failed. Committed state is unchanged */ + SAI_BRIDGE_PORT_PROTECTION_EVENT_SWITCHOVER_FAILED, + +} sai_bridge_port_protection_event_t; + +/** + * @brief Defines the bridge port HW protection switchover status + * + * A notification is emitted after the data plane selection is committed. A + * SAI_BRIDGE_PORT_PROTECTION_EVENT_SWITCHOVER_FAILED notification reports the + * unchanged authoritative current_state. Notifications are advisory; the NOS + * shall reconcile with #SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE. + */ +typedef struct _sai_bridge_port_hw_protection_switchover_notification_data_t +{ + /** + * @brief Bridge port id + * + * @objects SAI_OBJECT_TYPE_BRIDGE_PORT + */ + sai_object_id_t bridge_port_id; + + /** + * @brief Protection state before the switchover + */ + sai_bridge_port_protection_state_t previous_state; + + /** + * @brief Protection state after the switchover + */ + sai_bridge_port_protection_state_t current_state; + + /** + * @brief Reason for the switchover + */ + sai_bridge_port_protection_event_t reason; + +} sai_bridge_port_hw_protection_switchover_notification_data_t; + /** * @brief SAI attributes for Bridge Port */ @@ -354,6 +437,31 @@ typedef enum _sai_bridge_port_attr_t */ SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER, + /** + * @brief Protection switchover mode + * + * Applies only when SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_NEXT_HOP_GROUP_ID + * is set; otherwise the value is ignored. + * + * @type sai_bridge_port_protection_mode_t + * @flags CREATE_AND_SET + * @default SAI_BRIDGE_PORT_PROTECTION_MODE_SOFTWARE + * @validonly SAI_BRIDGE_PORT_ATTR_TYPE == SAI_BRIDGE_PORT_TYPE_PORT + */ + SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE, + + /** + * @brief Protection switchover state + * + * Path currently committed in hardware. Valid only for + * SAI_BRIDGE_PORT_TYPE_PORT; otherwise, or when no protection next hop + * group is associated, returns SAI_BRIDGE_PORT_PROTECTION_STATE_PRIMARY. + * + * @type sai_bridge_port_protection_state_t + * @flags READ_ONLY + */ + SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE, + /** * @brief End of attributes */ @@ -486,6 +594,20 @@ typedef sai_status_t (*sai_clear_bridge_port_stats_fn)( _In_ uint32_t number_of_counters, _In_ const sai_stat_id_t *counter_ids); +/** + * @brief Bridge port HW protection switchover notification callback + * + * Passed as a parameter into sai_initialize_switch(). + * + * @count events[count] + * + * @param[in] count Number of notifications + * @param[in] events Array of notification data + */ +typedef void (*sai_bridge_port_hw_protection_switchover_notification_fn)( + _In_ uint32_t count, + _In_ const sai_bridge_port_hw_protection_switchover_notification_data_t *events); + /** * @brief Attribute data for #SAI_BRIDGE_ATTR_TYPE */ diff --git a/inc/saiswitch.h b/inc/saiswitch.h index d3f8edeb6..ff21072c7 100644 --- a/inc/saiswitch.h +++ b/inc/saiswitch.h @@ -3652,6 +3652,15 @@ typedef enum _sai_switch_attr_t */ SAI_SWITCH_ATTR_TAM_EVENT_LEARN_NOTIFY, + /** + * @brief Bridge port HW protection switchover notification callback function passed to the adapter. + * + * @type sai_pointer_t sai_bridge_port_hw_protection_switchover_notification_fn + * @flags CREATE_AND_SET + * @default NULL + */ + SAI_SWITCH_ATTR_BRIDGE_PORT_HW_PROTECTION_SWITCHOVER_NOTIFY, + /** * @brief End of attributes */ diff --git a/inc/saitunnel.h b/inc/saitunnel.h index 11b0158bc..84af69b34 100644 --- a/inc/saitunnel.h +++ b/inc/saitunnel.h @@ -825,6 +825,19 @@ typedef enum _sai_tunnel_attr_t */ SAI_TUNNEL_ATTR_SELECTIVE_COUNTER_LIST, + /** + * @brief VXLAN tunnel MAC + * + * Inner destination MAC used for routed packets encapsulated by this + * P2P VXLAN tunnel. + * + * @type sai_mac_t + * @flags CREATE_AND_SET + * @default attrvalue SAI_SWITCH_ATTR_VXLAN_DEFAULT_ROUTER_MAC + * @validonly SAI_TUNNEL_ATTR_TYPE == SAI_TUNNEL_TYPE_VXLAN and SAI_TUNNEL_ATTR_PEER_MODE == SAI_TUNNEL_PEER_MODE_P2P + */ + SAI_TUNNEL_ATTR_VXLAN_TUNNEL_MAC, + /** * @brief End of attributes */ From 8eb3bd92dd35db8f07b65253b5b3be32bc871373 Mon Sep 17 00:00:00 2001 From: Manas Kumar Mandal Date: Thu, 20 Aug 2026 15:20:42 -0700 Subject: [PATCH 2/2] Addressed comments, added admin_mode Signed-off-by: Manas Kumar Mandal --- doc/tunnel/SAI-Proposal-EVPN-Multihoming.md | 254 +++++++++++++++--- doc/tunnel/figures/sai_evpnmh_hw_frr_flow.png | Bin 27046 -> 27280 bytes inc/saibridge.h | 95 ++++++- 3 files changed, 310 insertions(+), 39 deletions(-) diff --git a/doc/tunnel/SAI-Proposal-EVPN-Multihoming.md b/doc/tunnel/SAI-Proposal-EVPN-Multihoming.md index eec16c5ef..3817ed299 100644 --- a/doc/tunnel/SAI-Proposal-EVPN-Multihoming.md +++ b/doc/tunnel/SAI-Proposal-EVPN-Multihoming.md @@ -2,7 +2,7 @@ ------------------------------------------------------------------------------- Title | SAI support for EVPN VxLAN Multihoming -------------|----------------------------------------------------------------- - Authors | Jai Kumar, Rajesh Sankaran, Broadcom Inc. + Authors | Jai Kumar, Rajesh Sankaran, Broadcom Inc.
Manas Kumar Mandal, Cisco Inc. Status | In review Type | Standards track SAI-Version | 1.16 @@ -243,6 +243,10 @@ typedef enum _sai_bridge_port_attr_t } ``` +`SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER` is deprecated by +`SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_ADMIN_MODE` in 3.2.6, which expresses the same request and can also +hold the traffic on the bridge port. It remains supported for existing implementations. + ### 3.2.5 Single Active Redundancy Mode support Single Active redundancy mode requires unicast and BUM traffic to be dropped in the ingress and egress directions @@ -318,8 +322,8 @@ typedef enum _sai_vlan_member_attr_t ### 3.2.6 Hardware Fast ReRoute (FRR) support Section 3.2.4 describes a control-plane-driven ("software") switchover: the NOS detects that an Ethernet Segment (ES) -went down and explicitly sets `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER` to redirect traffic to the -protection next hop group. +went down and explicitly requests, through `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER`, that traffic be +redirected to the protection next hop group. This is extended here to cover the case where a packet is *routed* (e.g. an L3VNI/symmetric-IRB lookup) to a host reachable over a bridge port that represents an ES which is multihomed across switches (i.e. the same ES/LAG is @@ -370,8 +374,14 @@ typedef enum _sai_tunnel_attr_t ``` A new attribute controls whether the switchover for a bridge port is driven by software (existing behavior, default) -or autonomously by hardware, and if by hardware, whether it automatically reverts to the primary path once it -recovers. +or autonomously by hardware. Recovery behavior is set separately, through its own attributes, so the mode says only +which side picks the path and does not need a value for every combination. + +In hardware mode the switchover starts when the adapter decides the bridge port can no longer forward traffic. This +is the qualified failure, and the switchover time is measured from it. Link event debounce and damping controls, +such as `SAI_PORT_ATTR_LINK_UP_DEBOUNCE_TIMEOUT` or damping applied above the adapter, only delay the link status +reported to the NOS; they do not delay the hardware. If either is configured on a member port of the ES, hardware +can move the traffic to the protection path before the NOS sees the bridge port go down. ``` typedef enum _sai_bridge_port_protection_mode_t @@ -379,12 +389,9 @@ typedef enum _sai_bridge_port_protection_mode_t /** Software switchover. Control plane determines the switchover behavior */ SAI_BRIDGE_PORT_PROTECTION_MODE_SOFTWARE, - /** Hardware switchover. Switches back to the bridge port once it recovers */ + /** Hardware switchover. Hardware selects the path autonomously */ SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE, - /** Hardware switchover. Does not switch back to the bridge port once it recovers */ - SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE_NON_REVERTIVE, - } sai_bridge_port_protection_mode_t; typedef enum _sai_bridge_port_attr_t @@ -402,6 +409,26 @@ typedef enum _sai_bridge_port_attr_t * @validonly SAI_BRIDGE_PORT_ATTR_TYPE == SAI_BRIDGE_PORT_TYPE_PORT */ SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE, + + /** + * @brief Revert to the bridge port once it recovers + * + * @type bool + * @flags CREATE_AND_SET + * @default true + * @validonly SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE == SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE + */ + SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_REVERTIVE, + + /** + * @brief Wait to restore time in milliseconds + * + * @type sai_uint32_t + * @flags CREATE_AND_SET + * @default 0 + * @validonly SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_REVERTIVE == true + */ + SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_WAIT_TO_RESTORE_TIME, ... } ``` @@ -415,11 +442,13 @@ both sides of the pair, so the policy is expressed as an attribute on it. The ty in any case unavailable: it must be `SAI_NEXT_HOP_GROUP_TYPE_BRIDGE_PORT` (3.2.1) in order to hold `SAI_NEXT_HOP_TYPE_BRIDGE_PORT` members, and the two values are mutually exclusive in the same enum. An attribute is also the better operational fit, since `SAI_NEXT_HOP_GROUP_ATTR_TYPE` is `CREATE_ONLY` - a type-based hint could not -be moved between software and hardware control at run time - and a single type value could not carry the -revertive/non-revertive distinction without a separate group type per combination. +be moved between software and hardware control at run time - and a single type value could not carry the recovery +policy attributes without a separate group type per combination. A read-only attribute reports which path (primary bridge port or protection next hop group) is currently committed -in hardware, under either protection mode: +in hardware, under either protection mode. A third value covers the bridge ports for which protection is not +configured or not applicable, so that a NOS reconciling after a missed notification can tell an unconfigured bridge +port from one that is healthy on its primary path: ``` typedef enum _sai_bridge_port_protection_state_t @@ -430,6 +459,9 @@ typedef enum _sai_bridge_port_protection_state_t /** Protection path is committed in hardware */ SAI_BRIDGE_PORT_PROTECTION_STATE_PROTECTION, + /** Protection is not configured or not applicable for this bridge port */ + SAI_BRIDGE_PORT_PROTECTION_STATE_NOT_APPLICABLE, + } sai_bridge_port_protection_state_t; typedef enum _sai_bridge_port_attr_t @@ -438,9 +470,10 @@ typedef enum _sai_bridge_port_attr_t /** * @brief Protection switchover state * - * Path currently committed in hardware. Valid only for - * SAI_BRIDGE_PORT_TYPE_PORT; otherwise, or when no protection next hop - * group is associated, returns SAI_BRIDGE_PORT_PROTECTION_STATE_PRIMARY. + * Path currently committed in hardware. Returns + * SAI_BRIDGE_PORT_PROTECTION_STATE_NOT_APPLICABLE when the bridge port type + * is not SAI_BRIDGE_PORT_TYPE_PORT, or when no protection next hop group is + * associated. * * @type sai_bridge_port_protection_state_t * @flags READ_ONLY @@ -450,6 +483,65 @@ typedef enum _sai_bridge_port_attr_t } ``` +The path also has to be pinnable administratively, for maintenance and for operator-driven traffic placement, and +the hardware selection must not override that intent. A boolean cannot express it, because it has no value meaning +"no override in effect" and therefore cannot distinguish holding the traffic on the bridge port from leaving the +choice to hardware. An administrative mode attribute carries the three states explicitly and supersedes the +existing `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER`, which is marked deprecated rather than removed since it +is already released. For compatibility, setting the deprecated attribute to true is equivalent to forcing the +traffic onto the protection next hop group, and setting it to false is equivalent to returning to automatic +selection. + +``` +typedef enum _sai_bridge_port_protection_admin_mode_t +{ + /** No administrative override. Path is selected per the protection mode */ + SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_AUTO, + + /** Force the traffic onto the bridge port. Protection is locked out */ + SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_PRIMARY, + + /** Force the traffic onto the protection next hop group */ + SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_PROTECTION, + +} sai_bridge_port_protection_admin_mode_t; + +typedef enum _sai_bridge_port_attr_t +{ +... + /** + * @brief Administrative override of the protection path + * + * @type sai_bridge_port_protection_admin_mode_t + * @flags CREATE_AND_SET + * @default SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_AUTO + * @validonly SAI_BRIDGE_PORT_ATTR_TYPE == SAI_BRIDGE_PORT_TYPE_PORT + */ + SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_ADMIN_MODE, +... +} +``` + +While an override is in effect the committed path does not follow bridge port failure or recovery and no switchover +notification is raised, so operator intent is not silently undone by hardware. The outcome is reported +synchronously in the return status of `set_bridge_port_attribute()`, and requesting +`SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_PROTECTION` when no protection next hop group is associated returns +`SAI_STATUS_INVALID_PARAMETER`. Returning to `SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_AUTO` releases the override and +selection resumes from the committed path. +This also supplies the recovery step for the non-revertive case: with +`SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_REVERTIVE` set to false, the NOS forces the bridge port once it is +healthy again and then returns to automatic, which moves the traffic back and arms the hardware selection for the +next failure. + +Support is discovered through the standard SAI capability queries, so no new switch attribute is required. +`sai_query_attribute_enum_values_capability()` on `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE` returns the +modes the ASIC implements, and the NOS configures hardware switchover only when +`SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE` is among them; the same call on +`SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_ADMIN_MODE` reports which administrative overrides are available. For +the remaining attributes `sai_query_attribute_capability()` reports whether they are implemented, and an adapter +that cannot keep the traffic on the protection path after the bridge port recovers fails a set of +`SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_REVERTIVE` to false with `SAI_STATUS_NOT_SUPPORTED`. + Finally, a notification callback informs the NOS whenever hardware commits a switchover, so that the control plane can reconcile its state instead of having to poll `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE`. A notification is emitted after the data plane selection is committed; a @@ -457,10 +549,10 @@ notification is emitted after the data plane selection is committed; a authoritative `current_state`. Notifications are advisory - `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE` remains the source of truth. A hardware-origin timestamp is left out for now, pending SAI defining a clock contract. -Notifications cover hardware-initiated transitions only. A switchover the NOS requests through -`SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER` reports its outcome synchronously in the return status of -`set_bridge_port_attribute()`, and the resulting path is readable immediately from -`SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE`, so no asynchronous event is needed for that case. +Notifications cover hardware-initiated transitions only. A path the NOS selects administratively, as described +below, reports its outcome synchronously in the return status of `set_bridge_port_attribute()`, and the resulting +path is readable immediately from `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE`, so no asynchronous event is +needed for that case. ``` typedef enum _sai_bridge_port_protection_event_t @@ -785,11 +877,16 @@ At VTEP1, the following objects are created. attr.value.oid = nhg_oid; status = sai_bridge_api->set_bridge_port_attribute(bp_lag_oid, &attr); - To effect the failover, + To effect the failover, using the attribute deprecated in 3.2.6, attr.id = SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER; att.value.booldata = true; /* false to revert to the primary LAG */ status = sai_bridge_api->set_bridge_port_attribute(bp_lag_oid, &attr); + or equivalently, + attr.id = SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_ADMIN_MODE; + attr.value.s32 = SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_PROTECTION; + status = sai_bridge_api->set_bridge_port_attribute(bp_lag_oid, &attr); + ``` - FDB Entry set to point to the bp_lag_oid @@ -820,11 +917,11 @@ __Figure 6: Single Active Redundancy Flow__ ## 4.6 Hardware fast reroute workflow -This workflow illustrates the case introduced in 3.2.6: LAG-1, the ES connecting to the dual/multi-homed CE, is -present on both VTEP1 and VTEP4 (i.e. the bridge port representing LAG-1 is multihomed across switches). A packet -routed at VTEP1 (e.g. an L3VNI/symmetric-IRB lookup) resolves its next hop to a host attached over `bp_lag_oid_1`. -If LAG-1 goes down locally on VTEP1, hardware alone reroutes that routed traffic to VTEP4 over the VXLAN fabric, -without waiting for the NOS to detect the failure and reprogram anything. +This workflow illustrates the case introduced in 3.2.6: LAG-1, the ES connecting to the multihomed CE, is present +on VTEP1 and on the remote PEs VTEP2 to VTEP5 (i.e. the bridge port representing LAG-1 is multihomed across +switches). A packet routed at VTEP1 (e.g. an L3VNI/symmetric-IRB lookup) resolves its next hop to a host attached +over `bp_lag_oid_1`. If LAG-1 goes down locally on VTEP1, hardware alone reroutes that routed traffic over the +VXLAN fabric to the remaining PEs, without waiting for the NOS to detect the failure and reprogram anything. ![Hardware Fast ReRoute Flow](figures/sai_evpnmh_hw_frr_flow.png "Figure 7: Hardware Fast ReRoute Flow") __Figure 7: Hardware Fast ReRoute Flow__ @@ -833,8 +930,87 @@ At VTEP1, the following objects are created. - `bp_lag_oid_1` of type `SAI_BRIDGE_PORT_TYPE_PORT` for the local LAG-1 attachment of the ES. - - Tunnel, next hop, and next hop group objects towards VTEP4 (the other PE for this ES), as described in 4.1 for - known unicast, yielding `nh_grp_oid_2` of type `SAI_NEXT_HOP_GROUP_TYPE_BRIDGE_PORT`. + - `tnl_oid_2` to `tnl_oid_5` of type `SAI_OBJECT_TYPE_TUNNEL`, one P2P VXLAN tunnel to each remote PE that shares + this ES, created as described in 4.1. Each also carries the inner destination MAC to impose on the routed + traffic it encapsulates: + +``` + attr.id = SAI_TUNNEL_ATTR_VXLAN_TUNNEL_MAC; + memcpy(attr.value.mac, vtep2_inner_dmac, sizeof(sai_mac_t)); + tunnel_attrs.push_back(attr); + +``` + + - `nh_oid_2` to `nh_oid_5` of type `SAI_NEXT_HOP_TYPE_BRIDGE_PORT`, one per remote PE, each bound to its tunnel: + +``` + sai_attribute_t next_hop_attr; + vector next_hop_attrs; + + next_hop_attr.id = SAI_NEXT_HOP_ATTR_TYPE; + next_hop_attr.value.s32 = SAI_NEXT_HOP_TYPE_BRIDGE_PORT; + next_hop_attrs.push_back(next_hop_attr); + + next_hop_attr.id = SAI_NEXT_HOP_ATTR_IP; + next_hop_attr.value.ipaddr = vtep2_ip; + next_hop_attrs.push_back(next_hop_attr); + + next_hop_attr.id = SAI_NEXT_HOP_ATTR_TUNNEL_ID; + next_hop_attr.value.oid = tnl_oid_2; + next_hop_attrs.push_back(next_hop_attr); + + sai_status_t status = sai_next_hop_api->create_next_hop(&nh_oid_2, gSwitchId, + static_cast(next_hop_attrs.size()), + next_hop_attrs.data()); + + /* create_next_hop for vtep3_ip/tnl_oid_3 to vtep5_ip/tnl_oid_5 */ + .................. + .................. + +``` + + - `nh_grp_oid_2` of type `SAI_NEXT_HOP_GROUP_TYPE_BRIDGE_PORT`, the group the routed traffic is rerouted onto: + +``` + sai_attribute_t nhg_attr; + vector nhg_attrs; + + nhg_attr.id = SAI_NEXT_HOP_GROUP_ATTR_TYPE; + nhg_attr.value.s32 = SAI_NEXT_HOP_GROUP_TYPE_BRIDGE_PORT; + nhg_attrs.push_back(nhg_attr); + + sai_object_id_t nh_grp_oid_2; + sai_status_t status = sai_next_hop_group_api->create_next_hop_group(&nh_grp_oid_2, + gSwitchId, + (uint32_t)nhg_attrs.size(), + nhg_attrs.data()); + +``` + + - `nh_grp_oid_2` has four members, one per remote PE, so that after the switchover the traffic is load balanced + across the tunnels rather than pinned to a single remote PE: + +``` + vector nhgm_attrs; + sai_attribute_t nhgm_attr; + + nhgm_attr.id = SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_GROUP_ID; + nhgm_attr.value.oid = nh_grp_oid_2; + nhgm_attrs.push_back(nhgm_attr); + + nhgm_attr.id = SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_ID; + nhgm_attr.value.oid = nh_oid_2; + nhgm_attrs.push_back(nhgm_attr); + + status = sai_next_hop_group_api->create_next_hop_group_member(&nhgmbr_id_5, gSwitchId, + (uint32_t)nhgm_attrs.size(), + nhgm_attrs.data()); + + /* create_next_hop_group_member for nh_oid_3 to nh_oid_5 */ + .................. + .................. + +``` - The protection next hop group, protection mode, and (at switch init) the switchover notification callback are set on `bp_lag_oid_1`: @@ -847,7 +1023,12 @@ At VTEP1, the following objects are created. status = sai_bridge_api->set_bridge_port_attribute(bp_lag_oid_1, &attr); attr.id = SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE; - attr.value.s32 = SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE; /* or _HARDWARE_NON_REVERTIVE */ + attr.value.s32 = SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE; + status = sai_bridge_api->set_bridge_port_attribute(bp_lag_oid_1, &attr); + + /* Optional: keep traffic on the protection group after LAG-1 recovers */ + attr.id = SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_REVERTIVE; + attr.value.booldata = false; status = sai_bridge_api->set_bridge_port_attribute(bp_lag_oid_1, &attr); /* Registered once, at switch initialization */ @@ -884,10 +1065,19 @@ At VTEP1, the following objects are created. ``` - - If `SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE` was used and LAG-1 recovers, hardware automatically reverts and a - second notification is delivered with `reason == SAI_BRIDGE_PORT_PROTECTION_EVENT_PRIMARY_RECOVERY`. With - `SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE_NON_REVERTIVE`, the traffic stays on `nh_grp_oid_2` until the NOS - explicitly reverts it (e.g. via `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER`). + - When LAG-1 recovers and `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_REVERTIVE` is left at its default of true, + hardware reverts on its own - after `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_WAIT_TO_RESTORE_TIME`, if one + is configured - and a second notification is delivered with + `reason == SAI_BRIDGE_PORT_PROTECTION_EVENT_PRIMARY_RECOVERY`. If it was set to false, the traffic stays on + `nh_grp_oid_2` until the NOS sets `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_ADMIN_MODE` to + `SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_PRIMARY` and then back to + `SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_AUTO`, which moves the traffic back and arms the hardware selection for + the next failure. + + - To drain LAG-1 for maintenance while it is still up, the NOS sets + `SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_ADMIN_MODE` to + `SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_PROTECTION`. The traffic moves to `nh_grp_oid_2` and stays there, + with no switchover notification, until the override is released. diff --git a/doc/tunnel/figures/sai_evpnmh_hw_frr_flow.png b/doc/tunnel/figures/sai_evpnmh_hw_frr_flow.png index 52bfb67b18d37577d9f428cb7f67cf61910b5eb7..e2587ba927bfba20725e5f6a0b4b60b45b6a31a7 100644 GIT binary patch literal 27280 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
Sl%mUPGy1FXPsI@+(~k)%wFX|iH#Z_5 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 literal 27046 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 P(6Np5jgJ-RIo|v)!~IEJ diff --git a/inc/saibridge.h b/inc/saibridge.h index 58441069c..d64e0f8ee 100644 --- a/inc/saibridge.h +++ b/inc/saibridge.h @@ -106,20 +106,44 @@ typedef enum _sai_bridge_port_tagging_mode_t /** * @brief Attribute data for #SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE + * + * In hardware mode the switchover is triggered by a qualified failure of the + * bridge port, that is, the point at which the adapter determines the bridge + * port is unavailable for forwarding, and the switchover budget is measured + * from that point. Link event debounce and damping controls govern the delivery + * of operational status notifications to the NOS and do not gate the hardware + * selection, so hardware may select the protection path before the NOS observes + * the corresponding operational status change. + * + * Recovery behavior is controlled separately by + * #SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_REVERTIVE. */ typedef enum _sai_bridge_port_protection_mode_t { /** Software switchover. Control plane determines the switchover behavior */ SAI_BRIDGE_PORT_PROTECTION_MODE_SOFTWARE, - /** Hardware switchover. Switches back to the bridge port once it recovers */ + /** Hardware switchover. Hardware selects the path autonomously */ SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE, - /** Hardware switchover. Does not switch back to the bridge port once it recovers */ - SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE_NON_REVERTIVE, - } sai_bridge_port_protection_mode_t; +/** + * @brief Attribute data for #SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_ADMIN_MODE + */ +typedef enum _sai_bridge_port_protection_admin_mode_t +{ + /** No administrative override. Path is selected per the protection mode */ + SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_AUTO, + + /** Force the traffic onto the bridge port. Protection is locked out */ + SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_PRIMARY, + + /** Force the traffic onto the protection next hop group */ + SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_PROTECTION, + +} sai_bridge_port_protection_admin_mode_t; + /** * @brief Attribute data for #SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE */ @@ -131,6 +155,9 @@ typedef enum _sai_bridge_port_protection_state_t /** Protection path is committed in hardware */ SAI_BRIDGE_PORT_PROTECTION_STATE_PROTECTION, + /** Protection is not configured or not applicable for this bridge port */ + SAI_BRIDGE_PORT_PROTECTION_STATE_NOT_APPLICABLE, + } sai_bridge_port_protection_state_t; /** @@ -430,10 +457,20 @@ typedef enum _sai_bridge_port_attr_t /** * @brief Trigger a switch-over to backup next hop group * + * This attribute is deprecated, use + * #SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_ADMIN_MODE instead. Setting + * true is equivalent to + * SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_PROTECTION and setting false + * is equivalent to SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_AUTO. A boolean + * cannot request SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_PRIMARY, and + * cannot distinguish holding the bridge port from placing no override on + * it at all, which is why it is superseded. + * * @type bool * @flags CREATE_AND_SET * @default false * @validonly SAI_BRIDGE_PORT_ATTR_TYPE == SAI_BRIDGE_PORT_TYPE_PORT + * @deprecated true */ SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_SET_SWITCHOVER, @@ -453,15 +490,59 @@ typedef enum _sai_bridge_port_attr_t /** * @brief Protection switchover state * - * Path currently committed in hardware. Valid only for - * SAI_BRIDGE_PORT_TYPE_PORT; otherwise, or when no protection next hop - * group is associated, returns SAI_BRIDGE_PORT_PROTECTION_STATE_PRIMARY. + * Path currently committed in hardware. Returns + * SAI_BRIDGE_PORT_PROTECTION_STATE_NOT_APPLICABLE when the bridge port type + * is not SAI_BRIDGE_PORT_TYPE_PORT, or when no protection next hop group is + * associated. * * @type sai_bridge_port_protection_state_t * @flags READ_ONLY */ SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_STATE, + /** + * @brief Revert to the bridge port once it recovers + * + * When false, hardware keeps the traffic on the protection next hop group + * after the bridge port recovers, until the control plane moves it back + * through #SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_ADMIN_MODE. + * + * @type bool + * @flags CREATE_AND_SET + * @default true + * @validonly SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_MODE == SAI_BRIDGE_PORT_PROTECTION_MODE_HARDWARE + */ + SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_REVERTIVE, + + /** + * @brief Wait to restore time in milliseconds + * + * Delay between the bridge port recovering and hardware reverting to it. + * Value 0 reverts as soon as the bridge port is available again. + * + * @type sai_uint32_t + * @flags CREATE_AND_SET + * @default 0 + * @validonly SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_REVERTIVE == true + */ + SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_WAIT_TO_RESTORE_TIME, + + /** + * @brief Administrative override of the protection path + * + * Overrides the path selection of either protection mode. While an override + * is in effect the committed path does not follow bridge port failure or + * recovery and no switchover notification is raised. Returning to + * SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_AUTO releases the override and + * resumes selection from the committed path. + * + * @type sai_bridge_port_protection_admin_mode_t + * @flags CREATE_AND_SET + * @default SAI_BRIDGE_PORT_PROTECTION_ADMIN_MODE_AUTO + * @validonly SAI_BRIDGE_PORT_ATTR_TYPE == SAI_BRIDGE_PORT_TYPE_PORT + */ + SAI_BRIDGE_PORT_ATTR_BRIDGE_PORT_PROTECTION_ADMIN_MODE, + /** * @brief End of attributes */