Skip to content

Commit

Permalink
Flood DHCP requests from sources without VMIs.
Browse files Browse the repository at this point in the history
Even if VMIs are not present, flood DHCP requests from such source MACs.

Change-Id: I3fa33bbe1c93e682dd01b94b1aee6f8b6426664a
closes-bug: 1474247
  • Loading branch information
haripk committed Jul 16, 2015
1 parent 68af269 commit 49b936d
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/vnsw/agent/vrouter/ksync/route_ksync.cc
Expand Up @@ -436,7 +436,7 @@ bool RouteKSyncEntry::Sync(DBEntry *e) {
//First search for v4
const MacVmBindingPath *dhcp_path = dynamic_cast<const MacVmBindingPath *>
(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();

Expand Down
1 change: 1 addition & 0 deletions src/vnsw/agent/vrouter/ksync/route_ksync.h
Expand Up @@ -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 {
Expand Down
50 changes: 50 additions & 0 deletions src/vnsw/agent/vrouter/ksync/test/test_ksync_route.cc
Expand Up @@ -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<EvpnAgentRouteTable *>
(vrf1_->GetEvpnRouteTable());
vrf1_bridge_table_ = static_cast<BridgeAgentRouteTable *>
(vrf1_->GetBridgeRouteTable());
vrf1_bridge_rt_obj_ = state->bridge_route_table_;

VrfEntry *fabric_vrf =
table->FindVrfFromName(agent_->fabric_vrf_name());
fabric_uc_table_ = static_cast<InetUnicastAgentRouteTable *>
Expand Down Expand Up @@ -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_;
Expand All @@ -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_;
};

Expand Down Expand Up @@ -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<RouteKSyncEntry> 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<RouteKSyncEntry> 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"));
Expand Down

0 comments on commit 49b936d

Please sign in to comment.