Skip to content

Commit fe36ee8

Browse files
committed
Changes #3
1 parent 6694900 commit fe36ee8

7 files changed

Lines changed: 218 additions & 50 deletions

File tree

orchagent/fdborch.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -635,12 +635,26 @@ void FdbOrch::doTask(Consumer& consumer)
635635
{
636636
VxlanTunnelOrch* tunnel_orch = gDirectory.get<VxlanTunnelOrch*>();
637637

638-
if(!remote_ip.length())
638+
if (tunnel_orch->dipTunnelsUsed())
639639
{
640-
it = consumer.m_toSync.erase(it);
641-
continue;
640+
if(!remote_ip.length())
641+
{
642+
it = consumer.m_toSync.erase(it);
643+
continue;
644+
}
645+
port = tunnel_orch->getTunnelPortName(remote_ip);
646+
}
647+
else
648+
{
649+
EvpnNvoOrch* evpn_nvo_orch = gDirectory.get<EvpnNvoOrch*>();
650+
VxlanTunnel* sip_tunnel = evpn_nvo_orch->getEVPNVtep();
651+
if (sip_tunnel == NULL)
652+
{
653+
it = consumer.m_toSync.erase(it);
654+
continue;
655+
}
656+
port = tunnel_orch->getTunnelPortName(sip_tunnel->getSrcIP().to_string(), true);
642657
}
643-
port = tunnel_orch->getTunnelPortName(remote_ip);
644658
}
645659

646660

orchagent/orchdaemon.cpp

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,15 +151,12 @@ bool OrchDaemon::init()
151151
CoppOrch *copp_orch = new CoppOrch(m_applDb, APP_COPP_TABLE_NAME);
152152
TunnelDecapOrch *tunnel_decap_orch = new TunnelDecapOrch(m_applDb, APP_TUNNEL_DECAP_TABLE_NAME);
153153

154-
VxlanTunnelOrch *vxlan_tunnel_orch = new VxlanTunnelOrch(m_stateDb, m_applDb, APP_VXLAN_TUNNEL_TABLE_NAME);
155-
gDirectory.set(vxlan_tunnel_orch);
156154
VxlanTunnelMapOrch *vxlan_tunnel_map_orch = new VxlanTunnelMapOrch(m_applDb, APP_VXLAN_TUNNEL_MAP_TABLE_NAME);
157155
gDirectory.set(vxlan_tunnel_map_orch);
158156
VxlanVrfMapOrch *vxlan_vrf_orch = new VxlanVrfMapOrch(m_applDb, APP_VXLAN_VRF_TABLE_NAME);
159157
gDirectory.set(vxlan_vrf_orch);
158+
VxlanTunnelOrch *vxlan_tunnel_orch; = new VxlanTunnelOrch(m_stateDb, m_applDb, APP_VXLAN_TUNNEL_TABLE_NAME);
160159

161-
EvpnRemoteVniOrch* evpn_remote_vni_orch = new EvpnRemoteVniOrch(m_applDb, APP_VXLAN_REMOTE_VNI_TABLE_NAME);
162-
gDirectory.set(evpn_remote_vni_orch);
163160

164161
EvpnNvoOrch* evpn_nvo_orch = new EvpnNvoOrch(m_applDb, APP_VXLAN_EVPN_NVO_TABLE_NAME);
165162
gDirectory.set(evpn_nvo_orch);
@@ -319,10 +316,30 @@ bool OrchDaemon::init()
319316
m_orchList.push_back(gAclOrch);
320317
m_orchList.push_back(chassis_frontend_orch);
321318
m_orchList.push_back(vrf_orch);
322-
m_orchList.push_back(vxlan_tunnel_orch);
323-
m_orchList.push_back(evpn_nvo_orch);
324-
m_orchList.push_back(vxlan_tunnel_map_orch);
325-
m_orchList.push_back(evpn_remote_vni_orch);
319+
320+
if (platform == MLNX_PLATFORM_SUBSTRING)
321+
{
322+
EvpnRemoteVnip2mpOrch* evpn_remote_vni_orch = new EvpnRemoteVnip2mpOrch(m_applDb, APP_VXLAN_REMOTE_VNI_TABLE_NAME);
323+
gDirectory.set(evpn_remote_vni_orch);
324+
vxlan_tunnel_orch = new VxlanTunnelOrch(m_stateDb, m_applDb, APP_VXLAN_TUNNEL_TABLE_NAME, false);
325+
gDirectory.set(vxlan_tunnel_orch);
326+
m_orchList.push_back(vxlan_tunnel_orch);
327+
m_orchList.push_back(evpn_nvo_orch);
328+
m_orchList.push_back(vxlan_tunnel_map_orch);
329+
m_orchList.push_back(evpn_remote_vni_orch);
330+
}
331+
else
332+
{
333+
EvpnRemoteVnip2pOrch* evpn_remote_vni_orch = new EvpnRemoteVnip2pOrch(m_applDb, APP_VXLAN_REMOTE_VNI_TABLE_NAME);
334+
gDirectory.set(evpn_remote_vni_orch);
335+
vxlan_tunnel_orch = new VxlanTunnelOrch(m_stateDb, m_applDb, APP_VXLAN_TUNNEL_TABLE_NAME, true);
336+
gDirectory.set(vxlan_tunnel_orch);
337+
m_orchList.push_back(vxlan_tunnel_orch);
338+
m_orchList.push_back(evpn_nvo_orch);
339+
m_orchList.push_back(vxlan_tunnel_map_orch);
340+
m_orchList.push_back(evpn_remote_vni_orch);
341+
}
342+
326343
m_orchList.push_back(vxlan_vrf_orch);
327344
m_orchList.push_back(cfg_vnet_rt_orch);
328345
m_orchList.push_back(vnet_orch);

orchagent/port.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,7 @@ struct VlanInfo
4242
sai_vlan_flood_control_type_t uuc_flood_type = SAI_VLAN_FLOOD_CONTROL_TYPE_ALL;
4343
sai_vlan_flood_control_type_t umc_flood_type = SAI_VLAN_FLOOD_CONTROL_TYPE_ALL;
4444
sai_vlan_flood_control_type_t bc_flood_type = SAI_VLAN_FLOOD_CONTROL_TYPE_ALL;
45-
sai_object_id_t uuc_flood_group = SAI_NULL_OBJECT_ID;
46-
sai_object_id_t umc_flood_group = SAI_NULL_OBJECT_ID;
47-
sai_object_id_t bc_flood_group = SAI_NULL_OBJECT_ID;
45+
spai_object_id_t l2mc_group_id = SAI_NULL_OBJECT_ID;
4846
endpoint_ip_l2mc_group_member_map_t l2mc_members;
4947
};
5048

orchagent/portsorch.cpp

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4135,20 +4135,8 @@ bool PortsOrch::addVlanFloodGroups(Port &vlan, Port &port, string &tagging_mode,
41354135
sai_object_id_t l2mc_group_id = SAI_NULL_OBJECT_ID;
41364136
sai_status_t status;
41374137

4138-
if (vlan.m_vlan_info.uuc_flood_type == SAI_VLAN_FLOOD_CONTROL_TYPE_COMBINED)
4139-
{
4140-
l2mc_group_id = vlan.m_vlan_info.uuc_flood_group;
4141-
}
4142-
else if (vlan.m_vlan_info.umc_flood_type == SAI_VLAN_FLOOD_CONTROL_TYPE_COMBINED)
4143-
{
4144-
l2mc_group_id = vlan.m_vlan_info.umc_flood_group;
4145-
}
4146-
else if (vlan.m_vlan_info.umc_flood_type == SAI_VLAN_FLOOD_CONTROL_TYPE_COMBINED)
4147-
{
4148-
l2mc_group_id = vlan.m_vlan_info.bc_flood_group;
4149-
}
41504138

4151-
if (l2mc_group_id == SAI_NULL_OBJECT_ID)
4139+
if (vlan.m_vlan_info.l2mc_group_id == SAI_NULL_OBJECT_ID)
41524140
{
41534141
status = sai_l2mc_group_api->create_l2mc_group(&l2mc_group_id, gSwitchId, 0, NULL);
41544142
if (status != SAI_STATUS_SUCCESS)
@@ -4171,7 +4159,6 @@ bool PortsOrch::addVlanFloodGroups(Port &vlan, Port &port, string &tagging_mode,
41714159
l2mc_group_id, vlan.m_vlan_info.vlan_id);
41724160
return false;
41734161
}
4174-
vlan.m_vlan_info.uuc_flood_group = l2mc_group_id;
41754162
}
41764163
if (vlan.m_vlan_info.umc_flood_type == SAI_VLAN_FLOOD_CONTROL_TYPE_COMBINED)
41774164
{
@@ -4186,7 +4173,6 @@ bool PortsOrch::addVlanFloodGroups(Port &vlan, Port &port, string &tagging_mode,
41864173
l2mc_group_id, vlan.m_vlan_info.vlan_id);
41874174
return false;
41884175
}
4189-
vlan.m_vlan_info.umc_flood_group = l2mc_group_id;
41904176
}
41914177
if (vlan.m_vlan_info.bc_flood_type == SAI_VLAN_FLOOD_CONTROL_TYPE_COMBINED)
41924178
{
@@ -4201,8 +4187,8 @@ bool PortsOrch::addVlanFloodGroups(Port &vlan, Port &port, string &tagging_mode,
42014187
l2mc_group_id, vlan.m_vlan_info.vlan_id);
42024188
return false;
42034189
}
4204-
vlan.m_vlan_info.bc_flood_group = l2mc_group_id;
42054190
}
4191+
vlan.m_vlan_info.l2mc_group_id = l2mc_group_id;
42064192
}
42074193

42084194
vector<sai_attribute_t> attrs;
@@ -4302,10 +4288,7 @@ bool PortsOrch::addVlanMember(Port &vlan, Port &port, string &tagging_mode, stri
43024288
SWSS_LOG_ERROR("Flood group with end point ip is not supported");
43034289
return false;
43044290
}
4305-
if (vlan.m_members.find(port.m_alias) == vlan.m_members.end())
4306-
{
4307-
4308-
}
4291+
// TODO Check if P2MP bridgeport needs to be added as vlan member
43094292
return addVlanFloodGroups(vlan, port, end_point_ip);
43104293
}
43114294

@@ -4374,8 +4357,6 @@ bool PortsOrch::removeVlanEndPointIP(Port &vlan, Port &port, string end_point_ip
43744357
vlan.m_vlan_info.vlan_id);
43754358
return false;
43764359
}
4377-
l2mc_group_id = vlan.m_vlan_info.uuc_flood_group;
4378-
vlan.m_vlan_info.uuc_flood_group = SAI_NULL_OBJECT_ID;
43794360
}
43804361
if (vlan.m_vlan_info.umc_flood_type == SAI_VLAN_FLOOD_CONTROL_TYPE_COMBINED)
43814362
{
@@ -4390,8 +4371,6 @@ bool PortsOrch::removeVlanEndPointIP(Port &vlan, Port &port, string end_point_ip
43904371
vlan.m_vlan_info.vlan_id);
43914372
return false;
43924373
}
4393-
l2mc_group_id = vlan.m_vlan_info.umc_flood_group;
4394-
vlan.m_vlan_info.umc_flood_group = SAI_NULL_OBJECT_ID;
43954374
}
43964375
if (vlan.m_vlan_info.bc_flood_type == SAI_VLAN_FLOOD_CONTROL_TYPE_COMBINED)
43974376
{
@@ -4406,15 +4385,14 @@ bool PortsOrch::removeVlanEndPointIP(Port &vlan, Port &port, string end_point_ip
44064385
vlan.m_vlan_info.vlan_id);
44074386
return false;
44084387
}
4409-
l2mc_group_id = vlan.m_vlan_info.bc_flood_group;
4410-
vlan.m_vlan_info.bc_flood_group = SAI_NULL_OBJECT_ID;
44114388
}
4412-
status = sai_l2mc_group_api->remove_l2mc_group(l2mc_group_id);
4389+
status = sai_l2mc_group_api->remove_l2mc_group(vlan.m_vlan_info.l2mc_group_id);
44134390
if (status != SAI_STATUS_SUCCESS)
44144391
{
44154392
SWSS_LOG_ERROR("Failed to remove l2mc group %" PRIx64, l2mc_group_id);
44164393
return false;
44174394
}
4395+
vlan.m_vlan_info.l2mc_group_id = SAI_NULL_OBJECT_ID;
44184396
}
44194397
return true;
44204398
}
@@ -4470,8 +4448,16 @@ bool PortsOrch::removeVlanMember(Port &vlan, Port &port, string end_point_ip="")
44704448
return true;
44714449
}
44724450

4473-
bool PortsOrch::isVlanMember(Port &vlan, Port &port)
4451+
bool PortsOrch::isVlanMember(Port &vlan, Port &port, string end_point_ip = "")
44744452
{
4453+
if (!end_point_ip.empty())
4454+
{
4455+
if (vlan.m_vlan_info.l2mc_members.find(end_point_ip) != vlan.m_vlan_info.l2mc_members.end())
4456+
{
4457+
return true;
4458+
}
4459+
return false;
4460+
}
44754461
if (vlan.m_members.find(port.m_alias) == vlan.m_members.end())
44764462
return false;
44774463

orchagent/portsorch.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ class PortsOrch : public Orch, public Subject
144144
bool removeBridgePort(Port &port);
145145
bool addVlanMember(Port &vlan, Port &port, string& tagging_mode);
146146
bool removeVlanMember(Port &vlan, Port &port);
147-
bool isVlanMember(Port &vlan, Port &port);
147+
bool isVlanMember(Port &vlan, Port &port, string end_point_ip = "");
148148

149149
string m_inbandPortName = "";
150150
bool isInbandPort(const string &alias);

orchagent/vxlanorch.cpp

Lines changed: 133 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,7 +2037,7 @@ bool VxlanVrfMapOrch::delOperation(const Request& request)
20372037

20382038
//------------------- EVPN_REMOTE_VNI Table --------------------------//
20392039

2040-
bool EvpnRemoteVniOrch::addOperation(const Request& request)
2040+
bool EvpnRemoteVnip2pOrch::addOperation(const Request& request)
20412041
{
20422042
SWSS_LOG_ENTER();
20432043

@@ -2104,7 +2104,7 @@ bool EvpnRemoteVniOrch::addOperation(const Request& request)
21042104
return true;
21052105
}
21062106

2107-
bool EvpnRemoteVniOrch::delOperation(const Request& request)
2107+
bool EvpnRemoteVnip2pOrch::delOperation(const Request& request)
21082108
{
21092109
bool ret;
21102110

@@ -2180,6 +2180,137 @@ bool EvpnRemoteVniOrch::delOperation(const Request& request)
21802180
return ret;
21812181
}
21822182

2183+
bool EvpnRemoteVnip2mpOrch::addOperation(const Request& request)
2184+
{
2185+
SWSS_LOG_ENTER();
2186+
2187+
EvpnNvoOrch* evpn_nvo_orch = gDirectory.get<EvpnNvoOrch*>();
2188+
// Extract end point ip
2189+
auto end_point_ip = request.getKeyString(1);
2190+
2191+
// Extract VLAN and VNI
2192+
auto vlan_name = request.getKeyString(0);
2193+
sai_vlan_id_t vlan_id = (sai_vlan_id_t) stoi(vlan_name.substr(4));
2194+
2195+
auto vni_id = static_cast<sai_uint32_t>(request.getAttrUint("vni"));
2196+
if (vni_id >= 1<<24)
2197+
{
2198+
SWSS_LOG_ERROR("Vxlan tunnel map vni id is too big: %d", vni_id);
2199+
return true;
2200+
}
2201+
2202+
VxlanTunnelOrch* tunnel_orch = gDirectory.get<VxlanTunnelOrch*>();
2203+
Port tunnelPort, vlanPort;
2204+
auto vtep_ptr = evpn_orch->getEVPNVtep();
2205+
if (!vtep_ptr)
2206+
{
2207+
SWSS_LOG_WARN("Remote VNI add: VTEP not found. remote=%s vid=%d",
2208+
remote_vtep.c_str(),vlan_id);
2209+
return true;
2210+
}
2211+
2212+
if (!gPortsOrch->getVlanByVlanId(vlan_id, vlanPort))
2213+
{
2214+
SWSS_LOG_WARN("Vxlan tunnel map vlan id doesn't exist: %d", vlan_id);
2215+
return false;
2216+
}
2217+
2218+
auto src_vtep = vtep_ptr->getSrcIP().to_string();
2219+
if (tunnel_orch->getTunnelPort(src_vtep,tunnelPort, true))
2220+
{
2221+
SWSS_LOG_INFO("Vxlan tunnelPort exists: %s", remote_vtep.c_str());
2222+
2223+
if (gPortsOrch->isVlanMember(vlanPort, tunnelPort, end_point_ip))
2224+
{
2225+
SWSS_LOG_WARN("Remote end point %s already member of vid %d",
2226+
end_point_ip.c_str(),vlan_id);
2227+
vtep_ptr->increment_spurious_imr_add(remote_vtep);
2228+
return true;
2229+
}
2230+
}
2231+
else
2232+
{
2233+
SWSS_LOG_WARN("Vxlan tunnelPort doesn't exist: %s", src_vtep.c_str());
2234+
return false;
2235+
}
2236+
2237+
// SAI Call to add tunnel to the VLAN flood domain
2238+
2239+
string tagging_mode = "untagged";
2240+
gPortsOrch->addVlanMember(vlanPort, tunnelPort, tagging_mode, end_point_ip);
2241+
2242+
SWSS_LOG_INFO("end_point_ip=%s vni=%d vlanid=%d ",
2243+
remote_vtep.c_str(), vni_id, vlan_id);
2244+
2245+
return true;
2246+
}
2247+
2248+
bool EvpnRemoteVnip2mpOrch::delOperation(const Request& request)
2249+
{
2250+
bool ret;
2251+
2252+
SWSS_LOG_ENTER();
2253+
2254+
// Extract end point ip
2255+
auto end_point_ip = request.getKeyString(1);
2256+
2257+
// Extract VLAN and VNI
2258+
auto vlan_name = request.getKeyString(0);
2259+
sai_vlan_id_t vlan_id = (sai_vlan_id_t)stoi(vlan_name.substr(4));
2260+
2261+
auto vni_id = static_cast<sai_uint32_t>(request.getAttrUint("vni"));
2262+
if (vni_id >= 1<<24)
2263+
{
2264+
SWSS_LOG_ERROR("Vxlan tunnel map vni id is too big: %d", vni_id);
2265+
return true;
2266+
}
2267+
2268+
// SAI Call to add tunnel to the VLAN flood domain
2269+
2270+
VxlanTunnelOrch* tunnel_orch = gDirectory.get<VxlanTunnelOrch*>();
2271+
Port vlanPort, tunnelPort;
2272+
EvpnNvoOrch* evpn_nvo_orch = gDirectory.get<EvpnNvoOrch*>();
2273+
2274+
auto vtep_ptr = evpn_orch->getEVPNVtep();
2275+
if (!vtep_ptr)
2276+
{
2277+
SWSS_LOG_WARN("Remote VNI add: VTEP not found. remote=%s vid=%d",
2278+
remote_vtep.c_str(),vlan_id);
2279+
return true;
2280+
}
2281+
2282+
if (!gPortsOrch->getVlanByVlanId(vlan_id, vlanPort))
2283+
{
2284+
SWSS_LOG_WARN("Vxlan tunnel map vlan id doesn't exist: %d", vlan_id);
2285+
return true;
2286+
}
2287+
2288+
auto src_vtep = vtep_ptr->getSrcIP().to_string();
2289+
if (!tunnel_orch->getTunnelPort(src_vtep,tunnelPort,true))
2290+
{
2291+
SWSS_LOG_WARN("RemoteVniDel getTunnelPort Fails: %s", src_vtep.c_str());
2292+
return true;
2293+
}
2294+
2295+
2296+
if (!gPortsOrch->isVlanMember(vlanPort, tunnelPort, end_point_ip))
2297+
{
2298+
SWSS_LOG_WARN("marking it as spurious tunnelPort %s not a member of vid %d",
2299+
end_point_ip.c_str(), vlan_id);
2300+
vtep_ptr->increment_spurious_imr_del(end_point_ip);
2301+
return true;
2302+
}
2303+
2304+
if (!gPortsOrch->removeVlanMember(vlanPort, tunnelPort, end_point_ip))
2305+
{
2306+
SWSS_LOG_WARN("RemoteVniDel remove vlan member fails: vlan:%hu ip %s",
2307+
vlan_id, end_point_ip.c_str());
2308+
return false;
2309+
}
2310+
2311+
return true;
2312+
}
2313+
21832314
//------------------- EVPN_NVO Table --------------------------//
21842315

21852316
bool EvpnNvoOrch::addOperation(const Request& request)

0 commit comments

Comments
 (0)