Merge changes from topic "b178126071_selfRecoveryEnhancement" into sc-dev
* changes: Add API "startSubsystemRestart" and callback function Uprev IWifiEventCallback.hal to 1.5
This commit is contained in:
commit
470fc06ab0
11 changed files with 117 additions and 7 deletions
|
@ -20,6 +20,7 @@ hidl_interface {
|
|||
"IWifiNanIface.hal",
|
||||
"IWifiNanIfaceEventCallback.hal",
|
||||
"IWifiStaIface.hal",
|
||||
"IWifiEventCallback.hal",
|
||||
],
|
||||
interfaces: [
|
||||
"android.hardware.wifi@1.0",
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
package android.hardware.wifi@1.5;
|
||||
|
||||
import @1.4::IWifi;
|
||||
import IWifiEventCallback;
|
||||
import @1.0::WifiStatus;
|
||||
|
||||
/**
|
||||
* This is the root of the HAL module and is the interface returned when
|
||||
|
@ -24,4 +26,21 @@ import @1.4::IWifi;
|
|||
* module loaded in the system.
|
||||
* IWifi.getChip() must return @1.5::IWifiChip
|
||||
*/
|
||||
interface IWifi extends @1.4::IWifi {};
|
||||
interface IWifi extends @1.4::IWifi {
|
||||
/**
|
||||
* Requests notifications of significant events for the HAL. Multiple calls to
|
||||
* this must register multiple callbacks each of which must receive all
|
||||
* events. |IWifiEventCallback| object registration must be independent of the
|
||||
* state of the rest of the HAL and must persist though stops/starts. These
|
||||
* objects must be deleted when the corresponding client process is dead.
|
||||
*
|
||||
* @param callback An instance of the |IWifiEventCallback| HIDL interface
|
||||
* object.
|
||||
* @return status WifiStatus of the operation.
|
||||
* Possible status codes:
|
||||
* |WifiStatusCode.SUCCESS|,
|
||||
* |WifiStatusCode.UNKNOWN|
|
||||
*/
|
||||
registerEventCallback_1_5(IWifiEventCallback callback)
|
||||
generates (WifiStatus status);
|
||||
};
|
||||
|
|
|
@ -303,4 +303,25 @@ interface IWifiChip extends @1.4::IWifiChip {
|
|||
getUsableChannels(WifiBand band, bitfield<WifiIfaceMode> ifaceModeMask,
|
||||
bitfield<UsableChannelFilter> filterMask)
|
||||
generates (WifiStatus status, vec<WifiUsableChannel> channels);
|
||||
|
||||
/**
|
||||
* Trigger subsystem restart
|
||||
*
|
||||
* If the framework detects a problem (e.g. connection failure),
|
||||
* it must call this function to attempt recovery.
|
||||
*
|
||||
* When the wifi HAL receiveds triggerSubsystemRestart(), it must restart
|
||||
* the wlan subsystem, especially the wlan firmware.
|
||||
*
|
||||
* Regarding the callback function for subsystem restart, refer to documentation of
|
||||
* |IWifiEventCallback.onSubsystemRestart| for details.
|
||||
*
|
||||
* @return status WifiStatus of the operation.
|
||||
* Possible status codes:
|
||||
* |WifiStatusCode.SUCCESS|,
|
||||
* |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
|
||||
* |WifiStatusCode.ERROR_NOT_AVAILABLE|,
|
||||
* |WifiStatusCode.ERROR_UNKNOWN|
|
||||
*/
|
||||
triggerSubsystemRestart() generates (WifiStatus status);
|
||||
};
|
||||
|
|
28
wifi/1.5/IWifiEventCallback.hal
Normal file
28
wifi/1.5/IWifiEventCallback.hal
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Copyright 2021 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.
|
||||
*/
|
||||
|
||||
package android.hardware.wifi@1.5;
|
||||
|
||||
import @1.0::IWifiEventCallback;
|
||||
import @1.0::WifiStatus;
|
||||
|
||||
interface IWifiEventCallback extends @1.0::IWifiEventCallback {
|
||||
/**
|
||||
* Must be called when the Wi-Fi subsystem restart completes.
|
||||
* Once this event is received, framework must fully reset the Wi-Fi stack state.
|
||||
*/
|
||||
oneway onSubsystemRestart(WifiStatus status);
|
||||
};
|
|
@ -50,13 +50,21 @@ bool Wifi::isValid() {
|
|||
}
|
||||
|
||||
Return<void> Wifi::registerEventCallback(
|
||||
const sp<IWifiEventCallback>& event_callback,
|
||||
const sp<V1_0::IWifiEventCallback>& event_callback,
|
||||
registerEventCallback_cb hidl_status_cb) {
|
||||
return validateAndCall(this, WifiStatusCode::ERROR_UNKNOWN,
|
||||
&Wifi::registerEventCallbackInternal, hidl_status_cb,
|
||||
event_callback);
|
||||
}
|
||||
|
||||
Return<void> Wifi::registerEventCallback_1_5(
|
||||
const sp<V1_5::IWifiEventCallback>& event_callback,
|
||||
registerEventCallback_1_5_cb hidl_status_cb) {
|
||||
return validateAndCall(this, WifiStatusCode::ERROR_UNKNOWN,
|
||||
&Wifi::registerEventCallbackInternal_1_5,
|
||||
hidl_status_cb, event_callback);
|
||||
}
|
||||
|
||||
Return<bool> Wifi::isStarted() { return run_state_ != RunState::STOPPED; }
|
||||
|
||||
Return<void> Wifi::start(start_cb hidl_status_cb) {
|
||||
|
@ -95,7 +103,13 @@ Return<void> Wifi::debug(const hidl_handle& handle,
|
|||
}
|
||||
|
||||
WifiStatus Wifi::registerEventCallbackInternal(
|
||||
const sp<IWifiEventCallback>& event_callback) {
|
||||
const sp<V1_0::IWifiEventCallback>& event_callback __unused) {
|
||||
// Deprecated support for this callback.
|
||||
return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
|
||||
}
|
||||
|
||||
WifiStatus Wifi::registerEventCallbackInternal_1_5(
|
||||
const sp<V1_5::IWifiEventCallback>& event_callback) {
|
||||
if (!event_cb_handler_.addCallback(event_callback)) {
|
||||
return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
|
||||
}
|
||||
|
@ -117,7 +131,7 @@ WifiStatus Wifi::startInternal() {
|
|||
WifiStatus wifi_status =
|
||||
createWifiStatus(WifiStatusCode::ERROR_UNKNOWN, error);
|
||||
for (const auto& callback : event_cb_handler_.getCallbacks()) {
|
||||
if (!callback->onFailure(wifi_status).isOk()) {
|
||||
if (!callback->onSubsystemRestart(wifi_status).isOk()) {
|
||||
LOG(ERROR) << "Failed to invoke onFailure callback";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,8 +52,11 @@ class Wifi : public V1_5::IWifi {
|
|||
|
||||
// HIDL methods exposed.
|
||||
Return<void> registerEventCallback(
|
||||
const sp<IWifiEventCallback>& event_callback,
|
||||
const sp<V1_0::IWifiEventCallback>& event_callback,
|
||||
registerEventCallback_cb hidl_status_cb) override;
|
||||
Return<void> registerEventCallback_1_5(
|
||||
const sp<V1_5::IWifiEventCallback>& event_callback,
|
||||
registerEventCallback_1_5_cb hidl_status_cb) override;
|
||||
Return<bool> isStarted() override;
|
||||
Return<void> start(start_cb hidl_status_cb) override;
|
||||
Return<void> stop(stop_cb hidl_status_cb) override;
|
||||
|
@ -67,7 +70,9 @@ class Wifi : public V1_5::IWifi {
|
|||
|
||||
// Corresponding worker functions for the HIDL methods.
|
||||
WifiStatus registerEventCallbackInternal(
|
||||
const sp<IWifiEventCallback>& event_callback);
|
||||
const sp<V1_0::IWifiEventCallback>& event_callback __unused);
|
||||
WifiStatus registerEventCallbackInternal_1_5(
|
||||
const sp<V1_5::IWifiEventCallback>& event_callback);
|
||||
WifiStatus startInternal();
|
||||
WifiStatus stopInternal(std::unique_lock<std::recursive_mutex>* lock);
|
||||
std::pair<WifiStatus, std::vector<ChipId>> getChipIdsInternal();
|
||||
|
@ -87,7 +92,7 @@ class Wifi : public V1_5::IWifi {
|
|||
std::shared_ptr<feature_flags::WifiFeatureFlags> feature_flags_;
|
||||
RunState run_state_;
|
||||
std::vector<sp<WifiChip>> chips_;
|
||||
hidl_callback_util::HidlCallbackHandler<IWifiEventCallback>
|
||||
hidl_callback_util::HidlCallbackHandler<V1_5::IWifiEventCallback>
|
||||
event_cb_handler_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(Wifi);
|
||||
|
|
|
@ -747,6 +747,13 @@ Return<void> WifiChip::getUsableChannels(
|
|||
ifaceModeMask, filterMask);
|
||||
}
|
||||
|
||||
Return<void> WifiChip::triggerSubsystemRestart(
|
||||
triggerSubsystemRestart_cb hidl_status_cb) {
|
||||
return validateAndCall(this, WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
|
||||
&WifiChip::triggerSubsystemRestartInternal,
|
||||
hidl_status_cb);
|
||||
}
|
||||
|
||||
void WifiChip::invalidateAndRemoveAllIfaces() {
|
||||
invalidateAndClearBridgedApAll();
|
||||
invalidateAndClearAll(ap_ifaces_);
|
||||
|
@ -1522,6 +1529,11 @@ WifiChip::getUsableChannelsInternal(WifiBand band, uint32_t ifaceModeMask,
|
|||
return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_usable_channels};
|
||||
}
|
||||
|
||||
WifiStatus WifiChip::triggerSubsystemRestartInternal() {
|
||||
auto legacy_status = legacy_hal_.lock()->triggerSubsystemRestart();
|
||||
return createWifiStatusFromLegacyError(legacy_status);
|
||||
}
|
||||
|
||||
WifiStatus WifiChip::handleChipConfiguration(
|
||||
/* NONNULL */ std::unique_lock<std::recursive_mutex>* lock,
|
||||
ChipModeId mode_id) {
|
||||
|
|
|
@ -184,6 +184,8 @@ class WifiChip : public V1_5::IWifiChip {
|
|||
WifiBand band, hidl_bitfield<WifiIfaceMode> ifaceModeMask,
|
||||
hidl_bitfield<UsableChannelFilter> filterMask,
|
||||
getUsableChannels_cb _hidl_cb) override;
|
||||
Return<void> triggerSubsystemRestart(
|
||||
triggerSubsystemRestart_cb hidl_status_cb) override;
|
||||
|
||||
private:
|
||||
void invalidateAndRemoveAllIfaces();
|
||||
|
@ -303,6 +305,7 @@ class WifiChip : public V1_5::IWifiChip {
|
|||
void invalidateAndClearBridgedApAll();
|
||||
void invalidateAndClearBridgedAp(const std::string& br_name);
|
||||
bool findUsingNameFromBridgedApInstances(const std::string& name);
|
||||
WifiStatus triggerSubsystemRestartInternal();
|
||||
|
||||
ChipId chip_id_;
|
||||
std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal_;
|
||||
|
|
|
@ -1676,6 +1676,10 @@ WifiLegacyHal::getUsableChannels(uint32_t band_mask, uint32_t iface_mode_mask,
|
|||
return {status, std::move(channels)};
|
||||
}
|
||||
|
||||
wifi_error WifiLegacyHal::triggerSubsystemRestart() {
|
||||
return global_func_table_.wifi_trigger_subsystem_restart();
|
||||
}
|
||||
|
||||
void WifiLegacyHal::invalidate() {
|
||||
global_handle_ = nullptr;
|
||||
iface_name_to_handle_.clear();
|
||||
|
|
|
@ -716,6 +716,8 @@ class WifiLegacyHal {
|
|||
std::pair<wifi_error, std::vector<wifi_usable_channel>> getUsableChannels(
|
||||
uint32_t band_mask, uint32_t iface_mode_mask, uint32_t filter_mask);
|
||||
|
||||
wifi_error triggerSubsystemRestart();
|
||||
|
||||
private:
|
||||
// Retrieve interface handles for all the available interfaces.
|
||||
wifi_error retrieveIfaceHandles();
|
||||
|
|
|
@ -160,6 +160,7 @@ bool initHalFuncTableWithStubs(wifi_hal_fn* hal_fn) {
|
|||
populateStubFor(&hal_fn->wifi_twt_clear_stats);
|
||||
populateStubFor(&hal_fn->wifi_set_dtim_config);
|
||||
populateStubFor(&hal_fn->wifi_get_usable_channels);
|
||||
populateStubFor(&hal_fn->wifi_trigger_subsystem_restart);
|
||||
return true;
|
||||
}
|
||||
} // namespace legacy_hal
|
||||
|
|
Loading…
Reference in a new issue