diff --git a/orchagent/Makefile.am b/orchagent/Makefile.am index 6a0d8ea6d89a..d65ff773b980 100644 --- a/orchagent/Makefile.am +++ b/orchagent/Makefile.am @@ -41,6 +41,7 @@ orchagent_SOURCES = \ request_parser.cpp \ vrforch.cpp \ countercheckorch.cpp \ + flexcounterorch.cpp\ acltable.h \ aclorch.h \ bufferorch.h \ @@ -66,7 +67,8 @@ orchagent_SOURCES = \ crmorch.h request_parser.h \ vrforch.h \ - countercheckorch.h + countercheckorch.h \ + flexcounterorch.h orchagent_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) orchagent_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI) diff --git a/orchagent/flexcounterorch.cpp b/orchagent/flexcounterorch.cpp new file mode 100644 index 000000000000..69f94284e109 --- /dev/null +++ b/orchagent/flexcounterorch.cpp @@ -0,0 +1,76 @@ +#include +#include "flexcounterorch.h" +#include "portsorch.h" +#include "select.h" +#include "notifier.h" +#include "redisclient.h" +#include "sai_serialize.h" + +extern sai_port_api_t *sai_port_api; + +extern PortsOrch *gPortsOrch; + +unordered_map flexCounterGroupMap = +{ + {"PORT", PORT_STAT_COUNTER_FLEX_COUNTER_GROUP}, + {"QUEUE", QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP}, +}; + +FlexCounterOrch::FlexCounterOrch(DBConnector *db, vector &tableNames): + Orch(db, tableNames), + m_flexCounterDb(new DBConnector(FLEX_COUNTER_DB, DBConnector::DEFAULT_UNIXSOCKET, 0)), + m_flexCounterGroupTable(new ProducerTable(m_flexCounterDb.get(), FLEX_COUNTER_GROUP_TABLE)) +{ + SWSS_LOG_ENTER(); +} + +FlexCounterOrch::~FlexCounterOrch(void) +{ + SWSS_LOG_ENTER(); +} + +void FlexCounterOrch::doTask(Consumer &consumer) +{ + SWSS_LOG_ENTER(); + + if (!gPortsOrch->isInitDone()) + { + return; + } + + auto it = consumer.m_toSync.begin(); + while (it != consumer.m_toSync.end()) + { + KeyOpFieldsValuesTuple t = it->second; + + string key = kfvKey(t); + string op = kfvOp(t); + auto data = kfvFieldsValues(t); + + if (!flexCounterGroupMap.count(key)) + { + SWSS_LOG_NOTICE("Invalid flex counter group input, %s", key.c_str()); + consumer.m_toSync.erase(it++); + continue; + } + + if (op == SET_COMMAND) + { + for (auto valuePair:data) + { + const auto &field = fvField(valuePair); + const auto &value = fvValue(valuePair); + + if (field == POLL_INTERVAL_FIELD) + { + vector fieldValues; + fieldValues.emplace_back(POLL_INTERVAL_FIELD, value); + m_flexCounterGroupTable->set(flexCounterGroupMap[key], fieldValues); + } + /* In future add the support to disable/enable counter query here.*/ + } + } + + consumer.m_toSync.erase(it++); + } +} diff --git a/orchagent/flexcounterorch.h b/orchagent/flexcounterorch.h new file mode 100644 index 000000000000..c651a49d3866 --- /dev/null +++ b/orchagent/flexcounterorch.h @@ -0,0 +1,24 @@ +#ifndef FLEXCOUNTER_ORCH_H +#define FLEXCOUNTER_ORCH_H + +#include "orch.h" +#include "port.h" +#include "producertable.h" + +extern "C" { +#include "sai.h" +} + +class FlexCounterOrch: public Orch +{ +public: + void doTask(Consumer &consumer); + FlexCounterOrch(DBConnector *db, vector &tableNames); + virtual ~FlexCounterOrch(void); + +private: + shared_ptr m_flexCounterDb = nullptr; + shared_ptr m_flexCounterGroupTable = nullptr; +}; + +#endif diff --git a/orchagent/orchdaemon.cpp b/orchagent/orchdaemon.cpp index 50af799cd323..91aa39ffc377 100644 --- a/orchagent/orchdaemon.cpp +++ b/orchagent/orchdaemon.cpp @@ -108,6 +108,13 @@ bool OrchDaemon::init() m_orchList = { switch_orch, gCrmOrch, gPortsOrch, intfs_orch, gNeighOrch, gRouteOrch, copp_orch, tunnel_decap_orch, qos_orch, buffer_orch, mirror_orch, gAclOrch, gFdbOrch, vrf_orch }; m_select = new Select(); + + vector flex_counter_tables = { + CFG_FLEX_COUNTER_TABLE_NAME + }; + + m_orchList.push_back(new FlexCounterOrch(m_configDb, flex_counter_tables)); + vector pfc_wd_tables = { CFG_PFC_WD_TABLE_NAME }; diff --git a/orchagent/orchdaemon.h b/orchagent/orchdaemon.h index c7a96a2b0bbf..5a7d8aac6319 100644 --- a/orchagent/orchdaemon.h +++ b/orchagent/orchdaemon.h @@ -22,6 +22,7 @@ #include "crmorch.h" #include "vrforch.h" #include "countercheckorch.h" +#include "flexcounterorch.h" using namespace swss; diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index a4689a431011..105118a9a25d 100644 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -36,8 +36,6 @@ extern CrmOrch *gCrmOrch; #define DEFAULT_VLAN_ID 1 #define PORT_FLEX_STAT_COUNTER_POLL_MSECS "1000" #define QUEUE_FLEX_STAT_COUNTER_POLL_MSECS "10000" -#define PORT_STAT_COUNTER_FLEX_COUNTER_GROUP "PORT_STAT_COUNTER" -#define QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP "QUEUE_STAT_COUNTER" static map fec_mode_map = { diff --git a/orchagent/portsorch.h b/orchagent/portsorch.h index 5aaed08ae9c6..6abb31f6269a 100644 --- a/orchagent/portsorch.h +++ b/orchagent/portsorch.h @@ -12,6 +12,9 @@ #define FCS_LEN 4 #define VLAN_TAG_LEN 4 +#define PORT_STAT_COUNTER_FLEX_COUNTER_GROUP "PORT_STAT_COUNTER" +#define QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP "QUEUE_STAT_COUNTER" + typedef std::vector PortSupportedSpeeds;