diff --git a/src/vnsw/agent/vrouter/ksync/route_ksync.cc b/src/vnsw/agent/vrouter/ksync/route_ksync.cc index 426248d5aa3..cd18a0e8e52 100644 --- a/src/vnsw/agent/vrouter/ksync/route_ksync.cc +++ b/src/vnsw/agent/vrouter/ksync/route_ksync.cc @@ -436,7 +436,7 @@ bool RouteKSyncEntry::Sync(DBEntry *e) { //First search for v4 const MacVmBindingPath *dhcp_path = dynamic_cast (l2_rt->FindMacVmBindingPath()); - bool flood_dhcp = false; + bool flood_dhcp = true; // Flood DHCP if MacVmBindingPath is not present if (dhcp_path) flood_dhcp = dhcp_path->flood_dhcp(); diff --git a/src/vnsw/agent/vrouter/ksync/route_ksync.h b/src/vnsw/agent/vrouter/ksync/route_ksync.h index 4564175e432..8b51fb5a690 100644 --- a/src/vnsw/agent/vrouter/ksync/route_ksync.h +++ b/src/vnsw/agent/vrouter/ksync/route_ksync.h @@ -33,6 +33,7 @@ class RouteKSyncEntry : public KSyncNetlinkDBEntry { uint32_t label() const { return label_; } bool proxy_arp() const { return proxy_arp_; } bool flood() const { return flood_; } + bool flood_dhcp() const { return flood_dhcp_; } bool wait_for_traffic() const { return wait_for_traffic_; } MacAddress mac() const { return mac_; } NHKSyncEntry* nh() const { diff --git a/src/vnsw/agent/vrouter/ksync/test/test_ksync_route.cc b/src/vnsw/agent/vrouter/ksync/test/test_ksync_route.cc index f4cfe894d65..dd11fb868e3 100644 --- a/src/vnsw/agent/vrouter/ksync/test/test_ksync_route.cc +++ b/src/vnsw/agent/vrouter/ksync/test/test_ksync_route.cc @@ -40,6 +40,12 @@ class TestKSyncRoute : public ::testing::Test { (vrf1_->GetState(table, vrf_listener_id_)); vrf1_rt_obj_ = state->inet4_uc_route_table_; + vrf1_evpn_table_ = static_cast + (vrf1_->GetEvpnRouteTable()); + vrf1_bridge_table_ = static_cast + (vrf1_->GetBridgeRouteTable()); + vrf1_bridge_rt_obj_ = state->bridge_route_table_; + VrfEntry *fabric_vrf = table->FindVrfFromName(agent_->fabric_vrf_name()); fabric_uc_table_ = static_cast @@ -73,6 +79,21 @@ class TestKSyncRoute : public ::testing::Test { client->WaitForIdle(); } + void AddRemoteEvpnRoute(Peer *peer, const MacAddress &mac, + const IpAddress &addr, uint32_t ethernet_tag, + const string &vn) { + SecurityGroupList sg_list; + PathPreference path_pref; + ControllerVmRoute *data = NULL; + data = ControllerVmRoute::MakeControllerVmRoute + (NULL, agent_->fabric_vrf_name(), agent_->router_id(), + "vrf1", Ip4Address::from_string("10.10.10.2"), TunnelType::GREType(), + 100, vn, sg_list, path_pref); + vrf1_evpn_table_->AddRemoteVmRouteReq(peer, "vrf1", mac, addr, + ethernet_tag, data); + client->WaitForIdle(); + } + Agent *agent_; VnswInterfaceListener *vnswif_; VmInterface *vnet1_; @@ -82,7 +103,10 @@ class TestKSyncRoute : public ::testing::Test { VrfKSyncObject *vrf1_obj_; InetUnicastAgentRouteTable *vrf1_uc_table_; InetUnicastAgentRouteTable *fabric_uc_table_; + EvpnAgentRouteTable *vrf1_evpn_table_; + BridgeAgentRouteTable *vrf1_bridge_table_; RouteKSyncObject *vrf1_rt_obj_; + RouteKSyncObject *vrf1_bridge_rt_obj_; RouteKSyncObject *fabric_rt_obj_; }; @@ -157,6 +181,32 @@ TEST_F(TestKSyncRoute, remote_route_2) { client->WaitForIdle(); } +// dhcp_flood flag for remote EVPN route +TEST_F(TestKSyncRoute, remote_evpn_route_1) { + MacAddress vmi_mac(input[0].mac); + BridgeRouteEntry *vmi_rt = vrf1_bridge_table_->FindRoute(vmi_mac); + EXPECT_TRUE(vmi_rt != NULL); + std::auto_ptr ksync_vmi(new RouteKSyncEntry( + vrf1_bridge_rt_obj_, vmi_rt)); + ksync_vmi->Sync(vmi_rt); + EXPECT_FALSE(ksync_vmi->flood_dhcp()); // flood DHCP not set when VMI exists + + uint32_t ethernet_tag = 1000; + MacAddress mac("00:01:02:03:04:05"); + IpAddress addr = IpAddress(Ip4Address::from_string("1.1.1.100")); + AddRemoteEvpnRoute(NULL, mac, addr, ethernet_tag, "vn1"); + + BridgeRouteEntry *rt = vrf1_bridge_table_->FindRoute(mac); + EXPECT_TRUE(rt != NULL); + + std::auto_ptr ksync(new RouteKSyncEntry(vrf1_bridge_rt_obj_, rt)); + ksync->Sync(rt); + EXPECT_TRUE(ksync->flood_dhcp()); // flood DHCP set for MAC without VMI + + vrf1_evpn_table_->DeleteReq(NULL, "vrf1", mac, addr, ethernet_tag); + client->WaitForIdle(); +} + // proxy_arp_ and flood_ flags for route with different VNs TEST_F(TestKSyncRoute, different_vn_1) { IpAddress addr = IpAddress(Ip4Address::from_string("2.2.2.100"));