Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add DASH SAI support to virtual SAI #5

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion unittest/vslib/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@ testslibsaivs_SOURCES = main_libsaivs.cpp \
test_sai_vs_virtual_router.cpp \
test_sai_vs_vlan.cpp \
test_sai_vs_hostif.cpp \
test_sai_vs_wred.cpp
test_sai_vs_wred.cpp \
test_dash_sai.cpp

testslibsaivs_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON)
testslibsaivs_LDADD = $(LDADD_GTEST) -L$(top_srcdir)/vslib/.libs -lsaivs -lhiredis -lswsscommon -lpthread -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta -lzmq $(CODE_COVERAGE_LIBS)
Expand Down
15 changes: 15 additions & 0 deletions unittest/vslib/test_dash_sai.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#include <gtest/gtest.h>

extern "C" {
#include "sai.h"
#include "saiextensions.h"
}

#include "swss/logger.h"

TEST(libsaivs, dash_sai)
{
sai_acl_api_t *api = nullptr;

EXPECT_EQ(SAI_STATUS_SUCCESS, sai_api_query(static_cast<sai_api_t>(static_cast<sai_api_extensions_t>(57)), (void**)&api));
}
76 changes: 76 additions & 0 deletions vslib/DashSai.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#include <dlfcn.h>

#include <boost/filesystem.hpp>

#include <swss/logger.h>
#include <DashSai.h>

const std::string DashSai::LibPath = "/usr/lib/libsai-dash/libsai-dash.so";

DashSai::DashSai(const std::string &lib_path)
{
SWSS_LOG_ENTER();

m_dl_handle = dlopen(lib_path.c_str(), RTLD_NOW | RTLD_LOCAL);

if (m_dl_handle == nullptr)
{
SWSS_LOG_ERROR("Failed to load library %s", lib_path.c_str());
throw std::runtime_error(dlerror());
}

m_sai_api_query_fn = reinterpret_cast<sai_api_query_fn_t>(dlsym(m_dl_handle, "sai_api_query"));

if (m_sai_api_query_fn == nullptr)
{
SWSS_LOG_ERROR("Failed to load sai_api_query function");
throw std::runtime_error(dlerror());
}
}

DashSai::~DashSai()
{
SWSS_LOG_ENTER();

dlclose(m_dl_handle);
}

const DashSai* DashSai::getInstance()
{
SWSS_LOG_ENTER();

if (boost::filesystem::exists(DashSai::LibPath) == false)
{
SWSS_LOG_NOTICE("Dash SAI library %s does not exist", DashSai::LibPath.c_str());
return nullptr;
}

try
{
static DashSai instance(DashSai::LibPath);

if (instance.isAvailable())
{
return &instance;
}
}
catch(const std::exception& e)
{
SWSS_LOG_ERROR("Fail to load Dash SAI: %s", e.what());
}

return nullptr;
}

sai_status_t DashSai::sai_api_query(
_In_ sai_api_t sai_api_id,
_Out_ void** api_method_table) const
{
return m_sai_api_query_fn(sai_api_id, api_method_table);
}

bool DashSai::isAvailable() const
{
return m_dl_handle != nullptr
&& m_sai_api_query_fn != nullptr;
}
31 changes: 31 additions & 0 deletions vslib/DashSai.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#pragma once

#include <sai.h>
#include <saitypes.h>

#include <string>

class DashSai
{
public:
~DashSai();

sai_status_t sai_api_query(
_In_ sai_api_t sai_api_id,
_Out_ void** api_method_table) const;

bool isAvailable() const;

static const DashSai* getInstance();

private:
DashSai(const std::string &lib_path);

using sai_api_query_fn_t = sai_status_t (*)(sai_api_t sai_api_id, void** api_method_table);

void *m_dl_handle;

sai_api_query_fn_t m_sai_api_query_fn;

static const std::string LibPath;
};
7 changes: 4 additions & 3 deletions vslib/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -109,19 +109,20 @@ libsaivs_la_SOURCES = \
sai_vs_vlan.cpp \
sai_vs_wred.cpp \
sai_vs_my_mac.cpp \
sai_vs_ipsec.cpp
sai_vs_ipsec.cpp \
DashSai.cpp

libSaiVS_a_CPPFLAGS = $(CODE_COVERAGE_CPPFLAGS)
libSaiVS_a_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) $(CODE_COVERAGE_CXXFLAGS)

libsaivs_la_CPPFLAGS = $(CODE_COVERAGE_CPPFLAGS)
libsaivs_la_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) $(CODE_COVERAGE_CXXFLAGS)
libsaivs_la_LIBADD = -lhiredis -lswsscommon libSaiVS.a $(CODE_COVERAGE_LIBS)
libsaivs_la_LIBADD = -lhiredis -lswsscommon -lboost_filesystem libSaiVS.a $(CODE_COVERAGE_LIBS)

bin_PROGRAMS = tests

tests_SOURCES = tests.cpp
tests_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON)
tests_LDADD = -lhiredis -lswsscommon -lpthread libsaivs.la -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta -lzmq
tests_LDADD = -lhiredis -lswsscommon -lpthread libsaivs.la -L$(top_srcdir)/meta/.libs -lsaimetadata -lsaimeta -lzmq -ldl -lboost_filesystem

TESTS = tests
7 changes: 7 additions & 0 deletions vslib/sai_vs_interfacequery.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "sai_vs.h"
#include "Sai.h"
#include "DashSai.h"

std::shared_ptr<sairedis::SaiInterface> vs_sai = std::make_shared<saivs::Sai>();

Expand Down Expand Up @@ -108,6 +109,12 @@ sai_status_t sai_api_query(
return SAI_STATUS_SUCCESS;
}

auto dash_sai = DashSai::getInstance();
if (dash_sai)
{
return dash_sai->sai_api_query(sai_api_id, api_method_table);
}

SWSS_LOG_ERROR("Invalid API type %d", sai_api_id);

return SAI_STATUS_INVALID_PARAMETER;
Expand Down