From 9574a3c62c8b53eb0df47359041ce20ff4b32fd0 Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Thu, 13 Jun 2024 09:28:52 +0200 Subject: [PATCH 1/3] [proxy] Support notifications (#1393) This proxy class will be used in DASH application. This change contains: Update DummySaiInterface do support dummy notifications for testing DummySaiInterface unittests Proxy class support notifications Proxy class unittests Sai class support notifications Sai class unittests Added Options class for handy zmq options configuration Move DummySaiInterface to saimeta library Added TODO which functions should be replaced after SAI submodule update Update aspell --- meta/DummySaiInterface.cpp | 475 +++++++++++++++++++++++- meta/DummySaiInterface.h | 70 +++- meta/Makefile.am | 1 + proxylib/Makefile.am | 1 + proxylib/Options.cpp | 30 ++ proxylib/Options.h | 25 ++ proxylib/Proxy.cpp | 352 +++++++++++++++++- proxylib/Proxy.h | 83 ++++- proxylib/Sai.cpp | 173 ++++++--- proxylib/Sai.h | 16 +- proxylib/saiproxy.h | 9 + stub.pl | 2 +- tests/aspell.en.pws | 2 + unittest/meta/Makefile.am | 1 - unittest/meta/TestDummySaiInterface.cpp | 233 ++++++++++++ unittest/proxylib/Makefile.am | 1 - unittest/proxylib/TestProxy.cpp | 248 +++++++++++++ unittest/proxylib/TestSai.cpp | 217 +++++++++++ unittest/syncd/Makefile.am | 1 - 19 files changed, 1851 insertions(+), 89 deletions(-) create mode 100644 proxylib/Options.cpp create mode 100644 proxylib/Options.h create mode 100644 proxylib/saiproxy.h diff --git a/meta/DummySaiInterface.cpp b/meta/DummySaiInterface.cpp index 51e9e7d51..eef753e76 100644 --- a/meta/DummySaiInterface.cpp +++ b/meta/DummySaiInterface.cpp @@ -3,14 +3,32 @@ #include "swss/logger.h" #include +#include + +#define MUTEX() std::lock_guard _lock(m_mutex) using namespace saimeta; -DummySaiInterface::DummySaiInterface() +DummySaiInterface::DummySaiInterface(): + m_status(SAI_STATUS_SUCCESS), + m_apiInitialized(false), + m_runThread(false) +{ + SWSS_LOG_ENTER(); + + memset(&m_sn, 0, sizeof(m_sn)); +} + +DummySaiInterface::~DummySaiInterface() { SWSS_LOG_ENTER(); - m_status = SAI_STATUS_SUCCESS; + if (m_apiInitialized) + { + apiUninitialize(); + } + + stop(); } void DummySaiInterface::setStatus( @@ -27,36 +45,39 @@ sai_status_t DummySaiInterface::apiInitialize( { SWSS_LOG_ENTER(); - if (smt) + memset(&m_sn, 0, sizeof(m_sn)); + + if (smt && smt->profile_get_value) { - if (smt->profile_get_value) - { - SWSS_LOG_NOTICE("Dummy: profile_get_value(NULL): %s", smt->profile_get_value(0, NULL)); - SWSS_LOG_NOTICE("Dummy: profile_get_value(FOO): %s", smt->profile_get_value(0, "FOO")); - SWSS_LOG_NOTICE("Dummy: profile_get_value(FOO): %s", smt->profile_get_value(0, "CAR")); - } + SWSS_LOG_NOTICE("Dummy: profile_get_value(NULL): %s", smt->profile_get_value(0, NULL)); + SWSS_LOG_NOTICE("Dummy: profile_get_value(FOO): %s", smt->profile_get_value(0, "FOO")); + SWSS_LOG_NOTICE("Dummy: profile_get_value(CAR): %s", smt->profile_get_value(0, "CAR")); + } - if (smt->profile_get_next_value) - { + if (smt && smt->profile_get_next_value) + { - const char *var = NULL; - const char *val = NULL; + const char *var = NULL; + const char *val = NULL; - SWSS_LOG_NOTICE("Dummy: profile_get_next_value: %d", smt->profile_get_next_value(0, NULL, NULL)); - SWSS_LOG_NOTICE("Dummy: profile_get_next_value: %d", smt->profile_get_next_value(0, NULL, &val)); - SWSS_LOG_NOTICE("Dummy: profile_get_next_value: %d", smt->profile_get_next_value(0, &var, NULL)); - SWSS_LOG_NOTICE("Dummy: profile_get_next_value: %d", smt->profile_get_next_value(0, &var, &val)); - SWSS_LOG_NOTICE("Dummy: profile_get_next_value: %d", smt->profile_get_next_value(0, &var, &val)); - } + SWSS_LOG_NOTICE("Dummy: profile_get_next_value: %d", smt->profile_get_next_value(0, NULL, NULL)); + SWSS_LOG_NOTICE("Dummy: profile_get_next_value: %d", smt->profile_get_next_value(0, NULL, &val)); + SWSS_LOG_NOTICE("Dummy: profile_get_next_value: %d", smt->profile_get_next_value(0, &var, NULL)); + SWSS_LOG_NOTICE("Dummy: profile_get_next_value: %d", smt->profile_get_next_value(0, &var, &val)); + SWSS_LOG_NOTICE("Dummy: profile_get_next_value: %d", smt->profile_get_next_value(0, &var, &val)); } + m_apiInitialized = true; + return SAI_STATUS_SUCCESS; } -sai_status_t DummySaiInterface::apiUninitialize(void) +sai_status_t DummySaiInterface::apiUninitialize(void) { SWSS_LOG_ENTER(); + m_apiInitialized = false; + return SAI_STATUS_SUCCESS; } @@ -69,11 +90,18 @@ sai_status_t DummySaiInterface::create( { SWSS_LOG_ENTER(); + // TODO implement some dummy OID handling + if (objectId && m_status == SAI_STATUS_SUCCESS) { *objectId = (sai_object_id_t)1; } + if (m_status == SAI_STATUS_SUCCESS && objectType == SAI_OBJECT_TYPE_SWITCH) + { + updateNotificationPointers(attr_count, attr_list); + } + return m_status; } @@ -93,6 +121,11 @@ sai_status_t DummySaiInterface::set( { SWSS_LOG_ENTER(); + if (m_status == SAI_STATUS_SUCCESS && objectType == SAI_OBJECT_TYPE_SWITCH) + { + updateNotificationPointers(1, attr); + } + return m_status; } @@ -496,3 +529,405 @@ sai_status_t DummySaiInterface::queryApiVersion( return m_status; } + +// TODO replace this method with with new SAI submodule for: +// sai_metadata_update_switch_notification_pointers + +void DummySaiInterface::updateNotificationPointers( + _In_ uint32_t count, + _In_ const sai_attribute_t* attrs) +{ + SWSS_LOG_ENTER(); + + if (attrs == NULL) + { + return; + } + + for (uint32_t idx = 0; idx < count; idx++) + { + auto &attr = attrs[idx]; + + auto* meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); + + if (meta && meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_POINTER) + { + // skip non pointers + continue; + } + + switch (attr.id) + { + case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: + m_sn.on_switch_state_change = (sai_switch_state_change_notification_fn)attrs[idx].value.ptr; + break; + case SAI_SWITCH_ATTR_SWITCH_SHUTDOWN_REQUEST_NOTIFY: + m_sn.on_switch_shutdown_request = (sai_switch_shutdown_request_notification_fn)attrs[idx].value.ptr; + break; + case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: + m_sn.on_fdb_event = (sai_fdb_event_notification_fn)attrs[idx].value.ptr; + break; + case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: + m_sn.on_port_state_change = (sai_port_state_change_notification_fn)attrs[idx].value.ptr; + break; + case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: + m_sn.on_queue_pfc_deadlock = (sai_queue_pfc_deadlock_notification_fn)attrs[idx].value.ptr; + break; + case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: + m_sn.on_bfd_session_state_change = (sai_bfd_session_state_change_notification_fn)attrs[idx].value.ptr; + break; + case SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY: + m_sn.on_nat_event = (sai_nat_event_notification_fn)attrs[idx].value.ptr; + break; + case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: + m_sn.on_switch_asic_sdk_health_event = (sai_switch_asic_sdk_health_event_notification_fn)attrs[idx].value.ptr; + break; + case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: + m_sn.on_port_host_tx_ready = (sai_port_host_tx_ready_notification_fn)attrs[idx].value.ptr; + break; + case SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY: + m_sn.on_twamp_session_event = (sai_twamp_session_event_notification_fn)attrs[idx].value.ptr; + break; + + default: + SWSS_LOG_ERROR("pointer for attr id %d (%s) is not handled, FIXME!", attr.id, (meta ? meta->attridname : "UNKNOWN")); + continue; + } + } +} + +sai_status_t DummySaiInterface::start() +{ + SWSS_LOG_ENTER(); + + if (!m_apiInitialized) + { + SWSS_LOG_ERROR("api not initialized"); + + return SAI_STATUS_FAILURE; + } + + MUTEX(); + + if (m_runThread) + { + SWSS_LOG_NOTICE("thread already is running"); + + return SAI_STATUS_SUCCESS; + } + + m_runThread = true; + + m_thread = std::make_shared(&DummySaiInterface::run, this); + + return SAI_STATUS_SUCCESS; +} + +sai_status_t DummySaiInterface::stop() +{ + SWSS_LOG_ENTER(); + + MUTEX(); + + m_runThread = false; + + if (m_thread) + { + SWSS_LOG_NOTICE("joining thread"); + + m_thread->join(); + + m_thread = nullptr; + } + + return SAI_STATUS_SUCCESS; +} + +void DummySaiInterface::run() +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("starting dummy notification thread"); + + while(m_runThread) + { + sai_attr_id_t id; + + if (tryGetNotificationToSend(id)) + { + sendNotification(id); + continue; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(64)); + } + + SWSS_LOG_NOTICE("ending dummy notification thread"); +} + +sai_status_t DummySaiInterface::enqueueNotificationToSend( + _In_ sai_attr_id_t id) +{ + SWSS_LOG_ENTER(); + + if (!m_apiInitialized) + { + SWSS_LOG_NOTICE("api not initialized"); + + return SAI_STATUS_FAILURE; + } + + MUTEX(); + + m_queue.push(id); + + return SAI_STATUS_SUCCESS; +} + +bool DummySaiInterface::tryGetNotificationToSend( + _Out_ sai_attr_id_t& id) +{ + SWSS_LOG_ENTER(); + + MUTEX(); + + if (m_queue.empty()) + return false; + + id = m_queue.front(); + + m_queue.pop(); + + return true; +} + +void DummySaiInterface::sendNotification( + _In_ sai_attr_id_t id) +{ + SWSS_LOG_ENTER(); + + // get local copy, in case m_sn will change + // this probably should be under separate mutex (m_sn) + + sai_switch_notifications_t sn = m_sn; + + auto* m = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, id); + + switch (id) + { + case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: + + if (sn.on_switch_state_change) + { + SWSS_LOG_NOTICE("sending sn.on_switch_state_change"); + + sn.on_switch_state_change(0x1, SAI_SWITCH_OPER_STATUS_UP); + } + else + { + SWSS_LOG_WARN("pointer sn.on_switch_state_change is NULL"); + } + break; + + case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: + + if (sn.on_fdb_event) + { + SWSS_LOG_NOTICE("sending sn.on_fdb_event"); + + sai_fdb_event_notification_data_t data; + + data.event_type = SAI_FDB_EVENT_LEARNED; + data.fdb_entry.switch_id = 0x1; + data.fdb_entry.mac_address[0] = 0x11; + data.fdb_entry.mac_address[1] = 0x22; + data.fdb_entry.mac_address[2] = 0x33; + data.fdb_entry.mac_address[3] = 0x44; + data.fdb_entry.mac_address[4] = 0x55; + data.fdb_entry.mac_address[5] = 0x66; + data.fdb_entry.bv_id = 0x2; + data.attr_count = 0; + data.attr = nullptr; + + sn.on_fdb_event(1, &data); + } + else + { + SWSS_LOG_WARN("pointer sn.on_fdb_event is NULL"); + } + break; + + + case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: + + if (sn.on_port_state_change) + { + SWSS_LOG_NOTICE("sending sn.on_port_state_change"); + + sai_port_oper_status_notification_t data; + + data.port_id = 0x2; + data.port_state = SAI_PORT_OPER_STATUS_UP; + + sn.on_port_state_change(1, &data); + } + else + { + SWSS_LOG_WARN("pointer sn.on_port_state_change is NULL"); + } + break; + + case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: + + if (sn.on_switch_shutdown_request) + { + SWSS_LOG_NOTICE("sending sn.on_switch_shutdown_request"); + + sn.on_switch_shutdown_request(0x1); + } + else + { + SWSS_LOG_WARN("pointer sn.on_switch_shutdown_request is NULL"); + } + break; + + case SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY: + + if (sn.on_nat_event) + { + SWSS_LOG_NOTICE("sending sn.on_nat_event"); + + sai_nat_event_notification_data_t data; + + data.event_type = SAI_NAT_EVENT_NONE; + data.nat_entry.switch_id = 0x1; + data.nat_entry.vr_id = 0x2; + data.nat_entry.nat_type = SAI_NAT_TYPE_NONE; + + memset(&data.nat_entry.data, 0, sizeof(data.nat_entry.data)); + + sn.on_nat_event(1, &data); + } + else + { + SWSS_LOG_WARN("pointer sn.on_nat_event is NULL"); + } + break; + + + case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: + + if (sn.on_nat_event) + { + SWSS_LOG_NOTICE("sending sn.on_port_host_tx_ready"); + + sn.on_port_host_tx_ready(0x1, 0x2, SAI_PORT_HOST_TX_READY_STATUS_NOT_READY); + } + else + { + SWSS_LOG_WARN("pointer sn.on_port_host_tx_readyis NULL"); + } + break; + + case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: + + if (sn.on_nat_event) + { + SWSS_LOG_NOTICE("sending sn.on_switch_asic_sdk_health_event"); + + sai_timespec_t timespec; + + timespec.tv_sec = 0; + timespec.tv_nsec = 0; + + sai_switch_health_data_t hd; + + hd.data_type = SAI_HEALTH_DATA_TYPE_GENERAL; + + sai_u8_list_t desc; + desc.count = 0; + desc.list = NULL; + + sn.on_switch_asic_sdk_health_event( + 0x1, + SAI_SWITCH_ASIC_SDK_HEALTH_SEVERITY_NOTICE, + timespec, + SAI_SWITCH_ASIC_SDK_HEALTH_CATEGORY_SW, + hd, + desc); + } + else + { + SWSS_LOG_WARN("pointer sn.sn.on_switch_asic_sdk_health_event"); + } + break; + + case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: + + if (sn.on_queue_pfc_deadlock) + { + SWSS_LOG_NOTICE("sending sn.on_queue_pfc_deadlock"); + + sai_queue_deadlock_notification_data_t data; + + data.queue_id = 0x2; + data.event = SAI_QUEUE_PFC_DEADLOCK_EVENT_TYPE_DETECTED; + data.app_managed_recovery = true; + + sn.on_queue_pfc_deadlock(1, &data); + } + else + { + SWSS_LOG_WARN("pointer sn.on_port_host_tx_readyis NULL"); + } + break; + + case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: + + if (sn.on_bfd_session_state_change) + { + SWSS_LOG_NOTICE("sending sn.on_bfd_session_state_change"); + + sai_bfd_session_state_notification_t data; + + data.bfd_session_id = 0x2; + data.session_state = SAI_BFD_SESSION_STATE_ADMIN_DOWN; + + sn.on_bfd_session_state_change(1, &data); + } + else + { + SWSS_LOG_WARN("pointer sn.on_bfd_session_state_change"); + } + break; + + case SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY: + + if (sn.on_twamp_session_event) + { + SWSS_LOG_NOTICE("sending sn.on_twamp_session_event"); + + sai_twamp_session_event_notification_data_t data; + + data.twamp_session_id = 0x1; + data.session_state = SAI_TWAMP_SESSION_STATE_INACTIVE; + + data.session_stats.index = 0; + data.session_stats.number_of_counters = 0; + data.session_stats.counters_ids = nullptr; + data.session_stats.counters = nullptr; + + sn.on_twamp_session_event(1, &data); + } + else + { + SWSS_LOG_WARN("pointer sn.on_twamp_session_event"); + } + break; + + default: + + SWSS_LOG_WARN("notification for SWITCH attr id: %d (%s) is not supported, FIXME", id, (m ? m->attridname : "UNKNOWN")); + break; + } +} diff --git a/meta/DummySaiInterface.h b/meta/DummySaiInterface.h index d6e8d748d..0a61719d6 100644 --- a/meta/DummySaiInterface.h +++ b/meta/DummySaiInterface.h @@ -3,6 +3,9 @@ #include "SaiInterface.h" #include +#include +#include +#include namespace saimeta { @@ -18,7 +21,7 @@ namespace saimeta DummySaiInterface(); - virtual ~DummySaiInterface() = default; + virtual ~DummySaiInterface(); public: @@ -218,6 +221,71 @@ namespace saimeta protected: + void updateNotificationPointers( + _In_ uint32_t count, + _In_ const sai_attribute_t* attrs); + + public: + + /** + * @brief Will start sending notifications + */ + sai_status_t start(); + + /** + * @brief Will stop sending notifications + */ + sai_status_t stop(); + + /** + * @brief Enqueue notification to send. Will send specific dummy + * notification from notifications thread. + */ + + sai_status_t enqueueNotificationToSend( + _In_ sai_attr_id_t id); + + protected: + + /** + * @brief Try get notification to send. + * + * If notification queue is not empty, it will return true and + * set id to attribute of notification. + */ + bool tryGetNotificationToSend( + _Out_ sai_attr_id_t& id); + + /** + * @brief Send notification. + * + * Will actually send notification if expected pointer for + * notification is not null. + */ + void sendNotification( + _In_ sai_attr_id_t id); + + protected: + + void run(); + + protected: + + sai_switch_notifications_t m_sn; + sai_status_t m_status; + + bool m_apiInitialized; + + /** + * @brief Thread that will be used to send notifications + */ + std::shared_ptr m_thread; + + std::mutex m_mutex; + + bool m_runThread; + + std::queue m_queue; }; } diff --git a/meta/Makefile.am b/meta/Makefile.am index 0a6ac1887..f62d0cbd9 100644 --- a/meta/Makefile.am +++ b/meta/Makefile.am @@ -50,6 +50,7 @@ libsaimeta_la_SOURCES = \ SaiObjectCollection.cpp \ SaiSerialize.cpp \ SelectableChannel.cpp \ + DummySaiInterface.cpp \ ZeroMQSelectableChannel.cpp libsaimeta_la_CPPFLAGS = $(CODE_COVERAGE_CPPFLAGS) diff --git a/proxylib/Makefile.am b/proxylib/Makefile.am index 5797451eb..3a712d76f 100644 --- a/proxylib/Makefile.am +++ b/proxylib/Makefile.am @@ -5,6 +5,7 @@ lib_LTLIBRARIES = libsaiproxy.la noinst_LIBRARIES = libSaiProxy.a libSaiProxy_a_SOURCES = \ + Options.cpp \ Proxy.cpp \ Sai.cpp diff --git a/proxylib/Options.cpp b/proxylib/Options.cpp new file mode 100644 index 000000000..c07365f71 --- /dev/null +++ b/proxylib/Options.cpp @@ -0,0 +1,30 @@ +#include "Options.h" + +#include "swss/logger.h" + +#include + +using namespace saiproxy; + +Options::Options() +{ + SWSS_LOG_ENTER(); + + m_config = "config.ini"; + + m_zmqChannel = "tcp://127.0.0.1:5555"; + m_zmqNtfChannel = "tcp://127.0.0.1:5556"; +} + +std::string Options::getString() const +{ + SWSS_LOG_ENTER(); + + std::stringstream ss; + + ss << " Config=" << m_config; + ss << " ZmqChannel=" << m_zmqChannel; + ss << " ZmqNtfChannel=" << m_zmqNtfChannel; + + return ss.str(); +} diff --git a/proxylib/Options.h b/proxylib/Options.h new file mode 100644 index 000000000..d332b8c47 --- /dev/null +++ b/proxylib/Options.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +namespace saiproxy +{ + class Options + { + public: + + Options(); + + ~Options() = default; + + public: + + std::string getString() const; + + public: + + std::string m_config; + std::string m_zmqChannel; + std::string m_zmqNtfChannel; + }; +} diff --git a/proxylib/Proxy.cpp b/proxylib/Proxy.cpp index ff789c5fd..e4e9275a6 100644 --- a/proxylib/Proxy.cpp +++ b/proxylib/Proxy.cpp @@ -10,6 +10,8 @@ #include "syncd/ZeroMQNotificationProducer.h" +#include + #include #include @@ -21,17 +23,27 @@ using namespace std::placeholders; Proxy::Proxy( _In_ std::shared_ptr vendorSai): - m_vendorSai(vendorSai), - m_apiInitialized(false) + Proxy(vendorSai, std::make_shared()) { SWSS_LOG_ENTER(); - m_configFile = "config.ini"; // TODO to command line + SWSS_LOG_NOTICE("using default options"); +} - // TODO to move hard coded addresses to config +Proxy::Proxy( + _In_ std::shared_ptr vendorSai, + _In_ std::shared_ptr options): + m_vendorSai(vendorSai), + m_options(options), + m_apiInitialized(false), + m_notificationsSentCount(0) +{ + SWSS_LOG_ENTER(); - m_selectableChannel = std::make_shared("tcp://127.0.0.1:5555"); - m_notifications = std::make_shared("tcp://127.0.0.1:5556"); + SWSS_LOG_NOTICE("Options: %s", m_options->getString().c_str()); + + m_selectableChannel = std::make_shared(m_options->m_zmqChannel); + m_notifications = std::make_shared(m_options->m_zmqNtfChannel); loadProfileMap(); @@ -40,6 +52,21 @@ Proxy::Proxy( m_test_services = m_smt.getServiceMethodTable(); + memset(&m_sn, 0, sizeof(m_sn)); + + m_swNtf.onFdbEvent = std::bind(&Proxy::onFdbEvent, this, _1, _2); + m_swNtf.onNatEvent = std::bind(&Proxy::onNatEvent, this, _1, _2); + m_swNtf.onPortStateChange = std::bind(&Proxy::onPortStateChange, this, _1, _2); + m_swNtf.onQueuePfcDeadlock = std::bind(&Proxy::onQueuePfcDeadlock, this, _1, _2); + m_swNtf.onSwitchAsicSdkHealthEvent = std::bind(&Proxy::onSwitchAsicSdkHealthEvent, this, _1, _2, _3, _4, _5, _6); + m_swNtf.onSwitchShutdownRequest = std::bind(&Proxy::onSwitchShutdownRequest, this, _1); + m_swNtf.onSwitchStateChange = std::bind(&Proxy::onSwitchStateChange, this, _1, _2); + m_swNtf.onBfdSessionStateChange = std::bind(&Proxy::onBfdSessionStateChange, this, _1, _2); + m_swNtf.onPortHostTxReady = std::bind(&Proxy::onPortHostTxReady, this, _1, _2, _3); + m_swNtf.onTwampSessionEvent = std::bind(&Proxy::onTwampSessionEvent, this, _1, _2); + + m_sn = m_swNtf.getSwitchNotifications(); + sai_status_t status = m_vendorSai->apiInitialize(0, &m_test_services); if (status != SAI_STATUS_SUCCESS) @@ -83,12 +110,12 @@ void Proxy::loadProfileMap() { SWSS_LOG_ENTER(); - std::ifstream profile(m_configFile.c_str()); + std::ifstream profile(m_options->m_config); if (!profile.is_open()) { SWSS_LOG_WARN("failed to open profile map file: %s: %s", - m_configFile.c_str(), + m_options->m_config.c_str(), strerror(errno)); return; @@ -368,12 +395,10 @@ void Proxy::processCreate( if (metaKey.objecttype == SAI_OBJECT_TYPE_SWITCH) { /* - * TODO: translate notification pointers * TODO: must be done per switch, and switch may not exists yet */ - // TODO - // m_handler->updateNotificationsPointers(attr_count, attr_list); + updateAttributteNotificationPointers(attr_count, attr_list); } sai_object_id_t newObjectId = SAI_NULL_OBJECT_ID;; @@ -446,12 +471,10 @@ void Proxy::processSet( if (metaKey.objecttype == SAI_OBJECT_TYPE_SWITCH) { /* - * TODO: translate notification pointers * TODO: must be done per switch, and switch may not exists yet */ - // TODO - // m_handler->updateNotificationsPointers(attr_count, attr_list); + updateAttributteNotificationPointers(1, attr_list); } sai_status_t status = m_vendorSai->set(metaKey, attr_list); @@ -1051,3 +1074,304 @@ void Proxy::processClearStats( m_selectableChannel->set(strStatus, entry, "clear_stats_response"); } + +// TODO replace this method with with new SAI submodule for: +// sai_metadata_update_switch_notification_pointers + +void Proxy::updateAttributteNotificationPointers( + _In_ uint32_t count, + _Inout_ sai_attribute_t* attr_list) +{ + SWSS_LOG_ENTER(); + + for (uint32_t index = 0; index < count; ++index) + { + sai_attribute_t &attr = attr_list[index]; + + auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); + + if (meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_POINTER) + { + continue; + } + + /* + * Does not matter if pointer is valid or not, we just want the + * previous value. + */ + + sai_pointer_t prev = attr.value.ptr; + + if (prev == NULL) + { + /* + * If pointer is NULL, then fine, let it be. + */ + + continue; + } + + switch (attr.id) + { + case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: + attr.value.ptr = (void*)m_sn.on_switch_state_change; + break; + + case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: + attr.value.ptr = (void*)m_sn.on_switch_shutdown_request; + break; + + case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: + attr.value.ptr = (void*)m_sn.on_switch_asic_sdk_health_event; + break; + + case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: + attr.value.ptr = (void*)m_sn.on_fdb_event; + break; + + case SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY: + attr.value.ptr = (void*)m_sn.on_nat_event; + break; + + case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: + attr.value.ptr = (void*)m_sn.on_port_state_change; + break; + + case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: + attr.value.ptr = (void*)m_sn.on_port_host_tx_ready; + break; + + case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: + attr.value.ptr = (void*)m_sn.on_queue_pfc_deadlock; + break; + + case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: + attr.value.ptr = (void*)m_sn.on_bfd_session_state_change; + break; + + case SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY: + attr.value.ptr = (void*)m_sn.on_twamp_session_event; + break; + + default: + + SWSS_LOG_ERROR("pointer for %s is not handled, FIXME!", meta->attridname); + continue; + } + + // Here we translated pointer, just log it. + + SWSS_LOG_NOTICE("%s: 0x%" PRIx64 " (orch) => 0x%" PRIx64 " (syncd)", meta->attridname, (uint64_t)prev, (uint64_t)attr.value.ptr); + } +} + +// TODO replace this method with with new SAI submodule for: +// sai_metadata_update_switch_notification_pointers + +void Proxy::updateNotificationPointers( + _In_ uint32_t count, + _In_ const sai_attribute_t* attrs) +{ + SWSS_LOG_ENTER(); + + // NOTE this is done under mutex + + for (uint32_t idx = 0; idx < count; idx++) + { + auto &attr = attrs[idx]; + + auto* meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); + + switch (attr.id) + { + case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: + m_sn.on_switch_state_change = + (sai_switch_state_change_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: + m_sn.on_switch_asic_sdk_health_event = + (sai_switch_asic_sdk_health_event_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: + m_sn.on_switch_shutdown_request = + (sai_switch_shutdown_request_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: + m_sn.on_fdb_event = + (sai_fdb_event_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: + m_sn.on_port_state_change = + (sai_port_state_change_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: + m_sn.on_port_host_tx_ready = + (sai_port_host_tx_ready_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_PACKET_EVENT_NOTIFY: + m_sn.on_packet_event = + (sai_packet_event_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: + m_sn.on_queue_pfc_deadlock = + (sai_queue_pfc_deadlock_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: + m_sn.on_bfd_session_state_change = + (sai_bfd_session_state_change_notification_fn)attr.value.ptr; + break; + + default: + SWSS_LOG_ERROR("pointer for attr id %d (%s) is not handled, FIXME!", attr.id, (meta ? meta->attridname : "UNKNOWN")); + continue; + } + } +} + +// TODO move to notification handler class + +void Proxy::onFdbEvent( + _In_ uint32_t count, + _In_ const sai_fdb_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + std::string s = sai_serialize_fdb_event_ntf(count, data); + + sendNotification(SAI_SWITCH_NOTIFICATION_NAME_FDB_EVENT, s); +} + +void Proxy::onNatEvent( + _In_ uint32_t count, + _In_ const sai_nat_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + std::string s = sai_serialize_nat_event_ntf(count, data); + + sendNotification(SAI_SWITCH_NOTIFICATION_NAME_NAT_EVENT, s); +} + +void Proxy::onPortStateChange( + _In_ uint32_t count, + _In_ const sai_port_oper_status_notification_t *data) +{ + SWSS_LOG_ENTER(); + + auto s = sai_serialize_port_oper_status_ntf(count, data); + + sendNotification(SAI_SWITCH_NOTIFICATION_NAME_PORT_STATE_CHANGE, s); +} + +void Proxy::onPortHostTxReady( + _In_ sai_object_id_t switch_id, + _In_ sai_object_id_t port_id, + _In_ sai_port_host_tx_ready_status_t host_tx_ready_status) +{ + SWSS_LOG_ENTER(); + + auto s = sai_serialize_port_host_tx_ready_ntf(switch_id, port_id, host_tx_ready_status); + + sendNotification(SAI_SWITCH_NOTIFICATION_NAME_PORT_HOST_TX_READY, s); +} + +void Proxy::onQueuePfcDeadlock( + _In_ uint32_t count, + _In_ const sai_queue_deadlock_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + auto s = sai_serialize_queue_deadlock_ntf(count, data); + + sendNotification(SAI_SWITCH_NOTIFICATION_NAME_QUEUE_PFC_DEADLOCK, s); +} + +void Proxy::onSwitchShutdownRequest( + _In_ sai_object_id_t switch_id) +{ + SWSS_LOG_ENTER(); + + auto s = sai_serialize_switch_shutdown_request(switch_id); + + sendNotification(SAI_SWITCH_NOTIFICATION_NAME_SWITCH_SHUTDOWN_REQUEST, s); +} + +void Proxy::onSwitchAsicSdkHealthEvent( + _In_ sai_object_id_t switch_id, + _In_ sai_switch_asic_sdk_health_severity_t severity, + _In_ sai_timespec_t timestamp, + _In_ sai_switch_asic_sdk_health_category_t category, + _In_ sai_switch_health_data_t data, + _In_ const sai_u8_list_t description) +{ + SWSS_LOG_ENTER(); + + std::string s = sai_serialize_switch_asic_sdk_health_event(switch_id, severity, timestamp, category, data, description); + + sendNotification(SAI_SWITCH_NOTIFICATION_NAME_SWITCH_ASIC_SDK_HEALTH_EVENT, s); +} + +void Proxy::onSwitchStateChange( + _In_ sai_object_id_t switch_id, + _In_ sai_switch_oper_status_t switch_oper_status) +{ + SWSS_LOG_ENTER(); + + auto s = sai_serialize_switch_oper_status(switch_id, switch_oper_status); + + sendNotification(SAI_SWITCH_NOTIFICATION_NAME_SWITCH_STATE_CHANGE, s); +} + +void Proxy::onBfdSessionStateChange( + _In_ uint32_t count, + _In_ const sai_bfd_session_state_notification_t *data) +{ + SWSS_LOG_ENTER(); + + std::string s = sai_serialize_bfd_session_state_ntf(count, data); + + sendNotification(SAI_SWITCH_NOTIFICATION_NAME_BFD_SESSION_STATE_CHANGE, s); +} + +void Proxy::onTwampSessionEvent( + _In_ uint32_t count, + _In_ const sai_twamp_session_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + std::string s = sai_serialize_twamp_session_event_ntf(count, data); + + sendNotification(SAI_SWITCH_NOTIFICATION_NAME_TWAMP_SESSION_EVENT, s); +} + +void Proxy::sendNotification( + _In_ const std::string& op, + _In_ const std::string& data) +{ + SWSS_LOG_ENTER(); + + std::vector entry; + + swss::KeyOpFieldsValuesTuple item(op, data, entry); + + SWSS_LOG_INFO("%s %s", op.c_str(), data.c_str()); + + m_notificationsSentCount++; + + m_notifications->send(op, data, entry); +} + +uint64_t Proxy::getNotificationsSentCount() const +{ + SWSS_LOG_ENTER(); + + return m_notificationsSentCount; +} diff --git a/proxylib/Proxy.h b/proxylib/Proxy.h index 8fc3b6424..c92809e54 100644 --- a/proxylib/Proxy.h +++ b/proxylib/Proxy.h @@ -7,6 +7,9 @@ #include "syncd/ServiceMethodTable.h" #include "syncd/NotificationProducerBase.h" +#include "syncd/SwitchNotifications.h" + +#include "Options.h" #include #include @@ -22,6 +25,10 @@ namespace saiproxy Proxy( _In_ std::shared_ptr vendorSai); + Proxy( + _In_ std::shared_ptr vendorSai, + _In_ std::shared_ptr options); + virtual ~Proxy(); public: @@ -99,10 +106,72 @@ namespace saiproxy void processClearStats( _In_ const swss::KeyOpFieldsValuesTuple &kco); + private: // notifications + + void onFdbEvent( + _In_ uint32_t count, + _In_ const sai_fdb_event_notification_data_t *data); + + void onNatEvent( + _In_ uint32_t count, + _In_ const sai_nat_event_notification_data_t *data); + + void onPortStateChange( + _In_ uint32_t count, + _In_ const sai_port_oper_status_notification_t *data); + + void onPortHostTxReady( + _In_ sai_object_id_t switch_id, + _In_ sai_object_id_t port_id, + _In_ sai_port_host_tx_ready_status_t host_tx_ready_status); + + void onQueuePfcDeadlock( + _In_ uint32_t count, + _In_ const sai_queue_deadlock_notification_data_t *data); + + void onSwitchShutdownRequest( + _In_ sai_object_id_t switch_id); + + void onSwitchAsicSdkHealthEvent( + _In_ sai_object_id_t switch_id, + _In_ sai_switch_asic_sdk_health_severity_t severity, + _In_ sai_timespec_t timestamp, + _In_ sai_switch_asic_sdk_health_category_t category, + _In_ sai_switch_health_data_t data, + _In_ const sai_u8_list_t description); + + void onSwitchStateChange( + _In_ sai_object_id_t switch_id, + _In_ sai_switch_oper_status_t switch_oper_status); + + void onBfdSessionStateChange( + _In_ uint32_t count, + _In_ const sai_bfd_session_state_notification_t *data); + + void onTwampSessionEvent( + _In_ uint32_t count, + _In_ const sai_twamp_session_event_notification_data_t *data); + + void sendNotification( + _In_ const std::string& op, + _In_ const std::string& data); + private: void loadProfileMap(); + void updateNotificationPointers( + _In_ uint32_t count, + _In_ const sai_attribute_t* attrs); + + void updateAttributteNotificationPointers( + _In_ uint32_t count, + _Inout_ sai_attribute_t* attr_list); + + public: + + uint64_t getNotificationsSentCount() const; + private: syncd::ServiceMethodTable m_smt; @@ -121,7 +190,7 @@ namespace saiproxy std::shared_ptr m_notifications; - std::string m_configFile; + std::shared_ptr m_options; /** * @brief Mutex for synchronizing api execution and notifications @@ -129,5 +198,17 @@ namespace saiproxy std::mutex m_mutex; bool m_apiInitialized; + + sai_switch_notifications_t m_sn; + + syncd::SwitchNotifications m_swNtf; + + /** + * @brief Notifications sent count. + * + * This value can be used to write unittests when testing + * notifications. + */ + uint64_t m_notificationsSentCount; }; } diff --git a/proxylib/Sai.cpp b/proxylib/Sai.cpp index e99c6989f..c412b2eec 100644 --- a/proxylib/Sai.cpp +++ b/proxylib/Sai.cpp @@ -3,6 +3,7 @@ #include "SaiInternal.h" #include "ZeroMQChannel.h" #include "SaiAttributeList.h" +#include "NotificationFactory.h" #include "meta/Meta.h" #include "meta/sai_serialize.h" @@ -71,11 +72,15 @@ sai_status_t Sai::apiInitialize( memcpy(&m_service_method_table, service_method_table, sizeof(m_service_method_table)); - // TODO move hard coded values to config + memset(&m_sn, 0, sizeof(m_sn)); + + m_options = std::make_shared(); // load default options + + // TODO options should be obtained from service method table m_communicationChannel = std::make_shared( - "tcp://127.0.0.1:5555", - "tcp://127.0.0.1:5556", + m_options->m_zmqChannel, + m_options->m_zmqNtfChannel, std::bind(&Sai::handleNotification, this, _1, _2, _3)); m_apiInitialized = true; @@ -90,6 +95,8 @@ sai_status_t Sai::apiUninitialize(void) SWSS_LOG_NOTICE("begin"); + m_communicationChannel = nullptr; // will stop the thread + m_apiInitialized = false; SWSS_LOG_NOTICE("end"); @@ -126,10 +133,13 @@ sai_status_t Sai::create( auto status = m_communicationChannel->wait("create_response", kco); - // TODO SAVE pointers for notifications - if (status == SAI_STATUS_SUCCESS) { + if (objectType == SAI_OBJECT_TYPE_SWITCH) + { + updateNotifications(attr_count, attr_list); // TODO should be per switch + } + auto& values = kfvFieldsValues(kco); if (values.size() == 0) @@ -267,8 +277,6 @@ sai_status_t Sai::create( std::string key = serializedObjectType + ":" + entry; - // TODO SAVE pointers for notifications - m_communicationChannel->set(key, vals, "create_entry"); swss::KeyOpFieldsValuesTuple kco; @@ -302,8 +310,6 @@ sai_status_t Sai::set( auto val = saimeta::SaiAttributeList::serialize_attr_list(objectType, 1, attr, false); - // TODO SAVE pointers for notifications - auto serializedObjectType = sai_serialize_object_type(objectType); std::string key = serializedObjectType + ":" + entry; @@ -312,7 +318,14 @@ sai_status_t Sai::set( swss::KeyOpFieldsValuesTuple kco; - return m_communicationChannel->wait("set_response", kco); + auto status = m_communicationChannel->wait("set_response", kco); + + if (objectType == SAI_OBJECT_TYPE_SWITCH && status == SAI_STATUS_SUCCESS) + { + updateNotifications(1, attr); + } + + return status; } sai_status_t Sai::get( @@ -1102,47 +1115,115 @@ sai_status_t Sai::queryApiVersion( return status; } +// TODO use function from SAI metadata to populate those + +void Sai::updateNotifications( + _In_ uint32_t attrCount, + _In_ const sai_attribute_t *attrList) +{ + SWSS_LOG_ENTER(); + + /* + * This function should only be called on CREATE/SET + * api when object is SWITCH. + */ + + for (uint32_t index = 0; index < attrCount; ++index) + { + auto &attr = attrList[index]; + + auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); + + if (meta == NULL) + SWSS_LOG_THROW("failed to find metadata for switch attr %d", attr.id); + + if (meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_POINTER) + continue; + + switch (attr.id) + { + case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: + m_sn.on_switch_state_change = + (sai_switch_state_change_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: + m_sn.on_switch_asic_sdk_health_event = + (sai_switch_asic_sdk_health_event_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: + m_sn.on_switch_shutdown_request = + (sai_switch_shutdown_request_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: + m_sn.on_fdb_event = + (sai_fdb_event_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY: + m_sn.on_nat_event = + (sai_nat_event_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: + m_sn.on_port_state_change = + (sai_port_state_change_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: + m_sn.on_queue_pfc_deadlock = + (sai_queue_pfc_deadlock_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: + m_sn.on_bfd_session_state_change = + (sai_bfd_session_state_change_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: + m_sn.on_port_host_tx_ready = + (sai_port_host_tx_ready_notification_fn)attr.value.ptr; + break; + + case SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY: + m_sn.on_twamp_session_event = + (sai_twamp_session_event_notification_fn)attr.value.ptr; + break; + + default: + SWSS_LOG_ERROR("pointer for %s is not handled, FIXME!", meta->attridname); + break; + } + } +} + void Sai::handleNotification( _In_ const std::string &name, _In_ const std::string &serializedNotification, _In_ const std::vector &values) { + MUTEX(); SWSS_LOG_ENTER(); - SWSS_LOG_ERROR("FIXME"); -} + if (!m_apiInitialized) + { + SWSS_LOG_ERROR("%s: api not initialized", __PRETTY_FUNCTION__); + + return; + } + + // TODO should be per switch, and we should know on which switch call notification + + auto notification = sairedis::NotificationFactory::deserialize(name, serializedNotification); + + if (notification) + { + SWSS_LOG_INFO("got notification: %s, executing callback!", serializedNotification.c_str()); + + // execute callback from notification thread -//sai_switch_notifications_t Sai::handle_notification( -// _In_ std::shared_ptr notification) -//{ -// MUTEX(); -// SWSS_LOG_ENTER(); -// -// if (!m_apiInitialized) -// { -// SWSS_LOG_ERROR("%s: api not initialized", __PRETTY_FUNCTION__); -// -// return { }; -// } -// -// return context->m_redisSai->syncProcessNotification(notification); -//} -// -//void Sai::handleNotification( -// _In_ const std::string &name, -// _In_ const std::string &serializedNotification, -// _In_ const std::vector &values) -//{ -// SWSS_LOG_ENTER(); -// -// auto notification = NotificationFactory::deserialize(name, serializedNotification); -// -// if (notification) -// { -// auto _sn = m_notificationCallback(notification); // will be synchronized to api mutex -// -// // execute callback from notification thread -// -// notification->executeCallback(_sn); -// } -//} + notification->executeCallback(m_sn); + } +} diff --git a/proxylib/Sai.h b/proxylib/Sai.h index 889eb7b63..6208813a9 100644 --- a/proxylib/Sai.h +++ b/proxylib/Sai.h @@ -8,6 +8,8 @@ #include "swss/logger.h" +#include "Options.h" + #include #include #include @@ -213,14 +215,18 @@ namespace saiproxy private: - sai_switch_notifications_t handle_notification( - _In_ std::shared_ptr notification); + //sai_switch_notifications_t handle_notification( + // _In_ std::shared_ptr notification); void handleNotification( _In_ const std::string &name, _In_ const std::string &serializedNotification, _In_ const std::vector &values); + void updateNotifications( + _In_ uint32_t attrCount, + _In_ const sai_attribute_t *attrList); + private: bool m_apiInitialized; @@ -231,6 +237,10 @@ namespace saiproxy std::shared_ptr m_communicationChannel; - std::function)> m_notificationCallback; + //std::function)> m_notificationCallback; + + std::shared_ptr m_options; + + sai_switch_notifications_t m_sn; }; } diff --git a/proxylib/saiproxy.h b/proxylib/saiproxy.h new file mode 100644 index 000000000..a87d9f6db --- /dev/null +++ b/proxylib/saiproxy.h @@ -0,0 +1,9 @@ +#pragma once + +/** + * @brief Proxy config. + * + * Optional. Should point to a config.ini/profile.ini which will contain + * profile variables that should be put into service method table. + */ +#define SAI_PROXY_KEY_CONFIG "SAI_PROXY_CONFIG diff --git a/stub.pl b/stub.pl index 208d8e9d0..1caf83536 100755 --- a/stub.pl +++ b/stub.pl @@ -270,7 +270,7 @@ () Write ""; } - Write "const sai_${api}_api_t ${STUB}_${api} = {"; + Write "static const sai_${api}_api_t ${STUB}_${api} = {"; while ($struct =~ /(sai_\w+_fn)\s+(\w+)/gms) { diff --git a/tests/aspell.en.pws b/tests/aspell.en.pws index 86403451e..71268a351 100644 --- a/tests/aspell.en.pws +++ b/tests/aspell.en.pws @@ -475,3 +475,5 @@ ZMQ uncreated TWAMP saiproxy +submodule +Enqueue diff --git a/unittest/meta/Makefile.am b/unittest/meta/Makefile.am index f88d6ea1f..60f0cd508 100644 --- a/unittest/meta/Makefile.am +++ b/unittest/meta/Makefile.am @@ -6,7 +6,6 @@ LDADD_GTEST = -L/usr/src/gtest -lgtest -lgtest_main tests_SOURCES = \ main.cpp \ - ../../meta/DummySaiInterface.cpp \ ../../meta/MetaTestSaiInterface.cpp \ ../../lib/VirtualObjectIdManager.cpp \ ../../lib/SwitchConfig.cpp \ diff --git a/unittest/meta/TestDummySaiInterface.cpp b/unittest/meta/TestDummySaiInterface.cpp index c85294d57..4c8ca1ca5 100644 --- a/unittest/meta/TestDummySaiInterface.cpp +++ b/unittest/meta/TestDummySaiInterface.cpp @@ -1,5 +1,7 @@ #include "DummySaiInterface.h" +#include "swss/logger.h" + #include #include @@ -51,3 +53,234 @@ TEST(DummySaiInterface, create) EXPECT_NE(oid, SAI_NULL_OBJECT_ID); } + +TEST(DummySaiInterface, updateNotificationPointers) +{ + DummySaiInterface sai; + + sai.apiInitialize(0,0); + + for (uint32_t idx = 0 ; idx < sai_metadata_switch_notify_attr_count; idx++) + { + sai_attribute_t attr; + + attr.id = sai_metadata_switch_notify_attr[idx]->attrid; + attr.value.ptr = NULL; + + auto status = sai.set(SAI_OBJECT_TYPE_SWITCH, 0x0, &attr); + + EXPECT_EQ(status, SAI_STATUS_SUCCESS); + } +} + +TEST(DummySaiInterface, start_stop) +{ + DummySaiInterface sai; + + EXPECT_EQ(sai.start(), SAI_STATUS_FAILURE); // api not initialized + + EXPECT_EQ(sai.apiInitialize(0,0), SAI_STATUS_SUCCESS); + + EXPECT_EQ(sai.stop(), SAI_STATUS_SUCCESS); // not running + + EXPECT_EQ(sai.start(), SAI_STATUS_SUCCESS); // api initialized + + EXPECT_EQ(sai.start(), SAI_STATUS_SUCCESS); // 2nd time is ok to start, already running + + sleep(1); + + EXPECT_EQ(sai.stop(), SAI_STATUS_SUCCESS); +} + +static int ntfCounter = 0; + +static void onSwitchStateChange( + _In_ sai_object_id_t switch_id, + _In_ sai_switch_oper_status_t switch_oper_status) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received onSwitchStateChange"); + + ntfCounter++; +} + +static void onFdbEvent( + _In_ uint32_t count, + _In_ const sai_fdb_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received onFdbEvent"); + + ntfCounter++; +} + +static void onPortStateChange( + _In_ uint32_t count, + _In_ const sai_port_oper_status_notification_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received onPortStateChange"); + + ntfCounter++; +} + +static void onSwitchShutdownRequest( + _In_ sai_object_id_t switch_id) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onSwitchShutdownRequest"); + + ntfCounter++; +} + +static void onNatEvent( + _In_ uint32_t count, + _In_ const sai_nat_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onNatEvent"); + + ntfCounter++; +} + +static void onPortHostTxReady( + _In_ sai_object_id_t switch_id, + _In_ sai_object_id_t port_id, + _In_ sai_port_host_tx_ready_status_t host_tx_ready_status) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onPortHostTxReady"); + + ntfCounter++; +} + +static void onQueuePfcDeadlock( + _In_ uint32_t count, + _In_ const sai_queue_deadlock_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onQueuePfcDeadlock"); + + ntfCounter++; +} + +static void onSwitchAsicSdkHealthEvent( + _In_ sai_object_id_t switch_id, + _In_ sai_switch_asic_sdk_health_severity_t severity, + _In_ sai_timespec_t timestamp, + _In_ sai_switch_asic_sdk_health_category_t category, + _In_ sai_switch_health_data_t data, + _In_ const sai_u8_list_t description) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onSwitchAsicSdkHealthEvent"); + + ntfCounter++; +} + +static void onBfdSessionStateChange( + _In_ uint32_t count, + _In_ const sai_bfd_session_state_notification_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onBfdSessionStateChange"); + + ntfCounter++; +} + +void onTwampSessionEvent( + _In_ uint32_t count, + _In_ const sai_twamp_session_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onTwampSessionEvent"); + + ntfCounter++; +} + +TEST(DummySaiInterface, sendNotification) +{ + DummySaiInterface sai; + + ntfCounter = 0; + + // api not initialized + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY), SAI_STATUS_FAILURE); + + EXPECT_EQ(sai.apiInitialize(0,0), SAI_STATUS_SUCCESS); + + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY), SAI_STATUS_SUCCESS); + + sai_attribute_t attr; + + sai_object_id_t switch_id = 0x1; + + attr.id = SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY; + attr.value.ptr = (void*)&onSwitchStateChange; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY; + attr.value.ptr = (void*)&onFdbEvent; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY; + attr.value.ptr = (void*)&onPortStateChange; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY; + attr.value.ptr = (void*)&onSwitchShutdownRequest; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + + attr.id = SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY; + attr.value.ptr = (void*)&onSwitchAsicSdkHealthEvent; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY; + attr.value.ptr = (void*)&onNatEvent; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY; + attr.value.ptr = (void*)&onPortHostTxReady; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY; + attr.value.ptr = (void*)&onQueuePfcDeadlock; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY; + attr.value.ptr = (void*)&onBfdSessionStateChange; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY; + attr.value.ptr = (void*)&onTwampSessionEvent; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + EXPECT_EQ(sai.start(), SAI_STATUS_SUCCESS); + + sleep(1); + + EXPECT_EQ(sai.stop(), SAI_STATUS_SUCCESS); + + EXPECT_EQ(ntfCounter, 4 + 6); +} diff --git a/unittest/proxylib/Makefile.am b/unittest/proxylib/Makefile.am index a7c5d8ac6..80024583d 100644 --- a/unittest/proxylib/Makefile.am +++ b/unittest/proxylib/Makefile.am @@ -5,7 +5,6 @@ bin_PROGRAMS = tests LDADD_GTEST = -L/usr/src/gtest -lgtest -lgtest_main tests_SOURCES = \ - ../../meta/DummySaiInterface.cpp \ main.cpp \ TestProxy.cpp \ TestSai.cpp diff --git a/unittest/proxylib/TestProxy.cpp b/unittest/proxylib/TestProxy.cpp index 00060593b..097b07a0c 100644 --- a/unittest/proxylib/TestProxy.cpp +++ b/unittest/proxylib/TestProxy.cpp @@ -23,3 +23,251 @@ TEST(Proxy, ctr) auto proxy = std::make_shared(dummy); } + +static void fun(std::shared_ptr proxy) +{ + SWSS_LOG_ENTER(); + + proxy->run(); +} + +static const char* profile_get_value( + _In_ sai_switch_profile_id_t profile_id, + _In_ const char* variable) +{ + SWSS_LOG_ENTER(); + + if (variable == NULL) + return NULL; + + return nullptr; +} + +static int profile_get_next_value( + _In_ sai_switch_profile_id_t profile_id, + _Out_ const char** variable, + _Out_ const char** value) +{ + SWSS_LOG_ENTER(); + + return 0; +} + +static sai_service_method_table_t test_services = { + profile_get_value, + profile_get_next_value +}; + +static int ntfCounter = 0; + +static void onSwitchStateChange( + _In_ sai_object_id_t switch_id, + _In_ sai_switch_oper_status_t switch_oper_status) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received onSwitchStateChange"); + + ntfCounter++; +} + +static void onFdbEvent( + _In_ uint32_t count, + _In_ const sai_fdb_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received onFdbEvent"); + + ntfCounter++; +} + +static void onPortStateChange( + _In_ uint32_t count, + _In_ const sai_port_oper_status_notification_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received onPortStateChange"); + + ntfCounter++; +} + +static void onSwitchShutdownRequest( + _In_ sai_object_id_t switch_id) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onSwitchShutdownRequest"); + + ntfCounter++; +} + +static void onNatEvent( + _In_ uint32_t count, + _In_ const sai_nat_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onNatEvent"); + + ntfCounter++; +} + +static void onPortHostTxReady( + _In_ sai_object_id_t switch_id, + _In_ sai_object_id_t port_id, + _In_ sai_port_host_tx_ready_status_t host_tx_ready_status) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onPortHostTxReady"); + + ntfCounter++; +} + +static void onQueuePfcDeadlock( + _In_ uint32_t count, + _In_ const sai_queue_deadlock_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onQueuePfcDeadlock"); + + ntfCounter++; +} + +static void onSwitchAsicSdkHealthEvent( + _In_ sai_object_id_t switch_id, + _In_ sai_switch_asic_sdk_health_severity_t severity, + _In_ sai_timespec_t timestamp, + _In_ sai_switch_asic_sdk_health_category_t category, + _In_ sai_switch_health_data_t data, + _In_ const sai_u8_list_t description) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onSwitchAsicSdkHealthEvent"); + + ntfCounter++; +} + +static void onBfdSessionStateChange( + _In_ uint32_t count, + _In_ const sai_bfd_session_state_notification_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onBfdSessionStateChange"); + + ntfCounter++; +} + +static void onTwampSessionEvent( + _In_ uint32_t count, + _In_ const sai_twamp_session_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onTwampSessionEvent"); + + ntfCounter++; +} + +TEST(Proxy, notifications) +{ + Sai sai; + + EXPECT_EQ(sai.apiInitialize(0, &test_services), SAI_STATUS_SUCCESS); + + std::shared_ptr dummy = std::make_shared(); + + auto proxy = std::make_shared(dummy); + + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + + auto thread = std::make_shared(fun,proxy); + + sai_object_id_t switch_id; + + sai_attribute_t attr; + + attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; + attr.value.booldata = true; + + // create oid + auto status = sai.create( + SAI_OBJECT_TYPE_SWITCH, + &switch_id, + SAI_NULL_OBJECT_ID, // creating switch + 1, + &attr); + + EXPECT_EQ(status, SAI_STATUS_SUCCESS); + EXPECT_NE(switch_id, SAI_NULL_OBJECT_ID); + + // set notification pointer + + attr.id = SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY; + attr.value.ptr = (void*)&onSwitchStateChange; + EXPECT_EQ(sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr), SAI_STATUS_SUCCESS); + + attr.id = SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY; + attr.value.ptr = (void*)&onFdbEvent; + EXPECT_EQ(sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr), SAI_STATUS_SUCCESS); + + attr.id = SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY; + attr.value.ptr = (void*)&onPortStateChange; + EXPECT_EQ(sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr), SAI_STATUS_SUCCESS); + + attr.id = SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY; + attr.value.ptr = (void*)&onSwitchShutdownRequest; + EXPECT_EQ(sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr), SAI_STATUS_SUCCESS); + + attr.id = SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY; + attr.value.ptr = (void*)&onSwitchAsicSdkHealthEvent; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY; + attr.value.ptr = (void*)&onNatEvent; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY; + attr.value.ptr = (void*)&onPortHostTxReady; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY; + attr.value.ptr = (void*)&onQueuePfcDeadlock; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY; + attr.value.ptr = (void*)&onBfdSessionStateChange; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY; + attr.value.ptr = (void*)&onTwampSessionEvent; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + // dummy start sending notifications + EXPECT_EQ(dummy->start(), SAI_STATUS_SUCCESS); + + sleep(1); // give some time for proxy to receive notification + + // dummy stop sending notifications + EXPECT_EQ(dummy->stop(), SAI_STATUS_SUCCESS); + + EXPECT_EQ(proxy->getNotificationsSentCount(), 4+6); + + proxy->stop(); + + thread->join(); +} diff --git a/unittest/proxylib/TestSai.cpp b/unittest/proxylib/TestSai.cpp index 933cf2402..80f89b083 100644 --- a/unittest/proxylib/TestSai.cpp +++ b/unittest/proxylib/TestSai.cpp @@ -600,3 +600,220 @@ TEST(Sai, clearStats) thread->join(); } +static int ntfCounter = 0; + +static void onSwitchStateChange( + _In_ sai_object_id_t switch_id, + _In_ sai_switch_oper_status_t switch_oper_status) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received onSwitchStateChange"); + + ntfCounter++; +} + +static void onFdbEvent( + _In_ uint32_t count, + _In_ const sai_fdb_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received onFdbEvent"); + + ntfCounter++; +} + +static void onPortStateChange( + _In_ uint32_t count, + _In_ const sai_port_oper_status_notification_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received onPortStateChange"); + + ntfCounter++; +} + +static void onSwitchShutdownRequest( + _In_ sai_object_id_t switch_id) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onSwitchShutdownRequest"); + + ntfCounter++; +} + +static void onNatEvent( + _In_ uint32_t count, + _In_ const sai_nat_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onNatEvent"); + + ntfCounter++; +} + +static void onPortHostTxReady( + _In_ sai_object_id_t switch_id, + _In_ sai_object_id_t port_id, + _In_ sai_port_host_tx_ready_status_t host_tx_ready_status) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onPortHostTxReady"); + + ntfCounter++; +} + +static void onQueuePfcDeadlock( + _In_ uint32_t count, + _In_ const sai_queue_deadlock_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onQueuePfcDeadlock"); + + ntfCounter++; +} + +static void onSwitchAsicSdkHealthEvent( + _In_ sai_object_id_t switch_id, + _In_ sai_switch_asic_sdk_health_severity_t severity, + _In_ sai_timespec_t timestamp, + _In_ sai_switch_asic_sdk_health_category_t category, + _In_ sai_switch_health_data_t data, + _In_ const sai_u8_list_t description) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onSwitchAsicSdkHealthEvent"); + + ntfCounter++; +} + +static void onBfdSessionStateChange( + _In_ uint32_t count, + _In_ const sai_bfd_session_state_notification_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onBfdSessionStateChange"); + + ntfCounter++; +} + +static void onTwampSessionEvent( + _In_ uint32_t count, + _In_ const sai_twamp_session_event_notification_data_t *data) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_NOTICE("received: onTwampSessionEvent"); + + ntfCounter++; +} + +TEST(Sai, handleNotification) +{ + Sai sai; + + EXPECT_EQ(sai.apiInitialize(0, &test_services), SAI_STATUS_SUCCESS); + + std::shared_ptr dummy = std::make_shared(); + + auto proxy = std::make_shared(dummy); + + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS); + EXPECT_EQ(dummy->enqueueNotificationToSend(SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY), SAI_STATUS_SUCCESS); + + auto thread = std::make_shared(fun, proxy); + + sai_object_id_t switch_id; + + sai_attribute_t attr; + + attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; + attr.value.booldata = true; + + // create oid + auto status = sai.create( + SAI_OBJECT_TYPE_SWITCH, + &switch_id, + SAI_NULL_OBJECT_ID, // creating switch + 1, + &attr); + + EXPECT_EQ(status, SAI_STATUS_SUCCESS); + EXPECT_NE(switch_id, SAI_NULL_OBJECT_ID); + + // set notification pointer + + attr.id = SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY; + attr.value.ptr = (void*)&onSwitchStateChange; + EXPECT_EQ(sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr), SAI_STATUS_SUCCESS); + + attr.id = SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY; + attr.value.ptr = (void*)&onFdbEvent; + EXPECT_EQ(sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr), SAI_STATUS_SUCCESS); + + attr.id = SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY; + attr.value.ptr = (void*)&onPortStateChange; + EXPECT_EQ(sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr), SAI_STATUS_SUCCESS); + + attr.id = SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY; + attr.value.ptr = (void*)&onSwitchShutdownRequest; + EXPECT_EQ(sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr), SAI_STATUS_SUCCESS); + + attr.id = SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY; + attr.value.ptr = (void*)&onSwitchAsicSdkHealthEvent; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY; + attr.value.ptr = (void*)&onNatEvent; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY; + attr.value.ptr = (void*)&onPortHostTxReady; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY; + attr.value.ptr = (void*)&onQueuePfcDeadlock; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY; + attr.value.ptr = (void*)&onBfdSessionStateChange; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + attr.id = SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY; + attr.value.ptr = (void*)&onTwampSessionEvent; + sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); + + // dummy start sending notifications + EXPECT_EQ(dummy->start(), SAI_STATUS_SUCCESS); + + sleep(1); // give some time for proxy to receive notification + + // dummy stop sending notifications + EXPECT_EQ(dummy->stop(), SAI_STATUS_SUCCESS); + + EXPECT_EQ(proxy->getNotificationsSentCount(), 10); + + // important check, whether Sai class processed notifications correctly + EXPECT_EQ(ntfCounter, 10); + + proxy->stop(); + + thread->join(); +} + diff --git a/unittest/syncd/Makefile.am b/unittest/syncd/Makefile.am index 4c75d3672..b6c0cba94 100644 --- a/unittest/syncd/Makefile.am +++ b/unittest/syncd/Makefile.am @@ -5,7 +5,6 @@ bin_PROGRAMS = tests LDADD_GTEST = -L/usr/src/gtest -lgtest -lgtest_main tests_SOURCES = main.cpp \ - ../../meta/DummySaiInterface.cpp \ MockableSaiInterface.cpp \ MockHelper.cpp \ TestCommandLineOptions.cpp \ From fd8f890f67b08eb3b1429e414bd9c7af5439dc4b Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Thu, 13 Jun 2024 21:09:23 +0200 Subject: [PATCH 2/3] [saisubmodule] Update SAI submodule to latest master (#1395) Will include SAI metadata methods to update notification pointers which will do that automatically for all notifications reducing number of work we need to update that each time --- SAI | 2 +- lib/Switch.cpp | 80 +----------------- meta/DummySaiInterface.cpp | 59 +------------ proxylib/Proxy.cpp | 155 +--------------------------------- proxylib/Proxy.h | 4 - proxylib/Sai.cpp | 70 +-------------- saiplayer/SaiPlayer.cpp | 48 +---------- syncd/NotificationHandler.cpp | 80 +----------------- unittest/lib/TestSwitch.cpp | 2 +- unittest/vslib/TestSwitch.cpp | 2 +- vslib/Switch.cpp | 64 +------------- 11 files changed, 10 insertions(+), 556 deletions(-) diff --git a/SAI b/SAI index 0788e82e8..be523777d 160000 --- a/SAI +++ b/SAI @@ -1 +1 @@ -Subproject commit 0788e82e8ca56b82eb8f8c0a3dee40edbc2ba9ba +Subproject commit be523777da96504758d3bb6b3696ae7d1129419d diff --git a/lib/Switch.cpp b/lib/Switch.cpp index 6777e747c..41358022f 100644 --- a/lib/Switch.cpp +++ b/lib/Switch.cpp @@ -59,85 +59,7 @@ void Switch::updateNotifications( { SWSS_LOG_ENTER(); - /* - * This function should only be called on CREATE/SET - * api when object is SWITCH. - */ - - for (uint32_t index = 0; index < attrCount; ++index) - { - auto &attr = attrList[index]; - - auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); - - if (meta == NULL) - SWSS_LOG_THROW("failed to find metadata for switch attr %d", attr.id); - - if (meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_POINTER) - continue; - - switch (attr.id) - { - case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: - m_switchNotifications.on_switch_state_change = - (sai_switch_state_change_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: - m_switchNotifications.on_switch_asic_sdk_health_event = - (sai_switch_asic_sdk_health_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: - m_switchNotifications.on_switch_shutdown_request = - (sai_switch_shutdown_request_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: - m_switchNotifications.on_fdb_event = - (sai_fdb_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY: - m_switchNotifications.on_nat_event = - (sai_nat_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: - m_switchNotifications.on_port_state_change = - (sai_port_state_change_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PACKET_EVENT_NOTIFY: - m_switchNotifications.on_packet_event = - (sai_packet_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: - m_switchNotifications.on_queue_pfc_deadlock = - (sai_queue_pfc_deadlock_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: - m_switchNotifications.on_bfd_session_state_change = - (sai_bfd_session_state_change_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: - m_switchNotifications.on_port_host_tx_ready = - (sai_port_host_tx_ready_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY: - m_switchNotifications.on_twamp_session_event = - (sai_twamp_session_event_notification_fn)attr.value.ptr; - break; - - default: - SWSS_LOG_ERROR("pointer for %s is not handled, FIXME!", meta->attridname); - break; - } - } + sai_metadata_update_switch_notification_pointers(&m_switchNotifications, attrCount, attrList); } const sai_switch_notifications_t& Switch::getSwitchNotifications() const diff --git a/meta/DummySaiInterface.cpp b/meta/DummySaiInterface.cpp index eef753e76..63a7d62d0 100644 --- a/meta/DummySaiInterface.cpp +++ b/meta/DummySaiInterface.cpp @@ -530,70 +530,13 @@ sai_status_t DummySaiInterface::queryApiVersion( return m_status; } -// TODO replace this method with with new SAI submodule for: -// sai_metadata_update_switch_notification_pointers - void DummySaiInterface::updateNotificationPointers( _In_ uint32_t count, _In_ const sai_attribute_t* attrs) { SWSS_LOG_ENTER(); - if (attrs == NULL) - { - return; - } - - for (uint32_t idx = 0; idx < count; idx++) - { - auto &attr = attrs[idx]; - - auto* meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); - - if (meta && meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_POINTER) - { - // skip non pointers - continue; - } - - switch (attr.id) - { - case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: - m_sn.on_switch_state_change = (sai_switch_state_change_notification_fn)attrs[idx].value.ptr; - break; - case SAI_SWITCH_ATTR_SWITCH_SHUTDOWN_REQUEST_NOTIFY: - m_sn.on_switch_shutdown_request = (sai_switch_shutdown_request_notification_fn)attrs[idx].value.ptr; - break; - case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: - m_sn.on_fdb_event = (sai_fdb_event_notification_fn)attrs[idx].value.ptr; - break; - case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: - m_sn.on_port_state_change = (sai_port_state_change_notification_fn)attrs[idx].value.ptr; - break; - case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: - m_sn.on_queue_pfc_deadlock = (sai_queue_pfc_deadlock_notification_fn)attrs[idx].value.ptr; - break; - case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: - m_sn.on_bfd_session_state_change = (sai_bfd_session_state_change_notification_fn)attrs[idx].value.ptr; - break; - case SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY: - m_sn.on_nat_event = (sai_nat_event_notification_fn)attrs[idx].value.ptr; - break; - case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: - m_sn.on_switch_asic_sdk_health_event = (sai_switch_asic_sdk_health_event_notification_fn)attrs[idx].value.ptr; - break; - case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: - m_sn.on_port_host_tx_ready = (sai_port_host_tx_ready_notification_fn)attrs[idx].value.ptr; - break; - case SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY: - m_sn.on_twamp_session_event = (sai_twamp_session_event_notification_fn)attrs[idx].value.ptr; - break; - - default: - SWSS_LOG_ERROR("pointer for attr id %d (%s) is not handled, FIXME!", attr.id, (meta ? meta->attridname : "UNKNOWN")); - continue; - } - } + sai_metadata_update_switch_notification_pointers(&m_sn, count, attrs); } sai_status_t DummySaiInterface::start() diff --git a/proxylib/Proxy.cpp b/proxylib/Proxy.cpp index e4e9275a6..a844a4b2d 100644 --- a/proxylib/Proxy.cpp +++ b/proxylib/Proxy.cpp @@ -18,7 +18,6 @@ using namespace saiproxy; using namespace std::placeholders; -// TODO we need pointers translation for receiving notifications // TODO handle diagnostic shell Proxy::Proxy( @@ -1075,165 +1074,13 @@ void Proxy::processClearStats( m_selectableChannel->set(strStatus, entry, "clear_stats_response"); } -// TODO replace this method with with new SAI submodule for: -// sai_metadata_update_switch_notification_pointers - void Proxy::updateAttributteNotificationPointers( _In_ uint32_t count, _Inout_ sai_attribute_t* attr_list) { SWSS_LOG_ENTER(); - for (uint32_t index = 0; index < count; ++index) - { - sai_attribute_t &attr = attr_list[index]; - - auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); - - if (meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_POINTER) - { - continue; - } - - /* - * Does not matter if pointer is valid or not, we just want the - * previous value. - */ - - sai_pointer_t prev = attr.value.ptr; - - if (prev == NULL) - { - /* - * If pointer is NULL, then fine, let it be. - */ - - continue; - } - - switch (attr.id) - { - case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: - attr.value.ptr = (void*)m_sn.on_switch_state_change; - break; - - case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: - attr.value.ptr = (void*)m_sn.on_switch_shutdown_request; - break; - - case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: - attr.value.ptr = (void*)m_sn.on_switch_asic_sdk_health_event; - break; - - case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: - attr.value.ptr = (void*)m_sn.on_fdb_event; - break; - - case SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY: - attr.value.ptr = (void*)m_sn.on_nat_event; - break; - - case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: - attr.value.ptr = (void*)m_sn.on_port_state_change; - break; - - case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: - attr.value.ptr = (void*)m_sn.on_port_host_tx_ready; - break; - - case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: - attr.value.ptr = (void*)m_sn.on_queue_pfc_deadlock; - break; - - case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: - attr.value.ptr = (void*)m_sn.on_bfd_session_state_change; - break; - - case SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY: - attr.value.ptr = (void*)m_sn.on_twamp_session_event; - break; - - default: - - SWSS_LOG_ERROR("pointer for %s is not handled, FIXME!", meta->attridname); - continue; - } - - // Here we translated pointer, just log it. - - SWSS_LOG_NOTICE("%s: 0x%" PRIx64 " (orch) => 0x%" PRIx64 " (syncd)", meta->attridname, (uint64_t)prev, (uint64_t)attr.value.ptr); - } -} - -// TODO replace this method with with new SAI submodule for: -// sai_metadata_update_switch_notification_pointers - -void Proxy::updateNotificationPointers( - _In_ uint32_t count, - _In_ const sai_attribute_t* attrs) -{ - SWSS_LOG_ENTER(); - - // NOTE this is done under mutex - - for (uint32_t idx = 0; idx < count; idx++) - { - auto &attr = attrs[idx]; - - auto* meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); - - switch (attr.id) - { - case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: - m_sn.on_switch_state_change = - (sai_switch_state_change_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: - m_sn.on_switch_asic_sdk_health_event = - (sai_switch_asic_sdk_health_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: - m_sn.on_switch_shutdown_request = - (sai_switch_shutdown_request_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: - m_sn.on_fdb_event = - (sai_fdb_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: - m_sn.on_port_state_change = - (sai_port_state_change_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: - m_sn.on_port_host_tx_ready = - (sai_port_host_tx_ready_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PACKET_EVENT_NOTIFY: - m_sn.on_packet_event = - (sai_packet_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: - m_sn.on_queue_pfc_deadlock = - (sai_queue_pfc_deadlock_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: - m_sn.on_bfd_session_state_change = - (sai_bfd_session_state_change_notification_fn)attr.value.ptr; - break; - - default: - SWSS_LOG_ERROR("pointer for attr id %d (%s) is not handled, FIXME!", attr.id, (meta ? meta->attridname : "UNKNOWN")); - continue; - } - } + sai_metadata_update_attribute_notification_pointers(&m_sn, count, attr_list); } // TODO move to notification handler class diff --git a/proxylib/Proxy.h b/proxylib/Proxy.h index c92809e54..50aa302a9 100644 --- a/proxylib/Proxy.h +++ b/proxylib/Proxy.h @@ -160,10 +160,6 @@ namespace saiproxy void loadProfileMap(); - void updateNotificationPointers( - _In_ uint32_t count, - _In_ const sai_attribute_t* attrs); - void updateAttributteNotificationPointers( _In_ uint32_t count, _Inout_ sai_attribute_t* attr_list); diff --git a/proxylib/Sai.cpp b/proxylib/Sai.cpp index c412b2eec..4654e5acd 100644 --- a/proxylib/Sai.cpp +++ b/proxylib/Sai.cpp @@ -1128,75 +1128,7 @@ void Sai::updateNotifications( * api when object is SWITCH. */ - for (uint32_t index = 0; index < attrCount; ++index) - { - auto &attr = attrList[index]; - - auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); - - if (meta == NULL) - SWSS_LOG_THROW("failed to find metadata for switch attr %d", attr.id); - - if (meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_POINTER) - continue; - - switch (attr.id) - { - case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: - m_sn.on_switch_state_change = - (sai_switch_state_change_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: - m_sn.on_switch_asic_sdk_health_event = - (sai_switch_asic_sdk_health_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: - m_sn.on_switch_shutdown_request = - (sai_switch_shutdown_request_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: - m_sn.on_fdb_event = - (sai_fdb_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY: - m_sn.on_nat_event = - (sai_nat_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: - m_sn.on_port_state_change = - (sai_port_state_change_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: - m_sn.on_queue_pfc_deadlock = - (sai_queue_pfc_deadlock_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: - m_sn.on_bfd_session_state_change = - (sai_bfd_session_state_change_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: - m_sn.on_port_host_tx_ready = - (sai_port_host_tx_ready_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY: - m_sn.on_twamp_session_event = - (sai_twamp_session_event_notification_fn)attr.value.ptr; - break; - - default: - SWSS_LOG_ERROR("pointer for %s is not handled, FIXME!", meta->attridname); - break; - } - } + sai_metadata_update_switch_notification_pointers(&m_sn, attrCount, attrList); } void Sai::handleNotification( diff --git a/saiplayer/SaiPlayer.cpp b/saiplayer/SaiPlayer.cpp index 4437f2906..51b5cf13f 100644 --- a/saiplayer/SaiPlayer.cpp +++ b/saiplayer/SaiPlayer.cpp @@ -944,55 +944,9 @@ void SaiPlayer::update_notifications_pointers( * Sairedis is updating notifications pointers based on attribute, so when * we will do replay it will have invalid pointers from orchagent, so we * need to override them after create, and after set. - * - * NOTE: This needs to be updated every time new pointer will be added. */ - for (uint32_t index = 0; index < attr_count; ++index) - { - sai_attribute_t &attr = attr_list[index]; - - auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); - - if (meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_POINTER) - { - continue; - } - - if (attr.value.ptr == nullptr) // allow nulls - continue; - - switch (attr.id) - { - case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_switch_state_change; - break; - - case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_switch_shutdown_request; - break; - - case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_fdb_event; - break; - - case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_port_state_change; - break; - - case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_queue_pfc_deadlock; - break; - - case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_bfd_session_state_change; - break; - - default: - SWSS_LOG_ERROR("pointer for %s is not handled, FIXME!", meta->attridname); - break; - } - } + sai_metadata_update_attribute_notification_pointers(&m_switchNotifications, attr_count, attr_list); } sai_status_t SaiPlayer::handle_generic( diff --git a/syncd/NotificationHandler.cpp b/syncd/NotificationHandler.cpp index 06bcb7bd8..5a4fa5300 100644 --- a/syncd/NotificationHandler.cpp +++ b/syncd/NotificationHandler.cpp @@ -59,85 +59,7 @@ void NotificationHandler::updateNotificationsPointers( * Also notice that we are using the same pointers for ALL switches. */ - for (uint32_t index = 0; index < attr_count; ++index) - { - sai_attribute_t &attr = attr_list[index]; - - auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); - - if (meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_POINTER) - { - continue; - } - - /* - * Does not matter if pointer is valid or not, we just want the - * previous value. - */ - - sai_pointer_t prev = attr.value.ptr; - - if (prev == NULL) - { - /* - * If pointer is NULL, then fine, let it be. - */ - - continue; - } - - switch (attr.id) - { - case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_switch_state_change; - break; - - case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_switch_shutdown_request; - break; - - case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_switch_asic_sdk_health_event; - break; - - case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_fdb_event; - break; - - case SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_nat_event; - break; - - case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_port_state_change; - break; - - case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_port_host_tx_ready; - break; - - case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_queue_pfc_deadlock; - break; - - case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_bfd_session_state_change; - break; - - case SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY: - attr.value.ptr = (void*)m_switchNotifications.on_twamp_session_event; - break; - - default: - - SWSS_LOG_ERROR("pointer for %s is not handled, FIXME!", meta->attridname); - continue; - } - - // Here we translated pointer, just log it. - - SWSS_LOG_INFO("%s: 0x%" PRIx64 " (orch) => 0x%" PRIx64 " (syncd)", meta->attridname, (uint64_t)prev, (uint64_t)attr.value.ptr); - } + sai_metadata_update_attribute_notification_pointers(&m_switchNotifications, attr_count, attr_list); } // TODO use same Notification class from sairedis lib diff --git a/unittest/lib/TestSwitch.cpp b/unittest/lib/TestSwitch.cpp index 58a635b0a..d6ec9d9b3 100644 --- a/unittest/lib/TestSwitch.cpp +++ b/unittest/lib/TestSwitch.cpp @@ -26,7 +26,7 @@ TEST(Switch, updateNotifications) attrs[0].id = 10000; - EXPECT_THROW(s->updateNotifications(1, attrs), std::runtime_error); + EXPECT_NO_THROW(s->updateNotifications(1, attrs)); attrs[0].value.ptr = (void*)1; attrs[1].value.ptr = (void*)1; diff --git a/unittest/vslib/TestSwitch.cpp b/unittest/vslib/TestSwitch.cpp index 74e7acea8..17208ee6a 100644 --- a/unittest/vslib/TestSwitch.cpp +++ b/unittest/vslib/TestSwitch.cpp @@ -40,7 +40,7 @@ TEST(Switch, updateNotifications) attr.id = -1; - EXPECT_THROW(s.updateNotifications(1, &attr), std::runtime_error); + EXPECT_NO_THROW(s.updateNotifications(1, &attr)); attr.id = SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY; s.updateNotifications(1, &attr); diff --git a/vslib/Switch.cpp b/vslib/Switch.cpp index dc5165902..47151c1b6 100644 --- a/vslib/Switch.cpp +++ b/vslib/Switch.cpp @@ -61,69 +61,7 @@ void Switch::updateNotifications( SWSS_LOG_THROW("attrCount is %u, but attrList is nullptr", attrCount); } - for (uint32_t index = 0; index < attrCount; ++index) - { - auto &attr = attrList[index]; - - auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_SWITCH, attr.id); - - if (meta == NULL) - SWSS_LOG_THROW("failed to find metadata for switch attr %d", attr.id); - - if (meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_POINTER) - continue; - - switch (attr.id) - { - case SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY: - m_switchNotifications.on_switch_state_change = - (sai_switch_state_change_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY: - m_switchNotifications.on_switch_asic_sdk_health_event = - (sai_switch_asic_sdk_health_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY: - m_switchNotifications.on_switch_shutdown_request = - (sai_switch_shutdown_request_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY: - m_switchNotifications.on_fdb_event = - (sai_fdb_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY: - m_switchNotifications.on_port_state_change = - (sai_port_state_change_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY: - m_switchNotifications.on_port_host_tx_ready = - (sai_port_host_tx_ready_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_PACKET_EVENT_NOTIFY: - m_switchNotifications.on_packet_event = - (sai_packet_event_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY: - m_switchNotifications.on_queue_pfc_deadlock = - (sai_queue_pfc_deadlock_notification_fn)attr.value.ptr; - break; - - case SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY: - m_switchNotifications.on_bfd_session_state_change = - (sai_bfd_session_state_change_notification_fn)attr.value.ptr; - break; - - default: - SWSS_LOG_THROW("pointer for %s is not handled, FIXME!", meta->attridname); - } - } + sai_metadata_update_switch_notification_pointers(&m_switchNotifications, attrCount, attrList); } const sai_switch_notifications_t& Switch::getSwitchNotifications() const From a988dd1b7b9044fd7ca859ecdfa1eb858cc3ea08 Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Thu, 13 Jun 2024 21:23:48 +0200 Subject: [PATCH 3/3] Sairedis support SAI api/object type extenstion range (#1390) Extensions objects can be used on ranges from 0x20000000 (this commit will requires SAI submodule to update as well) --- lib/VirtualObjectIdManager.cpp | 63 ++- meta/Meta.cpp | 9 +- stub.pl | 52 +-- syncd/ComparisonLogic.cpp | 6 +- syncd/SaiDiscovery.cpp | 18 +- tests/NVDAMBF2H536C/dashapis.rec | 494 ++++++++++---------- unittest/lib/TestVirtualObjectIdManager.cpp | 15 + unittest/meta/TestSaiSerialize.cpp | 4 +- unittest/vslib/TestRealObjectIdManager.cpp | 20 + vslib/RealObjectIdManager.cpp | 65 ++- vslib/SaiUnittests.cpp | 2 +- vslib/SwitchState.cpp | 4 +- 12 files changed, 422 insertions(+), 330 deletions(-) diff --git a/lib/VirtualObjectIdManager.cpp b/lib/VirtualObjectIdManager.cpp index ca88a0192..63cc09e89 100644 --- a/lib/VirtualObjectIdManager.cpp +++ b/lib/VirtualObjectIdManager.cpp @@ -25,13 +25,18 @@ static_assert(sizeof(sai_object_id_t) == sizeof(uint64_t), "SAI object ID size s #define SAI_REDIS_OBJECT_TYPE_MAX ( (1ULL << SAI_REDIS_OBJECT_TYPE_BITS_SIZE) - 1 ) #define SAI_REDIS_OBJECT_TYPE_MASK (SAI_REDIS_OBJECT_TYPE_MAX) -#define SAI_REDIS_OBJECT_INDEX_BITS_SIZE ( 40 ) +#define SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE ( 1 ) +#define SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ( (1ULL << SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE) - 1 ) +#define SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MASK (SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX) + +#define SAI_REDIS_OBJECT_INDEX_BITS_SIZE ( 39 ) #define SAI_REDIS_OBJECT_INDEX_MAX ( (1ULL << SAI_REDIS_OBJECT_INDEX_BITS_SIZE) - 1 ) #define SAI_REDIS_OBJECT_INDEX_MASK (SAI_REDIS_OBJECT_INDEX_MAX) #define SAI_REDIS_OBJECT_ID_BITS_SIZE ( \ SAI_REDIS_SWITCH_INDEX_BITS_SIZE + \ SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + \ + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + \ SAI_REDIS_OBJECT_TYPE_BITS_SIZE + \ SAI_REDIS_OBJECT_INDEX_BITS_SIZE ) @@ -41,7 +46,9 @@ static_assert(SAI_REDIS_OBJECT_ID_BITS_SIZE == SAI_OBJECT_ID_BITS_SIZE, "redis o * This condition must be met, since we need to be able to encode SAI object * type in object id on defined number of bits. */ -static_assert(SAI_OBJECT_TYPE_EXTENSIONS_MAX < SAI_REDIS_OBJECT_TYPE_MAX, "redis max object type value must be greater than supported SAI max object type value"); +static_assert(SAI_OBJECT_TYPE_MAX < 256, "object type must be possible to encode on 1 byte"); +static_assert((SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) < 256, + "extensions object type must be possible to encode on 1 byte"); /* * Current OBJECT ID format: @@ -49,30 +56,42 @@ static_assert(SAI_OBJECT_TYPE_EXTENSIONS_MAX < SAI_REDIS_OBJECT_TYPE_MAX, "redis * bits 63..56 - switch index * bits 55..48 - SAI object type * bits 47..40 - global context - * bits 40..0 - object index + * bits 39..39 - object type extensions flag + * bits 38..0 - object index * * So large number of bits is required, otherwise we would need to have map of * OID to some struct that will have all those values. But having all this * information in OID itself is more convenient. + * + * To be backward compatible with previous sairedis, we will still encode base + * object type on bit's 55..48, and extensions which will now start from range + * 0x20000000, will be encoded from 0x0, but extensions flag will be set to 1. + * + * For example SAI_OBJECT_TYPE_VIRTUAL_ROUTER oid will be encoded as 0x0003000000000001, + * SAI_OBJECT_TYPE_DASH_ACL_GROUP oid will be encoded as 0x0003008000000001. */ #define SAI_REDIS_GET_OBJECT_INDEX(oid) \ ( ((uint64_t)oid) & ( SAI_REDIS_OBJECT_INDEX_MASK ) ) +#define SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(oid) \ + ( (((uint64_t)oid) >> (SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ) ) + #define SAI_REDIS_GET_GLOBAL_CONTEXT(oid) \ - ( (((uint64_t)oid) >> (SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_GLOBAL_CONTEXT_MASK ) ) + ( (((uint64_t)oid) >> (SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_GLOBAL_CONTEXT_MASK ) ) #define SAI_REDIS_GET_OBJECT_TYPE(oid) \ - ( (((uint64_t)oid) >> ( SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_OBJECT_TYPE_MASK ) ) + ( (((uint64_t)oid) >> ( SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_OBJECT_TYPE_MASK ) ) #define SAI_REDIS_GET_SWITCH_INDEX(oid) \ - ( (((uint64_t)oid) >> ( SAI_REDIS_OBJECT_TYPE_BITS_SIZE + SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_SWITCH_INDEX_MASK ) ) + ( (((uint64_t)oid) >> ( SAI_REDIS_OBJECT_TYPE_BITS_SIZE + SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_REDIS_SWITCH_INDEX_MASK ) ) -#define SAI_REDIS_TEST_OID (0x0123456789abcdef) +#define SAI_REDIS_TEST_OID (0x012345e789abcdef) static_assert(SAI_REDIS_GET_SWITCH_INDEX(SAI_REDIS_TEST_OID) == 0x01, "test switch index"); static_assert(SAI_REDIS_GET_OBJECT_TYPE(SAI_REDIS_TEST_OID) == 0x23, "test object type"); static_assert(SAI_REDIS_GET_GLOBAL_CONTEXT(SAI_REDIS_TEST_OID) == 0x45, "test global context"); +static_assert(SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(SAI_REDIS_TEST_OID) == 0x1, "test object type extensions flag"); static_assert(SAI_REDIS_GET_OBJECT_INDEX(SAI_REDIS_TEST_OID) == 0x6789abcdef, "test object index"); using namespace sairedis; @@ -143,9 +162,11 @@ sai_object_type_t VirtualObjectIdManager::saiObjectTypeQuery( return SAI_OBJECT_TYPE_NULL; } - sai_object_type_t objectType = (sai_object_type_t)(SAI_REDIS_GET_OBJECT_TYPE(objectId)); + sai_object_type_t objectType = SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(objectId) + ? (sai_object_type_t)(SAI_REDIS_GET_OBJECT_TYPE(objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) + : (sai_object_type_t)(SAI_REDIS_GET_OBJECT_TYPE(objectId)); - if (objectType == SAI_OBJECT_TYPE_NULL || objectType >= SAI_OBJECT_TYPE_EXTENSIONS_MAX) + if (sai_metadata_is_object_type_valid(objectType) == false) { SWSS_LOG_ERROR("invalid object id %s", sai_serialize_object_id(objectId).c_str()); @@ -198,7 +219,7 @@ sai_object_id_t VirtualObjectIdManager::allocateNewObjectId( { SWSS_LOG_ENTER(); - if ((objectType <= SAI_OBJECT_TYPE_NULL) || (objectType >= SAI_OBJECT_TYPE_EXTENSIONS_MAX)) + if (sai_metadata_is_object_type_valid(objectType) == false) { SWSS_LOG_THROW("invalid object type: %d", objectType); } @@ -299,10 +320,22 @@ sai_object_id_t VirtualObjectIdManager::constructObjectId( { SWSS_LOG_ENTER(); + if (sai_metadata_is_object_type_valid(objectType) == false) + { + SWSS_LOG_THROW("FATAL: invalid object type (0x%x), logic error, this is a bug!", objectType); + } + + uint64_t extensionsFlag = (uint64_t)objectType >= SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START; + + objectType = extensionsFlag + ? (sai_object_type_t)(objectType - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) + : objectType; + return (sai_object_id_t)( - ((uint64_t)switchIndex << (SAI_REDIS_OBJECT_TYPE_BITS_SIZE + SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) | - ((uint64_t)objectType << (SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) | - ((uint64_t)globalContext << (SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) | + ((uint64_t)switchIndex << (SAI_REDIS_OBJECT_TYPE_BITS_SIZE + SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) | + ((uint64_t)objectType << (SAI_REDIS_GLOBAL_CONTEXT_BITS_SIZE + SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) | + ((uint64_t)globalContext << (SAI_REDIS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) | + ((uint64_t)extensionsFlag << (SAI_REDIS_OBJECT_INDEX_BITS_SIZE)) | objectIndex); } @@ -347,7 +380,9 @@ sai_object_type_t VirtualObjectIdManager::objectTypeQuery( return SAI_OBJECT_TYPE_NULL; } - sai_object_type_t objectType = (sai_object_type_t)(SAI_REDIS_GET_OBJECT_TYPE(objectId)); + sai_object_type_t objectType = SAI_REDIS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(objectId) + ? (sai_object_type_t)(SAI_REDIS_GET_OBJECT_TYPE(objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) + : (sai_object_type_t)(SAI_REDIS_GET_OBJECT_TYPE(objectId)); if (!sai_metadata_is_object_type_valid(objectType)) { diff --git a/meta/Meta.cpp b/meta/Meta.cpp index d6a9f4526..bd3f1b010 100644 --- a/meta/Meta.cpp +++ b/meta/Meta.cpp @@ -1711,16 +1711,15 @@ sai_status_t Meta::meta_sai_validate_oid( { SWSS_LOG_ENTER(); - if (object_type <= SAI_OBJECT_TYPE_NULL || - object_type >= SAI_OBJECT_TYPE_EXTENSIONS_MAX) + auto info = sai_metadata_get_object_type_info(object_type); + + if (!info) { SWSS_LOG_ERROR("invalid object type specified: %d, FIXME", object_type); return SAI_STATUS_INVALID_PARAMETER; } - const char* otname = sai_metadata_get_enum_value_name(&sai_metadata_enum_sai_object_type_t, object_type); - - auto info = sai_metadata_get_object_type_info(object_type); + const char* otname = info->objecttypename; if (info->isnonobjectid) { diff --git a/stub.pl b/stub.pl index 1caf83536..237c62927 100755 --- a/stub.pl +++ b/stub.pl @@ -105,7 +105,7 @@ sub GetData sub SanitizeData { $DATA =~ s/SAI_OBJECT_TYPE_\w*(START|END|NULL|MAX)//gms; - $DATA =~ s/SAI_API_\w*(START|END|UNSPECIFIED|MAX)//gms; + $DATA =~ s/SAI_API_\w*(START|END|UNSPECIFIED|MAX|EXTENSIONS_RANGE_BASE)//gms; } sub ExtractData @@ -197,7 +197,7 @@ sub GetFunctionName elsif ($fun =~ /(create|remove|set|get)_(\w+)(_attribute)?/ and defined $objectTypes{$2}) { $OT = $objectTypes{$2}; - $fun = $1; + $fun = "$1"; } else { @@ -270,7 +270,7 @@ () Write ""; } - Write "static const sai_${api}_api_t ${STUB}_${api} = {"; + Write "static sai_${api}_api_t ${STUB}_${api} = {"; while ($struct =~ /(sai_\w+_fn)\s+(\w+)/gms) { @@ -303,35 +303,13 @@ sub CreateHeader Write "" } -sub CreateApiStruct -{ - Write ""; - Write "/* ==== API STRUCTS === */"; - Write ""; - - Write "static sai_apis_t ${STUB}_apis = {"; - - for my $API (@APIS) - { - my $api = lc $API; - - Write " .${api}_api = const_cast(&${STUB}_${api}),"; - } - - Write "};"; - Write ""; -} - sub CreateApiQuery { Write ""; Write "/* ==== API QUERY === */"; Write ""; - - Write "static_assert((sizeof(sai_apis_t)/sizeof(void*)) == (SAI_API_EXTENSIONS_MAX - 1));"; - Write ""; Write "sai_status_t sai_api_query("; - Write " _In_ sai_api_t sai_api_id,"; + Write " _In_ sai_api_t api,"; Write " _Out_ void** api_method_table)"; Write "{"; Write " SWSS_LOG_ENTER();"; @@ -343,21 +321,30 @@ sub CreateApiQuery Write " return SAI_STATUS_INVALID_PARAMETER;"; Write " }"; Write ""; - Write " if (sai_api_id == SAI_API_UNSPECIFIED)"; + Write " if (api == SAI_API_UNSPECIFIED)"; Write " {"; Write " SWSS_LOG_ERROR(\"api ID is unspecified api\");"; Write ""; Write " return SAI_STATUS_INVALID_PARAMETER;"; Write " }"; Write ""; - Write " if (sai_metadata_get_enum_value_name(&sai_metadata_enum_sai_api_t, sai_api_id))"; + Write " switch((int)api)"; Write " {"; - Write " *api_method_table = ((void**)&${STUB}_apis)[sai_api_id - 1];"; - Write ""; - Write " return SAI_STATUS_SUCCESS;"; + + for my $API (@APIS) + { + my $api = lc $API; + + Write " case SAI_API_$API:"; + Write " *api_method_table = (void**)&${STUB}_${api};"; + Write " return SAI_STATUS_SUCCESS;"; + } + + Write " default:"; + Write " break;"; Write " }"; Write ""; - Write " SWSS_LOG_ERROR(\"Invalid API type %d\", sai_api_id);"; + Write " SWSS_LOG_ERROR(\"Invalid API type %d\", api);"; Write ""; Write " return SAI_STATUS_INVALID_PARAMETER;"; Write "}"; @@ -427,7 +414,6 @@ sub CreateGlobalApis ExtractData(); CreateHeader(); CreateApiStricts(); -CreateApiStruct(); CreateApiQuery(); CreateGlobalApis(); WriteFile($optionFileName,$SOURCE_CONTENT); diff --git a/syncd/ComparisonLogic.cpp b/syncd/ComparisonLogic.cpp index 674153e3d..f8691c074 100644 --- a/syncd/ComparisonLogic.cpp +++ b/syncd/ComparisonLogic.cpp @@ -3281,9 +3281,11 @@ void ComparisonLogic::logViewObjectCount( bool asic_changes = false; - for (int i = SAI_OBJECT_TYPE_NULL + 1; i < SAI_OBJECT_TYPE_EXTENSIONS_MAX; i++) + // skip null object type + + for (size_t i = 1; i < sai_metadata_enum_sai_object_type_t.valuescount; ++i) { - sai_object_type_t ot = (sai_object_type_t)i; + sai_object_type_t ot = (sai_object_type_t)sai_metadata_enum_sai_object_type_t.values[i]; size_t c = currentView.getObjectsByObjectType(ot).size(); size_t t = temporaryView.getObjectsByObjectType(ot).size(); diff --git a/syncd/SaiDiscovery.cpp b/syncd/SaiDiscovery.cpp index 7f88846d9..8615526bb 100644 --- a/syncd/SaiDiscovery.cpp +++ b/syncd/SaiDiscovery.cpp @@ -309,15 +309,15 @@ void SaiDiscovery::setApiLogLevel( // We start from 1 since 0 is SAI_API_UNSPECIFIED. - for (uint32_t api = 1; api < sai_metadata_enum_sai_api_t.valuescount; ++api) + for (uint32_t idx = 1; idx < sai_metadata_enum_sai_api_t.valuescount; ++idx) { - sai_status_t status = m_sai->logSet((sai_api_t)api, logLevel); + sai_status_t status = m_sai->logSet((sai_api_t)sai_metadata_enum_sai_api_t.values[idx], logLevel); if (status == SAI_STATUS_SUCCESS) { SWSS_LOG_INFO("setting SAI loglevel %s on %s", sai_serialize_log_level(logLevel).c_str(), - sai_serialize_api((sai_api_t)api).c_str()); + sai_serialize_api((sai_api_t)sai_metadata_enum_sai_api_t.values[idx]).c_str()); } else { @@ -333,19 +333,19 @@ void SaiDiscovery::setApiLogLevel( // We start from 1 since 0 is SAI_API_UNSPECIFIED. - for (uint32_t api = 1; api < sai_metadata_enum_sai_api_t.valuescount; ++api) + for (uint32_t idx = 1; idx < sai_metadata_enum_sai_api_t.valuescount; ++idx) { - auto it = levels.find((sai_api_t)api); + auto it = levels.find((sai_api_t)sai_metadata_enum_sai_api_t.values[idx]); sai_log_level_t logLevel = (it == levels.end()) ? SAI_LOG_LEVEL_NOTICE : it->second; - sai_status_t status = m_sai->logSet((sai_api_t)api, logLevel); + sai_status_t status = m_sai->logSet((sai_api_t)sai_metadata_enum_sai_api_t.values[idx], logLevel); if (status == SAI_STATUS_SUCCESS) { SWSS_LOG_INFO("setting SAI loglevel %s on %s", sai_serialize_log_level(logLevel).c_str(), - sai_serialize_api((sai_api_t)api).c_str()); + sai_serialize_api((sai_api_t)sai_metadata_enum_sai_api_t.values[idx]).c_str()); } else { @@ -362,9 +362,9 @@ std::map SaiDiscovery::getApiLogLevel() // We start from 1 since 0 is SAI_API_UNSPECIFIED. - for (uint32_t api = 1; api < sai_metadata_enum_sai_api_t.valuescount; ++api) + for (uint32_t idx = 1; idx < sai_metadata_enum_sai_api_t.valuescount; ++idx) { - levels[(sai_api_t)api] = m_sai->logGet((sai_api_t)api); + levels[(sai_api_t)sai_metadata_enum_sai_api_t.values[idx]] = m_sai->logGet((sai_api_t)sai_metadata_enum_sai_api_t.values[idx]); } return levels; diff --git a/tests/NVDAMBF2H536C/dashapis.rec b/tests/NVDAMBF2H536C/dashapis.rec index d0638864e..cd6d2dd68 100644 --- a/tests/NVDAMBF2H536C/dashapis.rec +++ b/tests/NVDAMBF2H536C/dashapis.rec @@ -11,44 +11,44 @@ 2022-11-17.15:01:04.189590|r|SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY:{"switch_id":"oid:0x21000000000000","vni":"1"} 2022-11-17.15:01:04.190026|c|SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY:{"switch_id":"oid:0x21000000000000","vni":"1"}|SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION=SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION 2022-11-17.15:01:04.190408|r|SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY:{"switch_id":"oid:0x21000000000000","vni":"1"} -2022-11-17.15:01:04.190857|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000067|SAI_VNET_ATTR_VNI=100 -2022-11-17.15:01:04.191389|c|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000068|SAI_ENI_ATTR_VNET_ID=oid:0x71000000000067 -2022-11-17.15:01:04.191905|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000069|SAI_VNET_ATTR_VNI=200 -2022-11-17.15:01:04.192404|c|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000006a|SAI_ENI_ATTR_VNET_ID=oid:0x71000000000069 -2022-11-17.15:01:04.192985|c|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d000000000068 +2022-11-17.15:01:04.190857|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000067|SAI_VNET_ATTR_VNI=100 +2022-11-17.15:01:04.191389|c|SAI_OBJECT_TYPE_ENI:oid:0x07008000000068|SAI_ENI_ATTR_VNET_ID=oid:0x0e008000000067 +2022-11-17.15:01:04.191905|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000069|SAI_VNET_ATTR_VNI=200 +2022-11-17.15:01:04.192404|c|SAI_OBJECT_TYPE_ENI:oid:0x0700800000006a|SAI_ENI_ATTR_VNET_ID=oid:0x0e008000000069 +2022-11-17.15:01:04.192985|c|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x07008000000068 2022-11-17.15:01:04.193406|g|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0 -2022-11-17.15:01:04.193906|G|SAI_STATUS_SUCCESS|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d000000000068 -2022-11-17.15:01:04.193955|s|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d00000000006a +2022-11-17.15:01:04.193906|G|SAI_STATUS_SUCCESS|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x07008000000068 +2022-11-17.15:01:04.193955|s|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0700800000006a 2022-11-17.15:01:04.194346|g|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0 -2022-11-17.15:01:04.194823|G|SAI_STATUS_SUCCESS|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d00000000006a +2022-11-17.15:01:04.194823|G|SAI_STATUS_SUCCESS|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0700800000006a 2022-11-17.15:01:04.194856|r|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.195220|r|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000068 -2022-11-17.15:01:04.195652|r|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000006a -2022-11-17.15:01:04.196064|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000067 -2022-11-17.15:01:04.196471|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000069 -2022-11-17.15:01:04.196980|c|SAI_OBJECT_TYPE_VNET:oid:0x7100000000006b|SAI_VNET_ATTR_VNI=100 -2022-11-17.15:01:04.197476|c|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000006c|SAI_ENI_ATTR_VNET_ID=oid:0x7100000000006b -2022-11-17.15:01:04.197971|c|SAI_OBJECT_TYPE_VNET:oid:0x7100000000006d|SAI_VNET_ATTR_VNI=200 -2022-11-17.15:01:04.198523|c|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000006e|SAI_ENI_ATTR_VNET_ID=oid:0x7100000000006d -2022-11-17.15:01:04.199006|c|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d00000000006c +2022-11-17.15:01:04.195220|r|SAI_OBJECT_TYPE_ENI:oid:0x07008000000068 +2022-11-17.15:01:04.195652|r|SAI_OBJECT_TYPE_ENI:oid:0x0700800000006a +2022-11-17.15:01:04.196064|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000067 +2022-11-17.15:01:04.196471|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000069 +2022-11-17.15:01:04.196980|c|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000006b|SAI_VNET_ATTR_VNI=100 +2022-11-17.15:01:04.197476|c|SAI_OBJECT_TYPE_ENI:oid:0x0700800000006c|SAI_ENI_ATTR_VNET_ID=oid:0x0e00800000006b +2022-11-17.15:01:04.197971|c|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000006d|SAI_VNET_ATTR_VNI=200 +2022-11-17.15:01:04.198523|c|SAI_OBJECT_TYPE_ENI:oid:0x0700800000006e|SAI_ENI_ATTR_VNET_ID=oid:0x0e00800000006d +2022-11-17.15:01:04.199006|c|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0700800000006c 2022-11-17.15:01:04.199395|r|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.199777|r|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000006c -2022-11-17.15:01:04.200183|r|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000006e -2022-11-17.15:01:04.200596|r|SAI_OBJECT_TYPE_VNET:oid:0x7100000000006b -2022-11-17.15:01:04.201031|r|SAI_OBJECT_TYPE_VNET:oid:0x7100000000006d -2022-11-17.15:01:04.201524|c|SAI_OBJECT_TYPE_VNET:oid:0x7100000000006f|SAI_VNET_ATTR_VNI=101 -2022-11-17.15:01:04.202047|c|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000070|SAI_ENI_ATTR_VNET_ID=oid:0x7100000000006f|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 -2022-11-17.15:01:04.202581|g|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000070|SAI_ENI_ATTR_VNET_ID=oid:0x0|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 -2022-11-17.15:01:04.203367|G|SAI_STATUS_SUCCESS|SAI_ENI_ATTR_VNET_ID=oid:0x7100000000006f|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 -2022-11-17.15:01:04.203399|s|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000070|SAI_ENI_ATTR_CPS=40 -2022-11-17.15:01:04.203768|g|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000070|SAI_ENI_ATTR_VNET_ID=oid:0x0|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 -2022-11-17.15:01:04.204467|G|SAI_STATUS_SUCCESS|SAI_ENI_ATTR_VNET_ID=oid:0x7100000000006f|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=40|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 -2022-11-17.15:01:04.204491|r|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000070 -2022-11-17.15:01:04.204992|r|SAI_OBJECT_TYPE_VNET:oid:0x7100000000006f -2022-11-17.15:01:04.205493|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000071|SAI_VNET_ATTR_VNI=101 -2022-11-17.15:01:04.206000|c|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000072|SAI_ENI_ATTR_VNET_ID=oid:0x71000000000071|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 -2022-11-17.15:01:04.206501|r|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000072 -2022-11-17.15:01:04.207013|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000071 +2022-11-17.15:01:04.199777|r|SAI_OBJECT_TYPE_ENI:oid:0x0700800000006c +2022-11-17.15:01:04.200183|r|SAI_OBJECT_TYPE_ENI:oid:0x0700800000006e +2022-11-17.15:01:04.200596|r|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000006b +2022-11-17.15:01:04.201031|r|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000006d +2022-11-17.15:01:04.201524|c|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000006f|SAI_VNET_ATTR_VNI=101 +2022-11-17.15:01:04.202047|c|SAI_OBJECT_TYPE_ENI:oid:0x07008000000070|SAI_ENI_ATTR_VNET_ID=oid:0x0e00800000006f|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 +2022-11-17.15:01:04.202581|g|SAI_OBJECT_TYPE_ENI:oid:0x07008000000070|SAI_ENI_ATTR_VNET_ID=oid:0x0|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 +2022-11-17.15:01:04.203367|G|SAI_STATUS_SUCCESS|SAI_ENI_ATTR_VNET_ID=oid:0x0e00800000006f|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 +2022-11-17.15:01:04.203399|s|SAI_OBJECT_TYPE_ENI:oid:0x07008000000070|SAI_ENI_ATTR_CPS=40 +2022-11-17.15:01:04.203768|g|SAI_OBJECT_TYPE_ENI:oid:0x07008000000070|SAI_ENI_ATTR_VNET_ID=oid:0x0|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 +2022-11-17.15:01:04.204467|G|SAI_STATUS_SUCCESS|SAI_ENI_ATTR_VNET_ID=oid:0x0e00800000006f|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=40|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 +2022-11-17.15:01:04.204491|r|SAI_OBJECT_TYPE_ENI:oid:0x07008000000070 +2022-11-17.15:01:04.204992|r|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000006f +2022-11-17.15:01:04.205493|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000071|SAI_VNET_ATTR_VNI=101 +2022-11-17.15:01:04.206000|c|SAI_OBJECT_TYPE_ENI:oid:0x07008000000072|SAI_ENI_ATTR_VNET_ID=oid:0x0e008000000071|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=30|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1 +2022-11-17.15:01:04.206501|r|SAI_OBJECT_TYPE_ENI:oid:0x07008000000072 +2022-11-17.15:01:04.207013|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000071 2022-11-17.15:01:04.207479|c|SAI_OBJECT_TYPE_VIP_ENTRY:{"switch_id":"oid:0x21000000000000","vip":"192.168.0.1"}|SAI_VIP_ENTRY_ATTR_ACTION=SAI_VIP_ENTRY_ACTION_ACCEPT 2022-11-17.15:01:04.207891|g|SAI_OBJECT_TYPE_VIP_ENTRY:{"switch_id":"oid:0x21000000000000","vip":"192.168.0.1"}|SAI_VIP_ENTRY_ATTR_ACTION=SAI_VIP_ENTRY_ACTION_ACCEPT 2022-11-17.15:01:04.208331|G|SAI_STATUS_SUCCESS|SAI_VIP_ENTRY_ATTR_ACTION=SAI_VIP_ENTRY_ACTION_ACCEPT @@ -58,98 +58,98 @@ 2022-11-17.15:01:04.209234|r|SAI_OBJECT_TYPE_VIP_ENTRY:{"switch_id":"oid:0x21000000000000","vip":"192.168.0.1"} 2022-11-17.15:01:04.209637|c|SAI_OBJECT_TYPE_VIP_ENTRY:{"switch_id":"oid:0x21000000000000","vip":"192.168.0.1"}|SAI_VIP_ENTRY_ATTR_ACTION=SAI_VIP_ENTRY_ACTION_ACCEPT 2022-11-17.15:01:04.210020|r|SAI_OBJECT_TYPE_VIP_ENTRY:{"switch_id":"oid:0x21000000000000","vip":"192.168.0.1"} -2022-11-17.15:01:04.210521|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000073|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 -2022-11-17.15:01:04.210985|g|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000073|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 +2022-11-17.15:01:04.210521|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000073|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 +2022-11-17.15:01:04.210985|g|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000073|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 2022-11-17.15:01:04.211381|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 -2022-11-17.15:01:04.211409|s|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000073|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV6 -2022-11-17.15:01:04.211760|g|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000073|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 +2022-11-17.15:01:04.211409|s|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000073|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV6 +2022-11-17.15:01:04.211760|g|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000073|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 2022-11-17.15:01:04.212162|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV6 -2022-11-17.15:01:04.212184|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000073 -2022-11-17.15:01:04.212676|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000074|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 -2022-11-17.15:01:04.213141|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000074 -2022-11-17.15:01:04.213638|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000075|NULL=NULL -2022-11-17.15:01:04.214156|c|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x6a000000000076|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x69000000000075|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1 -2022-11-17.15:01:04.214932|g|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x6a000000000076|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1 -2022-11-17.15:01:04.215950|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x69000000000075|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1 -2022-11-17.15:01:04.215984|s|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x6a000000000076|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE -2022-11-17.15:01:04.216353|g|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x6a000000000076|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT +2022-11-17.15:01:04.212184|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000073 +2022-11-17.15:01:04.212676|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000074|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 +2022-11-17.15:01:04.213141|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000074 +2022-11-17.15:01:04.213638|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000075|NULL=NULL +2022-11-17.15:01:04.214156|c|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x04008000000076|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x03008000000075|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1 +2022-11-17.15:01:04.214932|g|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x04008000000076|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1 +2022-11-17.15:01:04.215950|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x03008000000075|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1 +2022-11-17.15:01:04.215984|s|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x04008000000076|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE +2022-11-17.15:01:04.216353|g|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x04008000000076|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT 2022-11-17.15:01:04.216753|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_DENY_AND_CONTINUE -2022-11-17.15:01:04.216786|r|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x6a000000000076 -2022-11-17.15:01:04.217280|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000075 -2022-11-17.15:01:04.217776|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000077|NULL=NULL -2022-11-17.15:01:04.218277|c|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x6a000000000078|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x69000000000077|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1 -2022-11-17.15:01:04.218968|r|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x6a000000000078 -2022-11-17.15:01:04.219520|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000077 -2022-11-17.15:01:04.220009|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000079|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.220462|g|SAI_OBJECT_TYPE_VNET:oid:0x71000000000079|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.216786|r|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x04008000000076 +2022-11-17.15:01:04.217280|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000075 +2022-11-17.15:01:04.217776|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000077|NULL=NULL +2022-11-17.15:01:04.218277|c|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x04008000000078|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x03008000000077|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.1/16,100::ffff:ffff:ffff:ffff/28|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1 +2022-11-17.15:01:04.218968|r|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x04008000000078 +2022-11-17.15:01:04.219520|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000077 +2022-11-17.15:01:04.220009|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000079|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.220462|g|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000079|SAI_VNET_ATTR_VNI=10 2022-11-17.15:01:04.220882|G|SAI_STATUS_SUCCESS|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.220912|s|SAI_OBJECT_TYPE_VNET:oid:0x71000000000079|SAI_VNET_ATTR_VNI=20 -2022-11-17.15:01:04.221276|g|SAI_OBJECT_TYPE_VNET:oid:0x71000000000079|SAI_VNET_ATTR_VNI=20 +2022-11-17.15:01:04.220912|s|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000079|SAI_VNET_ATTR_VNI=20 +2022-11-17.15:01:04.221276|g|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000079|SAI_VNET_ATTR_VNI=20 2022-11-17.15:01:04.221675|G|SAI_STATUS_SUCCESS|SAI_VNET_ATTR_VNI=20 -2022-11-17.15:01:04.221697|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000079 -2022-11-17.15:01:04.222193|c|SAI_OBJECT_TYPE_VNET:oid:0x7100000000007a|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.222660|r|SAI_OBJECT_TYPE_VNET:oid:0x7100000000007a -2022-11-17.15:01:04.223220|c|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000007b|NULL=NULL -2022-11-17.15:01:04.223690|c|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x6d00000000007b","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP -2022-11-17.15:01:04.224138|s|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x6d00000000007b","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE -2022-11-17.15:01:04.224560|g|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x6d00000000007b","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP +2022-11-17.15:01:04.221697|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000079 +2022-11-17.15:01:04.222193|c|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000007a|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.222660|r|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000007a +2022-11-17.15:01:04.223220|c|SAI_OBJECT_TYPE_ENI:oid:0x0700800000007b|NULL=NULL +2022-11-17.15:01:04.223690|c|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x0700800000007b","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP +2022-11-17.15:01:04.224138|s|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x0700800000007b","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE +2022-11-17.15:01:04.224560|g|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x0700800000007b","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP 2022-11-17.15:01:04.225037|G|SAI_STATUS_SUCCESS|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE -2022-11-17.15:01:04.225075|r|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x6d00000000007b","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"} -2022-11-17.15:01:04.225461|r|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000007b -2022-11-17.15:01:04.225958|c|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000007c|NULL=NULL -2022-11-17.15:01:04.226413|c|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x6d00000000007c","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP -2022-11-17.15:01:04.226816|r|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x6d00000000007c","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"} -2022-11-17.15:01:04.227204|r|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000007c -2022-11-17.15:01:04.227701|c|SAI_OBJECT_TYPE_VNET:oid:0x7100000000007d|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.228179|c|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x7100000000007d"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT -2022-11-17.15:01:04.228599|s|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x7100000000007d"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT -2022-11-17.15:01:04.229083|g|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x7100000000007d"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT +2022-11-17.15:01:04.225075|r|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x0700800000007b","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"} +2022-11-17.15:01:04.225461|r|SAI_OBJECT_TYPE_ENI:oid:0x0700800000007b +2022-11-17.15:01:04.225958|c|SAI_OBJECT_TYPE_ENI:oid:0x0700800000007c|NULL=NULL +2022-11-17.15:01:04.226413|c|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x0700800000007c","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP +2022-11-17.15:01:04.226816|r|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x0700800000007c","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"} +2022-11-17.15:01:04.227204|r|SAI_OBJECT_TYPE_ENI:oid:0x0700800000007c +2022-11-17.15:01:04.227701|c|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000007d|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.228179|c|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e00800000007d"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT +2022-11-17.15:01:04.228599|s|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e00800000007d"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT +2022-11-17.15:01:04.229083|g|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e00800000007d"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT 2022-11-17.15:01:04.229527|G|SAI_STATUS_SUCCESS|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT -2022-11-17.15:01:04.229560|r|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x7100000000007d"} -2022-11-17.15:01:04.229928|r|SAI_OBJECT_TYPE_VNET:oid:0x7100000000007d -2022-11-17.15:01:04.230429|c|SAI_OBJECT_TYPE_VNET:oid:0x7100000000007e|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.230903|c|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x7100000000007e"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT -2022-11-17.15:01:04.231296|r|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x7100000000007e"} -2022-11-17.15:01:04.231665|r|SAI_OBJECT_TYPE_VNET:oid:0x7100000000007e -2022-11-17.15:01:04.232160|c|SAI_OBJECT_TYPE_VNET:oid:0x7100000000007f|SAI_VNET_ATTR_VNI=101 -2022-11-17.15:01:04.232663|c|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000080|SAI_ENI_ATTR_VNET_ID=oid:0x7100000000007f -2022-11-17.15:01:04.233159|c|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x6d000000000080","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x7100000000007f -2022-11-17.15:01:04.233627|g|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x6d000000000080","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0 -2022-11-17.15:01:04.234212|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x7100000000007f -2022-11-17.15:01:04.234260|s|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x6d000000000080","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT -2022-11-17.15:01:04.234724|g|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x6d000000000080","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0 -2022-11-17.15:01:04.235311|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x7100000000007f -2022-11-17.15:01:04.235346|r|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x6d000000000080","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.235726|r|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000080 -2022-11-17.15:01:04.236151|r|SAI_OBJECT_TYPE_VNET:oid:0x7100000000007f -2022-11-17.15:01:04.236650|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000081|SAI_VNET_ATTR_VNI=101 -2022-11-17.15:01:04.237179|c|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000082|SAI_ENI_ATTR_VNET_ID=oid:0x71000000000081 -2022-11-17.15:01:04.237663|c|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x6d000000000082","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x71000000000081 -2022-11-17.15:01:04.238082|r|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x6d000000000082","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.238459|r|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000082 -2022-11-17.15:01:04.238878|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000081 -2022-11-17.15:01:04.239377|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000083|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.239866|c|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x71000000000083","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=192.168.0.1|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:01:02:03:04:05|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false -2022-11-17.15:01:04.240326|s|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x71000000000083","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true -2022-11-17.15:01:04.240798|g|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x71000000000083","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true +2022-11-17.15:01:04.229560|r|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e00800000007d"} +2022-11-17.15:01:04.229928|r|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000007d +2022-11-17.15:01:04.230429|c|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000007e|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.230903|c|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e00800000007e"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT +2022-11-17.15:01:04.231296|r|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.3.3.3","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e00800000007e"} +2022-11-17.15:01:04.231665|r|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000007e +2022-11-17.15:01:04.232160|c|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000007f|SAI_VNET_ATTR_VNI=101 +2022-11-17.15:01:04.232663|c|SAI_OBJECT_TYPE_ENI:oid:0x07008000000080|SAI_ENI_ATTR_VNET_ID=oid:0x0e00800000007f +2022-11-17.15:01:04.233159|c|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x07008000000080","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0e00800000007f +2022-11-17.15:01:04.233627|g|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x07008000000080","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0 +2022-11-17.15:01:04.234212|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0e00800000007f +2022-11-17.15:01:04.234260|s|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x07008000000080","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT +2022-11-17.15:01:04.234724|g|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x07008000000080","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0 +2022-11-17.15:01:04.235311|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_DIRECT|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0e00800000007f +2022-11-17.15:01:04.235346|r|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x07008000000080","switch_id":"oid:0x21000000000000"} +2022-11-17.15:01:04.235726|r|SAI_OBJECT_TYPE_ENI:oid:0x07008000000080 +2022-11-17.15:01:04.236151|r|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000007f +2022-11-17.15:01:04.236650|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000081|SAI_VNET_ATTR_VNI=101 +2022-11-17.15:01:04.237179|c|SAI_OBJECT_TYPE_ENI:oid:0x07008000000082|SAI_ENI_ATTR_VNET_ID=oid:0x0e008000000081 +2022-11-17.15:01:04.237663|c|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x07008000000082","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0e008000000081 +2022-11-17.15:01:04.238082|r|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.168.1.0/24","eni_id":"oid:0x07008000000082","switch_id":"oid:0x21000000000000"} +2022-11-17.15:01:04.238459|r|SAI_OBJECT_TYPE_ENI:oid:0x07008000000082 +2022-11-17.15:01:04.238878|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000081 +2022-11-17.15:01:04.239377|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000083|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.239866|c|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x0e008000000083","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=192.168.0.1|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:01:02:03:04:05|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false +2022-11-17.15:01:04.240326|s|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x0e008000000083","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true +2022-11-17.15:01:04.240798|g|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x0e008000000083","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true 2022-11-17.15:01:04.241242|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true -2022-11-17.15:01:04.241275|r|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x71000000000083","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.241645|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000083 -2022-11-17.15:01:04.242149|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000084|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.242628|c|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x71000000000084","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=192.168.0.1|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:01:02:03:04:05|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false -2022-11-17.15:01:04.243067|r|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x71000000000084","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.243454|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000084 -2022-11-17.15:01:04.243961|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000085|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.244441|c|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x71000000000085","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=fe80::886a:feff:fe31:bfe0|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:02:03:04:05:06|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true -2022-11-17.15:01:04.244900|s|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x71000000000085","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true -2022-11-17.15:01:04.245305|g|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x71000000000085","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true +2022-11-17.15:01:04.241275|r|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x0e008000000083","switch_id":"oid:0x21000000000000"} +2022-11-17.15:01:04.241645|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000083 +2022-11-17.15:01:04.242149|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000084|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.242628|c|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x0e008000000084","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=192.168.0.1|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:01:02:03:04:05|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false +2022-11-17.15:01:04.243067|r|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.168.0.1","dst_vnet_id":"oid:0x0e008000000084","switch_id":"oid:0x21000000000000"} +2022-11-17.15:01:04.243454|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000084 +2022-11-17.15:01:04.243961|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000085|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.244441|c|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e008000000085","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=fe80::886a:feff:fe31:bfe0|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:02:03:04:05:06|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true +2022-11-17.15:01:04.244900|s|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e008000000085","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true +2022-11-17.15:01:04.245305|g|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e008000000085","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true 2022-11-17.15:01:04.245743|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true -2022-11-17.15:01:04.245773|r|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x71000000000085","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.246207|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000085 -2022-11-17.15:01:04.246717|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000086|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.247197|c|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x71000000000086","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=fe80::886a:feff:fe31:bfe0|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:02:03:04:05:06|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true -2022-11-17.15:01:04.247631|r|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x71000000000086","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.248027|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000086 +2022-11-17.15:01:04.245773|r|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e008000000085","switch_id":"oid:0x21000000000000"} +2022-11-17.15:01:04.246207|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000085 +2022-11-17.15:01:04.246717|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000086|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.247197|c|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e008000000086","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=fe80::886a:feff:fe31:bfe0|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:02:03:04:05:06|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true +2022-11-17.15:01:04.247631|r|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e008000000086","switch_id":"oid:0x21000000000000"} +2022-11-17.15:01:04.248027|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000086 2022-11-17.15:01:04.248552|C|SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY||{"switch_id":"oid:0x21000000000000","vni":"10"}|SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION=SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION||{"switch_id":"oid:0x21000000000000","vni":"20"}|SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION=SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION 2022-11-17.15:01:04.249058|g|SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY:{"switch_id":"oid:0x21000000000000","vni":"10"}|SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION=SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION 2022-11-17.15:01:04.249516|G|SAI_STATUS_SUCCESS|SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION=SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION @@ -158,46 +158,46 @@ 2022-11-17.15:01:04.250018|R|SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY||{"switch_id":"oid:0x21000000000000","vni":"10"}||{"switch_id":"oid:0x21000000000000","vni":"20"} 2022-11-17.15:01:04.250494|C|SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY||{"switch_id":"oid:0x21000000000000","vni":"10"}|SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION=SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION||{"switch_id":"oid:0x21000000000000","vni":"20"}|SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION=SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION 2022-11-17.15:01:04.250955|R|SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY||{"switch_id":"oid:0x21000000000000","vni":"10"}||{"switch_id":"oid:0x21000000000000","vni":"20"} -2022-11-17.15:01:04.251475|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000087|SAI_VNET_ATTR_VNI=100 -2022-11-17.15:01:04.251989|c|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000088|SAI_ENI_ATTR_VNET_ID=oid:0x71000000000087 -2022-11-17.15:01:04.252562|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000089|SAI_VNET_ATTR_VNI=200 -2022-11-17.15:01:04.253077|c|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000008a|SAI_ENI_ATTR_VNET_ID=oid:0x71000000000089 -2022-11-17.15:01:04.253561|C|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY||{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d000000000088||{"address":"00:01:02:03:04:06","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d00000000008a +2022-11-17.15:01:04.251475|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000087|SAI_VNET_ATTR_VNI=100 +2022-11-17.15:01:04.251989|c|SAI_OBJECT_TYPE_ENI:oid:0x07008000000088|SAI_ENI_ATTR_VNET_ID=oid:0x0e008000000087 +2022-11-17.15:01:04.252562|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000089|SAI_VNET_ATTR_VNI=200 +2022-11-17.15:01:04.253077|c|SAI_OBJECT_TYPE_ENI:oid:0x0700800000008a|SAI_ENI_ATTR_VNET_ID=oid:0x0e008000000089 +2022-11-17.15:01:04.253561|C|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY||{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x07008000000088||{"address":"00:01:02:03:04:06","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0700800000008a 2022-11-17.15:01:04.254039|g|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0 -2022-11-17.15:01:04.254534|G|SAI_STATUS_SUCCESS|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d000000000088 +2022-11-17.15:01:04.254534|G|SAI_STATUS_SUCCESS|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x07008000000088 2022-11-17.15:01:04.254576|g|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY:{"address":"00:01:02:03:04:06","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0 -2022-11-17.15:01:04.255050|G|SAI_STATUS_SUCCESS|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d00000000008a +2022-11-17.15:01:04.255050|G|SAI_STATUS_SUCCESS|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0700800000008a 2022-11-17.15:01:04.255091|R|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY||{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}||{"address":"00:01:02:03:04:06","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.255529|r|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000088 -2022-11-17.15:01:04.255965|r|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000008a -2022-11-17.15:01:04.256370|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000087 -2022-11-17.15:01:04.256794|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000089 -2022-11-17.15:01:04.257299|c|SAI_OBJECT_TYPE_VNET:oid:0x7100000000008b|SAI_VNET_ATTR_VNI=100 -2022-11-17.15:01:04.257795|c|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000008c|SAI_ENI_ATTR_VNET_ID=oid:0x7100000000008b -2022-11-17.15:01:04.258351|c|SAI_OBJECT_TYPE_VNET:oid:0x7100000000008d|SAI_VNET_ATTR_VNI=200 -2022-11-17.15:01:04.258843|c|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000008e|SAI_ENI_ATTR_VNET_ID=oid:0x7100000000008d -2022-11-17.15:01:04.259321|C|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY||{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d00000000008c||{"address":"00:01:02:03:04:06","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x6d00000000008e +2022-11-17.15:01:04.255529|r|SAI_OBJECT_TYPE_ENI:oid:0x07008000000088 +2022-11-17.15:01:04.255965|r|SAI_OBJECT_TYPE_ENI:oid:0x0700800000008a +2022-11-17.15:01:04.256370|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000087 +2022-11-17.15:01:04.256794|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000089 +2022-11-17.15:01:04.257299|c|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000008b|SAI_VNET_ATTR_VNI=100 +2022-11-17.15:01:04.257795|c|SAI_OBJECT_TYPE_ENI:oid:0x0700800000008c|SAI_ENI_ATTR_VNET_ID=oid:0x0e00800000008b +2022-11-17.15:01:04.258351|c|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000008d|SAI_VNET_ATTR_VNI=200 +2022-11-17.15:01:04.258843|c|SAI_OBJECT_TYPE_ENI:oid:0x0700800000008e|SAI_ENI_ATTR_VNET_ID=oid:0x0e00800000008d +2022-11-17.15:01:04.259321|C|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY||{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0700800000008c||{"address":"00:01:02:03:04:06","switch_id":"oid:0x21000000000000"}|SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID=oid:0x0700800000008e 2022-11-17.15:01:04.259787|R|SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY||{"address":"00:01:02:03:04:05","switch_id":"oid:0x21000000000000"}||{"address":"00:01:02:03:04:06","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.260227|r|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000008c -2022-11-17.15:01:04.260664|r|SAI_OBJECT_TYPE_ENI:oid:0x6d00000000008e -2022-11-17.15:01:04.261091|r|SAI_OBJECT_TYPE_VNET:oid:0x7100000000008b -2022-11-17.15:01:04.261501|r|SAI_OBJECT_TYPE_VNET:oid:0x7100000000008d -2022-11-17.15:01:04.261991|c|SAI_OBJECT_TYPE_VNET:oid:0x7100000000008f|SAI_VNET_ATTR_VNI=101 -2022-11-17.15:01:04.262483|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000090|SAI_VNET_ATTR_VNI=102 -2022-11-17.15:01:04.263040|C|SAI_OBJECT_TYPE_ENI||oid:0x6d000000000091|SAI_ENI_ATTR_VNET_ID=oid:0x7100000000008f|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=20|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1||oid:0x6d000000000092|SAI_ENI_ATTR_VNET_ID=oid:0x71000000000090|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=124|SAI_ENI_ATTR_CPS=11|SAI_ENI_ATTR_FLOWS=21|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.1.1 -2022-11-17.15:01:04.263711|g|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000091|SAI_ENI_ATTR_VNET_ID=oid:0x0 -2022-11-17.15:01:04.264183|G|SAI_STATUS_SUCCESS|SAI_ENI_ATTR_VNET_ID=oid:0x7100000000008f -2022-11-17.15:01:04.264213|g|SAI_OBJECT_TYPE_ENI:oid:0x6d000000000092|SAI_ENI_ATTR_VNET_ID=oid:0x0 -2022-11-17.15:01:04.264715|G|SAI_STATUS_SUCCESS|SAI_ENI_ATTR_VNET_ID=oid:0x71000000000090 -2022-11-17.15:01:04.264757|R|SAI_OBJECT_TYPE_ENI||oid:0x6d000000000091||oid:0x6d000000000092 -2022-11-17.15:01:04.265313|r|SAI_OBJECT_TYPE_VNET:oid:0x7100000000008f -2022-11-17.15:01:04.265761|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000090 -2022-11-17.15:01:04.266260|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000093|SAI_VNET_ATTR_VNI=101 -2022-11-17.15:01:04.266752|c|SAI_OBJECT_TYPE_VNET:oid:0x71000000000094|SAI_VNET_ATTR_VNI=102 -2022-11-17.15:01:04.267304|C|SAI_OBJECT_TYPE_ENI||oid:0x6d000000000095|SAI_ENI_ATTR_VNET_ID=oid:0x71000000000093|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=20|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1||oid:0x6d000000000096|SAI_ENI_ATTR_VNET_ID=oid:0x71000000000094|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=124|SAI_ENI_ATTR_CPS=11|SAI_ENI_ATTR_FLOWS=21|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.1.1 -2022-11-17.15:01:04.267965|R|SAI_OBJECT_TYPE_ENI||oid:0x6d000000000095||oid:0x6d000000000096 -2022-11-17.15:01:04.268525|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000093 -2022-11-17.15:01:04.268989|r|SAI_OBJECT_TYPE_VNET:oid:0x71000000000094 +2022-11-17.15:01:04.260227|r|SAI_OBJECT_TYPE_ENI:oid:0x0700800000008c +2022-11-17.15:01:04.260664|r|SAI_OBJECT_TYPE_ENI:oid:0x0700800000008e +2022-11-17.15:01:04.261091|r|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000008b +2022-11-17.15:01:04.261501|r|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000008d +2022-11-17.15:01:04.261991|c|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000008f|SAI_VNET_ATTR_VNI=101 +2022-11-17.15:01:04.262483|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000090|SAI_VNET_ATTR_VNI=102 +2022-11-17.15:01:04.263040|C|SAI_OBJECT_TYPE_ENI||oid:0x07008000000091|SAI_ENI_ATTR_VNET_ID=oid:0x0e00800000008f|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=20|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1||oid:0x07008000000092|SAI_ENI_ATTR_VNET_ID=oid:0x0e008000000090|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=124|SAI_ENI_ATTR_CPS=11|SAI_ENI_ATTR_FLOWS=21|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.1.1 +2022-11-17.15:01:04.263711|g|SAI_OBJECT_TYPE_ENI:oid:0x07008000000091|SAI_ENI_ATTR_VNET_ID=oid:0x0 +2022-11-17.15:01:04.264183|G|SAI_STATUS_SUCCESS|SAI_ENI_ATTR_VNET_ID=oid:0x0e00800000008f +2022-11-17.15:01:04.264213|g|SAI_OBJECT_TYPE_ENI:oid:0x07008000000092|SAI_ENI_ATTR_VNET_ID=oid:0x0 +2022-11-17.15:01:04.264715|G|SAI_STATUS_SUCCESS|SAI_ENI_ATTR_VNET_ID=oid:0x0e008000000090 +2022-11-17.15:01:04.264757|R|SAI_OBJECT_TYPE_ENI||oid:0x07008000000091||oid:0x07008000000092 +2022-11-17.15:01:04.265313|r|SAI_OBJECT_TYPE_VNET:oid:0x0e00800000008f +2022-11-17.15:01:04.265761|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000090 +2022-11-17.15:01:04.266260|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000093|SAI_VNET_ATTR_VNI=101 +2022-11-17.15:01:04.266752|c|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000094|SAI_VNET_ATTR_VNI=102 +2022-11-17.15:01:04.267304|C|SAI_OBJECT_TYPE_ENI||oid:0x07008000000095|SAI_ENI_ATTR_VNET_ID=oid:0x0e008000000093|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=123|SAI_ENI_ATTR_CPS=10|SAI_ENI_ATTR_FLOWS=20|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.0.1||oid:0x07008000000096|SAI_ENI_ATTR_VNET_ID=oid:0x0e008000000094|SAI_ENI_ATTR_ADMIN_STATE=true|SAI_ENI_ATTR_VM_VNI=124|SAI_ENI_ATTR_CPS=11|SAI_ENI_ATTR_FLOWS=21|SAI_ENI_ATTR_VM_UNDERLAY_DIP=192.168.1.1 +2022-11-17.15:01:04.267965|R|SAI_OBJECT_TYPE_ENI||oid:0x07008000000095||oid:0x07008000000096 +2022-11-17.15:01:04.268525|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000093 +2022-11-17.15:01:04.268989|r|SAI_OBJECT_TYPE_VNET:oid:0x0e008000000094 2022-11-17.15:01:04.269469|C|SAI_OBJECT_TYPE_VIP_ENTRY||{"switch_id":"oid:0x21000000000000","vip":"192.168.0.1"}|SAI_VIP_ENTRY_ATTR_ACTION=SAI_VIP_ENTRY_ACTION_ACCEPT||{"switch_id":"oid:0x21000000000000","vip":"192.168.1.1"}|SAI_VIP_ENTRY_ATTR_ACTION=SAI_VIP_ENTRY_ACTION_ACCEPT 2022-11-17.15:01:04.269937|g|SAI_OBJECT_TYPE_VIP_ENTRY:{"switch_id":"oid:0x21000000000000","vip":"192.168.0.1"}|SAI_VIP_ENTRY_ATTR_ACTION=SAI_VIP_ENTRY_ACTION_ACCEPT 2022-11-17.15:01:04.270372|G|SAI_STATUS_SUCCESS|SAI_VIP_ENTRY_ATTR_ACTION=SAI_VIP_ENTRY_ACTION_ACCEPT @@ -206,107 +206,107 @@ 2022-11-17.15:01:04.270928|R|SAI_OBJECT_TYPE_VIP_ENTRY||{"switch_id":"oid:0x21000000000000","vip":"192.168.0.1"}||{"switch_id":"oid:0x21000000000000","vip":"192.168.1.1"} 2022-11-17.15:01:04.271410|C|SAI_OBJECT_TYPE_VIP_ENTRY||{"switch_id":"oid:0x21000000000000","vip":"192.168.0.1"}|SAI_VIP_ENTRY_ATTR_ACTION=SAI_VIP_ENTRY_ACTION_ACCEPT||{"switch_id":"oid:0x21000000000000","vip":"192.168.1.1"}|SAI_VIP_ENTRY_ATTR_ACTION=SAI_VIP_ENTRY_ACTION_ACCEPT 2022-11-17.15:01:04.271868|R|SAI_OBJECT_TYPE_VIP_ENTRY||{"switch_id":"oid:0x21000000000000","vip":"192.168.0.1"}||{"switch_id":"oid:0x21000000000000","vip":"192.168.1.1"} -2022-11-17.15:01:04.272410|C|SAI_OBJECT_TYPE_DASH_ACL_GROUP||oid:0x69000000000097|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4||oid:0x69000000000098|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV6 -2022-11-17.15:01:04.273012|g|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000097|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 +2022-11-17.15:01:04.272410|C|SAI_OBJECT_TYPE_DASH_ACL_GROUP||oid:0x03008000000097|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4||oid:0x03008000000098|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV6 +2022-11-17.15:01:04.273012|g|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000097|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 2022-11-17.15:01:04.273432|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 -2022-11-17.15:01:04.273459|g|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x69000000000098|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 +2022-11-17.15:01:04.273459|g|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x03008000000098|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4 2022-11-17.15:01:04.273843|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV6 -2022-11-17.15:01:04.273869|R|SAI_OBJECT_TYPE_DASH_ACL_GROUP||oid:0x69000000000097||oid:0x69000000000098 -2022-11-17.15:01:04.274512|C|SAI_OBJECT_TYPE_DASH_ACL_GROUP||oid:0x69000000000099|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4||oid:0x6900000000009a|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV6 -2022-11-17.15:01:04.275089|R|SAI_OBJECT_TYPE_DASH_ACL_GROUP||oid:0x69000000000099||oid:0x6900000000009a -2022-11-17.15:01:04.275719|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x6900000000009b|NULL=NULL -2022-11-17.15:01:04.276197|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x6900000000009c|NULL=NULL -2022-11-17.15:01:04.276753|C|SAI_OBJECT_TYPE_DASH_ACL_RULE||oid:0x6a00000000009d|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x6900000000009b|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1||oid:0x6a00000000009e|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_DENY|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x6900000000009c|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:204,221|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=2 -2022-11-17.15:01:04.277815|g|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x6a00000000009d|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0|SAI_DASH_ACL_RULE_ATTR_DIP=2:0.0.0.0/0,0.0.0.0/0|SAI_DASH_ACL_RULE_ATTR_SIP=2:0.0.0.0/0,0.0.0.0/0|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:0,0|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:0,0,0,0|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:0,0,0,0|SAI_DASH_ACL_RULE_ATTR_PRIORITY=0 -2022-11-17.15:01:04.278838|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x6900000000009b|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1 -2022-11-17.15:01:04.278886|g|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x6a00000000009e|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0|SAI_DASH_ACL_RULE_ATTR_DIP=2:0.0.0.0/0,0.0.0.0/0|SAI_DASH_ACL_RULE_ATTR_SIP=2:0.0.0.0/0,0.0.0.0/0|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:0,0|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:0,0,0,0|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:0,0,0,0|SAI_DASH_ACL_RULE_ATTR_PRIORITY=0 -2022-11-17.15:01:04.279797|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_DENY|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x6900000000009c|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:204,221|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=2 -2022-11-17.15:01:04.279827|R|SAI_OBJECT_TYPE_DASH_ACL_RULE||oid:0x6a00000000009d||oid:0x6a00000000009e -2022-11-17.15:01:04.280381|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x6900000000009b -2022-11-17.15:01:04.280849|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x6900000000009c -2022-11-17.15:01:04.281342|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x6900000000009f|NULL=NULL -2022-11-17.15:01:04.281814|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x690000000000a0|NULL=NULL -2022-11-17.15:01:04.282359|C|SAI_OBJECT_TYPE_DASH_ACL_RULE||oid:0x6a0000000000a1|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x6900000000009f|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1||oid:0x6a0000000000a2|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_DENY|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x690000000000a0|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:204,221|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=2 -2022-11-17.15:01:04.283376|R|SAI_OBJECT_TYPE_DASH_ACL_RULE||oid:0x6a0000000000a1||oid:0x6a0000000000a2 -2022-11-17.15:01:04.283949|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x6900000000009f -2022-11-17.15:01:04.284384|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x690000000000a0 -2022-11-17.15:01:04.284929|C|SAI_OBJECT_TYPE_VNET||oid:0x710000000000a3|SAI_VNET_ATTR_VNI=10||oid:0x710000000000a4|SAI_VNET_ATTR_VNI=20 -2022-11-17.15:01:04.285511|g|SAI_OBJECT_TYPE_VNET:oid:0x710000000000a3|SAI_VNET_ATTR_VNI=0 +2022-11-17.15:01:04.273869|R|SAI_OBJECT_TYPE_DASH_ACL_GROUP||oid:0x03008000000097||oid:0x03008000000098 +2022-11-17.15:01:04.274512|C|SAI_OBJECT_TYPE_DASH_ACL_GROUP||oid:0x03008000000099|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV4||oid:0x0300800000009a|SAI_DASH_ACL_GROUP_ATTR_IP_ADDR_FAMILY=SAI_IP_ADDR_FAMILY_IPV6 +2022-11-17.15:01:04.275089|R|SAI_OBJECT_TYPE_DASH_ACL_GROUP||oid:0x03008000000099||oid:0x0300800000009a +2022-11-17.15:01:04.275719|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x0300800000009b|NULL=NULL +2022-11-17.15:01:04.276197|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x0300800000009c|NULL=NULL +2022-11-17.15:01:04.276753|C|SAI_OBJECT_TYPE_DASH_ACL_RULE||oid:0x0400800000009d|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0300800000009b|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1||oid:0x0400800000009e|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_DENY|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0300800000009c|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:204,221|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=2 +2022-11-17.15:01:04.277815|g|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x0400800000009d|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0|SAI_DASH_ACL_RULE_ATTR_DIP=2:0.0.0.0/0,0.0.0.0/0|SAI_DASH_ACL_RULE_ATTR_SIP=2:0.0.0.0/0,0.0.0.0/0|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:0,0|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:0,0,0,0|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:0,0,0,0|SAI_DASH_ACL_RULE_ATTR_PRIORITY=0 +2022-11-17.15:01:04.278838|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0300800000009b|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1 +2022-11-17.15:01:04.278886|g|SAI_OBJECT_TYPE_DASH_ACL_RULE:oid:0x0400800000009e|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0|SAI_DASH_ACL_RULE_ATTR_DIP=2:0.0.0.0/0,0.0.0.0/0|SAI_DASH_ACL_RULE_ATTR_SIP=2:0.0.0.0/0,0.0.0.0/0|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:0,0|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:0,0,0,0|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:0,0,0,0|SAI_DASH_ACL_RULE_ATTR_PRIORITY=0 +2022-11-17.15:01:04.279797|G|SAI_STATUS_SUCCESS|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_DENY|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0300800000009c|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:204,221|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=2 +2022-11-17.15:01:04.279827|R|SAI_OBJECT_TYPE_DASH_ACL_RULE||oid:0x0400800000009d||oid:0x0400800000009e +2022-11-17.15:01:04.280381|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x0300800000009b +2022-11-17.15:01:04.280849|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x0300800000009c +2022-11-17.15:01:04.281342|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x0300800000009f|NULL=NULL +2022-11-17.15:01:04.281814|c|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x030080000000a0|NULL=NULL +2022-11-17.15:01:04.282359|C|SAI_OBJECT_TYPE_DASH_ACL_RULE||oid:0x040080000000a1|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_PERMIT_AND_CONTINUE|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x0300800000009f|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:170,187|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_PRIORITY=1||oid:0x040080000000a2|SAI_DASH_ACL_RULE_ATTR_ACTION=SAI_DASH_ACL_RULE_ACTION_DENY|SAI_DASH_ACL_RULE_ATTR_DASH_ACL_GROUP_ID=oid:0x030080000000a0|SAI_DASH_ACL_RULE_ATTR_DIP=2:192.168.0.1/24,100::ffff:ffff:ffff:ffff/16|SAI_DASH_ACL_RULE_ATTR_SIP=2:192.168.0.2/16,100::ffff:ffff:ffff:fffe/16|SAI_DASH_ACL_RULE_ATTR_PROTOCOL=2:204,221|SAI_DASH_ACL_RULE_ATTR_SRC_PORT=2:50,60,70,80|SAI_DASH_ACL_RULE_ATTR_DST_PORT=2:10,20,30,40|SAI_DASH_ACL_RULE_ATTR_PRIORITY=2 +2022-11-17.15:01:04.283376|R|SAI_OBJECT_TYPE_DASH_ACL_RULE||oid:0x040080000000a1||oid:0x040080000000a2 +2022-11-17.15:01:04.283949|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x0300800000009f +2022-11-17.15:01:04.284384|r|SAI_OBJECT_TYPE_DASH_ACL_GROUP:oid:0x030080000000a0 +2022-11-17.15:01:04.284929|C|SAI_OBJECT_TYPE_VNET||oid:0x0e0080000000a3|SAI_VNET_ATTR_VNI=10||oid:0x0e0080000000a4|SAI_VNET_ATTR_VNI=20 +2022-11-17.15:01:04.285511|g|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000a3|SAI_VNET_ATTR_VNI=0 2022-11-17.15:01:04.285999|G|SAI_STATUS_SUCCESS|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.286027|g|SAI_OBJECT_TYPE_VNET:oid:0x710000000000a4|SAI_VNET_ATTR_VNI=0 +2022-11-17.15:01:04.286027|g|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000a4|SAI_VNET_ATTR_VNI=0 2022-11-17.15:01:04.286418|G|SAI_STATUS_SUCCESS|SAI_VNET_ATTR_VNI=20 -2022-11-17.15:01:04.286444|R|SAI_OBJECT_TYPE_VNET||oid:0x710000000000a3||oid:0x710000000000a4 -2022-11-17.15:01:04.287168|C|SAI_OBJECT_TYPE_VNET||oid:0x710000000000a5|SAI_VNET_ATTR_VNI=10||oid:0x710000000000a6|SAI_VNET_ATTR_VNI=20 -2022-11-17.15:01:04.287755|R|SAI_OBJECT_TYPE_VNET||oid:0x710000000000a5||oid:0x710000000000a6 -2022-11-17.15:01:04.288377|c|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000a7|NULL=NULL -2022-11-17.15:01:04.288881|c|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000a8|NULL=NULL -2022-11-17.15:01:04.289355|C|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY||{"eni_id":"oid:0x6d0000000000a7","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP||{"eni_id":"oid:0x6d0000000000a8","priority":"2","sip":"192.168.0.2","sip_mask":"255.255.0.0","switch_id":"oid:0x21000000000000","vni":"11"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE -2022-11-17.15:01:04.289878|g|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x6d0000000000a7","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP +2022-11-17.15:01:04.286444|R|SAI_OBJECT_TYPE_VNET||oid:0x0e0080000000a3||oid:0x0e0080000000a4 +2022-11-17.15:01:04.287168|C|SAI_OBJECT_TYPE_VNET||oid:0x0e0080000000a5|SAI_VNET_ATTR_VNI=10||oid:0x0e0080000000a6|SAI_VNET_ATTR_VNI=20 +2022-11-17.15:01:04.287755|R|SAI_OBJECT_TYPE_VNET||oid:0x0e0080000000a5||oid:0x0e0080000000a6 +2022-11-17.15:01:04.288377|c|SAI_OBJECT_TYPE_ENI:oid:0x070080000000a7|NULL=NULL +2022-11-17.15:01:04.288881|c|SAI_OBJECT_TYPE_ENI:oid:0x070080000000a8|NULL=NULL +2022-11-17.15:01:04.289355|C|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY||{"eni_id":"oid:0x070080000000a7","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP||{"eni_id":"oid:0x070080000000a8","priority":"2","sip":"192.168.0.2","sip_mask":"255.255.0.0","switch_id":"oid:0x21000000000000","vni":"11"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE +2022-11-17.15:01:04.289878|g|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x070080000000a7","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP 2022-11-17.15:01:04.290355|G|SAI_STATUS_SUCCESS|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP -2022-11-17.15:01:04.290404|g|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x6d0000000000a8","priority":"2","sip":"192.168.0.2","sip_mask":"255.255.0.0","switch_id":"oid:0x21000000000000","vni":"11"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP +2022-11-17.15:01:04.290404|g|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY:{"eni_id":"oid:0x070080000000a8","priority":"2","sip":"192.168.0.2","sip_mask":"255.255.0.0","switch_id":"oid:0x21000000000000","vni":"11"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP 2022-11-17.15:01:04.290856|G|SAI_STATUS_SUCCESS|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE -2022-11-17.15:01:04.290905|R|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY||{"eni_id":"oid:0x6d0000000000a7","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}||{"eni_id":"oid:0x6d0000000000a8","priority":"2","sip":"192.168.0.2","sip_mask":"255.255.0.0","switch_id":"oid:0x21000000000000","vni":"11"} -2022-11-17.15:01:04.291375|r|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000a7 -2022-11-17.15:01:04.291800|r|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000a8 -2022-11-17.15:01:04.292287|c|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000a9|NULL=NULL -2022-11-17.15:01:04.292853|c|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000aa|NULL=NULL -2022-11-17.15:01:04.293328|C|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY||{"eni_id":"oid:0x6d0000000000a9","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP||{"eni_id":"oid:0x6d0000000000aa","priority":"2","sip":"192.168.0.2","sip_mask":"255.255.0.0","switch_id":"oid:0x21000000000000","vni":"11"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE -2022-11-17.15:01:04.293821|R|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY||{"eni_id":"oid:0x6d0000000000a9","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}||{"eni_id":"oid:0x6d0000000000aa","priority":"2","sip":"192.168.0.2","sip_mask":"255.255.0.0","switch_id":"oid:0x21000000000000","vni":"11"} -2022-11-17.15:01:04.294325|r|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000a9 -2022-11-17.15:01:04.294750|r|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000aa -2022-11-17.15:01:04.295244|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000ab|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.295732|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000ac|SAI_VNET_ATTR_VNI=20 -2022-11-17.15:01:04.296208|C|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY||{"sip":"192.1.1.1","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x710000000000ab"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT||{"sip":"192.2.2.2","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x710000000000ac"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT -2022-11-17.15:01:04.296691|g|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.1.1.1","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x710000000000ab"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT +2022-11-17.15:01:04.290905|R|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY||{"eni_id":"oid:0x070080000000a7","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}||{"eni_id":"oid:0x070080000000a8","priority":"2","sip":"192.168.0.2","sip_mask":"255.255.0.0","switch_id":"oid:0x21000000000000","vni":"11"} +2022-11-17.15:01:04.291375|r|SAI_OBJECT_TYPE_ENI:oid:0x070080000000a7 +2022-11-17.15:01:04.291800|r|SAI_OBJECT_TYPE_ENI:oid:0x070080000000a8 +2022-11-17.15:01:04.292287|c|SAI_OBJECT_TYPE_ENI:oid:0x070080000000a9|NULL=NULL +2022-11-17.15:01:04.292853|c|SAI_OBJECT_TYPE_ENI:oid:0x070080000000aa|NULL=NULL +2022-11-17.15:01:04.293328|C|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY||{"eni_id":"oid:0x070080000000a9","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP||{"eni_id":"oid:0x070080000000aa","priority":"2","sip":"192.168.0.2","sip_mask":"255.255.0.0","switch_id":"oid:0x21000000000000","vni":"11"}|SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE +2022-11-17.15:01:04.293821|R|SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY||{"eni_id":"oid:0x070080000000a9","priority":"1","sip":"192.168.0.1","sip_mask":"255.255.255.0","switch_id":"oid:0x21000000000000","vni":"10"}||{"eni_id":"oid:0x070080000000aa","priority":"2","sip":"192.168.0.2","sip_mask":"255.255.0.0","switch_id":"oid:0x21000000000000","vni":"11"} +2022-11-17.15:01:04.294325|r|SAI_OBJECT_TYPE_ENI:oid:0x070080000000a9 +2022-11-17.15:01:04.294750|r|SAI_OBJECT_TYPE_ENI:oid:0x070080000000aa +2022-11-17.15:01:04.295244|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000ab|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.295732|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000ac|SAI_VNET_ATTR_VNI=20 +2022-11-17.15:01:04.296208|C|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY||{"sip":"192.1.1.1","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e0080000000ab"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT||{"sip":"192.2.2.2","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e0080000000ac"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT +2022-11-17.15:01:04.296691|g|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.1.1.1","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e0080000000ab"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT 2022-11-17.15:01:04.297159|G|SAI_STATUS_SUCCESS|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT -2022-11-17.15:01:04.297203|g|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.2.2.2","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x710000000000ac"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT +2022-11-17.15:01:04.297203|g|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY:{"sip":"192.2.2.2","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e0080000000ac"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT 2022-11-17.15:01:04.297632|G|SAI_STATUS_SUCCESS|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT -2022-11-17.15:01:04.297675|R|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY||{"sip":"192.1.1.1","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x710000000000ab"}||{"sip":"192.2.2.2","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x710000000000ac"} -2022-11-17.15:01:04.298108|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000ab -2022-11-17.15:01:04.298604|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000ac -2022-11-17.15:01:04.299110|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000ad|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.299600|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000ae|SAI_VNET_ATTR_VNI=20 -2022-11-17.15:01:04.300070|C|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY||{"sip":"192.1.1.1","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x710000000000ad"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT||{"sip":"192.2.2.2","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x710000000000ae"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT -2022-11-17.15:01:04.300539|R|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY||{"sip":"192.1.1.1","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x710000000000ad"}||{"sip":"192.2.2.2","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x710000000000ae"} -2022-11-17.15:01:04.301009|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000ad -2022-11-17.15:01:04.301434|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000ae -2022-11-17.15:01:04.301926|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000af|SAI_VNET_ATTR_VNI=101 -2022-11-17.15:01:04.302418|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b0|SAI_VNET_ATTR_VNI=102 -2022-11-17.15:01:04.302911|c|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000b1|SAI_ENI_ATTR_VNET_ID=oid:0x710000000000af -2022-11-17.15:01:04.303405|c|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000b2|SAI_ENI_ATTR_VNET_ID=oid:0x710000000000b0 -2022-11-17.15:01:04.303897|C|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY||{"destination":"192.1.1.1/24","eni_id":"oid:0x6d0000000000b1","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x710000000000af||{"destination":"fe80::886a:feff:fe31:bfe0/32","eni_id":"oid:0x6d0000000000b2","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x710000000000b0 -2022-11-17.15:01:04.304429|g|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.1.1.1/24","eni_id":"oid:0x6d0000000000b1","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0 -2022-11-17.15:01:04.305140|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x710000000000af -2022-11-17.15:01:04.305194|g|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"fe80::886a:feff:fe31:bfe0/32","eni_id":"oid:0x6d0000000000b2","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0 -2022-11-17.15:01:04.305774|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x710000000000b0 -2022-11-17.15:01:04.305822|R|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY||{"destination":"192.1.1.1/24","eni_id":"oid:0x6d0000000000b1","switch_id":"oid:0x21000000000000"}||{"destination":"fe80::886a:feff:fe31:bfe0/32","eni_id":"oid:0x6d0000000000b2","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.306284|r|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000b1 -2022-11-17.15:01:04.306706|r|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000b2 -2022-11-17.15:01:04.307119|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000af -2022-11-17.15:01:04.307526|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b0 -2022-11-17.15:01:04.308017|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b3|SAI_VNET_ATTR_VNI=101 -2022-11-17.15:01:04.308505|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b4|SAI_VNET_ATTR_VNI=102 -2022-11-17.15:01:04.309013|c|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000b5|SAI_ENI_ATTR_VNET_ID=oid:0x710000000000b3 -2022-11-17.15:01:04.309511|c|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000b6|SAI_ENI_ATTR_VNET_ID=oid:0x710000000000b4 -2022-11-17.15:01:04.310006|C|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY||{"destination":"192.1.1.1/24","eni_id":"oid:0x6d0000000000b5","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x710000000000b3||{"destination":"fe80::886a:feff:fe31:bfe0/32","eni_id":"oid:0x6d0000000000b6","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x710000000000b4 -2022-11-17.15:01:04.310513|R|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY||{"destination":"192.1.1.1/24","eni_id":"oid:0x6d0000000000b5","switch_id":"oid:0x21000000000000"}||{"destination":"fe80::886a:feff:fe31:bfe0/32","eni_id":"oid:0x6d0000000000b6","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.311049|r|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000b5 -2022-11-17.15:01:04.311483|r|SAI_OBJECT_TYPE_ENI:oid:0x6d0000000000b6 -2022-11-17.15:01:04.311891|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b3 -2022-11-17.15:01:04.312295|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b4 -2022-11-17.15:01:04.312788|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b7|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.313295|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b8|SAI_VNET_ATTR_VNI=20 -2022-11-17.15:01:04.313783|C|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY||{"dip":"192.1.1.1","dst_vnet_id":"oid:0x710000000000b7","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=fe80::886a:feff:fe31:bfe1|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:11:22:33:44:55|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true||{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x710000000000b8","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=192.1.1.2|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:11:22:33:44:56|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false -2022-11-17.15:01:04.314326|g|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.1.1.1","dst_vnet_id":"oid:0x710000000000b7","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=0.0.0.0|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:00:00:00:00:00|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false +2022-11-17.15:01:04.297675|R|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY||{"sip":"192.1.1.1","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e0080000000ab"}||{"sip":"192.2.2.2","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e0080000000ac"} +2022-11-17.15:01:04.298108|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000ab +2022-11-17.15:01:04.298604|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000ac +2022-11-17.15:01:04.299110|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000ad|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.299600|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000ae|SAI_VNET_ATTR_VNI=20 +2022-11-17.15:01:04.300070|C|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY||{"sip":"192.1.1.1","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e0080000000ad"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT||{"sip":"192.2.2.2","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e0080000000ae"}|SAI_PA_VALIDATION_ENTRY_ATTR_ACTION=SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT +2022-11-17.15:01:04.300539|R|SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY||{"sip":"192.1.1.1","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e0080000000ad"}||{"sip":"192.2.2.2","switch_id":"oid:0x21000000000000","vnet_id":"oid:0x0e0080000000ae"} +2022-11-17.15:01:04.301009|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000ad +2022-11-17.15:01:04.301434|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000ae +2022-11-17.15:01:04.301926|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000af|SAI_VNET_ATTR_VNI=101 +2022-11-17.15:01:04.302418|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b0|SAI_VNET_ATTR_VNI=102 +2022-11-17.15:01:04.302911|c|SAI_OBJECT_TYPE_ENI:oid:0x070080000000b1|SAI_ENI_ATTR_VNET_ID=oid:0x0e0080000000af +2022-11-17.15:01:04.303405|c|SAI_OBJECT_TYPE_ENI:oid:0x070080000000b2|SAI_ENI_ATTR_VNET_ID=oid:0x0e0080000000b0 +2022-11-17.15:01:04.303897|C|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY||{"destination":"192.1.1.1/24","eni_id":"oid:0x070080000000b1","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0e0080000000af||{"destination":"fe80::886a:feff:fe31:bfe0/32","eni_id":"oid:0x070080000000b2","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0e0080000000b0 +2022-11-17.15:01:04.304429|g|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"192.1.1.1/24","eni_id":"oid:0x070080000000b1","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0 +2022-11-17.15:01:04.305140|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0e0080000000af +2022-11-17.15:01:04.305194|g|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY:{"destination":"fe80::886a:feff:fe31:bfe0/32","eni_id":"oid:0x070080000000b2","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0 +2022-11-17.15:01:04.305774|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0e0080000000b0 +2022-11-17.15:01:04.305822|R|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY||{"destination":"192.1.1.1/24","eni_id":"oid:0x070080000000b1","switch_id":"oid:0x21000000000000"}||{"destination":"fe80::886a:feff:fe31:bfe0/32","eni_id":"oid:0x070080000000b2","switch_id":"oid:0x21000000000000"} +2022-11-17.15:01:04.306284|r|SAI_OBJECT_TYPE_ENI:oid:0x070080000000b1 +2022-11-17.15:01:04.306706|r|SAI_OBJECT_TYPE_ENI:oid:0x070080000000b2 +2022-11-17.15:01:04.307119|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000af +2022-11-17.15:01:04.307526|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b0 +2022-11-17.15:01:04.308017|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b3|SAI_VNET_ATTR_VNI=101 +2022-11-17.15:01:04.308505|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b4|SAI_VNET_ATTR_VNI=102 +2022-11-17.15:01:04.309013|c|SAI_OBJECT_TYPE_ENI:oid:0x070080000000b5|SAI_ENI_ATTR_VNET_ID=oid:0x0e0080000000b3 +2022-11-17.15:01:04.309511|c|SAI_OBJECT_TYPE_ENI:oid:0x070080000000b6|SAI_ENI_ATTR_VNET_ID=oid:0x0e0080000000b4 +2022-11-17.15:01:04.310006|C|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY||{"destination":"192.1.1.1/24","eni_id":"oid:0x070080000000b5","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0e0080000000b3||{"destination":"fe80::886a:feff:fe31:bfe0/32","eni_id":"oid:0x070080000000b6","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET|SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID=oid:0x0e0080000000b4 +2022-11-17.15:01:04.310513|R|SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY||{"destination":"192.1.1.1/24","eni_id":"oid:0x070080000000b5","switch_id":"oid:0x21000000000000"}||{"destination":"fe80::886a:feff:fe31:bfe0/32","eni_id":"oid:0x070080000000b6","switch_id":"oid:0x21000000000000"} +2022-11-17.15:01:04.311049|r|SAI_OBJECT_TYPE_ENI:oid:0x070080000000b5 +2022-11-17.15:01:04.311483|r|SAI_OBJECT_TYPE_ENI:oid:0x070080000000b6 +2022-11-17.15:01:04.311891|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b3 +2022-11-17.15:01:04.312295|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b4 +2022-11-17.15:01:04.312788|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b7|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.313295|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b8|SAI_VNET_ATTR_VNI=20 +2022-11-17.15:01:04.313783|C|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY||{"dip":"192.1.1.1","dst_vnet_id":"oid:0x0e0080000000b7","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=fe80::886a:feff:fe31:bfe1|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:11:22:33:44:55|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true||{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e0080000000b8","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=192.1.1.2|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:11:22:33:44:56|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false +2022-11-17.15:01:04.314326|g|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"192.1.1.1","dst_vnet_id":"oid:0x0e0080000000b7","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=0.0.0.0|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:00:00:00:00:00|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false 2022-11-17.15:01:04.314936|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=fe80::886a:feff:fe31:bfe1|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:11:22:33:44:55|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true -2022-11-17.15:01:04.314997|g|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x710000000000b8","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=0.0.0.0|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:00:00:00:00:00|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false +2022-11-17.15:01:04.314997|g|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY:{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e0080000000b8","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=0.0.0.0|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:00:00:00:00:00|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false 2022-11-17.15:01:04.315593|G|SAI_STATUS_SUCCESS|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=192.1.1.2|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:11:22:33:44:56|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false -2022-11-17.15:01:04.315635|R|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY||{"dip":"192.1.1.1","dst_vnet_id":"oid:0x710000000000b7","switch_id":"oid:0x21000000000000"}||{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x710000000000b8","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.316091|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b7 -2022-11-17.15:01:04.316517|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b8 -2022-11-17.15:01:04.317026|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b9|SAI_VNET_ATTR_VNI=10 -2022-11-17.15:01:04.317585|c|SAI_OBJECT_TYPE_VNET:oid:0x710000000000ba|SAI_VNET_ATTR_VNI=20 -2022-11-17.15:01:04.318068|C|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY||{"dip":"192.1.1.1","dst_vnet_id":"oid:0x710000000000b9","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=fe80::886a:feff:fe31:bfe1|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:11:22:33:44:55|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true||{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x710000000000ba","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=192.1.1.2|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:11:22:33:44:56|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false -2022-11-17.15:01:04.318591|R|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY||{"dip":"192.1.1.1","dst_vnet_id":"oid:0x710000000000b9","switch_id":"oid:0x21000000000000"}||{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x710000000000ba","switch_id":"oid:0x21000000000000"} -2022-11-17.15:01:04.319049|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000b9 -2022-11-17.15:01:04.319471|r|SAI_OBJECT_TYPE_VNET:oid:0x710000000000ba +2022-11-17.15:01:04.315635|R|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY||{"dip":"192.1.1.1","dst_vnet_id":"oid:0x0e0080000000b7","switch_id":"oid:0x21000000000000"}||{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e0080000000b8","switch_id":"oid:0x21000000000000"} +2022-11-17.15:01:04.316091|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b7 +2022-11-17.15:01:04.316517|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b8 +2022-11-17.15:01:04.317026|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b9|SAI_VNET_ATTR_VNI=10 +2022-11-17.15:01:04.317585|c|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000ba|SAI_VNET_ATTR_VNI=20 +2022-11-17.15:01:04.318068|C|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY||{"dip":"192.1.1.1","dst_vnet_id":"oid:0x0e0080000000b9","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=fe80::886a:feff:fe31:bfe1|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:11:22:33:44:55|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=true||{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e0080000000ba","switch_id":"oid:0x21000000000000"}|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP=192.1.1.2|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC=00:11:22:33:44:56|SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_USE_DST_VNET_VNI=false +2022-11-17.15:01:04.318591|R|SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY||{"dip":"192.1.1.1","dst_vnet_id":"oid:0x0e0080000000b9","switch_id":"oid:0x21000000000000"}||{"dip":"fe80::886a:feff:fe31:bfe0","dst_vnet_id":"oid:0x0e0080000000ba","switch_id":"oid:0x21000000000000"} +2022-11-17.15:01:04.319049|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000b9 +2022-11-17.15:01:04.319471|r|SAI_OBJECT_TYPE_VNET:oid:0x0e0080000000ba diff --git a/unittest/lib/TestVirtualObjectIdManager.cpp b/unittest/lib/TestVirtualObjectIdManager.cpp index 9832edf59..9edb676be 100644 --- a/unittest/lib/TestVirtualObjectIdManager.cpp +++ b/unittest/lib/TestVirtualObjectIdManager.cpp @@ -2,6 +2,10 @@ #include "meta/NumberOidIndexGenerator.h" +extern "C" { +#include "saimetadata.h" +} + #include "swss/logger.h" #include @@ -97,3 +101,14 @@ TEST(VirtualObjectIdManager, allocateNewObjectId) EXPECT_THROW(m->allocateNewObjectId(SAI_OBJECT_TYPE_PORT, 1), std::runtime_error); } + +TEST(VirtualObjectIdManager, extensions) +{ + auto m = createVirtualObjectIdManager(); + + auto sid = m->allocateNewSwitchObjectId(""); + + EXPECT_EQ(m->allocateNewObjectId((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP,sid), 0x0003008000000001); + + EXPECT_EQ(m->objectTypeQuery(0x0003008000000001), SAI_OBJECT_TYPE_DASH_ACL_GROUP); +} diff --git a/unittest/meta/TestSaiSerialize.cpp b/unittest/meta/TestSaiSerialize.cpp index 563142075..b7e0c97d6 100644 --- a/unittest/meta/TestSaiSerialize.cpp +++ b/unittest/meta/TestSaiSerialize.cpp @@ -58,9 +58,9 @@ TEST(SaiSerialize, sai_serialize_object_meta_key) memset(&mk, 0, sizeof(mk)); - for (int32_t i = SAI_OBJECT_TYPE_NULL+1; i < SAI_OBJECT_TYPE_EXTENSIONS_MAX; i++) + for (size_t i = 1; i < sai_metadata_enum_sai_object_type_t.valuescount; ++i) { - mk.objecttype = (sai_object_type_t)i; + mk.objecttype = (sai_object_type_t)sai_metadata_enum_sai_object_type_t.values[i]; auto s = sai_serialize_object_meta_key(mk); diff --git a/unittest/vslib/TestRealObjectIdManager.cpp b/unittest/vslib/TestRealObjectIdManager.cpp index 3bfef6e4b..77503dca2 100644 --- a/unittest/vslib/TestRealObjectIdManager.cpp +++ b/unittest/vslib/TestRealObjectIdManager.cpp @@ -1,5 +1,9 @@ #include "RealObjectIdManager.h" +extern "C" { +#include "saimetadata.h" +} + #include #include @@ -86,5 +90,21 @@ TEST(RealObjectIdManager, allocateNewObjectId) } +TEST(RealObjectIdManager, extensions) +{ + auto sc = std::make_shared(0,""); + + auto scc = std::make_shared(); + scc->insert(sc); + RealObjectIdManager mgr(0, scc); + + auto sid = mgr.allocateNewSwitchObjectId(""); + + EXPECT_NE(sid, SAI_NULL_OBJECT_ID); + + EXPECT_EQ(mgr.allocateNewObjectId((sai_object_type_t)SAI_OBJECT_TYPE_DASH_ACL_GROUP,sid), 0x0380000000); + + EXPECT_EQ(mgr.objectTypeQuery(0x0380000000), SAI_OBJECT_TYPE_DASH_ACL_GROUP); +} diff --git a/vslib/RealObjectIdManager.cpp b/vslib/RealObjectIdManager.cpp index 71a4acfe2..52574eb26 100644 --- a/vslib/RealObjectIdManager.cpp +++ b/vslib/RealObjectIdManager.cpp @@ -26,7 +26,11 @@ static_assert(sizeof(sai_object_id_t) == sizeof(uint64_t), "SAI object ID size s #define SAI_VS_OBJECT_TYPE_MAX ( (1ULL << SAI_VS_OBJECT_TYPE_BITS_SIZE) - 1 ) #define SAI_VS_OBJECT_TYPE_MASK (SAI_VS_OBJECT_TYPE_MAX) -#define SAI_VS_OBJECT_INDEX_BITS_SIZE ( 32 ) +#define SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE ( 1 ) +#define SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ( (1ULL << SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE) - 1 ) +#define SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_MASK (SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX) + +#define SAI_VS_OBJECT_INDEX_BITS_SIZE ( 31 ) #define SAI_VS_OBJECT_INDEX_MAX ( (1ULL << SAI_VS_OBJECT_INDEX_BITS_SIZE) - 1 ) #define SAI_VS_OBJECT_INDEX_MASK (SAI_VS_OBJECT_INDEX_MAX) @@ -35,6 +39,7 @@ static_assert(sizeof(sai_object_id_t) == sizeof(uint64_t), "SAI object ID size s SAI_VS_GLOBAL_CONTEXT_BITS_SIZE + \ SAI_VS_SWITCH_INDEX_BITS_SIZE + \ SAI_VS_OBJECT_TYPE_BITS_SIZE + \ + SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + \ SAI_VS_OBJECT_INDEX_BITS_SIZE ) static_assert(SAI_VS_OBJECT_ID_BITS_SIZE == SAI_OBJECT_ID_BITS_SIZE, "vs object id size must be equal to SAI object id size"); @@ -43,7 +48,9 @@ static_assert(SAI_VS_OBJECT_ID_BITS_SIZE == SAI_OBJECT_ID_BITS_SIZE, "vs object * This condition must be met, since we need to be able to encode SAI object * type in object id on defined number of bits. */ -static_assert(SAI_OBJECT_TYPE_EXTENSIONS_MAX < SAI_VS_OBJECT_TYPE_MAX, "vs max object type value must be greater than supported SAI max objeect type value"); +static_assert(SAI_OBJECT_TYPE_MAX < 256, "object type must be possible to encode on 1 byte"); +static_assert((SAI_OBJECT_TYPE_EXTENSIONS_RANGE_END - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) < 256, + "extensions object type must be possible to encode on 1 byte"); /* * Current OBJECT ID format: @@ -52,31 +59,43 @@ static_assert(SAI_OBJECT_TYPE_EXTENSIONS_MAX < SAI_VS_OBJECT_TYPE_MAX, "vs max o * bits 55..48 - global context * bits 47..40 - switch index * bits 49..32 - SAI object type - * bits 31..0 - object index + * bits 31..31 - object type extension flag + * bits 30..0 - object index * * So large number of bits is required, otherwise we would need to have map of * OID to some struct that will have all those values. But having all this * information in OID itself is more convenient. + * + * To be backward compatible with previous sairedis, we will still encode base + * object type on bit's 49..32, and extensions which will now start from range + * 0x20000000, will be encoded from 0x0, but extensions flag will be set to 1. + * + * For example SAI_OBJECT_TYPE_VIRTUAL_ROUTER oid will be encoded as 0x0300000001 + * SAI_OBJECT_TYPE_DASH_ACL_GROUP oid will be encoded as 0x000380000000 */ #define SAI_VS_GET_OBJECT_INDEX(oid) \ ( ((uint64_t)oid) & ( SAI_VS_OBJECT_INDEX_MASK ) ) +#define SAI_VS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(oid) \ + ( (((uint64_t)oid) >> (SAI_VS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_MAX ) ) + #define SAI_VS_GET_OBJECT_TYPE(oid) \ - ( (((uint64_t)oid) >> ( SAI_VS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_VS_OBJECT_TYPE_MASK ) ) + ( (((uint64_t)oid) >> ( SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_VS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_VS_OBJECT_TYPE_MASK ) ) #define SAI_VS_GET_SWITCH_INDEX(oid) \ - ( (((uint64_t)oid) >> ( SAI_VS_OBJECT_TYPE_BITS_SIZE + SAI_VS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_VS_SWITCH_INDEX_MASK ) ) + ( (((uint64_t)oid) >> ( SAI_VS_OBJECT_TYPE_BITS_SIZE + SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_VS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_VS_SWITCH_INDEX_MASK ) ) #define SAI_VS_GET_GLOBAL_CONTEXT(oid) \ - ( (((uint64_t)oid) >> ( SAI_VS_SWITCH_INDEX_BITS_SIZE + SAI_VS_OBJECT_TYPE_BITS_SIZE + SAI_VS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_VS_GLOBAL_CONTEXT_MASK ) ) + ( (((uint64_t)oid) >> ( SAI_VS_SWITCH_INDEX_BITS_SIZE + SAI_VS_OBJECT_TYPE_BITS_SIZE + SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_VS_OBJECT_INDEX_BITS_SIZE) ) & ( SAI_VS_GLOBAL_CONTEXT_MASK ) ) -#define SAI_VS_TEST_OID (0x0123456789abcdef) +#define SAI_VS_TEST_OID (0x01234567f9abcdef) static_assert(SAI_VS_GET_GLOBAL_CONTEXT(SAI_VS_TEST_OID) == 0x23, "test global context"); static_assert(SAI_VS_GET_SWITCH_INDEX(SAI_VS_TEST_OID) == 0x45, "test switch index"); static_assert(SAI_VS_GET_OBJECT_TYPE(SAI_VS_TEST_OID) == 0x67, "test object type"); -static_assert(SAI_VS_GET_OBJECT_INDEX(SAI_VS_TEST_OID) == 0x89abcdef, "test object index"); +static_assert(SAI_VS_GET_OBJECT_INDEX(SAI_VS_TEST_OID) == 0x79abcdef, "test object index"); +static_assert(SAI_VS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(SAI_VS_TEST_OID) == 0x1, "test object type extensions flag"); using namespace saivs; @@ -144,9 +163,11 @@ sai_object_type_t RealObjectIdManager::saiObjectTypeQuery( return SAI_OBJECT_TYPE_NULL; } - sai_object_type_t objectType = (sai_object_type_t)(SAI_VS_GET_OBJECT_TYPE(objectId)); + sai_object_type_t objectType = SAI_VS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(objectId) + ? (sai_object_type_t)(SAI_VS_GET_OBJECT_TYPE(objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) + : (sai_object_type_t)(SAI_VS_GET_OBJECT_TYPE(objectId)); - if (objectType == SAI_OBJECT_TYPE_NULL || objectType >= SAI_OBJECT_TYPE_EXTENSIONS_MAX) + if (sai_metadata_is_object_type_valid(objectType) == false) { SWSS_LOG_ERROR("invalid object id %s", sai_serialize_object_id(objectId).c_str()); @@ -201,7 +222,7 @@ sai_object_id_t RealObjectIdManager::allocateNewObjectId( { SWSS_LOG_ENTER(); - if ((objectType <= SAI_OBJECT_TYPE_NULL) || (objectType >= SAI_OBJECT_TYPE_EXTENSIONS_MAX)) + if (sai_metadata_is_object_type_valid(objectType) == false) { SWSS_LOG_THROW("invalid objct type: %d", objectType); } @@ -291,10 +312,22 @@ sai_object_id_t RealObjectIdManager::constructObjectId( { SWSS_LOG_ENTER(); + if (sai_metadata_is_object_type_valid(objectType) == false) + { + SWSS_LOG_THROW("FATAL: invalid object type (0x%x), logic error, this is a bug!", objectType); + } + + uint64_t extensionsFlag = (uint64_t)objectType >= SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START; + + objectType = extensionsFlag + ? (sai_object_type_t)(objectType - SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) + : objectType; + return (sai_object_id_t)( - ((uint64_t)globalContext << ( SAI_VS_SWITCH_INDEX_BITS_SIZE + SAI_VS_OBJECT_TYPE_BITS_SIZE + SAI_VS_OBJECT_INDEX_BITS_SIZE )) | - ((uint64_t)switchIndex << ( SAI_VS_OBJECT_TYPE_BITS_SIZE + SAI_VS_OBJECT_INDEX_BITS_SIZE )) | - ((uint64_t)objectType << ( SAI_VS_OBJECT_INDEX_BITS_SIZE)) | + ((uint64_t)globalContext << ( SAI_VS_SWITCH_INDEX_BITS_SIZE + SAI_VS_OBJECT_TYPE_BITS_SIZE + SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_VS_OBJECT_INDEX_BITS_SIZE )) | + ((uint64_t)switchIndex << ( SAI_VS_OBJECT_TYPE_BITS_SIZE + SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_VS_OBJECT_INDEX_BITS_SIZE )) | + ((uint64_t)objectType << ( SAI_VS_OBJECT_TYPE_EXTENSIONS_FLAG_BITS_SIZE + SAI_VS_OBJECT_INDEX_BITS_SIZE)) | + ((uint64_t)extensionsFlag << (SAI_VS_OBJECT_INDEX_BITS_SIZE)) | objectIndex); } @@ -339,7 +372,9 @@ sai_object_type_t RealObjectIdManager::objectTypeQuery( return SAI_OBJECT_TYPE_NULL; } - sai_object_type_t objectType = (sai_object_type_t)(SAI_VS_GET_OBJECT_TYPE(objectId)); + sai_object_type_t objectType = SAI_VS_GET_OBJECT_TYPE_EXTENSIONS_FLAG(objectId) + ? (sai_object_type_t)(SAI_VS_GET_OBJECT_TYPE(objectId) + SAI_OBJECT_TYPE_EXTENSIONS_RANGE_START) + : (sai_object_type_t)(SAI_VS_GET_OBJECT_TYPE(objectId)); if (!sai_metadata_is_object_type_valid(objectType)) { diff --git a/vslib/SaiUnittests.cpp b/vslib/SaiUnittests.cpp index 6015a0d00..430623e8b 100644 --- a/vslib/SaiUnittests.cpp +++ b/vslib/SaiUnittests.cpp @@ -79,7 +79,7 @@ void Sai::channelOpSetReadOnlyAttribute( sai_object_type_t object_type; sai_deserialize_object_type(str_object_type, object_type); - if (object_type == SAI_OBJECT_TYPE_NULL || object_type >= SAI_OBJECT_TYPE_EXTENSIONS_MAX) + if (sai_metadata_is_object_type_valid(object_type) == false) { SWSS_LOG_ERROR("invalid object type: %d", object_type); return; diff --git a/vslib/SwitchState.cpp b/vslib/SwitchState.cpp index 1dfed4860..886c8a2f1 100644 --- a/vslib/SwitchState.cpp +++ b/vslib/SwitchState.cpp @@ -45,14 +45,14 @@ SwitchState::SwitchState( sai_serialize_object_type(RealObjectIdManager::objectTypeQuery(switch_id)).c_str()); } - for (int i = SAI_OBJECT_TYPE_NULL; i < (int)SAI_OBJECT_TYPE_EXTENSIONS_MAX; ++i) + for (size_t i = 0; i < sai_metadata_enum_sai_object_type_t.valuescount; ++i) { /* * Populate empty maps for each object to avoid checking if * objecttype exists. */ - m_objectHash[(sai_object_type_t)i] = { }; + m_objectHash[(sai_object_type_t)sai_metadata_enum_sai_object_type_t.values[i]] = { }; } /*