• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <android-base/macros.h>
24 
25 #include "wificond/net/kernel-header-latest/nl80211.h"
26 #include "wificond/net/netlink_manager.h"
27 
28 namespace android {
29 namespace wificond {
30 
31 struct InterfaceInfo {
32   InterfaceInfo() = default;
InterfaceInfoInterfaceInfo33   InterfaceInfo(uint32_t index_,
34                 const std::string name_,
35                 const std::vector<uint8_t> mac_address_)
36       : index(index_),
37         name(name_),
38         mac_address(mac_address_) {}
39   // Index of this interface.
40   uint32_t index;
41   // Name of this interface.
42   std::string name;
43   // MAC address of this interface.
44   std::vector<uint8_t> mac_address;
45 };
46 
47 struct BandInfo {
48   BandInfo() = default;
BandInfoBandInfo49   BandInfo(std::vector<uint32_t>& band_2g_,
50            std::vector<uint32_t>& band_5g_,
51            std::vector<uint32_t>& band_dfs_)
52       : band_2g(band_2g_),
53         band_5g(band_5g_),
54         band_dfs(band_dfs_) {}
55   // Frequencies for 2.4 GHz band.
56   std::vector<uint32_t> band_2g;
57   // Frequencies for 5 GHz band without DFS.
58   std::vector<uint32_t> band_5g;
59   // Frequencies for DFS.
60   std::vector<uint32_t> band_dfs;
61 };
62 
63 struct ScanCapabilities {
64   ScanCapabilities() = default;
ScanCapabilitiesScanCapabilities65   ScanCapabilities(uint8_t max_num_scan_ssids_,
66                    uint8_t max_num_sched_scan_ssids_,
67                    uint8_t max_match_sets_,
68                    uint32_t max_num_scan_plans_,
69                    uint32_t max_scan_plan_interval_,
70                    uint32_t max_scan_plan_iterations_)
71       : max_num_scan_ssids(max_num_scan_ssids_),
72         max_num_sched_scan_ssids(max_num_sched_scan_ssids_),
73         max_match_sets(max_match_sets_),
74         max_num_scan_plans(max_num_scan_plans_),
75         max_scan_plan_interval(max_scan_plan_interval_),
76         max_scan_plan_iterations(max_scan_plan_iterations_) {}
77   // Number of SSIDs you can scan with a single scan request.
78   uint8_t max_num_scan_ssids;
79   // Number of SSIDs you can scan with a single scheduled scan request.
80   uint8_t max_num_sched_scan_ssids;
81   // Maximum number of sets that can be used with NL80211_ATTR_SCHED_SCAN_MATCH.
82   uint8_t max_match_sets;
83   // Maximum number of scan plans that can be specified.
84   uint32_t max_num_scan_plans;
85   // Maximum interval in seconds for a particular scan plan that can be
86   // specified.
87   uint32_t max_scan_plan_interval;
88   // Maximum number of iterations for a particular scan plan that can be
89   // specified.
90   uint32_t max_scan_plan_iterations;
91 };
92 
93 struct WiphyFeatures {
WiphyFeaturesWiphyFeatures94   WiphyFeatures()
95       : supports_random_mac_oneshot_scan(false),
96         supports_random_mac_sched_scan(false),
97         supports_low_span_oneshot_scan(false),
98         supports_low_power_oneshot_scan(false),
99         supports_high_accuracy_oneshot_scan(false) {}
100   WiphyFeatures(uint32_t feature_flags,
101                 const std::vector<uint8_t>& ext_feature_flags_bytes);
102   // This device/driver supports using a random MAC address during scan
103   // (while not associated).
104   bool supports_random_mac_oneshot_scan;
105   // This device/driver supports using a random MAC address for every
106   // scan iteration during scheduled scan (while not associated).
107   bool supports_random_mac_sched_scan;
108   // This device/driver supports performing low-span/low-latency one-shot scans.
109   bool supports_low_span_oneshot_scan;
110   // This device/driver supports performing low-power one-shot scans.
111   bool supports_low_power_oneshot_scan;
112   // This device/driver supports performing high-accuracy one-shot scans.
113   bool supports_high_accuracy_oneshot_scan;
114   // There are other flags included in NL80211_ATTR_FEATURE_FLAGS.
115   // We will add them once we find them useful.
116 };
117 
118 struct StationInfo {
119   StationInfo() = default;
StationInfoStationInfo120   StationInfo(uint32_t station_tx_packets_,
121               uint32_t station_tx_failed_,
122               uint32_t station_tx_bitrate_,
123               int8_t current_rssi_)
124       : station_tx_packets(station_tx_packets_),
125         station_tx_failed(station_tx_failed_),
126         station_tx_bitrate(station_tx_bitrate_),
127         current_rssi(current_rssi_) {}
128   // Number of successfully transmitted packets.
129   int32_t station_tx_packets;
130   // Number of tramsmission failures.
131   int32_t station_tx_failed;
132   // Transimission bit rate in 100kbit/s.
133   uint32_t station_tx_bitrate;
134   // Current signal strength.
135   int8_t current_rssi;
136   // There are many other counters/parameters included in station info.
137   // We will add them once we find them useful.
138 };
139 
140 class MlmeEventHandler;
141 class NetlinkManager;
142 class NL80211Packet;
143 
144 // Provides NL80211 helper functions.
145 class NetlinkUtils {
146  public:
147   // Currently we only support setting the interface to STATION mode.
148   // This is used for cleaning up interface after KILLING hostapd.
149   enum InterfaceMode{
150       STATION_MODE
151   };
152 
153   explicit NetlinkUtils(NetlinkManager* netlink_manager);
154   virtual ~NetlinkUtils();
155 
156   // Get the wiphy index from kernel.
157   // |*out_wiphy_index| returns the wiphy index from kernel.
158   // Returns true on success.
159   virtual bool GetWiphyIndex(uint32_t* out_wiphy_index);
160 
161   // Get wifi interfaces info from kernel.
162   // |wiphy_index| is the wiphy index we get using GetWiphyIndex().
163   // |interface_info| returns a vector of InterfaceInfo structs with
164   // information about all existing interfaces.
165   // Returns true on success.
166   virtual bool GetInterfaces(uint32_t wiphy_index,
167                              std::vector<InterfaceInfo>* interface_info);
168 
169   // Set the mode of interface.
170   // |interface_index| is the interface index.
171   // |mode| is one of the values in |enum InterfaceMode|.
172   // Returns true on success.
173   virtual bool SetInterfaceMode(uint32_t interface_index,
174                                 InterfaceMode mode);
175 
176   // Get wiphy capability information from kernel.
177   // Returns true on success.
178   virtual bool GetWiphyInfo(uint32_t wiphy_index,
179                             BandInfo* out_band_info,
180                             ScanCapabilities* out_scan_capabilities,
181                             WiphyFeatures* out_wiphy_features);
182 
183   // Get station info from kernel.
184   // |*out_station_info]| is the struct of available station information.
185   // Returns true on success.
186   virtual bool GetStationInfo(uint32_t interface_index,
187                               const std::vector<uint8_t>& mac_address,
188                               StationInfo* out_station_info);
189 
190   // Get a bitmap for nl80211 protocol features,
191   // i.e. features for the nl80211 protocol rather than device features.
192   // See enum nl80211_protocol_features in nl80211.h for decoding the bitmap.
193   // Returns true on success.
194   virtual bool GetProtocolFeatures(uint32_t* features);
195 
196   // Get current alpha2 country code from kernel.
197   // Returns true on success.
198   virtual bool GetCountryCode(std::string* out_country_code);
199 
200   // Sign up to be notified when there is MLME event.
201   // Only one handler can be registered per interface index.
202   // New handler will replace the registered handler if they are for the
203   // same interface index.
204   // NetlinkUtils is not going to take ownership of this pointer, and that it
205   // is the caller's responsibility to make sure that the object exists for the
206   // duration of the subscription.
207   virtual void SubscribeMlmeEvent(uint32_t interface_index,
208                                   MlmeEventHandler* handler);
209 
210   // Cancel the sign-up of receiving MLME event notification
211   // from interface with index |interface_index|.
212   virtual void UnsubscribeMlmeEvent(uint32_t interface_index);
213 
214   // Sign up to be notified when there is an regulatory domain change.
215   // Only one handler can be registered per wiphy index.
216   // New handler will replace the registered handler if they are for the
217   // same wiphy index.
218   virtual void SubscribeRegDomainChange(uint32_t wiphy_index,
219                                         OnRegDomainChangedHandler handler);
220 
221   // Cancel the sign-up of receiving regulatory domain change notification
222   // from wiphy with index |wiphy_index|.
223   virtual void UnsubscribeRegDomainChange(uint32_t wiphy_index);
224 
225   // Sign up to be notified when there is a station event.
226   // Only one handler can be registered per interface index.
227   // New handler will replace the registered handler if they are for the
228   // same interface index.
229   virtual void SubscribeStationEvent(uint32_t interface_index,
230                                      OnStationEventHandler handler);
231 
232   // Cancel the sign-up of receiving station events.
233   virtual void UnsubscribeStationEvent(uint32_t interface_index);
234 
235   // Sign up to be notified when there is a channel switch event.
236   // Only one handler can be registered per interface index.
237   // New handler will replace the registered handler if they are for the
238   // same interface index.
239   virtual void SubscribeChannelSwitchEvent(uint32_t interface_index,
240                                            OnChannelSwitchEventHandler handler);
241 
242   // Cancel the sign-up of receiving channel switch events.
243   virtual void UnsubscribeChannelSwitchEvent(uint32_t interface_index);
244 
245   // Visible for testing.
246   bool supports_split_wiphy_dump_;
247 
248  private:
249   bool ParseWiphyInfoFromPacket(
250       const NL80211Packet& packet,
251       BandInfo* out_band_info,
252       ScanCapabilities* out_scan_capabilities,
253       WiphyFeatures* out_wiphy_features);
254   bool ParseBandInfo(const NL80211Packet* const packet,
255                      BandInfo* out_band_info);
256   bool ParseScanCapabilities(const NL80211Packet* const packet,
257                              ScanCapabilities* out_scan_capabilities);
258 
259   bool MergePacketsForSplitWiphyDump(
260       const std::vector<std::unique_ptr<const NL80211Packet>>& split_dump_info,
261       std::vector<NL80211Packet>* packet_per_wiphy);
262 
263   NetlinkManager* netlink_manager_;
264 
265   DISALLOW_COPY_AND_ASSIGN(NetlinkUtils);
266 };
267 
268 }  // namespace wificond
269 }  // namespace android
270 
271 #endif  // WIFICOND_NET_NETLINK_UTILS_H_
272