Skip to content

Commit 64e622e

Browse files
committed
Merge branch 'vrrp_orch' of https://github.com/vvbrcm/sonic-swss-vrrporchd into vrrp_orch
2 parents e2d4a6b + 750b3f6 commit 64e622e

39 files changed

+2069
-1410
lines changed

configure.ac

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ if test "x$asan_enabled" = "xtrue"; then
136136
CFLAGS_ASAN+=" -Wno-maybe-uninitialized"
137137
AC_SUBST(CFLAGS_ASAN)
138138

139-
LDFLAGS_ASAN+=" -lasan"
139+
LDFLAGS_ASAN+=" -fsanitize=address"
140140
AC_SUBST(LDFLAGS_ASAN)
141141
fi
142142

fdbsyncd/fdbsyncd.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ int main(int argc, char **argv)
1616
{
1717
Logger::linkToDbNative("fdbsyncd");
1818

19-
DBConnector appDb(APPL_DB, DBConnector::DEFAULT_UNIXSOCKET, 0);
19+
DBConnector appDb("APPL_DB", 0);
2020
RedisPipeline pipelineAppDB(&appDb);
21-
DBConnector stateDb(STATE_DB, DBConnector::DEFAULT_UNIXSOCKET, 0);
22-
DBConnector config_db(CONFIG_DB, DBConnector::DEFAULT_UNIXSOCKET, 0);
21+
DBConnector stateDb("STATE_DB", 0);
22+
DBConnector config_db("CONFIG_DB", 0);
2323

2424
FdbSync sync(&pipelineAppDB, &stateDb, &config_db);
2525

gearsyncd/gearparserbase.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ GearParserBase::init()
2424
{
2525
m_writeToDb = false;
2626
m_rootInit = false;
27-
m_applDb = std::unique_ptr<swss::DBConnector>{new swss::DBConnector(APPL_DB, swss::DBConnector::DEFAULT_UNIXSOCKET, 0)};
27+
m_applDb = std::unique_ptr<swss::DBConnector>{new swss::DBConnector("APPL_DB", 0)};
2828
m_producerStateTable = std::unique_ptr<swss::ProducerStateTable>{new swss::ProducerStateTable(m_applDb.get(), APP_GEARBOX_TABLE_NAME)};
2929
}
3030

gearsyncd/gearsyncd.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ int main(int argc, char **argv)
7474
}
7575
}
7676

77-
DBConnector cfgDb(CONFIG_DB, DBConnector::DEFAULT_UNIXSOCKET, 0);
78-
DBConnector applDb(APPL_DB, DBConnector::DEFAULT_UNIXSOCKET, 0);
77+
DBConnector cfgDb("CONFIG_DB", 0);
78+
DBConnector applDb("APPL_DB", 0);
7979
ProducerStateTable producerStateTable(&applDb, APP_GEARBOX_TABLE_NAME);
8080

8181
WarmStart::initialize("gearsyncd", "swss");

orchagent/Makefile.am

-2
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ INCLUDES = -I $(top_srcdir)/lib \
88
-I pbh \
99
-I nhg
1010

11-
if GCOV_ENABLED
1211
SUBDIRS = p4orch/tests
13-
endif
1412

1513
CFLAGS_SAI = -I /usr/include/sai
1614

orchagent/dash/dashorch.cpp

+165-10
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "crmorch.h"
1919
#include "saihelper.h"
2020
#include "directory.h"
21+
#include "flex_counter_manager.h"
2122

2223
#include "taskworker.h"
2324
#include "pbutils.h"
@@ -28,16 +29,45 @@ using namespace swss;
2829

2930
extern Directory<Orch*> gDirectory;
3031
extern std::unordered_map<std::string, sai_object_id_t> gVnetNameToId;
32+
extern sai_dash_appliance_api_t* sai_dash_appliance_api;
3133
extern sai_dash_vip_api_t* sai_dash_vip_api;
3234
extern sai_dash_direction_lookup_api_t* sai_dash_direction_lookup_api;
3335
extern sai_dash_eni_api_t* sai_dash_eni_api;
3436
extern sai_object_id_t gSwitchId;
3537
extern size_t gMaxBulkSize;
3638
extern CrmOrch *gCrmOrch;
39+
extern bool gTraditionalFlexCounter;
3740

38-
DashOrch::DashOrch(DBConnector *db, vector<string> &tableName, ZmqServer *zmqServer) : ZmqOrch(db, tableName, zmqServer)
41+
#define FLEX_COUNTER_UPD_INTERVAL 1
42+
43+
DashOrch::DashOrch(DBConnector *db, vector<string> &tableName, ZmqServer *zmqServer) :
44+
ZmqOrch(db, tableName, zmqServer),
45+
m_eni_stat_manager(ENI_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, ENI_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, false)
3946
{
4047
SWSS_LOG_ENTER();
48+
49+
m_asic_db = std::shared_ptr<DBConnector>(new DBConnector("ASIC_DB", 0));
50+
m_counter_db = std::shared_ptr<DBConnector>(new DBConnector("COUNTERS_DB", 0));
51+
m_eni_name_table = std::unique_ptr<Table>(new Table(m_counter_db.get(), COUNTERS_ENI_NAME_MAP));
52+
53+
if (gTraditionalFlexCounter)
54+
{
55+
m_vid_to_rid_table = std::make_unique<Table>(m_asic_db.get(), "VIDTORID");
56+
}
57+
58+
auto intervT = timespec { .tv_sec = FLEX_COUNTER_UPD_INTERVAL , .tv_nsec = 0 };
59+
m_fc_update_timer = new SelectableTimer(intervT);
60+
auto executorT = new ExecutableTimer(m_fc_update_timer, this, "FLEX_COUNTER_UPD_TIMER");
61+
Orch::addExecutor(executorT);
62+
63+
/* Fetch the available counter Ids */
64+
m_counter_stats.clear();
65+
auto stat_enum_list = queryAvailableCounterStats((sai_object_type_t)SAI_OBJECT_TYPE_ENI);
66+
for (auto &stat_enum: stat_enum_list)
67+
{
68+
auto counter_id = static_cast<sai_eni_stat_t>(stat_enum);
69+
m_counter_stats.insert(sai_serialize_eni_stat(counter_id));
70+
}
4171
}
4272

4373
bool DashOrch::getRouteTypeActions(dash::route_type::RoutingType routing_type, dash::route_type::RouteType& route_type)
@@ -66,15 +96,31 @@ bool DashOrch::addApplianceEntry(const string& appliance_id, const dash::applian
6696
}
6797

6898
uint32_t attr_count = 1;
99+
sai_attribute_t appliance_attr;
100+
sai_status_t status;
101+
102+
// NOTE: DASH Appliance object should be the first object pushed to SAI
103+
sai_object_id_t sai_appliance_id = 0UL;
104+
appliance_attr.id = SAI_DASH_APPLIANCE_ATTR_LOCAL_REGION_ID;
105+
appliance_attr.value.u32 = entry.local_region_id();
106+
status = sai_dash_appliance_api->create_dash_appliance(&sai_appliance_id, gSwitchId,
107+
attr_count, &appliance_attr);
108+
if (status != SAI_STATUS_SUCCESS && status != SAI_STATUS_NOT_IMPLEMENTED)
109+
{
110+
SWSS_LOG_ERROR("Failed to create dash appliance object in SAI for %s", appliance_id.c_str());
111+
task_process_status handle_status = handleSaiCreateStatus((sai_api_t) SAI_API_DASH_APPLIANCE, status);
112+
if (handle_status != task_success)
113+
{
114+
return parseHandleSaiStatusFailure(handle_status);
115+
}
116+
}
117+
69118
sai_vip_entry_t vip_entry;
70119
vip_entry.switch_id = gSwitchId;
71120
if (!to_sai(entry.sip(), vip_entry.vip))
72121
{
73122
return false;
74123
}
75-
sai_attribute_t appliance_attr;
76-
vector<sai_attribute_t> appliance_attrs;
77-
sai_status_t status;
78124
appliance_attr.id = SAI_VIP_ENTRY_ATTR_ACTION;
79125
appliance_attr.value.u32 = SAI_VIP_ENTRY_ACTION_ACCEPT;
80126
status = sai_dash_vip_api->create_vip_entry(&vip_entry, attr_count, &appliance_attr);
@@ -103,8 +149,8 @@ bool DashOrch::addApplianceEntry(const string& appliance_id, const dash::applian
103149
return parseHandleSaiStatusFailure(handle_status);
104150
}
105151
}
106-
appliance_entries_[appliance_id] = entry;
107-
SWSS_LOG_NOTICE("Created vip and direction lookup entries for %s", appliance_id.c_str());
152+
appliance_entries_[appliance_id] = ApplianceEntry { sai_appliance_id, entry };
153+
SWSS_LOG_NOTICE("Created appliance, vip and direction lookup entries for %s", appliance_id.c_str());
108154

109155
return true;
110156
}
@@ -114,15 +160,14 @@ bool DashOrch::removeApplianceEntry(const string& appliance_id)
114160
SWSS_LOG_ENTER();
115161

116162
sai_status_t status;
117-
dash::appliance::Appliance entry;
118163

119164
if (appliance_entries_.find(appliance_id) == appliance_entries_.end())
120165
{
121166
SWSS_LOG_WARN("Appliance id does not exist: %s", appliance_id.c_str());
122167
return true;
123168
}
124169

125-
entry = appliance_entries_[appliance_id];
170+
const auto& entry = appliance_entries_[appliance_id].metadata;
126171
sai_vip_entry_t vip_entry;
127172
vip_entry.switch_id = gSwitchId;
128173
if (!to_sai(entry.sip(), vip_entry.vip))
@@ -153,8 +198,23 @@ bool DashOrch::removeApplianceEntry(const string& appliance_id)
153198
return parseHandleSaiStatusFailure(handle_status);
154199
}
155200
}
201+
202+
auto sai_appliance_id = appliance_entries_[appliance_id].appliance_id;
203+
if (sai_appliance_id != 0UL)
204+
{
205+
status = sai_dash_appliance_api->remove_dash_appliance(sai_appliance_id);
206+
if (status != SAI_STATUS_SUCCESS && status != SAI_STATUS_NOT_IMPLEMENTED)
207+
{
208+
SWSS_LOG_ERROR("Failed to remove dash appliance object in SAI for %s", appliance_id.c_str());
209+
task_process_status handle_status = handleSaiRemoveStatus((sai_api_t) SAI_API_DASH_APPLIANCE, status);
210+
if (handle_status != task_success)
211+
{
212+
return parseHandleSaiStatusFailure(handle_status);
213+
}
214+
}
215+
}
156216
appliance_entries_.erase(appliance_id);
157-
SWSS_LOG_NOTICE("Removed vip and direction lookup entries for %s", appliance_id.c_str());
217+
SWSS_LOG_NOTICE("Removed appliance, vip and direction lookup entries for %s", appliance_id.c_str());
158218

159219
return true;
160220
}
@@ -383,7 +443,7 @@ bool DashOrch::addEniObject(const string& eni, EniEntry& entry)
383443
eni_attrs.push_back(eni_attr);
384444

385445
eni_attr.id = SAI_ENI_ATTR_VM_VNI;
386-
auto app_entry = appliance_entries_.begin()->second;
446+
auto& app_entry = appliance_entries_.begin()->second.metadata;
387447
eni_attr.value.u32 = app_entry.vm_vni();
388448
eni_attrs.push_back(eni_attr);
389449

@@ -417,6 +477,8 @@ bool DashOrch::addEniObject(const string& eni, EniEntry& entry)
417477
}
418478
}
419479

480+
addEniToFC(eni_id, eni);
481+
420482
gCrmOrch->incCrmResUsedCounter(CrmResourceType::CRM_DASH_ENI);
421483

422484
SWSS_LOG_NOTICE("Created ENI object for %s", eni.c_str());
@@ -499,6 +561,9 @@ bool DashOrch::removeEniObject(const string& eni)
499561
SWSS_LOG_ENTER();
500562

501563
EniEntry entry = eni_entries_[eni];
564+
565+
removeEniFromFC(entry.eni_id, eni);
566+
502567
sai_status_t status = sai_dash_eni_api->remove_eni(entry.eni_id);
503568
if (status != SAI_STATUS_SUCCESS)
504569
{
@@ -881,3 +946,93 @@ void DashOrch::doTask(ConsumerBase& consumer)
881946
SWSS_LOG_ERROR("Unknown table: %s", tn.c_str());
882947
}
883948
}
949+
950+
void DashOrch::removeEniFromFC(sai_object_id_t oid, const string &name)
951+
{
952+
SWSS_LOG_ENTER();
953+
954+
if (oid == SAI_NULL_OBJECT_ID)
955+
{
956+
SWSS_LOG_WARN("Cannot remove counter on NULL OID for eni %s", name.c_str());
957+
return;
958+
}
959+
960+
if (m_eni_stat_work_queue.find(oid) != m_eni_stat_work_queue.end())
961+
{
962+
m_eni_stat_work_queue.erase(oid);
963+
return;
964+
}
965+
966+
m_eni_name_table->hdel("", name);
967+
m_eni_stat_manager.clearCounterIdList(oid);
968+
SWSS_LOG_DEBUG("Unregistered eni %s to Flex counter", name.c_str());
969+
}
970+
971+
void DashOrch::clearEniFCStats()
972+
{
973+
for (auto it = eni_entries_.begin(); it != eni_entries_.end(); it++)
974+
{
975+
removeEniFromFC(it->second.eni_id, it->first);
976+
}
977+
}
978+
979+
void DashOrch::handleFCStatusUpdate(bool enabled)
980+
{
981+
if (!enabled && m_eni_fc_status)
982+
{
983+
m_fc_update_timer->stop();
984+
clearEniFCStats();
985+
}
986+
else if (enabled && !m_eni_fc_status)
987+
{
988+
m_fc_update_timer->start();
989+
}
990+
m_eni_fc_status = enabled;
991+
}
992+
993+
void DashOrch::addEniToFC(sai_object_id_t oid, const string &name)
994+
{
995+
auto was_empty = m_eni_stat_work_queue.empty();
996+
m_eni_stat_work_queue[oid] = name;
997+
if (was_empty)
998+
{
999+
m_fc_update_timer->start();
1000+
}
1001+
}
1002+
1003+
void DashOrch::doTask(SelectableTimer &timer)
1004+
{
1005+
SWSS_LOG_ENTER();
1006+
1007+
if (!m_eni_fc_status)
1008+
{
1009+
m_fc_update_timer->stop();
1010+
return ;
1011+
}
1012+
1013+
for (auto it = m_eni_stat_work_queue.begin(); it != m_eni_stat_work_queue.end(); )
1014+
{
1015+
string value;
1016+
const auto id = sai_serialize_object_id(it->first);
1017+
1018+
if (!gTraditionalFlexCounter || m_vid_to_rid_table->hget("", id, value))
1019+
{
1020+
SWSS_LOG_INFO("Registering %s, id %s", it->second.c_str(), id.c_str());
1021+
std::vector<FieldValueTuple> eniNameFvs;
1022+
eniNameFvs.emplace_back(it->second, id);
1023+
m_eni_name_table->set("", eniNameFvs);
1024+
1025+
m_eni_stat_manager.setCounterIdList(it->first, CounterType::ENI, m_counter_stats);
1026+
it = m_eni_stat_work_queue.erase(it);
1027+
}
1028+
else
1029+
{
1030+
++it;
1031+
}
1032+
}
1033+
1034+
if (m_eni_stat_work_queue.empty())
1035+
{
1036+
m_fc_update_timer->stop();
1037+
}
1038+
}

orchagent/dash/dashorch.h

+28-1
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,30 @@
1717
#include "timer.h"
1818
#include "zmqorch.h"
1919
#include "zmqserver.h"
20+
#include "flex_counter_manager.h"
2021

2122
#include "dash_api/appliance.pb.h"
2223
#include "dash_api/route_type.pb.h"
2324
#include "dash_api/eni.pb.h"
2425
#include "dash_api/qos.pb.h"
2526
#include "dash_api/eni_route.pb.h"
2627

28+
#define ENI_STAT_COUNTER_FLEX_COUNTER_GROUP "ENI_STAT_COUNTER"
29+
#define ENI_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS 10000
30+
2731
struct EniEntry
2832
{
2933
sai_object_id_t eni_id;
3034
dash::eni::Eni metadata;
3135
};
3236

33-
typedef std::map<std::string, dash::appliance::Appliance> ApplianceTable;
37+
struct ApplianceEntry
38+
{
39+
sai_object_id_t appliance_id;
40+
dash::appliance::Appliance metadata;
41+
};
42+
43+
typedef std::map<std::string, ApplianceEntry> ApplianceTable;
3444
typedef std::map<dash::route_type::RoutingType, dash::route_type::RouteType> RoutingTypeTable;
3545
typedef std::map<std::string, EniEntry> EniTable;
3646
typedef std::map<std::string, dash::qos::Qos> QosTable;
@@ -42,6 +52,7 @@ class DashOrch : public ZmqOrch
4252
DashOrch(swss::DBConnector *db, std::vector<std::string> &tables, swss::ZmqServer *zmqServer);
4353
const EniEntry *getEni(const std::string &eni) const;
4454
bool getRouteTypeActions(dash::route_type::RoutingType routing_type, dash::route_type::RouteType& route_type);
55+
void handleFCStatusUpdate(bool is_enabled);
4556

4657
private:
4758
ApplianceTable appliance_entries_;
@@ -71,4 +82,20 @@ class DashOrch : public ZmqOrch
7182
bool removeQosEntry(const std::string& qos_name);
7283
bool setEniRoute(const std::string& eni, const dash::eni_route::EniRoute& entry);
7384
bool removeEniRoute(const std::string& eni);
85+
86+
private:
87+
std::map<sai_object_id_t, std::string> m_eni_stat_work_queue;
88+
FlexCounterManager m_eni_stat_manager;
89+
bool m_eni_fc_status = false;
90+
std::unordered_set<std::string> m_counter_stats;
91+
std::unique_ptr<swss::Table> m_eni_name_table;
92+
std::unique_ptr<swss::Table> m_vid_to_rid_table;
93+
std::shared_ptr<swss::DBConnector> m_counter_db;
94+
std::shared_ptr<swss::DBConnector> m_asic_db;
95+
swss::SelectableTimer* m_fc_update_timer = nullptr;
96+
97+
void doTask(swss::SelectableTimer&);
98+
void addEniToFC(sai_object_id_t oid, const std::string& name);
99+
void removeEniFromFC(sai_object_id_t oid, const std::string& name);
100+
void clearEniFCStats();
74101
};

0 commit comments

Comments
 (0)