Skip to content

Commit 696015e

Browse files
Merge branch 'master' into fix-portsorch-init-crash
2 parents 935eaf0 + 3ccfa62 commit 696015e

30 files changed

+1498
-151
lines changed

orchagent/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ dist_swss_DATA = \
2929
pfc_restore.lua \
3030
pfc_restore_cisco-8000.lua \
3131
port_rates.lua \
32+
port_flr.lua \
3233
drop_monitor.lua \
3334
watermark_queue.lua \
3435
watermark_pg.lua \

orchagent/aclorch.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ static acl_rule_attr_lookup_t aclL3ActionLookup =
112112
{ ACTION_DISABLE_TRIM, SAI_ACL_ENTRY_ATTR_ACTION_PACKET_TRIM_DISABLE }
113113
};
114114

115-
static acl_rule_attr_lookup_t aclInnerActionLookup =
115+
static acl_rule_attr_lookup_t aclInnerActionLookup =
116116
{
117117
{ ACTION_INNER_SRC_MAC_REWRITE_ACTION, SAI_ACL_ENTRY_ATTR_ACTION_SET_INNER_SRC_MAC},
118118
};
@@ -2186,8 +2186,8 @@ AclRuleInnerSrcMacRewrite::AclRuleInnerSrcMacRewrite(AclOrch *aclOrch, string ru
21862186
memcpy(actionData.parameter.mac, inner_src_mac_addr.getMac(), sizeof(sai_mac_t));
21872187
action_str = ACTION_INNER_SRC_MAC_REWRITE_ACTION;
21882188
SWSS_LOG_INFO("Converting the Mac address %s to SAI acl action parameter", _attr_value.c_str());
2189-
}
2190-
2189+
}
2190+
21912191
else
21922192
{
21932193
return false;
@@ -2216,7 +2216,7 @@ AclRuleInnerSrcMacRewrite::AclRuleInnerSrcMacRewrite(AclOrch *aclOrch, string ru
22162216

22172217
void AclRuleInnerSrcMacRewrite::onUpdate(SubjectType type, void *cntx)
22182218
{
2219-
//do nothing
2219+
//do nothing
22202220
}
22212221

22222222
AclRuleMirror::AclRuleMirror(AclOrch *aclOrch, MirrorOrch *mirror, string rule, string table) :
@@ -2522,7 +2522,7 @@ void AclRuleUnderlaySetDscp::onUpdate(SubjectType, void *)
25222522
{
25232523
// Do nothing
25242524
}
2525-
2525+
25262526
AclTable::AclTable(AclOrch *pAclOrch, string id) noexcept : m_pAclOrch(pAclOrch), id(id)
25272527
{
25282528

@@ -4419,7 +4419,7 @@ EgressSetDscpTableStatus AclOrch::addEgrSetDscpTable(string table_id, AclTable &
44194419
if (!isAclMetaDataSupported())
44204420
{
44214421
SWSS_LOG_ERROR("Platform does not support MARK_META/MARK_METAV6 tables.");
4422-
return EgressSetDscpTableStatus::EGRESS_SET_DSCP_TABLE_NOT_SUPPORTED;
4422+
return EgressSetDscpTableStatus::EGRESS_SET_DSCP_TABLE_NOT_SUPPORTED;
44234423
}
44244424
AclTable egrSetDscpTable(this);
44254425

orchagent/dash/dashhaorch.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ DashHaOrch::DashHaOrch(DBConnector *db, const vector<string> &tables, DashOrch *
8686

8787
register_ha_set_notifier();
8888
register_ha_scope_notifier();
89+
90+
// Register this DashHaOrch instance with DashOrch
91+
m_dash_orch->setDashHaOrch(this);
8992
}
9093

9194
bool DashHaOrch::register_ha_set_notifier()
@@ -190,6 +193,21 @@ std::string DashHaOrch::getHaScopeObjectKey(const sai_object_id_t ha_scope_oid)
190193
return "";
191194
}
192195

196+
HaScopeEntry DashHaOrch::getHaScopeForEni(const std::string& eni)
197+
{
198+
SWSS_LOG_ENTER();
199+
200+
if (m_ha_scope_entries.empty())
201+
{
202+
HaScopeEntry emptyEntry;
203+
emptyEntry.ha_scope_id = SAI_NULL_OBJECT_ID;
204+
return emptyEntry;
205+
}
206+
207+
/* Return the first entry. This logic only applies to DPU Scope HA */
208+
return m_ha_scope_entries.begin()->second;
209+
}
210+
193211
bool DashHaOrch::addHaSetEntry(const std::string &key, const dash::ha_set::HaSet &entry)
194212
{
195213
SWSS_LOG_ENTER();

orchagent/dash/dashhaorch.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class DashHaOrch : public ZmqOrch
9898

9999
std::unique_ptr<swss::Table> dash_ha_set_result_table_;
100100
std::unique_ptr<swss::Table> dash_ha_scope_result_table_;
101-
101+
102102
std::unique_ptr<swss::DBConnector> m_dpuStateDbConnector;
103103
std::unique_ptr<swss::Table> m_dpuStateDbHaSetTable;
104104
std::unique_ptr<swss::Table> m_dpuStateDbHaScopeTable;
@@ -110,6 +110,7 @@ class DashHaOrch : public ZmqOrch
110110
const HaSetTable& getHaSetEntries() const { return m_ha_set_entries; };
111111
const HaScopeTable& getHaScopeEntries() const { return m_ha_scope_entries; };
112112
const DashBfdSessionTable& getBfdSessionPendingCreation() const { return m_bfd_session_pending_creation; };
113+
virtual HaScopeEntry getHaScopeForEni(const std::string& eni);
113114
};
114115

115116
#endif // DASHHAORCH_H

orchagent/dash/dashorch.cpp

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "converter.h"
1111
#include "dashorch.h"
12+
#include "dashhaorch.h"
1213
#include "macaddress.h"
1314
#include "orch.h"
1415
#include "sai.h"
@@ -91,6 +92,12 @@ DashOrch::DashOrch(DBConnector *db, vector<string> &tableName, DBConnector *app_
9192
}
9293
}
9394

95+
void DashOrch::setDashHaOrch(DashHaOrch *dash_ha_orch)
96+
{
97+
SWSS_LOG_ENTER();
98+
m_dash_ha_orch = dash_ha_orch;
99+
}
100+
94101
bool DashOrch::getRouteTypeActions(dash::route_type::RoutingType routing_type, dash::route_type::RouteType& route_type)
95102
{
96103
SWSS_LOG_ENTER();
@@ -554,14 +561,14 @@ bool DashOrch::addEniObject(const string& eni, EniEntry& entry)
554561
}
555562

556563
DashMeterOrch *dash_meter_orch = gDirectory.get<DashMeterOrch*>();
557-
const string &v4_meter_policy = entry.metadata.has_v4_meter_policy_id() ?
564+
const string &v4_meter_policy = entry.metadata.has_v4_meter_policy_id() ?
558565
entry.metadata.v4_meter_policy_id() : "";
559-
const string &v6_meter_policy = entry.metadata.has_v6_meter_policy_id() ?
566+
const string &v6_meter_policy = entry.metadata.has_v6_meter_policy_id() ?
560567
entry.metadata.v6_meter_policy_id() : "";
561568

562569
if (!v4_meter_policy.empty())
563570
{
564-
sai_object_id_t meter_policy_oid = dash_meter_orch->getMeterPolicyOid(v4_meter_policy);
571+
sai_object_id_t meter_policy_oid = dash_meter_orch->getMeterPolicyOid(v4_meter_policy);
565572
if (meter_policy_oid == SAI_NULL_OBJECT_ID)
566573
{
567574
SWSS_LOG_INFO("Retry as v4 meter_policy %s not found", v4_meter_policy.c_str());
@@ -570,7 +577,7 @@ bool DashOrch::addEniObject(const string& eni, EniEntry& entry)
570577
}
571578
if (!v6_meter_policy.empty())
572579
{
573-
sai_object_id_t meter_policy_oid = dash_meter_orch->getMeterPolicyOid(v6_meter_policy);
580+
sai_object_id_t meter_policy_oid = dash_meter_orch->getMeterPolicyOid(v6_meter_policy);
574581
if (meter_policy_oid == SAI_NULL_OBJECT_ID)
575582
{
576583
SWSS_LOG_INFO("Retry as v6 meter_policy %s not found", v6_meter_policy.c_str());
@@ -639,17 +646,54 @@ bool DashOrch::addEniObject(const string& eni, EniEntry& entry)
639646
if (!v4_meter_policy.empty())
640647
{
641648
eni_attr.id = SAI_ENI_ATTR_V4_METER_POLICY_ID;
642-
eni_attr.value.oid = dash_meter_orch->getMeterPolicyOid(v4_meter_policy);
649+
eni_attr.value.oid = dash_meter_orch->getMeterPolicyOid(v4_meter_policy);
643650
eni_attrs.push_back(eni_attr);
644651
}
645652

646653
if (!v6_meter_policy.empty())
647654
{
648655
eni_attr.id = SAI_ENI_ATTR_V6_METER_POLICY_ID;
649-
eni_attr.value.oid = dash_meter_orch->getMeterPolicyOid(v6_meter_policy);
656+
eni_attr.value.oid = dash_meter_orch->getMeterPolicyOid(v6_meter_policy);
650657
eni_attrs.push_back(eni_attr);
651658
}
652659

660+
// Set HA Scope ID if DashHaOrch is available and has HA scopes configured
661+
if (m_dash_ha_orch != nullptr)
662+
{
663+
HaScopeEntry ha_scope_entry = m_dash_ha_orch->getHaScopeForEni(eni);
664+
if (ha_scope_entry.ha_scope_id != SAI_NULL_OBJECT_ID)
665+
{
666+
eni_attr.id = SAI_ENI_ATTR_HA_SCOPE_ID;
667+
eni_attr.value.oid = ha_scope_entry.ha_scope_id;
668+
eni_attrs.push_back(eni_attr);
669+
SWSS_LOG_INFO("Setting HA Scope ID %" PRIx64 " for ENI %s", ha_scope_entry.ha_scope_id, eni.c_str());
670+
671+
// Set HA flow owner based on HA role
672+
eni_attr.id = SAI_ENI_ATTR_IS_HA_FLOW_OWNER;
673+
if (ha_scope_entry.metadata.ha_role() == dash::types::HA_ROLE_ACTIVE || ha_scope_entry.metadata.ha_role() == dash::types::HA_ROLE_STANDALONE)
674+
{
675+
eni_attr.value.booldata = true;
676+
SWSS_LOG_INFO("Setting HA flow owner to true (ACTIVE) for ENI %s", eni.c_str());
677+
}
678+
else if (ha_scope_entry.metadata.ha_role() == dash::types::HA_ROLE_STANDBY)
679+
{
680+
eni_attr.value.booldata = false;
681+
SWSS_LOG_INFO("Setting HA flow owner to false (STANDBY) for ENI %s", eni.c_str());
682+
}
683+
else
684+
{
685+
// For other roles (DEAD, SWITCHING_TO_ACTIVE), default to false
686+
eni_attr.value.booldata = false;
687+
SWSS_LOG_INFO("Setting HA flow owner to false (role: %s) for ENI %s", dash::types::HaRole_Name(ha_scope_entry.metadata.ha_role()).c_str(), eni.c_str());
688+
}
689+
eni_attrs.push_back(eni_attr);
690+
}
691+
else
692+
{
693+
SWSS_LOG_INFO("No HA Scope ID set for ENI %s", eni.c_str());
694+
}
695+
}
696+
653697
if (entry.metadata.has_eni_mode()) {
654698
auto it = eniModeMap.find(entry.metadata.eni_mode());
655699
eni_attr.id = SAI_ENI_ATTR_DASH_ENI_MODE;
@@ -838,9 +882,9 @@ bool DashOrch::removeEniObject(const string& eni)
838882
}
839883
}
840884

841-
const string &v4_meter_policy = entry.metadata.has_v4_meter_policy_id() ?
885+
const string &v4_meter_policy = entry.metadata.has_v4_meter_policy_id() ?
842886
entry.metadata.v4_meter_policy_id() : "";
843-
const string &v6_meter_policy = entry.metadata.has_v6_meter_policy_id() ?
887+
const string &v6_meter_policy = entry.metadata.has_v6_meter_policy_id() ?
844888
entry.metadata.v6_meter_policy_id() : "";
845889

846890
if (!v4_meter_policy.empty())
@@ -1367,7 +1411,7 @@ void DashOrch::removeEniMapEntry(sai_object_id_t oid, const string &name) {
13671411

13681412
void DashOrch::addEniToFC(sai_object_id_t oid, const string &name)
13691413
{
1370-
if (!m_eni_fc_status)
1414+
if (!m_eni_fc_status)
13711415
{
13721416
return ;
13731417
}

orchagent/dash/dashorch.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#define DASH_RESULT_SUCCESS 0
3232
#define DASH_RESULT_FAILURE 1
3333

34+
class DashHaOrch;
35+
3436
struct EniEntry
3537
{
3638
sai_object_id_t eni_id;
@@ -53,6 +55,7 @@ class DashOrch : public ZmqOrch
5355
{
5456
public:
5557
DashOrch(swss::DBConnector *db, std::vector<std::string> &tables, swss::DBConnector *app_state_db, swss::ZmqServer *zmqServer);
58+
void setDashHaOrch(DashHaOrch *dash_ha_orch);
5659
const EniEntry *getEni(const std::string &eni) const;
5760
const EniTable *getEniTable() const { return &eni_entries_; };
5861
bool getRouteTypeActions(dash::route_type::RoutingType routing_type, dash::route_type::RouteType& route_type);
@@ -110,6 +113,7 @@ class DashOrch : public ZmqOrch
110113
std::shared_ptr<swss::DBConnector> m_counter_db;
111114
std::shared_ptr<swss::DBConnector> m_asic_db;
112115
swss::SelectableTimer* m_fc_update_timer = nullptr;
116+
DashHaOrch* m_dash_ha_orch = nullptr;
113117

114118
void doTask(swss::SelectableTimer&);
115119
void addEniMapEntry(sai_object_id_t oid, const std::string& name);

orchagent/fdborch.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,8 @@ void FdbOrch::doTask(Consumer& consumer)
855855
}
856856
}
857857

858+
// set entry port_name, which is used in mux fdb update logic
859+
entry.port_name = port;
858860

859861
FdbData fdbData;
860862
fdbData.bridge_port_id = SAI_NULL_OBJECT_ID;

orchagent/flexcounterorch.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ extern Srv6Orch *gSrv6Orch;
3939
extern SwitchOrch *gSwitchOrch;
4040
extern sai_object_id_t gSwitchId;
4141

42-
#define FLEX_COUNTER_DELAY_SEC 60
42+
int gFlexCounterDelaySec;
4343

4444
#define BUFFER_POOL_WATERMARK_KEY "BUFFER_POOL_WATERMARK"
4545
#define PORT_KEY "PORT"
@@ -116,11 +116,12 @@ FlexCounterOrch::FlexCounterOrch(DBConnector *db, vector<string> &tableNames):
116116
SWSS_LOG_ERROR("System error reading create_only_config_db_buffers: %s", e.what());
117117
}
118118

119-
m_delayTimer = std::make_unique<SelectableTimer>(timespec{.tv_sec = FLEX_COUNTER_DELAY_SEC, .tv_nsec = 0});
120-
if (WarmStart::isWarmStart())
119+
SWSS_LOG_NOTICE("Counter delay is %d seconds", gFlexCounterDelaySec);
120+
if (gFlexCounterDelaySec > 0)
121121
{
122-
m_delayExecutor = std::make_unique<ExecutableTimer>(m_delayTimer.get(), this, "FLEX_COUNTER_DELAY");
123-
Orch::addExecutor(m_delayExecutor.get());
122+
m_delayTimer = new SelectableTimer(timespec{.tv_sec = static_cast<time_t>(gFlexCounterDelaySec), .tv_nsec = 0});
123+
auto delayExecutor = new ExecutableTimer(m_delayTimer, this, "FLEX_COUNTER_DELAY");
124+
Orch::addExecutor(delayExecutor);
124125
m_delayTimer->start();
125126
}
126127
else

orchagent/flexcounterorch.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,18 @@ extern "C" {
1111
#include "sai.h"
1212
}
1313

14+
// Delay in seconds before flex counter processing begins after orchagent startup.
15+
//
16+
// This delay improves boot time by prioritizing data plane configuration over
17+
// counter initialization. Systems with many ports, priority groups (PGs), and
18+
// queues require significant time to generate counter maps, which is not
19+
// immediately necessary during boot.
20+
// Value of 0 will process flex counters immediately.
21+
//
22+
// Configured via orchagent command line argument: -D <delay_sec>
23+
//
24+
extern int gFlexCounterDelaySec;
25+
1426
const std::string createAllAvailableBuffersStr = "create_all_available_buffers";
1527

1628
class FlexCounterQueueStates
@@ -75,8 +87,7 @@ class FlexCounterOrch: public Orch
7587
Table m_bufferQueueConfigTable;
7688
Table m_bufferPgConfigTable;
7789
Table m_deviceMetadataConfigTable;
78-
std::unique_ptr<SelectableTimer> m_delayTimer;
79-
std::unique_ptr<Executor> m_delayExecutor;
90+
SelectableTimer* m_delayTimer;
8091
std::unordered_set<std::string> m_groupsWithBulkChunkSize;
8192

8293
bool m_createOnlyConfigDbBuffers = false;

orchagent/main.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ void usage()
103103
cout << " -v vrf: VRF name (default empty)" << endl;
104104
cout << " -I heart_beat_interval: Heart beat interval in millisecond (default 10)" << endl;
105105
cout << " -R enable the ring thread feature" << endl;
106+
cout << " -D Delay in seconds before flex counter processing begins after orchagent startup (default 0)" << endl;
106107
}
107108

108109
void sighup_handler(int signo)
@@ -369,7 +370,7 @@ int main(int argc, char **argv)
369370
int record_type = 3; // Only swss and sairedis recordings enabled by default.
370371
long heartBeatInterval = HEART_BEAT_INTERVAL_MSECS_DEFAULT;
371372

372-
while ((opt = getopt(argc, argv, "b:m:r:f:j:d:i:hsz:k:q:c:t:v:I:R")) != -1)
373+
while ((opt = getopt(argc, argv, "b:m:r:f:j:d:i:hsz:k:q:c:t:v:I:R:D:")) != -1)
373374
{
374375
switch (opt)
375376
{
@@ -487,6 +488,7 @@ int main(int argc, char **argv)
487488
case 'R':
488489
gRingMode = true;
489490
break;
491+
case 'D': { gFlexCounterDelaySec = swss::to_int<int>(optarg); } break;
490492
default: /* '?' */
491493
exit(EXIT_FAILURE);
492494
}

0 commit comments

Comments
 (0)