Peter Qiu | 326b6cf | 2015-09-02 11:11:42 -0700 | [diff] [blame] | 1 | // |
| 2 | // Copyright (C) 2014 The Android Open Source Project |
| 3 | // |
| 4 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | // you may not use this file except in compliance with the License. |
| 6 | // You may obtain a copy of the License at |
| 7 | // |
| 8 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | // |
| 10 | // Unless required by applicable law or agreed to in writing, software |
| 11 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | // See the License for the specific language governing permissions and |
| 14 | // limitations under the License. |
| 15 | // |
Peter Qiu | fb39ba4 | 2014-11-21 09:09:59 -0800 | [diff] [blame] | 16 | |
| 17 | #ifndef APMANAGER_DEVICE_INFO_H_ |
| 18 | #define APMANAGER_DEVICE_INFO_H_ |
| 19 | |
| 20 | #include <map> |
| 21 | #include <string> |
| 22 | |
| 23 | #include <base/callback.h> |
| 24 | #include <base/files/file_path.h> |
| 25 | #include <base/memory/ref_counted.h> |
| 26 | #include <base/memory/weak_ptr.h> |
| 27 | #include <gtest/gtest_prod.h> // for FRIEND_TEST |
| 28 | |
| 29 | #include "apmanager/device.h" |
| 30 | |
| 31 | namespace shill { |
| 32 | |
| 33 | class NetlinkManager; |
| 34 | class Nl80211Message; |
| 35 | class RTNLHandler; |
| 36 | class RTNLMessage; |
| 37 | class RTNLListener; |
Peter Qiu | fb39ba4 | 2014-11-21 09:09:59 -0800 | [diff] [blame] | 38 | |
| 39 | } // namespace shill |
| 40 | |
| 41 | namespace apmanager { |
| 42 | |
Peter Qiu | f933540 | 2015-11-16 12:09:16 -0800 | [diff] [blame] | 43 | class ControlInterface; |
Peter Qiu | fb39ba4 | 2014-11-21 09:09:59 -0800 | [diff] [blame] | 44 | class Manager; |
| 45 | |
Peter Qiu | 1ff67a7 | 2014-11-22 07:06:10 -0800 | [diff] [blame] | 46 | // DeviceInfo will enumerate WiFi devices (PHYs) during startup and on-demand |
| 47 | // (when new interface is detected but the corresponding device is not |
| 48 | // enumerated). And use RTNL to monitor creation/deletion of WiFi interfaces. |
Peter Qiu | fb39ba4 | 2014-11-21 09:09:59 -0800 | [diff] [blame] | 49 | class DeviceInfo : public base::SupportsWeakPtr<DeviceInfo> { |
| 50 | public: |
| 51 | explicit DeviceInfo(Manager* manager); |
| 52 | virtual ~DeviceInfo(); |
| 53 | |
| 54 | // Start and stop device detection monitoring. |
| 55 | void Start(); |
| 56 | void Stop(); |
| 57 | |
| 58 | private: |
| 59 | friend class DeviceInfoTest; |
| 60 | |
| 61 | static const char kDeviceInfoRoot[]; |
| 62 | static const char kInterfaceUevent[]; |
| 63 | static const char kInterfaceUeventWifiSignature[]; |
| 64 | |
| 65 | // Use nl80211 to enumerate available WiFi PHYs. |
| 66 | void EnumerateDevices(); |
| 67 | void OnWiFiPhyInfoReceived(const shill::Nl80211Message& msg); |
| 68 | |
| 69 | // Handler for RTNL link event. |
| 70 | void LinkMsgHandler(const shill::RTNLMessage& msg); |
| 71 | void AddLinkMsgHandler(const std::string& iface_name, int iface_index); |
| 72 | void DelLinkMsgHandler(const std::string& iface_name, int iface_index); |
| 73 | |
| 74 | // Return true if the specify |iface_name| is a wifi interface, false |
| 75 | // otherwise. |
| 76 | bool IsWifiInterface(const std::string& iface_name); |
| 77 | |
| 78 | // Return the contents of the device info file |path_name| for interface |
| 79 | // |iface_name| in output parameter |contents_out|. Return true if file |
| 80 | // read succeed, fales otherwise. |
| 81 | bool GetDeviceInfoContents(const std::string& iface_name, |
| 82 | const std::string& path_name, |
| 83 | std::string* contents_out); |
| 84 | |
| 85 | // Use nl80211 to get WiFi interface information for interface on |
| 86 | // |iface_index|. |
| 87 | void GetWiFiInterfaceInfo(int iface_index); |
| 88 | void OnWiFiInterfaceInfoReceived(const shill::Nl80211Message& msg); |
| 89 | |
| 90 | // Use nl80211 to get PHY info for interface on |iface_index|. |
| 91 | void GetWiFiInterfacePhyInfo(uint32_t iface_index); |
| 92 | void OnWiFiInterfacePhyInfoReceived( |
| 93 | uint32_t iface_index, const shill::Nl80211Message& msg); |
| 94 | |
| 95 | scoped_refptr<Device> GetDevice(const std::string& phy_name); |
| 96 | void RegisterDevice(scoped_refptr<Device> device); |
| 97 | |
| 98 | // Maps interface index to interface info |
| 99 | std::map<uint32_t, Device::WiFiInterface> interface_infos_; |
| 100 | // Maps device name to device object. Each device object represents a PHY. |
| 101 | std::map<std::string, scoped_refptr<Device>> devices_; |
| 102 | |
| 103 | // RTNL link event callback and listener. |
| 104 | base::Callback<void(const shill::RTNLMessage&)> link_callback_; |
| 105 | std::unique_ptr<shill::RTNLListener> link_listener_; |
| 106 | |
| 107 | base::FilePath device_info_root_; |
Peter Qiu | f933540 | 2015-11-16 12:09:16 -0800 | [diff] [blame] | 108 | Manager* manager_; |
Peter Qiu | fb39ba4 | 2014-11-21 09:09:59 -0800 | [diff] [blame] | 109 | |
| 110 | // Cache copy of singleton pointers. |
| 111 | shill::NetlinkManager* netlink_manager_; |
| 112 | shill::RTNLHandler* rtnl_handler_; |
| 113 | |
Peter Qiu | f933540 | 2015-11-16 12:09:16 -0800 | [diff] [blame] | 114 | int device_identifier_; |
| 115 | |
Peter Qiu | fb39ba4 | 2014-11-21 09:09:59 -0800 | [diff] [blame] | 116 | DISALLOW_COPY_AND_ASSIGN(DeviceInfo); |
| 117 | }; |
| 118 | |
| 119 | } // namespace apmanager |
| 120 | |
| 121 | #endif // APMANAGER_DEVICE_INFO_H_ |