diff --git a/lib/inc/sai_redis.h b/lib/inc/sai_redis.h index 656e75446c98..acd02c84c839 100644 --- a/lib/inc/sai_redis.h +++ b/lib/inc/sai_redis.h @@ -60,6 +60,7 @@ extern const sai_scheduler_api_t redis_scheduler_api; extern const sai_scheduler_group_api_t redis_scheduler_group_api; extern const sai_stp_api_t redis_stp_api; extern const sai_switch_api_t redis_switch_api; +extern const sai_tunnel_api_t redis_tunnel_api; extern const sai_udf_api_t redis_udf_api; extern const sai_virtual_router_api_t redis_router_api; extern const sai_vlan_api_t redis_vlan_api; diff --git a/lib/src/Makefile.am b/lib/src/Makefile.am index 4aea333ceb93..e51c9eb6c214 100644 --- a/lib/src/Makefile.am +++ b/lib/src/Makefile.am @@ -35,6 +35,7 @@ libsairedis_la_SOURCES = sai_redis_acl.cpp \ sai_redis_schedulergroup.cpp \ sai_redis_stp.cpp \ sai_redis_switch.cpp \ + sai_redis_tunnel.cpp \ sai_redis_udf.cpp \ sai_redis_vlan.cpp \ sai_redis_wred.cpp \ diff --git a/lib/src/sai_redis_interfacequery.cpp b/lib/src/sai_redis_interfacequery.cpp index 44ac2de40b18..7b1749fa0aca 100644 --- a/lib/src/sai_redis_interfacequery.cpp +++ b/lib/src/sai_redis_interfacequery.cpp @@ -304,6 +304,10 @@ sai_status_t sai_api_query( *(const sai_lag_api_t**)api_method_table = &redis_lag_api; return SAI_STATUS_SUCCESS; + case SAI_API_TUNNEL: + *(const sai_tunnel_api_t**)api_method_table = &redis_tunnel_api; + return SAI_STATUS_SUCCESS; + default: SWSS_LOG_ERROR("Invalid API type %d", sai_api_id); return SAI_STATUS_INVALID_PARAMETER; diff --git a/lib/src/sai_redis_tunnel.cpp b/lib/src/sai_redis_tunnel.cpp new file mode 100644 index 000000000000..bb7188379421 --- /dev/null +++ b/lib/src/sai_redis_tunnel.cpp @@ -0,0 +1,344 @@ +#include "sai_redis.h" + +/** + * Routine Description: + * @brief Create tunnel map + * + * Arguments: + * @param[out] tunnel_map_id - tunnel map id + * @param[in] attr_count - number of attributes + * @param[in] attr_list - array of attributes + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + * + */ +sai_status_t redis_create_tunnel_map( + _Out_ sai_object_id_t* tunnel_map_id, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_create( + SAI_OBJECT_TYPE_TUNNEL_MAP, + tunnel_map_id, + attr_count, + attr_list); + + return status; +} + +/** + * Routine Description: + * @brief Remove tunnel map + * + * Arguments: + * @param[out] tunnel_map_id - tunnel map id + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + * + */ +sai_status_t redis_remove_tunnel_map( + _In_ sai_object_id_t tunnel_map_id) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_remove( + SAI_OBJECT_TYPE_TUNNEL_MAP, + tunnel_map_id); + + return status; +} + +/** + * Routine Description: + * @brief Set tunnel map attribute Value + * + * Arguments: + * @param[in] tunnel_map_id - tunnel map id + * @param[in] attr - attribute + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + */ +sai_status_t redis_set_tunnel_map_attribute( + _In_ sai_object_id_t tunnel_map_id, + _In_ const sai_attribute_t *attr) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_set( + SAI_OBJECT_TYPE_TUNNEL_MAP, + tunnel_map_id, + attr); + + return status; +} + +/** + * Routine Description: + * @brief Get tunnel map attribute Value + * + * Arguments: + * @param[in] tunnel_map_id - tunnel map id + * @param[in] attr - attribute + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + */ +sai_status_t redis_get_tunnel_map_attribute( + _In_ sai_object_id_t tunnel_map_id, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_get( + SAI_OBJECT_TYPE_TUNNEL_MAP, + tunnel_map_id, + attr_count, + attr_list); + + return status; +} + +/** + * Routine Description: + * @brief Create tunnel + * + * Arguments: + * @param[out] tunnel_id - tunnel id + * @param[in] attr_count - number of attributes + * @param[in] attr_list - array of attributes + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + * + */ +sai_status_t redis_create_tunnel( + _Out_ sai_object_id_t* tunnel_id, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_create( + SAI_OBJECT_TYPE_TUNNEL, + tunnel_id, + attr_count, + attr_list); + + return status; +} + +/** + * Routine Description: + * @brief Remove tunnel + * + * Arguments: + * @param[out] tunnel_id - tunnel map + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + * + */ +sai_status_t redis_remove_tunnel( + _In_ sai_object_id_t tunnel_id) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_remove( + SAI_OBJECT_TYPE_TUNNEL, + tunnel_id); + + return status; +} + +/** + * Routine Description: + * @brief Set tunnel attribute Value + * + * Arguments: + * @param[in] tunnel_id - tunnel id + * @param[in] attr - attribute + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + */ +sai_status_t redis_set_tunnel_attribute( + _In_ sai_object_id_t tunnel_id, + _In_ const sai_attribute_t *attr) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_set( + SAI_OBJECT_TYPE_TUNNEL, + tunnel_id, + attr); + + return status; +} + +/** + * Routine Description: + * @brief Get tunnel attribute Value + * + * Arguments: + * @param[in] tunnel_id - tunnel id + * @param[in] attr_count - number of attributes + * @param[in] attr_list - array of attributes + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + */ +sai_status_t redis_get_tunnel_attribute( + _In_ sai_object_id_t tunnel_id, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_get( + SAI_OBJECT_TYPE_TUNNEL, + tunnel_id, + attr_count, + attr_list); + + return status; +} + +/** + * Routine Description: + * @brief Create tunnel term table + * + * Arguments: + * @param[out] tunnel_term_table_entry_id - tunnel term table entry id + * @param[in] attr_count - number of attributes + * @param[in] attr_list - array of attributes + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + * + */ +sai_status_t redis_create_tunnel_term_table_entry ( + _Out_ sai_object_id_t* tunnel_term_table_entry_id, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_create( + SAI_OBJECT_TYPE_TUNNEL_TABLE_ENTRY, + tunnel_term_table_entry_id, + attr_count, + attr_list); + + return status; +} + +/** + * Routine Description: + * @brief Remove tunnel term table + * + * Arguments: + * @param[out] tunnel_term_table_entry_id - tunnel term table entry id + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + * + */ +sai_status_t redis_remove_tunnel_term_table_entry ( + _In_ sai_object_id_t tunnel_term_table_entry_id) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_remove( + SAI_OBJECT_TYPE_TUNNEL_TABLE_ENTRY, + tunnel_term_table_entry_id); + + return status; +} + +/** + * Routine Description: + * @brief Set tunnel term table attribute Value + * + * Arguments: + * @param[in] tunnel_term_table_entry_id, - tunnel term table id + * @param[in] attr - attribute + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + */ +sai_status_t redis_set_tunnel_term_table_entry_attribute( + _In_ sai_object_id_t tunnel_term_table_entry_id, + _In_ const sai_attribute_t *attr) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_set( + SAI_OBJECT_TYPE_TUNNEL_TABLE_ENTRY, + tunnel_term_table_entry_id, + attr); + + return status; +} + +/** + * Routine Description: + * @brief Get tunnel term table attribute Value + * + * Arguments: + * @param[in] tunnel_term_table_entry_id, - tunnel term table id + * @param[in] attr - attribute + * + * Return Values: + * @return SAI_STATUS_SUCCESS on success + * Failure status code on error + */ +sai_status_t redis_get_tunnel_term_table_entry_attribute( + _In_ sai_object_id_t tunnel_term_table_entry_id, + _In_ uint32_t attr_count, + _Inout_ sai_attribute_t *attr_list) +{ + SWSS_LOG_ENTER(); + + sai_status_t status = redis_generic_get( + SAI_OBJECT_TYPE_TUNNEL_TABLE_ENTRY, + tunnel_term_table_entry_id, + attr_count, + attr_list); + + return status; +} + +/** + * @brief tunnel table methods, retrieved via sai_api_query() + */ +const sai_tunnel_api_t redis_tunnel_api = { + redis_create_tunnel_map, + redis_remove_tunnel_map, + redis_set_tunnel_map_attribute, + redis_get_tunnel_map_attribute, + redis_create_tunnel, + redis_remove_tunnel, + redis_set_tunnel_attribute, + redis_get_tunnel_attribute, + redis_create_tunnel_term_table_entry, + redis_remove_tunnel_term_table_entry, + redis_set_tunnel_term_table_entry_attribute, + redis_get_tunnel_term_table_entry_attribute, +}; diff --git a/syncd/syncd.h b/syncd/syncd.h index 5c3f6a38889a..ee22476b348a 100644 --- a/syncd/syncd.h +++ b/syncd/syncd.h @@ -139,6 +139,7 @@ extern sai_scheduler_api_t *sai_scheduler_api; extern sai_scheduler_group_api_t *sai_scheduler_group_api; extern sai_stp_api_t *sai_stp_api; extern sai_switch_api_t *sai_switch_api; +extern sai_tunnel_api_t *sai_tunnel_api; extern sai_udf_api_t *sai_udf_api; extern sai_virtual_router_api_t *sai_router_api; extern sai_vlan_api_t *sai_vlan_api; diff --git a/syncd/syncd_init.cpp b/syncd/syncd_init.cpp index 7ed1a3b0ce9a..c5581e2be5f3 100644 --- a/syncd/syncd_init.cpp +++ b/syncd/syncd_init.cpp @@ -26,6 +26,7 @@ sai_scheduler_api_t *sai_scheduler_api; sai_scheduler_group_api_t *sai_scheduler_group_api; sai_stp_api_t *sai_stp_api; sai_switch_api_t *sai_switch_api; +sai_tunnel_api_t *sai_tunnel_api; sai_udf_api_t *sai_udf_api; sai_virtual_router_api_t *sai_router_api; sai_vlan_api_t *sai_vlan_api; @@ -59,6 +60,8 @@ void initialize_common_api_pointers() common_create[SAI_OBJECT_TYPE_PRIORITY_GROUP] = NULL; common_create[SAI_OBJECT_TYPE_LAG_MEMBER] = (sai_lag_api) ? sai_lag_api->create_lag_member : NULL; common_create[SAI_OBJECT_TYPE_VLAN_MEMBER] = (sai_vlan_api) ? sai_vlan_api->create_vlan_member : NULL; + common_create[SAI_OBJECT_TYPE_TUNNEL] = (sai_tunnel_api) ? sai_tunnel_api->create_tunnel : NULL; + common_create[SAI_OBJECT_TYPE_TUNNEL_TABLE_ENTRY] = (sai_tunnel_api) ? sai_tunnel_api->create_tunnel_term_table_entry : NULL; common_create[SAI_OBJECT_TYPE_FDB] = NULL; common_create[SAI_OBJECT_TYPE_SWITCH] = NULL; common_create[SAI_OBJECT_TYPE_TRAP] = NULL; @@ -91,6 +94,8 @@ void initialize_common_api_pointers() common_remove[SAI_OBJECT_TYPE_PRIORITY_GROUP] = NULL; common_remove[SAI_OBJECT_TYPE_LAG_MEMBER] = (sai_lag_api) ? sai_lag_api->remove_lag_member : NULL; common_remove[SAI_OBJECT_TYPE_VLAN_MEMBER] = (sai_vlan_api) ? sai_vlan_api->remove_vlan_member : NULL; + common_remove[SAI_OBJECT_TYPE_TUNNEL] = (sai_tunnel_api) ? sai_tunnel_api->remove_tunnel : NULL; + common_remove[SAI_OBJECT_TYPE_TUNNEL_TABLE_ENTRY] = (sai_tunnel_api) ? sai_tunnel_api->remove_tunnel_term_table_entry : NULL; common_remove[SAI_OBJECT_TYPE_FDB] = NULL; common_remove[SAI_OBJECT_TYPE_SWITCH] = NULL; common_remove[SAI_OBJECT_TYPE_TRAP] = NULL; @@ -123,6 +128,8 @@ void initialize_common_api_pointers() common_set_attribute[SAI_OBJECT_TYPE_PRIORITY_GROUP] = (sai_buffer_api) ? sai_buffer_api->set_ingress_priority_group_attr : NULL; common_set_attribute[SAI_OBJECT_TYPE_LAG_MEMBER] = (sai_lag_api) ? sai_lag_api->set_lag_member_attribute : NULL; common_set_attribute[SAI_OBJECT_TYPE_VLAN_MEMBER] = (sai_vlan_api) ? sai_vlan_api->set_vlan_member_attribute : NULL; + common_set_attribute[SAI_OBJECT_TYPE_TUNNEL] = (sai_tunnel_api) ? sai_tunnel_api->set_tunnel_attribute : NULL; + common_set_attribute[SAI_OBJECT_TYPE_TUNNEL_TABLE_ENTRY] = (sai_tunnel_api) ? sai_tunnel_api->set_tunnel_term_table_entry_attribute : NULL; common_set_attribute[SAI_OBJECT_TYPE_FDB] = NULL; common_set_attribute[SAI_OBJECT_TYPE_SWITCH] = NULL; common_set_attribute[SAI_OBJECT_TYPE_TRAP] = NULL; @@ -155,6 +162,8 @@ void initialize_common_api_pointers() common_get_attribute[SAI_OBJECT_TYPE_PRIORITY_GROUP] = (sai_buffer_api) ? sai_buffer_api->get_ingress_priority_group_attr : NULL; common_get_attribute[SAI_OBJECT_TYPE_LAG_MEMBER] = (sai_lag_api) ? sai_lag_api->get_lag_member_attribute : NULL; common_get_attribute[SAI_OBJECT_TYPE_VLAN_MEMBER] = (sai_vlan_api) ? sai_vlan_api->get_vlan_member_attribute : NULL; + common_get_attribute[SAI_OBJECT_TYPE_TUNNEL] = (sai_tunnel_api) ? sai_tunnel_api->get_tunnel_attribute : NULL; + common_get_attribute[SAI_OBJECT_TYPE_TUNNEL_TABLE_ENTRY] = (sai_tunnel_api) ? sai_tunnel_api->get_tunnel_term_table_entry_attribute : NULL; common_get_attribute[SAI_OBJECT_TYPE_FDB] = NULL; common_get_attribute[SAI_OBJECT_TYPE_SWITCH] = NULL; common_get_attribute[SAI_OBJECT_TYPE_TRAP] = NULL; @@ -189,6 +198,7 @@ void populate_sai_apis() sai_api_query(SAI_API_SCHEDULER_GROUP, (void**)&sai_scheduler_group_api); sai_api_query(SAI_API_STP, (void**)&sai_stp_api); sai_api_query(SAI_API_SWITCH, (void**)&sai_switch_api); + sai_api_query(SAI_API_TUNNEL, (void**)&sai_tunnel_api); sai_api_query(SAI_API_UDF, (void**)&sai_udf_api); sai_api_query(SAI_API_VIRTUAL_ROUTER, (void**)&sai_router_api); sai_api_query(SAI_API_VLAN, (void**)&sai_vlan_api); @@ -217,6 +227,7 @@ void populate_sai_apis() sai_log_set(SAI_API_SCHEDULER_GROUP, SAI_LOG_NOTICE); sai_log_set(SAI_API_STP, SAI_LOG_NOTICE); sai_log_set(SAI_API_SWITCH, SAI_LOG_NOTICE); + sai_log_set(SAI_API_TUNNEL, SAI_LOG_NOTICE); sai_log_set(SAI_API_UDF, SAI_LOG_NOTICE); sai_log_set(SAI_API_VIRTUAL_ROUTER, SAI_LOG_NOTICE); sai_log_set(SAI_API_VLAN, SAI_LOG_NOTICE);