From 21bdb488cb7410ffcf3e18e329af5df8466e5180 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 30 Jun 2020 11:04:33 -0700 Subject: [PATCH] Masked hash with optional ordering (#1075) * Fine-grained hash fields * Add object functions * Split hash mask * Remove numbers from hash field ID enum * Add general IP fields for backward compatibility * Update saihash.h * Remove UDF group --- inc/saihash.h | 240 ++++++++++++++++++++++++++++++++++++------ inc/saitypes.h | 1 + meta/saisanitycheck.c | 3 + 3 files changed, 213 insertions(+), 31 deletions(-) diff --git a/inc/saihash.h b/inc/saihash.h index df3be5c1a..e4897658b 100644 --- a/inc/saihash.h +++ b/inc/saihash.h @@ -42,86 +42,198 @@ typedef enum _sai_native_hash_field_t * @brief Native hash field source IP. * * Also, refers to the outer source IP - * in case for encapsulated packets + * in case for encapsulated packets. + * Used for both IPv4 and IPv6 */ - SAI_NATIVE_HASH_FIELD_SRC_IP = 0, + SAI_NATIVE_HASH_FIELD_SRC_IP, /** - * @brief Native hash field destination IP + * @brief Native hash field destination IP. * * Also, refers to the outer source IP - * in case for encapsulated packets + * in case for encapsulated packets. + * Used for both IPv4 and IPv6 */ - SAI_NATIVE_HASH_FIELD_DST_IP = 1, + SAI_NATIVE_HASH_FIELD_DST_IP, /** Native hash field inner source IP */ - SAI_NATIVE_HASH_FIELD_INNER_SRC_IP = 2, + SAI_NATIVE_HASH_FIELD_INNER_SRC_IP, /** Native hash field inner destination IP */ - SAI_NATIVE_HASH_FIELD_INNER_DST_IP = 3, + SAI_NATIVE_HASH_FIELD_INNER_DST_IP, + + /** + * @brief Native hash field source IPv4. + * + * Also, refers to the outer source IPv4 + * in case for encapsulated packets + */ + SAI_NATIVE_HASH_FIELD_SRC_IPV4, + + /** + * @brief Native hash field destination IPv4 + * + * Also, refers to the outer source IPv4 + * in case for encapsulated packets + */ + SAI_NATIVE_HASH_FIELD_DST_IPV4, + + /** + * @brief Native hash field source IPv6. + * + * Also, refers to the outer source IPv6 + * in case for encapsulated packets + */ + SAI_NATIVE_HASH_FIELD_SRC_IPV6, + + /** + * @brief Native hash field destination IPv6 + * + * Also, refers to the outer source IPv6 + * in case for encapsulated packets + */ + SAI_NATIVE_HASH_FIELD_DST_IPV6, + + /** Native hash field inner source IPv4 */ + SAI_NATIVE_HASH_FIELD_INNER_SRC_IPV4, + + /** Native hash field inner destination IPv4 */ + SAI_NATIVE_HASH_FIELD_INNER_DST_IPV4, + + /** Native hash field inner source IPv6 */ + SAI_NATIVE_HASH_FIELD_INNER_SRC_IPV6, + + /** Native hash field inner destination IPv6 */ + SAI_NATIVE_HASH_FIELD_INNER_DST_IPV6, /** Native hash field vlan id */ - SAI_NATIVE_HASH_FIELD_VLAN_ID = 4, + SAI_NATIVE_HASH_FIELD_VLAN_ID, /** Native hash field IP protocol */ - SAI_NATIVE_HASH_FIELD_IP_PROTOCOL = 5, + SAI_NATIVE_HASH_FIELD_IP_PROTOCOL, /** Native hash field Ethernet type */ - SAI_NATIVE_HASH_FIELD_ETHERTYPE = 6, + SAI_NATIVE_HASH_FIELD_ETHERTYPE, /** Native hash field L4 source port */ - SAI_NATIVE_HASH_FIELD_L4_SRC_PORT = 7, + SAI_NATIVE_HASH_FIELD_L4_SRC_PORT, /** Native hash field L4 destination port */ - SAI_NATIVE_HASH_FIELD_L4_DST_PORT = 8, + SAI_NATIVE_HASH_FIELD_L4_DST_PORT, /** Native hash field source MAC */ - SAI_NATIVE_HASH_FIELD_SRC_MAC = 9, + SAI_NATIVE_HASH_FIELD_SRC_MAC, /** Native hash field destination MAC */ - SAI_NATIVE_HASH_FIELD_DST_MAC = 10, + SAI_NATIVE_HASH_FIELD_DST_MAC, /** Native hash field source port */ - SAI_NATIVE_HASH_FIELD_IN_PORT = 11, + SAI_NATIVE_HASH_FIELD_IN_PORT, /** Native hash field inner IP protocol */ - SAI_NATIVE_HASH_FIELD_INNER_IP_PROTOCOL = 12, + SAI_NATIVE_HASH_FIELD_INNER_IP_PROTOCOL, /** Native hash field inner Ethernet type */ - SAI_NATIVE_HASH_FIELD_INNER_ETHERTYPE = 13, + SAI_NATIVE_HASH_FIELD_INNER_ETHERTYPE, /** Native hash field inner L4 source port */ - SAI_NATIVE_HASH_FIELD_INNER_L4_SRC_PORT = 14, + SAI_NATIVE_HASH_FIELD_INNER_L4_SRC_PORT, /** Native hash field inner L4 destination port */ - SAI_NATIVE_HASH_FIELD_INNER_L4_DST_PORT = 15, + SAI_NATIVE_HASH_FIELD_INNER_L4_DST_PORT, /** Native hash field inner source MAC */ - SAI_NATIVE_HASH_FIELD_INNER_SRC_MAC = 16, + SAI_NATIVE_HASH_FIELD_INNER_SRC_MAC, /** Native hash field inner destination MAC */ - SAI_NATIVE_HASH_FIELD_INNER_DST_MAC = 17, + SAI_NATIVE_HASH_FIELD_INNER_DST_MAC, /** Native hash field entire MPLS label stack */ - SAI_NATIVE_HASH_FIELD_MPLS_LABEL_ALL = 18, + SAI_NATIVE_HASH_FIELD_MPLS_LABEL_ALL, /** Native hash field the top MPLS label */ - SAI_NATIVE_HASH_FIELD_MPLS_LABEL_0 = 19, + SAI_NATIVE_HASH_FIELD_MPLS_LABEL_0, /** Native hash field second MPLS label from the top */ - SAI_NATIVE_HASH_FIELD_MPLS_LABEL_1 = 20, + SAI_NATIVE_HASH_FIELD_MPLS_LABEL_1, /** Native hash field third MPLS label from the top */ - SAI_NATIVE_HASH_FIELD_MPLS_LABEL_2 = 21, + SAI_NATIVE_HASH_FIELD_MPLS_LABEL_2, /** Native hash field fourth MPLS label from the top */ - SAI_NATIVE_HASH_FIELD_MPLS_LABEL_3 = 22, + SAI_NATIVE_HASH_FIELD_MPLS_LABEL_3, /** Native hash field fifth MPLS label from the top */ - SAI_NATIVE_HASH_FIELD_MPLS_LABEL_4 = 23, + SAI_NATIVE_HASH_FIELD_MPLS_LABEL_4, + + /** No field - for compatibility, must be last */ + SAI_NATIVE_HASH_FIELD_NONE, } sai_native_hash_field_t; +/** + * @brief Fine-grained hash field attribute IDs + */ +typedef enum _sai_fine_grained_hash_field_attr_t +{ + /** + * @brief Start of attributes + */ + SAI_FINE_GRAINED_HASH_FIELD_ATTR_START, + + /** + * @brief Hash native field ID. + * + * @type sai_native_hash_field_t + * @flags CREATE_ONLY + * @default SAI_NATIVE_HASH_FIELD_NONE + */ + SAI_FINE_GRAINED_HASH_FIELD_ATTR_NATIVE_HASH_FIELD = SAI_FINE_GRAINED_HASH_FIELD_ATTR_START, + + /** + * @brief Mask for a IPv4 address. + * + * @type sai_ip4_t + * @flags MANDATORY_ON_CREATE | CREATE_ONLY + * @condition SAI_FINE_GRAINED_HASH_FIELD_ATTR_NATIVE_HASH_FIELD == SAI_NATIVE_HASH_FIELD_SRC_IPV4 or SAI_FINE_GRAINED_HASH_FIELD_ATTR_NATIVE_HASH_FIELD == SAI_NATIVE_HASH_FIELD_DST_IPV4 or SAI_FINE_GRAINED_HASH_FIELD_ATTR_NATIVE_HASH_FIELD == SAI_NATIVE_HASH_FIELD_INNER_SRC_IPV4 or SAI_FINE_GRAINED_HASH_FIELD_ATTR_NATIVE_HASH_FIELD == SAI_NATIVE_HASH_FIELD_INNER_DST_IPV4 + */ + SAI_FINE_GRAINED_HASH_FIELD_ATTR_IPV4_MASK, + + /** + * @brief Mask for a IPv6 address. + * + * @type sai_ip6_t + * @flags MANDATORY_ON_CREATE | CREATE_ONLY + * @condition SAI_FINE_GRAINED_HASH_FIELD_ATTR_NATIVE_HASH_FIELD == SAI_NATIVE_HASH_FIELD_SRC_IPV6 or SAI_FINE_GRAINED_HASH_FIELD_ATTR_NATIVE_HASH_FIELD == SAI_NATIVE_HASH_FIELD_DST_IPV6 or SAI_FINE_GRAINED_HASH_FIELD_ATTR_NATIVE_HASH_FIELD == SAI_NATIVE_HASH_FIELD_INNER_SRC_IPV6 or SAI_FINE_GRAINED_HASH_FIELD_ATTR_NATIVE_HASH_FIELD == SAI_NATIVE_HASH_FIELD_INNER_DST_IPV6 + */ + SAI_FINE_GRAINED_HASH_FIELD_ATTR_IPV6_MASK, + + /** + * @brief Optional field ordering. + * + * Specifies in which order the fields are hashed, + * and defines in which fields should be associative for CRC with the same sequence ID. + * If not provided, it's up to SAI driver to choose. + * + * @type sai_uint32_t + * @flags CREATE_ONLY + * @default 0 + */ + SAI_FINE_GRAINED_HASH_FIELD_ATTR_SEQUENCE_ID, + + /** + * @brief End of attributes + */ + SAI_FINE_GRAINED_HASH_FIELD_ATTR_END, + + /** Custom range base value */ + SAI_FINE_GRAINED_HASH_FIELD_ATTR_CUSTOM_RANGE_START = 0x10000000, + + /** End of custom range base */ + SAI_FINE_GRAINED_HASH_FIELD_ATTR_CUSTOM_RANGE_END + +} sai_fine_grained_hash_field_attr_t; + /** * @brief Hash attribute IDs */ @@ -151,6 +263,16 @@ typedef enum _sai_hash_attr_t */ SAI_HASH_ATTR_UDF_GROUP_LIST, + /** + * @brief Hash fine-grained field list + * + * @type sai_object_list_t + * @flags CREATE_AND_SET + * @objects SAI_OBJECT_TYPE_FINE_GRAINED_HASH_FIELD + * @default empty + */ + SAI_HASH_ATTR_FINE_GRAINED_HASH_FIELD_LIST, + /** * @brief End of attributes */ @@ -164,6 +286,58 @@ typedef enum _sai_hash_attr_t } sai_hash_attr_t; +/** + * @brief Create fine-grained hash field + * + * @param[out] fine_grained_hash_field_id Fine-grained hash field id + * @param[in] switch_id Switch object id + * @param[in] attr_count Number of attributes + * @param[in] attr_list Array of attributes + * + * @return #SAI_STATUS_SUCCESS on success, failure status code on error + */ +typedef sai_status_t (*sai_create_fine_grained_hash_field_fn)( + _Out_ sai_object_id_t *fine_grained_hash_field_id, + _In_ sai_object_id_t switch_id, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list); + +/** + * @brief Remove fine-grained hash field + * + * @param[in] fine_grained_hash_field_id Fine-grained hash field id + * + * @return #SAI_STATUS_SUCCESS on success, failure status code on error + */ +typedef sai_status_t (*sai_remove_fine_grained_hash_field_fn)( + _In_ sai_object_id_t fine_grained_hash_field_id); + +/** + * @brief Set fine-grained hash field attribute + * + * @param[in] fine_grained_hash_field_id Fine-grained hash field id + * @param[in] attr Attribute + * + * @return #SAI_STATUS_SUCCESS on success, failure status code on error + */ +typedef sai_status_t (*sai_set_fine_grained_hash_field_attribute_fn)( + _In_ sai_object_id_t fine_grained_hash_field_id, + _In_ const sai_attribute_t *attr); + +/** + * @brief Get fine-grained hash field attribute value + * + * @param[in] fine_grained_hash_field_id Fine-grained hash field id + * @param[in] attr_count Number of attributes + * @param[inout] attr_list Array of attributes + * + * @return #SAI_STATUS_SUCCESS on success, failure status code on error + */ +typedef sai_status_t (*sai_get_fine_grained_hash_field_attribute_fn)( + _In_ sai_object_id_t fine_grained_hash_field_id, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list); + /** * @brief Create hash * @@ -221,10 +395,14 @@ typedef sai_status_t (*sai_get_hash_attribute_fn)( */ typedef struct _sai_hash_api_t { - sai_create_hash_fn create_hash; - sai_remove_hash_fn remove_hash; - sai_set_hash_attribute_fn set_hash_attribute; - sai_get_hash_attribute_fn get_hash_attribute; + sai_create_hash_fn create_hash; + sai_remove_hash_fn remove_hash; + sai_set_hash_attribute_fn set_hash_attribute; + sai_get_hash_attribute_fn get_hash_attribute; + sai_create_fine_grained_hash_field_fn create_fine_grained_hash_field; + sai_remove_fine_grained_hash_field_fn remove_fine_grained_hash_field; + sai_set_fine_grained_hash_field_attribute_fn set_fine_grained_hash_field_attribute; + sai_get_fine_grained_hash_field_attribute_fn get_fine_grained_hash_field_attribute; } sai_hash_api_t; diff --git a/inc/saitypes.h b/inc/saitypes.h index d62881df1..ad1a80351 100644 --- a/inc/saitypes.h +++ b/inc/saitypes.h @@ -276,6 +276,7 @@ typedef enum _sai_object_type_t SAI_OBJECT_TYPE_MACSEC_SC = 91, SAI_OBJECT_TYPE_MACSEC_SA = 92, SAI_OBJECT_TYPE_SYSTEM_PORT = 93, + SAI_OBJECT_TYPE_FINE_GRAINED_HASH_FIELD = 94, SAI_OBJECT_TYPE_MAX, /* Must remain in last position */ } sai_object_type_t; diff --git a/meta/saisanitycheck.c b/meta/saisanitycheck.c index a83da9d68..91a1e6238 100644 --- a/meta/saisanitycheck.c +++ b/meta/saisanitycheck.c @@ -678,6 +678,7 @@ void check_attr_object_type_provided( case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IPV6: case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_IP_ADDRESS: case SAI_ATTR_VALUE_TYPE_IPV4: + case SAI_ATTR_VALUE_TYPE_IPV6: case SAI_ATTR_VALUE_TYPE_MACSEC_SAK: case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY: @@ -910,6 +911,7 @@ void check_attr_default_required( case SAI_ATTR_VALUE_TYPE_TIMESPEC: case SAI_ATTR_VALUE_TYPE_IPV4: case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG: + case SAI_ATTR_VALUE_TYPE_IPV6: break; case SAI_ATTR_VALUE_TYPE_CHARDATA: @@ -2540,6 +2542,7 @@ void check_attr_is_primitive( case SAI_ATTR_VALUE_TYPE_UINT8: case SAI_ATTR_VALUE_TYPE_TIMESPEC: case SAI_ATTR_VALUE_TYPE_IPV4: + case SAI_ATTR_VALUE_TYPE_IPV6: case SAI_ATTR_VALUE_TYPE_MACSEC_SAK: case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY: case SAI_ATTR_VALUE_TYPE_MACSEC_SALT: