Split off rtnl facility from device_info

Create an "rtnl_handler" singleton for conversing with rtnl socket.
Create "listener" objects that hold callbacks to interested parties.

BUG=chromium-os:15804
TEST=Rerun unit tests

Change-Id: Ica845b39ce6a0885a4e6d2560146ff8f5f45b900
Reviewed-on: http://gerrit.chromium.org/gerrit/1632
Reviewed-by: Chris Masone <cmasone@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/device_info.h b/device_info.h
index d519af6..9b5a030 100644
--- a/device_info.h
+++ b/device_info.h
@@ -12,7 +12,7 @@
 
 #include "shill/device.h"
 
-#include "shill/shill_event.h"
+#include "shill/rtnl_listener.h"
 
 struct nlmsghdr;
 
@@ -28,6 +28,7 @@
   ~DeviceInfo();
   void Start();
   void Stop();
+  static DeviceInfo *GetInstance();
   static Device::Technology GetDeviceTechnology(const char *interface_name);
 
  private:
@@ -35,34 +36,19 @@
   static const char *kInterfaceDriver;
   static const char *kModemDrivers[];
 
-  void ParseRTNL(InputData *data);
-  void NextRequest(uint32_t seq);
-  void AddLinkMsg(struct nlmsghdr *hdr);
-  void DelLinkMsg(struct nlmsghdr *hdr);
-  void AddAddrMsg(struct nlmsghdr *hdr);
-  void DelAddrMsg(struct nlmsghdr *hdr);
-  void AddRouteMsg(struct nlmsghdr *hdr);
-  void DelRouteMsg(struct nlmsghdr *hdr);
+  void AddLinkMsgHandler(struct nlmsghdr *hdr);
+  void DelLinkMsgHandler(struct nlmsghdr *hdr);
+  void LinkMsgHandler(struct nlmsghdr *hdr);
 
-  bool running_;
   ControlInterface *control_interface_;
   EventDispatcher *dispatcher_;
   Manager *manager_;
-  scoped_ptr<Callback1<InputData *>::Type> rtnl_callback_;
-  int rtnl_socket_;
   base::hash_map<int, scoped_refptr<Device> > devices_;
-  scoped_ptr<IOInputHandler> rtnl_handler_;
-  int request_flags_;
-  uint32_t request_sequence_;
+  scoped_ptr<Callback1<struct nlmsghdr *>::Type> link_callback_;
+  scoped_ptr<RTNLListener> link_listener_;
   friend class DeviceInfoTest;
 };
 
-enum {
-  REQUEST_LINK = 1,
-  REQUEST_ADDR = 2,
-  REQUEST_ROUTE = 4
-};
-
 }  // namespace shill
 
 #endif  // SHILL_DEVICE_INFO_