diff --git a/configure.ac b/configure.ac index 23da9c2bd..03394a8c9 100644 --- a/configure.ac +++ b/configure.ac @@ -182,6 +182,29 @@ AC_SUBST(CXXFLAGS_COMMON) AC_SUBST(SAIINC, "-I\$(top_srcdir)/SAI/inc -I\$(top_srcdir)/SAI/experimental -I\$(top_srcdir)/SAI/meta") +AM_COND_IF([SYNCD], [ +AM_COND_IF([SAIVS], [], [ +SAVED_FLAGS="$CXXFLAGS" +CXXFLAGS="-lsai -I$srcdir/SAI/inc -I$srcdir/SAI/experimental -I$srcdir/SAI/meta" +AC_MSG_CHECKING([SAI headers API version and library version check]) +AC_TRY_RUN([ +extern "C" { +#include +} +int main() { + sai_api_version_t version; + if (SAI_STATUS_SUCCESS != sai_query_api_version(&version)) + { + return 1; + } + return (version != SAI_API_VERSION); +}], +[AC_MSG_RESULT(ok)], +[AC_MSG_RESULT(failed) +AC_MSG_ERROR("SAI headers API version and library version mismatch")]) +CXXFLAGS="$SAVED_FLAGS" +])]) + AC_OUTPUT(Makefile meta/Makefile lib/Makefile diff --git a/lib/sai_redis_interfacequery.cpp b/lib/sai_redis_interfacequery.cpp index f7ee17688..bac354020 100644 --- a/lib/sai_redis_interfacequery.cpp +++ b/lib/sai_redis_interfacequery.cpp @@ -240,3 +240,11 @@ sai_status_t sai_query_stats_capability( return SAI_STATUS_NOT_IMPLEMENTED; } + +sai_status_t sai_query_api_version( + _Out_ sai_api_version_t *version) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} diff --git a/syncd/VendorSai.cpp b/syncd/VendorSai.cpp index 777614942..85d0bdcfc 100644 --- a/syncd/VendorSai.cpp +++ b/syncd/VendorSai.cpp @@ -4,6 +4,7 @@ #include "swss/logger.h" +#include #include using namespace syncd; @@ -57,9 +58,28 @@ sai_status_t VendorSai::initialize( return SAI_STATUS_INVALID_PARAMETER; } + sai_api_version_t version{}; + auto status = sai_query_api_version(&version); + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_ERROR("failed to query SAI API version"); + + return status; + } + + SWSS_LOG_NOTICE("SAI API version: %" PRId64, version); + + if (version != SAI_API_VERSION) + { + SWSS_LOG_ERROR("SAI implementation API version %" PRId64 " does not match SAI headers API version %" PRId64, + version, SAI_API_VERSION); + + return SAI_STATUS_FAILURE; + } + memcpy(&m_service_method_table, service_method_table, sizeof(m_service_method_table)); - auto status = sai_api_initialize(flags, service_method_table); + status = sai_api_initialize(flags, service_method_table); if (status == SAI_STATUS_SUCCESS) { diff --git a/vslib/sai_vs_interfacequery.cpp b/vslib/sai_vs_interfacequery.cpp index 42b9fa468..8dac01d43 100644 --- a/vslib/sai_vs_interfacequery.cpp +++ b/vslib/sai_vs_interfacequery.cpp @@ -192,3 +192,12 @@ sai_status_t sai_query_stats_capability( return vs_sai->queryStatsCapability(switch_id, object_type, stats_capability); } + +sai_status_t sai_query_api_version( + _Out_ sai_api_version_t *version) +{ + SWSS_LOG_ENTER(); + + *version = SAI_API_VERSION; + return SAI_STATUS_SUCCESS; +}