diff --git a/.gitmodules b/.gitmodules index bff8c07148..3daf6a0524 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "SAI"] path = SAI - url = https://github.com/opencomputeproject/SAI.git + url = https://github.com/p4lang/SAI.git ignore = dirty diff --git a/SAI b/SAI index 40d7d66ce8..da2c1936b6 160000 --- a/SAI +++ b/SAI @@ -1 +1 @@ -Subproject commit 40d7d66ce80fa03db397acd1ab614923a23340dd +Subproject commit da2c1936b6bcad42f9153abafaeb7f03157d6ae1 diff --git a/lib/inc/sai_redis.h b/lib/inc/sai_redis.h index 590e2d5bd5..8fac656573 100644 --- a/lib/inc/sai_redis.h +++ b/lib/inc/sai_redis.h @@ -95,6 +95,7 @@ extern const sai_udf_api_t redis_udf_api; extern const sai_virtual_router_api_t redis_virtual_router_api; extern const sai_vlan_api_t redis_vlan_api; extern const sai_wred_api_t redis_wred_api; +extern const sai_dtel_api_t redis_dtel_api; #define UNREFERENCED_PARAMETER(X) diff --git a/lib/src/Makefile.am b/lib/src/Makefile.am index 1b94f5f046..6dc26deae2 100644 --- a/lib/src/Makefile.am +++ b/lib/src/Makefile.am @@ -15,6 +15,7 @@ libsairedis_la_SOURCES = \ sai_redis_fdb.cpp \ sai_redis_hash.cpp \ sai_redis_hostintf.cpp \ + sai_redis_dtel.cpp \ sai_redis_interfacequery.cpp \ sai_redis_lag.cpp \ sai_redis_mirror.cpp \ diff --git a/lib/src/sai_redis_dtel.cpp b/lib/src/sai_redis_dtel.cpp new file mode 100644 index 0000000000..9c62dc6381 --- /dev/null +++ b/lib/src/sai_redis_dtel.cpp @@ -0,0 +1,14 @@ +#include "sai_redis.h" + +REDIS_GENERIC_QUAD(DTEL_QUEUE_REPORT,dtel_queue_report); +REDIS_GENERIC_QUAD(DTEL_INT_SESSION,dtel_int_session); +REDIS_GENERIC_QUAD(DTEL_REPORT_SESSION,dtel_report_session); +REDIS_GENERIC_QUAD(DTEL_EVENT,dtel_event); + +const sai_dtel_api_t redis_dtel_api = { + + REDIS_GENERIC_QUAD_API(dtel_queue_report) + REDIS_GENERIC_QUAD_API(dtel_int_session) + REDIS_GENERIC_QUAD_API(dtel_report_session) + REDIS_GENERIC_QUAD_API(dtel_event) +}; diff --git a/lib/src/sai_redis_interfacequery.cpp b/lib/src/sai_redis_interfacequery.cpp index 61c790f613..71e41438fa 100644 --- a/lib/src/sai_redis_interfacequery.cpp +++ b/lib/src/sai_redis_interfacequery.cpp @@ -244,6 +244,7 @@ sai_status_t sai_api_query( API_CASE(VIRTUAL_ROUTER,virtual_router); API_CASE(VLAN,vlan); API_CASE(WRED,wred); + API_CASE(DTEL,dtel); default: SWSS_LOG_ERROR("Invalid API type %d", sai_api_id); diff --git a/meta/sai_meta.cpp b/meta/sai_meta.cpp index 72a1a4d7ba..6f4f655a89 100644 --- a/meta/sai_meta.cpp +++ b/meta/sai_meta.cpp @@ -1192,6 +1192,9 @@ sai_status_t meta_generic_validation_create( // ACL END + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: + break; + case SAI_ATTR_VALUE_TYPE_UINT8_LIST: VALIDATION_LIST(md, value.u8list); break; @@ -1216,6 +1219,9 @@ sai_status_t meta_generic_validation_create( case SAI_ATTR_VALUE_TYPE_TUNNEL_MAP_LIST: VALIDATION_LIST(md, value.tunnelmap); break; + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: + VALIDATION_LIST(md, value.ipaddrlist); + break; case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: @@ -1863,6 +1869,9 @@ sai_status_t meta_generic_validation_set( // ACL END + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: + break; + case SAI_ATTR_VALUE_TYPE_UINT8_LIST: VALIDATION_LIST(md, value.u8list); break; @@ -1887,6 +1896,9 @@ sai_status_t meta_generic_validation_set( case SAI_ATTR_VALUE_TYPE_TUNNEL_MAP_LIST: VALIDATION_LIST(md, value.tunnelmap); break; + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: + VALIDATION_LIST(md, value.ipaddrlist); + break; case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: @@ -2215,6 +2227,9 @@ sai_status_t meta_generic_validation_get( // ACL END + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: + break; + case SAI_ATTR_VALUE_TYPE_UINT8_LIST: VALIDATION_LIST(md, value.u8list); break; @@ -2239,6 +2254,9 @@ sai_status_t meta_generic_validation_get( case SAI_ATTR_VALUE_TYPE_TUNNEL_MAP_LIST: VALIDATION_LIST(md, value.tunnelmap); break; + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: + VALIDATION_LIST(md, value.ipaddrlist); + break; case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: case SAI_ATTR_VALUE_TYPE_INT32_RANGE: @@ -2560,6 +2578,8 @@ void meta_generic_validation_post_create( case SAI_ATTR_VALUE_TYPE_INT32_LIST: case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST: case SAI_ATTR_VALUE_TYPE_TUNNEL_MAP_LIST: + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: case SAI_ATTR_VALUE_TYPE_INT32_RANGE: // no special action required @@ -2695,6 +2715,8 @@ void meta_generic_validation_post_remove( case SAI_ATTR_VALUE_TYPE_INT32_LIST: case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST: case SAI_ATTR_VALUE_TYPE_TUNNEL_MAP_LIST: + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: case SAI_ATTR_VALUE_TYPE_INT32_RANGE: // no special action required @@ -2946,6 +2968,8 @@ void meta_generic_validation_post_set( case SAI_ATTR_VALUE_TYPE_INT32_LIST: case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST: case SAI_ATTR_VALUE_TYPE_TUNNEL_MAP_LIST: + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: case SAI_ATTR_VALUE_TYPE_INT32_RANGE: // no special action required @@ -3220,6 +3244,8 @@ void meta_generic_validation_post_get( // ACL END + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: + break; case SAI_ATTR_VALUE_TYPE_UINT8_LIST: VALIDATION_LIST_GET(md, value.u8list); break; @@ -3244,6 +3270,9 @@ void meta_generic_validation_post_get( case SAI_ATTR_VALUE_TYPE_TUNNEL_MAP_LIST: VALIDATION_LIST_GET(md, value.tunnelmap); break; + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: + VALIDATION_LIST_GET(md, value.ipaddrlist); + break; case SAI_ATTR_VALUE_TYPE_UINT32_RANGE: diff --git a/meta/saiserialize.cpp b/meta/saiserialize.cpp index d6eb626d3a..6188ce5c31 100644 --- a/meta/saiserialize.cpp +++ b/meta/saiserialize.cpp @@ -231,6 +231,15 @@ sai_status_t transfer_attribute( RETURN_ON_ERROR(transfer_list(src_attr.value.tunnelmap, dst_attr.value.tunnelmap, countOnly)); break; + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: + RETURN_ON_ERROR(transfer_list(src_attr.value.ipaddrlist, dst_attr.value.ipaddrlist, countOnly)); + break; + + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: + transfer_primitive(src_attr.value.ternaryfield.mask.u8, dst_attr.value.ternaryfield.mask.u8); + transfer_primitive(src_attr.value.ternaryfield.value.u8, dst_attr.value.ternaryfield.value.u8); + break; + /* ACL FIELD DATA */ case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL: @@ -878,6 +887,15 @@ std::string sai_serialize_list( } +std::string sai_serialize_ip_address_list( + _In_ const sai_ip_address_list_t& list, + _In_ bool countOnly) +{ + SWSS_LOG_ENTER(); + + return sai_serialize_list(list, countOnly, [&](sai_ip_address_t item) { return sai_serialize_ip_address(item);} ); +} + std::string sai_serialize_enum_list( _In_ const sai_s32_list_t& list, _In_ const sai_enum_metadata_t* meta, @@ -1030,6 +1048,14 @@ std::string sai_serialize_range( return sai_serialize_number(range.min) + "," + sai_serialize_number(range.max); } +std::string sai_serialize_ternary_field( + _In_ const sai_ternary_field_t& ternary_field) +{ + SWSS_LOG_ENTER(); + + return sai_serialize_number(ternary_field.value.u8) + "/" + sai_serialize_number(ternary_field.mask.u8); +} + std::string sai_serialize_acl_action( _In_ const sai_attr_metadata_t& meta, _In_ const sai_acl_action_data_t& action, @@ -1251,6 +1277,12 @@ std::string sai_serialize_attr_value( case SAI_ATTR_VALUE_TYPE_TUNNEL_MAP_LIST: return sai_serialize_tunnel_map_list(attr.value.tunnelmap, countOnly); + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: + return sai_serialize_ip_address_list(attr.value.ipaddrlist, countOnly); + + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: + return sai_serialize_ternary_field(attr.value.ternaryfield); + // ACL FIELD DATA case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL: @@ -1974,6 +2006,16 @@ void sai_deserialize_ip_address( throw std::runtime_error("invalid ip address"); } +void sai_deserialize_ip_address_list( + _In_ const std::string& s, + _Out_ sai_ip_address_list_t& list, + _In_ bool countOnly) +{ + SWSS_LOG_ENTER(); + + sai_deserialize_list(s, list, countOnly, [&](const std::string sitem, sai_ip_address_t& item) { sai_deserialize_ip_address(sitem, item);} ); +} + template void sai_deserialize_range( _In_ const std::string& s, @@ -1993,6 +2035,24 @@ void sai_deserialize_range( sai_deserialize_number(tokens[1], range.max); } +void sai_deserialize_ternary_field( + _In_ const std::string& s, + _Out_ sai_ternary_field_t& field) +{ + SWSS_LOG_ENTER(); + + auto tokens = swss::tokenize(s, '/'); + + if (tokens.size() != 2) + { + SWSS_LOG_ERROR("invalid ternary field %s", s.c_str()); + throw std::runtime_error("invalid ternary field"); + } + + sai_deserialize_number(tokens[0], field.value.u8); + sai_deserialize_number(tokens[1], field.mask.u8); +} + void sai_deserialize_acl_field( _In_ const std::string& s, _In_ const sai_attr_metadata_t& meta, @@ -2242,6 +2302,12 @@ void sai_deserialize_attr_value( case SAI_ATTR_VALUE_TYPE_TUNNEL_MAP_LIST: return sai_deserialize_tunnel_map_list(s, attr.value.tunnelmap, countOnly); + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: + return sai_deserialize_ip_address_list(s, attr.value.ipaddrlist, countOnly); + + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: + return sai_deserialize_ternary_field(s, attr.value.ternaryfield); + // ACL FIELD DATA case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL: @@ -2655,6 +2721,7 @@ void sai_deserialize_free_attribute_value( case SAI_ATTR_VALUE_TYPE_POINTER: case SAI_ATTR_VALUE_TYPE_IP_ADDRESS: case SAI_ATTR_VALUE_TYPE_OBJECT_ID: + case SAI_ATTR_VALUE_TYPE_TERNARY_FIELD: break; case SAI_ATTR_VALUE_TYPE_OBJECT_LIST: @@ -2701,6 +2768,10 @@ void sai_deserialize_free_attribute_value( sai_free_list(attr.value.tunnelmap); break; + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: + sai_free_list(attr.value.ipaddrlist); + break; + /* ACL FIELD DATA */ case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL: diff --git a/saiplayer/saiplayer.cpp b/saiplayer/saiplayer.cpp index b48984710c..07bcb3e538 100644 --- a/saiplayer/saiplayer.cpp +++ b/saiplayer/saiplayer.cpp @@ -315,6 +315,10 @@ void match_list_lengths( CHECK_LIST(value.tunnelmap); break; + case SAI_ATTR_VALUE_TYPE_IP_ADDR_LIST: + CHECK_LIST(value.ipaddrlist); + break; + case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST: CHECK_LIST(value.aclfield.data.objlist); break; diff --git a/vslib/inc/sai_vs.h b/vslib/inc/sai_vs.h index 9bb1339d01..e291ed1f56 100644 --- a/vslib/inc/sai_vs.h +++ b/vslib/inc/sai_vs.h @@ -70,6 +70,7 @@ extern const sai_udf_api_t vs_udf_api; extern const sai_virtual_router_api_t vs_virtual_router_api; extern const sai_vlan_api_t vs_vlan_api; extern const sai_wred_api_t vs_wred_api; +extern const sai_dtel_api_t vs_dtel_api; // CREATE diff --git a/vslib/src/Makefile.am b/vslib/src/Makefile.am index ef2b96c30b..dcae0bc403 100644 --- a/vslib/src/Makefile.am +++ b/vslib/src/Makefile.am @@ -15,6 +15,7 @@ libsaivs_la_SOURCES = \ sai_vs_fdb.cpp \ sai_vs_hash.cpp \ sai_vs_hostintf.cpp \ + sai_vs_dtel.cpp \ sai_vs_interfacequery.cpp \ sai_vs_lag.cpp \ sai_vs_mirror.cpp \ diff --git a/vslib/src/sai_vs_dtel.cpp b/vslib/src/sai_vs_dtel.cpp new file mode 100644 index 0000000000..085000159d --- /dev/null +++ b/vslib/src/sai_vs_dtel.cpp @@ -0,0 +1,15 @@ +#include "sai_vs.h" +#include "sai_vs_internal.h" + +VS_GENERIC_QUAD(DTEL_QUEUE_REPORT,dtel_queue_report); +VS_GENERIC_QUAD(DTEL_INT_SESSION,dtel_int_session); +VS_GENERIC_QUAD(DTEL_REPORT_SESSION,dtel_report_session); +VS_GENERIC_QUAD(DTEL_EVENT,dtel_event); + +const sai_dtel_api_t vs_dtel_api = { + + VS_GENERIC_QUAD_API(dtel_queue_report) + VS_GENERIC_QUAD_API(dtel_int_session) + VS_GENERIC_QUAD_API(dtel_report_session) + VS_GENERIC_QUAD_API(dtel_event) +}; diff --git a/vslib/src/sai_vs_interfacequery.cpp b/vslib/src/sai_vs_interfacequery.cpp index 3650fc9fa7..f5025f3597 100644 --- a/vslib/src/sai_vs_interfacequery.cpp +++ b/vslib/src/sai_vs_interfacequery.cpp @@ -205,6 +205,7 @@ sai_status_t sai_api_query( API_CASE(VIRTUAL_ROUTER,virtual_router); API_CASE(VLAN,vlan); API_CASE(WRED,wred); + API_CASE(DTEL,dtel); default: SWSS_LOG_ERROR("Invalid API type %d", sai_api_id);