shill: Delete existing routes when the device is started.
BUG=chromium-os:27358
TEST=Unit tests, network_WiFiManager, manually add foreign routes and
ensure they are deleted, also test to make sure default route remains
after DHCP renewal
Change-Id: Ic26b70d685491f31699ff4684ed289e76af8a9ca
Reviewed-on: https://gerrit.chromium.org/gerrit/17640
Commit-Ready: Thieu Le <thieule@chromium.org>
Reviewed-by: Thieu Le <thieule@chromium.org>
Tested-by: Thieu Le <thieule@chromium.org>
diff --git a/routing_table_unittest.cc b/routing_table_unittest.cc
index 0722529..c1d22e7 100644
--- a/routing_table_unittest.cc
+++ b/routing_table_unittest.cc
@@ -396,9 +396,13 @@
0),
_,
0));
- routing_table_->FlushRoutes(kTestDeviceIndex0, true);
+ routing_table_->FlushRoutes(kTestDeviceIndex0);
+ EXPECT_EQ(0, (*tables)[kTestDeviceIndex0].size());
// Test that the routing table size returns to zero.
+ SendRouteMsg(RTNLMessage::kModeAdd,
+ kTestDeviceIndex0,
+ entry5);
EXPECT_EQ(1, GetRoutingTables()->size());
routing_table_->ResetTable(kTestDeviceIndex0);
EXPECT_EQ(0, GetRoutingTables()->size());
@@ -407,151 +411,4 @@
StopRTNLHandler();
}
-TEST_F(RoutingTableTest, RouteDeleteForeign) {
- EXPECT_CALL(sockets_, Send(kTestSocket, _, _, 0));
- StartRTNLHandler();
- routing_table_->Start();
-
- // Expect the tables to be empty by default.
- EXPECT_EQ(0, GetRoutingTables()->size());
-
- // Add a foreign IPv4 entry.
- IPAddress default_address4(IPAddress::kFamilyIPv4);
- default_address4.SetAddressToDefault();
-
- IPAddress foreign_address4(IPAddress::kFamilyIPv4);
- foreign_address4.SetAddressFromString(kTestForeignNetAddress4);
-
- IPAddress foreign_gateway4(IPAddress::kFamilyIPv4);
- foreign_gateway4.SetAddressFromString(kTestForeignNetGateway4);
-
- const int metric = 10;
-
- RoutingTableEntry foreign_entry4(foreign_address4,
- default_address4,
- foreign_gateway4,
- metric,
- RT_SCOPE_UNIVERSE,
- true);
- SendRouteMsg(RTNLMessage::kModeAdd,
- kTestDeviceIndex0,
- foreign_entry4);
-
- base::hash_map<int, std::vector<RoutingTableEntry> > *tables =
- GetRoutingTables();
- EXPECT_EQ(1, tables->size());
- EXPECT_EQ(1, (*tables)[kTestDeviceIndex0].size());
- RoutingTableEntry test_entry = (*tables)[kTestDeviceIndex0][0];
- EXPECT_TRUE(test_entry.from_rtnl);
-
- // Add a foreign IPv6 entry.
- // This entry should not be deleted.
- IPAddress default_address6(IPAddress::kFamilyIPv6);
- default_address6.SetAddressToDefault();
-
- IPAddress foreign_address6(IPAddress::kFamilyIPv6);
- foreign_address6.SetAddressFromString(kTestForeignNetAddress6);
-
- IPAddress foreign_gateway6(IPAddress::kFamilyIPv6);
- foreign_gateway6.SetAddressFromString(kTestForeignNetGateway6);
-
- RoutingTableEntry foreign_entry6(foreign_address6,
- default_address6,
- foreign_gateway6,
- metric,
- RT_SCOPE_UNIVERSE,
- true);
- SendRouteMsg(RTNLMessage::kModeAdd,
- kTestDeviceIndex0,
- foreign_entry6);
-
- EXPECT_EQ(2, (*tables)[kTestDeviceIndex0].size());
- test_entry = (*tables)[kTestDeviceIndex0][1];
- EXPECT_TRUE(test_entry.from_rtnl);
-
- // Add device route.
- IPAddress device_net_address4(IPAddress::kFamilyIPv4);
- device_net_address4.SetAddressFromString(kTestDeviceNetAddress4);
- RTNLMessage msg(
- RTNLMessage::kTypeRoute,
- RTNLMessage::kModeAdd,
- 0,
- 0,
- 0,
- 0,
- device_net_address4.family());
- msg.set_route_status(RTNLMessage::RouteStatus(
- device_net_address4.prefix(),
- default_address4.prefix(),
- RT_TABLE_MAIN,
- RTPROT_KERNEL,
- RT_SCOPE_UNIVERSE,
- RTN_UNICAST,
- 0));
-
- msg.SetAttribute(RTA_DST, device_net_address4.address());
- msg.SetAttribute(RTA_SRC, default_address4.address());
- msg.SetAttribute(RTA_GATEWAY, foreign_gateway4.address());
- msg.SetAttribute(RTA_PRIORITY, ByteString::CreateFromCPUUInt32(metric));
- msg.SetAttribute(RTA_OIF, ByteString::CreateFromCPUUInt32(kTestDeviceIndex0));
-
- ByteString msgdata = msg.Encode();
- EXPECT_NE(0, msgdata.GetLength());
-
- InputData data(msgdata.GetData(), msgdata.GetLength());
- RTNLHandler::GetInstance()->ParseRTNL(&data);
-
- // The device route should not make it into our routing table.
- EXPECT_EQ(2, (*tables)[kTestDeviceIndex0].size());
-
- // Add an entry from IPConfig.
- MockControl control;
- IPConfigRefPtr ipconfig(new IPConfig(&control, kTestDeviceName0));
- IPConfig::Properties properties;
- properties.address_family = IPAddress::kFamilyIPv4;
- properties.gateway = kTestNetAddress0;
- properties.address = kTestNetAddress1;
- ipconfig->UpdateProperties(properties, true);
-
- IPAddress gateway_address4(IPAddress::kFamilyIPv4);
- gateway_address4.SetAddressFromString(kTestNetAddress0);
- RoutingTableEntry entry(default_address4,
- default_address4,
- gateway_address4,
- metric,
- RT_SCOPE_UNIVERSE,
- false);
-
- EXPECT_CALL(sockets_,
- Send(kTestSocket,
- IsRoutingPacket(RTNLMessage::kModeDelete,
- kTestDeviceIndex0,
- foreign_entry4,
- 0),
- _,
- 0));
- EXPECT_CALL(sockets_,
- Send(kTestSocket,
- IsRoutingPacket(RTNLMessage::kModeDelete,
- kTestDeviceIndex0,
- foreign_entry6,
- 0),
- _,
- 0)).Times(0);
- EXPECT_CALL(sockets_,
- Send(kTestSocket,
- IsRoutingPacket(RTNLMessage::kModeAdd,
- kTestDeviceIndex0,
- entry,
- NLM_F_CREATE | NLM_F_EXCL),
- _,
- 0));
- EXPECT_TRUE(routing_table_->SetDefaultRoute(kTestDeviceIndex0,
- ipconfig,
- metric));
-
- routing_table_->Stop();
- StopRTNLHandler();
-}
-
} // namespace shill