Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added new attributes for Vnet and Vxlan ecmp configurations. #2584

Merged
merged 3 commits into from
Jan 11, 2023
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
23 changes: 21 additions & 2 deletions orchagent/vnetorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,7 @@ bool VNetOrch::addOperation(const Request& request)
uint32_t vni=0;
string tunnel;
string scope;
swss::MacAddress overlay_dmac;

for (const auto& name: request.getAttrFieldNames())
{
Expand Down Expand Up @@ -460,6 +461,10 @@ bool VNetOrch::addOperation(const Request& request)
{
advertise_prefix = request.getAttrBool("advertise_prefix");
}
else if (name == "overlay_dmac")
{
overlay_dmac = request.getAttrMacAddress("overlay_dmac");
}
else
{
SWSS_LOG_INFO("Unknown attribute: %s", name.c_str());
Expand All @@ -486,7 +491,7 @@ bool VNetOrch::addOperation(const Request& request)

if (it == std::end(vnet_table_))
{
VNetInfo vnet_info = { tunnel, vni, peer_list, scope, advertise_prefix };
VNetInfo vnet_info = { tunnel, vni, peer_list, scope, advertise_prefix, overlay_dmac };
obj = createObject<VNetVrfObject>(vnet_name, vnet_info, attrs);
create = true;

Expand Down Expand Up @@ -1917,7 +1922,9 @@ bool VNetRouteOrch::handleTunnel(const Request& request)
vector<string> vni_list;
vector<IpAddress> monitor_list;
string profile = "";

vector<IpAddress> primary_list;
string monitoring;
swss::IpPrefix adv_prefix;
for (const auto& name: request.getAttrFieldNames())
{
if (name == "endpoint")
Expand All @@ -1942,6 +1949,18 @@ bool VNetRouteOrch::handleTunnel(const Request& request)
{
profile = request.getAttrString(name);
}
else if (name == "primary")
{
primary_list = request.getAttrIPList(name);
}
else if (name == "monitoring")
{
monitoring = request.getAttrString(name);
}
else if (name == "adv_prefix")
{
adv_prefix = request.getAttrIpPrefix(name);
}
else
{
SWSS_LOG_INFO("Unknown attribute: %s", name.c_str());
Expand Down
15 changes: 14 additions & 1 deletion orchagent/vnetorch.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ const request_description_t vnet_request_description = {
{ "guid", REQ_T_STRING },
{ "scope", REQ_T_STRING },
{ "advertise_prefix", REQ_T_BOOL},
{ "overlay_dmac", REQ_T_MAC_ADDRESS},

},
{ "vxlan_tunnel", "vni" } // mandatory attributes
};
Expand All @@ -59,6 +61,7 @@ struct VNetInfo
set<string> peers;
string scope;
bool advertise_prefix;
swss::MacAddress overlay_dmac;
};

typedef map<VR_TYPE, sai_object_id_t> vrid_list_t;
Expand Down Expand Up @@ -86,7 +89,8 @@ class VNetObject
peer_list_(vnetInfo.peers),
vni_(vnetInfo.vni),
scope_(vnetInfo.scope),
advertise_prefix_(vnetInfo.advertise_prefix)
advertise_prefix_(vnetInfo.advertise_prefix),
overlay_dmac_(vnetInfo.overlay_dmac)
{ }

virtual bool updateObj(vector<sai_attribute_t>&) = 0;
Expand Down Expand Up @@ -121,6 +125,11 @@ class VNetObject
return advertise_prefix_;
}

swss::MacAddress getOverlayDMac() const
{
return overlay_dmac_;
}

virtual ~VNetObject() noexcept(false) {};

private:
Expand All @@ -129,6 +138,7 @@ class VNetObject
uint32_t vni_;
string scope_;
bool advertise_prefix_;
swss::MacAddress overlay_dmac_;
};

struct nextHop
Expand Down Expand Up @@ -282,6 +292,9 @@ const request_description_t vnet_route_description = {
{ "mac_address", REQ_T_STRING },
{ "endpoint_monitor", REQ_T_IP_LIST },
{ "profile", REQ_T_STRING },
{ "primary", REQ_T_IP_LIST },
{ "monitoring", REQ_T_STRING },
{ "adv_prefix", REQ_T_IP_PREFIX },
},
{ }
};
Expand Down
24 changes: 18 additions & 6 deletions tests/test_vnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,11 +140,11 @@ def delete_vnet_local_routes(dvs, prefix, vnet_name):
time.sleep(2)


def create_vnet_routes(dvs, prefix, vnet_name, endpoint, mac="", vni=0, ep_monitor="", profile=""):
set_vnet_routes(dvs, prefix, vnet_name, endpoint, mac=mac, vni=vni, ep_monitor=ep_monitor, profile=profile)
def create_vnet_routes(dvs, prefix, vnet_name, endpoint, mac="", vni=0, ep_monitor="", profile="", primary="", monitoring="", adv_prefix=""):
set_vnet_routes(dvs, prefix, vnet_name, endpoint, mac=mac, vni=vni, ep_monitor=ep_monitor, profile=profile, primary=primary, monitoring=monitoring, adv_prefix=adv_prefix)


def set_vnet_routes(dvs, prefix, vnet_name, endpoint, mac="", vni=0, ep_monitor="", profile=""):
def set_vnet_routes(dvs, prefix, vnet_name, endpoint, mac="", vni=0, ep_monitor="", profile="", primary="", monitoring="", adv_prefix=""):
conf_db = swsscommon.DBConnector(swsscommon.CONFIG_DB, dvs.redis_sock, 0)

attrs = [
Expand All @@ -163,6 +163,15 @@ def set_vnet_routes(dvs, prefix, vnet_name, endpoint, mac="", vni=0, ep_monitor=
if profile:
attrs.append(('profile', profile))

if primary:
attrs.append(('primary', primary))

if monitoring:
attrs.append(('monitoring', monitoring))

if adv_prefix:
attrs.append(('adv_prefix', adv_prefix))

tbl = swsscommon.Table(conf_db, "VNET_ROUTE_TUNNEL")
fvs = swsscommon.FieldValuePairs(attrs)
tbl.set("%s|%s" % (vnet_name, prefix), fvs)
Expand Down Expand Up @@ -317,7 +326,7 @@ def delete_phy_interface(dvs, ifname, ipaddr):
time.sleep(2)


def create_vnet_entry(dvs, name, tunnel, vni, peer_list, scope="", advertise_prefix=False):
def create_vnet_entry(dvs, name, tunnel, vni, peer_list, scope="", advertise_prefix=False, overlay_dmac=""):
conf_db = swsscommon.DBConnector(swsscommon.CONFIG_DB, dvs.redis_sock, 0)
asic_db = swsscommon.DBConnector(swsscommon.ASIC_DB, dvs.redis_sock, 0)

Expand All @@ -333,6 +342,9 @@ def create_vnet_entry(dvs, name, tunnel, vni, peer_list, scope="", advertise_pre
if advertise_prefix:
attrs.append(('advertise_prefix', 'true'))

if overlay_dmac:
attrs.append(('overlay_dmac', overlay_dmac))

# create the VXLAN tunnel Term entry in Config DB
create_entry_tbl(
conf_db,
Expand Down Expand Up @@ -2364,15 +2376,15 @@ def test_vnet_orch_17(self, dvs, testlog):
vnet_obj.fetch_exist_entries(dvs)

create_vxlan_tunnel(dvs, tunnel_name, '9.9.9.9')
create_vnet_entry(dvs, 'Vnet17', tunnel_name, '10009', "")
create_vnet_entry(dvs, 'Vnet17', tunnel_name, '10009', "", overlay_dmac="22:33:33:44:44:66")

vnet_obj.check_vnet_entry(dvs, 'Vnet17')
vnet_obj.check_vxlan_tunnel_entry(dvs, tunnel_name, 'Vnet17', '10009')

vnet_obj.check_vxlan_tunnel(dvs, tunnel_name, '9.9.9.9')

vnet_obj.fetch_exist_entries(dvs)
create_vnet_routes(dvs, "100.100.1.1/32", 'Vnet17', '9.0.0.1,9.0.0.2,9.0.0.3', ep_monitor='9.1.0.1,9.1.0.2,9.1.0.3')
create_vnet_routes(dvs, "100.100.1.1/32", 'Vnet17', '9.0.0.1,9.0.0.2,9.0.0.3', ep_monitor='9.1.0.1,9.1.0.2,9.1.0.3', primary ='9.0.0.1',monitoring='custom', adv_prefix='100.100.1.1/27')

# default bfd status is down, route should not be programmed in this status
vnet_obj.check_del_vnet_routes(dvs, 'Vnet17', ["100.100.1.1/32"])
Expand Down