Skip to content

Commit 8c23538

Browse files
authored
[flexcounter]: add support to change port/queue counter poll interval (sonic-net#499)
Signed-off-by: Sihui Han <[email protected]>
1 parent 8d810be commit 8c23538

File tree

7 files changed

+114
-3
lines changed

7 files changed

+114
-3
lines changed

orchagent/Makefile.am

+3-1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ orchagent_SOURCES = \
4141
request_parser.cpp \
4242
vrforch.cpp \
4343
countercheckorch.cpp \
44+
flexcounterorch.cpp\
4445
acltable.h \
4546
aclorch.h \
4647
bufferorch.h \
@@ -66,7 +67,8 @@ orchagent_SOURCES = \
6667
crmorch.h
6768
request_parser.h \
6869
vrforch.h \
69-
countercheckorch.h
70+
countercheckorch.h \
71+
flexcounterorch.h
7072

7173
orchagent_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
7274
orchagent_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)

orchagent/flexcounterorch.cpp

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#include <unordered_map>
2+
#include "flexcounterorch.h"
3+
#include "portsorch.h"
4+
#include "select.h"
5+
#include "notifier.h"
6+
#include "redisclient.h"
7+
#include "sai_serialize.h"
8+
9+
extern sai_port_api_t *sai_port_api;
10+
11+
extern PortsOrch *gPortsOrch;
12+
13+
unordered_map<string, string> flexCounterGroupMap =
14+
{
15+
{"PORT", PORT_STAT_COUNTER_FLEX_COUNTER_GROUP},
16+
{"QUEUE", QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP},
17+
};
18+
19+
FlexCounterOrch::FlexCounterOrch(DBConnector *db, vector<string> &tableNames):
20+
Orch(db, tableNames),
21+
m_flexCounterDb(new DBConnector(FLEX_COUNTER_DB, DBConnector::DEFAULT_UNIXSOCKET, 0)),
22+
m_flexCounterGroupTable(new ProducerTable(m_flexCounterDb.get(), FLEX_COUNTER_GROUP_TABLE))
23+
{
24+
SWSS_LOG_ENTER();
25+
}
26+
27+
FlexCounterOrch::~FlexCounterOrch(void)
28+
{
29+
SWSS_LOG_ENTER();
30+
}
31+
32+
void FlexCounterOrch::doTask(Consumer &consumer)
33+
{
34+
SWSS_LOG_ENTER();
35+
36+
if (!gPortsOrch->isInitDone())
37+
{
38+
return;
39+
}
40+
41+
auto it = consumer.m_toSync.begin();
42+
while (it != consumer.m_toSync.end())
43+
{
44+
KeyOpFieldsValuesTuple t = it->second;
45+
46+
string key = kfvKey(t);
47+
string op = kfvOp(t);
48+
auto data = kfvFieldsValues(t);
49+
50+
if (!flexCounterGroupMap.count(key))
51+
{
52+
SWSS_LOG_NOTICE("Invalid flex counter group input, %s", key.c_str());
53+
consumer.m_toSync.erase(it++);
54+
continue;
55+
}
56+
57+
if (op == SET_COMMAND)
58+
{
59+
for (auto valuePair:data)
60+
{
61+
const auto &field = fvField(valuePair);
62+
const auto &value = fvValue(valuePair);
63+
64+
if (field == POLL_INTERVAL_FIELD)
65+
{
66+
vector<FieldValueTuple> fieldValues;
67+
fieldValues.emplace_back(POLL_INTERVAL_FIELD, value);
68+
m_flexCounterGroupTable->set(flexCounterGroupMap[key], fieldValues);
69+
}
70+
/* In future add the support to disable/enable counter query here.*/
71+
}
72+
}
73+
74+
consumer.m_toSync.erase(it++);
75+
}
76+
}

orchagent/flexcounterorch.h

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#ifndef FLEXCOUNTER_ORCH_H
2+
#define FLEXCOUNTER_ORCH_H
3+
4+
#include "orch.h"
5+
#include "port.h"
6+
#include "producertable.h"
7+
8+
extern "C" {
9+
#include "sai.h"
10+
}
11+
12+
class FlexCounterOrch: public Orch
13+
{
14+
public:
15+
void doTask(Consumer &consumer);
16+
FlexCounterOrch(DBConnector *db, vector<string> &tableNames);
17+
virtual ~FlexCounterOrch(void);
18+
19+
private:
20+
shared_ptr<DBConnector> m_flexCounterDb = nullptr;
21+
shared_ptr<ProducerTable> m_flexCounterGroupTable = nullptr;
22+
};
23+
24+
#endif

orchagent/orchdaemon.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@ bool OrchDaemon::init()
108108
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 };
109109
m_select = new Select();
110110

111+
112+
vector<string> flex_counter_tables = {
113+
CFG_FLEX_COUNTER_TABLE_NAME
114+
};
115+
116+
m_orchList.push_back(new FlexCounterOrch(m_configDb, flex_counter_tables));
117+
111118
vector<string> pfc_wd_tables = {
112119
CFG_PFC_WD_TABLE_NAME
113120
};

orchagent/orchdaemon.h

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "crmorch.h"
2323
#include "vrforch.h"
2424
#include "countercheckorch.h"
25+
#include "flexcounterorch.h"
2526

2627
using namespace swss;
2728

orchagent/portsorch.cpp

-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@ extern CrmOrch *gCrmOrch;
3636
#define DEFAULT_VLAN_ID 1
3737
#define PORT_FLEX_STAT_COUNTER_POLL_MSECS "1000"
3838
#define QUEUE_FLEX_STAT_COUNTER_POLL_MSECS "10000"
39-
#define PORT_STAT_COUNTER_FLEX_COUNTER_GROUP "PORT_STAT_COUNTER"
40-
#define QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP "QUEUE_STAT_COUNTER"
4139

4240
static map<string, sai_port_fec_mode_t> fec_mode_map =
4341
{

orchagent/portsorch.h

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212

1313
#define FCS_LEN 4
1414
#define VLAN_TAG_LEN 4
15+
#define PORT_STAT_COUNTER_FLEX_COUNTER_GROUP "PORT_STAT_COUNTER"
16+
#define QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP "QUEUE_STAT_COUNTER"
17+
1518

1619
typedef std::vector<sai_uint32_t> PortSupportedSpeeds;
1720

0 commit comments

Comments
 (0)