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:
TreeHugger Robot 2021-03-23 10:06:54 +00:00 committed by Android (Google) Code Review
commit 470fc06ab0
11 changed files with 117 additions and 7 deletions

View file

@ -20,6 +20,7 @@ hidl_interface {
"IWifiNanIface.hal",
"IWifiNanIfaceEventCallback.hal",
"IWifiStaIface.hal",
"IWifiEventCallback.hal",
],
interfaces: [
"android.hardware.wifi@1.0",

View file

@ -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);
};

View file

@ -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);
};

View 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);
};

View file

@ -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";
}
}

View file

@ -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);

View file

@ -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) {

View file

@ -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_;

View file

@ -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();

View file

@ -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();

View file

@ -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