// // Copyright (C) 2014 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef APMANAGER_DEVICE_INFO_H_ #define APMANAGER_DEVICE_INFO_H_ #include #include #include #include #include #include #include // for FRIEND_TEST #include "apmanager/device.h" namespace shill { class NetlinkManager; class Nl80211Message; class RTNLHandler; class RTNLMessage; class RTNLListener; } // namespace shill namespace apmanager { class ControlInterface; class Manager; // DeviceInfo will enumerate WiFi devices (PHYs) during startup and on-demand // (when new interface is detected but the corresponding device is not // enumerated). And use RTNL to monitor creation/deletion of WiFi interfaces. class DeviceInfo : public base::SupportsWeakPtr { public: explicit DeviceInfo(Manager* manager); virtual ~DeviceInfo(); // Start and stop device detection monitoring. void Start(); void Stop(); private: friend class DeviceInfoTest; static const char kDeviceInfoRoot[]; static const char kInterfaceUevent[]; static const char kInterfaceUeventWifiSignature[]; // Use nl80211 to enumerate available WiFi PHYs. void EnumerateDevices(); void OnWiFiPhyInfoReceived(const shill::Nl80211Message& msg); // Handler for RTNL link event. void LinkMsgHandler(const shill::RTNLMessage& msg); void AddLinkMsgHandler(const std::string& iface_name, int iface_index); void DelLinkMsgHandler(const std::string& iface_name, int iface_index); // Return true if the specify |iface_name| is a wifi interface, false // otherwise. bool IsWifiInterface(const std::string& iface_name); // Return the contents of the device info file |path_name| for interface // |iface_name| in output parameter |contents_out|. Return true if file // read succeed, fales otherwise. bool GetDeviceInfoContents(const std::string& iface_name, const std::string& path_name, std::string* contents_out); // Use nl80211 to get WiFi interface information for interface on // |iface_index|. void GetWiFiInterfaceInfo(int iface_index); void OnWiFiInterfaceInfoReceived(const shill::Nl80211Message& msg); // Use nl80211 to get PHY info for interface on |iface_index|. void GetWiFiInterfacePhyInfo(uint32_t iface_index); void OnWiFiInterfacePhyInfoReceived( uint32_t iface_index, const shill::Nl80211Message& msg); scoped_refptr GetDevice(const std::string& phy_name); void RegisterDevice(const scoped_refptr& device); // Maps interface index to interface info std::map interface_infos_; // Maps device name to device object. Each device object represents a PHY. std::map> devices_; // RTNL link event callback and listener. base::Callback link_callback_; std::unique_ptr link_listener_; base::FilePath device_info_root_; Manager* manager_; // Cache copy of singleton pointers. shill::NetlinkManager* netlink_manager_; shill::RTNLHandler* rtnl_handler_; int device_identifier_; DISALLOW_COPY_AND_ASSIGN(DeviceInfo); }; } // namespace apmanager #endif // APMANAGER_DEVICE_INFO_H_