Skip to content

Commit

Permalink
[syncd] Support SAI_SWITCH_ATTR_VXLAN_DEFAULT_ROUTER_MAC (sonic-net#1529
Browse files Browse the repository at this point in the history
)

Support corner case to bring this value to default
if user didn't set this up after boot
  • Loading branch information
kcudnik authored Feb 13, 2025
1 parent a7efc64 commit afaa59d
Show file tree
Hide file tree
Showing 17 changed files with 423 additions and 0 deletions.
8 changes: 8 additions & 0 deletions saiasiccmp/SaiSwitchAsic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,14 @@ void SaiSwitchAsic::getDefaultMacAddress(
SWSS_LOG_THROW("not implemented");
}

void SaiSwitchAsic::getVxlanDefaultRouterMacAddress(
_Out_ sai_mac_t& mac) const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

sai_object_id_t SaiSwitchAsic::getDefaultValueForOidAttr(
_In_ sai_object_id_t rid,
_In_ sai_attr_id_t attr_id)
Expand Down
3 changes: 3 additions & 0 deletions saiasiccmp/SaiSwitchAsic.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ namespace saiasiccmp
virtual void getDefaultMacAddress(
_Out_ sai_mac_t& mac) const override;

virtual void getVxlanDefaultRouterMacAddress(
_Out_ sai_mac_t& mac) const override;

virtual sai_object_id_t getDefaultValueForOidAttr(
_In_ sai_object_id_t rid,
_In_ sai_attr_id_t attr_id) override;
Expand Down
32 changes: 32 additions & 0 deletions syncd/BestCandidateFinder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2941,6 +2941,38 @@ std::shared_ptr<SaiAttr> BestCandidateFinder::getSaiAttrFromDefaultValue(
return std::make_shared<SaiAttr>(meta.attridname, str_attr_value);
}

if (meta.objecttype == SAI_OBJECT_TYPE_SWITCH &&
meta.attrid == SAI_SWITCH_ATTR_VXLAN_DEFAULT_ROUTER_MAC)
{
/*
* Same will apply for default values which are pointing to
* different attributes.
*
* Default value is stored in SaiSwitch class.
*/

// XXX we have only 1 switch, so we can get away with this

sai_attribute_t attr;

memset(&attr, 0, sizeof(sai_attribute_t));

attr.id = meta.attrid;

sw->getVxlanDefaultRouterMacAddress(attr.value.mac);

// NOTE: default router mac can be zero if GET operation failed at
// switch create, we will still return that value here, but later on
// SET operation can fail, so that's why this attribute is added to
// workaround

std::string str_attr_value = sai_serialize_attr_value(meta, attr, false);

SWSS_LOG_NOTICE("bringing default %s", meta.attridname);

return std::make_shared<SaiAttr>(meta.attridname, str_attr_value);
}

/*
* Move this method to asicview class.
*/
Expand Down
34 changes: 34 additions & 0 deletions syncd/SaiSwitch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ SaiSwitch::SaiSwitch(
if (getSwitchType() == SAI_SWITCH_TYPE_NPU)
{
saiGetMacAddress(m_default_mac_address);
saiGetVxlanDefaultRouterMacAddress(m_vxlan_default_router_mac_address);
}
}

Expand Down Expand Up @@ -124,6 +125,31 @@ void SaiSwitch::saiGetMacAddress(
memcpy(mac, attr.value.mac, sizeof(sai_mac_t));
}

void SaiSwitch::saiGetVxlanDefaultRouterMacAddress(
_Out_ sai_mac_t &mac) const
{
SWSS_LOG_ENTER();

sai_attribute_t attr;

attr.id = SAI_SWITCH_ATTR_VXLAN_DEFAULT_ROUTER_MAC;

sai_status_t status = m_vendorSai->get(SAI_OBJECT_TYPE_SWITCH, m_switch_rid, 1, &attr);

if (status != SAI_STATUS_SUCCESS)
{
// not all devices may support this
SWSS_LOG_WARN("failed to obtain SAI_SWITCH_ATTR_VXLAN_DEFAULT_ROUTER_MAC, setting to 00:00:00:00:00:00");

memset(attr.value.mac, 0, sizeof(sai_mac_t));
}

SWSS_LOG_DEBUG("mac address is: %s",
sai_serialize_mac(attr.value.mac).c_str());

memcpy(mac, attr.value.mac, sizeof(sai_mac_t));
}

void SaiSwitch::getDefaultMacAddress(
_Out_ sai_mac_t& mac) const
{
Expand All @@ -132,6 +158,14 @@ void SaiSwitch::getDefaultMacAddress(
memcpy(mac, m_default_mac_address, sizeof(sai_mac_t));
}

void SaiSwitch::getVxlanDefaultRouterMacAddress(
_Out_ sai_mac_t& mac) const
{
SWSS_LOG_ENTER();

memcpy(mac, m_vxlan_default_router_mac_address, sizeof(sai_mac_t));
}

sai_switch_type_t SaiSwitch::getSwitchType() const
{
SWSS_LOG_ENTER();
Expand Down
21 changes: 21 additions & 0 deletions syncd/SaiSwitch.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,14 @@ namespace syncd
virtual void getDefaultMacAddress(
_Out_ sai_mac_t& mac) const override;

/**
* @brief Gets VxLAN default router MAC address.
*
* @param[out] mac MAC address to be obtained.
*/
virtual void getVxlanDefaultRouterMacAddress(
_Out_ sai_mac_t& mac) const override;

/**
* @brief Gets default value of attribute for given object.
*
Expand Down Expand Up @@ -238,6 +246,18 @@ namespace syncd
void saiGetMacAddress(
_Out_ sai_mac_t &mac) const;

/**
* @brief Get VxLAN default router MAC address.
*
* Intended use is to get switch VxLAN default route MAC address,
* for comparison logic, when we will try to bring it's default
* value, in case user changed original MAC address.
*
* @param[out] mac Obtained MAC address.
*/
void saiGetVxlanDefaultRouterMacAddress(
_Out_ sai_mac_t &mac) const;

private:

void redisSetDummyAsicStateForRealObjectId(
Expand Down Expand Up @@ -301,6 +321,7 @@ namespace syncd
std::string m_hardware_info;

sai_mac_t m_default_mac_address;
sai_mac_t m_vxlan_default_router_mac_address;

/*
* NOTE: Those default value will make sense only when we will do hard
Expand Down
3 changes: 3 additions & 0 deletions syncd/SaiSwitchInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ namespace syncd
virtual void getDefaultMacAddress(
_Out_ sai_mac_t& mac) const = 0;

virtual void getVxlanDefaultRouterMacAddress(
_Out_ sai_mac_t& mac) const = 0;

virtual sai_object_id_t getDefaultValueForOidAttr(
_In_ sai_object_id_t rid,
_In_ sai_attr_id_t attr_id) = 0;
Expand Down
10 changes: 10 additions & 0 deletions syncd/Workaround.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@ bool Workaround::isSetAttributeWorkaround(
return true;
}

if (objectType == SAI_OBJECT_TYPE_SWITCH &&
attrId == SAI_SWITCH_ATTR_VXLAN_DEFAULT_ROUTER_MAC)
{
SWSS_LOG_WARN("setting %s failed: %s, not all platforms support this attribute",
sai_metadata_get_attr_metadata(objectType, attrId)->attridname,
sai_serialize_status(status).c_str());

return true;
}

if (objectType == SAI_OBJECT_TYPE_HOSTIF &&
attrId == SAI_HOSTIF_ATTR_QUEUE)
{
Expand Down
9 changes: 9 additions & 0 deletions tests/BCM56850.pl
Original file line number Diff line number Diff line change
Expand Up @@ -869,8 +869,17 @@ sub test_neighbor_next_hop
}
}

sub test_vxlan_default_router_mac
{
fresh_start;

play "vxlan_default_router_mac.rec";

}

# RUN TESTS

test_vxlan_default_router_mac;
test_neighbor_next_hop;
test_acl_pre_match_999;
test_relaxed;
Expand Down
11 changes: 11 additions & 0 deletions tests/BCM56850/vxlan_default_router_mac.rec
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
2017-06-14.01:55:46.543987|a|INIT_VIEW
2017-06-14.01:55:46.551164|A|SAI_STATUS_SUCCESS
2017-06-14.01:55:46.555975|c|SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000|SAI_SWITCH_ATTR_INIT_SWITCH=true
2017-06-14.01:55:46.558259|s|SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000|SAI_SWITCH_ATTR_VXLAN_DEFAULT_ROUTER_MAC=00:22:22:22:22:22
2017-06-14.01:56:06.151337|a|APPLY_VIEW
2017-06-14.01:56:06.156740|A|SAI_STATUS_SUCCESS
2017-06-14.01:55:46.543987|a|INIT_VIEW
2017-06-14.01:55:46.551164|A|SAI_STATUS_SUCCESS
2017-06-14.01:55:46.555975|c|SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000|SAI_SWITCH_ATTR_INIT_SWITCH=true
2017-06-14.01:56:06.151337|a|APPLY_VIEW
2017-06-14.01:56:06.156740|A|SAI_STATUS_SUCCESS
1 change: 1 addition & 0 deletions tests/aspell.en.pws
Original file line number Diff line number Diff line change
Expand Up @@ -481,3 +481,4 @@ Enqueue
deque
apiversion
vso
VxLAN
2 changes: 2 additions & 0 deletions unittest/syncd/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ LDADD_GTEST = -L/usr/src/gtest -lgtest -lgtest_main -lgmock
tests_SOURCES = main.cpp \
MockableSaiInterface.cpp \
MockHelper.cpp \
MockableSaiSwitchInterface.cpp \
TestBestCandidateFinder.cpp \
TestAttrVersionChecker.cpp \
TestCommandLineOptions.cpp \
TestConcurrentQueue.cpp \
Expand Down
156 changes: 156 additions & 0 deletions unittest/syncd/MockableSaiSwitchInterface.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
#include "MockableSaiSwitchInterface.h"
#include "VidManager.h"

#include "meta/sai_serialize.h"

#include "swss/logger.h"

#pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn"

using namespace unittests;

MockableSaiSwitchInterface::MockableSaiSwitchInterface(
_In_ sai_object_id_t switchVid,
_In_ sai_object_id_t switchRid):
SaiSwitchInterface(switchVid, switchRid)
{
SWSS_LOG_ENTER();
}

std::unordered_map<sai_object_id_t, sai_object_id_t> MockableSaiSwitchInterface::getVidToRidMap() const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

std::unordered_map<sai_object_id_t, sai_object_id_t> MockableSaiSwitchInterface::getRidToVidMap() const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

bool MockableSaiSwitchInterface::isDiscoveredRid(
_In_ sai_object_id_t rid) const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

bool MockableSaiSwitchInterface::isColdBootDiscoveredRid(
_In_ sai_object_id_t rid) const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

bool MockableSaiSwitchInterface::isSwitchObjectDefaultRid(
_In_ sai_object_id_t rid) const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

bool MockableSaiSwitchInterface::isNonRemovableRid(
_In_ sai_object_id_t rid) const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

std::set<sai_object_id_t> MockableSaiSwitchInterface::getDiscoveredRids() const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

void MockableSaiSwitchInterface::removeExistingObject(
_In_ sai_object_id_t rid)
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

void MockableSaiSwitchInterface::removeExistingObjectReference(
_In_ sai_object_id_t rid)
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

void MockableSaiSwitchInterface::getDefaultMacAddress(
_Out_ sai_mac_t& mac) const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

void MockableSaiSwitchInterface::getVxlanDefaultRouterMacAddress(
_Out_ sai_mac_t& mac) const
{
SWSS_LOG_ENTER();

mac[0] = 1;
mac[1] = 2;
mac[2] = 3;
mac[3] = 4;
mac[4] = 5;
mac[5] = 6;
}

sai_object_id_t MockableSaiSwitchInterface::getDefaultValueForOidAttr(
_In_ sai_object_id_t rid,
_In_ sai_attr_id_t attr_id)
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

std::set<sai_object_id_t> MockableSaiSwitchInterface::getColdBootDiscoveredVids() const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

std::set<sai_object_id_t> MockableSaiSwitchInterface::getWarmBootDiscoveredVids() const
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

void MockableSaiSwitchInterface::onPostPortCreate(
_In_ sai_object_id_t port_rid,
_In_ sai_object_id_t port_vid)
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

void MockableSaiSwitchInterface::postPortRemove(
_In_ sai_object_id_t portRid)
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}

void MockableSaiSwitchInterface::collectPortRelatedObjects(
_In_ sai_object_id_t portRid)
{
SWSS_LOG_ENTER();

SWSS_LOG_THROW("not implemented");
}
Loading

0 comments on commit afaa59d

Please sign in to comment.