shill: DeviceInfo: Decide between WiFi interface types

When a WiFi device appears, use the nl80211 "get interface"
call to retrieve the interface type, deferring creation of
the Device instance until a reply to this message is received.
Only create a WiFi device if the interface is in "station"
mode.

BUG=chrome-os-partner:18698
TEST=Unit tests; run on system with kernel-next patches for
chromeos-partner:18698 comment #5 applied, and
https://gerrit.chromium.org/gerrit/47863 reverted, ensure
only one WiFi device appears in list-devices (mlan0)

Change-Id: Ia559e0931a8bd4aaa067d71aae5d1bd1bf1ceedc
Reviewed-on: https://gerrit.chromium.org/gerrit/48250
Commit-Queue: Paul Stewart <pstew@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/nl80211_message.cc b/nl80211_message.cc
index 9b7e982..9b0fbb9 100644
--- a/nl80211_message.cc
+++ b/nl80211_message.cc
@@ -66,6 +66,11 @@
 uint16_t Nl80211Message::nl80211_message_type_ = kIllegalMessageType;
 
 // static
+uint16_t Nl80211Message::GetMessageType() {
+  return nl80211_message_type_;
+}
+
+// static
 void Nl80211Message::SetMessageType(uint16_t message_type) {
   if (message_type == NetlinkMessage::kIllegalMessageType) {
     LOG(FATAL) << "Absolutely need a legal message type for Nl80211 messages.";
@@ -615,6 +620,18 @@
 const char UnprotDisassociateMessage::kCommandString[] =
     "NL80211_CMD_UNPROT_DISASSOCIATE";
 
+GetInterfaceMessage::GetInterfaceMessage()
+    : Nl80211Message(kCommand, kCommandString) {
+  attributes()->CreateAttribute(
+      NL80211_ATTR_IFINDEX, Bind(&NetlinkAttribute::NewNl80211AttributeFromId));
+}
+
+const uint8_t GetInterfaceMessage::kCommand = NL80211_CMD_GET_INTERFACE;
+const char GetInterfaceMessage::kCommandString[] = "NL80211_CMD_GET_INTERFACE";
+
+const uint8_t NewInterfaceMessage::kCommand = NL80211_CMD_NEW_INTERFACE;
+const char NewInterfaceMessage::kCommandString[] = "NL80211_CMD_NEW_INTERFACE";
+
 // static
 NetlinkMessage *Nl80211Message::CreateMessage(const nlmsghdr *const_msg) {
   if (!const_msg) {
@@ -647,12 +664,16 @@
       return new DisconnectMessage();
     case FrameTxStatusMessage::kCommand:
       return new FrameTxStatusMessage();
+    case GetInterfaceMessage::kCommand:
+      return new GetInterfaceMessage();
     case GetRegMessage::kCommand:
       return new GetRegMessage();
     case JoinIbssMessage::kCommand:
       return new JoinIbssMessage();
     case MichaelMicFailureMessage::kCommand:
       return new MichaelMicFailureMessage();
+    case NewInterfaceMessage::kCommand:
+      return new NewInterfaceMessage();
     case NewScanResultsMessage::kCommand:
       return new NewScanResultsMessage();
     case NewStationMessage::kCommand: