summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2016-04-13 19:14:44 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-04-13 19:14:44 +0000
commitff39dc35d458da87b29d339cd35d9d4379f3a00b (patch)
tree4fb629fe758864ec7df05658f66d7997c9ec9823
parentbab98a0490770557c29136ba2d91e14ef096c45f (diff)
parent42f5dc2b5f632ce601d876fad18830de3ea38b89 (diff)
downloadwlan-ff39dc35d458da87b29d339cd35d9d4379f3a00b.tar.gz
Merge "WiFi-HAL: Protect packet fate stats resources with mutex" into nyc-dev
-rw-r--r--qcwcn/wifi_hal/common.h2
-rw-r--r--qcwcn/wifi_hal/wifi_hal.cpp2
-rw-r--r--qcwcn/wifi_hal/wifilogger.cpp14
-rw-r--r--qcwcn/wifi_hal/wifilogger_diag.cpp2
4 files changed, 18 insertions, 2 deletions
diff --git a/qcwcn/wifi_hal/common.h b/qcwcn/wifi_hal/common.h
index 2601999..f0b8373 100644
--- a/qcwcn/wifi_hal/common.h
+++ b/qcwcn/wifi_hal/common.h
@@ -137,6 +137,8 @@ typedef struct hal_info_s {
u32 firmware_bus_max_size;
bool fate_monitoring_enabled;
packet_fate_monitor_info *pkt_fate_stats;
+ /* mutex for the packet fate stats shared resource protection */
+ pthread_mutex_t pkt_fate_stats_lock;
} hal_info;
wifi_error wifi_register_handler(wifi_handle handle, int cmd, nl_recvmsg_msg_cb_t func, void *arg);
diff --git a/qcwcn/wifi_hal/wifi_hal.cpp b/qcwcn/wifi_hal/wifi_hal.cpp
index 27f297f..3541d87 100644
--- a/qcwcn/wifi_hal/wifi_hal.cpp
+++ b/qcwcn/wifi_hal/wifi_hal.cpp
@@ -462,6 +462,7 @@ wifi_error wifi_initialize(wifi_handle *handle)
}
pthread_mutex_init(&info->cb_lock, NULL);
+ pthread_mutex_init(&info->pkt_fate_stats_lock, NULL);
*handle = (wifi_handle) info;
@@ -654,6 +655,7 @@ static void internal_cleaned_up_handler(wifi_handle handle)
(*cleaned_up_handler)(handle);
pthread_mutex_destroy(&info->cb_lock);
+ pthread_mutex_destroy(&info->pkt_fate_stats_lock);
free(info);
ALOGI("Internal cleanup completed");
diff --git a/qcwcn/wifi_hal/wifilogger.cpp b/qcwcn/wifi_hal/wifilogger.cpp
index 506e0df..6ea5eaf 100644
--- a/qcwcn/wifi_hal/wifilogger.cpp
+++ b/qcwcn/wifi_hal/wifilogger.cpp
@@ -625,7 +625,9 @@ wifi_error wifi_start_pkt_fate_monitoring(wifi_interface_handle iface)
}
memset(info->pkt_fate_stats, 0, sizeof(packet_fate_monitor_info));
+ pthread_mutex_lock(&info->pkt_fate_stats_lock);
info->fate_monitoring_enabled = true;
+ pthread_mutex_unlock(&info->pkt_fate_stats_lock);
return WIFI_SUCCESS;
}
@@ -651,13 +653,16 @@ wifi_error wifi_get_tx_pkt_fates(wifi_interface_handle iface,
{
wifi_handle wifiHandle = getWifiHandle(iface);
hal_info *info = getHalInfo(wifiHandle);
- wifi_tx_report_i *tx_fate_stats = &info->pkt_fate_stats->tx_fate_stats[0];
+ wifi_tx_report_i *tx_fate_stats;
size_t i;
if (info->fate_monitoring_enabled != true) {
ALOGE("Packet monitoring is not yet triggered");
return WIFI_ERROR_UNINITIALIZED;
}
+ pthread_mutex_lock(&info->pkt_fate_stats_lock);
+
+ tx_fate_stats = &info->pkt_fate_stats->tx_fate_stats[0];
*n_provided_fates = min(n_requested_fates,
info->pkt_fate_stats->n_tx_stats_collected);
@@ -693,6 +698,7 @@ wifi_error wifi_get_tx_pkt_fates(wifi_interface_handle iface,
* ignore the all other types of packets received from driver */
ALOGI("Unknown format packet");
}
+ pthread_mutex_unlock(&info->pkt_fate_stats_lock);
return WIFI_SUCCESS;
}
@@ -717,13 +723,16 @@ wifi_error wifi_get_rx_pkt_fates(wifi_interface_handle iface,
{
wifi_handle wifiHandle = getWifiHandle(iface);
hal_info *info = getHalInfo(wifiHandle);
- wifi_rx_report_i *rx_fate_stats = &info->pkt_fate_stats->rx_fate_stats[0];
+ wifi_rx_report_i *rx_fate_stats;
size_t i;
if (info->fate_monitoring_enabled != true) {
ALOGE("Packet monitoring is not yet triggered");
return WIFI_ERROR_UNINITIALIZED;
}
+ pthread_mutex_lock(&info->pkt_fate_stats_lock);
+
+ rx_fate_stats = &info->pkt_fate_stats->rx_fate_stats[0];
*n_provided_fates = min(n_requested_fates,
info->pkt_fate_stats->n_rx_stats_collected);
@@ -759,6 +768,7 @@ wifi_error wifi_get_rx_pkt_fates(wifi_interface_handle iface,
* ignore the all other types of packets received from driver */
ALOGI("Unknown format packet");
}
+ pthread_mutex_unlock(&info->pkt_fate_stats_lock);
return WIFI_SUCCESS;
}
diff --git a/qcwcn/wifi_hal/wifilogger_diag.cpp b/qcwcn/wifi_hal/wifilogger_diag.cpp
index 35fd2c9..2d29455 100644
--- a/qcwcn/wifi_hal/wifilogger_diag.cpp
+++ b/qcwcn/wifi_hal/wifilogger_diag.cpp
@@ -1954,6 +1954,7 @@ static wifi_error parse_stats_record(hal_info *info,
else
status = WIFI_SUCCESS;
} else if (pkt_stats_header->log_type == PKTLOG_TYPE_PKT_DUMP) {
+ pthread_mutex_lock(&info->pkt_fate_stats_lock);
if (info->fate_monitoring_enabled) {
status = parse_pkt_fate_stats(info,
(u8 *)(pkt_stats_header + 1),
@@ -1962,6 +1963,7 @@ static wifi_error parse_stats_record(hal_info *info,
ALOGD("Packet fate monitoring is not enabled");
status = WIFI_SUCCESS;
}
+ pthread_mutex_unlock(&info->pkt_fate_stats_lock);
} else {
status = parse_tx_stats(info,
(u8 *)(pkt_stats_header + 1),