Skip to content

Commit 802c14b

Browse files
authored
Merge branch 'master' into buffermgd_admin_status_fix
2 parents 29e3a77 + db1a6c0 commit 802c14b

14 files changed

+255
-13
lines changed

orchagent/dash/dashmeterorch.cpp

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
#include <swss/ipaddress.h>
55
#include <swssnet.h>
66

7+
#include "directory.h"
78
#include "dashmeterorch.h"
89
#include "taskworker.h"
910
#include "pbutils.h"
1011
#include "crmorch.h"
12+
#include "sai.h"
13+
#include "saiextensions.h"
1114
#include "saihelper.h"
1215

1316
using namespace std;
@@ -19,14 +22,40 @@ extern sai_dash_meter_api_t* sai_dash_meter_api;
1922
extern sai_object_id_t gSwitchId;
2023
extern size_t gMaxBulkSize;
2124
extern CrmOrch *gCrmOrch;
25+
extern Directory<Orch*> gDirectory;
26+
extern bool gTraditionalFlexCounter;
2227

28+
#define METER_FLEX_COUNTER_UPD_INTERVAL 1
2329

2430
DashMeterOrch::DashMeterOrch(DBConnector *db, const vector<string> &tables, DashOrch *dash_orch, DBConnector *app_state_db, ZmqServer *zmqServer) :
31+
m_meter_stat_manager(METER_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, METER_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, false),
2532
meter_rule_bulker_(sai_dash_meter_api, gSwitchId, gMaxBulkSize),
2633
ZmqOrch(db, tables, zmqServer),
2734
m_dash_orch(dash_orch)
2835
{
2936
SWSS_LOG_ENTER();
37+
38+
m_counter_db = std::shared_ptr<DBConnector>(new DBConnector("COUNTERS_DB", 0));
39+
m_asic_db = std::shared_ptr<DBConnector>(new DBConnector("ASIC_DB", 0));
40+
41+
if (gTraditionalFlexCounter)
42+
{
43+
m_vid_to_rid_table = std::make_unique<Table>(m_asic_db.get(), "VIDTORID");
44+
}
45+
46+
auto intervT = timespec { .tv_sec = METER_FLEX_COUNTER_UPD_INTERVAL , .tv_nsec = 0 };
47+
m_meter_fc_update_timer = new SelectableTimer(intervT);
48+
auto executorT = new ExecutableTimer(m_meter_fc_update_timer, this, "METER_FLEX_COUNTER_UPD_TIMER");
49+
Orch::addExecutor(executorT);
50+
51+
/* Fetch the meter bucket counter Ids */
52+
m_meter_counter_stats.clear();
53+
auto stat_enum_list = queryAvailableCounterStats((sai_object_type_t)SAI_OBJECT_TYPE_METER_BUCKET_ENTRY);
54+
for (auto &stat_enum: stat_enum_list)
55+
{
56+
auto counter_id = static_cast<sai_meter_bucket_entry_stat_t>(stat_enum);
57+
m_meter_counter_stats.emplace(sai_serialize_meter_bucket_entry_stat(counter_id));
58+
}
3059
}
3160

3261
sai_object_id_t DashMeterOrch::getMeterPolicyOid(const string& meter_policy) const
@@ -590,3 +619,88 @@ void DashMeterOrch::doTask(ConsumerBase& consumer)
590619
SWSS_LOG_ERROR("Unknown table: %s", tn.c_str());
591620
}
592621
}
622+
623+
void DashMeterOrch::addEniToMeterFC(sai_object_id_t oid, const string &name)
624+
{
625+
if (!m_meter_fc_status)
626+
{
627+
return;
628+
}
629+
auto was_empty = m_meter_stat_work_queue.empty();
630+
m_meter_stat_work_queue[oid] = name;
631+
if (was_empty)
632+
{
633+
m_meter_fc_update_timer->start();
634+
}
635+
}
636+
637+
void DashMeterOrch::removeEniFromMeterFC(sai_object_id_t oid, const string &name)
638+
{
639+
SWSS_LOG_ENTER();
640+
641+
if (oid == SAI_NULL_OBJECT_ID)
642+
{
643+
SWSS_LOG_WARN("Cannot remove meter counter on NULL OID for eni %s", name.c_str());
644+
return;
645+
}
646+
if (m_meter_stat_work_queue.find(oid) != m_meter_stat_work_queue.end())
647+
{
648+
m_meter_stat_work_queue.erase(oid);
649+
return;
650+
}
651+
652+
m_meter_stat_manager.clearCounterIdList(oid);
653+
SWSS_LOG_INFO("Unregistering FC for ENI %s, oid %s", name.c_str(), sai_serialize_object_id(oid).c_str());
654+
}
655+
656+
void DashMeterOrch::handleMeterFCStatusUpdate(bool enabled)
657+
{
658+
DashOrch *dash_orch = gDirectory.get<DashOrch*>();
659+
bool prev_enabled = m_meter_fc_status;
660+
m_meter_fc_status = enabled; /* Update the status */
661+
if (!enabled && prev_enabled)
662+
{
663+
m_meter_fc_update_timer->stop();
664+
dash_orch->refreshMeterFCStats(false); /* Clear any existing FC entries */
665+
}
666+
else if (enabled && !prev_enabled)
667+
{
668+
dash_orch->refreshMeterFCStats(true);
669+
m_meter_fc_update_timer->start();
670+
}
671+
}
672+
673+
void DashMeterOrch::doTask(SelectableTimer &timer)
674+
{
675+
SWSS_LOG_ENTER();
676+
677+
if (!m_meter_fc_status)
678+
{
679+
m_meter_fc_update_timer->stop();
680+
return ;
681+
}
682+
683+
for (auto it = m_meter_stat_work_queue.begin(); it != m_meter_stat_work_queue.end(); )
684+
{
685+
string value;
686+
const auto id = sai_serialize_object_id(it->first);
687+
if (!gTraditionalFlexCounter || m_vid_to_rid_table->hget("", id, value))
688+
{
689+
SWSS_LOG_INFO("Registering FC for ENI %s, oid %s", it->second.c_str(), id.c_str());
690+
std::vector<FieldValueTuple> eniNameFvs;
691+
eniNameFvs.emplace_back(it->second, id);
692+
693+
m_meter_stat_manager.setCounterIdList(it->first, CounterType::DASH_METER, m_meter_counter_stats);
694+
it = m_meter_stat_work_queue.erase(it);
695+
}
696+
else
697+
{
698+
++it;
699+
}
700+
}
701+
702+
if (m_meter_stat_work_queue.empty())
703+
{
704+
m_meter_fc_update_timer->stop();
705+
}
706+
}

orchagent/dash/dashmeterorch.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
#include "dash_api/meter_policy.pb.h"
2121
#include "dash_api/meter_rule.pb.h"
2222

23+
#define METER_STAT_COUNTER_FLEX_COUNTER_GROUP "METER_STAT_COUNTER"
24+
#define METER_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS 10000
25+
2326
struct MeterPolicyContext
2427
{
2528
std::string meter_policy;
@@ -71,8 +74,13 @@ class DashMeterOrch : public ZmqOrch
7174
int32_t getMeterPolicyEniBindCount(const std::string& meter_policy) const;
7275
void incrMeterPolicyEniBindCount(const std::string& meter_policy);
7376
void decrMeterPolicyEniBindCount(const std::string& meter_policy);
77+
void addEniToMeterFC(sai_object_id_t oid, const std::string& name);
78+
void removeEniFromMeterFC(sai_object_id_t oid, const std::string& name);
79+
void handleMeterFCStatusUpdate(bool is_enabled);
7480

7581
private:
82+
83+
void doTask(swss::SelectableTimer&);
7684
void doTask(ConsumerBase &consumer);
7785
void doTaskMeterPolicyTable(ConsumerBase &consumer);
7886
void doTaskMeterRuleTable(ConsumerBase &consumer);
@@ -97,4 +105,12 @@ class DashMeterOrch : public ZmqOrch
97105
MeterPolicyTable meter_policy_entries_;
98106
MeterRuleTable meter_rule_entries_;
99107
ObjectBulker<sai_dash_meter_api_t> meter_rule_bulker_;
108+
bool m_meter_fc_status = false;
109+
FlexCounterManager m_meter_stat_manager;
110+
std::unordered_set<std::string> m_meter_counter_stats;
111+
std::map<sai_object_id_t, std::string> m_meter_stat_work_queue;
112+
std::unique_ptr<swss::Table> m_vid_to_rid_table;
113+
std::shared_ptr<swss::DBConnector> m_counter_db;
114+
std::shared_ptr<swss::DBConnector> m_asic_db;
115+
swss::SelectableTimer* m_meter_fc_update_timer = nullptr;
100116
};

orchagent/dash/dashorch.cpp

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,9 @@ bool DashOrch::addEniObject(const string& eni, EniEntry& entry)
685685
}
686686
}
687687

688+
addEniMapEntry(eni_id, eni);
688689
addEniToFC(eni_id, eni);
690+
dash_meter_orch->addEniToMeterFC(eni_id, eni);
689691

690692
gCrmOrch->incCrmResUsedCounter(CrmResourceType::CRM_DASH_ENI);
691693

@@ -823,8 +825,11 @@ bool DashOrch::removeEniObject(const string& eni)
823825
SWSS_LOG_ENTER();
824826

825827
EniEntry entry = eni_entries_[eni];
828+
DashMeterOrch *dash_meter_orch = gDirectory.get<DashMeterOrch*>();
826829

830+
dash_meter_orch->removeEniFromMeterFC(entry.eni_id, eni);
827831
removeEniFromFC(entry.eni_id, eni);
832+
removeEniMapEntry(entry.eni_id, eni);
828833

829834
sai_status_t status = sai_dash_eni_api->remove_eni(entry.eni_id);
830835
if (status != SAI_STATUS_SUCCESS)
@@ -842,7 +847,6 @@ bool DashOrch::removeEniObject(const string& eni)
842847
}
843848
}
844849

845-
DashMeterOrch *dash_meter_orch = gDirectory.get<DashMeterOrch*>();
846850
const string &v4_meter_policy = entry.metadata.has_v4_meter_policy_id() ?
847851
entry.metadata.v4_meter_policy_id() : "";
848852
const string &v6_meter_policy = entry.metadata.has_v6_meter_policy_id() ?
@@ -1290,7 +1294,6 @@ void DashOrch::removeEniFromFC(sai_object_id_t oid, const string &name)
12901294
return;
12911295
}
12921296

1293-
m_eni_name_table->hdel("", name);
12941297
m_eni_stat_manager.clearCounterIdList(oid);
12951298
SWSS_LOG_INFO("Unregistering FC for %s, id: %s", name.c_str(), sai_serialize_object_id(oid).c_str());
12961299
}
@@ -1310,6 +1313,22 @@ void DashOrch::refreshEniFCStats(bool install)
13101313
}
13111314
}
13121315

1316+
void DashOrch::refreshMeterFCStats(bool install)
1317+
{
1318+
DashMeterOrch *dash_meter_orch = gDirectory.get<DashMeterOrch*>();
1319+
for (auto it = eni_entries_.begin(); it != eni_entries_.end(); it++)
1320+
{
1321+
if (install)
1322+
{
1323+
dash_meter_orch->addEniToMeterFC(it->second.eni_id, it->first);
1324+
}
1325+
else
1326+
{
1327+
dash_meter_orch->removeEniFromMeterFC(it->second.eni_id, it->first);
1328+
}
1329+
}
1330+
}
1331+
13131332
void DashOrch::handleFCStatusUpdate(bool enabled)
13141333
{
13151334
bool prev_enabled = m_eni_fc_status;
@@ -1326,6 +1345,35 @@ void DashOrch::handleFCStatusUpdate(bool enabled)
13261345
}
13271346
}
13281347

1348+
void DashOrch::addEniMapEntry(sai_object_id_t oid, const string &name) {
1349+
SWSS_LOG_ENTER();
1350+
1351+
if (oid == SAI_NULL_OBJECT_ID)
1352+
{
1353+
SWSS_LOG_WARN("Cannot add ENI map entry with NULL OID for eni %s", name.c_str());
1354+
return;
1355+
}
1356+
1357+
const auto id = sai_serialize_object_id(oid);
1358+
SWSS_LOG_INFO("Adding ENI map entry for %s, id: %s", name.c_str(), id.c_str());
1359+
std::vector<FieldValueTuple> eniNameFvs;
1360+
eniNameFvs.emplace_back(name, id);
1361+
m_eni_name_table->set("", eniNameFvs);
1362+
}
1363+
1364+
void DashOrch::removeEniMapEntry(sai_object_id_t oid, const string &name) {
1365+
SWSS_LOG_ENTER();
1366+
1367+
if (oid == SAI_NULL_OBJECT_ID)
1368+
{
1369+
SWSS_LOG_WARN("Cannot remove ENI map entry on NULL OID for eni %s", name.c_str());
1370+
return;
1371+
}
1372+
1373+
m_eni_name_table->hdel("", name);
1374+
SWSS_LOG_INFO("Removing ENI map entry for %s, id: %s", name.c_str(), sai_serialize_object_id(oid).c_str());
1375+
}
1376+
13291377
void DashOrch::addEniToFC(sai_object_id_t oid, const string &name)
13301378
{
13311379
if (!m_eni_fc_status)
@@ -1358,9 +1406,6 @@ void DashOrch::doTask(SelectableTimer &timer)
13581406
if (!gTraditionalFlexCounter || m_vid_to_rid_table->hget("", id, value))
13591407
{
13601408
SWSS_LOG_INFO("Registering FC for ENI: %s, id %s", it->second.c_str(), id.c_str());
1361-
std::vector<FieldValueTuple> eniNameFvs;
1362-
eniNameFvs.emplace_back(it->second, id);
1363-
m_eni_name_table->set("", eniNameFvs);
13641409

13651410
m_eni_stat_manager.setCounterIdList(it->first, CounterType::ENI, m_counter_stats);
13661411
it = m_eni_stat_work_queue.erase(it);

orchagent/dash/dashorch.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class DashOrch : public ZmqOrch
5959
void handleFCStatusUpdate(bool is_enabled);
6060
dash::types::IpAddress getApplianceVip();
6161
bool hasApplianceEntry();
62+
void clearMeterFCStats();
63+
void refreshMeterFCStats(bool);
6264

6365
private:
6466
ApplianceTable appliance_entries_;
@@ -110,6 +112,8 @@ class DashOrch : public ZmqOrch
110112
swss::SelectableTimer* m_fc_update_timer = nullptr;
111113

112114
void doTask(swss::SelectableTimer&);
115+
void addEniMapEntry(sai_object_id_t oid, const std::string& name);
116+
void removeEniMapEntry(sai_object_id_t oid, const std::string& name);
113117
void addEniToFC(sai_object_id_t oid, const std::string& name);
114118
void removeEniFromFC(sai_object_id_t oid, const std::string& name);
115119
void refreshEniFCStats(bool);

orchagent/flex_counter/flex_counter_manager.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const unordered_map<CounterType, string> FlexCounterManager::counter_id_field_lo
5050
{ CounterType::HOSTIF_TRAP, FLOW_COUNTER_ID_LIST },
5151
{ CounterType::ROUTE, FLOW_COUNTER_ID_LIST },
5252
{ CounterType::ENI, ENI_COUNTER_ID_LIST },
53+
{ CounterType::DASH_METER, DASH_METER_COUNTER_ID_LIST },
5354
{ CounterType::SRV6, SRV6_COUNTER_ID_LIST },
5455
};
5556

orchagent/flex_counter/flex_counter_manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ enum class CounterType
3939
HOSTIF_TRAP,
4040
ROUTE,
4141
ENI,
42+
DASH_METER,
4243
SRV6
4344
};
4445

orchagent/flexcounterorch.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "routeorch.h"
1515
#include "macsecorch.h"
1616
#include "dash/dashorch.h"
17+
#include "dash/dashmeterorch.h"
1718
#include "flowcounterrouteorch.h"
1819
#include "warm_restart.h"
1920

@@ -45,6 +46,7 @@ extern sai_object_id_t gSwitchId;
4546
#define FLOW_CNT_TRAP_KEY "FLOW_CNT_TRAP"
4647
#define FLOW_CNT_ROUTE_KEY "FLOW_CNT_ROUTE"
4748
#define ENI_KEY "ENI"
49+
#define DASH_METER_KEY "DASH_METER"
4850
#define WRED_QUEUE_KEY "WRED_ECN_QUEUE"
4951
#define WRED_PORT_KEY "WRED_ECN_PORT"
5052
#define SRV6_KEY "SRV6"
@@ -71,6 +73,7 @@ unordered_map<string, string> flexCounterGroupMap =
7173
{"MACSEC_SA_ATTR", COUNTERS_MACSEC_SA_ATTR_GROUP},
7274
{"MACSEC_FLOW", COUNTERS_MACSEC_FLOW_GROUP},
7375
{"ENI", ENI_STAT_COUNTER_FLEX_COUNTER_GROUP},
76+
{"DASH_METER", METER_STAT_COUNTER_FLEX_COUNTER_GROUP},
7477
{"WRED_ECN_PORT", WRED_PORT_STAT_COUNTER_FLEX_COUNTER_GROUP},
7578
{"WRED_ECN_QUEUE", WRED_QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP},
7679
{SRV6_KEY, SRV6_STAT_COUNTER_FLEX_COUNTER_GROUP},
@@ -113,6 +116,7 @@ void FlexCounterOrch::doTask(Consumer &consumer)
113116

114117
VxlanTunnelOrch* vxlan_tunnel_orch = gDirectory.get<VxlanTunnelOrch*>();
115118
DashOrch* dash_orch = gDirectory.get<DashOrch*>();
119+
DashMeterOrch* dash_meter_orch = gDirectory.get<DashMeterOrch*>();
116120
if (gPortsOrch && !gPortsOrch->allPortsReady())
117121
{
118122
return;
@@ -247,6 +251,10 @@ void FlexCounterOrch::doTask(Consumer &consumer)
247251
{
248252
dash_orch->handleFCStatusUpdate((value == "enable"));
249253
}
254+
if (dash_meter_orch && (key == DASH_METER_KEY))
255+
{
256+
dash_meter_orch->handleMeterFCStatusUpdate((value == "enable"));
257+
}
250258
if (gCoppOrch && (key == FLOW_CNT_TRAP_KEY))
251259
{
252260
if (value == "enable")

0 commit comments

Comments
 (0)