From d182fd425c534af9a344dd01c6518b31b1fea618 Mon Sep 17 00:00:00 2001 From: JaiOCP Date: Mon, 11 May 2026 15:43:26 -0700 Subject: [PATCH] Optimized Forwarding Header Signed-off-by: JaiOCP --- inc/sai.h | 4 ++++ inc/saidebugcounter.h | 18 ++++++++++++++++ inc/saiobject.h | 4 ++++ inc/saiswitch.h | 18 ++++++++++++++++ inc/saitypes.h | 47 +++++++++++++++++++++++++++++++++++++++++ inc/saivirtualrouter.h | 9 ++++++++ meta/acronyms.txt | 4 ++++ meta/checkheaders.pl | 1 + meta/parse.pl | 3 ++- meta/saimetadatatypes.h | 7 +++++- meta/saisanitycheck.c | 4 ++++ 11 files changed, 117 insertions(+), 2 deletions(-) diff --git a/inc/sai.h b/inc/sai.h index d8f90c44b..f37e00aee 100644 --- a/inc/sai.h +++ b/inc/sai.h @@ -83,6 +83,8 @@ #include "saiicmpecho.h" #include "saisynce.h" #include "saivirtualchannel.h" +#include "saiofh.h" +#include "saiofhroute.h" /** * @defgroup SAI SAI - Entry point specific API definitions. @@ -155,6 +157,8 @@ typedef enum _sai_api_t SAI_API_PREFIX_COMPRESSION = 53, /**< sai_prefix_compression_api_t */ SAI_API_SYNCE = 54, /**< sai_synce_api_t */ SAI_API_VIRTUAL_CHANNEL = 55, /**< sai_virtual_channel_api_t */ + SAI_API_OFH = 56, /**< sai_ofh_api_t */ + SAI_API_OFH_ROUTE = 57, /**< sai_ofh_route_api_t */ SAI_API_MAX, /**< total number of APIs */ /** diff --git a/inc/saidebugcounter.h b/inc/saidebugcounter.h index cc9714e8e..76b07dfa8 100644 --- a/inc/saidebugcounter.h +++ b/inc/saidebugcounter.h @@ -331,6 +331,21 @@ typedef enum _sai_in_drop_reason_t /** IPv4 or IPv6 Routing table (LPM) unicast miss */ SAI_IN_DROP_REASON_LPM_MISS = 0x00000039, + /** OFH packet TTL expired */ + SAI_IN_DROP_REASON_OFH_TTL, + + /** OFH Routing table miss */ + SAI_IN_DROP_REASON_OFH_MISS, + + /** OFH Routing table action discard */ + SAI_IN_DROP_REASON_OFH_DISCARD, + + /** OFH VLAN drop */ + SAI_IN_DROP_REASON_OFH_VLAN_DROP, + + /** OFH VLAN to virtual router id drop */ + SAI_IN_DROP_REASON_OFH_VLAN_TO_VRID_DROP, + /** End of in drop reasons */ SAI_IN_DROP_REASON_END, @@ -377,6 +392,9 @@ typedef enum _sai_out_drop_reason_t */ SAI_OUT_DROP_REASON_TUNNEL_LOOPBACK_PACKET_DROP, + /** OFH VLAN drop */ + SAI_OUT_DROP_REASON_OFH_VLAN_DROP, + /** End of out drop reasons */ SAI_OUT_DROP_REASON_END, diff --git a/inc/saiobject.h b/inc/saiobject.h index 84dd67018..f99483a0f 100644 --- a/inc/saiobject.h +++ b/inc/saiobject.h @@ -36,6 +36,7 @@ #include #include #include +#include /* new experimental object type includes */ #include @@ -140,6 +141,9 @@ typedef union _sai_object_key_entry_t /** @validonly object_type == SAI_OBJECT_TYPE_ENI_TRUSTED_VNI_ENTRY */ sai_eni_trusted_vni_entry_t eni_trusted_vni_entry; + /** @validonly object_type == SAI_OBJECT_TYPE_OFH_ROUTE_ENTRY */ + sai_ofh_route_entry_t ofh_route_entry; + /* Add new experimental entries above this line */ } sai_object_key_entry_t; diff --git a/inc/saiswitch.h b/inc/saiswitch.h index 64072c22c..67e591c98 100644 --- a/inc/saiswitch.h +++ b/inc/saiswitch.h @@ -3598,6 +3598,24 @@ typedef enum _sai_switch_attr_t */ SAI_SWITCH_ATTR_PTP_SYNTONIZE_ADJUST, + /** + * @brief OFH headers + * + * @type sai_object_list_t + * @flags CREATE_AND_SET + * @objects SAI_OBJECT_TYPE_OFH + * @default empty + */ + SAI_SWITCH_ATTR_OFH, + + /** + * @brief OFH header max size + * + * @type sai_int8_t + * @flags READ_ONLY + */ + SAI_SWITCH_ATTR_OFH_MAX_SIZE, + /** * @brief End of attributes */ diff --git a/inc/saitypes.h b/inc/saitypes.h index 287a9e0da..e208d95fe 100644 --- a/inc/saitypes.h +++ b/inc/saitypes.h @@ -306,6 +306,8 @@ typedef enum _sai_object_type_t SAI_OBJECT_TYPE_VIRTUAL_CHANNEL = 116, SAI_OBJECT_TYPE_CBFC_CREDIT_POOL = 117, SAI_OBJECT_TYPE_CBFC_CREDIT_PROFILE = 118, + SAI_OBJECT_TYPE_OFH = 119, + SAI_OBJECT_TYPE_OFH_ROUTE_ENTRY = 120, /** Must remain in last position */ SAI_OBJECT_TYPE_MAX, @@ -471,6 +473,51 @@ typedef struct _sai_ip_prefix_list_t sai_ip_prefix_t *list; } sai_ip_prefix_list_t; +typedef enum _sai_ofh_addr_family_t +{ + SAI_OFH_ADDR_FAMILY_ESUN, + + SAI_OFH_ADDR_FAMILY_AFH_T1, + + SAI_OFH_ADDR_FAMILY_AFH_T2, + + SAI_OFH_ADDR_FAMILY_UFH_T1, + + SAI_OFH_ADDR_FAMILY_UFH_T2, +} sai_ofh_addr_family_t; + +/** + * @extraparam sai_ofh_addr_family_t ofh_addr_family + */ +typedef union _sai_ofh_addr_t +{ + /** @validonly ofh_addr_family == SAI_OFH_ADDR_FAMILY_ESUN */ + sai_mac_t esun; + + /** @validonly ofh_addr_family == SAI_OFH_ADDR_FAMILY_AFH_T1 */ + sai_mac_t afh_t1; + + /** @validonly ofh_addr_family == SAI_OFH_ADDR_FAMILY_AFH_T2 */ + sai_mac_t afh_t2; + + /** @validonly ofh_addr_family == SAI_OFH_ADDR_FAMILY_UFH_T1 */ + sai_uint32_t ufh_t1; + + /** @validonly ofh_addr_family == SAI_OFH_ADDR_FAMILY_UFH_T2 */ + sai_uint16_t ufh_t2; +} sai_ofh_addr_t; + +typedef struct _sai_ofh_addr_and_mask_t +{ + sai_ofh_addr_family_t ofh_addr_family; + + /** @passparam ofh_addr_family */ + sai_ofh_addr_t ofh_addr; + + /** @passparam ofh_addr_family */ + sai_ofh_addr_t ofh_mask; +} sai_ofh_addr_and_mask_t; + /** * @brief Attribute data for #SAI_PORT_ATTR_PRBS_RX_STATUS */ diff --git a/inc/saivirtualrouter.h b/inc/saivirtualrouter.h index ea68a902c..56c0394e9 100644 --- a/inc/saivirtualrouter.h +++ b/inc/saivirtualrouter.h @@ -115,6 +115,15 @@ typedef enum _sai_virtual_router_attr_t */ SAI_VIRTUAL_ROUTER_ATTR_LABEL, + /** + * @brief Admin OFH state + * + * @type bool + * @flags CREATE_AND_SET + * @default true + */ + SAI_VIRTUAL_ROUTER_ATTR_ADMIN_OFH_STATE, + /** * @brief End of attributes */ diff --git a/meta/acronyms.txt b/meta/acronyms.txt index d940caaad..a8cf3bab6 100644 --- a/meta/acronyms.txt +++ b/meta/acronyms.txt @@ -2,6 +2,7 @@ ACK - Acknowledgement ACL - Access Control List AES - Advanced Encryption Standard +AFH - AI Fabric Header AN - Association Number AN - Auto Negotiation API - Application Program Interface @@ -56,6 +57,7 @@ EEPROM - Electrically erasable programmable read-only memory ENI - Elastic Network Interface ERSPAN - Encapsulated Remote SPAN ESN - Extended Sequence Number +ESUN - Ethernet for Scale Up Networks EWMA - Exponentially Weighted Moving Average FCS - Frame Check Sequence FD - File Descriptor @@ -117,6 +119,7 @@ NTPCLIENT - Network Time Protocol Client NTPSERVER - Network Time Protocol Server NVGRE - Network Virtualization using Generic Routing Encapsulation OAM - Operations Administration and Maintenance +OFH - Optimized Forwarding Header OUI - Organizationally Unique Identifier P4RT - Programming Protocol-independent Packet Processors Runtime PAM4 - Pulse Amplitude Modulation 4-level @@ -182,6 +185,7 @@ TWAMP - Two-Way Active Measurement Protocol UART - Universal Asynchronous Receiver/Transmitter UDF - User-Defined Field UDP - User Datagram Protocol +UFH - Unified Forwarding Header USD - Ultimate Segment Decapsulation USP - Ultimate Segment Pop USXGMII - Universal Serial 10 Gigabit Media Independent Interface diff --git a/meta/checkheaders.pl b/meta/checkheaders.pl index 037e11818..7ee2026c1 100755 --- a/meta/checkheaders.pl +++ b/meta/checkheaders.pl @@ -199,6 +199,7 @@ sub CheckHash next if $key eq "SAI_PORT_BREAKOUT_MODE_TYPE_MAX"; next if $key eq "SAI_HOSTIF_USER_DEFINED_TRAP_TYPE_CUSTOM_RANGE_BASE"; next if $key eq "SAI_HOSTIF_USER_DEFINED_TRAP_TYPE_END"; + next if $key eq "SAI_OUT_DROP_REASON_END"; # NOTE: some other attributes/enum with END range could be added } diff --git a/meta/parse.pl b/meta/parse.pl index 86c92a512..fd92f3ca4 100755 --- a/meta/parse.pl +++ b/meta/parse.pl @@ -2698,6 +2698,7 @@ sub ProcessStructValueType return "SAI_ATTR_VALUE_TYPE_MAC" if $type eq "sai_mac_t"; return "SAI_ATTR_VALUE_TYPE_IP_ADDRESS" if $type eq "sai_ip_address_t"; return "SAI_ATTR_VALUE_TYPE_IP_PREFIX" if $type eq "sai_ip_prefix_t"; + return "SAI_ATTR_VALUE_TYPE_OFH_ADDR_AND_MASK" if $type eq "sai_ofh_addr_and_mask_t"; return "SAI_ATTR_VALUE_TYPE_PRBS_RX_STATE" if $type eq "sai_prbs_rx_state_t"; return "SAI_ATTR_VALUE_TYPE_UINT16" if $type eq "sai_vlan_id_t"; return "SAI_ATTR_VALUE_TYPE_UINT32" if $type eq "sai_label_id_t"; @@ -4172,7 +4173,7 @@ sub ProcessSingleNonObjectId # allowed entries on object structs - if (not $type =~ /^sai_(nat_entry_data|mac|object_id|vlan_id|ip_address|ip_prefix|acl_chain|label_id|ip6|uint8|uint16|uint32|u32_range|\w+_type)_t$/) + if (not $type =~ /^sai_(nat_entry_data|mac|object_id|vlan_id|ip_address|ip_prefix|ofh_addr_and_mask|acl_chain|label_id|ip6|uint8|uint16|uint32|u32_range|\w+_type)_t$/) { LogError "struct member $member type '$type' is not allowed on struct $structname"; next; diff --git a/meta/saimetadatatypes.h b/meta/saimetadatatypes.h index e332ff216..96de79444 100644 --- a/meta/saimetadatatypes.h +++ b/meta/saimetadatatypes.h @@ -539,7 +539,12 @@ typedef enum _sai_attr_value_type_t /** * @brief Attribute value is 64 bit unsigned integer range list. */ - SAI_ATTR_VALUE_TYPE_UINT64_RANGE_LIST + SAI_ATTR_VALUE_TYPE_UINT64_RANGE_LIST, + + /** + * @brief Attribute value is OFH prefix + */ + SAI_ATTR_VALUE_TYPE_OFH_ADDR_AND_MASK, } sai_attr_value_type_t; /** diff --git a/meta/saisanitycheck.c b/meta/saisanitycheck.c index ae1d23b22..0634acce6 100644 --- a/meta/saisanitycheck.c +++ b/meta/saisanitycheck.c @@ -786,6 +786,7 @@ void check_attr_object_type_provided( case SAI_ATTR_VALUE_TYPE_POINTER: case SAI_ATTR_VALUE_TYPE_IP_ADDRESS: case SAI_ATTR_VALUE_TYPE_IP_PREFIX: + case SAI_ATTR_VALUE_TYPE_OFH_ADDR_AND_MASK: case SAI_ATTR_VALUE_TYPE_PRBS_RX_STATE: case SAI_ATTR_VALUE_TYPE_CHARDATA: case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: @@ -1077,6 +1078,7 @@ void check_attr_default_required( case SAI_ATTR_VALUE_TYPE_MAC: case SAI_ATTR_VALUE_TYPE_IP_ADDRESS: case SAI_ATTR_VALUE_TYPE_IP_PREFIX: + case SAI_ATTR_VALUE_TYPE_OFH_ADDR_AND_MASK: case SAI_ATTR_VALUE_TYPE_PRBS_RX_STATE: case SAI_ATTR_VALUE_TYPE_TIMESPEC: case SAI_ATTR_VALUE_TYPE_IPV4: @@ -3044,6 +3046,7 @@ void check_attr_is_primitive( case SAI_ATTR_VALUE_TYPE_INT8: case SAI_ATTR_VALUE_TYPE_IP_ADDRESS: case SAI_ATTR_VALUE_TYPE_IP_PREFIX: + case SAI_ATTR_VALUE_TYPE_OFH_ADDR_AND_MASK: case SAI_ATTR_VALUE_TYPE_PRBS_RX_STATE: case SAI_ATTR_VALUE_TYPE_MAC: case SAI_ATTR_VALUE_TYPE_OBJECT_ID: @@ -4030,6 +4033,7 @@ void check_non_object_id_object_types() case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: case SAI_ATTR_VALUE_TYPE_IP_ADDRESS: case SAI_ATTR_VALUE_TYPE_IP_PREFIX: + case SAI_ATTR_VALUE_TYPE_OFH_ADDR_AND_MASK: case SAI_ATTR_VALUE_TYPE_OBJECT_ID: case SAI_ATTR_VALUE_TYPE_NAT_ENTRY_DATA: case SAI_ATTR_VALUE_TYPE_ENCRYPT_KEY: