summaryrefslogtreecommitdiffstats
path: root/wifi
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2016-12-14 17:41:20 -0800
committerRoshan Pius <rpius@google.com>2016-12-16 13:06:34 -0800
commit203cb031df35ebfe647e93b6b0d9634602693668 (patch)
tree6c90949b5036e51e2c60d633067cb4fbf12f9f84 /wifi
parent26801cb4ce5f7f09fbc9569ba54b3c87ae5542c5 (diff)
downloadplatform_hardware_interfaces-203cb031df35ebfe647e93b6b0d9634602693668.tar.gz
platform_hardware_interfaces-203cb031df35ebfe647e93b6b0d9634602693668.tar.bz2
platform_hardware_interfaces-203cb031df35ebfe647e93b6b0d9634602693668.zip
wifi: Add support for alert handler
This is a debug mechanism provided for vendors to inform the framework about the occurence of any fatal events. Bug: 33620898 Test: Compiles Change-Id: Ib6ac322131796792f66f87237a62eb8f5a013433
Diffstat (limited to 'wifi')
-rw-r--r--wifi/1.0/IWifiChip.hal21
-rw-r--r--wifi/1.0/IWifiChipEventCallback.hal10
-rw-r--r--wifi/1.0/default/hidl_struct_util.cpp5
-rw-r--r--wifi/1.0/default/wifi_chip.cpp35
-rw-r--r--wifi/1.0/default/wifi_chip.h4
-rw-r--r--wifi/1.0/default/wifi_legacy_hal.cpp45
-rw-r--r--wifi/1.0/default/wifi_legacy_hal.h6
7 files changed, 124 insertions, 2 deletions
diff --git a/wifi/1.0/IWifiChip.hal b/wifi/1.0/IWifiChip.hal
index 051a08859c..e903ced64c 100644
--- a/wifi/1.0/IWifiChip.hal
+++ b/wifi/1.0/IWifiChip.hal
@@ -163,6 +163,10 @@ interface IWifiChip {
* Host wake reasons stats collection.
*/
DEBUG_HOST_WAKE_REASON_STATS = 1 << 6,
+ /**
+ * Error alerts.
+ */
+ DEBUG_ERROR_ALERTS = 1 << 7
};
/**
@@ -640,4 +644,21 @@ interface IWifiChip {
*/
getDebugHostWakeReasonStats()
generates (WifiStatus status, WifiDebugHostWakeReasonStats stats);
+
+ /**
+ * API to enable/disable alert notifications from the chip.
+ * These alerts must be used to notify framework of any fatal error events
+ * that the chip encounters via |IWifiChipEventCallback.onDebugErrorAlert| method.
+ * Must fail if |ChipCapabilityMask.DEBUG_ERROR_ALERTS| is not set.
+ *
+ * @param enable true to enable, false to disable.
+ * @return status WifiStatus of the operation.
+ * Possible status codes:
+ * |WifiStatusCode.SUCCESS|,
+ * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.NOT_AVAILABLE|,
+ * |WifiStatusCode.UNKNOWN|
+ */
+ enableDebugErrorAlerts(bool enable) generates (WifiStatus status);
};
diff --git a/wifi/1.0/IWifiChipEventCallback.hal b/wifi/1.0/IWifiChipEventCallback.hal
index 292b10f657..1501029092 100644
--- a/wifi/1.0/IWifiChipEventCallback.hal
+++ b/wifi/1.0/IWifiChipEventCallback.hal
@@ -70,4 +70,14 @@ interface IWifiChipEventCallback {
oneway onDebugRingBufferVendorDataEntriesAvailable(
WifiDebugRingBufferStatus status,
vec<WifiDebugRingEntryVendorData> entries);
+
+ /**
+ * Callback indicating that the chip has encountered a fatal error.
+ * Client must not attempt to parse either the errorCode or debugData.
+ * Must only be captured in a bugreport.
+ *
+ * @param errorCode Vendor defined error code.
+ * @param debugData Vendor defined data used for debugging.
+ */
+ oneway onDebugErrorAlert(int32_t errorCode, vec<uint8_t> debugData);
};
diff --git a/wifi/1.0/default/hidl_struct_util.cpp b/wifi/1.0/default/hidl_struct_util.cpp
index 996f119fd5..0aee372f21 100644
--- a/wifi/1.0/default/hidl_struct_util.cpp
+++ b/wifi/1.0/default/hidl_struct_util.cpp
@@ -93,10 +93,11 @@ bool convertLegacyFeaturesToHidlChipCapabilities(
*hidl_caps |= convertLegacyLoggerFeatureToHidlChipCapability(feature);
}
}
- // There is no flags for these 2 in the legacy feature set. Adding it to the
- // set because all the current devices support it.
+ // There are no flags for these 3 in the legacy feature set. Adding them to
+ // the set because all the current devices support it.
*hidl_caps |= HidlChipCaps::DEBUG_RING_BUFFER_VENDOR_DATA_SUPPORTED;
*hidl_caps |= HidlChipCaps::DEBUG_HOST_WAKE_REASON_STATS;
+ *hidl_caps |= HidlChipCaps::DEBUG_ERROR_ALERTS;
return true;
}
diff --git a/wifi/1.0/default/wifi_chip.cpp b/wifi/1.0/default/wifi_chip.cpp
index d70f548783..d64dea62d5 100644
--- a/wifi/1.0/default/wifi_chip.cpp
+++ b/wifi/1.0/default/wifi_chip.cpp
@@ -69,6 +69,10 @@ bool WifiChip::isValid() {
return is_valid_;
}
+std::vector<sp<IWifiChipEventCallback>> WifiChip::getEventCallbacks() {
+ return event_callbacks_;
+}
+
Return<void> WifiChip::getId(getId_cb hidl_status_cb) {
return validateAndCall(this,
WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
@@ -319,6 +323,15 @@ Return<void> WifiChip::getDebugHostWakeReasonStats(
hidl_status_cb);
}
+Return<void> WifiChip::enableDebugErrorAlerts(
+ bool enable, enableDebugErrorAlerts_cb hidl_status_cb) {
+ return validateAndCall(this,
+ WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
+ &WifiChip::enableDebugErrorAlertsInternal,
+ hidl_status_cb,
+ enable);
+}
+
void WifiChip::invalidateAndRemoveAllIfaces() {
invalidateAndClear(ap_iface_);
invalidateAndClear(nan_iface_);
@@ -706,6 +719,28 @@ WifiChip::getDebugHostWakeReasonStatsInternal() {
return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
}
+WifiStatus WifiChip::enableDebugErrorAlertsInternal(bool enable) {
+ legacy_hal::wifi_error legacy_status;
+ if (enable) {
+ android::wp<WifiChip> weak_ptr_this(this);
+ const auto& on_alert_callback = [weak_ptr_this](
+ int32_t error_code, std::vector<uint8_t> debug_data) {
+ const auto shared_ptr_this = weak_ptr_this.promote();
+ if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
+ LOG(ERROR) << "Callback invoked on an invalid object";
+ return;
+ }
+ for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
+ callback->onDebugErrorAlert(error_code, debug_data);
+ }
+ };
+ legacy_status = legacy_hal_.lock()->registerErrorAlertCallbackHandler(
+ on_alert_callback);
+ } else {
+ legacy_status = legacy_hal_.lock()->deregisterErrorAlertCallbackHandler();
+ }
+ return createWifiStatusFromLegacyError(legacy_status);
+}
} // namespace implementation
} // namespace V1_0
} // namespace wifi
diff --git a/wifi/1.0/default/wifi_chip.h b/wifi/1.0/default/wifi_chip.h
index 5e7a0c37c9..cfe2ed235f 100644
--- a/wifi/1.0/default/wifi_chip.h
+++ b/wifi/1.0/default/wifi_chip.h
@@ -62,6 +62,7 @@ class WifiChip : public IWifiChip {
// valid before processing them.
void invalidate();
bool isValid();
+ std::vector<sp<IWifiChipEventCallback>> getEventCallbacks();
// HIDL methods exposed.
Return<void> getId(getId_cb hidl_status_cb) override;
@@ -119,6 +120,8 @@ class WifiChip : public IWifiChip {
forceDumpToDebugRingBuffer_cb hidl_status_cb) override;
Return<void> getDebugHostWakeReasonStats(
getDebugHostWakeReasonStats_cb hidl_status_cb) override;
+ Return<void> enableDebugErrorAlerts(
+ bool enable, enableDebugErrorAlerts_cb hidl_status_cb) override;
private:
void invalidateAndRemoveAllIfaces();
@@ -168,6 +171,7 @@ class WifiChip : public IWifiChip {
WifiStatus forceDumpToDebugRingBufferInternal(const hidl_string& ring_name);
std::pair<WifiStatus, WifiDebugHostWakeReasonStats>
getDebugHostWakeReasonStatsInternal();
+ WifiStatus enableDebugErrorAlertsInternal(bool enable);
ChipId chip_id_;
std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal_;
diff --git a/wifi/1.0/default/wifi_legacy_hal.cpp b/wifi/1.0/default/wifi_legacy_hal.cpp
index d10e181555..678ebb1a31 100644
--- a/wifi/1.0/default/wifi_legacy_hal.cpp
+++ b/wifi/1.0/default/wifi_legacy_hal.cpp
@@ -121,6 +121,18 @@ void onRingBufferData(char* ring_name,
}
}
+// Callback to be invoked for error alert indication.
+std::function<void(wifi_request_id, char*, int, int)>
+ on_error_alert_internal_callback;
+void onErrorAlert(wifi_request_id id,
+ char* buffer,
+ int buffer_size,
+ int err_code) {
+ if (on_error_alert_internal_callback) {
+ on_error_alert_internal_callback(id, buffer, buffer_size, err_code);
+ }
+}
+
// Callback to be invoked for rtt results results.
std::function<void(
wifi_request_id, unsigned num_results, wifi_rtt_result* rtt_results[])>
@@ -764,6 +776,38 @@ wifi_error WifiLegacyHal::getRingBufferData(const std::string& ring_name) {
ring_name_internal.data());
}
+wifi_error WifiLegacyHal::registerErrorAlertCallbackHandler(
+ const on_error_alert_callback& on_user_alert_callback) {
+ if (on_error_alert_internal_callback) {
+ return WIFI_ERROR_NOT_AVAILABLE;
+ }
+ on_error_alert_internal_callback = [on_user_alert_callback](
+ wifi_request_id id, char* buffer, int buffer_size, int err_code) {
+ if (buffer) {
+ CHECK(id == 0);
+ on_user_alert_callback(
+ err_code,
+ std::vector<uint8_t>(
+ reinterpret_cast<uint8_t*>(buffer),
+ reinterpret_cast<uint8_t*>(buffer) + buffer_size));
+ }
+ };
+ wifi_error status = global_func_table_.wifi_set_alert_handler(
+ 0, wlan_interface_handle_, {onErrorAlert});
+ if (status != WIFI_SUCCESS) {
+ on_error_alert_internal_callback = nullptr;
+ }
+ return status;
+}
+
+wifi_error WifiLegacyHal::deregisterErrorAlertCallbackHandler() {
+ if (!on_error_alert_internal_callback) {
+ return WIFI_ERROR_NOT_AVAILABLE;
+ }
+ on_error_alert_internal_callback = nullptr;
+ return global_func_table_.wifi_reset_alert_handler(0, wlan_interface_handle_);
+}
+
wifi_error WifiLegacyHal::startRttRangeRequest(
wifi_request_id id,
const std::vector<wifi_rtt_config>& rtt_configs,
@@ -1114,6 +1158,7 @@ void WifiLegacyHal::invalidate() {
on_link_layer_stats_result_internal_callback = nullptr;
on_rssi_threshold_breached_internal_callback = nullptr;
on_ring_buffer_data_internal_callback = nullptr;
+ on_error_alert_internal_callback = nullptr;
on_rtt_results_internal_callback = nullptr;
on_nan_notify_response_user_callback = nullptr;
on_nan_event_publish_terminated_user_callback = nullptr;
diff --git a/wifi/1.0/default/wifi_legacy_hal.h b/wifi/1.0/default/wifi_legacy_hal.h
index 77b1705ddc..c846fc8da1 100644
--- a/wifi/1.0/default/wifi_legacy_hal.h
+++ b/wifi/1.0/default/wifi_legacy_hal.h
@@ -118,6 +118,9 @@ using on_ring_buffer_data_callback =
const std::vector<uint8_t>&,
const wifi_ring_buffer_status&)>;
+// Callback for alerts.
+using on_error_alert_callback =
+ std::function<void(int32_t, const std::vector<uint8_t>&)>;
/**
* Class that encapsulates all legacy HAL interactions.
* This class manages the lifetime of the event loop thread used by legacy HAL.
@@ -196,6 +199,9 @@ class WifiLegacyHal {
uint32_t max_interval_sec,
uint32_t min_data_size);
wifi_error getRingBufferData(const std::string& ring_name);
+ wifi_error registerErrorAlertCallbackHandler(
+ const on_error_alert_callback& on_alert_callback);
+ wifi_error deregisterErrorAlertCallbackHandler();
// RTT functions.
wifi_error startRttRangeRequest(
wifi_request_id id,