Merge changes I03150207,I0abe95e9,Ic99541c1,I06aa330f,I5941c3ac, ...
* changes:
WiFiHAL: Sync with wpa_supplicant src/common/qca-vendor.h
WiFiHAL: Remove unused param warnings in WifiEvent class
WifiHAL: Free the stats received so far if requestResponse() fails
Wifi-HAL: Move llstats freeing to a common API
WiFi-Hal: Support new header of size 16-bytes for fate stats
WiFi-Hal: Parse new event for packet fate stats
diff --git a/qcwcn/wifi_hal/common.h b/qcwcn/wifi_hal/common.h
index 46dabcd..649bf6a 100644
--- a/qcwcn/wifi_hal/common.h
+++ b/qcwcn/wifi_hal/common.h
@@ -191,6 +191,10 @@
#define get_requestid() ((arc4random()%REQUEST_ID_MAX) + 1)
#define WAIT_TIME_FOR_SET_REG_DOMAIN 50000
+#ifndef UNUSED
+#define UNUSED(x) (void)(x)
+#endif
+
#ifdef __cplusplus
extern "C"
{
diff --git a/qcwcn/wifi_hal/cpp_bindings.h b/qcwcn/wifi_hal/cpp_bindings.h
index 8d8dfe3..e862602 100644
--- a/qcwcn/wifi_hal/cpp_bindings.h
+++ b/qcwcn/wifi_hal/cpp_bindings.h
@@ -346,11 +346,13 @@
/* Override this method to parse reply and dig out data; save it in the object */
virtual int handleResponse(WifiEvent& reply) {
+ UNUSED(reply);
return NL_SKIP;
}
/* Override this method to parse event and dig out data; save it in the object */
virtual int handleEvent(WifiEvent& event) {
+ UNUSED(event);
return NL_SKIP;
}
diff --git a/qcwcn/wifi_hal/llstats.cpp b/qcwcn/wifi_hal/llstats.cpp
index eeabc06..88bf79f 100644
--- a/qcwcn/wifi_hal/llstats.cpp
+++ b/qcwcn/wifi_hal/llstats.cpp
@@ -93,7 +93,6 @@
void LLStatsCommand::initGetContext(u32 reqId)
{
mRequestId = reqId;
- memset(&mResultsParams, 0,sizeof(LLStatsResultsParams));
memset(&mHandler, 0,sizeof(mHandler));
}
@@ -871,6 +870,14 @@
ret = WIFI_ERROR_INVALID_ARGS;
}
+ clearStats();
+
+ return ret;
+}
+
+
+void LLStatsCommand::clearStats()
+{
if(mResultsParams.radio_stat)
{
if (mResultsParams.radio_stat->tx_time_per_levels)
@@ -888,8 +895,6 @@
free(mResultsParams.iface_stat);
mResultsParams.iface_stat = NULL;
}
-
- return ret;
}
@@ -1233,24 +1238,7 @@
return NL_SKIP;
cleanup:
- if(mResultsParams.radio_stat)
- {
- if (mResultsParams.radio_stat->tx_time_per_levels)
- {
- free(mResultsParams.radio_stat->tx_time_per_levels);
- mResultsParams.radio_stat->tx_time_per_levels = NULL;
- }
- free(mResultsParams.radio_stat);
- mResultsParams.radio_stat = NULL;
- mRadioStatsSize = 0;
- mNumRadios = 0;
- }
-
- if(mResultsParams.iface_stat)
- {
- free(mResultsParams.iface_stat);
- mResultsParams.iface_stat = NULL;
- }
+ clearStats();
return status;
}
@@ -1358,8 +1346,10 @@
if (ret != 0) {
ALOGE("%s: requestResponse Error:%d",__FUNCTION__, ret);
}
- if (ret < 0)
+ if (ret < 0) {
+ LLCommand->clearStats();
goto cleanup;
+ }
if (ret == 0) {
ret = LLCommand->notifyResponse();
diff --git a/qcwcn/wifi_hal/llstatscommand.h b/qcwcn/wifi_hal/llstatscommand.h
index 9edf3a7..aef0017 100644
--- a/qcwcn/wifi_hal/llstatscommand.h
+++ b/qcwcn/wifi_hal/llstatscommand.h
@@ -112,6 +112,8 @@
struct nlattr **tb_vendor);
virtual void setHandler(wifi_stats_result_handler handler);
+
+ virtual void clearStats();
};
#ifdef __cplusplus
diff --git a/qcwcn/wifi_hal/pkt_stats.h b/qcwcn/wifi_hal/pkt_stats.h
index 5043069..d1cc71a 100644
--- a/qcwcn/wifi_hal/pkt_stats.h
+++ b/qcwcn/wifi_hal/pkt_stats.h
@@ -45,7 +45,8 @@
#define PKTLOG_TYPE_TX_VIRT_ADDR 8
#define PKTLOG_TYPE_PKT_STATS 9
#define PKTLOG_TYPE_PKT_DUMP 10
-#define PKTLOG_TYPE_MAX 11
+#define PKTLOG_TYPE_PKT_DUMP_V2 11
+#define PKTLOG_TYPE_MAX 12
#define BW_OFFSET 8
#define INVALID_RSSI 255
@@ -60,6 +61,7 @@
#define PKT_INFO_FLG_RX_REORDER_DROP_S 0x100
#define PKT_INFO_FLG_RX_PEER_INFO_S 0x200
#define PKT_INFO_FLG_UNKNOWN_S 0x400
+#define PKT_INFO_FLG_PKT_DUMP_V2 0x8000
/* MASK value of flags based on RX_STAT content.
* These are the events that carry Rx decriptor
@@ -80,6 +82,16 @@
u32 timestamp;
} __attribute__((packed)) wh_pktlog_hdr_t;
+/* Format of the v2 packet stats event*/
+typedef struct {
+ u16 flags;
+ u16 missed_cnt;
+ u16 log_type;
+ u16 size;
+ u32 timestamp;
+ u32 reserved;
+} __attribute__((packed)) wh_pktlog_hdr_v2_t;
+
/*Rx stats specific structures. */
struct rx_attention {
u32 first_mpdu : 1; //[0]
diff --git a/qcwcn/wifi_hal/qca-vendor_copy.h b/qcwcn/wifi_hal/qca-vendor_copy.h
index ab1216a..0a7a086 100644
--- a/qcwcn/wifi_hal/qca-vendor_copy.h
+++ b/qcwcn/wifi_hal/qca-vendor_copy.h
@@ -364,6 +364,15 @@
/* 144 - reserved for QCA */
QCA_NL80211_VENDOR_SUBCMD_ABORT_SCAN = 145,
QCA_NL80211_VENDOR_SUBCMD_SET_SAR_LIMITS = 146,
+ /* @QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_SET:
+ * Start / Stop the NUD stats collection.
+ */
+ QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_SET = 149,
+ /* @QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_GET:
+ * Get the NUD stats.These stats are represented
+ * by the enum qca_attr_nud_stats_get.
+ */
+ QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_GET = 150
};
@@ -2914,4 +2923,62 @@
QCA_WLAN_VENDOR_ATTR_PNO_AFTER_LAST - 1,
};
+/**
+ * qca_wlan_vendor_attr_nud_stats_set: attribute to vendor subcmd
+ * QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_SET. This carry the requisite
+ * information to start / stop the NUD stats collection.
+ */
+enum qca_attr_nud_stats_set {
+ QCA_ATTR_NUD_STATS_SET_INVALID = 0,
+
+ /* Flag to Start / Stop the NUD stats collection
+ * Start - If included , Stop - If not included
+ */
+ QCA_ATTR_NUD_STATS_SET_START = 1,
+ /* IPv4 address of Default Gateway (in network byte order) */
+ QCA_ATTR_NUD_STATS_GW_IPV4 = 2,
+
+ /* keep last */
+ QCA_ATTR_NUD_STATS_SET_LAST,
+ QCA_ATTR_NUD_STATS_SET_MAX =
+ QCA_ATTR_NUD_STATS_SET_LAST - 1,
+};
+
+/**
+ * qca_attr_nud_stats_get: attribute to vendor subcmd
+ * QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_GET. This carry the requisite
+ * NUD stats collected when queried.
+ */
+enum qca_attr_nud_stats_get {
+ QCA_ATTR_NUD_STATS_GET_INVALID = 0,
+ /* ARP Request Count from net dev */
+ QCA_ATTR_NUD_STATS_ARP_REQ_COUNT_FROM_NETDEV = 1,
+ /* ARP Request Count sent to lower MAC from upper MAC */
+ QCA_ATTR_NUD_STATS_ARP_REQ_COUNT_TO_LOWER_MAC = 2,
+ /* ARP Request Count received by lower MAC from upper MAC */
+ QCA_ATTR_NUD_STATS_ARP_REQ_RX_COUNT_BY_LOWER_MAC = 3,
+ /* ARP Request Count successfully transmitted by the device */
+ QCA_ATTR_NUD_STATS_ARP_REQ_COUNT_TX_SUCCESS = 4,
+ /* ARP Response Count received by lower MAC */
+ QCA_ATTR_NUD_STATS_ARP_RSP_RX_COUNT_BY_LOWER_MAC = 5,
+ /* ARP Response Count received by upper MAC */
+ QCA_ATTR_NUD_STATS_ARP_RSP_RX_COUNT_BY_UPPER_MAC = 6,
+ /* ARP Response Count delivered to netdev */
+ QCA_ATTR_NUD_STATS_ARP_RSP_COUNT_TO_NETDEV = 7,
+ /* ARP Response Count delivered to netdev */
+ QCA_ATTR_NUD_STATS_ARP_RSP_COUNT_OUT_OF_ORDER_DROP = 8,
+ /* Flag indicating if the Stations Link to AP is active.
+ * Active Link - If exists, Inactive link - If not included
+ */
+ QCA_ATTR_NUD_STATS_AP_LINK_ACTIVE= 9,
+ /* Flag indicating if there is any Duplicate Address Detected(DAD).
+ * Yes - If Detected, No - If not detected.
+ */
+ QCA_ATTR_NUD_STATS_IS_DAD = 10,
+
+ /* keep last */
+ QCA_ATTR_NUD_STATS_GET_LAST,
+ QCA_ATTR_NUD_STATS_GET_MAX =
+ QCA_ATTR_NUD_STATS_GET_LAST - 1,
+};
#endif /* QCA_VENDOR_H */
diff --git a/qcwcn/wifi_hal/wifilogger_diag.cpp b/qcwcn/wifi_hal/wifilogger_diag.cpp
index cb041ca..5e9227b 100644
--- a/qcwcn/wifi_hal/wifilogger_diag.cpp
+++ b/qcwcn/wifi_hal/wifilogger_diag.cpp
@@ -2015,13 +2015,19 @@
pkt_stats_header->size);
else
status = WIFI_SUCCESS;
- } else if (pkt_stats_header->log_type == PKTLOG_TYPE_PKT_DUMP) {
+ } else if (pkt_stats_header->log_type == PKTLOG_TYPE_PKT_DUMP ||
+ pkt_stats_header->log_type == PKTLOG_TYPE_PKT_DUMP_V2) {
pthread_mutex_lock(&info->pkt_fate_stats_lock);
- if (info->fate_monitoring_enabled)
- status = parse_pkt_fate_stats(info,
- (u8 *)(pkt_stats_header + 1),
- pkt_stats_header->size);
- else
+ if (info->fate_monitoring_enabled) {
+ if (pkt_stats_header->flags & PKT_INFO_FLG_PKT_DUMP_V2)
+ status = parse_pkt_fate_stats(info,
+ (u8 *)pkt_stats_header + sizeof(wh_pktlog_hdr_v2_t),
+ pkt_stats_header->size);
+ else
+ status = parse_pkt_fate_stats(info,
+ (u8 *)pkt_stats_header + sizeof(wh_pktlog_hdr_t),
+ pkt_stats_header->size);
+ } else
status = WIFI_SUCCESS;
pthread_mutex_unlock(&info->pkt_fate_stats_lock);
} else {
@@ -2056,8 +2062,13 @@
pkt_stats_header->log_type);
return status;
}
- data += (sizeof(wh_pktlog_hdr_t) + pkt_stats_header->size);
- buflen -= (sizeof(wh_pktlog_hdr_t) + pkt_stats_header->size);
+ if (pkt_stats_header->flags & PKT_INFO_FLG_PKT_DUMP_V2){
+ data += (sizeof(wh_pktlog_hdr_v2_t) + pkt_stats_header->size);
+ buflen -= (sizeof(wh_pktlog_hdr_v2_t) + pkt_stats_header->size);
+ } else {
+ data += (sizeof(wh_pktlog_hdr_t) + pkt_stats_header->size);
+ buflen -= (sizeof(wh_pktlog_hdr_t) + pkt_stats_header->size);
+ }
} while (buflen > 0);
return status;