blob: 59eaa4a58c4bae4da1083e23f1c1f8a021516010 [file] [log] [blame]
Gabriel Birenf3262f92022-07-15 23:25:39 +00001/*
2 * Copyright (C) 2022 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 WIFI_CHIP_H_
18#define WIFI_CHIP_H_
19
20#include <aidl/android/hardware/wifi/BnWifiChip.h>
21#include <aidl/android/hardware/wifi/IWifiRttController.h>
22#include <android-base/macros.h>
23
24#include <list>
25#include <map>
26#include <mutex>
27
28#include "aidl_callback_util.h"
29#include "ringbuffer.h"
30#include "wifi_ap_iface.h"
31#include "wifi_feature_flags.h"
32#include "wifi_legacy_hal.h"
33#include "wifi_mode_controller.h"
34#include "wifi_nan_iface.h"
35#include "wifi_p2p_iface.h"
36#include "wifi_rtt_controller.h"
37#include "wifi_sta_iface.h"
38
39namespace aidl {
40namespace android {
41namespace hardware {
42namespace wifi {
43
44/**
45 * AIDL interface object used to control a Wifi HAL chip instance.
46 * Since there is only a single chip instance used today, there is no
47 * identifying handle information stored here.
48 */
49class WifiChip : public BnWifiChip {
50 public:
51 WifiChip(int32_t chip_id, bool is_primary,
52 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
53 const std::weak_ptr<mode_controller::WifiModeController> mode_controller,
54 const std::shared_ptr<iface_util::WifiIfaceUtil> iface_util,
55 const std::weak_ptr<feature_flags::WifiFeatureFlags> feature_flags,
56 const std::function<void(const std::string&)>& subsystemCallbackHandler);
57
58 // Factory method - use instead of default constructor.
59 static std::shared_ptr<WifiChip> create(
60 int32_t chip_id, bool is_primary,
61 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
62 const std::weak_ptr<mode_controller::WifiModeController> mode_controller,
63 const std::shared_ptr<iface_util::WifiIfaceUtil> iface_util,
64 const std::weak_ptr<feature_flags::WifiFeatureFlags> feature_flags,
65 const std::function<void(const std::string&)>& subsystemCallbackHandler);
66
67 // AIDL does not provide a built-in mechanism to let the server invalidate
68 // an AIDL interface object after creation. If any client process holds onto
69 // a reference to the object in their context, any method calls on that
70 // reference will continue to be directed to the server.
71 //
72 // However Wifi HAL needs to control the lifetime of these objects. So, add
73 // a public |invalidate| method to |WifiChip| and its child objects. This
74 // will be used to mark an object invalid when either:
75 // a) Wifi HAL is stopped, or
76 // b) Wifi Chip is reconfigured.
77 //
78 // All AIDL method implementations should check if the object is still
79 // marked valid before processing them.
80 void invalidate();
81 bool isValid();
82 std::set<std::shared_ptr<IWifiChipEventCallback>> getEventCallbacks();
83
84 // AIDL methods exposed.
85 ndk::ScopedAStatus getId(int32_t* _aidl_return) override;
86 ndk::ScopedAStatus registerEventCallback(
87 const std::shared_ptr<IWifiChipEventCallback>& in_callback) override;
88 ndk::ScopedAStatus getCapabilities(IWifiChip::ChipCapabilityMask* _aidl_return) override;
89 ndk::ScopedAStatus getAvailableModes(std::vector<IWifiChip::ChipMode>* _aidl_return) override;
90 ndk::ScopedAStatus configureChip(int32_t in_modeId) override;
91 ndk::ScopedAStatus getMode(int32_t* _aidl_return) override;
92 ndk::ScopedAStatus requestChipDebugInfo(IWifiChip::ChipDebugInfo* _aidl_return) override;
93 ndk::ScopedAStatus requestDriverDebugDump(std::vector<uint8_t>* _aidl_return) override;
94 ndk::ScopedAStatus requestFirmwareDebugDump(std::vector<uint8_t>* _aidl_return) override;
95 ndk::ScopedAStatus createApIface(std::shared_ptr<IWifiApIface>* _aidl_return) override;
96 ndk::ScopedAStatus createBridgedApIface(std::shared_ptr<IWifiApIface>* _aidl_return) override;
97 ndk::ScopedAStatus getApIfaceNames(std::vector<std::string>* _aidl_return) override;
98 ndk::ScopedAStatus getApIface(const std::string& in_ifname,
99 std::shared_ptr<IWifiApIface>* _aidl_return) override;
100 ndk::ScopedAStatus removeApIface(const std::string& in_ifname) override;
101 ndk::ScopedAStatus removeIfaceInstanceFromBridgedApIface(
102 const std::string& in_brIfaceName, const std::string& in_ifaceInstanceName) override;
103 ndk::ScopedAStatus createNanIface(std::shared_ptr<IWifiNanIface>* _aidl_return) override;
104 ndk::ScopedAStatus getNanIfaceNames(std::vector<std::string>* _aidl_return) override;
105 ndk::ScopedAStatus getNanIface(const std::string& in_ifname,
106 std::shared_ptr<IWifiNanIface>* _aidl_return) override;
107 ndk::ScopedAStatus removeNanIface(const std::string& in_ifname) override;
108 ndk::ScopedAStatus createP2pIface(std::shared_ptr<IWifiP2pIface>* _aidl_return) override;
109 ndk::ScopedAStatus getP2pIfaceNames(std::vector<std::string>* _aidl_return) override;
110 ndk::ScopedAStatus getP2pIface(const std::string& in_ifname,
111 std::shared_ptr<IWifiP2pIface>* _aidl_return) override;
112 ndk::ScopedAStatus removeP2pIface(const std::string& in_ifname) override;
113 ndk::ScopedAStatus createStaIface(std::shared_ptr<IWifiStaIface>* _aidl_return) override;
114 ndk::ScopedAStatus getStaIfaceNames(std::vector<std::string>* _aidl_return) override;
115 ndk::ScopedAStatus getStaIface(const std::string& in_ifname,
116 std::shared_ptr<IWifiStaIface>* _aidl_return) override;
117 ndk::ScopedAStatus removeStaIface(const std::string& in_ifname) override;
118 ndk::ScopedAStatus createRttController(
119 const std::shared_ptr<IWifiStaIface>& in_boundIface,
120 std::shared_ptr<IWifiRttController>* _aidl_return) override;
121 ndk::ScopedAStatus getDebugRingBuffersStatus(
122 std::vector<WifiDebugRingBufferStatus>* _aidl_return) override;
123 ndk::ScopedAStatus startLoggingToDebugRingBuffer(
124 const std::string& in_ringName, WifiDebugRingBufferVerboseLevel in_verboseLevel,
125 int32_t in_maxIntervalInSec, int32_t in_minDataSizeInBytes) override;
126 ndk::ScopedAStatus forceDumpToDebugRingBuffer(const std::string& in_ringName) override;
127 ndk::ScopedAStatus flushRingBufferToFile() override;
128 ndk::ScopedAStatus stopLoggingToDebugRingBuffer() override;
129 ndk::ScopedAStatus getDebugHostWakeReasonStats(
130 WifiDebugHostWakeReasonStats* _aidl_return) override;
131 ndk::ScopedAStatus enableDebugErrorAlerts(bool in_enable) override;
132 ndk::ScopedAStatus selectTxPowerScenario(IWifiChip::TxPowerScenario in_scenario) override;
133 ndk::ScopedAStatus resetTxPowerScenario() override;
134 ndk::ScopedAStatus setLatencyMode(IWifiChip::LatencyMode in_mode) override;
135 ndk::ScopedAStatus setMultiStaPrimaryConnection(const std::string& in_ifName) override;
136 ndk::ScopedAStatus setMultiStaUseCase(IWifiChip::MultiStaUseCase in_useCase) override;
137 ndk::ScopedAStatus setCoexUnsafeChannels(
138 const std::vector<IWifiChip::CoexUnsafeChannel>& in_unsafeChannels,
139 CoexRestriction in_restrictions) override;
140 ndk::ScopedAStatus setCountryCode(const std::array<uint8_t, 2>& in_code) override;
141 ndk::ScopedAStatus getUsableChannels(WifiBand in_band, WifiIfaceMode in_ifaceModeMask,
142 UsableChannelFilter in_filterMask,
143 std::vector<WifiUsableChannel>* _aidl_return) override;
144 ndk::ScopedAStatus triggerSubsystemRestart() override;
145 ndk::ScopedAStatus getSupportedRadioCombinationsMatrix(
146 WifiRadioCombinationMatrix* _aidl_return) override;
147 binder_status_t dump(int fd, const char** args, uint32_t numArgs) override;
148
149 private:
150 void invalidateAndRemoveAllIfaces();
151 // When a STA iface is removed any dependent NAN-ifaces/RTT-controllers are
152 // invalidated & removed.
153 void invalidateAndRemoveDependencies(const std::string& removed_iface_name);
154
155 // Corresponding worker functions for the AIDL methods.
156 std::pair<int32_t, ndk::ScopedAStatus> getIdInternal();
157 ndk::ScopedAStatus registerEventCallbackInternal(
158 const std::shared_ptr<IWifiChipEventCallback>& event_callback);
159 std::pair<IWifiChip::ChipCapabilityMask, ndk::ScopedAStatus> getCapabilitiesInternal();
160 std::pair<std::vector<IWifiChip::ChipMode>, ndk::ScopedAStatus> getAvailableModesInternal();
161 ndk::ScopedAStatus configureChipInternal(std::unique_lock<std::recursive_mutex>* lock,
162 int32_t mode_id);
163 std::pair<int32_t, ndk::ScopedAStatus> getModeInternal();
164 std::pair<IWifiChip::ChipDebugInfo, ndk::ScopedAStatus> requestChipDebugInfoInternal();
165 std::pair<std::vector<uint8_t>, ndk::ScopedAStatus> requestDriverDebugDumpInternal();
166 std::pair<std::vector<uint8_t>, ndk::ScopedAStatus> requestFirmwareDebugDumpInternal();
167 std::shared_ptr<WifiApIface> newWifiApIface(std::string& ifname);
168 ndk::ScopedAStatus createVirtualApInterface(const std::string& apVirtIf);
169 std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus> createApIfaceInternal();
170 std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus> createBridgedApIfaceInternal();
171 std::pair<std::vector<std::string>, ndk::ScopedAStatus> getApIfaceNamesInternal();
172 std::pair<std::shared_ptr<IWifiApIface>, ndk::ScopedAStatus> getApIfaceInternal(
173 const std::string& ifname);
174 ndk::ScopedAStatus removeApIfaceInternal(const std::string& ifname);
175 ndk::ScopedAStatus removeIfaceInstanceFromBridgedApIfaceInternal(
176 const std::string& brIfaceName, const std::string& ifInstanceName);
177 std::pair<std::shared_ptr<IWifiNanIface>, ndk::ScopedAStatus> createNanIfaceInternal();
178 std::pair<std::vector<std::string>, ndk::ScopedAStatus> getNanIfaceNamesInternal();
179 std::pair<std::shared_ptr<IWifiNanIface>, ndk::ScopedAStatus> getNanIfaceInternal(
180 const std::string& ifname);
181 ndk::ScopedAStatus removeNanIfaceInternal(const std::string& ifname);
182 std::pair<std::shared_ptr<IWifiP2pIface>, ndk::ScopedAStatus> createP2pIfaceInternal();
183 std::pair<std::vector<std::string>, ndk::ScopedAStatus> getP2pIfaceNamesInternal();
184 std::pair<std::shared_ptr<IWifiP2pIface>, ndk::ScopedAStatus> getP2pIfaceInternal(
185 const std::string& ifname);
186 ndk::ScopedAStatus removeP2pIfaceInternal(const std::string& ifname);
187 std::pair<std::shared_ptr<IWifiStaIface>, ndk::ScopedAStatus> createStaIfaceInternal();
188 std::pair<std::vector<std::string>, ndk::ScopedAStatus> getStaIfaceNamesInternal();
189 std::pair<std::shared_ptr<IWifiStaIface>, ndk::ScopedAStatus> getStaIfaceInternal(
190 const std::string& ifname);
191 ndk::ScopedAStatus removeStaIfaceInternal(const std::string& ifname);
192 std::pair<std::shared_ptr<IWifiRttController>, ndk::ScopedAStatus> createRttControllerInternal(
193 const std::shared_ptr<IWifiStaIface>& bound_iface);
194 std::pair<std::vector<WifiDebugRingBufferStatus>, ndk::ScopedAStatus>
195 getDebugRingBuffersStatusInternal();
196 ndk::ScopedAStatus startLoggingToDebugRingBufferInternal(
197 const std::string& ring_name, WifiDebugRingBufferVerboseLevel verbose_level,
198 uint32_t max_interval_in_sec, uint32_t min_data_size_in_bytes);
199 ndk::ScopedAStatus forceDumpToDebugRingBufferInternal(const std::string& ring_name);
200 ndk::ScopedAStatus flushRingBufferToFileInternal();
201 ndk::ScopedAStatus stopLoggingToDebugRingBufferInternal();
202 std::pair<WifiDebugHostWakeReasonStats, ndk::ScopedAStatus>
203 getDebugHostWakeReasonStatsInternal();
204 ndk::ScopedAStatus enableDebugErrorAlertsInternal(bool enable);
205 ndk::ScopedAStatus selectTxPowerScenarioInternal(IWifiChip::TxPowerScenario scenario);
206 ndk::ScopedAStatus resetTxPowerScenarioInternal();
207 ndk::ScopedAStatus setLatencyModeInternal(IWifiChip::LatencyMode mode);
208 ndk::ScopedAStatus setMultiStaPrimaryConnectionInternal(const std::string& ifname);
209 ndk::ScopedAStatus setMultiStaUseCaseInternal(IWifiChip::MultiStaUseCase use_case);
210 ndk::ScopedAStatus setCoexUnsafeChannelsInternal(
211 std::vector<IWifiChip::CoexUnsafeChannel> unsafe_channels,
212 CoexRestriction restrictions);
213 ndk::ScopedAStatus setCountryCodeInternal(const std::array<uint8_t, 2>& in_code);
214 std::pair<std::vector<WifiUsableChannel>, ndk::ScopedAStatus> getUsableChannelsInternal(
215 WifiBand band, WifiIfaceMode ifaceModeMask, UsableChannelFilter filterMask);
216 ndk::ScopedAStatus handleChipConfiguration(std::unique_lock<std::recursive_mutex>* lock,
217 int32_t mode_id);
218 ndk::ScopedAStatus registerDebugRingBufferCallback();
219 ndk::ScopedAStatus registerRadioModeChangeCallback();
220
221 std::vector<ChipConcurrencyCombination> getCurrentModeConcurrencyCombinations();
222 std::map<IfaceConcurrencyType, size_t> getCurrentConcurrencyCombination();
223 std::vector<std::map<IfaceConcurrencyType, size_t>> expandConcurrencyCombinations(
224 const ChipConcurrencyCombination& combination);
225 bool canExpandedConcurrencyComboSupportConcurrencyTypeWithCurrentTypes(
226 const std::map<IfaceConcurrencyType, size_t>& expanded_combo,
227 IfaceConcurrencyType requested_type);
228 bool canCurrentModeSupportConcurrencyTypeWithCurrentTypes(IfaceConcurrencyType requested_type);
229 bool canExpandedConcurrencyComboSupportConcurrencyCombo(
230 const std::map<IfaceConcurrencyType, size_t>& expanded_combo,
231 const std::map<IfaceConcurrencyType, size_t>& req_combo);
232 bool canCurrentModeSupportConcurrencyCombo(
233 const std::map<IfaceConcurrencyType, size_t>& req_combo);
234 bool canCurrentModeSupportConcurrencyType(IfaceConcurrencyType requested_type);
235
236 bool isValidModeId(int32_t mode_id);
237 bool isStaApConcurrencyAllowedInCurrentMode();
238 bool isDualStaConcurrencyAllowedInCurrentMode();
239 uint32_t startIdxOfApIface();
240 std::string getFirstActiveWlanIfaceName();
241 std::string allocateApOrStaIfaceName(IfaceType type, uint32_t start_idx);
242 std::string allocateApIfaceName();
243 std::vector<std::string> allocateBridgedApInstanceNames();
244 std::string allocateStaIfaceName();
245 bool writeRingbufferFilesInternal();
246 std::string getWlanIfaceNameWithType(IfaceType type, unsigned idx);
247 void invalidateAndClearBridgedApAll();
248 void invalidateAndClearBridgedAp(const std::string& br_name);
249 bool findUsingNameFromBridgedApInstances(const std::string& name);
250 ndk::ScopedAStatus triggerSubsystemRestartInternal();
251 std::pair<WifiRadioCombinationMatrix, ndk::ScopedAStatus>
252 getSupportedRadioCombinationsMatrixInternal();
253 void setWeakPtr(std::weak_ptr<WifiChip> ptr);
254
255 int32_t chip_id_;
256 std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal_;
257 std::weak_ptr<mode_controller::WifiModeController> mode_controller_;
258 std::shared_ptr<iface_util::WifiIfaceUtil> iface_util_;
259 std::vector<std::shared_ptr<WifiApIface>> ap_ifaces_;
260 std::vector<std::shared_ptr<WifiNanIface>> nan_ifaces_;
261 std::vector<std::shared_ptr<WifiP2pIface>> p2p_ifaces_;
262 std::vector<std::shared_ptr<WifiStaIface>> sta_ifaces_;
263 std::vector<std::shared_ptr<WifiRttController>> rtt_controllers_;
264 std::map<std::string, Ringbuffer> ringbuffer_map_;
265 bool is_valid_;
266 // Members pertaining to chip configuration.
267 int32_t current_mode_id_;
268 std::mutex lock_t;
269 std::vector<IWifiChip::ChipMode> modes_;
270 // The legacy ring buffer callback API has only a global callback
271 // registration mechanism. Use this to check if we have already
272 // registered a callback.
273 bool debug_ring_buffer_cb_registered_;
274 aidl_callback_util::AidlCallbackHandler<IWifiChipEventCallback> event_cb_handler_;
275 std::weak_ptr<WifiChip> weak_ptr_this_;
276
277 const std::function<void(const std::string&)> subsystemCallbackHandler_;
278 std::map<std::string, std::vector<std::string>> br_ifaces_ap_instances_;
279 DISALLOW_COPY_AND_ASSIGN(WifiChip);
280};
281
282} // namespace wifi
283} // namespace hardware
284} // namespace android
285} // namespace aidl
286
287#endif // WIFI_CHIP_H_