Skip to content

Commit

Permalink
Merge "Flood DHCP requests from sources without VMIs." into R2.20
Browse files Browse the repository at this point in the history
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Jul 17, 2015
2 parents 78af28a + 49b936d commit e7c2af5
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 e7c2af5

Please sign in to comment.