wlan: Add BSS status caching

Add BSS status caching to get the BSS Information
when disconnect happens

Change-Id: I41b74700b161277bc454d8bb8978f4e1e92faea8
CRs-fixed: 2079789
diff --git a/CORE/HDD/inc/wlan_hdd_assoc.h b/CORE/HDD/inc/wlan_hdd_assoc.h
index a474443..0162034 100644
--- a/CORE/HDD/inc/wlan_hdd_assoc.h
+++ b/CORE/HDD/inc/wlan_hdd_assoc.h
@@ -31,6 +31,8 @@
 #if !defined( HDD_CONNECTION_H__ ) 
 #define HDD_CONNECTION_H__
 #include <wlan_hdd_mib.h>
+#include <net/cfg80211.h>
+#include <linux/ieee80211.h>
 #define HDD_MAX_NUM_IBSS_STA ( 32 )
 #ifdef FEATURE_WLAN_TDLS
 #define HDD_MAX_NUM_TDLS_STA ( 8 )
@@ -47,6 +49,57 @@
 /* Timeout in ms for peer info request commpletion */
 #define IBSS_PEER_INFO_REQ_TIMOEUT 1000
 #endif
+
+/**
+ * struct hdd_conn_flag - connection flags
+ * @ht_present: ht element present or not
+ * @vht_present: vht element present or not
+ * @hs20_present: hs20 element present or not
+ */
+struct hdd_conn_flag {
+    uint8_t ht_present:1;
+    uint8_t vht_present:1;
+    uint8_t hs20_present:1;
+    uint8_t ht_op_present:1;
+    uint8_t vht_op_present:1;
+    uint8_t reserved:3;
+};
+
+/*defines for tx_BF_cap_info */
+#define TX_BF_CAP_INFO_TX_BF			0x00000001
+#define TX_BF_CAP_INFO_RX_STAG_RED_SOUNDING	0x00000002
+#define TX_BF_CAP_INFO_TX_STAG_RED_SOUNDING	0x00000004
+#define TX_BF_CAP_INFO_RX_ZFL			0x00000008
+#define TX_BF_CAP_INFO_TX_ZFL			0x00000010
+#define TX_BF_CAP_INFO_IMP_TX_BF		0x00000020
+#define TX_BF_CAP_INFO_CALIBRATION		0x000000c0
+#define TX_BF_CAP_INFO_CALIBRATION_SHIFT		 6
+#define TX_BF_CAP_INFO_EXP_CSIT_BF		0x00000100
+#define TX_BF_CAP_INFO_EXP_UNCOMP_STEER_MAT	0x00000200
+#define TX_BF_CAP_INFO_EXP_BF_CSI_FB		0x00001c00
+#define TX_BF_CAP_INFO_EXP_BF_CSI_FB_SHIFT		10
+#define TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT	0x0000e000
+#define TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT_SHIFT	13
+#define TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB	0x00070000
+#define TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB_SHIFT	16
+#define TX_BF_CAP_INFO_CSI_NUM_BF_ANT		0x00180000
+#define TX_BF_CAP_INFO_CSI_NUM_BF_ANT_SHIFT		18
+#define TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT	0x00600000
+#define TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT_SHIFT	20
+#define TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT	0x01800000
+#define TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT_SHIFT	22
+#define TX_BF_CAP_INFO_RSVD			0xfe000000
+
+/* defines for antenna selection info */
+#define ANTENNA_SEL_INFO			0x01
+#define ANTENNA_SEL_INFO_EXP_CSI_FB_TX		0x02
+#define ANTENNA_SEL_INFO_ANT_ID_FB_TX		0x04
+#define ANTENNA_SEL_INFO_EXP_CSI_FB		0x08
+#define ANTENNA_SEL_INFO_ANT_ID_FB		0x10
+#define ANTENNA_SEL_INFO_RX_AS			0x20
+#define ANTENNA_SEL_INFO_TX_SOUNDING_PPDU	0x40
+#define ANTENNA_SEL_INFO_RSVD			0x80
+
 typedef enum 
 {
    /** Not associated in Infra or participating in an IBSS / Ad-hoc network.*/
@@ -112,7 +165,42 @@
    tANI_U32 dot11Mode;
 
    uint32_t  rate_flags;
-   
+
+   /** channel frequency */
+   uint32_t freq;
+
+   /** txrate structure holds nss & datarate info */
+   struct rate_info txrate;
+
+   /** noise information */
+   int8_t noise;
+
+   /** ht capabilities info */
+   struct ieee80211_ht_cap ht_caps;
+
+   /** vht capabilities info */
+   struct ieee80211_vht_cap vht_caps;
+
+   /** passpoint/hs20 info */
+   tDot11fIEhs20vendor_ie hs20vendor_ie;
+
+   /** conn info params is present or not */
+   struct hdd_conn_flag conn_flag;
+
+   /** ht operation info */
+   struct ieee80211_ht_operation ht_operation;
+
+   /** ht operation info */
+   struct ieee80211_vht_operation vht_operation;
+
+   /** roaming counter */
+   uint32_t roam_count;
+
+   /** rssi info */
+   int8_t signal;
+
+   /** assoc fail reason */
+   int32_t assoc_status_code;
 }connection_info_t;
 /*Forward declaration of Adapter*/
 typedef struct hdd_adapter_s hdd_adapter_t;
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index affc4fe..6a962d4 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -266,6 +266,487 @@
 
 }
 
+/**
+ * hdd_copy_vht_caps()- copy vht caps info from roam info to
+ *  hdd station context.
+ * @hdd_sta_ctx: pointer to hdd station context
+ * @roam_info: pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_copy_ht_caps(hdd_station_ctx_t *hdd_sta_ctx,
+                             tCsrRoamInfo *roam_info)
+{
+    tDot11fIEHTCaps *roam_ht_cap = &roam_info->ht_caps;
+    struct ieee80211_ht_cap *hdd_ht_cap = &hdd_sta_ctx->conn_info.ht_caps;
+    uint32_t i, temp_ht_cap;
+
+    vos_mem_zero(hdd_ht_cap, sizeof(struct ieee80211_ht_cap));
+
+    if (roam_ht_cap->advCodingCap)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_LDPC_CODING;
+    if (roam_ht_cap->supportedChannelWidthSet)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
+    temp_ht_cap = roam_ht_cap->mimoPowerSave &
+        (IEEE80211_HT_CAP_SM_PS >> IEEE80211_HT_CAP_SM_PS_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->cap_info |=
+            temp_ht_cap << IEEE80211_HT_CAP_SM_PS_SHIFT;
+    if (roam_ht_cap->greenField)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_GRN_FLD;
+    if (roam_ht_cap->shortGI20MHz)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_SGI_20;
+    if (roam_ht_cap->shortGI40MHz)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_SGI_40;
+    if (roam_ht_cap->txSTBC)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_TX_STBC;
+    temp_ht_cap = roam_ht_cap->rxSTBC & (IEEE80211_HT_CAP_RX_STBC >>
+        IEEE80211_HT_CAP_RX_STBC_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->cap_info |=
+            temp_ht_cap << IEEE80211_HT_CAP_RX_STBC_SHIFT;
+    if (roam_ht_cap->delayedBA)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_DELAY_BA;
+    if (roam_ht_cap->maximalAMSDUsize)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_MAX_AMSDU;
+    if (roam_ht_cap->dsssCckMode40MHz)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_DSSSCCK40;
+    if (roam_ht_cap->psmp)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_RESERVED;
+    if (roam_ht_cap->stbcControlFrame)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_40MHZ_INTOLERANT;
+    if (roam_ht_cap->lsigTXOPProtection)
+        hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
+
+
+    /* 802.11n HT capability AMPDU settings (for ampdu_params_info) */
+    if (roam_ht_cap->maxRxAMPDUFactor)
+        hdd_ht_cap->ampdu_params_info |=
+            IEEE80211_HT_AMPDU_PARM_FACTOR;
+    temp_ht_cap = roam_ht_cap->mpduDensity &
+        (IEEE80211_HT_AMPDU_PARM_DENSITY >>
+         IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->ampdu_params_info |=
+        temp_ht_cap << IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT;
+
+    /* 802.11n HT extended capabilities masks */
+    if (roam_ht_cap->pco)
+        hdd_ht_cap->extended_ht_cap_info |=
+            IEEE80211_HT_EXT_CAP_PCO;
+    temp_ht_cap = roam_ht_cap->transitionTime &
+        (IEEE80211_HT_EXT_CAP_PCO_TIME >>
+        IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->extended_ht_cap_info |=
+            temp_ht_cap << IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT;
+    temp_ht_cap = roam_ht_cap->mcsFeedback &
+        (IEEE80211_HT_EXT_CAP_MCS_FB >> IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->extended_ht_cap_info |=
+            temp_ht_cap << IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT;
+
+    /* tx_bf_cap_info capabilities */
+    if (roam_ht_cap->txBF)
+        hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_TX_BF;
+    if (roam_ht_cap->rxStaggeredSounding)
+        hdd_ht_cap->tx_BF_cap_info |=
+            TX_BF_CAP_INFO_RX_STAG_RED_SOUNDING;
+    if (roam_ht_cap->txStaggeredSounding)
+        hdd_ht_cap->tx_BF_cap_info |=
+            TX_BF_CAP_INFO_TX_STAG_RED_SOUNDING;
+    if (roam_ht_cap->rxZLF)
+        hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_RX_ZFL;
+    if (roam_ht_cap->txZLF)
+        hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_TX_ZFL;
+    if (roam_ht_cap->implicitTxBF)
+        hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_IMP_TX_BF;
+    temp_ht_cap = roam_ht_cap->calibration &
+        (TX_BF_CAP_INFO_CALIBRATION >> TX_BF_CAP_INFO_CALIBRATION_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->tx_BF_cap_info |=
+            temp_ht_cap << TX_BF_CAP_INFO_CALIBRATION_SHIFT;
+    if (roam_ht_cap->explicitCSITxBF)
+        hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_EXP_CSIT_BF;
+    if (roam_ht_cap->explicitUncompressedSteeringMatrix)
+        hdd_ht_cap->tx_BF_cap_info |=
+            TX_BF_CAP_INFO_EXP_UNCOMP_STEER_MAT;
+    temp_ht_cap = roam_ht_cap->explicitBFCSIFeedback &
+        (TX_BF_CAP_INFO_EXP_BF_CSI_FB >>
+         TX_BF_CAP_INFO_EXP_BF_CSI_FB_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->tx_BF_cap_info |=
+            temp_ht_cap << TX_BF_CAP_INFO_EXP_BF_CSI_FB_SHIFT;
+    temp_ht_cap =
+        roam_ht_cap->explicitUncompressedSteeringMatrixFeedback &
+        (TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT >>
+         TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->tx_BF_cap_info |=
+            temp_ht_cap <<
+            TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT_SHIFT;
+    temp_ht_cap =
+        roam_ht_cap->explicitCompressedSteeringMatrixFeedback &
+        (TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB >>
+         TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->tx_BF_cap_info |=
+            temp_ht_cap <<
+                TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB_SHIFT;
+    temp_ht_cap = roam_ht_cap->csiNumBFAntennae &
+        (TX_BF_CAP_INFO_CSI_NUM_BF_ANT >>
+         TX_BF_CAP_INFO_CSI_NUM_BF_ANT_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->tx_BF_cap_info |=
+            temp_ht_cap << TX_BF_CAP_INFO_CSI_NUM_BF_ANT_SHIFT;
+    temp_ht_cap = roam_ht_cap->uncompressedSteeringMatrixBFAntennae &
+        (TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT >>
+         TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->tx_BF_cap_info |=
+            temp_ht_cap <<
+               TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT_SHIFT;
+    temp_ht_cap = roam_ht_cap->compressedSteeringMatrixBFAntennae &
+        (TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT >>
+         TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT_SHIFT);
+    if (temp_ht_cap)
+        hdd_ht_cap->tx_BF_cap_info |=
+            temp_ht_cap <<
+                TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT_SHIFT;
+
+    /* antenna selection */
+    if (roam_ht_cap->antennaSelection)
+        hdd_ht_cap->antenna_selection_info |= ANTENNA_SEL_INFO;
+    if (roam_ht_cap->explicitCSIFeedbackTx)
+        hdd_ht_cap->antenna_selection_info |=
+            ANTENNA_SEL_INFO_EXP_CSI_FB_TX;
+    if (roam_ht_cap->antennaIndicesFeedbackTx)
+        hdd_ht_cap->antenna_selection_info |=
+            ANTENNA_SEL_INFO_ANT_ID_FB_TX;
+    if (roam_ht_cap->explicitCSIFeedback)
+        hdd_ht_cap->antenna_selection_info |=
+            ANTENNA_SEL_INFO_EXP_CSI_FB;
+    if (roam_ht_cap->antennaIndicesFeedback)
+        hdd_ht_cap->antenna_selection_info |=
+            ANTENNA_SEL_INFO_ANT_ID_FB;
+    if (roam_ht_cap->rxAS)
+        hdd_ht_cap->antenna_selection_info |=
+            ANTENNA_SEL_INFO_RX_AS;
+    if (roam_ht_cap->txSoundingPPDUs)
+        hdd_ht_cap->antenna_selection_info |=
+            ANTENNA_SEL_INFO_TX_SOUNDING_PPDU;
+
+    /* mcs data rate */
+    for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; ++i)
+        hdd_ht_cap->mcs.rx_mask[i] =
+            roam_ht_cap->supportedMCSSet[i];
+        hdd_ht_cap->mcs.rx_highest =
+            ((short) (roam_ht_cap->supportedMCSSet[11]) << 8) |
+            ((short) (roam_ht_cap->supportedMCSSet[10]));
+        hdd_ht_cap->mcs.tx_params =
+            roam_ht_cap->supportedMCSSet[12];
+}
+
+
+#define VHT_CAP_MAX_MPDU_LENGTH_MASK		0x00000003
+#define VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT		 2
+#define VHT_CAP_RXSTBC_MASK_SHIFT			 8
+#define VHT_CAP_BEAMFORMEE_STS_SHIFT			13
+#define VHT_CAP_BEAMFORMEE_STS_MASK \
+    (0x0000e000 >> VHT_CAP_BEAMFORMEE_STS_SHIFT)
+#define VHT_CAP_SOUNDING_DIMENSIONS_SHIFT		16
+#define VHT_CAP_SOUNDING_DIMENSIONS_MASK \
+    (0x00070000 >> VHT_CAP_SOUNDING_DIMENSIONS_SHIFT)
+#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK_SHIFT	23
+#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK \
+    (0x03800000 >> VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK_SHIFT)
+#define VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB_SHIFT	26
+
+/**
+ * hdd_copy_ht_caps()- copy ht caps info from roam info to
+ *  hdd station context.
+ * @hdd_sta_ctx: pointer to hdd station context
+ * @roam_info: pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_copy_vht_caps(hdd_station_ctx_t *hdd_sta_ctx,
+                              tCsrRoamInfo *roam_info)
+{
+    tDot11fIEVHTCaps *roam_vht_cap = &roam_info->vht_caps;
+    struct ieee80211_vht_cap *hdd_vht_cap =
+                    &hdd_sta_ctx->conn_info.vht_caps;
+    uint32_t temp_vht_cap;
+
+    vos_mem_zero(hdd_vht_cap, sizeof(struct ieee80211_vht_cap));
+
+    temp_vht_cap = roam_vht_cap->maxMPDULen & VHT_CAP_MAX_MPDU_LENGTH_MASK;
+    hdd_vht_cap->vht_cap_info |= temp_vht_cap;
+    temp_vht_cap = roam_vht_cap->supportedChannelWidthSet &
+        (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK >>
+            VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT);
+    if (temp_vht_cap)
+        if (roam_vht_cap->supportedChannelWidthSet &
+            (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ >>
+            VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT))
+            hdd_vht_cap->vht_cap_info |=
+                temp_vht_cap <<
+                IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
+        if (roam_vht_cap->supportedChannelWidthSet &
+            (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ >>
+            VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT))
+            hdd_vht_cap->vht_cap_info |=
+            temp_vht_cap <<
+            IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
+    if (roam_vht_cap->ldpcCodingCap)
+        hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_RXLDPC;
+    if (roam_vht_cap->shortGI80MHz)
+        hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_SHORT_GI_80;
+    if (roam_vht_cap->shortGI160and80plus80MHz)
+        hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_SHORT_GI_160;
+    if (roam_vht_cap->txSTBC)
+        hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_TXSTBC;
+    temp_vht_cap = roam_vht_cap->rxSTBC & (IEEE80211_VHT_CAP_RXSTBC_MASK >>
+        VHT_CAP_RXSTBC_MASK_SHIFT);
+    if (temp_vht_cap)
+        hdd_vht_cap->vht_cap_info |=
+            temp_vht_cap << VHT_CAP_RXSTBC_MASK_SHIFT;
+    if (roam_vht_cap->suBeamFormerCap)
+        hdd_vht_cap->vht_cap_info |=
+            IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE;
+    if (roam_vht_cap->suBeamformeeCap)
+        hdd_vht_cap->vht_cap_info |=
+            IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE;
+    temp_vht_cap = roam_vht_cap->csnofBeamformerAntSup &
+            (VHT_CAP_BEAMFORMEE_STS_MASK);
+    if (temp_vht_cap)
+        hdd_vht_cap->vht_cap_info |=
+            temp_vht_cap << VHT_CAP_BEAMFORMEE_STS_SHIFT;
+    temp_vht_cap = roam_vht_cap->numSoundingDim &
+            (VHT_CAP_SOUNDING_DIMENSIONS_MASK);
+    if (temp_vht_cap)
+        hdd_vht_cap->vht_cap_info |=
+            temp_vht_cap << VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
+    if (roam_vht_cap->muBeamformerCap)
+        hdd_vht_cap->vht_cap_info |=
+            IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE;
+    if (roam_vht_cap->muBeamformeeCap)
+        hdd_vht_cap->vht_cap_info |=
+            IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
+    if (roam_vht_cap->vhtTXOPPS)
+        hdd_vht_cap->vht_cap_info |=
+            IEEE80211_VHT_CAP_VHT_TXOP_PS;
+    if (roam_vht_cap->htcVHTCap)
+        hdd_vht_cap->vht_cap_info |=
+            IEEE80211_VHT_CAP_HTC_VHT;
+    temp_vht_cap = roam_vht_cap->maxAMPDULenExp &
+            (VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
+    if (temp_vht_cap)
+        hdd_vht_cap->vht_cap_info |=
+            temp_vht_cap <<
+            VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK_SHIFT;
+    temp_vht_cap = roam_vht_cap->vhtLinkAdaptCap &
+        (IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB >>
+            VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB_SHIFT);
+    if (temp_vht_cap)
+        hdd_vht_cap->vht_cap_info |= temp_vht_cap <<
+            VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB_SHIFT;
+    if (roam_vht_cap->rxAntPattern)
+        hdd_vht_cap->vht_cap_info |=
+            IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
+    if (roam_vht_cap->txAntPattern)
+        hdd_vht_cap->vht_cap_info |=
+            IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
+    hdd_vht_cap->supp_mcs.rx_mcs_map = roam_vht_cap->rxMCSMap;
+    hdd_vht_cap->supp_mcs.rx_highest =
+        ((uint16_t)roam_vht_cap->rxHighSupDataRate);
+    hdd_vht_cap->supp_mcs.tx_mcs_map = roam_vht_cap->txMCSMap;
+    hdd_vht_cap->supp_mcs.tx_highest =
+        ((uint16_t)roam_vht_cap->txSupDataRate);
+}
+
+/* ht param */
+#define HT_PARAM_CONTROLLED_ACCESS_ONLY 0x10
+#define HT_PARAM_SERVICE_INT_GRAN 0xe0
+#define HT_PARAM_SERVICE_INT_GRAN_SHIFT 5
+
+/* operatinon mode */
+#define HT_OP_MODE_TX_BURST_LIMIT 0x0008
+
+/* stbc_param */
+#define HT_STBC_PARAM_MCS 0x007f
+
+/**
+ * hdd_copy_ht_operation()- copy HT operation element from roam info to
+ *  hdd station context.
+ * @hdd_sta_ctx: pointer to hdd station context
+ * @roam_info: pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_copy_ht_operation(hdd_station_ctx_t *hdd_sta_ctx,
+                                  tCsrRoamInfo *roam_info)
+{
+    tDot11fIEHTInfo *roam_ht_ops = &roam_info->ht_operation;
+    struct ieee80211_ht_operation *hdd_ht_ops =
+                    &hdd_sta_ctx->conn_info.ht_operation;
+    uint32_t i, temp_ht_ops;
+
+    vos_mem_zero(hdd_ht_ops, sizeof(struct ieee80211_ht_operation));
+
+    hdd_ht_ops->primary_chan = roam_ht_ops->primaryChannel;
+
+    /* HT_PARAMS */
+    temp_ht_ops = roam_ht_ops->secondaryChannelOffset &
+        IEEE80211_HT_PARAM_CHA_SEC_OFFSET;
+    if (temp_ht_ops)
+        hdd_ht_ops->ht_param |= temp_ht_ops;
+    else
+        hdd_ht_ops->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
+    if (roam_ht_ops->recommendedTxWidthSet)
+        hdd_ht_ops->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
+    if (roam_ht_ops->rifsMode)
+        hdd_ht_ops->ht_param |= IEEE80211_HT_PARAM_RIFS_MODE;
+    if (roam_ht_ops->controlledAccessOnly)
+        hdd_ht_ops->ht_param |= HT_PARAM_CONTROLLED_ACCESS_ONLY;
+    temp_ht_ops = roam_ht_ops->serviceIntervalGranularity &
+        (HT_PARAM_SERVICE_INT_GRAN >> HT_PARAM_SERVICE_INT_GRAN_SHIFT);
+    if (temp_ht_ops)
+        hdd_ht_ops->ht_param |= temp_ht_ops <<
+            HT_PARAM_SERVICE_INT_GRAN_SHIFT;
+
+    /* operation mode */
+    temp_ht_ops = roam_ht_ops->opMode &
+            IEEE80211_HT_OP_MODE_PROTECTION;
+    switch (temp_ht_ops) {
+    case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
+        hdd_ht_ops->operation_mode |=
+            IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER;
+        break;
+    case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
+        hdd_ht_ops->operation_mode |=
+            IEEE80211_HT_OP_MODE_PROTECTION_20MHZ;
+        break;
+    case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
+        hdd_ht_ops->operation_mode |=
+            IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED;
+        break;
+    case IEEE80211_HT_OP_MODE_PROTECTION_NONE:
+    default:
+        hdd_ht_ops->operation_mode |=
+            IEEE80211_HT_OP_MODE_PROTECTION_NONE;
+    }
+    if (roam_ht_ops->nonGFDevicesPresent)
+        hdd_ht_ops->operation_mode |=
+            IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT;
+    if (roam_ht_ops->transmitBurstLimit)
+        hdd_ht_ops->operation_mode |=
+            HT_OP_MODE_TX_BURST_LIMIT;
+    if (roam_ht_ops->obssNonHTStaPresent)
+        hdd_ht_ops->operation_mode |=
+            IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT;
+
+    /* stbc_param */
+    temp_ht_ops = roam_ht_ops->basicSTBCMCS &
+            HT_STBC_PARAM_MCS;
+    if (temp_ht_ops)
+        hdd_ht_ops->stbc_param |= temp_ht_ops;
+    if (roam_ht_ops->dualCTSProtection)
+        hdd_ht_ops->stbc_param |=
+            IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT;
+    if (roam_ht_ops->secondaryBeacon)
+        hdd_ht_ops->stbc_param |=
+            IEEE80211_HT_STBC_PARAM_STBC_BEACON;
+    if (roam_ht_ops->lsigTXOPProtectionFullSupport)
+        hdd_ht_ops->stbc_param |=
+            IEEE80211_HT_STBC_PARAM_LSIG_TXOP_FULLPROT;
+    if (roam_ht_ops->pcoActive)
+        hdd_ht_ops->stbc_param |=
+            IEEE80211_HT_STBC_PARAM_PCO_ACTIVE;
+    if (roam_ht_ops->pcoPhase)
+        hdd_ht_ops->stbc_param |=
+            IEEE80211_HT_STBC_PARAM_PCO_PHASE;
+
+    /* basic MCs set */
+    for (i = 0; i < 16; ++i)
+        hdd_ht_ops->basic_set[i] =
+            roam_ht_ops->basicMCSSet[i];
+}
+
+/**
+ * hdd_copy_vht_operation()- copy VHT operations element from roam info to
+ *  hdd station context.
+ * @hdd_sta_ctx: pointer to hdd station context
+ * @roam_info: pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_copy_vht_operation(hdd_station_ctx_t *hdd_sta_ctx,
+                                   tCsrRoamInfo *roam_info)
+{
+    tDot11fIEVHTOperation *roam_vht_ops = &roam_info->vht_operation;
+    struct ieee80211_vht_operation *hdd_vht_ops =
+                &hdd_sta_ctx->conn_info.vht_operation;
+
+    vos_mem_zero(hdd_vht_ops, sizeof(struct ieee80211_vht_operation));
+
+    hdd_vht_ops->chan_width = roam_vht_ops->chanWidth;
+    hdd_vht_ops->center_freq_seg1_idx = roam_vht_ops->chanCenterFreqSeg1;
+    hdd_vht_ops->center_freq_seg2_idx = roam_vht_ops->chanCenterFreqSeg2;
+    hdd_vht_ops->basic_mcs_set = roam_vht_ops->basicMCSSet;
+}
+
+
+/**
+ * hdd_save_bss_info() - save connection info in hdd sta ctx
+ * @adapter: Pointer to adapter
+ * @roam_info: pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_save_bss_info(hdd_adapter_t *adapter,
+                              tCsrRoamInfo *roam_info)
+{
+    hdd_station_ctx_t *hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
+
+    hdd_sta_ctx->conn_info.freq = vos_chan_to_freq(
+        hdd_sta_ctx->conn_info.operationChannel);
+    if (roam_info->vht_caps.present) {
+        hdd_sta_ctx->conn_info.conn_flag.vht_present = true;
+        hdd_copy_vht_caps(hdd_sta_ctx, roam_info);
+    } else {
+        hdd_sta_ctx->conn_info.conn_flag.vht_present = false;
+    }
+    if (roam_info->ht_caps.present) {
+        hdd_sta_ctx->conn_info.conn_flag.ht_present = true;
+        hdd_copy_ht_caps(hdd_sta_ctx, roam_info);
+    } else {
+        hdd_sta_ctx->conn_info.conn_flag.ht_present = false;
+    }
+    if (roam_info->reassoc)
+        hdd_sta_ctx->conn_info.roam_count++;
+    if (roam_info->hs20vendor_ie.present) {
+        hdd_sta_ctx->conn_info.conn_flag.hs20_present = true;
+        vos_mem_copy(&hdd_sta_ctx->conn_info.hs20vendor_ie,
+            &roam_info->hs20vendor_ie,
+            sizeof(roam_info->hs20vendor_ie));
+    } else {
+        hdd_sta_ctx->conn_info.conn_flag.hs20_present = false;
+    }
+    if (roam_info->ht_operation.present) {
+        hdd_sta_ctx->conn_info.conn_flag.ht_op_present = true;
+        hdd_copy_ht_operation(hdd_sta_ctx, roam_info);
+    } else {
+        hdd_sta_ctx->conn_info.conn_flag.ht_op_present = false;
+    }
+    if (roam_info->vht_operation.present) {
+        hdd_sta_ctx->conn_info.conn_flag.vht_op_present = true;
+        hdd_copy_vht_operation(hdd_sta_ctx, roam_info);
+    } else {
+        hdd_sta_ctx->conn_info.conn_flag.vht_op_present = false;
+    }
+}
+
 void hdd_connSaveConnectInfo( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo, eCsrRoamBssType eBssType )
 {
    hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
@@ -329,6 +810,7 @@
 
           pHddStaCtx->conn_info.rate_flags = pRoamInfo->maxRateFlags;
       }
+      hdd_save_bss_info(pAdapter, pRoamInfo);
    }
 
    // save the connected BssType
@@ -982,6 +1464,53 @@
     return( vosStatus );
 }
 
+/**
+ * hdd_print_bss_info() - print bss info
+ * @hdd_sta_ctx: pointer to hdd station context
+ *
+ * Return: None
+ */
+void hdd_print_bss_info(hdd_station_ctx_t *hdd_sta_ctx)
+{
+    uint32_t *cap_info;
+
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"WIFI DATA LOGGER");
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"channel: %d",
+              hdd_sta_ctx->conn_info.freq);
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"dot11mode: %d",
+              hdd_sta_ctx->conn_info.dot11Mode);
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"AKM: %d",
+              hdd_sta_ctx->conn_info.authType);
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"ssid: %.*s",
+              hdd_sta_ctx->conn_info.SSID.SSID.length,
+              hdd_sta_ctx->conn_info.SSID.SSID.ssId);
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"roam count: %d",
+              hdd_sta_ctx->conn_info.roam_count);
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"ant_info: %d",
+              hdd_sta_ctx->conn_info.txrate.nss);
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"datarate legacy %d",
+              hdd_sta_ctx->conn_info.txrate.legacy);
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"datarate mcs: %d",
+              hdd_sta_ctx->conn_info.txrate.mcs);
+    if (hdd_sta_ctx->conn_info.conn_flag.ht_present) {
+        cap_info = (uint32_t *)&hdd_sta_ctx->conn_info.ht_caps;
+        VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"ht caps: %x",
+                  *cap_info);
+    }
+    if (hdd_sta_ctx->conn_info.conn_flag.vht_present) {
+        cap_info = (uint32_t *)&hdd_sta_ctx->conn_info.vht_caps;
+        VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"vht caps: %x",
+                  *cap_info);
+    }
+    if (hdd_sta_ctx->conn_info.conn_flag.hs20_present)
+        VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"hs20 info: %x",
+                  hdd_sta_ctx->conn_info.hs20vendor_ie.release_num);
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"signal: %d",
+              hdd_sta_ctx->conn_info.signal);
+    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"noise: %d",
+              hdd_sta_ctx->conn_info.noise);
+}
+
 
 static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
                                             tANI_U32 roamId, eRoamCmdStatus roamStatus,
@@ -1285,6 +1814,7 @@
 
     //Unblock anyone waiting for disconnect to complete
     complete(&pAdapter->disconnect_comp_var);
+    hdd_print_bss_info(pHddStaCtx);
     return( status );
 }
 
@@ -2054,20 +2584,23 @@
                 wlan_hdd_tdls_reenable(pHddCtx);
             }
 
-            if (pRoamInfo)
+            if (pRoamInfo) {
                 hddLog(VOS_TRACE_LEVEL_ERROR,
                      "%s: send connect failure to nl80211:"
                      " for bssid " MAC_ADDRESS_STR
                      " result:%d and Status:%d reasonCode %d" ,
                      __func__, MAC_ADDR_ARRAY(pRoamInfo->bssid),
                      roamResult, roamStatus, pRoamInfo->reasonCode);
-             else
+                pHddStaCtx->conn_info.assoc_status_code =
+                    pRoamInfo->statusCode;
+             } else {
                  hddLog(VOS_TRACE_LEVEL_ERROR,
                      "%s: connect failed:"
                      " for bssid " MAC_ADDRESS_STR
                      " result:%d and Status:%d" ,
                      __func__, MAC_ADDR_ARRAY(pWextState->req_bssId),
                      roamResult, roamStatus);
+             }
 
             /* inform association failure event to nl80211 */
             if ( eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL == roamResult )
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index b1402b9..64c1826 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -13912,6 +13912,7 @@
     int status = 0;
     hdd_wext_state_t *pWextState;
     hdd_context_t *pHddCtx;
+    hdd_station_ctx_t *hdd_sta_ctx;
     v_U32_t roamId;
     tCsrRoamProfile *pRoamProfile;
     eCsrAuthType RSNAuthType;
@@ -13920,6 +13921,7 @@
 
     pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
     pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+    hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
     status = wlan_hdd_validate_context(pHddCtx);
     if (status)
@@ -16160,6 +16162,7 @@
     tANI_U8  MCSRates[SIZE_OF_BASIC_MCS_SET];
     tANI_U32 MCSLeng = SIZE_OF_BASIC_MCS_SET;
     tANI_U16 maxRate = 0;
+    int8_t snr = 0;
     tANI_U16 myRate;
     tANI_U16 currentRate = 0;
     tANI_U8  maxSpeedMCS = 0;
@@ -16204,6 +16207,9 @@
     rate_flags = pAdapter->hdd_stats.ClassA_stat.tx_rate_flags;
 
     wlan_hdd_get_rssi(pAdapter, &sinfo->signal);
+    wlan_hdd_get_snr(pAdapter, &snr);
+    pHddStaCtx->conn_info.signal = sinfo->signal;
+    pHddStaCtx->conn_info.noise = pHddStaCtx->conn_info.signal - snr;
     sinfo->filled |= STATION_INFO_SIGNAL;
 
     /*overwrite rate_flags if MAX link-speed need to be reported*/
@@ -16592,6 +16598,8 @@
     sinfo->rx_packets = pAdapter->hdd_stats.summary_stat.rx_frm_cnt;
     sinfo->filled |= STATION_INFO_RX_PACKETS;
 
+    vos_mem_copy(&pHddStaCtx->conn_info.txrate,
+                 &sinfo->txrate, sizeof(sinfo->txrate));
     if (rate_flags & eHAL_TX_RATE_LEGACY)
         hddLog(LOG1, FL("Reporting RSSI:%d legacy rate %d pkt cnt tx %d rx %d"),
                sinfo->signal, sinfo->txrate.legacy, sinfo->tx_packets,
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index 06ddd18..5257cfb 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -44,12 +44,6 @@
 #ifndef _ANIGLOBAL_H
 #define _ANIGLOBAL_H
 
-// Take care to avoid redefinition of this type, if it is
-// already defined in "halWmmApi.h"
-#if !defined(_HALMAC_WMM_API_H)
-typedef struct sAniSirGlobal *tpAniSirGlobal;
-#endif
-
 #include "halTypes.h"
 #include "sirCommon.h"
 #include "aniSystemDefs.h"
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index ae085ad..7ae12ff 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -41,10 +41,18 @@
 #ifndef __SIR_API_H
 #define __SIR_API_H
 
+/* Take care to avoid redefinition of this type, if it is */
+/* already defined in "halWmmApi.h" */
+#if !defined(_HALMAC_WMM_API_H)
+typedef struct sAniSirGlobal *tpAniSirGlobal;
+#endif
+
+
 #include "sirTypes.h"
 #include "sirMacProtDef.h"
 #include "aniSystemDefs.h"
 #include "sirParams.h"
+#include <dot11f.h>
 
 #if defined(FEATURE_WLAN_ESE) && !defined(FEATURE_WLAN_ESE_UPLOAD)
 #include "eseGlobal.h"
@@ -1156,6 +1164,12 @@
     /*to report MAX link-speed populate rate-flags from ASSOC RSP frame*/
     tANI_U32           maxRateFlags;
 
+    tDot11fIEHTCaps ht_caps;
+    tDot11fIEVHTCaps vht_caps;
+    tDot11fIEHTInfo ht_operation;
+    tDot11fIEVHTOperation vht_operation;
+    tDot11fIEhs20vendor_ie hs20vendor_ie;
+
     tANI_U8         frames[ 1 ];
 } tSirSmeJoinRsp, *tpSirSmeJoinRsp;
 
diff --git a/CORE/MAC/src/include/dphGlobal.h b/CORE/MAC/src/include/dphGlobal.h
index 7f057c0..e6e7d98 100644
--- a/CORE/MAC/src/include/dphGlobal.h
+++ b/CORE/MAC/src/include/dphGlobal.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2013, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2013, 2016-2017 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -320,6 +320,27 @@
 } tCfgTrafficClass;
 
 
+/**
+ * struct parsed_ies: Parsed IE's of BSS capability
+ * @ht_caps: HT caps IE
+ * @vht_caps: VHT caps IE
+ * @ht_operation: HT operation IE
+ * @vht_operation: VHT operation IE
+ * @hs20vendor_ie: HS2.0 vendor IE
+ *
+ * This structure holds the parsed IE of connected BSS
+ * and this is not the intersection of BSS and STA
+ * capability. For example, if BSS supports 80 MHz
+ * and STA connects to BSS in 20 MHz, this structure
+ * holds 80 MHz as peer capability.
+ */
+struct parsed_ies {
+    tDot11fIEHTCaps ht_caps;
+    tDot11fIEVHTCaps vht_caps;
+    tDot11fIEHTInfo ht_operation;
+    tDot11fIEVHTOperation vht_operation;
+    tDot11fIEhs20vendor_ie hs20vendor_ie;
+};
 
 /// STA state node
 
@@ -639,6 +660,7 @@
      */
     tANI_U8 isDisassocDeauthInProgress;
     bool sta_deletion_in_progress;
+    struct parsed_ies parsed_ies;
 #ifdef SAP_AUTH_OFFLOAD
     tANI_U8 dpuIndex;
     tANI_U8 bcastDpuIndex;
diff --git a/CORE/MAC/src/pe/include/limSession.h b/CORE/MAC/src/pe/include/limSession.h
index 7f597da..78a83c0 100644
--- a/CORE/MAC/src/pe/include/limSession.h
+++ b/CORE/MAC/src/pe/include/limSession.h
@@ -364,6 +364,10 @@
     tANI_BOOLEAN addBssfailed;
     tDot11fIEExtCap ExtCap;
     uint32_t sta_auth_retries_for_code17;
+    tDot11fIEHTCaps ht_caps;
+    tDot11fIEVHTCaps vht_caps;
+    tDot11fIEHTInfo ht_operation;
+    tDot11fIEVHTOperation vht_operation;
 }tPESession, *tpPESession;
 
 #define LIM_MAX_ACTIVE_SESSIONS 4
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
index 9d7355e..0737ac6 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
@@ -918,6 +918,18 @@
       GET_IE_LEN_IN_BSS(psessionEntry->pLimJoinReq->bssDescription.length),
       pBeaconStruct);
 
+    if (pBeaconStruct->VHTCaps.present)
+        pStaDs->parsed_ies.vht_caps = pBeaconStruct->VHTCaps;
+    if (pBeaconStruct->HTCaps.present)
+        pStaDs->parsed_ies.ht_caps = pBeaconStruct->HTCaps;
+    if (pBeaconStruct->hs20vendor_ie.present)
+        pStaDs->parsed_ies.hs20vendor_ie =
+            pBeaconStruct->hs20vendor_ie;
+    if (pBeaconStruct->HTInfo.present)
+        pStaDs->parsed_ies.ht_operation = pBeaconStruct->HTInfo;
+    if (pBeaconStruct->VHTOperation.present)
+        pStaDs->parsed_ies.vht_operation = pBeaconStruct->VHTOperation;
+
     if(pMac->lim.gLimProtectionControl != WNI_CFG_FORCE_POLICY_PROTECTION_DISABLE)
         limDecideStaProtectionOnAssoc(pMac, pBeaconStruct, psessionEntry);
     
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
index 44bebf2..69d186e 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
@@ -160,6 +160,29 @@
     limSysProcessMmhMsgApi(pMac, &mmhMsg,  ePROT);
 } /*** end limSendSmeRsp() ***/
 
+/**
+ * lim_add_bss_info() - copy data from session entry to join rsp
+ * @session_entry: PE Session Info
+ * @sme_join_rsp: Join response buffer to be filled up
+ *
+ * Return: None
+ */
+void lim_add_bss_info(tpDphHashNode sta_ds,
+                      tpSirSmeJoinRsp sme_join_rsp)
+{
+    struct parsed_ies *parsed_ies = &sta_ds->parsed_ies;
+
+    if (parsed_ies->hs20vendor_ie.present)
+        sme_join_rsp->hs20vendor_ie = parsed_ies->hs20vendor_ie;
+    if (parsed_ies->vht_caps.present)
+        sme_join_rsp->vht_caps = parsed_ies->vht_caps;
+    if (parsed_ies->ht_caps.present)
+        sme_join_rsp->ht_caps = parsed_ies->ht_caps;
+    if (parsed_ies->ht_operation.present)
+        sme_join_rsp->ht_operation = parsed_ies->ht_operation;
+    if (parsed_ies->vht_operation.present)
+        sme_join_rsp->vht_operation = parsed_ies->vht_operation;
+}
 
 /**
  * limSendSmeJoinReassocRspAfterResume()
@@ -382,6 +405,7 @@
                 pSirSmeJoinRsp->bcastSig   = pStaDs->ucBcastSig;
                 pSirSmeJoinRsp->maxRateFlags =
                                 limGetMaxRateFlags(pStaDs, psessionEntry);
+                lim_add_bss_info(pStaDs, pSirSmeJoinRsp);
                 PELOGE(limLog(pMac, LOG1, FL("maxRateFlags: %x"),
                                               pSirSmeJoinRsp->maxRateFlags);)
             }
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 04eb9e8..3a882ad 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1335,6 +1335,12 @@
 #ifdef WLAN_FEATURE_AP_HT40_24G
     tpSirHT2040CoexInfoInd pSmeHT2040CoexInfoInd;
 #endif
+    tDot11fIEHTCaps ht_caps;
+    tDot11fIEVHTCaps vht_caps;
+    tDot11fIEhs20vendor_ie hs20vendor_ie;
+    tDot11fIEVHTOperation vht_operation;
+    tDot11fIEHTInfo ht_operation;
+    bool reassoc;
 }tCsrRoamInfo;
 
 typedef struct tagCsrFreqScanInfo
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 2e07bc0..6d2b87e 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -5645,10 +5645,12 @@
         case eCsrReassocSuccess:
             if(eCsrReassocSuccess == Result)
             {
+                roamInfo.reassoc = true;
                 ind_qos = SME_QOS_CSR_REASSOC_COMPLETE;
             }
             else
             {
+                roamInfo.reassoc = false;
                 ind_qos = SME_QOS_CSR_ASSOC_COMPLETE;
             }
             // Success Join Response from LIM.  Tell NDIS we are connected and save the
@@ -5854,6 +5856,12 @@
                     roamInfo.ucastSig = ( tANI_U8 )pJoinRsp->ucastSig;
                     roamInfo.bcastSig = ( tANI_U8 )pJoinRsp->bcastSig;
                     roamInfo.maxRateFlags = pJoinRsp->maxRateFlags;
+                    roamInfo.vht_caps = pJoinRsp->vht_caps;
+                    roamInfo.ht_caps = pJoinRsp->ht_caps;
+                    roamInfo.hs20vendor_ie = pJoinRsp->hs20vendor_ie;
+                    roamInfo.ht_operation = pJoinRsp->ht_operation;
+                    roamInfo.vht_operation = pJoinRsp->vht_operation;
+
                 }
                 else
                 {