diff options
author | Subhani Shaik <subhanis@codeaurora.org> | 2016-03-24 19:52:11 +0530 |
---|---|---|
committer | mukesh agrawal <quiche@google.com> | 2016-04-13 10:39:38 -0700 |
commit | 42f5dc2b5f632ce601d876fad18830de3ea38b89 (patch) | |
tree | 7ccbdc64fa58567fe643f2e42daa08b66e5df2ab /qcwcn | |
parent | 68519e22a5d46fbd424347da20c9f95dd2f3925d (diff) | |
download | wlan-42f5dc2b5f632ce601d876fad18830de3ea38b89.tar.gz |
WiFi-HAL: Protect packet fate stats resources with mutex
Wifihal collects packet fate stats to a local buffer and the stats
will be copied to the buffers provided by framework in get() APIs.
Protect reads and writes to this buffer with a mutex to avoid
read from get() while write is going on in the event context.
BUG: 27799235
Diffstat (limited to 'qcwcn')
-rw-r--r-- | qcwcn/wifi_hal/common.h | 2 | ||||
-rw-r--r-- | qcwcn/wifi_hal/wifi_hal.cpp | 2 | ||||
-rw-r--r-- | qcwcn/wifi_hal/wifilogger.cpp | 14 | ||||
-rw-r--r-- | qcwcn/wifi_hal/wifilogger_diag.cpp | 2 |
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 3727e0b..0221e73 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), |