1 /* 2 * Copyright (C) 2016 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 */ 16 17 #ifndef WIFICOND_NET_NETLINK_UTILS_H_ 18 #define WIFICOND_NET_NETLINK_UTILS_H_ 19 20 #include <string> 21 #include <vector> 22 23 #include <linux/nl80211.h> 24 25 #include <android-base/macros.h> 26 27 #include "wificond/net/netlink_manager.h" 28 29 namespace android { 30 namespace wificond { 31 32 struct InterfaceInfo { 33 InterfaceInfo() = default; InterfaceInfoInterfaceInfo34 InterfaceInfo(uint32_t index_, 35 const std::string name_, 36 const std::vector<uint8_t> mac_address_) 37 : index(index_), 38 name(name_), 39 mac_address(mac_address_) {} 40 // Index of this interface. 41 uint32_t index; 42 // Name of this interface. 43 std::string name; 44 // MAC address of this interface. 45 std::vector<uint8_t> mac_address; 46 }; 47 48 struct BandInfo { 49 BandInfo() = default; BandInfoBandInfo50 BandInfo(std::vector<uint32_t>& band_2g_, 51 std::vector<uint32_t>& band_5g_, 52 std::vector<uint32_t>& band_dfs_) 53 : band_2g(band_2g_), 54 band_5g(band_5g_), 55 band_dfs(band_dfs_) {} 56 // Frequencies for 2.4 GHz band. 57 std::vector<uint32_t> band_2g; 58 // Frequencies for 5 GHz band without DFS. 59 std::vector<uint32_t> band_5g; 60 // Frequencies for DFS. 61 std::vector<uint32_t> band_dfs; 62 }; 63 64 struct ScanCapabilities { 65 ScanCapabilities() = default; ScanCapabilitiesScanCapabilities66 ScanCapabilities(uint8_t max_num_scan_ssids_, 67 uint8_t max_num_sched_scan_ssids_, 68 uint8_t max_match_sets_, 69 uint32_t max_num_scan_plans_, 70 uint32_t max_scan_plan_interval_, 71 uint32_t max_scan_plan_iterations_) 72 : max_num_scan_ssids(max_num_scan_ssids_), 73 max_num_sched_scan_ssids(max_num_sched_scan_ssids_), 74 max_match_sets(max_match_sets_), 75 max_num_scan_plans(max_num_scan_plans_), 76 max_scan_plan_interval(max_scan_plan_interval_), 77 max_scan_plan_iterations(max_scan_plan_iterations_) {} 78 // Number of SSIDs you can scan with a single scan request. 79 uint8_t max_num_scan_ssids; 80 // Number of SSIDs you can scan with a single scheduled scan request. 81 uint8_t max_num_sched_scan_ssids; 82 // Maximum number of sets that can be used with NL80211_ATTR_SCHED_SCAN_MATCH. 83 uint8_t max_match_sets; 84 // Maximum number of scan plans that can be specified. 85 uint32_t max_num_scan_plans; 86 // Maximum interval in seconds for a particular scan plan that can be 87 // specified. 88 uint32_t max_scan_plan_interval; 89 // Maximum number of iterations for a particular scan plan that can be 90 // specified. 91 uint32_t max_scan_plan_iterations; 92 }; 93 94 struct WiphyFeatures { WiphyFeaturesWiphyFeatures95 WiphyFeatures() 96 : supports_random_mac_oneshot_scan(false), 97 supports_random_mac_sched_scan(false) {} WiphyFeaturesWiphyFeatures98 WiphyFeatures(uint32_t feature_flags) 99 : supports_random_mac_oneshot_scan( 100 feature_flags & NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR), 101 supports_random_mac_sched_scan( 102 feature_flags & NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR) {} 103 // This device/driver supports using a random MAC address during scan 104 // (while not associated). 105 bool supports_random_mac_oneshot_scan; 106 // This device/driver supports using a random MAC address for every 107 // scan iteration during scheduled scan (while not associated). 108 bool supports_random_mac_sched_scan; 109 // There are other flags included in NL80211_ATTR_FEATURE_FLAGS. 110 // We will add them once we find them useful. 111 }; 112 113 struct StationInfo { 114 StationInfo() = default; StationInfoStationInfo115 StationInfo(uint32_t station_tx_packets_, 116 uint32_t station_tx_failed_, 117 uint32_t station_tx_bitrate_, 118 int8_t current_rssi_) 119 : station_tx_packets(station_tx_packets_), 120 station_tx_failed(station_tx_failed_), 121 station_tx_bitrate(station_tx_bitrate_), 122 current_rssi(current_rssi_) {} 123 // Number of successfully transmitted packets. 124 int32_t station_tx_packets; 125 // Number of tramsmission failures. 126 int32_t station_tx_failed; 127 // Transimission bit rate in 100kbit/s. 128 uint32_t station_tx_bitrate; 129 // Current signal strength. 130 int8_t current_rssi; 131 // There are many other counters/parameters included in station info. 132 // We will add them once we find them useful. 133 }; 134 135 class MlmeEventHandler; 136 class NetlinkManager; 137 class NL80211Packet; 138 139 // Provides NL80211 helper functions. 140 class NetlinkUtils { 141 public: 142 // Currently we only support setting the interface to STATION mode. 143 // This is used for cleaning up interface after KILLING hostapd. 144 enum InterfaceMode{ 145 STATION_MODE 146 }; 147 148 explicit NetlinkUtils(NetlinkManager* netlink_manager); 149 virtual ~NetlinkUtils(); 150 151 // Get the wiphy index from kernel. 152 // |*out_wiphy_index| returns the wiphy index from kernel. 153 // Returns true on success. 154 virtual bool GetWiphyIndex(uint32_t* out_wiphy_index); 155 156 // Get wifi interfaces info from kernel. 157 // |wiphy_index| is the wiphy index we get using GetWiphyIndex(). 158 // |interface_info| returns a vector of InterfaceInfo structs with 159 // information about all existing interfaces. 160 // Returns true on success. 161 virtual bool GetInterfaces(uint32_t wiphy_index, 162 std::vector<InterfaceInfo>* interface_info); 163 164 // Set the mode of interface. 165 // |interface_index| is the interface index. 166 // |mode| is one of the values in |enum InterfaceMode|. 167 // Returns true on success. 168 virtual bool SetInterfaceMode(uint32_t interface_index, 169 InterfaceMode mode); 170 171 // Get wiphy capability information from kernel. 172 // Returns true on success. 173 virtual bool GetWiphyInfo(uint32_t wiphy_index, 174 BandInfo* out_band_info, 175 ScanCapabilities* out_scan_capabilities, 176 WiphyFeatures* out_wiphy_features); 177 178 // Get station info from kernel. 179 // |*out_station_info]| is the struct of available station information. 180 // Returns true on success. 181 virtual bool GetStationInfo(uint32_t interface_index, 182 const std::vector<uint8_t>& mac_address, 183 StationInfo* out_station_info); 184 185 // Sign up to be notified when there is MLME event. 186 // Only one handler can be registered per interface index. 187 // New handler will replace the registered handler if they are for the 188 // same interface index. 189 // NetlinkUtils is not going to take ownership of this pointer, and that it 190 // is the caller's responsibility to make sure that the object exists for the 191 // duration of the subscription. 192 virtual void SubscribeMlmeEvent(uint32_t interface_index, 193 MlmeEventHandler* handler); 194 195 // Cancel the sign-up of receiving MLME event notification 196 // from interface with index |interface_index|. 197 virtual void UnsubscribeMlmeEvent(uint32_t interface_index); 198 199 // Sign up to be notified when there is an regulatory domain change. 200 // Only one handler can be registered per wiphy index. 201 // New handler will replace the registered handler if they are for the 202 // same wiphy index. 203 virtual void SubscribeRegDomainChange(uint32_t wiphy_index, 204 OnRegDomainChangedHandler handler); 205 206 // Cancel the sign-up of receiving regulatory domain change notification 207 // from wiphy with index |wiphy_index|. 208 virtual void UnsubscribeRegDomainChange(uint32_t wiphy_index); 209 210 // Sign up to be notified when there is an station event. 211 // Only one handler can be registered per interface index. 212 // New handler will replace the registered handler if they are for the 213 // same interface index. 214 virtual void SubscribeStationEvent(uint32_t interface_index, 215 OnStationEventHandler handler); 216 217 // Cancel the sign-up of receiving station events. 218 virtual void UnsubscribeStationEvent(uint32_t interface_index); 219 220 private: 221 bool ParseBandInfo(const NL80211Packet* const packet, 222 BandInfo* out_band_info); 223 bool ParseScanCapabilities(const NL80211Packet* const packet, 224 ScanCapabilities* out_scan_capabilities); 225 NetlinkManager* netlink_manager_; 226 227 DISALLOW_COPY_AND_ASSIGN(NetlinkUtils); 228 }; 229 230 } // namespace wificond 231 } // namespace android 232 233 #endif // WIFICOND_NET_NETLINK_UTILS_H_ 234