6
6
#include < set>
7
7
#include < algorithm>
8
8
#include < tuple>
9
+ #include < sstream>
9
10
10
11
#include < netinet/if_ether.h>
11
12
#include " net/if.h"
@@ -29,6 +30,7 @@ extern sai_object_id_t gSwitchId;
29
30
30
31
#define VLAN_PREFIX " Vlan"
31
32
#define DEFAULT_VLAN_ID 1
33
+ #define FLEX_STAT_COUNTER_POLL_MSECS " 1000"
32
34
33
35
static map<string, sai_port_fec_mode_t > fec_mode_map =
34
36
{
@@ -56,16 +58,19 @@ PortsOrch::PortsOrch(DBConnector *db, vector<string> tableNames) :
56
58
SWSS_LOG_ENTER ();
57
59
58
60
/* Initialize counter table */
59
- DBConnector * counter_db (new DBConnector (COUNTERS_DB, DBConnector::DEFAULT_UNIXSOCKET, 0 ));
60
- m_counterTable = unique_ptr<Table>(new Table (counter_db , COUNTERS_PORT_NAME_MAP));
61
+ m_counter_db = shared_ptr<DBConnector> (new DBConnector (COUNTERS_DB, DBConnector::DEFAULT_UNIXSOCKET, 0 ));
62
+ m_counterTable = unique_ptr<Table>(new Table (m_counter_db. get () , COUNTERS_PORT_NAME_MAP));
61
63
62
64
/* Initialize port table */
63
65
m_portTable = unique_ptr<Table>(new Table (db, APP_PORT_TABLE_NAME));
64
66
65
67
/* Initialize queue tables */
66
- m_queueTable = unique_ptr<Table>(new Table (counter_db, COUNTERS_QUEUE_NAME_MAP));
67
- m_queuePortTable = unique_ptr<Table>(new Table (counter_db, COUNTERS_QUEUE_PORT_MAP));
68
- m_queueIndexTable = unique_ptr<Table>(new Table (counter_db, COUNTERS_QUEUE_INDEX_MAP));
68
+ m_queueTable = unique_ptr<Table>(new Table (m_counter_db.get (), COUNTERS_QUEUE_NAME_MAP));
69
+ m_queuePortTable = unique_ptr<Table>(new Table (m_counter_db.get (), COUNTERS_QUEUE_PORT_MAP));
70
+ m_queueIndexTable = unique_ptr<Table>(new Table (m_counter_db.get (), COUNTERS_QUEUE_INDEX_MAP));
71
+
72
+ m_flex_db = shared_ptr<DBConnector>(new DBConnector (PFC_WD_DB, DBConnector::DEFAULT_UNIXSOCKET, 0 ));
73
+ m_flexCounterTable = unique_ptr<ProducerStateTable>(new ProducerStateTable (m_flex_db.get (), PFC_WD_STATE_TABLE));
69
74
70
75
uint32_t i, j;
71
76
sai_status_t status;
@@ -643,9 +648,25 @@ bool PortsOrch::initPort(const string &alias, const set<int> &lane_set)
643
648
m_portList[alias] = p;
644
649
/* Add port name map to counter table */
645
650
FieldValueTuple tuple (p.m_alias , sai_serialize_object_id (p.m_port_id ));
646
- vector<FieldValueTuple> vector;
647
- vector.push_back (tuple);
648
- m_counterTable->set (" " , vector);
651
+ vector<FieldValueTuple> fields;
652
+ fields.push_back (tuple);
653
+ m_counterTable->set (" " , fields);
654
+
655
+ /* Add port to flex_counter for updating stat counters */
656
+ string key = sai_serialize_object_id (p.m_port_id ) + " :" + FLEX_STAT_COUNTER_POLL_MSECS;
657
+
658
+ std::string delimiter = " " ;
659
+ std::ostringstream counters_stream;
660
+ for (int cntr = SAI_PORT_STAT_IF_IN_OCTETS; cntr <= SAI_PORT_STAT_PFC_7_ON2OFF_RX_PKTS; ++cntr)
661
+ {
662
+ counters_stream << delimiter << sai_serialize_port_stat (static_cast <sai_port_stat_t >(cntr));
663
+ delimiter = " ," ;
664
+ }
665
+
666
+ fields.clear ();
667
+ fields.emplace_back (PFC_WD_PORT_COUNTER_ID_LIST, counters_stream.str ());
668
+
669
+ m_flexCounterTable->set (key, fields);
649
670
650
671
SWSS_LOG_NOTICE (" Initialized port %s" , alias.c_str ());
651
672
}
@@ -1362,6 +1383,7 @@ void PortsOrch::initializeQueues(Port &port)
1362
1383
SWSS_LOG_INFO (" Get queues for port %s" , port.m_alias .c_str ());
1363
1384
1364
1385
/* Create the Queue map in the Counter DB */
1386
+ /* Add stat counters to flex_counter */
1365
1387
vector<FieldValueTuple> queueVector;
1366
1388
vector<FieldValueTuple> queuePortVector;
1367
1389
vector<FieldValueTuple> queueIndexVector;
@@ -1382,6 +1404,21 @@ void PortsOrch::initializeQueues(Port &port)
1382
1404
sai_serialize_object_id (port.m_queue_ids [queueIndex]),
1383
1405
to_string (queueIndex));
1384
1406
queueIndexVector.push_back (queueIndexTuple);
1407
+
1408
+ string key = sai_serialize_object_id (port.m_queue_ids [queueIndex]) + " :" + FLEX_STAT_COUNTER_POLL_MSECS;
1409
+
1410
+ std::string delimiter = " " ;
1411
+ std::ostringstream counters_stream;
1412
+ for (int cntr = SAI_QUEUE_STAT_PACKETS; cntr <= SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES ; ++cntr)
1413
+ {
1414
+ counters_stream << delimiter << sai_serialize_queue_stat (static_cast <sai_queue_stat_t >(cntr));
1415
+ delimiter = " ," ;
1416
+ }
1417
+
1418
+ vector<FieldValueTuple> fieldValues;
1419
+ fieldValues.emplace_back (PFC_WD_QUEUE_COUNTER_ID_LIST, counters_stream.str ());
1420
+
1421
+ m_flexCounterTable->set (key, fieldValues);
1385
1422
}
1386
1423
1387
1424
m_queueTable->set (" " , queueVector);
0 commit comments