Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
182 changes: 174 additions & 8 deletions orchagent/dash/dashorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,19 @@
#include "pbutils.h"
#include "dashrouteorch.h"
#include "dashmeterorch.h"
#include <google/protobuf/util/message_differencer.h>

using namespace std;
using namespace swss;
using namespace google::protobuf::util;

extern Directory<Orch*> gDirectory;
extern std::unordered_map<std::string, sai_object_id_t> gVnetNameToId;
extern sai_dash_appliance_api_t* sai_dash_appliance_api;
extern sai_dash_vip_api_t* sai_dash_vip_api;
extern sai_dash_direction_lookup_api_t* sai_dash_direction_lookup_api;
extern sai_dash_eni_api_t* sai_dash_eni_api;
extern sai_dash_trusted_vni_api_t* sai_dash_trusted_vni_api;
extern sai_object_id_t gSwitchId;
extern size_t gMaxBulkSize;
extern CrmOrch *gCrmOrch;
Expand Down Expand Up @@ -112,9 +115,20 @@ bool DashOrch::addApplianceEntry(const string& appliance_id, const dash::applian
{
SWSS_LOG_ENTER();

if (appliance_entries_.find(appliance_id) != appliance_entries_.end())
auto it = appliance_entries_.find(appliance_id);

if (it != appliance_entries_.end())
{
SWSS_LOG_WARN("Appliance Entry already exists for %s", appliance_id.c_str());
if (!MessageDifferencer::Equivalent(it->second.metadata.trusted_vnis(), entry.trusted_vnis()))
{
SWSS_LOG_INFO("Appliance Entry %s already exists with different trusted vnis", appliance_id.c_str());
removeApplianceTrustedVni(appliance_id, it->second.metadata);
addApplianceTrustedVni(appliance_id, entry);
}
else
{
SWSS_LOG_WARN("Appliance Entry already exists for %s", appliance_id.c_str());
}
return true;
}
if (!appliance_entries_.empty())
Expand Down Expand Up @@ -200,9 +214,42 @@ bool DashOrch::addApplianceEntry(const string& appliance_id, const dash::applian
appliance_entries_[appliance_id] = ApplianceEntry { sai_appliance_id, entry };
SWSS_LOG_NOTICE("Created appliance, vip and direction lookup entries for %s", appliance_id.c_str());

if (entry.has_trusted_vnis())
{
addApplianceTrustedVni(appliance_id, entry);
}

return true;
}

void DashOrch::addApplianceTrustedVni(const std::string& appliance_id, const dash::appliance::Appliance& entry)
{
SWSS_LOG_ENTER();
sai_global_trusted_vni_entry_t trusted_vni_entry;
trusted_vni_entry.switch_id = gSwitchId;
sai_u32_range_t vni_range;
if (!to_sai(entry.trusted_vnis(), vni_range))
{
SWSS_LOG_ERROR("Failed to convert trusted vni range for appliance");
return;
}

trusted_vni_entry.vni_range = vni_range;
sai_status_t status = sai_dash_trusted_vni_api->create_global_trusted_vni_entry(&trusted_vni_entry, 0, NULL);
if (status != SAI_STATUS_SUCCESS)
{
SWSS_LOG_ERROR("Failed to create global trusted vni entry with range %u-%u for appliance", vni_range.min, vni_range.max);
task_process_status handle_status = handleSaiCreateStatus((sai_api_t)SAI_API_DASH_TRUSTED_VNI, status);
if (handle_status != task_success)
{
parseHandleSaiStatusFailure(handle_status);
}
}
appliance_entries_[appliance_id].metadata.mutable_trusted_vnis()->CopyFrom(entry.trusted_vnis());
SWSS_LOG_NOTICE("Created global trusted vni entry for appliance with range %u-%u",
vni_range.min, vni_range.max);
}

bool DashOrch::removeApplianceEntry(const string& appliance_id)
{
SWSS_LOG_ENTER();
Expand Down Expand Up @@ -261,12 +308,49 @@ bool DashOrch::removeApplianceEntry(const string& appliance_id)
}
}
}

if (entry.has_trusted_vnis())
{
removeApplianceTrustedVni(appliance_id, entry);
}

appliance_entries_.erase(appliance_id);
SWSS_LOG_NOTICE("Removed appliance, vip and direction lookup entries for %s", appliance_id.c_str());


return true;
}

void DashOrch::removeApplianceTrustedVni(const std::string& appliance_id, const dash::appliance::Appliance& entry)
{
SWSS_LOG_ENTER();
sai_global_trusted_vni_entry_t trusted_vni_entry;
trusted_vni_entry.switch_id = gSwitchId;
sai_u32_range_t vni_range;

if (!to_sai(entry.trusted_vnis(), vni_range))
{
SWSS_LOG_ERROR("Failed to convert trusted vni range for appliance");
return;
}

trusted_vni_entry.vni_range = vni_range;
sai_status_t status = sai_dash_trusted_vni_api->remove_global_trusted_vni_entry(&trusted_vni_entry);
if (status != SAI_STATUS_SUCCESS)
{
SWSS_LOG_ERROR("Failed to remove global trusted vni entry with range %u-%u for appliance", vni_range.min, vni_range.max);
task_process_status handle_status = handleSaiRemoveStatus((sai_api_t)SAI_API_DASH_TRUSTED_VNI, status);
if (handle_status != task_success)
{
parseHandleSaiStatusFailure(handle_status);
}
}

appliance_entries_[appliance_id].metadata.clear_trusted_vnis();
SWSS_LOG_NOTICE("Removed global trusted vni entry for appliance with range %u-%u",
vni_range.min, vni_range.max);
}

void DashOrch::doTaskApplianceTable(ConsumerBase& consumer)
{
SWSS_LOG_ENTER();
Expand Down Expand Up @@ -638,19 +722,59 @@ bool DashOrch::addEniAddrMapEntry(const string& eni, const EniEntry& entry)
return true;
}

bool DashOrch::addEni(const string& eni, EniEntry &entry)
void DashOrch::addEniTrustedVnis(const std::string& eni, const EniEntry& entry)
{
SWSS_LOG_ENTER();
sai_eni_trusted_vni_entry_t trusted_vni_entry;
trusted_vni_entry.switch_id = gSwitchId;
trusted_vni_entry.eni_id = entry.eni_id;
sai_u32_range_t vni_range;
if (!to_sai(entry.metadata.trusted_vnis(), vni_range))
{
SWSS_LOG_ERROR("Failed to convert trusted vni range for ENI %s", entry.metadata.eni_id().c_str());
return;
}
trusted_vni_entry.vni_range = vni_range;

auto it = eni_entries_.find(eni);
if (it != eni_entries_.end() && it->second.metadata.admin_state() != entry.metadata.admin_state())
sai_status_t status = sai_dash_trusted_vni_api->create_eni_trusted_vni_entry(&trusted_vni_entry, 0, NULL);
if (status != SAI_STATUS_SUCCESS)
{
return setEniAdminState(eni, entry);
SWSS_LOG_ERROR("Failed to create ENI trusted vni entry with range %u-%u for ENI %s", vni_range.min, vni_range.max, entry.metadata.eni_id().c_str());
task_process_status handle_status = handleSaiCreateStatus((sai_api_t)SAI_API_DASH_TRUSTED_VNI, status);
if (handle_status != task_success)
{
parseHandleSaiStatusFailure(handle_status);
}
}
eni_entries_[eni].metadata.mutable_trusted_vnis()->CopyFrom(entry.metadata.trusted_vnis());
SWSS_LOG_NOTICE("Created ENI trusted vni entry for ENI %s with range %u-%u",
entry.metadata.eni_id().c_str(), vni_range.min, vni_range.max);
}

bool DashOrch::addEni(const string& eni, EniEntry &entry)
{
SWSS_LOG_ENTER();

else if (it != eni_entries_.end())
auto it = eni_entries_.find(eni);
if (it != eni_entries_.end())
{
SWSS_LOG_WARN("ENI %s already exists", eni.c_str());
bool changed = false;
if (!MessageDifferencer::Equivalent(it->second.metadata.trusted_vnis(), entry.metadata.trusted_vnis()))
{
SWSS_LOG_INFO("ENI %s trusted vnis have changed", eni.c_str());
removeEniTrustedVnis(eni, it->second);
addEniTrustedVnis(eni, entry);
changed = true;
}
if (it->second.metadata.admin_state() != entry.metadata.admin_state())
{
SWSS_LOG_INFO("ENI %s already exists, updating admin state", eni.c_str());
return setEniAdminState(eni, entry);
}
if (!changed)
{
SWSS_LOG_WARN("ENI %s already exists", eni.c_str());
}
return true;
}

Expand All @@ -660,6 +784,11 @@ bool DashOrch::addEni(const string& eni, EniEntry &entry)
}
eni_entries_[eni] = entry;

if (entry.metadata.has_trusted_vnis())
{
addEniTrustedVnis(eni, entry);
}

return true;
}

Expand Down Expand Up @@ -754,6 +883,36 @@ bool DashOrch::removeEniAddrMapEntry(const string& eni)
return true;
}

void DashOrch::removeEniTrustedVnis(const std::string& eni, const EniEntry& entry)
{
SWSS_LOG_ENTER();
sai_eni_trusted_vni_entry_t trusted_vni_entry;
trusted_vni_entry.switch_id = gSwitchId;
trusted_vni_entry.eni_id = entry.eni_id;
sai_u32_range_t vni_range;

if (!to_sai(entry.metadata.trusted_vnis(), vni_range))
{
SWSS_LOG_ERROR("Failed to convert trusted vni range for ENI %s", entry.metadata.eni_id().c_str());
return;
}

trusted_vni_entry.vni_range = vni_range;
sai_status_t status = sai_dash_trusted_vni_api->remove_eni_trusted_vni_entry(&trusted_vni_entry);
if (status != SAI_STATUS_SUCCESS)
{
SWSS_LOG_ERROR("Failed to remove ENI trusted vni entry with range %u-%u for ENI %s", vni_range.min, vni_range.max, entry.metadata.eni_id().c_str());
task_process_status handle_status = handleSaiRemoveStatus((sai_api_t)SAI_API_DASH_TRUSTED_VNI, status);
if (handle_status != task_success)
{
parseHandleSaiStatusFailure(handle_status);
}
}
eni_entries_[eni].metadata.clear_trusted_vnis();
SWSS_LOG_NOTICE("Removed ENI trusted vni entry for ENI %s with range %u-%u",
entry.metadata.eni_id().c_str(), vni_range.min, vni_range.max);
}

bool DashOrch::removeEni(const string& eni)
{
SWSS_LOG_ENTER();
Expand All @@ -763,10 +922,17 @@ bool DashOrch::removeEni(const string& eni)
SWSS_LOG_WARN("ENI %s does not exist", eni.c_str());
return true;
}

if (eni_entries_[eni].metadata.has_trusted_vnis())
{
removeEniTrustedVnis(eni, eni_entries_[eni]);
}

if (!removeEniAddrMapEntry(eni) || !removeEniObject(eni))
{
return false;
}

eni_entries_.erase(eni);

return true;
Expand Down
4 changes: 4 additions & 0 deletions orchagent/dash/dashorch.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,18 @@ class DashOrch : public ZmqOrch
void doTaskEniRouteTable(ConsumerBase &consumer);
void doTaskRouteGroupTable(ConsumerBase &consumer);
bool addApplianceEntry(const std::string& appliance_id, const dash::appliance::Appliance &entry);
void addApplianceTrustedVni(const std::string& appliance_id, const dash::appliance::Appliance& entry);
bool removeApplianceEntry(const std::string& appliance_id);
void removeApplianceTrustedVni(const std::string& appliance_id, const dash::appliance::Appliance& entry);
bool addRoutingTypeEntry(const dash::route_type::RoutingType &routing_type, const dash::route_type::RouteType &entry);
bool removeRoutingTypeEntry(const dash::route_type::RoutingType &routing_type);
bool addEniObject(const std::string& eni, EniEntry& entry);
bool addEniAddrMapEntry(const std::string& eni, const EniEntry& entry);
void addEniTrustedVnis(const std::string& eni, const EniEntry& entry);
bool addEni(const std::string& eni, EniEntry &entry);
bool removeEniObject(const std::string& eni);
bool removeEniAddrMapEntry(const std::string& eni);
void removeEniTrustedVnis(const std::string& eni, const EniEntry& entry);
bool removeEni(const std::string& eni);
bool setEniAdminState(const std::string& eni, const EniEntry& entry);
bool addQosEntry(const std::string& qos_name, const dash::qos::Qos &entry);
Expand Down
27 changes: 27 additions & 0 deletions orchagent/dash/pbutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,33 @@ bool to_sai(const RepeatedPtrField<dash::types::IpPrefix> &pb_prefixes, vector<s
return true;
}

bool to_sai(const dash::types::ValueOrRange &pb_range, sai_u32_range_t &sai_range)
{
SWSS_LOG_ENTER();

if (pb_range.has_value())
{
sai_range.min = pb_range.value();
sai_range.max = pb_range.value();
}
else if (pb_range.has_range())
{
if (pb_range.range().min() > pb_range.range().max())
{
SWSS_LOG_WARN("The range %s is invalid", pb_range.range().DebugString().c_str());
return false;
}
sai_range.min = pb_range.range().min();
sai_range.max = pb_range.range().max();
}
else
{
SWSS_LOG_WARN("The ValueOrRange %s is invalid", pb_range.DebugString().c_str());
return false;
}
return true;
}

ip_addr_t to_swss(const dash::types::IpAddress &pb_address)
{
SWSS_LOG_ENTER();
Expand Down
2 changes: 2 additions & 0 deletions orchagent/dash/pbutils.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ bool to_sai(const dash::types::IpPrefix &pb_prefix, sai_ip_prefix_t &sai_prefix)

bool to_sai(const google::protobuf::RepeatedPtrField<dash::types::IpPrefix> &pb_prefixes, std::vector<sai_ip_prefix_t> &sai_prefixes);

bool to_sai(const dash::types::ValueOrRange &pb_range, sai_u32_range_t &sai_range);

template<typename RangeType>
bool to_sai(const dash::types::ValueOrRange &pb_range, RangeType &sai_range)
{
Expand Down
1 change: 1 addition & 0 deletions orchagent/saihelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ sai_twamp_api_t* sai_twamp_api;
sai_tam_api_t* sai_tam_api;
sai_stp_api_t* sai_stp_api;
sai_dash_meter_api_t* sai_dash_meter_api;
sai_dash_trusted_vni_api_t* sai_dash_trusted_vni_api;

extern sai_object_id_t gSwitchId;
extern bool gTraditionalFlexCounter;
Expand Down
Loading
Loading