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,