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;