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+
94101bool 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
13681412void 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 }
0 commit comments