shill: Add IP Address tracking to DeviceInfo
Subscribe to IP Address messages in DeviceInfo, and create a
per-device list of assigned IP Addresses. Provide a method
to flush all globally scoped addresses from a device.
As a result, we can now flush assigned IP addresses when a
Connection is terminated. There is also some incidental cleanup
in RTNLHandler to remove some vestiges of hand-baked RTNL
message encoding.
BUG=chromium-os:19744
TEST=Run new unit tests. Test using ethernet on a netbook to make sure
addresses are added and removed correctly.
Change-Id: I63fd09088e71c43cb1f11a89a8ef15e11074976c
Reviewed-on: http://gerrit.chromium.org/gerrit/7180
Reviewed-by: Darin Petkov <petkov@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/routing_table.cc b/routing_table.cc
index f7edf03..3d9d1b9 100644
--- a/routing_table.cc
+++ b/routing_table.cc
@@ -64,7 +64,7 @@
route_listener_.reset(
new RTNLListener(RTNLHandler::kRequestRoute, route_callback_.get()));
RTNLHandler::GetInstance()->RequestDump(
- RTNLHandler::kRequestRoute | RTNLHandler::kRequestRoute6);
+ RTNLHandler::kRequestRoute);
}
void RoutingTable::Stop() {
@@ -80,7 +80,7 @@
CHECK(!entry.from_rtnl);
if (!ApplyRoute(interface_index,
entry,
- RTNLMessage::kMessageModeAdd,
+ RTNLMessage::kModeAdd,
NLM_F_CREATE | NLM_F_EXCL)) {
return false;
}
@@ -131,14 +131,14 @@
if (old_entry.gateway.Equals(gateway_address)) {
if (old_entry.metric != metric) {
old_entry.metric = metric;
- ApplyRoute(interface_index, old_entry, RTNLMessage::kMessageModeAdd,
+ ApplyRoute(interface_index, old_entry, RTNLMessage::kModeAdd,
NLM_F_CREATE | NLM_F_REPLACE);
}
return true;
} else {
ApplyRoute(interface_index,
old_entry,
- RTNLMessage::kMessageModeDelete,
+ RTNLMessage::kModeDelete,
0);
}
}
@@ -168,7 +168,7 @@
vector<RoutingTableEntry>::iterator nent;
for (nent = table->second.begin(); nent != table->second.end(); ++nent) {
- ApplyRoute(interface_index, *nent, RTNLMessage::kMessageModeDelete, 0);
+ ApplyRoute(interface_index, *nent, RTNLMessage::kModeDelete, 0);
}
}
@@ -184,14 +184,14 @@
if (GetDefaultRoute(interface_index, IPAddress::kAddressFamilyIPv4, &entry) &&
entry.metric != metric) {
entry.metric = metric;
- ApplyRoute(interface_index, entry, RTNLMessage::kMessageModeAdd,
+ ApplyRoute(interface_index, entry, RTNLMessage::kModeAdd,
NLM_F_CREATE | NLM_F_REPLACE);
}
if (GetDefaultRoute(interface_index, IPAddress::kAddressFamilyIPv6, &entry) &&
entry.metric != metric) {
entry.metric = metric;
- ApplyRoute(interface_index, entry, RTNLMessage::kMessageModeAdd,
+ ApplyRoute(interface_index, entry, RTNLMessage::kModeAdd,
NLM_F_CREATE | NLM_F_REPLACE);
}
}
@@ -199,7 +199,7 @@
void RoutingTable::RouteMsgHandler(const RTNLMessage &msg) {
VLOG(2) << __func__;
- if (msg.type() != RTNLMessage::kMessageTypeRoute ||
+ if (msg.type() != RTNLMessage::kTypeRoute ||
msg.family() == IPAddress::kAddressFamilyUnknown ||
!msg.HasAttribute(RTA_OIF)) {
return;
@@ -254,7 +254,7 @@
nent->src.Equals(entry.src) &&
nent->gateway.Equals(entry.gateway) &&
nent->scope == entry.scope) {
- if (msg.mode() == RTNLMessage::kMessageModeDelete) {
+ if (msg.mode() == RTNLMessage::kModeDelete) {
table.erase(nent);
} else {
nent->from_rtnl = true;
@@ -264,20 +264,20 @@
}
}
- if (msg.mode() == RTNLMessage::kMessageModeAdd) {
+ if (msg.mode() == RTNLMessage::kModeAdd) {
table.push_back(entry);
}
}
bool RoutingTable::ApplyRoute(uint32 interface_index,
const RoutingTableEntry &entry,
- RTNLMessage::MessageMode mode,
+ RTNLMessage::Mode mode,
unsigned int flags) {
VLOG(2) << base::StringPrintf("%s: index %d mode %d flags 0x%x",
__func__, interface_index, mode, flags);
RTNLMessage msg(
- RTNLMessage::kMessageTypeRoute,
+ RTNLMessage::kTypeRoute,
mode,
NLM_F_REQUEST | flags,
0,