From dcee54c218688de792ccf2e4ad97f5d00dc57fc9 Mon Sep 17 00:00:00 2001 From: Naveen N Date: Mon, 20 Feb 2017 11:17:31 +0530 Subject: [PATCH] * Ignore broadcast route change when p-VRF is absent * Correct bridge domain sandesh filtering * Test case for same. Change-Id: Idf61ce5e449e7ad607d7edad77f7f96df3491903 Closes-bug:#1666012,#1665244,#1665253 --- src/vnsw/agent/oper/agent_sandesh.cc | 2 +- src/vnsw/agent/oper/multicast.cc | 9 ++-- .../agent/oper/test/test_bridge_domain_mg.cc | 52 +++++++++++++++++++ 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/vnsw/agent/oper/agent_sandesh.cc b/src/vnsw/agent/oper/agent_sandesh.cc index 8838e11fd5e..3432350919d 100644 --- a/src/vnsw/agent/oper/agent_sandesh.cc +++ b/src/vnsw/agent/oper/agent_sandesh.cc @@ -1222,7 +1222,7 @@ bool QosQueueSandesh::FilterToArgs(AgentSandeshArguments *args) { BridgeDomainSandesh::BridgeDomainSandesh(const std::string &context, const std::string &u, const std::string &name) : - AgentSandesh(context, ""), name_(name) { + AgentSandesh(context, ""), uuid_str_(u), name_(name) { boost::system::error_code ec; uuid_ = StringToUuid(u); } diff --git a/src/vnsw/agent/oper/multicast.cc b/src/vnsw/agent/oper/multicast.cc index c54b0103de2..eb9ff05b78e 100644 --- a/src/vnsw/agent/oper/multicast.cc +++ b/src/vnsw/agent/oper/multicast.cc @@ -900,11 +900,12 @@ void MulticastHandler::ModifyEvpnMembers(const Peer *peer, MulticastGroupObject *obj = FindActiveGroupObject(vrf_name, grp); std::string derived_vrf_name = vrf_name; - if (ethernet_tag) { + if (ethernet_tag && obj) { MulticastGroupObject *dependent_mg = obj->GetDependentMG(ethernet_tag); if (dependent_mg) { obj = dependent_mg; + derived_vrf_name = obj->vrf_name(); } } @@ -921,7 +922,7 @@ void MulticastHandler::ModifyEvpnMembers(const Peer *peer, TriggerRemoteRouteChange(obj, peer, derived_vrf_name, olist, peer_identifier, delete_op, Composite::EVPN, MplsTable::kInvalidLabel, false, ethernet_tag); - MCTRACE(Log, "Add EVPN TOR Olist ", vrf_name, grp.to_string(), 0); + MCTRACE(Log, "Add EVPN TOR Olist ", derived_vrf_name, grp.to_string(), 0); } void MulticastHandler::ModifyTorMembers(const Peer *peer, @@ -959,9 +960,9 @@ void MulticastGroupObject::FlushAllPeerInfo(const Agent *agent, (peer_identifier == INVALID_PEER_IDENTIFIER)) { agent->oper_db()->multicast()->DeleteBroadcast(peer, vrf_name_, 0, Composite::FABRIC); + MCTRACE(Log, "Delete broadcast route", vrf_name_, + grp_address_.to_string(), 0); } - MCTRACE(Log, "Delete broadcast route", vrf_name_, - grp_address_.to_string(), 0); } MulticastHandler::MulticastHandler(Agent *agent) diff --git a/src/vnsw/agent/oper/test/test_bridge_domain_mg.cc b/src/vnsw/agent/oper/test/test_bridge_domain_mg.cc index f7e43ed682f..47af0a54dc0 100644 --- a/src/vnsw/agent/oper/test/test_bridge_domain_mg.cc +++ b/src/vnsw/agent/oper/test/test_bridge_domain_mg.cc @@ -414,6 +414,58 @@ TEST_F(BridgeDomainMGTest, Test8) { EXPECT_TRUE(l2_rt->GetActivePath()->vxlan_id() == 2); } +//Verify that MPLS label points to +//multicast NH upon EVPN bgp peer path delete and readd +TEST_F(BridgeDomainMGTest, Test9) { + std::stringstream str; + //Add a peer and enqueue path add in multicast route. + BgpPeer *bgp_peer_ptr = CreateBgpPeer(Ip4Address(1), "BGP Peer1"); + agent->mpls_table()->ReserveMulticastLabel(4000, 5000, 0); + MulticastHandler *mc_handler = static_cast(agent-> + oper_db()->multicast()); + + CreateBridgeDomain(input[0].name, 1); + client->WaitForIdle(); + + //Modify olist for pbb VRF and B component VRF + //and verify it gets updated for cmac vrf + TunnelOlist olist; + olist.push_back(OlistTunnelEntry(nil_uuid(), 10, + IpAddress::from_string("8.8.8.8").to_v4(), + TunnelType::MplsType())); + mc_handler->ModifyEvpnMembers(bgp_peer_ptr, + "vrf1", olist, 1, 1); + mc_handler->ModifyEvpnMembers(bgp_peer_ptr, "vrf1", + olist, 0, 1); + client->WaitForIdle(); + + BridgeRouteEntry *l2_rt = + L2RouteGet("vrf1:00000000-0000-0000-0000-000000000001", + MacAddress("FF:FF:FF:FF:FF:FF")); + NextHop *l2_nh = const_cast(l2_rt->GetActiveNextHop()); + const CompositeNH *cnh = dynamic_cast(l2_nh); + + uint32_t label = l2_rt->FindPath(agent->local_vm_peer())->label(); + EXPECT_TRUE(MplsToNextHop(label) == cnh); + + //Flush the BGP path + mc_handler->ModifyEvpnMembers(bgp_peer_ptr, + "vrf1", olist, 1, + ControllerPeerPath::kInvalidPeerIdentifier); + client->WaitForIdle(); + + l2_nh = const_cast(l2_rt->GetActiveNextHop()); + cnh = dynamic_cast(l2_nh); + EXPECT_TRUE(MplsToNextHop(label) == cnh); + + l2_rt = L2RouteGet("vrf1", MacAddress("FF:FF:FF:FF:FF:FF")); + EXPECT_TRUE(l2_rt->FindPath(bgp_peer_ptr)); + + DeleteBridgeDomain(input[0].name); + DeleteBgpPeer(bgp_peer_ptr); + client->WaitForIdle(); +} + int main(int argc, char **argv) { GETUSERARGS();