From 86d3e4f11d7349791d6e68e4e75bb52d51a5b284 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Fri, 21 Oct 2022 17:00:30 +0800 Subject: [PATCH 1/5] [gbsyncd] Add asic db prefix for channel NOTIFICATIONS (#1129) Fix #1131. The communication channel between orchagent and gbsyncd needs different from the channel "NOTIFICATIONS" between orchagent and syncd. --- lib/RedisChannel.cpp | 2 +- lib/sairediscommon.h | 12 ++++++++++++ syncd/RedisNotificationProducer.cpp | 2 +- tests/aspell.en.pws | 2 ++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/RedisChannel.cpp b/lib/RedisChannel.cpp index 93567f45a2..17e061e3e7 100644 --- a/lib/RedisChannel.cpp +++ b/lib/RedisChannel.cpp @@ -25,7 +25,7 @@ RedisChannel::RedisChannel( m_getConsumer = std::make_shared(m_db.get(), REDIS_TABLE_GETRESPONSE); m_dbNtf = std::make_shared(dbAsic, 0); - m_notificationConsumer = std::make_shared(m_dbNtf.get(), REDIS_TABLE_NOTIFICATIONS); + m_notificationConsumer = std::make_shared(m_dbNtf.get(), REDIS_TABLE_NOTIFICATIONS_PER_DB(dbAsic)); m_runNotificationThread = true; diff --git a/lib/sairediscommon.h b/lib/sairediscommon.h index c095ac4721..621e8088e5 100644 --- a/lib/sairediscommon.h +++ b/lib/sairediscommon.h @@ -67,6 +67,18 @@ */ #define REDIS_TABLE_NOTIFICATIONS "NOTIFICATIONS" +/** + * @brief Table which will be used to forward notifications per DB scope + * + * In https://redis.io/docs/manual/pubsub/, it says: + * "Pub/Sub has no relation to the key space. It was made to not interfere with + * it on any level, including database numbers." + */ +#define REDIS_TABLE_NOTIFICATIONS_PER_DB(dbName) \ + ((dbName) == "ASIC_DB" ? \ + REDIS_TABLE_NOTIFICATIONS : \ + (dbName) + "_" + REDIS_TABLE_NOTIFICATIONS) + /** * @brief Table which will be used to send API response from syncd. */ diff --git a/syncd/RedisNotificationProducer.cpp b/syncd/RedisNotificationProducer.cpp index 3e19a47439..4bfb2cc0e3 100644 --- a/syncd/RedisNotificationProducer.cpp +++ b/syncd/RedisNotificationProducer.cpp @@ -13,7 +13,7 @@ RedisNotificationProducer::RedisNotificationProducer( m_db = std::make_shared(dbName, 0); - m_notificationProducer = std::make_shared(m_db.get(), REDIS_TABLE_NOTIFICATIONS); + m_notificationProducer = std::make_shared(m_db.get(), REDIS_TABLE_NOTIFICATIONS_PER_DB(dbName)); } void RedisNotificationProducer::send( diff --git a/tests/aspell.en.pws b/tests/aspell.en.pws index 1ceca3ecdf..f85a2541e8 100644 --- a/tests/aspell.en.pws +++ b/tests/aspell.en.pws @@ -231,6 +231,7 @@ inseg Inseg INSEG insegs +io ip IP ipc @@ -308,6 +309,7 @@ PORTs pre printf ptr +pubsub qos queueCounterIds queueId From 98e63f7d40593730f615b2c5795f3f45dea66f00 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Tue, 25 Oct 2022 09:57:41 -0700 Subject: [PATCH 2/5] Make changes to building and packaging sairedis (#1116) * Make changes to building and packaging sairedis This commit includes the following changes: 1. Use Debian build profiles instead of custom build targets to build different configurations of sairedis. Build profiles were designed for this purpose. This also makes the debian/rules file a bit cleaner. 2. Rely on the debug packages being automatically created, instead of us explicitly specifying it in debian/control. 3. Add actual support for excluding Python 2 binding build. 4. Make sure the compile flags used for building Python 2 and Python 3 are actually correct. Signed-off-by: Saikrishna Arcot * Update pipeline file Signed-off-by: Saikrishna Arcot * Fix argument for profile Signed-off-by: Saikrishna Arcot * Exclude libsai package from the list of dependencies Signed-off-by: Saikrishna Arcot * Allow multiple syslog artifacts during tests Signed-off-by: Saikrishna Arcot --- .azure-pipelines/build-template.yml | 4 +- configure.ac | 23 +- debian/compat | 2 +- debian/control | 70 +----- debian/libsaimetadata-dev.install | 2 + debian/libsairedis-dev.install | 1 + debian/rules | 81 ++----- m4/ax_python3_devel.m4 | 327 ++++++++++++++++++++++++++++ meta/Makefile.am | 4 +- pyext/Makefile.am | 5 +- pyext/py2/Makefile.am | 4 +- pyext/py3/Makefile.am | 2 +- 12 files changed, 400 insertions(+), 125 deletions(-) create mode 100644 m4/ax_python3_devel.m4 diff --git a/.azure-pipelines/build-template.yml b/.azure-pipelines/build-template.yml index f50cd1c4fc..01d3b07766 100644 --- a/.azure-pipelines/build-template.yml +++ b/.azure-pipelines/build-template.yml @@ -150,7 +150,7 @@ jobs: set -ex rm ../*.deb || true ./autogen.sh - DEB_BUILD_OPTIONS=nocheck fakeroot debian/rules DEB_CONFIGURE_EXTRA_FLAGS='--enable-code-coverage' CFLAGS="" CXXFLAGS="" binary-syncd-vs + DEB_BUILD_OPTIONS=nocheck DEB_CONFIGURE_EXTRA_FLAGS='--enable-code-coverage' dpkg-buildpackage -us -uc -b -Psyncd,vs -j$(nproc) mv ../*.deb . displayName: "Compile sonic sairedis with coverage enabled" - script: | @@ -209,6 +209,6 @@ jobs: contents: 'syslog-all.tgz' targetFolder: $(Build.ArtifactStagingDirectory) - publish: $(Build.ArtifactStagingDirectory)/ - artifact: ${{ parameters.syslog_artifact_name }} + artifact: ${{ parameters.syslog_artifact_name }}@$(System.JobAttempt) displayName: "Publish syslog artifacts" condition: always() diff --git a/configure.ac b/configure.ac index b477f6b966..cd26cf139b 100644 --- a/configure.ac +++ b/configure.ac @@ -10,8 +10,8 @@ AC_PROG_CC AC_PROG_CXX AC_PROG_LIBTOOL AC_HEADER_STDC -AM_PATH_PYTHON AM_PATH_PYTHON3 +AX_PYTHON3_DEVEL AX_CODE_COVERAGE AX_ADD_AM_MACRO_STATIC([]) @@ -101,6 +101,14 @@ AC_ARG_ENABLE(asan, *) AC_MSG_ERROR(bad value ${enableval} for --enable-asan) ;; esac],[asan_enabled=false]) +AC_ARG_ENABLE(python2, +[ --enable-python2 Generate Python 2 bindings], +[case "${enableval}" in + yes) python2=true ;; + no) python2=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-python2) ;; +esac],[python2=true]) + if test "x$asan_enabled" = "xtrue"; then CFLAGS_ASAN+=" -fsanitize=address" CFLAGS_ASAN+=" -DASAN_ENABLED" @@ -111,13 +119,26 @@ if test "x$asan_enabled" = "xtrue"; then AC_SUBST(LDFLAGS_ASAN) fi +if test "x$python2" = "xtrue"; then + m4_define_default([_AM_PYTHON_INTERPRETER_LIST], + [python2 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) + AM_PATH_PYTHON + AX_PYTHON_DEVEL([< '3']) + PYTHON2_CPPFLAGS=$PYTHON_CPPFLAGS + PYTHON2_LIBS=$PYTHON_LIBS + AC_SUBST(PYTHON2_CPPFLAGS) + AC_SUBST(PYTHON2_LIBS) +fi + AM_CONDITIONAL(ASAN_ENABLED, test x$asan_enabled = xtrue) +AM_CONDITIONAL(PYTHON2, test x$python2 = xtrue) AC_PATH_PROGS(SWIG, [swig3.0 swig]) CXXFLAGS_COMMON="" CXXFLAGS_COMMON+=" -ansi" CXXFLAGS_COMMON+=" -fPIC" +CXXFLAGS_COMMON+=" -pipe" CXXFLAGS_COMMON+=" -std=c++14" CXXFLAGS_COMMON+=" -Wall" CXXFLAGS_COMMON+=" -Wcast-align" diff --git a/debian/compat b/debian/compat index f599e28b8a..48082f72f0 100644 --- a/debian/compat +++ b/debian/compat @@ -1 +1 @@ -10 +12 diff --git a/debian/control b/debian/control index 5b5284e0b5..a07ed6d806 100644 --- a/debian/control +++ b/debian/control @@ -2,17 +2,23 @@ Source: sonic Maintainer: Kamil Cudnik Section: net Priority: optional -Build-Depends: debhelper (>=9), autotools-dev, libzmq5-dev +Build-Depends: debhelper (>= 12), autotools-dev, libzmq5-dev Standards-Version: 1.0.0 Package: syncd Architecture: any +Build-Profiles: +Depends: ${misc:Pre-Depends} +Recommends: ${shlibs:Depends} Conflicts: syncd-rpc, syncd-vs Description: This package contains sync daemon for SONiC project. This sync daemon syncs the ASIC_DB in Redis database and the real ASIC via SAI. Package: syncd-rpc Architecture: any +Build-Profiles: +Depends: ${misc:Pre-Depends} +Recommends: ${shlibs:Depends} Conflicts: syncd, syncd-vs Description: This package contains sync daemon with rpc for SONiC project. This sync daemon syncs the ASIC_DB in Redis database and the real ASIC via SAI. @@ -20,6 +26,9 @@ Description: This package contains sync daemon with rpc for SONiC project. Package: syncd-vs Architecture: any +Build-Profiles: +Depends: ${misc:Pre-Depends} +Recommends: ${shlibs:Depends} Conflicts: syncd-rpc, syncd Description: This package contains sync daemon for SONiC project linked with virtual switch. This sync daemon syncs the ASIC_DB in Redis database and the real ASIC via SAI. @@ -38,6 +47,7 @@ Description: This package contains development files for SAI-Redis. Package: libsaivs Architecture: any +Depends: ${shlibs:Depends}, ${misc:Pre-Depends} Section: libs Description: This package contains SAI-VirtualSwitch implementation for SONiC project. @@ -49,6 +59,7 @@ Description: This package contains development files for SAI-VirtualSwitch. Package: libsaimetadata Architecture: any +Depends: ${shlibs:Depends}, ${misc:Pre-Depends} Section: libs Description: This package contains SAI-Metadata implementation for SONiC project. @@ -58,63 +69,6 @@ Depends: libsaimetadata (= ${binary:Version}) Section: libdevel Description: This package contains development files for SAI-Metadata. -Package: syncd-dbg -Architecture: any -Section: debug -Priority: extra -Conflicts: syncd-rpc-dbg, syncd-vs -Depends: - syncd (= ${binary:Version}), - ${misc:Depends} -Description: debugging symbols for syncd - -Package: syncd-rpc-dbg -Architecture: any -Section: debug -Priority: extra -Conflicts: syncd-dbg, syncd-vs -Depends: - syncd-rpc (= ${binary:Version}), - ${misc:Depends} -Description: debugging symbols for syncd-rpc - -Package: syncd-vs-dbg -Architecture: any -Section: debug -Priority: extra -Conflicts: syncd-dbg, syncd-rpc-dbg -Depends: - syncd-vs (= ${binary:Version}), - ${misc:Depends} -Description: debugging symbols for syncd-vs - -Package: libsairedis-dbg -Architecture: any -Section: debug -Priority: extra -Depends: - libsairedis (= ${binary:Version}), - ${misc:Depends} -Description: debugging symbols for libsairedis - -Package: libsaivs-dbg -Architecture: any -Section: debug -Priority: extra -Depends: - libsaivs (= ${binary:Version}), - ${misc:Depends} -Description: debugging symbols for libsaivs - -Package: libsaimetadata-dbg -Architecture: any -Section: debug -Priority: extra -Depends: - libsaimetadata (= ${binary:Version}), - ${misc:Depends} -Description: debugging symbols for libsaimetadata - Package: python-pysairedis Architecture: any Build-Profiles: diff --git a/debian/libsaimetadata-dev.install b/debian/libsaimetadata-dev.install index a79656b388..877842eeb7 100644 --- a/debian/libsaimetadata-dev.install +++ b/debian/libsaimetadata-dev.install @@ -1,3 +1,5 @@ meta/sai*.h usr/include/sai meta/Sai*.h usr/include/sai SAI/meta/sai*.h usr/include/sai +usr/lib/*/libsaimetadata.so +usr/lib/*/libsaimeta.so diff --git a/debian/libsairedis-dev.install b/debian/libsairedis-dev.install index 21fa7340a1..d5750f6ddc 100644 --- a/debian/libsairedis-dev.install +++ b/debian/libsairedis-dev.install @@ -1 +1,2 @@ lib/sairedis.h usr/include/sai +usr/lib/*/libsairedis.so diff --git a/debian/rules b/debian/rules index 7568b68ca8..c66761544a 100755 --- a/debian/rules +++ b/debian/rules @@ -3,14 +3,6 @@ # output every command that modifies files on the build system. #export DH_VERBOSE = 1 -.ONESHELL: -SHELL = /bin/bash -.SHELLFLAGS += -ex - -# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/* -DPKG_EXPORT_BUILDFLAGS = 1 -include /usr/share/dpkg/default.mk - ifneq (${SWSS_COMMON_INC},) SWSS_COMMON_CONFIG = "--with-swss-common-inc=${SWSS_COMMON_INC}" endif @@ -21,7 +13,7 @@ ifneq (${SWSS_COMMON_LIB},) endif # see FEATURE AREAS in dpkg-buildflags(1) -#export DEB_BUILD_MAINT_OPTIONS = hardening=+all +export DEB_BUILD_MAINT_OPTIONS = hardening=+all # see ENVIRONMENT in dpkg-buildflags(1) # package maintainers to append CFLAGS @@ -31,45 +23,32 @@ endif DOPACKAGES = $(shell dh_listpackages) +configure_opts = --disable-static +ifeq ($(ENABLE_ASAN), y) + configure_opts += --enable-asan +endif + # For Debian jessie, stretch, and buster, and Ubuntu bionic and focal, build # Python 2 bindings. This is controlled by the build profile being used. -ifneq (,$(filter python-pysairedis,$(DOPACKAGES))) +ifeq (,$(filter nopython2,$(DEB_BUILD_PROFILES))) configure_opts += --enable-python2 else configure_opts += --disable-python2 endif -clean: - dh $@ --with autotools-dev - -build: - echo build stage is skipped. Please use binary to generate debian packages - -binary: binary-syncd-rpc binary-syncd - -binary-sairedis: - echo '--enable-syncd=no' > /tmp/syncd-build - ENABLESYNCD=no dh clean --with autotools-dev - dh build -N syncd -N syncd-dbg -N syncd-rpc -N syncd-rpc-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev - dh binary -N syncd -N syncd-dbg -N syncd-rpc -N syncd-rpc-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev - -binary-syncd: - echo > /tmp/syncd-build - dh clean --with autotools-dev - dh build -N syncd-rpc -N syncd-rpc-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev - dh binary -N syncd-rpc -N syncd-rpc-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev - -binary-syncd-rpc: | binary-syncd - echo '--enable-rpcserver=yes' > /tmp/syncd-build - dh clean --with autotools-dev - dh build -N syncd -N syncd-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev - dh binary -N syncd -N syncd-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev +ifneq ($(filter syncd,$(DEB_BUILD_PROFILES)),) +ifneq ($(filter rpc,$(DEB_BUILD_PROFILES)),) +configure_opts += --enable-rpcserver +endif +ifneq ($(filter vs,$(DEB_BUILD_PROFILES)),) +configure_opts += --with-sai=vs +endif +else +configure_opts += --disable-syncd +endif -binary-syncd-vs: - echo '--with-sai=vs' > /tmp/syncd-build - dh clean --with autotools-dev - dh build -N syncd -N syncd-dbg -N syncd-rpc -N syncd-rpc-dbg --with autotools-dev - dh binary -N syncd -N syncd-dbg -N syncd-rpc -N syncd-rpc-dbg --with autotools-dev +%: + dh $@ # dh_make generated override targets # This is example for Cmake (See https://bugs.debian.org/641051 ) @@ -77,32 +56,20 @@ binary-syncd-vs: # dh_auto_configure -- \ # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) -configure_opts = -ifeq ($(ENABLE_ASAN), y) - configure_opts += --enable-asan -endif - override_dh_auto_configure: - ./autogen.sh - dh_auto_configure -- $(DEB_CONFIGURE_EXTRA_FLAGS) $(shell cat /tmp/syncd-build) ${SWSS_COMMON_CONFIG} $(configure_opts) + dh_auto_configure -- ${SWSS_COMMON_CONFIG} $(configure_opts) override_dh_install: dh_install # Note: escape $ with an extra $ symbol - if egrep -q '(^| )--enable-rpcserver=yes( |$$)' /tmp/syncd-build && [ -f debian/syncd-rpc/usr/bin/syncd_init_common.sh ] ; then +ifneq ($(filter rpc,$(DEB_BUILD_PROFILES)),) + if [ -f debian/syncd-rpc/usr/bin/syncd_init_common.sh ] ; then sed -i 's|ENABLE_SAITHRIFT=0|ENABLE_SAITHRIFT=1 # Add a comment to fix https://github.com/Azure/sonic-buildimage/issues/2694 |' debian/syncd-rpc/usr/bin/syncd_init_common.sh fi +endif override_dh_installinit: dh_installinit --init-script=syncd override_dh_shlibdeps: - $(LD_LIBRARY_PATH_CONFIG) dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info - -override_dh_strip: - dh_strip -psyncd-rpc --dbg-package=syncd-rpc-dbg - dh_strip -psyncd --dbg-package=syncd-dbg - dh_strip -psyncd-vs --dbg-package=syncd-vs-dbg - dh_strip -plibsairedis --dbg-package=libsairedis-dbg - dh_strip -plibsaivs --dbg-package=libsaivs-dbg - dh_strip -plibsaimetadata --dbg-package=libsaimetadata-dbg + $(LD_LIBRARY_PATH_CONFIG) dh_shlibdeps -- --ignore-missing-info -xlibsai diff --git a/m4/ax_python3_devel.m4 b/m4/ax_python3_devel.m4 new file mode 100644 index 0000000000..d7df668c7f --- /dev/null +++ b/m4/ax_python3_devel.m4 @@ -0,0 +1,327 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_python_devel.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PYTHON3_DEVEL([version]) +# +# DESCRIPTION +# +# Note: Defines as a precious variable "PYTHON3_VERSION". Don't override it +# in your configure.ac. +# +# This macro checks for Python and tries to get the include path to +# 'Python.h'. It provides the $(PYTHON3_CPPFLAGS) and $(PYTHON3_LIBS) output +# variables. It also exports $(PYTHON3_EXTRA_LIBS) and +# $(PYTHON3_EXTRA_LDFLAGS) for embedding Python in your code. +# +# You can search for some particular version of Python by passing a +# parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please +# note that you *have* to pass also an operator along with the version to +# match, and pay special attention to the single quotes surrounding the +# version number. Don't use "PYTHON3_VERSION" for this: that environment +# variable is declared as precious and thus reserved for the end-user. +# +# This macro should work for all versions of Python >= 2.1.0. As an end +# user, you can disable the check for the python version by setting the +# PYTHON3_NOVERSIONCHECK environment variable to something else than the +# empty string. +# +# If you need to use this macro for an older Python version, please +# contact the authors. We're always open for feedback. +# +# LICENSE +# +# Copyright (c) 2009 Sebastian Huber +# Copyright (c) 2009 Alan W. Irwin +# Copyright (c) 2009 Rafael Laboissiere +# Copyright (c) 2009 Andrew Collier +# Copyright (c) 2009 Matteo Settenvini +# Copyright (c) 2009 Horst Knorr +# Copyright (c) 2013 Daniel Mullner +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 21 + +AU_ALIAS([AC_PYTHON3_DEVEL], [AX_PYTHON3_DEVEL]) +AC_DEFUN([AX_PYTHON3_DEVEL],[ + # + # Allow the use of a (user set) custom python version + # + AC_ARG_VAR([PYTHON3_VERSION],[The installed Python + version to use, for example '2.3'. This string + will be appended to the Python interpreter + canonical name.]) + + AC_PATH_PROG([PYTHON3],[python[$PYTHON3_VERSION]]) + if test -z "$PYTHON3"; then + AC_MSG_ERROR([Cannot find python$PYTHON3_VERSION in your system path]) + PYTHON3_VERSION="" + fi + + # + # Check for a version of Python >= 3.0 + # + AC_MSG_CHECKING([for a version of Python >= '3.0']) + ac_supports_python_ver=`$PYTHON3 -c "import sys; \ + ver = sys.version.split ()[[0]]; \ + print (ver >= '3.0')"` + if test "$ac_supports_python_ver" != "True"; then + if test -z "$PYTHON3_NOVERSIONCHECK"; then + AC_MSG_RESULT([no]) + AC_MSG_FAILURE([ +This version of the AC@&t@_PYTHON3_DEVEL macro +is not for versions of Python before +3.0. You may need to re-run configure, setting the +variables PYTHON3_CPPFLAGS, PYTHON3_LIBS, PYTHON3_SITE_PKG, +PYTHON3_EXTRA_LIBS and PYTHON3_EXTRA_LDFLAGS by hand. +Moreover, to disable this check, set PYTHON3_NOVERSIONCHECK +to something else than an empty string. +]) + else + AC_MSG_RESULT([skip at user request]) + fi + else + AC_MSG_RESULT([yes]) + fi + + # + # if the macro parameter ``version'' is set, honour it + # + if test -n "$1"; then + AC_MSG_CHECKING([for a version of Python $1]) + ac_supports_python_ver=`$PYTHON3 -c "import sys; \ + ver = sys.version.split ()[[0]]; \ + print (ver $1)"` + if test "$ac_supports_python_ver" = "True"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([this package requires Python $1. +If you have it installed, but it isn't the default Python +interpreter in your system path, please pass the PYTHON3_VERSION +variable to configure. See ``configure --help'' for reference. +]) + PYTHON3_VERSION="" + fi + fi + + # + # Check if you have distutils, else fail + # + AC_MSG_CHECKING([for the distutils Python package]) + ac_distutils_result=`$PYTHON3 -c "import distutils" 2>&1` + if test $? -eq 0; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([cannot import Python module "distutils". +Please check your Python installation. The error was: +$ac_distutils_result]) + PYTHON3_VERSION="" + fi + + # + # Check for Python include path + # + AC_MSG_CHECKING([for Python include path]) + if test -z "$PYTHON3_CPPFLAGS"; then + python_path=`$PYTHON3 -c "import distutils.sysconfig; \ + print (distutils.sysconfig.get_python_inc ());"` + plat_python_path=`$PYTHON3 -c "import distutils.sysconfig; \ + print (distutils.sysconfig.get_python_inc (plat_specific=1));"` + if test -n "${python_path}"; then + if test "${plat_python_path}" != "${python_path}"; then + python_path="-I$python_path -I$plat_python_path" + else + python_path="-I$python_path" + fi + fi + PYTHON3_CPPFLAGS=$python_path + fi + AC_MSG_RESULT([$PYTHON3_CPPFLAGS]) + AC_SUBST([PYTHON3_CPPFLAGS]) + + # + # Check for Python library path + # + AC_MSG_CHECKING([for Python library path]) + if test -z "$PYTHON3_LIBS"; then + # (makes two attempts to ensure we've got a version number + # from the interpreter) + ac_python_version=`cat<]], + [[Py_Initialize();]]) + ],[pythonexists=yes],[pythonexists=no]) + AC_LANG_POP([C]) + # turn back to default flags + CPPFLAGS="$ac_save_CPPFLAGS" + LIBS="$ac_save_LIBS" + LDFLAGS="$ac_save_LDFLAGS" + + AC_MSG_RESULT([$pythonexists]) + + if test ! "x$pythonexists" = "xyes"; then + AC_MSG_FAILURE([ + Could not link test program to Python. Maybe the main Python library has been + installed in some non-standard library path. If so, pass it to configure, + via the LIBS environment variable. + Example: ./configure LIBS="-L/usr/non-standard-path/python/lib" + ============================================================================ + ERROR! + You probably have to install the development version of the Python package + for your distribution. The exact name of this package varies among them. + ============================================================================ + ]) + PYTHON3_VERSION="" + fi + + # + # all done! + # +]) diff --git a/meta/Makefile.am b/meta/Makefile.am index 0667fb4bac..c2de85b3f6 100644 --- a/meta/Makefile.am +++ b/meta/Makefile.am @@ -8,10 +8,10 @@ BUILT_SOURCES = $(top_srcdir)/SAI/meta/saimetadata.c $(top_srcdir)/SAI/meta/saim $(top_srcdir)/SAI/meta/saimetadata.c $(top_srcdir)/SAI/meta/saimetadata.h: saimeta-gen saimeta-gen: - make -C $(top_srcdir)/SAI/meta saimetadata.c + $(MAKE) -C $(top_srcdir)/SAI/meta saimetadata.c clean-local: - make -C $(top_srcdir)/SAI/meta clean + $(MAKE) -C $(top_srcdir)/SAI/meta clean libsaimetadata_la_SOURCES = \ $(top_srcdir)/SAI/meta/saimetadata.c \ diff --git a/pyext/Makefile.am b/pyext/Makefile.am index ceeeba2143..f7c1915f79 100644 --- a/pyext/Makefile.am +++ b/pyext/Makefile.am @@ -1,3 +1,6 @@ -SUBDIRS = py2 py3 +SUBDIRS = py3 +if PYTHON2 +SUBDIRS += py2 +endif ACLOCAL_AMFLAGS = -I m4 diff --git a/pyext/py2/Makefile.am b/pyext/py2/Makefile.am index 981971d79b..6c6ed8ef6f 100644 --- a/pyext/py2/Makefile.am +++ b/pyext/py2/Makefile.am @@ -9,7 +9,7 @@ AM_CXXFLAGS = $(SAIINC) -I$(top_srcdir)/lib -I.. BUILT_SOURCES = pysairedis_wrap.cpp _pysairedis_la_SOURCES = pysairedis_wrap.cpp $(SOURCES) -_pysairedis_la_CXXFLAGS = -I/usr/include/python$(PYTHON_VERSION) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) \ +_pysairedis_la_CXXFLAGS = $(PYTHON2_CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) \ -Wno-cast-qual -Wno-shadow -Wno-redundant-decls -Wno-conversion $(NO_CAST_FUNCTION_TYPE) _pysairedis_la_LDFLAGS = -module \ @@ -18,7 +18,7 @@ _pysairedis_la_LDFLAGS = -module \ -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta \ -lzmq -_pysairedis_la_LIBADD = -lpython$(PYTHON_VERSION) +_pysairedis_la_LIBADD = $(PYTHON2_LIBS) SWIG_FLAG = -Wall -c++ -python -keyword if ARCH64 diff --git a/pyext/py3/Makefile.am b/pyext/py3/Makefile.am index 4d93a416de..e3b9364999 100644 --- a/pyext/py3/Makefile.am +++ b/pyext/py3/Makefile.am @@ -9,7 +9,7 @@ AM_CXXFLAGS = $(SAIINC) -I$(top_srcdir)/lib -I.. BUILT_SOURCES = pysairedis_wrap.cpp _pysairedis_la_SOURCES = pysairedis_wrap.cpp $(SOURCES) -_pysairedis_la_CXXFLAGS = -I/usr/include/python$(PYTHON3_VERSION) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) \ +_pysairedis_la_CXXFLAGS = $(PYTHON3_CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) \ -Wno-cast-qual -Wno-shadow -Wno-redundant-decls -Wno-conversion $(NO_CAST_FUNCTION_TYPE) _pysairedis_la_LDFLAGS = -module \ From 592cc1f911e74ce1aa84dabc024218494086ac0e Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Thu, 27 Oct 2022 08:33:58 -0700 Subject: [PATCH 3/5] Revert "Make changes to building and packaging sairedis (#1116)" (#1141) This may be causing or exposing some issues during tests. This reverts commit 7b39fc4a41febcf638c3925d2637059d36c8c701. --- .azure-pipelines/build-template.yml | 4 +- configure.ac | 23 +- debian/compat | 2 +- debian/control | 70 +++++- debian/libsaimetadata-dev.install | 2 - debian/libsairedis-dev.install | 1 - debian/rules | 81 +++++-- m4/ax_python3_devel.m4 | 327 ---------------------------- meta/Makefile.am | 4 +- pyext/Makefile.am | 5 +- pyext/py2/Makefile.am | 4 +- pyext/py3/Makefile.am | 2 +- 12 files changed, 125 insertions(+), 400 deletions(-) delete mode 100644 m4/ax_python3_devel.m4 diff --git a/.azure-pipelines/build-template.yml b/.azure-pipelines/build-template.yml index 01d3b07766..f50cd1c4fc 100644 --- a/.azure-pipelines/build-template.yml +++ b/.azure-pipelines/build-template.yml @@ -150,7 +150,7 @@ jobs: set -ex rm ../*.deb || true ./autogen.sh - DEB_BUILD_OPTIONS=nocheck DEB_CONFIGURE_EXTRA_FLAGS='--enable-code-coverage' dpkg-buildpackage -us -uc -b -Psyncd,vs -j$(nproc) + DEB_BUILD_OPTIONS=nocheck fakeroot debian/rules DEB_CONFIGURE_EXTRA_FLAGS='--enable-code-coverage' CFLAGS="" CXXFLAGS="" binary-syncd-vs mv ../*.deb . displayName: "Compile sonic sairedis with coverage enabled" - script: | @@ -209,6 +209,6 @@ jobs: contents: 'syslog-all.tgz' targetFolder: $(Build.ArtifactStagingDirectory) - publish: $(Build.ArtifactStagingDirectory)/ - artifact: ${{ parameters.syslog_artifact_name }}@$(System.JobAttempt) + artifact: ${{ parameters.syslog_artifact_name }} displayName: "Publish syslog artifacts" condition: always() diff --git a/configure.ac b/configure.ac index cd26cf139b..b477f6b966 100644 --- a/configure.ac +++ b/configure.ac @@ -10,8 +10,8 @@ AC_PROG_CC AC_PROG_CXX AC_PROG_LIBTOOL AC_HEADER_STDC +AM_PATH_PYTHON AM_PATH_PYTHON3 -AX_PYTHON3_DEVEL AX_CODE_COVERAGE AX_ADD_AM_MACRO_STATIC([]) @@ -101,14 +101,6 @@ AC_ARG_ENABLE(asan, *) AC_MSG_ERROR(bad value ${enableval} for --enable-asan) ;; esac],[asan_enabled=false]) -AC_ARG_ENABLE(python2, -[ --enable-python2 Generate Python 2 bindings], -[case "${enableval}" in - yes) python2=true ;; - no) python2=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-python2) ;; -esac],[python2=true]) - if test "x$asan_enabled" = "xtrue"; then CFLAGS_ASAN+=" -fsanitize=address" CFLAGS_ASAN+=" -DASAN_ENABLED" @@ -119,26 +111,13 @@ if test "x$asan_enabled" = "xtrue"; then AC_SUBST(LDFLAGS_ASAN) fi -if test "x$python2" = "xtrue"; then - m4_define_default([_AM_PYTHON_INTERPRETER_LIST], - [python2 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) - AM_PATH_PYTHON - AX_PYTHON_DEVEL([< '3']) - PYTHON2_CPPFLAGS=$PYTHON_CPPFLAGS - PYTHON2_LIBS=$PYTHON_LIBS - AC_SUBST(PYTHON2_CPPFLAGS) - AC_SUBST(PYTHON2_LIBS) -fi - AM_CONDITIONAL(ASAN_ENABLED, test x$asan_enabled = xtrue) -AM_CONDITIONAL(PYTHON2, test x$python2 = xtrue) AC_PATH_PROGS(SWIG, [swig3.0 swig]) CXXFLAGS_COMMON="" CXXFLAGS_COMMON+=" -ansi" CXXFLAGS_COMMON+=" -fPIC" -CXXFLAGS_COMMON+=" -pipe" CXXFLAGS_COMMON+=" -std=c++14" CXXFLAGS_COMMON+=" -Wall" CXXFLAGS_COMMON+=" -Wcast-align" diff --git a/debian/compat b/debian/compat index 48082f72f0..f599e28b8a 100644 --- a/debian/compat +++ b/debian/compat @@ -1 +1 @@ -12 +10 diff --git a/debian/control b/debian/control index a07ed6d806..5b5284e0b5 100644 --- a/debian/control +++ b/debian/control @@ -2,23 +2,17 @@ Source: sonic Maintainer: Kamil Cudnik Section: net Priority: optional -Build-Depends: debhelper (>= 12), autotools-dev, libzmq5-dev +Build-Depends: debhelper (>=9), autotools-dev, libzmq5-dev Standards-Version: 1.0.0 Package: syncd Architecture: any -Build-Profiles: -Depends: ${misc:Pre-Depends} -Recommends: ${shlibs:Depends} Conflicts: syncd-rpc, syncd-vs Description: This package contains sync daemon for SONiC project. This sync daemon syncs the ASIC_DB in Redis database and the real ASIC via SAI. Package: syncd-rpc Architecture: any -Build-Profiles: -Depends: ${misc:Pre-Depends} -Recommends: ${shlibs:Depends} Conflicts: syncd, syncd-vs Description: This package contains sync daemon with rpc for SONiC project. This sync daemon syncs the ASIC_DB in Redis database and the real ASIC via SAI. @@ -26,9 +20,6 @@ Description: This package contains sync daemon with rpc for SONiC project. Package: syncd-vs Architecture: any -Build-Profiles: -Depends: ${misc:Pre-Depends} -Recommends: ${shlibs:Depends} Conflicts: syncd-rpc, syncd Description: This package contains sync daemon for SONiC project linked with virtual switch. This sync daemon syncs the ASIC_DB in Redis database and the real ASIC via SAI. @@ -47,7 +38,6 @@ Description: This package contains development files for SAI-Redis. Package: libsaivs Architecture: any -Depends: ${shlibs:Depends}, ${misc:Pre-Depends} Section: libs Description: This package contains SAI-VirtualSwitch implementation for SONiC project. @@ -59,7 +49,6 @@ Description: This package contains development files for SAI-VirtualSwitch. Package: libsaimetadata Architecture: any -Depends: ${shlibs:Depends}, ${misc:Pre-Depends} Section: libs Description: This package contains SAI-Metadata implementation for SONiC project. @@ -69,6 +58,63 @@ Depends: libsaimetadata (= ${binary:Version}) Section: libdevel Description: This package contains development files for SAI-Metadata. +Package: syncd-dbg +Architecture: any +Section: debug +Priority: extra +Conflicts: syncd-rpc-dbg, syncd-vs +Depends: + syncd (= ${binary:Version}), + ${misc:Depends} +Description: debugging symbols for syncd + +Package: syncd-rpc-dbg +Architecture: any +Section: debug +Priority: extra +Conflicts: syncd-dbg, syncd-vs +Depends: + syncd-rpc (= ${binary:Version}), + ${misc:Depends} +Description: debugging symbols for syncd-rpc + +Package: syncd-vs-dbg +Architecture: any +Section: debug +Priority: extra +Conflicts: syncd-dbg, syncd-rpc-dbg +Depends: + syncd-vs (= ${binary:Version}), + ${misc:Depends} +Description: debugging symbols for syncd-vs + +Package: libsairedis-dbg +Architecture: any +Section: debug +Priority: extra +Depends: + libsairedis (= ${binary:Version}), + ${misc:Depends} +Description: debugging symbols for libsairedis + +Package: libsaivs-dbg +Architecture: any +Section: debug +Priority: extra +Depends: + libsaivs (= ${binary:Version}), + ${misc:Depends} +Description: debugging symbols for libsaivs + +Package: libsaimetadata-dbg +Architecture: any +Section: debug +Priority: extra +Depends: + libsaimetadata (= ${binary:Version}), + ${misc:Depends} +Description: debugging symbols for libsaimetadata + Package: python-pysairedis Architecture: any Build-Profiles: diff --git a/debian/libsaimetadata-dev.install b/debian/libsaimetadata-dev.install index 877842eeb7..a79656b388 100644 --- a/debian/libsaimetadata-dev.install +++ b/debian/libsaimetadata-dev.install @@ -1,5 +1,3 @@ meta/sai*.h usr/include/sai meta/Sai*.h usr/include/sai SAI/meta/sai*.h usr/include/sai -usr/lib/*/libsaimetadata.so -usr/lib/*/libsaimeta.so diff --git a/debian/libsairedis-dev.install b/debian/libsairedis-dev.install index d5750f6ddc..21fa7340a1 100644 --- a/debian/libsairedis-dev.install +++ b/debian/libsairedis-dev.install @@ -1,2 +1 @@ lib/sairedis.h usr/include/sai -usr/lib/*/libsairedis.so diff --git a/debian/rules b/debian/rules index c66761544a..7568b68ca8 100755 --- a/debian/rules +++ b/debian/rules @@ -3,6 +3,14 @@ # output every command that modifies files on the build system. #export DH_VERBOSE = 1 +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -ex + +# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/* +DPKG_EXPORT_BUILDFLAGS = 1 +include /usr/share/dpkg/default.mk + ifneq (${SWSS_COMMON_INC},) SWSS_COMMON_CONFIG = "--with-swss-common-inc=${SWSS_COMMON_INC}" endif @@ -13,7 +21,7 @@ ifneq (${SWSS_COMMON_LIB},) endif # see FEATURE AREAS in dpkg-buildflags(1) -export DEB_BUILD_MAINT_OPTIONS = hardening=+all +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all # see ENVIRONMENT in dpkg-buildflags(1) # package maintainers to append CFLAGS @@ -23,32 +31,45 @@ export DEB_BUILD_MAINT_OPTIONS = hardening=+all DOPACKAGES = $(shell dh_listpackages) -configure_opts = --disable-static -ifeq ($(ENABLE_ASAN), y) - configure_opts += --enable-asan -endif - # For Debian jessie, stretch, and buster, and Ubuntu bionic and focal, build # Python 2 bindings. This is controlled by the build profile being used. -ifeq (,$(filter nopython2,$(DEB_BUILD_PROFILES))) +ifneq (,$(filter python-pysairedis,$(DOPACKAGES))) configure_opts += --enable-python2 else configure_opts += --disable-python2 endif -ifneq ($(filter syncd,$(DEB_BUILD_PROFILES)),) -ifneq ($(filter rpc,$(DEB_BUILD_PROFILES)),) -configure_opts += --enable-rpcserver -endif -ifneq ($(filter vs,$(DEB_BUILD_PROFILES)),) -configure_opts += --with-sai=vs -endif -else -configure_opts += --disable-syncd -endif +clean: + dh $@ --with autotools-dev + +build: + echo build stage is skipped. Please use binary to generate debian packages -%: - dh $@ +binary: binary-syncd-rpc binary-syncd + +binary-sairedis: + echo '--enable-syncd=no' > /tmp/syncd-build + ENABLESYNCD=no dh clean --with autotools-dev + dh build -N syncd -N syncd-dbg -N syncd-rpc -N syncd-rpc-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev + dh binary -N syncd -N syncd-dbg -N syncd-rpc -N syncd-rpc-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev + +binary-syncd: + echo > /tmp/syncd-build + dh clean --with autotools-dev + dh build -N syncd-rpc -N syncd-rpc-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev + dh binary -N syncd-rpc -N syncd-rpc-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev + +binary-syncd-rpc: | binary-syncd + echo '--enable-rpcserver=yes' > /tmp/syncd-build + dh clean --with autotools-dev + dh build -N syncd -N syncd-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev + dh binary -N syncd -N syncd-dbg -N syncd-vs -N syncd-vs-dbg --with autotools-dev + +binary-syncd-vs: + echo '--with-sai=vs' > /tmp/syncd-build + dh clean --with autotools-dev + dh build -N syncd -N syncd-dbg -N syncd-rpc -N syncd-rpc-dbg --with autotools-dev + dh binary -N syncd -N syncd-dbg -N syncd-rpc -N syncd-rpc-dbg --with autotools-dev # dh_make generated override targets # This is example for Cmake (See https://bugs.debian.org/641051 ) @@ -56,20 +77,32 @@ endif # dh_auto_configure -- \ # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) +configure_opts = +ifeq ($(ENABLE_ASAN), y) + configure_opts += --enable-asan +endif + override_dh_auto_configure: - dh_auto_configure -- ${SWSS_COMMON_CONFIG} $(configure_opts) + ./autogen.sh + dh_auto_configure -- $(DEB_CONFIGURE_EXTRA_FLAGS) $(shell cat /tmp/syncd-build) ${SWSS_COMMON_CONFIG} $(configure_opts) override_dh_install: dh_install # Note: escape $ with an extra $ symbol -ifneq ($(filter rpc,$(DEB_BUILD_PROFILES)),) - if [ -f debian/syncd-rpc/usr/bin/syncd_init_common.sh ] ; then + if egrep -q '(^| )--enable-rpcserver=yes( |$$)' /tmp/syncd-build && [ -f debian/syncd-rpc/usr/bin/syncd_init_common.sh ] ; then sed -i 's|ENABLE_SAITHRIFT=0|ENABLE_SAITHRIFT=1 # Add a comment to fix https://github.com/Azure/sonic-buildimage/issues/2694 |' debian/syncd-rpc/usr/bin/syncd_init_common.sh fi -endif override_dh_installinit: dh_installinit --init-script=syncd override_dh_shlibdeps: - $(LD_LIBRARY_PATH_CONFIG) dh_shlibdeps -- --ignore-missing-info -xlibsai + $(LD_LIBRARY_PATH_CONFIG) dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info + +override_dh_strip: + dh_strip -psyncd-rpc --dbg-package=syncd-rpc-dbg + dh_strip -psyncd --dbg-package=syncd-dbg + dh_strip -psyncd-vs --dbg-package=syncd-vs-dbg + dh_strip -plibsairedis --dbg-package=libsairedis-dbg + dh_strip -plibsaivs --dbg-package=libsaivs-dbg + dh_strip -plibsaimetadata --dbg-package=libsaimetadata-dbg diff --git a/m4/ax_python3_devel.m4 b/m4/ax_python3_devel.m4 deleted file mode 100644 index d7df668c7f..0000000000 --- a/m4/ax_python3_devel.m4 +++ /dev/null @@ -1,327 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_python_devel.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PYTHON3_DEVEL([version]) -# -# DESCRIPTION -# -# Note: Defines as a precious variable "PYTHON3_VERSION". Don't override it -# in your configure.ac. -# -# This macro checks for Python and tries to get the include path to -# 'Python.h'. It provides the $(PYTHON3_CPPFLAGS) and $(PYTHON3_LIBS) output -# variables. It also exports $(PYTHON3_EXTRA_LIBS) and -# $(PYTHON3_EXTRA_LDFLAGS) for embedding Python in your code. -# -# You can search for some particular version of Python by passing a -# parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please -# note that you *have* to pass also an operator along with the version to -# match, and pay special attention to the single quotes surrounding the -# version number. Don't use "PYTHON3_VERSION" for this: that environment -# variable is declared as precious and thus reserved for the end-user. -# -# This macro should work for all versions of Python >= 2.1.0. As an end -# user, you can disable the check for the python version by setting the -# PYTHON3_NOVERSIONCHECK environment variable to something else than the -# empty string. -# -# If you need to use this macro for an older Python version, please -# contact the authors. We're always open for feedback. -# -# LICENSE -# -# Copyright (c) 2009 Sebastian Huber -# Copyright (c) 2009 Alan W. Irwin -# Copyright (c) 2009 Rafael Laboissiere -# Copyright (c) 2009 Andrew Collier -# Copyright (c) 2009 Matteo Settenvini -# Copyright (c) 2009 Horst Knorr -# Copyright (c) 2013 Daniel Mullner -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 21 - -AU_ALIAS([AC_PYTHON3_DEVEL], [AX_PYTHON3_DEVEL]) -AC_DEFUN([AX_PYTHON3_DEVEL],[ - # - # Allow the use of a (user set) custom python version - # - AC_ARG_VAR([PYTHON3_VERSION],[The installed Python - version to use, for example '2.3'. This string - will be appended to the Python interpreter - canonical name.]) - - AC_PATH_PROG([PYTHON3],[python[$PYTHON3_VERSION]]) - if test -z "$PYTHON3"; then - AC_MSG_ERROR([Cannot find python$PYTHON3_VERSION in your system path]) - PYTHON3_VERSION="" - fi - - # - # Check for a version of Python >= 3.0 - # - AC_MSG_CHECKING([for a version of Python >= '3.0']) - ac_supports_python_ver=`$PYTHON3 -c "import sys; \ - ver = sys.version.split ()[[0]]; \ - print (ver >= '3.0')"` - if test "$ac_supports_python_ver" != "True"; then - if test -z "$PYTHON3_NOVERSIONCHECK"; then - AC_MSG_RESULT([no]) - AC_MSG_FAILURE([ -This version of the AC@&t@_PYTHON3_DEVEL macro -is not for versions of Python before -3.0. You may need to re-run configure, setting the -variables PYTHON3_CPPFLAGS, PYTHON3_LIBS, PYTHON3_SITE_PKG, -PYTHON3_EXTRA_LIBS and PYTHON3_EXTRA_LDFLAGS by hand. -Moreover, to disable this check, set PYTHON3_NOVERSIONCHECK -to something else than an empty string. -]) - else - AC_MSG_RESULT([skip at user request]) - fi - else - AC_MSG_RESULT([yes]) - fi - - # - # if the macro parameter ``version'' is set, honour it - # - if test -n "$1"; then - AC_MSG_CHECKING([for a version of Python $1]) - ac_supports_python_ver=`$PYTHON3 -c "import sys; \ - ver = sys.version.split ()[[0]]; \ - print (ver $1)"` - if test "$ac_supports_python_ver" = "True"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - AC_MSG_ERROR([this package requires Python $1. -If you have it installed, but it isn't the default Python -interpreter in your system path, please pass the PYTHON3_VERSION -variable to configure. See ``configure --help'' for reference. -]) - PYTHON3_VERSION="" - fi - fi - - # - # Check if you have distutils, else fail - # - AC_MSG_CHECKING([for the distutils Python package]) - ac_distutils_result=`$PYTHON3 -c "import distutils" 2>&1` - if test $? -eq 0; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - AC_MSG_ERROR([cannot import Python module "distutils". -Please check your Python installation. The error was: -$ac_distutils_result]) - PYTHON3_VERSION="" - fi - - # - # Check for Python include path - # - AC_MSG_CHECKING([for Python include path]) - if test -z "$PYTHON3_CPPFLAGS"; then - python_path=`$PYTHON3 -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc ());"` - plat_python_path=`$PYTHON3 -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc (plat_specific=1));"` - if test -n "${python_path}"; then - if test "${plat_python_path}" != "${python_path}"; then - python_path="-I$python_path -I$plat_python_path" - else - python_path="-I$python_path" - fi - fi - PYTHON3_CPPFLAGS=$python_path - fi - AC_MSG_RESULT([$PYTHON3_CPPFLAGS]) - AC_SUBST([PYTHON3_CPPFLAGS]) - - # - # Check for Python library path - # - AC_MSG_CHECKING([for Python library path]) - if test -z "$PYTHON3_LIBS"; then - # (makes two attempts to ensure we've got a version number - # from the interpreter) - ac_python_version=`cat<]], - [[Py_Initialize();]]) - ],[pythonexists=yes],[pythonexists=no]) - AC_LANG_POP([C]) - # turn back to default flags - CPPFLAGS="$ac_save_CPPFLAGS" - LIBS="$ac_save_LIBS" - LDFLAGS="$ac_save_LDFLAGS" - - AC_MSG_RESULT([$pythonexists]) - - if test ! "x$pythonexists" = "xyes"; then - AC_MSG_FAILURE([ - Could not link test program to Python. Maybe the main Python library has been - installed in some non-standard library path. If so, pass it to configure, - via the LIBS environment variable. - Example: ./configure LIBS="-L/usr/non-standard-path/python/lib" - ============================================================================ - ERROR! - You probably have to install the development version of the Python package - for your distribution. The exact name of this package varies among them. - ============================================================================ - ]) - PYTHON3_VERSION="" - fi - - # - # all done! - # -]) diff --git a/meta/Makefile.am b/meta/Makefile.am index c2de85b3f6..0667fb4bac 100644 --- a/meta/Makefile.am +++ b/meta/Makefile.am @@ -8,10 +8,10 @@ BUILT_SOURCES = $(top_srcdir)/SAI/meta/saimetadata.c $(top_srcdir)/SAI/meta/saim $(top_srcdir)/SAI/meta/saimetadata.c $(top_srcdir)/SAI/meta/saimetadata.h: saimeta-gen saimeta-gen: - $(MAKE) -C $(top_srcdir)/SAI/meta saimetadata.c + make -C $(top_srcdir)/SAI/meta saimetadata.c clean-local: - $(MAKE) -C $(top_srcdir)/SAI/meta clean + make -C $(top_srcdir)/SAI/meta clean libsaimetadata_la_SOURCES = \ $(top_srcdir)/SAI/meta/saimetadata.c \ diff --git a/pyext/Makefile.am b/pyext/Makefile.am index f7c1915f79..ceeeba2143 100644 --- a/pyext/Makefile.am +++ b/pyext/Makefile.am @@ -1,6 +1,3 @@ -SUBDIRS = py3 -if PYTHON2 -SUBDIRS += py2 -endif +SUBDIRS = py2 py3 ACLOCAL_AMFLAGS = -I m4 diff --git a/pyext/py2/Makefile.am b/pyext/py2/Makefile.am index 6c6ed8ef6f..981971d79b 100644 --- a/pyext/py2/Makefile.am +++ b/pyext/py2/Makefile.am @@ -9,7 +9,7 @@ AM_CXXFLAGS = $(SAIINC) -I$(top_srcdir)/lib -I.. BUILT_SOURCES = pysairedis_wrap.cpp _pysairedis_la_SOURCES = pysairedis_wrap.cpp $(SOURCES) -_pysairedis_la_CXXFLAGS = $(PYTHON2_CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) \ +_pysairedis_la_CXXFLAGS = -I/usr/include/python$(PYTHON_VERSION) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) \ -Wno-cast-qual -Wno-shadow -Wno-redundant-decls -Wno-conversion $(NO_CAST_FUNCTION_TYPE) _pysairedis_la_LDFLAGS = -module \ @@ -18,7 +18,7 @@ _pysairedis_la_LDFLAGS = -module \ -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta \ -lzmq -_pysairedis_la_LIBADD = $(PYTHON2_LIBS) +_pysairedis_la_LIBADD = -lpython$(PYTHON_VERSION) SWIG_FLAG = -Wall -c++ -python -keyword if ARCH64 diff --git a/pyext/py3/Makefile.am b/pyext/py3/Makefile.am index e3b9364999..4d93a416de 100644 --- a/pyext/py3/Makefile.am +++ b/pyext/py3/Makefile.am @@ -9,7 +9,7 @@ AM_CXXFLAGS = $(SAIINC) -I$(top_srcdir)/lib -I.. BUILT_SOURCES = pysairedis_wrap.cpp _pysairedis_la_SOURCES = pysairedis_wrap.cpp $(SOURCES) -_pysairedis_la_CXXFLAGS = $(PYTHON3_CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) \ +_pysairedis_la_CXXFLAGS = -I/usr/include/python$(PYTHON3_VERSION) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) \ -Wno-cast-qual -Wno-shadow -Wno-redundant-decls -Wno-conversion $(NO_CAST_FUNCTION_TYPE) _pysairedis_la_LDFLAGS = -module \ From 28c90ae398cd78e46cfa3c469b0ea4434812d549 Mon Sep 17 00:00:00 2001 From: Suman Kumar <73022268+sumanbrcm@users.noreply.github.com> Date: Thu, 10 Nov 2022 08:38:39 +0530 Subject: [PATCH 4/5] sairedis: Fixing race condition for rif counters (#1136) * Fixing issue #11621 * The cleanup code for stale rif counters are now moved to syncd . Earlier as part of fix for issue #2193 the cleanup for stale rif counters was added. * But it could create a race condition between orchagent removes RIF rate counters from DB and lua script fetching them. * So as a fix all such cleanup has been moved to syncd. Signed-off-by: Suman Kumar --- syncd/FlexCounter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index 49d9c4d63c..4352efded2 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -1521,6 +1521,7 @@ void FlexCounter::removeCounter( { if (hasCounterContext(COUNTER_TYPE_RIF)) { + removeDataFromCountersDB(vid, ":RIF"); getCounterContext(COUNTER_TYPE_RIF)->removeObject(vid); } } From b6468f4ad3b13d5bc566ef31db5b380ce49c4a86 Mon Sep 17 00:00:00 2001 From: "Richard.Yu" Date: Wed, 16 Nov 2022 10:33:11 +0800 Subject: [PATCH 5/5] [SAI submodule update] Enable support for SAI v1.11.0 (#1140) * [SAI submodule update] Enable support for SAI v1.11.0 Signed-off-by: richardyu-ms * update SAI for saithift fix * upgrade to latest sai 1.11 add cases fix a code issue Signed-off-by: richardyu-ms * refactor code Signed-off-by: richardyu-ms Signed-off-by: richardyu-ms --- SAI | 2 +- lib/ClientSai.cpp | 44 ++++++ lib/Makefile.am | 1 + lib/RedisRemoteSaiInterface.cpp | 67 ++++++++++ lib/sai_redis.h | 95 ++++++------- lib/sai_redis_genericprogrammable.cpp | 7 + lib/sai_redis_interfacequery.cpp | 1 + lib/sai_redis_neighbor.cpp | 4 +- lib/sai_redis_nexthopgroup.cpp | 4 +- lib/sai_redis_switch.cpp | 26 ++++ lib/sai_redis_tunnel.cpp | 4 +- meta/DummySaiInterface.cpp | 45 +++++++ meta/Meta.cpp | 178 +++++++++++++++++++++++- meta/SaiInterface.h | 1 + meta/SaiSerialize.cpp | 186 +++++++++++++++++++++++++- syncd/VendorSai.cpp | 74 ++++++++++ unittest/lib/TestClientServerSai.cpp | 18 +++ unittest/meta/TestMeta.cpp | 145 ++++++++++++++++++++ unittest/meta/TestSaiSerialize.cpp | 38 ++++++ unittest/syncd/TestVendorSai.cpp | 146 ++++++++++++++++++++ vslib/Makefile.am | 1 + vslib/VirtualSwitchSaiInterface.cpp | 66 +++++++++ vslib/sai_vs.h | 95 ++++++------- vslib/sai_vs_genericprogrammable.cpp | 7 + vslib/sai_vs_interfacequery.cpp | 1 + vslib/sai_vs_neighbor.cpp | 3 + vslib/sai_vs_nexthopgroup.cpp | 4 +- vslib/sai_vs_switch.cpp | 27 +++- vslib/sai_vs_tunnel.cpp | 4 +- 29 files changed, 1187 insertions(+), 107 deletions(-) create mode 100644 lib/sai_redis_genericprogrammable.cpp create mode 100644 vslib/sai_vs_genericprogrammable.cpp diff --git a/SAI b/SAI index 566d4a8ef2..bee5d7c219 160000 --- a/SAI +++ b/SAI @@ -1 +1 @@ -Subproject commit 566d4a8ef2e90bee986133042c4f8c2d7478a107 +Subproject commit bee5d7c21906d38067300aa70c9ab872539e0374 diff --git a/lib/ClientSai.cpp b/lib/ClientSai.cpp index f51af7f8a4..c4b9397cd1 100644 --- a/lib/ClientSai.cpp +++ b/lib/ClientSai.cpp @@ -1260,6 +1260,23 @@ sai_status_t ClientSai::bulkCreate( object_statuses); } +sai_status_t ClientSai::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t* neighbor_entry, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + REDIS_CHECK_API_INITIALIZED(); + + // TODO support mode + + return SAI_STATUS_NOT_IMPLEMENTED; +} + // BULK CREATE HELPERS sai_status_t ClientSai::bulkCreate( @@ -1436,6 +1453,19 @@ sai_status_t ClientSai::bulkRemove( return bulkRemove(SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, mode, object_statuses); } +sai_status_t ClientSai::bulkRemove( + _In_ uint32_t object_count, + _In_ const _sai_neighbor_entry_t *neighbor_entry, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + REDIS_CHECK_API_INITIALIZED(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + // BULK REMOVE HELPERS sai_status_t ClientSai::bulkRemove( @@ -1607,6 +1637,20 @@ sai_status_t ClientSai::bulkSet( return bulkSet(SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); } +sai_status_t ClientSai::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + REDIS_CHECK_API_INITIALIZED(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + // BULK SET HELPERS sai_status_t ClientSai::bulkSet( diff --git a/lib/Makefile.am b/lib/Makefile.am index e9d21e22b5..faa34a77e3 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -38,6 +38,7 @@ libsairedis_la_SOURCES = \ sai_redis_debug_counter.cpp \ sai_redis_dtel.cpp \ sai_redis_fdb.cpp \ + sai_redis_genericprogrammable.cpp \ sai_redis_hash.cpp \ sai_redis_hostif.cpp \ sai_redis_interfacequery.cpp \ diff --git a/lib/RedisRemoteSaiInterface.cpp b/lib/RedisRemoteSaiInterface.cpp index 47e4630f83..96f75edf5e 100644 --- a/lib/RedisRemoteSaiInterface.cpp +++ b/lib/RedisRemoteSaiInterface.cpp @@ -1453,6 +1453,24 @@ sai_status_t RedisRemoteSaiInterface::bulkRemove( return bulkRemove(SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, mode, object_statuses); } +sai_status_t RedisRemoteSaiInterface::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + std::vector serializedObjectIds; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + serializedObjectIds.emplace_back(sai_serialize_neighbor_entry(neighbor_entry[idx])); + } + + return bulkRemove(SAI_OBJECT_TYPE_NEIGHBOR_ENTRY, serializedObjectIds, mode, object_statuses); +} + sai_status_t RedisRemoteSaiInterface::bulkSet( _In_ sai_object_type_t object_type, _In_ uint32_t object_count, @@ -1568,6 +1586,25 @@ sai_status_t RedisRemoteSaiInterface::bulkSet( return bulkSet(SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); } +sai_status_t RedisRemoteSaiInterface::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + std::vector serializedObjectIds; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + serializedObjectIds.emplace_back(sai_serialize_neighbor_entry(neighbor_entry[idx])); + } + + return bulkSet(SAI_OBJECT_TYPE_NEIGHBOR_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); +} + sai_status_t RedisRemoteSaiInterface::bulkSet( _In_ sai_object_type_t object_type, _In_ const std::vector &serialized_object_ids, @@ -1877,6 +1914,36 @@ sai_status_t RedisRemoteSaiInterface::bulkCreate( object_statuses); } +sai_status_t RedisRemoteSaiInterface::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t* neighbor_entry, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + // TODO support mode + + std::vector serialized_object_ids; + + // on create vid is put in db by syncd + for (uint32_t idx = 0; idx < object_count; idx++) + { + std::string str_object_id = sai_serialize_neighbor_entry(neighbor_entry[idx]); + serialized_object_ids.push_back(str_object_id); + } + + return bulkCreate( + SAI_OBJECT_TYPE_NEIGHBOR_ENTRY, + serialized_object_ids, + attr_count, + attr_list, + mode, + object_statuses); +} + sai_status_t RedisRemoteSaiInterface::notifySyncd( _In_ sai_object_id_t switchId, _In_ sai_redis_notify_syncd_t redisNotifySyncd) diff --git a/lib/sai_redis.h b/lib/sai_redis.h index 2f3de17d28..9470b7a45c 100644 --- a/lib/sai_redis.h +++ b/lib/sai_redis.h @@ -13,53 +13,54 @@ extern "C" { #define PRIVATE __attribute__((visibility("hidden"))) -PRIVATE extern const sai_acl_api_t redis_acl_api; -PRIVATE extern const sai_bfd_api_t redis_bfd_api; -PRIVATE extern const sai_bmtor_api_t redis_bmtor_api; -PRIVATE extern const sai_bridge_api_t redis_bridge_api; -PRIVATE extern const sai_buffer_api_t redis_buffer_api; -PRIVATE extern const sai_counter_api_t redis_counter_api; -PRIVATE extern const sai_debug_counter_api_t redis_debug_counter_api; -PRIVATE extern const sai_dtel_api_t redis_dtel_api; -PRIVATE extern const sai_fdb_api_t redis_fdb_api; -PRIVATE extern const sai_hash_api_t redis_hash_api; -PRIVATE extern const sai_hostif_api_t redis_hostif_api; -PRIVATE extern const sai_ipmc_api_t redis_ipmc_api; -PRIVATE extern const sai_ipmc_group_api_t redis_ipmc_group_api; -PRIVATE extern const sai_isolation_group_api_t redis_isolation_group_api; -PRIVATE extern const sai_l2mc_api_t redis_l2mc_api; -PRIVATE extern const sai_l2mc_group_api_t redis_l2mc_group_api; -PRIVATE extern const sai_lag_api_t redis_lag_api; -PRIVATE extern const sai_macsec_api_t redis_macsec_api; -PRIVATE extern const sai_mcast_fdb_api_t redis_mcast_fdb_api; -PRIVATE extern const sai_mirror_api_t redis_mirror_api; -PRIVATE extern const sai_mpls_api_t redis_mpls_api; -PRIVATE extern const sai_nat_api_t redis_nat_api; -PRIVATE extern const sai_neighbor_api_t redis_neighbor_api; -PRIVATE extern const sai_next_hop_api_t redis_next_hop_api; -PRIVATE extern const sai_next_hop_group_api_t redis_next_hop_group_api; -PRIVATE extern const sai_policer_api_t redis_policer_api; -PRIVATE extern const sai_port_api_t redis_port_api; -PRIVATE extern const sai_qos_map_api_t redis_qos_map_api; -PRIVATE extern const sai_queue_api_t redis_queue_api; -PRIVATE extern const sai_route_api_t redis_route_api; -PRIVATE extern const sai_router_interface_api_t redis_router_interface_api; -PRIVATE extern const sai_rpf_group_api_t redis_rpf_group_api; -PRIVATE extern const sai_samplepacket_api_t redis_samplepacket_api; -PRIVATE extern const sai_scheduler_api_t redis_scheduler_api; -PRIVATE extern const sai_scheduler_group_api_t redis_scheduler_group_api; -PRIVATE extern const sai_srv6_api_t redis_srv6_api; -PRIVATE extern const sai_stp_api_t redis_stp_api; -PRIVATE extern const sai_switch_api_t redis_switch_api; -PRIVATE extern const sai_system_port_api_t redis_system_port_api; -PRIVATE extern const sai_tam_api_t redis_tam_api; -PRIVATE extern const sai_tunnel_api_t redis_tunnel_api; -PRIVATE extern const sai_udf_api_t redis_udf_api; -PRIVATE extern const sai_virtual_router_api_t redis_virtual_router_api; -PRIVATE extern const sai_vlan_api_t redis_vlan_api; -PRIVATE extern const sai_wred_api_t redis_wred_api; -PRIVATE extern const sai_my_mac_api_t redis_my_mac_api; -PRIVATE extern const sai_ipsec_api_t redis_ipsec_api; +PRIVATE extern const sai_acl_api_t redis_acl_api; +PRIVATE extern const sai_bfd_api_t redis_bfd_api; +PRIVATE extern const sai_bmtor_api_t redis_bmtor_api; +PRIVATE extern const sai_generic_programmable_api_t redis_generic_programmable_api; +PRIVATE extern const sai_bridge_api_t redis_bridge_api; +PRIVATE extern const sai_buffer_api_t redis_buffer_api; +PRIVATE extern const sai_counter_api_t redis_counter_api; +PRIVATE extern const sai_debug_counter_api_t redis_debug_counter_api; +PRIVATE extern const sai_dtel_api_t redis_dtel_api; +PRIVATE extern const sai_fdb_api_t redis_fdb_api; +PRIVATE extern const sai_hash_api_t redis_hash_api; +PRIVATE extern const sai_hostif_api_t redis_hostif_api; +PRIVATE extern const sai_ipmc_api_t redis_ipmc_api; +PRIVATE extern const sai_ipmc_group_api_t redis_ipmc_group_api; +PRIVATE extern const sai_isolation_group_api_t redis_isolation_group_api; +PRIVATE extern const sai_l2mc_api_t redis_l2mc_api; +PRIVATE extern const sai_l2mc_group_api_t redis_l2mc_group_api; +PRIVATE extern const sai_lag_api_t redis_lag_api; +PRIVATE extern const sai_macsec_api_t redis_macsec_api; +PRIVATE extern const sai_mcast_fdb_api_t redis_mcast_fdb_api; +PRIVATE extern const sai_mirror_api_t redis_mirror_api; +PRIVATE extern const sai_mpls_api_t redis_mpls_api; +PRIVATE extern const sai_nat_api_t redis_nat_api; +PRIVATE extern const sai_neighbor_api_t redis_neighbor_api; +PRIVATE extern const sai_next_hop_api_t redis_next_hop_api; +PRIVATE extern const sai_next_hop_group_api_t redis_next_hop_group_api; +PRIVATE extern const sai_policer_api_t redis_policer_api; +PRIVATE extern const sai_port_api_t redis_port_api; +PRIVATE extern const sai_qos_map_api_t redis_qos_map_api; +PRIVATE extern const sai_queue_api_t redis_queue_api; +PRIVATE extern const sai_route_api_t redis_route_api; +PRIVATE extern const sai_router_interface_api_t redis_router_interface_api; +PRIVATE extern const sai_rpf_group_api_t redis_rpf_group_api; +PRIVATE extern const sai_samplepacket_api_t redis_samplepacket_api; +PRIVATE extern const sai_scheduler_api_t redis_scheduler_api; +PRIVATE extern const sai_scheduler_group_api_t redis_scheduler_group_api; +PRIVATE extern const sai_srv6_api_t redis_srv6_api; +PRIVATE extern const sai_stp_api_t redis_stp_api; +PRIVATE extern const sai_switch_api_t redis_switch_api; +PRIVATE extern const sai_system_port_api_t redis_system_port_api; +PRIVATE extern const sai_tam_api_t redis_tam_api; +PRIVATE extern const sai_tunnel_api_t redis_tunnel_api; +PRIVATE extern const sai_udf_api_t redis_udf_api; +PRIVATE extern const sai_virtual_router_api_t redis_virtual_router_api; +PRIVATE extern const sai_vlan_api_t redis_vlan_api; +PRIVATE extern const sai_wred_api_t redis_wred_api; +PRIVATE extern const sai_my_mac_api_t redis_my_mac_api; +PRIVATE extern const sai_ipsec_api_t redis_ipsec_api; PRIVATE extern std::shared_ptr redis_sai; diff --git a/lib/sai_redis_genericprogrammable.cpp b/lib/sai_redis_genericprogrammable.cpp new file mode 100644 index 0000000000..5879176387 --- /dev/null +++ b/lib/sai_redis_genericprogrammable.cpp @@ -0,0 +1,7 @@ +#include "sai_redis.h" + +REDIS_GENERIC_QUAD(GENERIC_PROGRAMMABLE,generic_programmable); + +const sai_generic_programmable_api_t redis_generic_programmable_api = { + REDIS_GENERIC_QUAD_API(generic_programmable) +}; diff --git a/lib/sai_redis_interfacequery.cpp b/lib/sai_redis_interfacequery.cpp index d65c0a2c29..46890ae746 100644 --- a/lib/sai_redis_interfacequery.cpp +++ b/lib/sai_redis_interfacequery.cpp @@ -79,6 +79,7 @@ static sai_apis_t redis_apis = { API(system_port), API(my_mac), API(ipsec), + API(generic_programmable), API(bmtor), }; diff --git a/lib/sai_redis_neighbor.cpp b/lib/sai_redis_neighbor.cpp index cb367da43a..e189a775c4 100644 --- a/lib/sai_redis_neighbor.cpp +++ b/lib/sai_redis_neighbor.cpp @@ -8,11 +8,13 @@ static sai_status_t redis_remove_all_neighbor_entries( return SAI_STATUS_NOT_IMPLEMENTED; } +REDIS_BULK_QUAD_ENTRY(NEIGHBOR_ENTRY,neighbor_entry); REDIS_GENERIC_QUAD_ENTRY(NEIGHBOR_ENTRY,neighbor_entry); const sai_neighbor_api_t redis_neighbor_api = { REDIS_GENERIC_QUAD_API(neighbor_entry) - redis_remove_all_neighbor_entries, + + REDIS_BULK_QUAD_API(neighbor_entry) }; diff --git a/lib/sai_redis_nexthopgroup.cpp b/lib/sai_redis_nexthopgroup.cpp index f7c2dd8b64..98ac1662b9 100644 --- a/lib/sai_redis_nexthopgroup.cpp +++ b/lib/sai_redis_nexthopgroup.cpp @@ -16,6 +16,6 @@ const sai_next_hop_group_api_t redis_next_hop_group_api = { redis_bulk_create_next_hop_group_members, redis_bulk_remove_next_hop_group_members, REDIS_GENERIC_QUAD_API(next_hop_group_map) - redis_bulk_get_next_hop_group_members, - redis_bulk_set_next_hop_group_members + redis_bulk_set_next_hop_group_members, + redis_bulk_get_next_hop_group_members }; diff --git a/lib/sai_redis_switch.cpp b/lib/sai_redis_switch.cpp index 3d1f97494a..32d227c7ea 100644 --- a/lib/sai_redis_switch.cpp +++ b/lib/sai_redis_switch.cpp @@ -24,6 +24,30 @@ static sai_status_t redis_switch_mdio_write( return SAI_STATUS_NOT_IMPLEMENTED; } +static sai_status_t redis_switch_mdio_cl22_read( + _In_ sai_object_id_t switch_id, + _In_ uint32_t device_addr, + _In_ uint32_t start_reg_addr, + _In_ uint32_t number_of_registers, + _Out_ uint32_t *reg_val) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +static sai_status_t redis_switch_mdio_cl22_write( + _In_ sai_object_id_t switch_id, + _In_ uint32_t device_addr, + _In_ uint32_t start_reg_addr, + _In_ uint32_t number_of_registers, + _In_ const uint32_t *reg_val) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + REDIS_GENERIC_QUAD(SWITCH,switch); REDIS_GENERIC_STATS(SWITCH,switch); REDIS_GENERIC_QUAD(SWITCH_TUNNEL,switch_tunnel); @@ -55,4 +79,6 @@ const sai_switch_api_t redis_switch_api = { redis_switch_mdio_write, REDIS_GENERIC_QUAD_API(switch_tunnel) + redis_switch_mdio_cl22_read, + redis_switch_mdio_cl22_write }; diff --git a/lib/sai_redis_tunnel.cpp b/lib/sai_redis_tunnel.cpp index eb9d4cb7ae..2807a6b848 100644 --- a/lib/sai_redis_tunnel.cpp +++ b/lib/sai_redis_tunnel.cpp @@ -5,7 +5,7 @@ REDIS_GENERIC_QUAD(TUNNEL,tunnel); REDIS_GENERIC_QUAD(TUNNEL_TERM_TABLE_ENTRY,tunnel_term_table_entry); REDIS_GENERIC_QUAD(TUNNEL_MAP_ENTRY,tunnel_map_entry); REDIS_GENERIC_STATS(TUNNEL,tunnel); -REDIS_BULK_GET_SET(TUNNEL,tunnels); +REDIS_BULK_QUAD(TUNNEL,tunnels); const sai_tunnel_api_t redis_tunnel_api = { @@ -14,5 +14,5 @@ const sai_tunnel_api_t redis_tunnel_api = { REDIS_GENERIC_STATS_API(tunnel) REDIS_GENERIC_QUAD_API(tunnel_term_table_entry) REDIS_GENERIC_QUAD_API(tunnel_map_entry) - REDIS_BULK_GET_SET_API(tunnels) + REDIS_BULK_QUAD_API(tunnels) }; diff --git a/meta/DummySaiInterface.cpp b/meta/DummySaiInterface.cpp index 7098e1c946..d09d8d2338 100644 --- a/meta/DummySaiInterface.cpp +++ b/meta/DummySaiInterface.cpp @@ -331,6 +331,20 @@ sai_status_t DummySaiInterface::bulkRemove( return m_status; } +sai_status_t DummySaiInterface::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + for (uint32_t idx = 0; idx < object_count; idx++) + object_statuses[idx] = m_status; + + return m_status; +} + sai_status_t DummySaiInterface::bulkSet( _In_ sai_object_type_t object_type, _In_ uint32_t object_count, @@ -422,6 +436,21 @@ sai_status_t DummySaiInterface::bulkSet( return m_status; } +sai_status_t DummySaiInterface::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + for (uint32_t idx = 0; idx < object_count; idx++) + object_statuses[idx] = m_status; + + return m_status; +} + sai_status_t DummySaiInterface::bulkCreate( _In_ sai_object_type_t object_type, _In_ sai_object_id_t switch_id, @@ -520,6 +549,22 @@ sai_status_t DummySaiInterface::bulkCreate( return m_status; } +sai_status_t DummySaiInterface::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + for (uint32_t idx = 0; idx < object_count; idx++) + object_statuses[idx] = m_status; + + return m_status; +} + sai_object_type_t DummySaiInterface::objectTypeQuery( _In_ sai_object_id_t objectId) { diff --git a/meta/Meta.cpp b/meta/Meta.cpp index ba2d33b405..cd0d112d5e 100644 --- a/meta/Meta.cpp +++ b/meta/Meta.cpp @@ -2119,6 +2119,65 @@ sai_status_t Meta::bulkRemove( return status; } +sai_status_t Meta::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + // all objects must be same type and come from the same switch + // TODO check multiple switches + + PARAMETER_CHECK_IF_NOT_NULL(object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + object_statuses[idx] = SAI_STATUS_NOT_EXECUTED; + } + + //PARAMETER_CHECK_OBJECT_TYPE_VALID(object_type); + PARAMETER_CHECK_POSITIVE(object_count); + PARAMETER_CHECK_IF_NOT_NULL(neighbor_entry); + + if (sai_metadata_get_enum_value_name(&sai_metadata_enum_sai_bulk_op_error_mode_t, mode) == nullptr) + { + SWSS_LOG_ERROR("mode value %d is not in range on %s", mode, sai_metadata_enum_sai_bulk_op_error_mode_t.name); + + return SAI_STATUS_INVALID_PARAMETER; + } + + std::vector vmk; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + sai_status_t status = meta_sai_validate_neighbor_entry(&neighbor_entry[idx], false); + + CHECK_STATUS_SUCCESS(status); + + sai_object_meta_key_t meta_key = { .objecttype = SAI_OBJECT_TYPE_NEIGHBOR_ENTRY, .objectkey = { .key = { .neighbor_entry = neighbor_entry[idx] } } }; + + vmk.push_back(meta_key); + + status = meta_generic_validation_remove(meta_key); + + CHECK_STATUS_SUCCESS(status); + } + + auto status = m_implementation->bulkRemove(object_count, neighbor_entry, mode, object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + if (object_statuses[idx] == SAI_STATUS_SUCCESS) + { + meta_generic_validation_post_remove(vmk[idx]); + } + } + + return status; +} + sai_status_t Meta::bulkRemove( _In_ uint32_t object_count, _In_ const sai_fdb_entry_t *fdb_entry, @@ -2469,6 +2528,64 @@ sai_status_t Meta::bulkSet( return status; } +sai_status_t Meta::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + PARAMETER_CHECK_IF_NOT_NULL(object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + object_statuses[idx] = SAI_STATUS_NOT_EXECUTED; + } + + //PARAMETER_CHECK_OBJECT_TYPE_VALID(object_type); + PARAMETER_CHECK_POSITIVE(object_count); + PARAMETER_CHECK_IF_NOT_NULL(neighbor_entry); + PARAMETER_CHECK_IF_NOT_NULL(attr_list); + + if (sai_metadata_get_enum_value_name(&sai_metadata_enum_sai_bulk_op_error_mode_t, mode) == nullptr) + { + SWSS_LOG_ERROR("mode value %d is not in range on %s", mode, sai_metadata_enum_sai_bulk_op_error_mode_t.name); + + return SAI_STATUS_INVALID_PARAMETER; + } + + std::vector vmk; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + sai_status_t status = meta_sai_validate_neighbor_entry(&neighbor_entry[idx], false); + + CHECK_STATUS_SUCCESS(status); + + sai_object_meta_key_t meta_key = { .objecttype = SAI_OBJECT_TYPE_NEIGHBOR_ENTRY, .objectkey = { .key = { .neighbor_entry = neighbor_entry[idx] } } }; + + vmk.push_back(meta_key); + + status = meta_generic_validation_set(meta_key, &attr_list[idx]); + + CHECK_STATUS_SUCCESS(status); + } + + auto status = m_implementation->bulkSet(object_count, neighbor_entry, attr_list, mode, object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + if (object_statuses[idx] == SAI_STATUS_SUCCESS) + { + meta_generic_validation_post_set(vmk[idx], &attr_list[idx]); + } + } + + return status; +} + sai_status_t Meta::bulkSet( _In_ uint32_t object_count, _In_ const sai_fdb_entry_t *fdb_entry, @@ -2967,6 +3084,66 @@ sai_status_t Meta::bulkCreate( return status; } +sai_status_t Meta::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + PARAMETER_CHECK_IF_NOT_NULL(object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + object_statuses[idx] = SAI_STATUS_NOT_EXECUTED; + } + + //PARAMETER_CHECK_OBJECT_TYPE_VALID(object_type); + PARAMETER_CHECK_POSITIVE(object_count); + PARAMETER_CHECK_IF_NOT_NULL(neighbor_entry); + PARAMETER_CHECK_IF_NOT_NULL(attr_count); + PARAMETER_CHECK_IF_NOT_NULL(attr_list); + + if (sai_metadata_get_enum_value_name(&sai_metadata_enum_sai_bulk_op_error_mode_t, mode) == nullptr) + { + SWSS_LOG_ERROR("mode value %d is not in range on %s", mode, sai_metadata_enum_sai_bulk_op_error_mode_t.name); + + return SAI_STATUS_INVALID_PARAMETER; + } + + std::vector vmk; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + sai_status_t status = meta_sai_validate_neighbor_entry(&neighbor_entry[idx], true); + + CHECK_STATUS_SUCCESS(status); + + sai_object_meta_key_t meta_key = { .objecttype = SAI_OBJECT_TYPE_NEIGHBOR_ENTRY, .objectkey = { .key = { .neighbor_entry = neighbor_entry[idx] } } }; + + vmk.push_back(meta_key); + + status = meta_generic_validation_create(meta_key, neighbor_entry[idx].switch_id, attr_count[idx], attr_list[idx]); + + CHECK_STATUS_SUCCESS(status); + } + + auto status = m_implementation->bulkCreate(object_count, neighbor_entry, attr_count, attr_list, mode, object_statuses); + + for (uint32_t idx = 0; idx < object_count; idx++) + { + if (object_statuses[idx] == SAI_STATUS_SUCCESS) + { + meta_generic_validation_post_create(vmk[idx], neighbor_entry[idx].switch_id, attr_count[idx], attr_list[idx]); + } + } + + return status; +} + sai_object_type_t Meta::objectTypeQuery( _In_ sai_object_id_t objectId) { @@ -3797,7 +3974,6 @@ sai_status_t Meta::meta_sai_validate_neighbor_entry( sai_object_meta_key_t meta_key_rif = { .objecttype = expected, .objectkey = { .key = { .object_id = rif } } }; - if (!m_saiObjectCollection.objectExists(meta_key_rif)) { SWSS_LOG_ERROR("object key %s doesn't exist", diff --git a/meta/SaiInterface.h b/meta/SaiInterface.h index d5b7a77d49..114f8bae6d 100644 --- a/meta/SaiInterface.h +++ b/meta/SaiInterface.h @@ -22,6 +22,7 @@ extern "C" { _X(NAT_ENTRY,nat_entry); \ _X(ROUTE_ENTRY,route_entry); \ _X(MY_SID_ENTRY,my_sid_entry); \ + _X(NEIGHBOR_ENTRY,neighbor_entry); \ #define SAIREDIS_SAIINTERFACE_DECLARE_QUAD_ENTRY_VIRTUAL(OT,ot) \ virtual sai_status_t create( \ diff --git a/meta/SaiSerialize.cpp b/meta/SaiSerialize.cpp index 862a382dcb..6ed23b8126 100644 --- a/meta/SaiSerialize.cpp +++ b/meta/SaiSerialize.cpp @@ -245,6 +245,18 @@ sai_status_t transfer_attribute( transfer_primitive(src_attr.value.timespec, dst_attr.value.timespec); break; + case SAI_ATTR_VALUE_TYPE_JSON: + transfer_primitive(src_attr.value.json, dst_attr.value.json); + break; + + case SAI_ATTR_VALUE_TYPE_PORT_LANE_LATCH_STATUS_LIST: + RETURN_ON_ERROR(transfer_list(src_attr.value.portlanelatchstatuslist, dst_attr.value.portlanelatchstatuslist, countOnly)); + break; + + case SAI_ATTR_VALUE_TYPE_LATCH_STATUS: + transfer_primitive(src_attr.value.latchstatus, dst_attr.value.latchstatus); + break; + case SAI_ATTR_VALUE_TYPE_VLAN_LIST: RETURN_ON_ERROR(transfer_list(src_attr.value.vlanlist, dst_attr.value.vlanlist, countOnly)); break; @@ -1417,6 +1429,60 @@ std::string sai_serialize_acl_resource_list( return j.dump(); } +std::string sai_serialize_latch_status( + _In_ const sai_latch_status_t& latch_status) +{ + SWSS_LOG_ENTER(); + + auto changed = sai_serialize_bool(latch_status.changed); + auto current_status = sai_serialize_bool(latch_status.current_status); + + return changed + ":" + current_status; +} + +json sai_serialize_port_lane_latch_status_item( + _In_ const sai_port_lane_latch_status_t& lane_latch_status) +{ + SWSS_LOG_ENTER(); + json j; + + j["lane"] = lane_latch_status.lane; + j["value"] = sai_serialize_latch_status(lane_latch_status.value); + + return j; +} + +std::string sai_serialize_port_lane_latch_status_list( + _In_ const sai_port_lane_latch_status_list_t& status_list, + _In_ bool countOnly) +{ + SWSS_LOG_ENTER(); + + json j; + + j["count"] = status_list.count; + + if (status_list.list == NULL || countOnly) + { + j["list"] = nullptr; + + return j.dump(); + } + + json arr = json::array(); + + for (uint32_t i = 0; i < status_list.count; ++i) + { + json item = sai_serialize_port_lane_latch_status_item(status_list.list[i]); + + arr.push_back(item); + } + + j["list"] = arr; + + return j.dump(); +} + template std::string sai_serialize_range( _In_ const T& range) @@ -1605,6 +1671,18 @@ std::string sai_serialize_system_port_config( return j.dump(); } +std::string sai_serialize_json( + _In_ const sai_json_t js) +{ + SWSS_LOG_ENTER(); + + json j; + + j["json"] = sai_serialize_number_list(js.json, false); + + return j.dump(); +} + json sai_serialize_system_port_cfg_list_item( _In_ const sai_system_port_config_t &sysportconfig) { @@ -1711,6 +1789,9 @@ std::string sai_serialize_attr_value( case SAI_ATTR_VALUE_TYPE_UINT16: return sai_serialize_number(attr.value.u16); + case SAI_ATTR_VALUE_TYPE_JSON: + return sai_serialize_json(attr.value.json); + // case SAI_ATTR_VALUE_TYPE_INT16: // return sai_serialize_number(attr.value.s16); @@ -1756,6 +1837,12 @@ std::string sai_serialize_attr_value( case SAI_ATTR_VALUE_TYPE_INT8_LIST: return sai_serialize_number_list(attr.value.s8list, countOnly); + case SAI_ATTR_VALUE_TYPE_LATCH_STATUS: + return sai_serialize_latch_status(attr.value.latchstatus); + + case SAI_ATTR_VALUE_TYPE_PORT_LANE_LATCH_STATUS_LIST: + return sai_serialize_port_lane_latch_status_list(attr.value.portlanelatchstatuslist, countOnly); + // case SAI_ATTR_VALUE_TYPE_UINT16_LIST: // return sai_serialize_number_list(attr.value.u16list, countOnly); // @@ -3211,6 +3298,86 @@ void sai_deserialize_system_port_config( } +void sai_deserialize_json( + _In_ const std::string& s, + _Out_ sai_json_t& js) +{ + SWSS_LOG_ENTER(); + + json j = json::parse(s); + + sai_deserialize_number_list(j["json"], js.json, false); + +} + +void sai_deserialize_latch_status( + _In_ const std::string& s, + _Out_ sai_latch_status_t& latch_status) +{ + SWSS_LOG_ENTER(); + + auto pos = s.find(":"); + + if (pos == std::string::npos) + { + SWSS_LOG_THROW("Invalid latch status %s", s.c_str()); + } + + std::string changed = s.substr(0, pos); + std::string current_status = s.substr(pos + 1); + + sai_deserialize_bool(changed, latch_status.changed); + sai_deserialize_bool(current_status, latch_status.current_status); + +} + +void sai_deserialize_port_lane_latch_status( + _In_ const json& j, + _Out_ sai_port_lane_latch_status_t& lane_latch_status) +{ + SWSS_LOG_ENTER(); + sai_deserialize_latch_status(j["value"], lane_latch_status.value); +} + +void sai_deserialize_port_lane_latch_status_list( + _In_ const std::string& s, + _Out_ sai_port_lane_latch_status_list_t& status_list, + _In_ bool countOnly) +{ + SWSS_LOG_ENTER(); + + json j = json::parse(s); + + status_list.count = j["count"]; + + if (countOnly) + { + return; + } + + if (j["list"] == nullptr) + { + status_list.list = NULL; + return; + } + + json arr = j["list"]; + + if (arr.size() != (size_t)status_list.count) + { + SWSS_LOG_THROW("port lane latch status count mismatch %lu vs %u", arr.size(),status_list.count); + } + + status_list.list = sai_alloc_n_of_ptr_type(status_list.count, status_list.list); + + for (uint32_t i = 0; i < status_list.count; ++i) + { + const json &item = arr[i]; + + sai_deserialize_port_lane_latch_status(item, status_list.list[i]); + } +} + static void sai_deserialize_system_port_cfg_list_item( _In_ const json& j, _Out_ sai_system_port_config_t& sysportconfig) @@ -3291,6 +3458,9 @@ void sai_deserialize_attr_value( case SAI_ATTR_VALUE_TYPE_UINT16: return sai_deserialize_number(s, attr.value.u16); + case SAI_ATTR_VALUE_TYPE_JSON: + return sai_deserialize_json(s, attr.value.json); + // case SAI_ATTR_VALUE_TYPE_INT16: // return sai_deserialize_number(s, attr.value.s16); @@ -3336,6 +3506,12 @@ void sai_deserialize_attr_value( case SAI_ATTR_VALUE_TYPE_INT8_LIST: return sai_deserialize_number_list(s, attr.value.s8list, countOnly); + case SAI_ATTR_VALUE_TYPE_LATCH_STATUS: + return sai_deserialize_latch_status(s, attr.value.latchstatus); + + case SAI_ATTR_VALUE_TYPE_PORT_LANE_LATCH_STATUS_LIST: + return sai_deserialize_port_lane_latch_status_list(s, attr.value.portlanelatchstatuslist, countOnly); + // case SAI_ATTR_VALUE_TYPE_UINT16_LIST: // return sai_deserialize_number_list(s, attr.value.u16list, countOnly); // @@ -3909,7 +4085,6 @@ void sai_deserialize_object_meta_key( } } - // deserialize notifications static void sai_deserialize_json_fdb_event_notification_data( @@ -4087,6 +4262,11 @@ void sai_deserialize_free_attribute_value( case SAI_ATTR_VALUE_TYPE_IP_ADDRESS: case SAI_ATTR_VALUE_TYPE_IP_PREFIX: case SAI_ATTR_VALUE_TYPE_OBJECT_ID: + case SAI_ATTR_VALUE_TYPE_LATCH_STATUS: + break; + + case SAI_ATTR_VALUE_TYPE_JSON: + sai_free_list(attr.value.json.json); break; case SAI_ATTR_VALUE_TYPE_OBJECT_LIST: @@ -4145,6 +4325,10 @@ void sai_deserialize_free_attribute_value( sai_free_list(attr.value.segmentlist); break; + case SAI_ATTR_VALUE_TYPE_PORT_LANE_LATCH_STATUS_LIST: + sai_free_list(attr.value.portlanelatchstatuslist); + break; + /* ACL FIELD DATA */ case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_BOOL: diff --git a/syncd/VendorSai.cpp b/syncd/VendorSai.cpp index 13434e7798..c46cfbb2d2 100644 --- a/syncd/VendorSai.cpp +++ b/syncd/VendorSai.cpp @@ -979,6 +979,33 @@ sai_status_t VendorSai::bulkCreate( mode, object_statuses); } + +sai_status_t VendorSai::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t* entries, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + VENDOR_CHECK_API_INITIALIZED(); + + if (!m_apis.neighbor_api->create_neighbor_entries) + { + SWSS_LOG_INFO("create_neighbor_entries is not supported"); + return SAI_STATUS_NOT_SUPPORTED; + } + + return m_apis.neighbor_api->create_neighbor_entries( + object_count, + entries, + attr_count, + attr_list, + mode, + object_statuses); +} // BULK REMOVE sai_status_t VendorSai::bulkRemove( @@ -1097,6 +1124,28 @@ sai_status_t VendorSai::bulkRemove( object_statuses); } +sai_status_t VendorSai::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *entries, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + VENDOR_CHECK_API_INITIALIZED(); + + if (!m_apis.neighbor_api->remove_neighbor_entries) + { + SWSS_LOG_INFO("remove_neighbor_entries is not supported"); + return SAI_STATUS_NOT_SUPPORTED; + } + + return m_apis.neighbor_api->remove_neighbor_entries( + object_count, + entries, + mode, + object_statuses); +} // BULK SET sai_status_t VendorSai::bulkSet( @@ -1223,6 +1272,31 @@ sai_status_t VendorSai::bulkSet( mode, object_statuses); } + +sai_status_t VendorSai::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *entries, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + MUTEX(); + SWSS_LOG_ENTER(); + VENDOR_CHECK_API_INITIALIZED(); + + if (!m_apis.neighbor_api->set_neighbor_entries_attribute) + { + SWSS_LOG_INFO("set_neighbor_entries_attribute is not supported"); + return SAI_STATUS_NOT_SUPPORTED; + } + + return m_apis.neighbor_api->set_neighbor_entries_attribute( + object_count, + entries, + attr_list, + mode, + object_statuses); +} // NON QUAD API sai_status_t VendorSai::flushFdbEntries( diff --git a/unittest/lib/TestClientServerSai.cpp b/unittest/lib/TestClientServerSai.cpp index d88d5cd441..5ced528f26 100644 --- a/unittest/lib/TestClientServerSai.cpp +++ b/unittest/lib/TestClientServerSai.cpp @@ -6,6 +6,8 @@ #include +#include + using namespace sairedis; static const char* profile_get_value( @@ -169,3 +171,19 @@ TEST(ClientServerSai, bulkGetClearStats) SAI_STATS_MODE_BULK_CLEAR, nullptr)); } + +TEST(ClientServerSai, bulk_neighbor_op) +{ + auto css = std::make_shared(); + sai_neighbor_entry_t e[2]; + EXPECT_EQ(SAI_STATUS_SUCCESS, css->initialize(0, &test_services)); + EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, css->bulkCreate(0, e, nullptr, nullptr, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, nullptr)); + EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, css->bulkSet(2, e, nullptr, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, nullptr)); + EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, css->bulkRemove(2, e, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, nullptr)); + css = std::make_shared(); + EXPECT_EQ(SAI_STATUS_SUCCESS, css->initialize(0, &test_client_services)); + EXPECT_EQ(SAI_STATUS_NOT_IMPLEMENTED, css->bulkCreate(0, e, nullptr, nullptr, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, nullptr)); + EXPECT_EQ(SAI_STATUS_NOT_IMPLEMENTED, css->bulkSet(2, e, nullptr, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, nullptr)); + EXPECT_EQ(SAI_STATUS_NOT_IMPLEMENTED, css->bulkRemove(2, e, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, nullptr)); + +} diff --git a/unittest/meta/TestMeta.cpp b/unittest/meta/TestMeta.cpp index 17311c783f..6bbc868118 100644 --- a/unittest/meta/TestMeta.cpp +++ b/unittest/meta/TestMeta.cpp @@ -2,6 +2,8 @@ #include "MockMeta.h" #include "MetaTestSaiInterface.h" +#include + #include #include @@ -678,6 +680,149 @@ TEST(Meta, quad_bulk_route_entry) EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(2, e, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); } +sai_object_id_t create_port( + _In_ Meta &m, + _In_ sai_object_id_t switch_id) +{ + SWSS_LOG_ENTER(); + sai_object_id_t port; + + static uint32_t id = 1; + id++; + sai_attribute_t attrs[9] = { }; + + uint32_t list[1] = { id }; + + attrs[0].id = SAI_PORT_ATTR_HW_LANE_LIST; + attrs[0].value.u32list.count = 1; + attrs[0].value.u32list.list = list; + + attrs[1].id = SAI_PORT_ATTR_SPEED; + attrs[1].value.u32 = 10000; + + auto status = m.create(SAI_OBJECT_TYPE_PORT, &port, switch_id, 2, attrs); + EXPECT_EQ(SAI_STATUS_SUCCESS, status); + + return port; +} + +sai_object_id_t create_rif( + _In_ Meta &m, + _In_ sai_object_id_t switch_id, + _In_ sai_object_id_t port_id, + _In_ sai_object_id_t vr_id) +{ + SWSS_LOG_ENTER(); + sai_object_id_t rif; + + sai_attribute_t attrs[9] = { }; + + attrs[0].id = SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID; + attrs[0].value.oid = vr_id; + + attrs[1].id = SAI_ROUTER_INTERFACE_ATTR_TYPE; + attrs[1].value.s32 = SAI_ROUTER_INTERFACE_TYPE_PORT; + + attrs[2].id = SAI_ROUTER_INTERFACE_ATTR_PORT_ID; + attrs[2].value.oid = port_id; + + auto status = m.create(SAI_OBJECT_TYPE_ROUTER_INTERFACE, &rif, switch_id, 3, attrs); + EXPECT_EQ(SAI_STATUS_SUCCESS, status); + + return rif; +} + +TEST(Meta, quad_bulk_neighbor_entry) +{ + Meta m(std::make_shared()); + + sai_object_id_t switchId = 0; + + sai_attribute_t attr; + + attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; + attr.value.booldata = true; + + EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); + + sai_object_id_t vlanId = 0; + + attr.id = SAI_VLAN_ATTR_VLAN_ID; + attr.value.u16 = 2; + + EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); + + sai_object_id_t vrId = 0; + + EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); + + sai_object_id_t portId = create_port(m, switchId); + sai_object_id_t rifId = create_rif(m, switchId, portId, vrId); + + // create + + sai_neighbor_entry_t e[2]; + + memset(e, 0, sizeof(e)); + + e[0].switch_id = switchId; + e[1].switch_id = switchId; + + e[0].ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; + e[0].ip_address.addr.ip4 = htonl(0x0a00000e); + e[1].ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; + e[1].ip_address.addr.ip4 = htonl(0x0a00000f); + + e[0].rif_id = rifId; + e[1].rif_id = rifId; + + uint32_t attr_count[2]; + + attr_count[0] = 2; + attr_count[1] = 2; + + sai_attribute_t list1[2]; + sai_attribute_t list2[2]; + sai_mac_t mac1 = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; + sai_mac_t mac2 = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; + + list1[0].id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; + memcpy(list1[0].value.mac, mac1, 6); + list1[1].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; + list1[1].value.s32 = SAI_PACKET_ACTION_FORWARD; + + list2[0].id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; + memcpy(list2[0].value.mac, mac2, 6); + list2[1].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; + list2[1].value.s32 = SAI_PACKET_ACTION_FORWARD; + + std::vector alist; + + alist.push_back(list1); + alist.push_back(list2); + + const sai_attribute_t **attr_list = alist.data(); + + sai_status_t statuses[2]; + + EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(2, e, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); + + // set + sai_attribute_t setlist[2]; + + setlist[0].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; + setlist[0].value.s32 = SAI_PACKET_ACTION_FORWARD; + + setlist[1].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; + setlist[1].value.s32 = SAI_PACKET_ACTION_FORWARD; + + EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkSet(2, e, setlist, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); + + // remove + EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(2, e, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); + +} + TEST(Meta, quad_bulk_nat_entry) { Meta m(std::make_shared()); diff --git a/unittest/meta/TestSaiSerialize.cpp b/unittest/meta/TestSaiSerialize.cpp index b976009bc3..fc68cf7dc8 100644 --- a/unittest/meta/TestSaiSerialize.cpp +++ b/unittest/meta/TestSaiSerialize.cpp @@ -64,6 +64,44 @@ TEST(SaiSerialize, sai_serialize_object_meta_key) } } +TEST(SaiSerialize, sai_serialize_port_lane_latch_status_list) +{ + sai_attribute_t attr; + + memset(&attr, 0, sizeof(attr)); + + for (size_t idx = 0 ; idx < sai_metadata_attr_sorted_by_id_name_count; ++idx) + { + auto meta = sai_metadata_attr_sorted_by_id_name[idx]; + if(meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_PORT_LANE_LATCH_STATUS_LIST) + { + attr.id = meta->attrid; + + if (meta->isaclaction) + { + attr.value.aclaction.enable = true; + } + + if (meta->isaclfield) + { + attr.value.aclfield.enable = true; + } + + sai_port_lane_latch_status_t list[1]; + list[0].lane = 1; + list[0].value.changed=true; + list[0].value.current_status=true; + + attr.value.portlanelatchstatuslist.count=1; + attr.value.portlanelatchstatuslist.list = list; + + auto s = sai_serialize_attr_value(*meta, attr, false); + + sai_deserialize_attr_value(s, *meta, attr, false); + } + } +} + TEST(SaiSerialize, sai_serialize_attr_value) { sai_attribute_t attr; diff --git a/unittest/syncd/TestVendorSai.cpp b/unittest/syncd/TestVendorSai.cpp index b598146e50..475be18bb7 100644 --- a/unittest/syncd/TestVendorSai.cpp +++ b/unittest/syncd/TestVendorSai.cpp @@ -2,6 +2,8 @@ #include "VendorSai.h" #include "swss/logger.h" +#include + #ifdef HAVE_SAI_BULK_OBJECT_GET_STATS #undef HAVE_SAI_BULK_OBJECT_GET_STATS #endif @@ -57,3 +59,147 @@ TEST(VendorSai, bulkGetStats) SAI_STATS_MODE_BULK_READ_AND_CLEAR, nullptr)); } + +sai_object_id_t create_port( + _In_ VendorSai& sai, + _In_ sai_object_id_t switch_id) +{ + SWSS_LOG_ENTER(); + sai_object_id_t port; + + static uint32_t id = 1; + id++; + sai_attribute_t attrs[9] = { }; + + uint32_t list[1] = { id }; + + attrs[0].id = SAI_PORT_ATTR_HW_LANE_LIST; + attrs[0].value.u32list.count = 1; + attrs[0].value.u32list.list = list; + + attrs[1].id = SAI_PORT_ATTR_SPEED; + attrs[1].value.u32 = 10000; + + auto status = sai.create(SAI_OBJECT_TYPE_PORT, &port, switch_id, 2, attrs); + EXPECT_EQ(SAI_STATUS_SUCCESS, status); + + return port; +} + +sai_object_id_t create_rif( + _In_ VendorSai& sai, + _In_ sai_object_id_t switch_id, + _In_ sai_object_id_t port_id, + _In_ sai_object_id_t vr_id) +{ + SWSS_LOG_ENTER(); + sai_object_id_t rif; + + sai_attribute_t attrs[9] = { }; + + attrs[0].id = SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID; + attrs[0].value.oid = vr_id; + + attrs[1].id = SAI_ROUTER_INTERFACE_ATTR_TYPE; + attrs[1].value.s32 = SAI_ROUTER_INTERFACE_TYPE_PORT; + + attrs[2].id = SAI_ROUTER_INTERFACE_ATTR_PORT_ID; + attrs[2].value.oid = port_id; + + auto status = sai.create(SAI_OBJECT_TYPE_ROUTER_INTERFACE, &rif, switch_id, 3, attrs); + EXPECT_EQ(SAI_STATUS_SUCCESS, status); + + return rif; +} + +TEST(VendorSai, quad_bulk_neighbor_entry) +{ + VendorSai sai; + sai.initialize(0, &test_services); + + sai_object_id_t switchId = 0; + + sai_attribute_t attr; + + attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; + attr.value.booldata = true; + + EXPECT_EQ(SAI_STATUS_SUCCESS, sai.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); + + sai_object_id_t vlanId = 0; + + attr.id = SAI_VLAN_ATTR_VLAN_ID; + attr.value.u16 = 2; + + EXPECT_EQ(SAI_STATUS_SUCCESS, sai.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); + + sai_object_id_t vrId = 0; + + EXPECT_EQ(SAI_STATUS_SUCCESS, sai.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); + + sai_object_id_t portId = create_port(sai, switchId); + sai_object_id_t rifId = create_rif(sai, switchId, portId, vrId); + + // create + + sai_neighbor_entry_t e[2]; + + memset(e, 0, sizeof(e)); + + e[0].switch_id = switchId; + e[1].switch_id = switchId; + + e[0].ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; + e[0].ip_address.addr.ip4 = htonl(0x0a00000e); + e[1].ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; + e[1].ip_address.addr.ip4 = htonl(0x0a00000f); + + e[0].rif_id = rifId; + e[1].rif_id = rifId; + + uint32_t attr_count[2]; + + attr_count[0] = 2; + attr_count[1] = 2; + + sai_attribute_t list1[2]; + sai_attribute_t list2[2]; + sai_mac_t mac1 = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; + sai_mac_t mac2 = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; + + list1[0].id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; + memcpy(list1[0].value.mac, mac1, 6); + list1[1].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; + list1[1].value.s32 = SAI_PACKET_ACTION_FORWARD; + + list2[0].id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; + memcpy(list2[0].value.mac, mac2, 6); + list2[1].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; + list2[1].value.s32 = SAI_PACKET_ACTION_FORWARD; + + std::vector alist; + + alist.push_back(list1); + alist.push_back(list2); + + const sai_attribute_t **attr_list = alist.data(); + + sai_status_t statuses[2]; + + EXPECT_EQ(SAI_STATUS_SUCCESS, sai.bulkCreate(2, e, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); + + // set + sai_attribute_t setlist[2]; + + setlist[0].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; + setlist[0].value.s32 = SAI_PACKET_ACTION_FORWARD; + + setlist[1].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; + setlist[1].value.s32 = SAI_PACKET_ACTION_FORWARD; + + EXPECT_EQ(SAI_STATUS_SUCCESS, sai.bulkSet(2, e, setlist, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); + + // remove + EXPECT_EQ(SAI_STATUS_SUCCESS, sai.bulkRemove(2, e, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); + +} diff --git a/vslib/Makefile.am b/vslib/Makefile.am index 3c2d016cb3..2aeade3bed 100644 --- a/vslib/Makefile.am +++ b/vslib/Makefile.am @@ -70,6 +70,7 @@ libsaivs_la_SOURCES = \ sai_vs_debug_counter.cpp\ sai_vs_dtel.cpp \ sai_vs_fdb.cpp \ + sai_vs_genericprogrammable.cpp \ sai_vs_hash.cpp \ sai_vs_hostif.cpp \ sai_vs_interfacequery.cpp \ diff --git a/vslib/VirtualSwitchSaiInterface.cpp b/vslib/VirtualSwitchSaiInterface.cpp index 4e28991bc1..8bfd72af1e 100644 --- a/vslib/VirtualSwitchSaiInterface.cpp +++ b/vslib/VirtualSwitchSaiInterface.cpp @@ -1063,6 +1063,24 @@ sai_status_t VirtualSwitchSaiInterface::bulkRemove( return bulkRemove(my_sid_entry->switch_id, SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, mode, object_statuses); } +sai_status_t VirtualSwitchSaiInterface::bulkRemove( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + std::vector serializedObjectIds; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + serializedObjectIds.emplace_back(sai_serialize_neighbor_entry(neighbor_entry[idx])); + } + + return bulkRemove(neighbor_entry->switch_id, SAI_OBJECT_TYPE_NEIGHBOR_ENTRY, serializedObjectIds, mode, object_statuses); +} + sai_status_t VirtualSwitchSaiInterface::bulkRemove( _In_ uint32_t object_count, _In_ const sai_nat_entry_t *nat_entry, @@ -1177,6 +1195,25 @@ sai_status_t VirtualSwitchSaiInterface::bulkSet( return bulkSet(my_sid_entry->switch_id, SAI_OBJECT_TYPE_MY_SID_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); } +sai_status_t VirtualSwitchSaiInterface::bulkSet( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t *neighbor_entry, + _In_ const sai_attribute_t *attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + std::vector serializedObjectIds; + + for (uint32_t idx = 0; idx < object_count; idx++) + { + serializedObjectIds.emplace_back(sai_serialize_neighbor_entry(neighbor_entry[idx])); + } + + return bulkSet(neighbor_entry->switch_id, SAI_OBJECT_TYPE_NEIGHBOR_ENTRY, serializedObjectIds, attr_list, mode, object_statuses); +} + sai_status_t VirtualSwitchSaiInterface::bulkSet( _In_ uint32_t object_count, _In_ const sai_nat_entry_t *nat_entry, @@ -1412,6 +1449,35 @@ sai_status_t VirtualSwitchSaiInterface::bulkCreate( object_statuses); } +sai_status_t VirtualSwitchSaiInterface::bulkCreate( + _In_ uint32_t object_count, + _In_ const sai_neighbor_entry_t* neighbor_entry, + _In_ const uint32_t *attr_count, + _In_ const sai_attribute_t **attr_list, + _In_ sai_bulk_op_error_mode_t mode, + _Out_ sai_status_t *object_statuses) +{ + SWSS_LOG_ENTER(); + + std::vector serialized_object_ids; + + // on create vid is put in db by syncd + for (uint32_t idx = 0; idx < object_count; idx++) + { + std::string str_object_id = sai_serialize_neighbor_entry(neighbor_entry[idx]); + serialized_object_ids.push_back(str_object_id); + } + + return bulkCreate( + neighbor_entry->switch_id, + SAI_OBJECT_TYPE_NEIGHBOR_ENTRY, + serialized_object_ids, + attr_count, + attr_list, + mode, + object_statuses); +} + sai_status_t VirtualSwitchSaiInterface::bulkCreate( _In_ uint32_t object_count, _In_ const sai_nat_entry_t* nat_entry, diff --git a/vslib/sai_vs.h b/vslib/sai_vs.h index d5ed4d89b0..f467d9451f 100644 --- a/vslib/sai_vs.h +++ b/vslib/sai_vs.h @@ -13,53 +13,54 @@ extern "C" { #define PRIVATE __attribute__((visibility("hidden"))) -PRIVATE extern const sai_acl_api_t vs_acl_api; -PRIVATE extern const sai_bfd_api_t vs_bfd_api; -PRIVATE extern const sai_bmtor_api_t vs_bmtor_api; -PRIVATE extern const sai_bridge_api_t vs_bridge_api; -PRIVATE extern const sai_buffer_api_t vs_buffer_api; -PRIVATE extern const sai_counter_api_t vs_counter_api; -PRIVATE extern const sai_debug_counter_api_t vs_debug_counter_api; -PRIVATE extern const sai_dtel_api_t vs_dtel_api; -PRIVATE extern const sai_fdb_api_t vs_fdb_api; -PRIVATE extern const sai_hash_api_t vs_hash_api; -PRIVATE extern const sai_hostif_api_t vs_hostif_api; -PRIVATE extern const sai_ipmc_api_t vs_ipmc_api; -PRIVATE extern const sai_ipmc_group_api_t vs_ipmc_group_api; -PRIVATE extern const sai_isolation_group_api_t vs_isolation_group_api; -PRIVATE extern const sai_l2mc_api_t vs_l2mc_api; -PRIVATE extern const sai_l2mc_group_api_t vs_l2mc_group_api; -PRIVATE extern const sai_lag_api_t vs_lag_api; -PRIVATE extern const sai_macsec_api_t vs_macsec_api; -PRIVATE extern const sai_mcast_fdb_api_t vs_mcast_fdb_api; -PRIVATE extern const sai_mirror_api_t vs_mirror_api; -PRIVATE extern const sai_mpls_api_t vs_mpls_api; -PRIVATE extern const sai_nat_api_t vs_nat_api; -PRIVATE extern const sai_neighbor_api_t vs_neighbor_api; -PRIVATE extern const sai_next_hop_api_t vs_next_hop_api; -PRIVATE extern const sai_next_hop_group_api_t vs_next_hop_group_api; -PRIVATE extern const sai_policer_api_t vs_policer_api; -PRIVATE extern const sai_port_api_t vs_port_api; -PRIVATE extern const sai_qos_map_api_t vs_qos_map_api; -PRIVATE extern const sai_queue_api_t vs_queue_api; -PRIVATE extern const sai_route_api_t vs_route_api; -PRIVATE extern const sai_router_interface_api_t vs_router_interface_api; -PRIVATE extern const sai_rpf_group_api_t vs_rpf_group_api; -PRIVATE extern const sai_samplepacket_api_t vs_samplepacket_api; -PRIVATE extern const sai_scheduler_api_t vs_scheduler_api; -PRIVATE extern const sai_scheduler_group_api_t vs_scheduler_group_api; -PRIVATE extern const sai_srv6_api_t vs_srv6_api; -PRIVATE extern const sai_stp_api_t vs_stp_api; -PRIVATE extern const sai_switch_api_t vs_switch_api; -PRIVATE extern const sai_system_port_api_t vs_system_port_api; -PRIVATE extern const sai_tam_api_t vs_tam_api; -PRIVATE extern const sai_tunnel_api_t vs_tunnel_api; -PRIVATE extern const sai_udf_api_t vs_udf_api; -PRIVATE extern const sai_virtual_router_api_t vs_virtual_router_api; -PRIVATE extern const sai_vlan_api_t vs_vlan_api; -PRIVATE extern const sai_wred_api_t vs_wred_api; -PRIVATE extern const sai_my_mac_api_t vs_my_mac_api; -PRIVATE extern const sai_ipsec_api_t vs_ipsec_api; +PRIVATE extern const sai_acl_api_t vs_acl_api; +PRIVATE extern const sai_bfd_api_t vs_bfd_api; +PRIVATE extern const sai_bmtor_api_t vs_bmtor_api; +PRIVATE extern const sai_generic_programmable_api_t vs_generic_programmable_api; +PRIVATE extern const sai_bridge_api_t vs_bridge_api; +PRIVATE extern const sai_buffer_api_t vs_buffer_api; +PRIVATE extern const sai_counter_api_t vs_counter_api; +PRIVATE extern const sai_debug_counter_api_t vs_debug_counter_api; +PRIVATE extern const sai_dtel_api_t vs_dtel_api; +PRIVATE extern const sai_fdb_api_t vs_fdb_api; +PRIVATE extern const sai_hash_api_t vs_hash_api; +PRIVATE extern const sai_hostif_api_t vs_hostif_api; +PRIVATE extern const sai_ipmc_api_t vs_ipmc_api; +PRIVATE extern const sai_ipmc_group_api_t vs_ipmc_group_api; +PRIVATE extern const sai_isolation_group_api_t vs_isolation_group_api; +PRIVATE extern const sai_l2mc_api_t vs_l2mc_api; +PRIVATE extern const sai_l2mc_group_api_t vs_l2mc_group_api; +PRIVATE extern const sai_lag_api_t vs_lag_api; +PRIVATE extern const sai_macsec_api_t vs_macsec_api; +PRIVATE extern const sai_mcast_fdb_api_t vs_mcast_fdb_api; +PRIVATE extern const sai_mirror_api_t vs_mirror_api; +PRIVATE extern const sai_mpls_api_t vs_mpls_api; +PRIVATE extern const sai_nat_api_t vs_nat_api; +PRIVATE extern const sai_neighbor_api_t vs_neighbor_api; +PRIVATE extern const sai_next_hop_api_t vs_next_hop_api; +PRIVATE extern const sai_next_hop_group_api_t vs_next_hop_group_api; +PRIVATE extern const sai_policer_api_t vs_policer_api; +PRIVATE extern const sai_port_api_t vs_port_api; +PRIVATE extern const sai_qos_map_api_t vs_qos_map_api; +PRIVATE extern const sai_queue_api_t vs_queue_api; +PRIVATE extern const sai_route_api_t vs_route_api; +PRIVATE extern const sai_router_interface_api_t vs_router_interface_api; +PRIVATE extern const sai_rpf_group_api_t vs_rpf_group_api; +PRIVATE extern const sai_samplepacket_api_t vs_samplepacket_api; +PRIVATE extern const sai_scheduler_api_t vs_scheduler_api; +PRIVATE extern const sai_scheduler_group_api_t vs_scheduler_group_api; +PRIVATE extern const sai_srv6_api_t vs_srv6_api; +PRIVATE extern const sai_stp_api_t vs_stp_api; +PRIVATE extern const sai_switch_api_t vs_switch_api; +PRIVATE extern const sai_system_port_api_t vs_system_port_api; +PRIVATE extern const sai_tam_api_t vs_tam_api; +PRIVATE extern const sai_tunnel_api_t vs_tunnel_api; +PRIVATE extern const sai_udf_api_t vs_udf_api; +PRIVATE extern const sai_virtual_router_api_t vs_virtual_router_api; +PRIVATE extern const sai_vlan_api_t vs_vlan_api; +PRIVATE extern const sai_wred_api_t vs_wred_api; +PRIVATE extern const sai_my_mac_api_t vs_my_mac_api; +PRIVATE extern const sai_ipsec_api_t vs_ipsec_api; PRIVATE extern std::shared_ptr vs_sai; diff --git a/vslib/sai_vs_genericprogrammable.cpp b/vslib/sai_vs_genericprogrammable.cpp new file mode 100644 index 0000000000..958d927a8f --- /dev/null +++ b/vslib/sai_vs_genericprogrammable.cpp @@ -0,0 +1,7 @@ +#include "sai_vs.h" + +VS_GENERIC_QUAD(GENERIC_PROGRAMMABLE,generic_programmable); + +const sai_generic_programmable_api_t vs_generic_programmable_api = { + VS_GENERIC_QUAD_API(generic_programmable) +}; diff --git a/vslib/sai_vs_interfacequery.cpp b/vslib/sai_vs_interfacequery.cpp index 5a0a9ae03b..5cd4e5e3f4 100644 --- a/vslib/sai_vs_interfacequery.cpp +++ b/vslib/sai_vs_interfacequery.cpp @@ -77,6 +77,7 @@ static sai_apis_t vs_apis = { API(system_port), API(my_mac), API(ipsec), + API(generic_programmable), API(bmtor), }; diff --git a/vslib/sai_vs_neighbor.cpp b/vslib/sai_vs_neighbor.cpp index 33a6ffb64f..7049967c84 100644 --- a/vslib/sai_vs_neighbor.cpp +++ b/vslib/sai_vs_neighbor.cpp @@ -8,6 +8,7 @@ static sai_status_t vs_remove_all_neighbor_entries( return SAI_STATUS_NOT_IMPLEMENTED; } +VS_BULK_QUAD_ENTRY(NEIGHBOR_ENTRY,neighbor_entry); VS_GENERIC_QUAD_ENTRY(NEIGHBOR_ENTRY,neighbor_entry); const sai_neighbor_api_t vs_neighbor_api = { @@ -15,4 +16,6 @@ const sai_neighbor_api_t vs_neighbor_api = { VS_GENERIC_QUAD_API(neighbor_entry) vs_remove_all_neighbor_entries, + + VS_BULK_QUAD_API(neighbor_entry) }; diff --git a/vslib/sai_vs_nexthopgroup.cpp b/vslib/sai_vs_nexthopgroup.cpp index 7abeab0c50..f3881f8252 100644 --- a/vslib/sai_vs_nexthopgroup.cpp +++ b/vslib/sai_vs_nexthopgroup.cpp @@ -17,6 +17,6 @@ const sai_next_hop_group_api_t vs_next_hop_group_api = { vs_bulk_create_next_hop_group_members, vs_bulk_remove_next_hop_group_members, VS_GENERIC_QUAD_API(next_hop_group_map) - vs_bulk_get_next_hop_group_members, - vs_bulk_set_next_hop_group_members + vs_bulk_set_next_hop_group_members, + vs_bulk_get_next_hop_group_members }; diff --git a/vslib/sai_vs_switch.cpp b/vslib/sai_vs_switch.cpp index e0be09d097..3ef2264265 100644 --- a/vslib/sai_vs_switch.cpp +++ b/vslib/sai_vs_switch.cpp @@ -42,6 +42,30 @@ static sai_status_t vs_switch_mdio_write( return SAI_STATUS_NOT_IMPLEMENTED; } +static sai_status_t vs_switch_mdio_cl22_read( + _In_ sai_object_id_t switch_id, + _In_ uint32_t device_addr, + _In_ uint32_t start_reg_addr, + _In_ uint32_t number_of_registers, + _Out_ uint32_t *reg_val) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +static sai_status_t vs_switch_mdio_cl22_write( + _In_ sai_object_id_t switch_id, + _In_ uint32_t device_addr, + _In_ uint32_t start_reg_addr, + _In_ uint32_t number_of_registers, + _In_ const uint32_t *reg_val) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + const sai_switch_api_t vs_switch_api = { vs_create_switch_uniq, @@ -55,5 +79,6 @@ const sai_switch_api_t vs_switch_api = { vs_switch_mdio_write, VS_GENERIC_QUAD_API(switch_tunnel) - + vs_switch_mdio_cl22_read, + vs_switch_mdio_cl22_write }; diff --git a/vslib/sai_vs_tunnel.cpp b/vslib/sai_vs_tunnel.cpp index 1214169cb2..e7b522a089 100644 --- a/vslib/sai_vs_tunnel.cpp +++ b/vslib/sai_vs_tunnel.cpp @@ -5,7 +5,7 @@ VS_GENERIC_QUAD(TUNNEL,tunnel); VS_GENERIC_QUAD(TUNNEL_TERM_TABLE_ENTRY,tunnel_term_table_entry); VS_GENERIC_QUAD(TUNNEL_MAP_ENTRY,tunnel_map_entry); VS_GENERIC_STATS(TUNNEL,tunnel); -VS_BULK_GET_SET(TUNNEL,tunnels); +VS_BULK_QUAD(TUNNEL,tunnels); const sai_tunnel_api_t vs_tunnel_api = { @@ -14,5 +14,5 @@ const sai_tunnel_api_t vs_tunnel_api = { VS_GENERIC_STATS_API(tunnel) VS_GENERIC_QUAD_API(tunnel_term_table_entry) VS_GENERIC_QUAD_API(tunnel_map_entry) - VS_BULK_GET_SET_API(tunnels) + VS_BULK_QUAD_API(tunnels) };