wlan: Add PMF (802.11w) support for station mode
These changes add Protected Management Frames (802.11w) support for
the device in station mode.
Change-Id: I2cdc60c4a9ed3ab40303de11ca3b679a9fe1d455
CRs-Fixed: 452422, 452831, 455139, 450564, 452558
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index 6f1709e..81532ec 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -77,6 +77,12 @@
#define P2P_ACTION_FRAME "\x7f\x50\x6f\x9a\x09"
#define P2P_ACTION_FRAME_SIZE 5
+#define SA_QUERY_FRAME_REQ "\x08\x00"
+#define SA_QUERY_FRAME_REQ_SIZE 2
+
+#define SA_QUERY_FRAME_RSP "\x08\x01"
+#define SA_QUERY_FRAME_RSP_SIZE 2
+
#define HDD_P2P_WILDCARD_SSID "DIRECT-" //TODO Put it in proper place;
#define HDD_P2P_WILDCARD_SSID_LEN 7
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index aca2f0b..06f2f93 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -159,6 +159,10 @@
#define WLAN_HDD_P2P_SOCIAL_CHANNELS 3
#define WLAN_HDD_P2P_SINGLE_CHANNEL_SCAN 1
+#ifdef WLAN_FEATURE_11W
+#define WLAN_HDD_SA_QUERY_ACTION_FRAME 8
+#endif
+
#define WLAN_HDD_PUBLIC_ACTION_TDLS_DISC_RESP 14
#define WLAN_HDD_TDLS_ACTION_FRAME 12
#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
@@ -214,6 +218,14 @@
__u32 totalUnknownExceptions;
} hdd_chip_reset_stats_t;
+#ifdef WLAN_FEATURE_11W
+typedef struct hdd_pmf_stats_s
+{
+ uint8 numUnprotDeauthRx;
+ uint8 numUnprotDisassocRx;
+} hdd_pmf_stats_t;
+#endif
+
typedef struct hdd_stats_s
{
tCsrSummaryStatsInfo summary_stat;
@@ -224,6 +236,9 @@
tCsrPerStaStatsInfo perStaStats;
hdd_tx_rx_stats_t hddTxRxStats;
hdd_chip_reset_stats_t hddChipResetStats;
+#ifdef WLAN_FEATURE_11W
+ hdd_pmf_stats_t hddPmfStats;
+#endif
} hdd_stats_t;
typedef enum
diff --git a/CORE/HDD/inc/wlan_hdd_p2p.h b/CORE/HDD/inc/wlan_hdd_p2p.h
index ff4463a..8bc873d 100644
--- a/CORE/HDD/inc/wlan_hdd_p2p.h
+++ b/CORE/HDD/inc/wlan_hdd_p2p.h
@@ -64,6 +64,10 @@
#define P2P_WILDCARD_SSID_LEN 7
#define P2P_WILDCARD_SSID "DIRECT-"
+#ifdef WLAN_FEATURE_11W
+#define WLAN_HDD_SET_WEP_FRM_FC(__fc__) ( (__fc__) = ((__fc__) | 0x40))
+#endif //WLAN_FEATURE_11W
+
enum hdd_rx_flags {
HDD_RX_FLAG_DECRYPTED = 1 << 0,
HDD_RX_FLAG_MMIC_STRIPPED = 1 << 1,
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 668b4ae..8a7c095 100755
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -109,6 +109,9 @@
#ifdef FEATURE_WLAN_CCX
v_U8_t ccpRSNOui06[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x40, 0x96, 0x00 }; // CCKM
#endif /* FEATURE_WLAN_CCX */
+#ifdef WLAN_FEATURE_11W
+v_U8_t ccpRSNOui07[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x0F, 0xAC, 0x06 }; // RSN-PSK-SHA256
+#endif
#if defined(WLAN_FEATURE_VOWIFI_11R)
// Offset where the EID-Len-IE, start.
@@ -120,6 +123,13 @@
void hdd_ResetCountryCodeAfterDisAssoc(hdd_adapter_t *pAdapter);
+#ifdef WLAN_FEATURE_11W
+void hdd_indicateUnprotMgmtFrame(hdd_adapter_t *pAdapter,
+ tANI_U32 nFrameLength,
+ tANI_U8* pbFrames,
+ tANI_U8 frameType );
+#endif
+
v_VOID_t hdd_connSetConnectionState( hdd_station_ctx_t *pHddStaCtx,
eConnectionState connState )
{
@@ -1329,7 +1339,10 @@
"Cannot register STA with TL. Failed with vosStatus = %d [%08lX]",
vosStatus, vosStatus );
}
-
+#ifdef WLAN_FEATURE_11W
+ vos_mem_zero( &pAdapter->hdd_stats.hddPmfStats,
+ sizeof(pAdapter->hdd_stats.hddPmfStats) );
+#endif
// Start the Queue
netif_tx_wake_all_queues(dev);
}
@@ -2320,6 +2333,13 @@
wlan_hdd_tdls_mgmt_completion_callback(pAdapter, pRoamInfo->reasonCode);
break;
#endif
+#ifdef WLAN_FEATURE_11W
+ case eCSR_ROAM_UNPROT_MGMT_FRAME_IND:
+ hdd_indicateUnprotMgmtFrame(pAdapter, pRoamInfo->nFrameLength,
+ pRoamInfo->pbFrames,
+ pRoamInfo->frameType);
+ break;
+#endif
default:
break;
}
@@ -2355,6 +2375,12 @@
auth_type = eCSR_AUTH_TYPE_CCKM_RSN;
} else
#endif /* FEATURE_WLAN_CCX */
+#ifdef WLAN_FEATURE_11W
+ if (memcmp(auth_suite , ccpRSNOui07, 4) == 0)
+ {
+ auth_type = eCSR_AUTH_TYPE_RSN_PSK_SHA256;
+ } else
+#endif
{
auth_type = eCSR_AUTH_TYPE_UNKNOWN;
}
@@ -2470,6 +2496,10 @@
eCsrEncryptionType *pEncryptType,
eCsrEncryptionType *mcEncryptType,
eCsrAuthType *pAuthType,
+#ifdef WLAN_FEATURE_11W
+ u_int8_t *pMfpRequired,
+ u_int8_t *pMfpCapable,
+#endif
u_int16_t gen_ie_len,
u_int8_t *gen_ie)
{
@@ -2522,6 +2552,10 @@
*pEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.pwise_cipher_suites[0]);
//dot11RSNIE.gp_cipher_suite_count
*mcEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.gp_cipher_suite);
+#ifdef WLAN_FEATURE_11W
+ *pMfpRequired = (dot11RSNIE.RSN_Cap[0] >> 6) & 0x1 ;
+ *pMfpCapable = (dot11RSNIE.RSN_Cap[0] >> 7) & 0x1 ;
+#endif
// Set the PMKSA ID Cache for this interface
for (i=0; i<dot11RSNIE.pmkid_count; i++)
{
@@ -2590,6 +2624,10 @@
v_U32_t status = 0;
eCsrEncryptionType RSNEncryptType;
eCsrEncryptionType mcRSNEncryptType;
+#ifdef WLAN_FEATURE_11W
+ u_int8_t RSNMfpRequired;
+ u_int8_t RSNMfpCapable;
+#endif
struct ether_addr bSsid; // MAC address of assoc peer
// MAC address of assoc peer
// But, this routine is only called when we are NOT associated.
@@ -2611,6 +2649,10 @@
&RSNEncryptType,
&mcRSNEncryptType,
RSNAuthType,
+#ifdef WLAN_FEATURE_11W
+ &RSNMfpRequired,
+ &RSNMfpCapable,
+#endif
pWextState->WPARSNIE[1]+2,
pWextState->WPARSNIE);
if (status == 0)
@@ -2621,6 +2663,11 @@
pWextState->roamProfile.EncryptionType.encryptionType[0] = RSNEncryptType; // Use the cipher type in the RSN IE
pWextState->roamProfile.mcEncryptionType.encryptionType[0] = mcRSNEncryptType;
+
+#ifdef WLAN_FEATURE_11W
+ pWextState->roamProfile.MFPRequired = RSNMfpRequired;
+ pWextState->roamProfile.MFPCapable = RSNMfpCapable;
+#endif
hddLog( LOG1, "%s: CSR AuthType = %d, EncryptionType = %d mcEncryptionType = %d", __func__, *RSNAuthType, RSNEncryptType, mcRSNEncryptType);
}
return 0;
@@ -2698,6 +2745,12 @@
} else
#endif
+#ifdef WLAN_FEATURE_11W
+ if (RSNAuthType == eCSR_AUTH_TYPE_RSN_PSK_SHA256) {
+ pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_RSN_PSK_SHA256;
+ } else
+#endif
+
if( (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)
== IW_AUTH_KEY_MGMT_802_1X) {
pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_RSN;
@@ -3222,6 +3275,9 @@
case eCSR_AUTH_TYPE_FT_RSN_PSK:
#endif
case eCSR_AUTH_TYPE_RSN_PSK:
+#ifdef WLAN_FEATURE_11W
+ case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
+#endif
hddLog(LOG1,"%s called with unknown auth type", __func__);
wrqu->param.value = IW_AUTH_ALG_OPEN_SYSTEM;
return -EIO;
@@ -3415,3 +3471,77 @@
}
}
+#ifdef WLAN_FEATURE_11W
+/**---------------------------------------------------------------------------
+
+ \brief hdd_indicateUnprotMgmtFrame -
+ This function forwards the unprotected management frame to the supplicant
+ \param - pAdapter - Pointer to HDD adapter
+ - nFrameLength - Length of the unprotected frame being passed
+ - pbFrames - Pointer to the frame buffer
+ - frameType - 802.11 frame type
+ \return - nothing
+
+ --------------------------------------------------------------------------*/
+void hdd_indicateUnprotMgmtFrame( hdd_adapter_t *pAdapter,
+ tANI_U32 nFrameLength,
+ tANI_U8* pbFrames,
+ tANI_U8 frameType )
+{
+ tANI_U8 type = 0;
+ tANI_U8 subType = 0;
+
+ hddLog(VOS_TRACE_LEVEL_INFO, "%s: Frame Type = %d Frame Length = %d",
+ __func__, frameType, nFrameLength);
+
+ /* Sanity Checks */
+ if (NULL == pAdapter)
+ {
+ hddLog( LOGE, FL("pAdapter is NULL"));
+ return;
+ }
+
+ if (NULL == pAdapter->dev)
+ {
+ hddLog( LOGE, FL("pAdapter->dev is NULL"));
+ return;
+ }
+
+ if (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)
+ {
+ hddLog( LOGE, FL("pAdapter has invalid magic"));
+ return;
+ }
+
+ if( !nFrameLength )
+ {
+ hddLog( LOGE, FL("Frame Length is Invalid ZERO"));
+ return;
+ }
+
+ if (NULL == pbFrames) {
+ hddLog( LOGE, FL("pbFrames is NULL"));
+ return;
+ }
+
+ type = WLAN_HDD_GET_TYPE_FRM_FC(pbFrames[0]);
+ subType = WLAN_HDD_GET_SUBTYPE_FRM_FC(pbFrames[0]);
+
+ /* Get pAdapter from Destination mac address of the frame */
+ if (type == SIR_MAC_MGMT_FRAME && subType == SIR_MAC_MGMT_DISASSOC)
+ {
+ cfg80211_send_unprot_disassoc(pAdapter->dev, pbFrames, nFrameLength);
+ pAdapter->hdd_stats.hddPmfStats.numUnprotDisassocRx++;
+ }
+ else if (type == SIR_MAC_MGMT_FRAME && subType == SIR_MAC_MGMT_DEAUTH)
+ {
+ cfg80211_send_unprot_deauth(pAdapter->dev, pbFrames, nFrameLength);
+ pAdapter->hdd_stats.hddPmfStats.numUnprotDeauthRx++;
+ }
+ else
+ {
+ hddLog( LOGE, FL("Frame type %d and subtype %d are not valid"), type, subType);
+ return;
+ }
+}
+#endif
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 5fa9cce..58fffeb 100755
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -164,6 +164,9 @@
#ifdef FEATURE_WLAN_WAPI
WLAN_CIPHER_SUITE_SMS4,
#endif
+#ifdef WLAN_FEATURE_11W
+ WLAN_CIPHER_SUITE_AES_CMAC,
+#endif
};
static inline int is_broadcast_ether_addr(const u8 *addr)
@@ -704,6 +707,13 @@
sme_RegisterMgmtFrame(hHal, pAdapter->sessionId, type,
(v_U8_t*)P2P_ACTION_FRAME,
P2P_ACTION_FRAME_SIZE );
+
+#ifdef WLAN_FEATURE_11W
+ /* SA Query Response Action Frame */
+ sme_RegisterMgmtFrame(hHal, pAdapter->sessionId, type,
+ (v_U8_t*)SA_QUERY_FRAME_RSP,
+ SA_QUERY_FRAME_RSP_SIZE );
+#endif /* WLAN_FEATURE_11W */
}
void wlan_hdd_cfg80211_pre_voss_stop(hdd_adapter_t* pAdapter)
@@ -743,6 +753,13 @@
sme_DeregisterMgmtFrame(hHal, pAdapter->sessionId, type,
(v_U8_t*)P2P_ACTION_FRAME,
P2P_ACTION_FRAME_SIZE );
+
+#ifdef WLAN_FEATURE_11W
+ /* SA Query Response Action Frame */
+ sme_DeregisterMgmtFrame(hHal, pAdapter->sessionId, type,
+ (v_U8_t*)SA_QUERY_FRAME_RSP,
+ SA_QUERY_FRAME_RSP_SIZE );
+#endif /* WLAN_FEATURE_11W */
}
#ifdef FEATURE_WLAN_WAPI
@@ -3111,11 +3128,23 @@
return 0;
}
#endif
+
#ifdef FEATURE_WLAN_CCX
case WLAN_CIPHER_SUITE_KRK:
setKey.encType = eCSR_ENCRYPT_TYPE_KRK;
break;
#endif
+
+#ifdef WLAN_FEATURE_11W
+ case WLAN_CIPHER_SUITE_AES_CMAC:
+ setKey.encType = eCSR_ENCRYPT_TYPE_AES_CMAC;
+ /* Temporarily we will ignore the setting of the IGTK. Once the Riva
+ firmware is modified to handle the IGTK, then we will proceeed normally.
+ For now, we just return success. */
+ return 0;
+ /* break; */
+#endif
+
default:
hddLog(VOS_TRACE_LEVEL_ERROR, "%s: unsupported cipher type %lu",
__func__, params->cipher);
@@ -4811,6 +4840,11 @@
pRoamProfile->ChannelInfo.ChannelList = &operatingChannel;
pRoamProfile->ChannelInfo.numOfChannels = 1;
}
+ else
+ {
+ pRoamProfile->ChannelInfo.ChannelList = NULL;
+ pRoamProfile->ChannelInfo.numOfChannels = 0;
+ }
/* change conn_state to connecting before sme_RoamConnect(), because sme_RoamConnect()
* has a direct path to call hdd_smeRoamCallback(), which will change the conn_state
@@ -5365,6 +5399,10 @@
return status;
}
+#ifdef WLAN_FEATURE_11W
+ pWextState->roamProfile.MFPEnabled = (req->mfp == NL80211_MFP_REQUIRED);
+#endif
+
/*parse WPA/RSN IE, and set the correspoing fileds in Roam profile*/
if (req->ie_len)
{
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index 806c716..0b751c7 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -554,6 +554,9 @@
tANI_U8 subType = WLAN_HDD_GET_SUBTYPE_FRM_FC(buf[0]);
tActionFrmType actionFrmType;
bool noack = 0;
+#ifdef WLAN_FEATURE_11W
+ tANI_U8 *pTxFrmBuf = (tANI_U8 *) buf; // For SA Query, we have to set protect bit
+#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
hdd_adapter_t *goAdapter;
@@ -785,7 +788,17 @@
hddLog(LOG1, "%s: HDD_GO_NEG_REQ_ACK_PENDING \n", __func__);
}
}
-
+#ifdef WLAN_FEATURE_11W
+ if ((type == SIR_MAC_MGMT_FRAME) &&
+ (subType == SIR_MAC_MGMT_ACTION) &&
+ (buf[WLAN_HDD_PUBLIC_ACTION_FRAME_OFFSET] == WLAN_HDD_SA_QUERY_ACTION_FRAME))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: Calling sme_sendAction. For Category %s", __func__, "SA Query");
+ // Since this is an SA Query Action Frame, we have to protect it
+ WLAN_HDD_SET_WEP_FRM_FC(pTxFrmBuf[1]);
+ }
+#endif
if (eHAL_STATUS_SUCCESS !=
sme_sendAction( WLAN_HDD_GET_HAL_CTX(pAdapter),
sessionId, buf, len, extendedWait, noack))
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 74b4bcc..50ce53c 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -208,6 +208,9 @@
#ifdef FEATURE_WLAN_TDLS
#define WE_GET_TDLS_PEERS 8
#endif
+#ifdef WLAN_FEATURE_11W
+#define WE_GET_11W_INFO 9
+#endif
/* Private ioctls and their sub-ioctls */
#define WLAN_PRIV_SET_NONE_GET_NONE (SIOCIWFIRSTPRIV + 6)
@@ -533,6 +536,9 @@
case eCSR_AUTH_TYPE_FT_RSN_PSK:
#endif
case eCSR_AUTH_TYPE_RSN_PSK:
+#ifdef WLAN_FEATURE_11W
+ case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
+#endif
rsnType = eANI_BOOLEAN_TRUE;
break;
//case eCSR_AUTH_TYPE_FAILED:
@@ -904,6 +910,11 @@
pWextState->roamProfile.nRSNReqIELength = 0;
pWextState->roamProfile.pRSNReqIE = (tANI_U8 *)NULL;
+#ifdef FEATURE_WLAN_WAPI
+ pWextState->roamProfile.nWAPIReqIELength = 0;
+ pWextState->roamProfile.pWAPIReqIE = (tANI_U8 *)NULL;
+#endif
+
pWextState->roamProfile.bWPSAssociation = VOS_FALSE;
pWextState->roamProfile.pAddIEScan = (tANI_U8 *)NULL;
pWextState->roamProfile.nAddIEScanLength = 0;
@@ -921,6 +932,12 @@
pWextState->roamProfile.AuthType.numEntries = 1;
pWextState->roamProfile.AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
+#ifdef WLAN_FEATURE_11W
+ pWextState->roamProfile.MFPEnabled = eANI_BOOLEAN_FALSE;
+ pWextState->roamProfile.MFPRequired = 0;
+ pWextState->roamProfile.MFPCapable = 0;
+#endif
+
pWextState->authKeyMgmt = 0;
for (i=0; i < CSR_MAX_NUM_KEY; i++)
@@ -4043,6 +4060,9 @@
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
int sub_cmd = wrqu->data.flags;
+#ifdef WLAN_FEATURE_11W
+ hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
+#endif
if ((WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress)
{
@@ -4255,6 +4275,25 @@
break;
}
#endif
+#ifdef WLAN_FEATURE_11W
+ case WE_GET_11W_INFO:
+ {
+ hddLog(LOGE, "WE_GET_11W_ENABLED = %d", pWextState->roamProfile.MFPEnabled );
+
+ snprintf(extra, WE_MAX_STR_LEN,
+ "\n BSSID %02X:%02X:%02X:%02X:%02X:%02X, Is PMF Assoc? %d"
+ "\n Number of Unprotected Disassocs %d"
+ "\n Number of Unprotected Deauths %d",
+ (*pWextState->roamProfile.BSSIDs.bssid)[0], (*pWextState->roamProfile.BSSIDs.bssid)[1],
+ (*pWextState->roamProfile.BSSIDs.bssid)[2], (*pWextState->roamProfile.BSSIDs.bssid)[3],
+ (*pWextState->roamProfile.BSSIDs.bssid)[4], (*pWextState->roamProfile.BSSIDs.bssid)[5],
+ pWextState->roamProfile.MFPEnabled, pAdapter->hdd_stats.hddPmfStats.numUnprotDisassocRx,
+ pAdapter->hdd_stats.hddPmfStats.numUnprotDeauthRx);
+
+ wrqu->data.length = strlen(extra)+1;
+ break;
+ }
+#endif
default:
{
hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
@@ -6623,6 +6662,13 @@
IW_PRIV_TYPE_CHAR| WE_MAX_STR_LEN,
"getTdlsPeers" },
#endif
+#ifdef WLAN_FEATURE_11W
+ {
+ WE_GET_11W_INFO,
+ 0,
+ IW_PRIV_TYPE_CHAR| WE_MAX_STR_LEN,
+ "getPMFInfo" },
+#endif
/* handlers for main ioctl */
{ WLAN_PRIV_SET_NONE_GET_NONE,
0,
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index b85b0a5..de5f79f 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -1007,6 +1007,11 @@
tAniEdType UCEncryptionType;
tAniEdType MCEncryptionType;
+
+#ifdef WLAN_FEATURE_11W
+ tAniEdType MgmtEncryptionType;
+#endif
+
#ifdef WLAN_FEATURE_VOWIFI_11R
tAniBool is11Rconnection;
#endif
@@ -3340,6 +3345,16 @@
tANI_U8 frameBuf[1]; //variable
}tSirSmeMgmtFrameInd, *tpSirSmeMgmtFrameInd;
+#ifdef WLAN_FEATURE_11W
+typedef struct sSirSmeUnprotMgmtFrameInd
+{
+ tANI_U8 sessionId;
+ tANI_U8 frameType;
+ tANI_U8 frameLen;
+ tANI_U8 frameBuf[1]; //variable
+}tSirSmeUnprotMgmtFrameInd, *tpSirSmeUnprotMgmtFrameInd;
+#endif
+
#define SIR_IS_FULL_POWER_REASON_DISCONNECTED(eReason) \
( ( eSME_LINK_DISCONNECTED_BY_HDD == (eReason) ) || \
( eSME_LINK_DISCONNECTED_BY_OTHER == (eReason) ) || \
@@ -3984,4 +3999,12 @@
tSirMacAddr bssId;
} tSirResetAPCapsChange, *tpSirResetAPCapsChange;
+#ifdef WLAN_FEATURE_11W
+typedef struct sSirWlanExcludeUnencryptParam
+{
+ tANI_BOOLEAN excludeUnencrypt;
+ tSirMacAddr bssId;
+}tSirWlanExcludeUnencryptParam,*tpSirWlanExcludeUnencryptParam;
+#endif
+
#endif /* __SIR_API_H */
diff --git a/CORE/MAC/inc/sirMacProtDef.h b/CORE/MAC/inc/sirMacProtDef.h
index 73e3d0a..68121e5 100644
--- a/CORE/MAC/inc/sirMacProtDef.h
+++ b/CORE/MAC/inc/sirMacProtDef.h
@@ -261,7 +261,9 @@
#ifdef WLAN_FEATURE_11W
//11w SA query request/response action frame category code
-#define SIR_MAC_ACTION_SA_QUERY 8
+#define SIR_MAC_ACTION_SA_QUERY 8
+#define SIR_MAC_SA_QUERY_REQ 0
+#define SIR_MAC_SA_QUERY_RSP 1
#endif
#ifdef FEATURE_WLAN_TDLS
diff --git a/CORE/MAC/inc/wniApi.h b/CORE/MAC/inc/wniApi.h
index c0e9082..06de40f 100644
--- a/CORE/MAC/inc/wniApi.h
+++ b/CORE/MAC/inc/wniApi.h
@@ -368,6 +368,9 @@
#endif
eWNI_SME_SET_BCN_FILTER_REQ,
eWNI_SME_RESET_AP_CAPS_CHANGED,
+#ifdef WLAN_FEATURE_11W
+ eWNI_SME_UNPROT_MGMT_FRM_IND,
+#endif
eWNI_SME_MSG_TYPES_END
};
diff --git a/CORE/MAC/src/include/dot11f.h b/CORE/MAC/src/include/dot11f.h
index 95b1f1e..7bedcd4 100644
--- a/CORE/MAC/src/include/dot11f.h
+++ b/CORE/MAC/src/include/dot11f.h
@@ -549,6 +549,16 @@
void dot11fPackFfTimeStamp(tpAniSirGlobal, tDot11fFfTimeStamp*, tANI_U8*);
+typedef struct sDot11fFfTransactionId {
+ tANI_U8 transId[2];
+} tDot11fFfTransactionId;
+
+#define DOT11F_FF_TRANSACTIONID_LEN ( 2 )
+
+void dot11fUnpackFfTransactionId(tpAniSirGlobal, tANI_U8*, tDot11fFfTransactionId*);
+
+void dot11fPackFfTransactionId(tpAniSirGlobal, tDot11fFfTransactionId*, tANI_U8*);
+
typedef struct sDot11fFfTxAntennaId {
tANI_U8 antennaId;
} tDot11fFfTxAntennaId;
@@ -7233,6 +7243,26 @@
} /* End extern "C". */
#endif /* C++ */
+typedef struct sDot11fSaQueryRsp{
+ tDot11fFfCategory Category;
+ tDot11fFfAction Action;
+ tDot11fFfTransactionId TransactionId;
+} tDot11fSaQueryRsp;
+
+#define DOT11F_SAQUERYRSP ( 44 )
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+
+tANI_U32 dot11fUnpackSaQueryRsp(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fSaQueryRsp *pFrm);
+tANI_U32 dot11fPackSaQueryRsp(tpAniSirGlobal pCtx, tDot11fSaQueryRsp *pFrm, tANI_U8 *pBuf, tANI_U32 nBuf, tANI_U32 *pnConsumed);
+tANI_U32 dot11fGetPackedSaQueryRspSize(tpAniSirGlobal pCtx, tDot11fSaQueryRsp *pFrm, tANI_U32 *pnNeeded);
+
+#ifdef __cplusplus
+} /* End extern "C". */
+#endif /* C++ */
+
typedef struct sDot11fTDLSDisReq{
tDot11fFfCategory Category;
tDot11fFfAction Action;
@@ -7240,7 +7270,7 @@
tDot11fIELinkIdentifier LinkIdentifier;
} tDot11fTDLSDisReq;
-#define DOT11F_TDLSDISREQ ( 44 )
+#define DOT11F_TDLSDISREQ ( 45 )
#ifdef __cplusplus
extern "C" {
@@ -7272,7 +7302,7 @@
tDot11fIEVHTCaps VHTCaps;
} tDot11fTDLSDisRsp;
-#define DOT11F_TDLSDISRSP ( 45 )
+#define DOT11F_TDLSDISRSP ( 46 )
#ifdef __cplusplus
extern "C" {
@@ -7295,7 +7325,7 @@
tDot11fIEPUBufferStatus PUBufferStatus;
} tDot11fTDLSPeerTrafficInd;
-#define DOT11F_TDLSPEERTRAFFICIND ( 46 )
+#define DOT11F_TDLSPEERTRAFFICIND ( 47 )
#ifdef __cplusplus
extern "C" {
@@ -7316,7 +7346,7 @@
tDot11fIELinkIdentifier LinkIdentifier;
} tDot11fTDLSPeerTrafficRsp;
-#define DOT11F_TDLSPEERTRAFFICRSP ( 47 )
+#define DOT11F_TDLSPEERTRAFFICRSP ( 48 )
#ifdef __cplusplus
extern "C" {
@@ -7345,7 +7375,7 @@
tDot11fIEVHTOperation VHTOperation;
} tDot11fTDLSSetupCnf;
-#define DOT11F_TDLSSETUPCNF ( 48 )
+#define DOT11F_TDLSSETUPCNF ( 49 )
#ifdef __cplusplus
extern "C" {
@@ -7381,7 +7411,7 @@
tDot11fIEVHTCaps VHTCaps;
} tDot11fTDLSSetupReq;
-#define DOT11F_TDLSSETUPREQ ( 49 )
+#define DOT11F_TDLSSETUPREQ ( 50 )
#ifdef __cplusplus
extern "C" {
@@ -7418,7 +7448,7 @@
tDot11fIEVHTCaps VHTCaps;
} tDot11fTDLSSetupRsp;
-#define DOT11F_TDLSSETUPRSP ( 50 )
+#define DOT11F_TDLSSETUPRSP ( 51 )
#ifdef __cplusplus
extern "C" {
@@ -7440,7 +7470,7 @@
tDot11fIELinkIdentifier LinkIdentifier;
} tDot11fTDLSTeardown;
-#define DOT11F_TDLSTEARDOWN ( 51 )
+#define DOT11F_TDLSTEARDOWN ( 52 )
#ifdef __cplusplus
extern "C" {
@@ -7461,7 +7491,7 @@
tDot11fIETPCReport TPCReport;
} tDot11fTPCReport;
-#define DOT11F_TPCREPORT ( 52 )
+#define DOT11F_TPCREPORT ( 53 )
#ifdef __cplusplus
extern "C" {
@@ -7482,7 +7512,7 @@
tDot11fIETPCRequest TPCRequest;
} tDot11fTPCRequest;
-#define DOT11F_TPCREQUEST ( 53 )
+#define DOT11F_TPCREQUEST ( 54 )
#ifdef __cplusplus
extern "C" {
@@ -7505,7 +7535,7 @@
tDot11fIECCXTrafStrmRateSet CCXTrafStrmRateSet;
} tDot11fWMMAddTSRequest;
-#define DOT11F_WMMADDTSREQUEST ( 54 )
+#define DOT11F_WMMADDTSREQUEST ( 55 )
#ifdef __cplusplus
extern "C" {
@@ -7528,7 +7558,7 @@
tDot11fIECCXTrafStrmMet CCXTrafStrmMet;
} tDot11fWMMAddTSResponse;
-#define DOT11F_WMMADDTSRESPONSE ( 55 )
+#define DOT11F_WMMADDTSRESPONSE ( 56 )
#ifdef __cplusplus
extern "C" {
@@ -7550,7 +7580,7 @@
tDot11fIEWMMTSPEC WMMTSPEC;
} tDot11fWMMDelTS;
-#define DOT11F_WMMDELTS ( 56 )
+#define DOT11F_WMMDELTS ( 57 )
#ifdef __cplusplus
extern "C" {
diff --git a/CORE/MAC/src/include/dphGlobal.h b/CORE/MAC/src/include/dphGlobal.h
index 91bb281..d1e0107 100644
--- a/CORE/MAC/src/include/dphGlobal.h
+++ b/CORE/MAC/src/include/dphGlobal.h
@@ -387,9 +387,7 @@
tANI_U8 fAniCount:1;
-
- tANI_U8 rsvd:1;
-
+ tANI_U8 rmfEnabled:1;
/// Fragmentation size
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index a7cae94..5f35725 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -559,6 +559,10 @@
#define SIR_HAL_TRAFFIC_STATS_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 195)
+#ifdef WLAN_FEATURE_11W
+#define SIR_HAL_EXCLUDE_UNENCRYPTED_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 196)
+#endif
+
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_ITC_MSG_TYPES_BEGIN + 0xFF)
// CFG message types
#define SIR_CFG_MSG_TYPES_BEGIN (SIR_CFG_MODULE_ID << 8)
diff --git a/CORE/MAC/src/pe/include/limSession.h b/CORE/MAC/src/pe/include/limSession.h
index 4384c1c..4638f73 100644
--- a/CORE/MAC/src/pe/include/limSession.h
+++ b/CORE/MAC/src/pe/include/limSession.h
@@ -266,7 +266,9 @@
tANI_U8 limWsmEnabled:1; //WSM
tANI_U8 limHcfEnabled:1;
tANI_U8 lim11dEnabled:1;
-
+#ifdef WLAN_FEATURE_11W
+ tANI_U8 limRmfEnabled:1; //11W
+#endif
tANI_U32 lim11hEnable;
tPowerdBm maxTxPower; //MIN (Regulatory and local power constraint)
diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.c b/CORE/MAC/src/pe/lim/limAssocUtils.c
index 5c12f6d..4a9244f 100644
--- a/CORE/MAC/src/pe/lim/limAssocUtils.c
+++ b/CORE/MAC/src/pe/lim/limAssocUtils.c
@@ -3382,6 +3382,14 @@
pAddBssParams->extSetStaKeyParamValid = 0;
#endif
+#ifdef WLAN_FEATURE_11W
+ if (psessionEntry->limRmfEnabled)
+ {
+ pAddBssParams->rmfEnabled = 1;
+ pAddBssParams->staContext.rmfEnabled = 1;
+ }
+#endif
+
// Set a new state for MLME
if( eLIM_MLM_WT_ASSOC_RSP_STATE == psessionEntry->limMlmState )
psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_ASSOC_STATE;
@@ -3666,6 +3674,14 @@
pAddBssParams->extSetStaKeyParamValid = 0;
#endif
+#ifdef WLAN_FEATURE_11W
+ if (psessionEntry->limRmfEnabled)
+ {
+ pAddBssParams->rmfEnabled = 1;
+ pAddBssParams->staContext.rmfEnabled = 1;
+ }
+#endif
+
// Set a new state for MLME
//pMac->lim.gLimMlmState = eLIM_MLM_WT_ADD_BSS_RSP_PREASSOC_STATE;
@@ -3946,3 +3962,49 @@
return;
}
+
+#ifdef WLAN_FEATURE_11W
+/** -------------------------------------------------------------
+\fn limSendSmeUnprotectedMgmtFrameInd
+\brief Forwards the unprotected management frame to SME.
+\param tpAniSirGlobal pMac
+\param frameType - 802.11 frame type
+\param frame - frame buffer
+\param sessionId - id for the current session
+\param psessionEntry - PE session context
+\return none
+ -------------------------------------------------------------*/
+void limSendSmeUnprotectedMgmtFrameInd(
+ tpAniSirGlobal pMac, tANI_U8 frameType,
+ tANI_U8 *frame, tANI_U32 frameLen, tANI_U16 sessionId,
+ tpPESession psessionEntry)
+{
+ tSirMsgQ mmhMsg;
+ tSirSmeUnprotMgmtFrameInd * pSirSmeMgmtFrame = NULL;
+ tANI_U16 length;
+
+ length = sizeof(tSirSmeUnprotMgmtFrameInd) + frameLen;
+
+ if (eHAL_STATUS_SUCCESS !=
+ palAllocateMemory(pMac->hHdd, (void **)&pSirSmeMgmtFrame, length))
+ {
+ limLog(pMac, LOGP,
+ FL("palAllocateMemory failed for tSirSmeUnprotectedMgmtFrameInd"));
+ return;
+ }
+ palZeroMemory(pMac->hHdd, (void*)pSirSmeMgmtFrame, length);
+
+ pSirSmeMgmtFrame->sessionId = sessionId;
+ pSirSmeMgmtFrame->frameType = frameType;
+
+ vos_mem_copy(pSirSmeMgmtFrame->frameBuf, frame, frameLen);
+ pSirSmeMgmtFrame->frameLen = frameLen;
+
+ mmhMsg.type = eWNI_SME_UNPROT_MGMT_FRM_IND;
+ mmhMsg.bodyptr = pSirSmeMgmtFrame;
+ mmhMsg.bodyval = 0;
+
+ limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
+ return;
+}
+#endif
diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.h b/CORE/MAC/src/pe/lim/limAssocUtils.h
index 9a7ba3b..915d9c3 100644
--- a/CORE/MAC/src/pe/lim/limAssocUtils.h
+++ b/CORE/MAC/src/pe/lim/limAssocUtils.h
@@ -177,6 +177,10 @@
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
void limSendRetryReassocReqFrame(tpAniSirGlobal pMac, tLimMlmReassocReq *pMlmReassocReq, tpPESession psessionEntry);
#endif
+#ifdef WLAN_FEATURE_11W
+void limSendSmeUnprotectedMgmtFrameInd(tpAniSirGlobal pMac, tANI_U8 frameType,
+ tANI_U8 *frame, tANI_U32 frameLen, tANI_U16 sessionId, tpPESession psessionEntry);
+#endif
#endif /* __LIM_ASSOC_UTILS_H */
diff --git a/CORE/MAC/src/pe/lim/limProcessActionFrame.c b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
index e50d5e6..e6a50d4 100644
--- a/CORE/MAC/src/pe/lim/limProcessActionFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
@@ -1765,7 +1765,7 @@
#ifdef WLAN_FEATURE_11W
/**
- * limProcessActionFrame
+ * limProcessSAQueryRequestActionFrame
*
*FUNCTION:
* This function is called by limProcessActionFrame() upon
@@ -1778,14 +1778,16 @@
*NOTE:
*
* @param pMac - Pointer to Global MAC structure
- * @param *pBd - A pointer to Buffer descriptor + associated PDUs
+ * @param *pRxPacketInfo - Handle to the Rx packet info
+ * @param psessionEntry - PE session entry
+ *
* @return None
*/
-static void __limProcessSAQueryRequestActionFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
+static void __limProcessSAQueryRequestActionFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tpPESession psessionEntry)
{
tpSirMacMgmtHdr pHdr;
tANI_U8 *pBody;
- tANI_U16 transId = 0;
+ tANI_U8 transId[2];
/* Prima --- Below Macro not available in prima
pHdr = SIR_MAC_BD_TO_MPDUHEADER(pBd);
@@ -1794,27 +1796,62 @@
pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
+ /* If this is an unprotected SA Query Request, then ignore it. */
+ if (pHdr->fc.wep == 0)
+ return;
+
/*Extract 11w trsansId from SA query request action frame
In SA query response action frame we will send same transId
In SA query request action frame:
Category : 1 byte
Action : 1 byte
- Transaction ID : 2 bbytes */
+ Transaction ID : 2 bytes */
+ vos_mem_copy( &transId[0], &pBody[2], 2 );
- transId = pBody[2];
- transId = transId << 8;
- transId |= pBody[3];
-
//Send 11w SA query response action frame
if (limSendSaQueryResponseFrame(pMac,
transId,
pHdr->sa,psessionEntry) != eSIR_SUCCESS)
{
- PELOGE(limLog(pMac, LOGE, FL("fail to send SA query response action frame. \n"));)
+ PELOGE(limLog(pMac, LOGE, FL("fail to send SA query response action frame."));)
return;
}
}
+/**
+ * __limProcessSAQueryResponseActionFrame
+ *
+ *FUNCTION:
+ * This function is called by limProcessActionFrame() upon
+ * SA query response Action frame reception.
+ *
+ *LOGIC:
+ *
+ *ASSUMPTIONS:
+ *
+ *NOTE:
+ *
+ * @param pMac - Pointer to Global MAC structure
+ * @param *pRxPacketInfo - Handle to the Rx packet info
+ * @param psessionEntry - PE session entry
+ * @return None
+ */
+static void __limProcessSAQueryResponseActionFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tpPESession psessionEntry)
+{
+ tpSirMacMgmtHdr pHdr;
+ tANI_U32 frameLen;
+
+ pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
+ frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
+ VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
+ ("SA Query Response received...")) ;
+ /* Forward to the SME to HDD to wpa_supplicant */
+ // type is ACTION
+ limSendSmeMgmtFrameInd(pMac, pHdr->fc.subType,
+ (tANI_U8*)pHdr, frameLen + sizeof(tSirMacMgmtHdr), 0,
+ WDA_GET_RX_CH( pRxPacketInfo ), psessionEntry, 0);
+}
+
#endif
/**
@@ -1840,11 +1877,21 @@
{
tANI_U8 *pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
tpSirMacActionFrameHdr pActionHdr = (tpSirMacActionFrameHdr) pBody;
+#ifdef WLAN_FEATURE_11W
+ tpSirMacMgmtHdr pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
+#endif
-
switch (pActionHdr->category)
{
case SIR_MAC_ACTION_QOS_MGMT:
+#ifdef WLAN_FEATURE_11W
+ if ((psessionEntry->limRmfEnabled) && (pHdr->fc.wep == 0))
+ {
+ PELOGE(limLog(pMac, LOGE, FL("Dropping unprotected Action category %d frame "
+ "since RMF is enabled."), pActionHdr->category);)
+ break;
+ }
+#endif
if (psessionEntry->limQosEnabled)
{
switch (pActionHdr->actionID)
@@ -1862,7 +1909,7 @@
break;
default:
- PELOGE(limLog(pMac, LOGE, FL("Qos action %d not handled\n"), pActionHdr->actionID);)
+ PELOGE(limLog(pMac, LOGE, FL("Qos action %d not handled."), pActionHdr->actionID);)
break;
}
break ;
@@ -1871,6 +1918,14 @@
break;
case SIR_MAC_ACTION_SPECTRUM_MGMT:
+#ifdef WLAN_FEATURE_11W
+ if ((psessionEntry->limRmfEnabled) && (pHdr->fc.wep == 0))
+ {
+ PELOGE(limLog(pMac, LOGE, FL("Dropping unprotected Action category %d frame "
+ "since RMF is enabled."), pActionHdr->category);)
+ break;
+ }
+#endif
switch (pActionHdr->actionID)
{
#ifdef ANI_SUPPORT_11H
@@ -1900,7 +1955,7 @@
}
break;
default:
- PELOGE(limLog(pMac, LOGE, FL("Spectrum mgmt action id %d not handled\n"), pActionHdr->actionID);)
+ PELOGE(limLog(pMac, LOGE, FL("Spectrum mgmt action id %d not handled."), pActionHdr->actionID);)
break;
}
break;
@@ -1908,7 +1963,7 @@
case SIR_MAC_ACTION_WME:
if (! psessionEntry->limWmeEnabled)
{
- limLog(pMac, LOGW, FL("WME mode disabled - dropping action frame %d\n"),
+ limLog(pMac, LOGW, FL("WME mode disabled - dropping action frame %d."),
pActionHdr->actionID);
break;
}
@@ -1927,13 +1982,21 @@
break;
default:
- PELOGE(limLog(pMac, LOGE, FL("WME action %d not handled\n"), pActionHdr->actionID);)
+ PELOGE(limLog(pMac, LOGE, FL("WME action %d not handled."), pActionHdr->actionID);)
break;
}
break;
case SIR_MAC_ACTION_BLKACK:
// Determine the "type" of BA Action Frame
+#ifdef WLAN_FEATURE_11W
+ if ((psessionEntry->limRmfEnabled) && (pHdr->fc.wep == 0))
+ {
+ PELOGE(limLog(pMac, LOGE, FL("Dropping unprotected Action category %d frame "
+ "since RMF is enabled."), pActionHdr->category);)
+ break;
+ }
+#endif
switch(pActionHdr->actionID)
{
case SIR_MAC_BLKACK_ADD_REQ:
@@ -1960,13 +2023,21 @@
__limProcessSMPowerSaveUpdate(pMac, (tANI_U8 *) pRxPacketInfo,psessionEntry);
break;
default:
- PELOGE(limLog(pMac, LOGE, FL("Action ID %d not handled in HT Action category\n"), pActionHdr->actionID);)
+ PELOGE(limLog(pMac, LOGE, FL("Action ID %d not handled in HT Action category."), pActionHdr->actionID);)
break;
}
break;
#if defined WLAN_FEATURE_VOWIFI
case SIR_MAC_ACTION_RRM:
+#ifdef WLAN_FEATURE_11W
+ if ((psessionEntry->limRmfEnabled) && (pHdr->fc.wep == 0))
+ {
+ PELOGE(limLog(pMac, LOGE, FL("Dropping unprotected Action category %d frame "
+ "since RMF is enabled."), pActionHdr->category);)
+ break;
+ }
+#endif
if( pMac->rrm.rrmPEContext.rrmEnable )
{
switch(pActionHdr->actionID) {
@@ -1980,7 +2051,7 @@
__limProcessNeighborReport( pMac, (tANI_U8*) pRxPacketInfo, psessionEntry );
break;
default:
- PELOGE( limLog( pMac, LOGE, FL("Action ID %d not handled in RRM\n"), pActionHdr->actionID);)
+ PELOGE( limLog( pMac, LOGE, FL("Action ID %d not handled in RRM."), pActionHdr->actionID);)
break;
}
@@ -1988,7 +2059,7 @@
else
{
// Else we will just ignore the RRM messages.
- PELOGE( limLog( pMac, LOGE, FL("RRM Action frame ignored as RRM is disabled in cfg\n"));)
+ PELOGE( limLog( pMac, LOGE, FL("RRM Action frame ignored as RRM is disabled in cfg."));)
}
break;
#endif
@@ -2053,8 +2124,22 @@
#ifdef WLAN_FEATURE_11W
case SIR_MAC_ACTION_SA_QUERY:
{
- /**11w SA query request action frame received**/
- __limProcessSAQueryRequestActionFrame(pMac,(tANI_U8*) pRxPacketInfo, psessionEntry );
+ PELOGE(limLog(pMac, LOG1, FL("SA Query Action category %d action %d."), pActionHdr->category, pActionHdr->actionID);)
+ switch (pActionHdr->actionID)
+ {
+ case SIR_MAC_SA_QUERY_REQ:
+ /**11w SA query request action frame received**/
+ /* Respond directly to the incoming request in LIM */
+ __limProcessSAQueryRequestActionFrame(pMac,(tANI_U8*) pRxPacketInfo, psessionEntry );
+ break;
+ case SIR_MAC_SA_QUERY_RSP:
+ /**11w SA query response action frame received**/
+ /* Forward to the SME to HDD to wpa_supplicant */
+ __limProcessSAQueryResponseActionFrame(pMac,(tANI_U8*) pRxPacketInfo, psessionEntry );
+ break;
+ default:
+ break;
+ }
break;
}
#endif
@@ -2072,6 +2157,7 @@
break;
}
}
+ break;
}
#endif
default:
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
index 1e7e7dc..5442f9f 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
@@ -235,7 +235,12 @@
pStaDs->wmeEnabled = 1;
}
-
+#ifdef WLAN_FEATURE_11W
+ if(psessionEntry->limRmfEnabled)
+ {
+ pStaDs->rmfEnabled = 1;
+ }
+#endif
}
/**
diff --git a/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c b/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c
index 5048523..8f4599c 100644
--- a/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c
@@ -94,6 +94,9 @@
tpDphHashNode pStaDs;
tpPESession pRoamSessionEntry=NULL;
tANI_U8 roamSessionId;
+#ifdef WLAN_FEATURE_11W
+ tANI_U32 frameLen;
+#endif
pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
@@ -127,6 +130,24 @@
return;
}
+
+#ifdef WLAN_FEATURE_11W
+ /* PMF: If this session is a PMF session, then ensure that this frame was protected */
+ if(psessionEntry->limRmfEnabled && (WDA_GET_RX_DPU_FEEDBACK(pRxPacketInfo) & DPU_FEEDBACK_UNPROTECTED_ERROR))
+ {
+ PELOGE(limLog(pMac, LOGE, FL("received an unprotected deauth from AP"));)
+ // If the frame received is unprotected, forward it to the supplicant to initiate
+ // an SA query
+ frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
+
+ //send the unprotected frame indication to SME
+ limSendSmeUnprotectedMgmtFrameInd( pMac, pHdr->fc.subType,
+ (tANI_U8*)pHdr, (frameLen + sizeof(tSirMacMgmtHdr)),
+ psessionEntry->smeSessionId, psessionEntry);
+ return;
+ }
+#endif
+
// Get reasonCode from Deauthentication frame body
reasonCode = sirReadU16(pBody);
diff --git a/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c b/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c
index bda3de1..6666e7b 100644
--- a/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c
@@ -93,7 +93,9 @@
tpSirMacMgmtHdr pHdr;
tpDphHashNode pStaDs;
tLimMlmDisassocInd mlmDisassocInd;
-
+#ifdef WLAN_FEATURE_11W
+ tANI_U32 frameLen;
+#endif
pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
@@ -119,6 +121,22 @@
return;
}
+#ifdef WLAN_FEATURE_11W
+ /* PMF: If this session is a PMF session, then ensure that this frame was protected */
+ if(psessionEntry->limRmfEnabled && (WDA_GET_RX_DPU_FEEDBACK(pRxPacketInfo) & DPU_FEEDBACK_UNPROTECTED_ERROR))
+ {
+ PELOGE(limLog(pMac, LOGE, FL("received an unprotected disassoc from AP"));)
+ // If the frame received is unprotected, forward it to the supplicant to initiate
+ // an SA query
+ frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
+ //send the unprotected frame indication to SME
+ limSendSmeUnprotectedMgmtFrameInd( pMac, pHdr->fc.subType,
+ (tANI_U8*)pHdr, (frameLen + sizeof(tSirMacMgmtHdr)),
+ psessionEntry->smeSessionId, psessionEntry);
+ return;
+ }
+#endif
+
// Get reasonCode from Disassociation frame body
reasonCode = sirReadU16(pBody);
@@ -220,6 +238,7 @@
case eSIR_MAC_GR_KEY_UPDATE_TIMEOUT_REASON:
case eSIR_MAC_RSN_IE_MISMATCH_REASON:
case eSIR_MAC_1X_AUTH_FAILURE_REASON:
+ case eSIR_MAC_PREV_AUTH_NOT_VALID_REASON:
// Valid reasonCode in received Disassociation frame
break;
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
index d142406..26c7759 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
@@ -1957,6 +1957,18 @@
{
WDA_TrafficStatsTimerActivate(FALSE);
}
+
+#ifdef WLAN_FEATURE_11W
+ if (psessionEntry->limRmfEnabled)
+ {
+ if ( eSIR_SUCCESS != limSendExcludeUnencryptInd(pMac, TRUE, psessionEntry) )
+ {
+ limLog( pMac, LOGE,
+ FL( "Could not send down Exclude Unencrypted Indication!" ),
+ psessionEntry->limMlmState );
+ }
+ }
+#endif
}
void limProcessStaMlmDelBssRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,tpPESession psessionEntry)
@@ -3183,6 +3195,18 @@
{
WDA_TrafficStatsTimerActivate(TRUE);
}
+
+#ifdef WLAN_FEATURE_11W
+ if (psessionEntry->limRmfEnabled)
+ {
+ if ( eSIR_SUCCESS != limSendExcludeUnencryptInd(pMac, FALSE, psessionEntry) )
+ {
+ limLog( pMac, LOGE,
+ FL( "Could not send down Exclude Unencrypted Indication!" ),
+ psessionEntry->limMlmState );
+ }
+ }
+#endif
}
/**
* limProcessMlmSetKeyRsp()
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 62863f3..3871d57 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -1585,6 +1585,18 @@
psessionEntry->htRecommendedTxWidthSet = psessionEntry->htSupportedChannelWidthSet;
psessionEntry->htSecondaryChannelOffset = pSmeJoinReq->cbMode;
+ /* Record if management frames need to be protected */
+#ifdef WLAN_FEATURE_11W
+ if(eSIR_ED_AES_128_CMAC == pSmeJoinReq->MgmtEncryptionType)
+ {
+ psessionEntry->limRmfEnabled = 1;
+ }
+ else
+ {
+ psessionEntry->limRmfEnabled = 0;
+ }
+#endif
+
/*Store Persona */
psessionEntry->pePersona = pSmeJoinReq->staPersona;
VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
index 019efb8..2aee5e7 100644
--- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c
+++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
@@ -1095,6 +1095,13 @@
sirCopyMacAddr(pMacHdr->bssId,psessionEntry->bssId);
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
// That done, pack the struct:
if ( ! pAddTS->wmeTspecPresent )
{
@@ -1687,6 +1694,13 @@
#endif //TO SUPPORT BT-AMP
sirCopyMacAddr(pMacHdr->bssId,psessionEntry->bssId);
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
// That done, pack the struct:
if ( ! pAddTS->wmeTspecPresent )
{
@@ -1869,6 +1883,13 @@
#endif //TO SUPPORT BT-AMP
sirCopyMacAddr(pMacHdr->bssId, psessionEntry->bssId);
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
// That done, pack the struct:
if ( !wmmTspecPresent )
{
@@ -3660,6 +3681,13 @@
// Prepare the BSSID
sirCopyMacAddr(pMacHdr->bssId,psessionEntry->bssId);
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
nStatus = dot11fPackDisassociation( pMac, &frm, pFrame +
sizeof(tSirMacMgmtHdr),
nPayload, &nPayload );
@@ -3836,6 +3864,13 @@
// Prepare the BSSID
sirCopyMacAddr(pMacHdr->bssId,psessionEntry->bssId);
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
nStatus = dot11fPackDeAuth( pMac, &frm, pFrame +
sizeof(tSirMacMgmtHdr),
nPayload, &nPayload );
@@ -4066,6 +4101,13 @@
return eSIR_FAILURE; // just allocated...
}
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
nStatus = dot11fPackMeasurementReport( pMac, &frm, pFrame +
sizeof(tSirMacMgmtHdr),
nPayload, &nPayload );
@@ -4185,6 +4227,13 @@
return; // just allocated...
}
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
nStatus = dot11fPackTPCRequest( pMac, &frm, pFrame +
sizeof(tSirMacMgmtHdr),
nPayload, &nPayload );
@@ -4312,6 +4361,13 @@
return eSIR_FAILURE; // just allocated...
}
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
nStatus = dot11fPackTPCReport( pMac, &frm, pFrame +
sizeof(tSirMacMgmtHdr),
nPayload, &nPayload );
@@ -4454,6 +4510,14 @@
return eSIR_FAILURE; // just allocated...
}
#endif
+
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
nStatus = dot11fPackChannelSwitch( pMac, &frm, pFrame +
sizeof(tSirMacMgmtHdr),
nPayload, &nPayload );
@@ -4883,6 +4947,13 @@
#endif//TO SUPPORT BT-AMP
sirCopyMacAddr(pMacHdr->bssId,psessionEntry->bssId);
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
// Now, we're ready to "pack" the frames
nStatus = dot11fPackAddBAReq( pMac,
&frmAddBAReq,
@@ -5081,6 +5152,13 @@
#endif // TO SUPPORT BT-AMP
sirCopyMacAddr(pMacHdr->bssId,psessionEntry->bssId);
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
// Now, we're ready to "pack" the frames
nStatus = dot11fPackAddBARsp( pMac,
&frmAddBARsp,
@@ -5275,6 +5353,13 @@
#endif //TO SUPPORT BT-AMP
sirCopyMacAddr(pMacHdr->bssId,psessionEntry->bssId);
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
// Now, we're ready to "pack" the frames
nStatus = dot11fPackDelBAInd( pMac,
&frmDelBAInd,
@@ -5435,6 +5520,13 @@
sirCopyMacAddr( pMacHdr->bssId, psessionEntry->bssId );
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
// Now, we're ready to "pack" the frames
nStatus = dot11fPackNeighborReportRequest( pMac,
&frm,
@@ -5599,6 +5691,13 @@
sirCopyMacAddr( pMacHdr->bssId, psessionEntry->bssId );
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
// Now, we're ready to "pack" the frames
nStatus = dot11fPackLinkMeasurementReport( pMac,
&frm,
@@ -5785,6 +5884,13 @@
sirCopyMacAddr( pMacHdr->bssId, psessionEntry->bssId );
+#ifdef WLAN_FEATURE_11W
+ if ( psessionEntry->limRmfEnabled )
+ {
+ pMacHdr->fc.wep = 1;
+ }
+#endif
+
// Now, we're ready to "pack" the frames
nStatus = dot11fPackRadioMeasurementReport( pMac,
frm,
@@ -5858,44 +5964,55 @@
*
* \param pMac The global tpAniSirGlobal object
*
- * \param peer The Mac address of the AP to which this action frame is
-addressed
+ * \param transId Transaction identifier received in SA query request action frame
*
- * \param transId Transaction identifier received in SA query request action
-frame
+ * \param peer The Mac address of the AP to which this action frame is addressed
+ *
+ * \param psessionEntry The PE session entry
*
* \return eSIR_SUCCESS if setup completes successfully
* eSIR_FAILURE is some problem is encountered
*/
-tSirRetStatus limSendSaQueryResponseFrame( tpAniSirGlobal pMac, tANI_U16 transId,
+tSirRetStatus limSendSaQueryResponseFrame( tpAniSirGlobal pMac, tANI_U8 *transId,
tSirMacAddr peer,tpPESession psessionEntry)
{
- tDot11wSaQueryRsp frm; // SA query reponse action frame
+ tDot11fSaQueryRsp frm; // SA query reponse action frame
tANI_U8 *pFrame;
tSirRetStatus nSirStatus;
tpSirMacMgmtHdr pMacHdr;
- tANI_U32 nBytes, nPayload;
+ tANI_U32 nBytes, nPayload, nStatus;
void *pPacket;
eHalStatus halstatus;
- // Local variables used to dump prepared SA query response frame
- tANI_U8 *pDump;
- tANI_U16 dumpCount;
- tANI_U8 txFlag = 0;
- //tANI_U16 nBytes
+ tANI_U8 txFlag = 0;
palZeroMemory( pMac->hHdd, ( tANI_U8* )&frm, sizeof( frm ) );
- frm.category = SIR_MAC_ACTION_SA_QUERY;
- /*11w action fiedl is :
+ frm.Category.category = SIR_MAC_ACTION_SA_QUERY;
+ /*11w action field is :
action: 0 --> SA query request action frame
action: 1 --> SA query response action frame */
- frm.action = 1;
- /*11w Draft9.0 SA query response transId is same as
+ frm.Action.action = SIR_MAC_SA_QUERY_RSP;
+ /*11w SA query response transId is same as
SA query request transId*/
- frm.transId = transId;
+ vos_mem_copy( &frm.TransactionId.transId[0], &transId[0], 2 );
- nPayload = sizeof(tDot11wSaQueryRsp);
+ nStatus = dot11fGetPackedSaQueryRspSize(pMac, &frm, &nPayload);
+ if ( DOT11F_FAILED( nStatus ) )
+ {
+ limLog( pMac, LOGP, FL("Failed to calculate the packed size f"
+ "or a SA Query Response (0x%08x)."),
+ nStatus );
+ // We'll fall back on the worst case scenario:
+ nPayload = sizeof( tDot11fSaQueryRsp );
+ }
+ else if ( DOT11F_WARNED( nStatus ) )
+ {
+ limLog( pMac, LOGW, FL("There were warnings while calculating"
+ "the packed size for an SA Query Response"
+ " (0x%08x)."), nStatus );
+ }
+
nBytes = nPayload + sizeof( tSirMacMgmtHdr );
halstatus = palPktAlloc( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, nBytes, ( void** ) &pFrame, ( void** ) &pPacket );
if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
@@ -5908,37 +6025,85 @@
// Paranoia:
palZeroMemory( pMac->hHdd, pFrame, nBytes );
- // Next, we fill out the buffer descriptor:
- nSirStatus = limPopulateMacHeader( pMac, pFrame, SIR_MAC_MGMT_FRAME,
- SIR_MAC_MGMT_ACTION, peer,psessionEntry->selfMacAddr );
- if ( eSIR_SUCCESS != nSirStatus )
- {
- limLog( pMac, LOGE, FL("Failed to populate the buffer descrip"
- "tor for a TPC Report (%d).\n"),
- nSirStatus );
- palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, ( void* ) pFrame, ( void* ) pPacket );
- return eSIR_FAILURE; // just allocated...
- }
+ // Copy necessary info to BD
+ if ( eSIR_SUCCESS !=
+ (nSirStatus = limPopulateMacHeader( pMac,
+ pFrame,
+ SIR_MAC_MGMT_FRAME,
+ SIR_MAC_MGMT_ACTION,
+ peer, psessionEntry->selfMacAddr)))
+ goto returnAfterError;
+ // Update A3 with the BSSID
pMacHdr = ( tpSirMacMgmtHdr ) pFrame;
- // Pack 11w SA query response frame
- DOT11F_MEMCPY(pMac, (tANI_U8 *)(pFrame + sizeof(tSirMacMgmtHdr)),(tANI_U8 *)&frm, nPayload);
- pDump = (tANI_U8 *) pFrame;
+ sirCopyMacAddr( pMacHdr->bssId, psessionEntry->bssId );
- halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) nBytes,
- HAL_TXRX_FRM_802_11_MGMT,
- ANI_TXDIR_TODS,
- 7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
- limTxComplete, pFrame,txFlag);
- if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
+ // Since this is a SA Query Response, set the "protect" (aka WEP) bit
+ // in the FC
+ if ( psessionEntry->limRmfEnabled )
{
- limLog( pMac, LOGE, FL("Failed to send a SA Query resp frame "
- "(%X)!\n"),halstatus );
- //Pkt will be freed up by the callback
- return eSIR_FAILURE; // just allocated...
+ pMacHdr->fc.wep = 1;
}
- return eSIR_SUCCESS;
-}
+ // Pack 11w SA query response frame
+ nStatus = dot11fPackSaQueryRsp( pMac,
+ &frm,
+ pFrame + sizeof( tSirMacMgmtHdr ),
+ nPayload,
+ &nPayload );
+
+ if ( DOT11F_FAILED( nStatus ))
+ {
+ limLog( pMac, LOGE,
+ FL( "Failed to pack an SA Query Response (0x%08x)." ),
+ nStatus );
+ // FIXME - Need to convert to tSirRetStatus
+ nSirStatus = eSIR_FAILURE;
+ goto returnAfterError;
+ }
+ else if ( DOT11F_WARNED( nStatus ))
+ {
+ limLog( pMac, LOGW,
+ FL( "There were warnings while packing SA Query Response (0x%08x)." ),
+ nStatus);
+ }
+
+ limLog( pMac, LOG1,
+ FL( "Sending a SA Query Response to " ));
+ limPrintMacAddr( pMac, peer, LOGW );
+
+ if ( ( SIR_BAND_5_GHZ == limGetRFBand(psessionEntry->currentOperChannel))
+#ifdef WLAN_FEATURE_P2P
+ || ( psessionEntry->pePersona == VOS_P2P_CLIENT_MODE ) ||
+ ( psessionEntry->pePersona == VOS_P2P_GO_MODE)
+#endif
+ )
+ {
+ txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
+ }
+
+ if ( eHAL_STATUS_SUCCESS !=
+ (halstatus = halTxFrame( pMac,
+ pPacket,
+ (tANI_U16) nBytes,
+ HAL_TXRX_FRM_802_11_MGMT,
+ ANI_TXDIR_TODS,
+ 7,//SMAC_SWBD_TX_TID_MGMT_HIGH,
+ limTxComplete,
+ pFrame, txFlag )))
+ {
+ PELOGE(limLog( pMac, LOGE, FL( "halTxFrame FAILED! Status [%d]" ), halstatus );)
+ nSirStatus = eSIR_FAILURE;
+ //Pkt will be freed up by the callback
+ return nSirStatus;
+ }
+ else {
+ return eSIR_SUCCESS;
+ }
+
+returnAfterError:
+ palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, ( void* ) pFrame, ( void* ) pPacket );
+ return nSirStatus;
+} // End limSendSaQueryResponseFrame
#endif
diff --git a/CORE/MAC/src/pe/lim/limSendMessages.c b/CORE/MAC/src/pe/lim/limSendMessages.c
index 66b8e23..ecb215f 100644
--- a/CORE/MAC/src/pe/lim/limSendMessages.c
+++ b/CORE/MAC/src/pe/lim/limSendMessages.c
@@ -870,3 +870,53 @@
#endif
+#ifdef WLAN_FEATURE_11W
+/** ---------------------------------------------------------
+\fn limSendExcludeUnencryptInd
+\brief LIM sends a message to HAL to indicate whether to
+ ignore or indicate the unprotected packet error
+\param tpAniSirGlobal pMac
+\param tANI_BOOLEAN excludeUnenc - true: ignore, false:
+ indicate
+\param tpPESession psessionEntry - session context
+\return status
+ -----------------------------------------------------------*/
+tSirRetStatus limSendExcludeUnencryptInd(tpAniSirGlobal pMac,
+ tANI_BOOLEAN excludeUnenc,
+ tpPESession psessionEntry)
+{
+ tSirRetStatus retCode = eSIR_SUCCESS;
+ tSirMsgQ msgQ;
+ tSirWlanExcludeUnencryptParam * pExcludeUnencryptParam;
+
+ if (eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
+ (void **) &pExcludeUnencryptParam,
+ sizeof(tSirWlanExcludeUnencryptParam)))
+ {
+ limLog(pMac, LOGP,
+ FL( "Unable to PAL allocate memory during limSendExcludeUnencryptInd"));
+ return eSIR_MEM_ALLOC_FAILED;
+ }
+
+ pExcludeUnencryptParam->excludeUnencrypt = excludeUnenc;
+ sirCopyMacAddr(pExcludeUnencryptParam->bssId, psessionEntry->bssId);
+
+ msgQ.type = WDA_EXCLUDE_UNENCRYPTED_IND;
+ msgQ.reserved = 0;
+ msgQ.bodyptr = pExcludeUnencryptParam;
+ msgQ.bodyval = 0;
+ PELOG3(limLog(pMac, LOG3,
+ FL("Sending WDA_EXCLUDE_UNENCRYPTED_IND"));)
+ MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
+ if (eSIR_SUCCESS != (retCode = wdaPostCtrlMsg(pMac, &msgQ)))
+ {
+ palFreeMemory(pMac->hHdd, pExcludeUnencryptParam);
+ limLog(pMac, LOGP,
+ FL("Posting WDA_EXCLUDE_UNENCRYPTED_IND to WDA failed, reason=%X"),
+ retCode);
+ }
+
+ return retCode;
+}
+#endif
+
diff --git a/CORE/MAC/src/pe/lim/limSendMessages.h b/CORE/MAC/src/pe/lim/limSendMessages.h
index 7f7b073..d2d12fa 100644
--- a/CORE/MAC/src/pe/lim/limSendMessages.h
+++ b/CORE/MAC/src/pe/lim/limSendMessages.h
@@ -109,5 +109,9 @@
tANI_U8 ptiBufStatusOffset, tANI_U8 ptiFrameLen, tANI_U8 *ptiFrame, tANI_U8 *extCapability);
tSirRetStatus limSendTdlsLinkTeardown(tpAniSirGlobal pMac, tANI_U16 staId);
#endif
-
+#ifdef WLAN_FEATURE_11W
+tSirRetStatus limSendExcludeUnencryptInd(tpAniSirGlobal pMac,
+ tANI_BOOLEAN excludeUnenc,
+ tpPESession psessionEntry );
+#endif
#endif
diff --git a/CORE/MAC/src/pe/lim/limSerDesUtils.c b/CORE/MAC/src/pe/lim/limSerDesUtils.c
index ff161a5..152024d 100644
--- a/CORE/MAC/src/pe/lim/limSerDesUtils.c
+++ b/CORE/MAC/src/pe/lim/limSerDesUtils.c
@@ -1085,6 +1085,14 @@
if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE)
return eSIR_FAILURE;
+#ifdef WLAN_FEATURE_11W
+ pJoinReq->MgmtEncryptionType = limGetU32(pBuf);
+ pBuf += sizeof(tANI_U32);
+ len -= sizeof(tANI_U32);
+ if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE)
+ return eSIR_FAILURE;
+#endif
+
#ifdef WLAN_FEATURE_VOWIFI_11R
//is11Rconnection;
pJoinReq->is11Rconnection = (tAniBool)limGetU32(pBuf);
diff --git a/CORE/MAC/src/pe/lim/limTypes.h b/CORE/MAC/src/pe/lim/limTypes.h
index aecfd43..dbc28cc 100644
--- a/CORE/MAC/src/pe/lim/limTypes.h
+++ b/CORE/MAC/src/pe/lim/limTypes.h
@@ -869,7 +869,7 @@
#ifdef WLAN_FEATURE_11W
//11w SA query request action frame handler
tSirRetStatus limSendSaQueryResponseFrame( tpAniSirGlobal pMac,
- tANI_U16 transId, tSirMacAddr peer,tpPESession psessionEntry);
+ tANI_U8 *transId, tSirMacAddr peer,tpPESession psessionEntry);
#endif
// Inline functions
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 932a388..901217b 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -81,6 +81,9 @@
eCSR_AUTH_TYPE_CCKM_WPA,
eCSR_AUTH_TYPE_CCKM_RSN,
#endif /* FEATURE_WLAN_CCX */
+#ifdef WLAN_FEATURE_11W
+ eCSR_AUTH_TYPE_RSN_PSK_SHA256,
+#endif
eCSR_NUM_OF_SUPPORT_AUTH_TYPE,
eCSR_AUTH_TYPE_FAILED = 0xff,
eCSR_AUTH_TYPE_UNKNOWN = eCSR_AUTH_TYPE_FAILED,
@@ -459,6 +462,9 @@
eCSR_ROAM_DISCONNECT_ALL_P2P_CLIENTS, //Disaconnect all the clients
eCSR_ROAM_SEND_P2P_STOP_BSS, //Stopbss triggered from SME due to different
// beacon interval
+#ifdef WLAN_FEATURE_11W
+ eCSR_ROAM_UNPROT_MGMT_FRAME_IND,
+#endif
}eRoamCmdStatus;
@@ -704,7 +710,8 @@
}eCsrWEPStaticKeyID;
-#define CSR_MAX_NUM_KEY (eCSR_SECURITY_WEP_STATIC_KEY_ID_MAX + 1)
+// Two extra key indicies are used for the IGTK (which is used by BIP)
+#define CSR_MAX_NUM_KEY (eCSR_SECURITY_WEP_STATIC_KEY_ID_MAX + 2 + 1)
typedef enum
{
@@ -825,6 +832,13 @@
//This field is for output only, not for input
eCsrEncryptionType negotiatedMCEncryptionType;
+#ifdef WLAN_FEATURE_11W
+ // Management Frame Protection
+ tANI_BOOLEAN MFPEnabled;
+ tANI_U8 MFPRequired;
+ tANI_U8 MFPCapable;
+#endif
+
tCsrKeys Keys;
eCsrCBChoice CBMode; //up, down or auto
tCsrChannelInfo ChannelInfo;
diff --git a/CORE/SME/inc/csrSupport.h b/CORE/SME/inc/csrSupport.h
index a28f33d..45a0586 100644
--- a/CORE/SME/inc/csrSupport.h
+++ b/CORE/SME/inc/csrSupport.h
@@ -40,15 +40,13 @@
*/
/** ------------------------------------------------------------------------- *
- ------------------------------------------------------------------------- *
-
\file csrSupport.h
-
+
Exports and types for the Common Scan and Roaming supporting interfaces.
Copyright (C) 2006 Airgo Networks, Incorporated
-
+
========================================================================== */
#ifndef CSR_SUPPORT_H__
#define CSR_SUPPORT_H__
@@ -593,7 +591,9 @@
tANI_U16 NoPairwise:1;
tANI_U16 PTKSAReplayCounter:2;
tANI_U16 GTKSAReplayCounter:2;
- tANI_U16 Reserved:10;
+ tANI_U16 MFPRequired:1;
+ tANI_U16 MFPCapable:1;
+ tANI_U16 Reserved:8;
} __ani_attr_packed tCsrRSNCapabilities;
typedef __ani_attr_pre_packed struct tagCsrRSNPMKIe
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 71f1da8..c1555ac 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -150,6 +150,9 @@
n = AUTH_WPA2_EAP;
break;
case eCSR_AUTH_TYPE_RSN_PSK:
+#ifdef WLAN_FEATURE_11W
+ case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
+#endif
n = AUTH_WPA2_PSK;
break;
#ifdef FEATURE_WLAN_WAPI
@@ -4436,6 +4439,10 @@
(eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
(eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType)
#endif /* FEATURE_WLAN_WAPI */
+#ifdef WLAN_FEATURE_11W
+ ||
+ (eCSR_AUTH_TYPE_RSN_PSK_SHA256 == authType)
+#endif /* FEATURE_WLAN_WAPI */
)
{
if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
@@ -4451,6 +4458,9 @@
(eCSR_AUTH_TYPE_FT_RSN == authType) ||
(eCSR_AUTH_TYPE_FT_RSN_PSK == authType) ||
#endif /* WLAN_FEATURE_VOWIFI_11R */
+#if defined WLAN_FEATURE_11W
+ (eCSR_AUTH_TYPE_RSN_PSK_SHA256 == authType) ||
+#endif
(eCSR_AUTH_TYPE_RSN_PSK == authType))
{
if(pIesLocal->RSN.present)
@@ -5582,6 +5592,11 @@
pDstProfile->negotiatedUCEncryptionType = pSrcProfile->negotiatedUCEncryptionType;
pDstProfile->negotiatedMCEncryptionType = pSrcProfile->negotiatedMCEncryptionType;
pDstProfile->negotiatedAuthType = pSrcProfile->negotiatedAuthType;
+#ifdef WLAN_FEATURE_11W
+ pDstProfile->MFPEnabled = pSrcProfile->MFPEnabled;
+ pDstProfile->MFPRequired = pSrcProfile->MFPRequired;
+ pDstProfile->MFPCapable = pSrcProfile->MFPCapable;
+#endif
pDstProfile->BSSType = pSrcProfile->BSSType;
pDstProfile->phyMode = pSrcProfile->phyMode;
pDstProfile->csrPersona = pSrcProfile->csrPersona;
@@ -6563,6 +6578,9 @@
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
+#ifdef WLAN_FEATURE_11W
+ || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK_SHA256)
+#endif
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
&& (pMac->roam.configParam.isCcxIniFeatureEnabled))
{
@@ -7829,16 +7847,15 @@
#ifdef WLAN_FEATURE_11W
//Check for 11w BIP
- else if ( eCSR_ENCRYPT_TYPE_AES_CMAC == pSetKey->encType )
+ else if (eCSR_ENCRYPT_TYPE_AES_CMAC == pSetKey->encType)
{
- tANI_U16 count = 0;
- if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
+ if (pSetKey->keyLength < CSR_AES_KEY_LEN)
{
- smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call", pSetKey->keyLength );
+ smsLog(pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call", pSetKey->keyLength);
break;
}
pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
- palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
+ palCopyMemory(pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN);
}
#endif
status = eHAL_STATUS_SUCCESS;
@@ -11878,6 +11895,19 @@
dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
pBuf += sizeof(tANI_U32);
+#ifdef WLAN_FEATURE_11W
+ //MgmtEncryption
+ if (pProfile->MFPEnabled)
+ {
+ dwTmp = pal_cpu_to_be32(eSIR_ED_AES_128_CMAC);
+ }
+ else
+ {
+ dwTmp = pal_cpu_to_be32(eSIR_ED_NONE);
+ }
+ palCopyMemory(pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32));
+ pBuf += sizeof(tANI_U32);
+#endif
#ifdef WLAN_FEATURE_VOWIFI_11R
pProfile->MDID.mdiePresent = pBssDescription->mdiePresent;
if (csrIsProfile11r( pProfile )
@@ -11912,6 +11942,9 @@
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
+#ifdef WLAN_FEATURE_11W
+ || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK_SHA256)
+#endif
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
&& (pMac->roam.configParam.isCcxIniFeatureEnabled))
{
@@ -11945,6 +11978,9 @@
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
+#ifdef WLAN_FEATURE_11W
+ || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK_SHA256)
+#endif
|| (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
&& (pMac->roam.configParam.isCcxIniFeatureEnabled))
{
diff --git a/CORE/SME/src/csr/csrUtil.c b/CORE/SME/src/csr/csrUtil.c
index 6d9e6a9..25bff95 100644
--- a/CORE/SME/src/csr/csrUtil.c
+++ b/CORE/SME/src/csr/csrUtil.c
@@ -2753,6 +2753,9 @@
#ifdef FEATURE_WLAN_CCX
case eCSR_AUTH_TYPE_CCKM_RSN:
#endif
+#ifdef WLAN_FEATURE_11W
+ case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
+#endif
fRSNProfile = TRUE;
break;
@@ -3410,7 +3413,7 @@
{
#ifdef WLAN_FEATURE_11W
return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[01], Oui ) ||
- csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[05], Oui ));
+ csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[06], Oui ));
#else
return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[01], Oui ) );
#endif
@@ -3427,6 +3430,15 @@
#endif
}
+#ifdef WLAN_FEATURE_11W
+static tANI_BOOLEAN csrIsAuthRSNPskSha256( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_RSN_OUI_SIZE],
+ tANI_U8 cAllSuites,
+ tANI_U8 Oui[] )
+{
+ return( csrIsOuiMatch( pMac, AllSuites, cAllSuites, csrRSNOui[06], Oui ) );
+}
+#endif
+
static tANI_BOOLEAN csrIsAuthWpa( tpAniSirGlobal pMac, tANI_U8 AllSuites[][CSR_WPA_OUI_SIZE],
tANI_U8 cAllSuites,
tANI_U8 Oui[] )
@@ -3636,6 +3648,13 @@
if (eCSR_AUTH_TYPE_RSN_PSK == pAuthType->authType[i])
negAuthType = eCSR_AUTH_TYPE_RSN_PSK;
}
+#ifdef WLAN_FEATURE_11W
+ if ((negAuthType == eCSR_AUTH_TYPE_UNKNOWN) && csrIsAuthRSNPskSha256( pMac, AuthSuites, cAuthSuites, Authentication ) )
+ {
+ if (eCSR_AUTH_TYPE_RSN_PSK_SHA256 == pAuthType->authType[i])
+ negAuthType = eCSR_AUTH_TYPE_RSN_PSK_SHA256;
+ }
+#endif
// The 1st auth type in the APs RSN IE, to match stations connecting
// profiles auth type will cause us to exit this loop
@@ -3676,9 +3695,12 @@
Capabilities->PreAuthSupported = (pRSNIe->RSN_Cap[0] >> 0) & 0x1 ; // Bit 0 PreAuthentication
Capabilities->NoPairwise = (pRSNIe->RSN_Cap[0] >> 1) & 0x1 ; // Bit 1 No Pairwise
Capabilities->PTKSAReplayCounter = (pRSNIe->RSN_Cap[0] >> 2) & 0x3 ; // Bit 2, 3 PTKSA Replay Counter
- Capabilities->GTKSAReplayCounter = (pRSNIe->RSN_Cap[0] >> 4) & 0x3 ; // Bit 4,5 GTKSA Replay Counter
- Capabilities->Reserved = (pRSNIe->RSN_Cap[0] >> 6) & 0x3 ; // remaining reserved
- Capabilities->Reserved = (Capabilities->Reserved >> 2) | (pRSNIe->RSN_Cap[1] & 0xff) ; // remaining reserved
+ Capabilities->GTKSAReplayCounter = (pRSNIe->RSN_Cap[0] >> 4) & 0x3 ; // Bit 4, 5 GTKSA Replay Counter
+#ifdef WLAN_FEATURE_11W
+ Capabilities->MFPRequired = (pRSNIe->RSN_Cap[0] >> 6) & 0x1 ; // Bit 6 MFPR
+ Capabilities->MFPCapable = (pRSNIe->RSN_Cap[0] >> 7) & 0x1 ; // Bit 7 MFPC
+#endif
+ Capabilities->Reserved = pRSNIe->RSN_Cap[1] & 0xff ; // remaining reserved
}
}
return( fAcceptableCyphers );
@@ -3798,7 +3820,12 @@
// !!REVIEW - What should STA put in RSN capabilities, currently
// just putting back APs capabilities
// For one, we shouldn't EVER be sending out "pre-auth supported". It is an AP only capability
+ // For another, we should use the Management Frame Protection values given by the supplicant
RSNCapabilities.PreAuthSupported = 0;
+#ifdef WLAN_FEATURE_11W
+ RSNCapabilities.MFPRequired = pProfile->MFPRequired;
+ RSNCapabilities.MFPCapable = pProfile->MFPCapable;
+#endif
*(tANI_U16 *)( &pAuthSuite->AuthOui[ 1 ] ) = *((tANI_U16 *)(&RSNCapabilities));
pPMK = (tCsrRSNPMKIe *)( ((tANI_U8 *)(&pAuthSuite->AuthOui[ 1 ])) + sizeof(tANI_U16) );
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index f19da09..d2d10ff 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -118,6 +118,11 @@
tANI_BOOLEAN csrIsScanAllowed(tpAniSirGlobal pMac);
#endif
+#ifdef WLAN_FEATURE_11W
+eHalStatus sme_UnprotectedMgmtFrmInd( tHalHandle hHal,
+ tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm );
+#endif
+
//Internal SME APIs
eHalStatus sme_AcquireGlobalLock( tSmeStruct *psSme)
{
@@ -1400,6 +1405,34 @@
#endif // WLAN_FEATURE_PACKET_FILTERING
+#ifdef WLAN_FEATURE_11W
+/*------------------------------------------------------------------
+ *
+ * Handle the unprotected management frame indication from LIM and
+ * forward it to HDD.
+ *
+ *------------------------------------------------------------------*/
+
+eHalStatus sme_UnprotectedMgmtFrmInd( tHalHandle hHal,
+ tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tCsrRoamInfo pRoamInfo = {0};
+ tANI_U32 SessionId = pSmeMgmtFrm->sessionId;
+
+ pRoamInfo.nFrameLength = pSmeMgmtFrm->frameLen;
+ pRoamInfo.pbFrames = pSmeMgmtFrm->frameBuf;
+ pRoamInfo.frameType = pSmeMgmtFrm->frameType;
+
+ /* forward the mgmt frame to HDD */
+ csrRoamCallCallback(pMac, SessionId, &pRoamInfo, 0, eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
+
+ return status;
+}
+#endif
+
+
/*--------------------------------------------------------------------------
\brief sme_ProcessMsg() - The main message processor for SME.
@@ -1708,6 +1741,20 @@
}
#endif
+#ifdef WLAN_FEATURE_11W
+ case eWNI_SME_UNPROT_MGMT_FRM_IND:
+ if (pMsg->bodyptr)
+ {
+ sme_UnprotectedMgmtFrmInd(pMac, pMsg->bodyptr);
+ vos_mem_free(pMsg->bodyptr);
+ }
+ else
+ {
+ smsLog(pMac, LOGE, "Empty rsp message for meas (eWNI_SME_UNPROT_MGMT_FRM_IND), nothing to process");
+ }
+ break;
+#endif
+
default:
if ( ( pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN )
diff --git a/CORE/SYS/legacy/src/utils/src/dot11f.c b/CORE/SYS/legacy/src/utils/src/dot11f.c
index fbc2ab8..cd4dbc0 100644
--- a/CORE/SYS/legacy/src/utils/src/dot11f.c
+++ b/CORE/SYS/legacy/src/utils/src/dot11f.c
@@ -949,6 +949,16 @@
#define SigFfTimeStamp ( 0x001f )
+void dot11fUnpackFfTransactionId(tpAniSirGlobal pCtx,
+ tANI_U8 *pBuf,
+ tDot11fFfTransactionId *pDst)
+{
+ DOT11F_MEMCPY(pCtx, pDst->transId, pBuf, 2);
+ (void)pCtx;
+} /* End dot11fUnpackFfTransactionId. */
+
+#define SigFfTransactionId ( 0x0020 )
+
void dot11fUnpackFfTxAntennaId(tpAniSirGlobal pCtx,
tANI_U8 *pBuf,
tDot11fFfTxAntennaId *pDst)
@@ -957,7 +967,7 @@
(void)pCtx;
} /* End dot11fUnpackFfTxAntennaId. */
-#define SigFfTxAntennaId ( 0x0020 )
+#define SigFfTxAntennaId ( 0x0021 )
void dot11fUnpackFfTxPower(tpAniSirGlobal pCtx,
tANI_U8 *pBuf,
@@ -967,7 +977,7 @@
(void)pCtx;
} /* End dot11fUnpackFfTxPower. */
-#define SigFfTxPower ( 0x0021 )
+#define SigFfTxPower ( 0x0022 )
tANI_U32 dot11fUnpackTlvAuthorizedMACs(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U16 tlvlen, tDot11fTLVAuthorizedMACs *pDst)
{
@@ -17764,6 +17774,41 @@
} /* End dot11fUnpackSMPowerSave. */
+ static const tFFDefn FFS_SaQueryRsp[] = {
+ { "Category", offsetof(tDot11fSaQueryRsp, Category), SigFfCategory , DOT11F_FF_CATEGORY_LEN, },
+ { "Action", offsetof(tDot11fSaQueryRsp, Action), SigFfAction , DOT11F_FF_ACTION_LEN, },
+ { "TransactionId", offsetof(tDot11fSaQueryRsp, TransactionId), SigFfTransactionId , DOT11F_FF_TRANSACTIONID_LEN, },
+ { NULL, 0, 0, 0,},
+ };
+
+ static const tIEDefn IES_SaQueryRsp[] = {
+ {0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, }, };
+
+tANI_U32 dot11fUnpackSaQueryRsp(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U32 nBuf, tDot11fSaQueryRsp *pFrm)
+{
+ tANI_U32 i = 0;
+ tANI_U32 status = 0;
+ status = UnpackCore(pCtx, pBuf, nBuf, FFS_SaQueryRsp, IES_SaQueryRsp, ( tANI_U8* )pFrm, sizeof(*pFrm));
+
+ (void)i;
+# ifdef DOT11F_DUMP_FRAMES
+ if (!DOT11F_FAILED(status))
+ {
+ FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), FRFL("Unpacked the SaQueryRsp:\n"));
+ FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), pBuf, nBuf);
+ FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), FRFL("to:\n"));
+ FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), FRFL("Category:\n"));
+ FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), ( tANI_U8* )&pFrm->Category.category, 1);
+ FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), FRFL("Action:\n"));
+ FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), ( tANI_U8* )&pFrm->Action.action, 1);
+ FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), FRFL("TransactionId:\n"));
+ FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), ( tANI_U8* )&pFrm->TransactionId.transId, 2);
+ }
+# endif // DOT11F_DUMP_FRAMES
+ return status;
+
+} /* End dot11fUnpackSaQueryRsp. */
+
static const tFFDefn FFS_TDLSDisReq[] = {
{ "Category", offsetof(tDot11fTDLSDisReq, Category), SigFfCategory , DOT11F_FF_CATEGORY_LEN, },
{ "Action", offsetof(tDot11fTDLSDisReq, Action), SigFfAction , DOT11F_FF_ACTION_LEN, },
@@ -19861,6 +19906,9 @@
case SigFfTimeStamp:
dot11fUnpackFfTimeStamp(pCtx, pBufRemaining, ( tDot11fFfTimeStamp* )(pFrm + pFf->offset ));
break;
+ case SigFfTransactionId:
+ dot11fUnpackFfTransactionId(pCtx, pBufRemaining, ( tDot11fFfTransactionId* )(pFrm + pFf->offset ));
+ break;
case SigFfTxAntennaId:
dot11fUnpackFfTxAntennaId(pCtx, pBufRemaining, ( tDot11fFfTxAntennaId* )(pFrm + pFf->offset ));
break;
@@ -21840,6 +21888,14 @@
return status;
} /* End dot11fGetPackedSMPowerSaveSize. */
+tANI_U32 dot11fGetPackedSaQueryRspSize(tpAniSirGlobal pCtx, tDot11fSaQueryRsp *pFrm, tANI_U32 *pnNeeded)
+{
+ tANI_U32 status = 0;
+ *pnNeeded = 4;
+ status = GetPackedSizeCore(pCtx, ( tANI_U8* )pFrm, pnNeeded, IES_SaQueryRsp);
+ return status;
+} /* End dot11fGetPackedSaQueryRspSize. */
+
tANI_U32 dot11fGetPackedTDLSDisReqSize(tpAniSirGlobal pCtx, tDot11fTDLSDisReq *pFrm, tANI_U32 *pnNeeded)
{
tANI_U32 status = 0;
@@ -23158,6 +23214,14 @@
(void)pCtx;
} /* End dot11fPackFfTimeStamp. */
+void dot11fPackFfTransactionId(tpAniSirGlobal pCtx,
+ tDot11fFfTransactionId *pSrc,
+ tANI_U8 *pBuf)
+{
+ DOT11F_MEMCPY(pCtx, pBuf, pSrc->transId, 2);
+ (void)pCtx;
+} /* End dot11fPackFfTransactionId. */
+
void dot11fPackFfTxAntennaId(tpAniSirGlobal pCtx,
tDot11fFfTxAntennaId *pSrc,
tANI_U8 *pBuf)
@@ -42387,6 +42451,32 @@
} /* End dot11fUnpackSMPowerSave. */
+tANI_U32 dot11fPackSaQueryRsp(tpAniSirGlobal pCtx, tDot11fSaQueryRsp *pFrm, tANI_U8 *pBuf, tANI_U32 nBuf, tANI_U32 *pnConsumed)
+{
+ tANI_U32 i = 0;
+ tANI_U32 status = 0;
+ (void)i;
+ *pnConsumed = 0U;
+ status = PackCore(pCtx, (tANI_U8*)pFrm, pBuf, nBuf, pnConsumed, FFS_SaQueryRsp, IES_SaQueryRsp);
+
+# ifdef DOT11F_DUMP_FRAMES
+ if (!DOT11F_FAILED(status))
+ {
+ FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), FRFL("Packed the SaQueryRsp:\n"));
+ FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), FRFL("Category:\n"));
+ FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), ( tANI_U8* )&pFrm->Category.category, 1);
+ FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), FRFL("Action:\n"));
+ FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), ( tANI_U8* )&pFrm->Action.action, 1);
+ FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), FRFL("TransactionId:\n"));
+ FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), ( tANI_U8* )&pFrm->TransactionId.transId, 2);
+ FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), FRFL("to:\n"));
+ FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_SAQUERYRSP), pBuf, nBuf);
+ }
+# endif // DOT11F_DUMP_FRAMES
+ return status;
+
+} /* End dot11fUnpackSaQueryRsp. */
+
tANI_U32 dot11fPackTDLSDisReq(tpAniSirGlobal pCtx, tDot11fTDLSDisReq *pFrm, tANI_U8 *pBuf, tANI_U32 nBuf, tANI_U32 *pnConsumed)
{
tANI_U32 i = 0;
@@ -44281,6 +44371,9 @@
case SigFfTimeStamp:
dot11fPackFfTimeStamp(pCtx, (tDot11fFfTimeStamp* )(pSrc + pFf->offset), pBufRemaining);
break;
+ case SigFfTransactionId:
+ dot11fPackFfTransactionId(pCtx, (tDot11fFfTransactionId* )(pSrc + pFf->offset), pBufRemaining);
+ break;
case SigFfTxAntennaId:
dot11fPackFfTxAntennaId(pCtx, (tDot11fFfTxAntennaId* )(pSrc + pFf->offset), pBufRemaining);
break;
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 01cbe3e..658a0aa 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -499,6 +499,7 @@
// FIXME Temporary value for R33D integaration
//#define WDA_TL_TX_FRAME_TIMEOUT 20000 /* in msec a very high upper limit */
+#define DPU_FEEDBACK_UNPROTECTED_ERROR 0x0F
/* ---------------------------------------------------------------------------
@@ -695,7 +696,10 @@
/* WDA_GETRSSI1 ***************************************************************/
# define WDA_GETRSSI1(pRxMeta) (((WDI_DS_RxMetaInfoType*)(pRxMeta))->rssi1)
-
+/* WDA_GET_RX_RMF *****************************************************/
+#ifdef WLAN_FEATURE_11W
+# define WDA_GET_RX_RMF(pRxMeta) (((WDI_DS_RxMetaInfoType*)(pRxMeta))->rmf)
+#endif
/* --------------------------------------------------------------------*/
@@ -886,6 +890,9 @@
#define WDA_TIMER_ADC_RSSI_STATS SIR_HAL_TIMER_ADC_RSSI_STATS
#define WDA_TIMER_TRAFFIC_STATS_IND SIR_HAL_TRAFFIC_STATS_IND
+#ifdef WLAN_FEATURE_11W
+#define WDA_EXCLUDE_UNENCRYPTED_IND SIR_HAL_EXCLUDE_UNENCRYPTED_IND
+#endif
#ifdef FEATURE_WLAN_CCX
#define WDA_TSM_STATS_REQ SIR_HAL_TSM_STATS_REQ
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 830a5ef..3eaa518 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -3642,6 +3642,8 @@
wdiBssParams->ucCurrentExtChannel = wdaBssParams->currentExtChannel ;
wdiBssParams->bHiddenSSIDEn = wdaBssParams->bHiddenSSIDEn ;
+ wdiBssParams->ucRMFEnabled = wdaBssParams->rmfEnabled;
+
/* copy SSID into WDI structure */
wdiBssParams->wdiSSID.ucLength = wdaBssParams->ssId.length ;
vos_mem_copy(wdiBssParams->wdiSSID.sSSID,
@@ -7425,6 +7427,42 @@
return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
}
+#ifdef WLAN_FEATURE_11W
+/*
+ * FUNCTION: WDA_ProcessExcludeUnecryptInd
+ *
+ */
+VOS_STATUS WDA_ProcessExcludeUnecryptInd(tWDA_CbContext *pWDA,
+ tSirWlanExcludeUnencryptParam *pExclUnencryptParam)
+{
+ WDI_Status wdiStatus;
+ WDI_ExcludeUnencryptIndType wdiExclUnencryptParams;
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "------> %s ", __func__);
+
+ wdiExclUnencryptParams.bExcludeUnencrypt = pExclUnencryptParam->excludeUnencrypt;
+ vos_mem_copy(wdiExclUnencryptParams.bssid, pExclUnencryptParam->bssId,
+ sizeof(tSirMacAddr));
+
+ wdiExclUnencryptParams.wdiReqStatusCB = NULL;
+ wdiExclUnencryptParams.pUserData = pWDA;
+
+ wdiStatus = WDI_ExcludeUnencryptedInd(&wdiExclUnencryptParams);
+ if(WDI_STATUS_PENDING == wdiStatus)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "Pending received for %s:%d ", __func__, __LINE__ );
+ }
+ else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus )
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure in %s:%d ", __func__, __LINE__ );
+ }
+ vos_mem_free(pExclUnencryptParam);
+ return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
+}
+#endif
+
/*
* FUNCTION: WDA_ProcessWlanResumeCallback
*
@@ -10267,6 +10305,13 @@
break;
}
#endif
+#ifdef WLAN_FEATURE_11W
+ case WDA_EXCLUDE_UNENCRYPTED_IND:
+ {
+ WDA_ProcessExcludeUnecryptInd(pWDA, (tSirWlanExcludeUnencryptParam *)pMsg->bodyptr);
+ break;
+ }
+#endif
default:
{
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index 6ed59f0..0be0244 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -4081,6 +4081,23 @@
void* pUserData;
}WDI_TrafficStatsIndType;
+#ifdef WLAN_FEATURE_11W
+typedef struct
+{
+
+ wpt_boolean bExcludeUnencrypt;
+ wpt_macAddr bssid;
+ /*Request status callback offered by UMAC - it is called if the current
+ req has returned PENDING as status; it delivers the status of sending
+ the message over the BUS */
+ WDI_ReqStatusCb wdiReqStatusCB;
+
+ /*The user data passed in by UMAC, it will be sent back when the above
+ function pointer will be called */
+ void* pUserData;
+}WDI_ExcludeUnencryptIndType;
+#endif
+
/*---------------------------------------------------------------------------
WDI_WlanResumeInfoType
---------------------------------------------------------------------------*/
@@ -8892,6 +8909,24 @@
WDI_TrafficStatsIndType *pWdiTrafficStatsIndParams
);
+#ifdef WLAN_FEATURE_11W
+/**
+ @brief WDI_ExcludeUnencryptedInd
+ Register with HAL to receive/drop unencrypted frames
+
+ @param WDI_ExcludeUnencryptIndType
+
+ @see
+
+ @return Status of the request
+*/
+WDI_Status
+WDI_ExcludeUnencryptedInd
+(
+ WDI_ExcludeUnencryptIndType *pWdiExcUnencParams
+);
+#endif
+
#ifdef FEATURE_WLAN_SCAN_PNO
/**
@brief WDI_SetPreferredNetworkList
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h b/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h
index c42975a..646ab57 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_dp.h
@@ -346,6 +346,10 @@
#define WDI_RX_BD_GET_PMICMD_24TO25(_pvBDHeader) (((WDI_RxBdType*)_pvBDHeader)->pmiCmd24to25)
+#ifdef WLAN_FEATURE_11W
+#define WDI_RX_BD_GET_RMF( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->rmf)
+#endif
+
#define WDI_RX_BD_ASF_SET 1 /*The value of the field when set and pkt is AMSDU*/
#define WDI_RX_BD_FSF_SET 1
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
index ea68ff5..e2fab24 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
@@ -453,6 +453,9 @@
/* Send a traffic stats indication to HAL */
WDI_TRAFFIC_STATS_IND,
+ /* Drop/Receive unencrypted frames indication to HAL */
+ WDI_EXCLUDE_UNENCRYPTED_IND,
+
/*Keep adding the indications to the max request
such that we keep them sepparate */
@@ -2726,6 +2729,26 @@
WDI_ControlBlockType* pWDICtx,
WDI_EventInfoType* pEventData
);
+
+#ifdef WLAN_FEATURE_11W
+/**
+ @brief Process Exclude Unencrypted Indications function (called
+ when Main FSM allows it)
+
+ @param pWDICtx: pointer to the WLAN DAL context
+ pEventData: pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessExcludeUnencryptInd
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+#endif
+
/*========================================================================
Main DAL Control Path Response Processing API
========================================================================*/
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index e1ee775..7c84047 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -354,6 +354,11 @@
-------------------------------------------------------------------------*/
WDI_ProcessHostSuspendInd, /* WDI_HOST_SUSPEND_IND*/
WDI_ProcessTrafficStatsInd, /* WDI_TRAFFIC_STATS_IND*/
+#ifdef WLAN_FEATURE_11W
+ WDI_ProcessExcludeUnencryptInd, /* WDI_EXCLUDE_UNENCRYPTED_IND */
+#else
+ NULL,
+#endif
};
@@ -854,6 +859,9 @@
CASE_RETURN_STRING( WDI_SET_POWER_PARAMS_REQ );
CASE_RETURN_STRING( WDI_TRAFFIC_STATS_IND );
CASE_RETURN_STRING( WDI_GET_ROAM_RSSI_REQ );
+#ifdef WLAN_FEATURE_11W
+ CASE_RETURN_STRING( WDI_EXCLUDE_UNENCRYPTED_IND );
+#endif
default:
return "Unknown WDI MessageId";
}
@@ -5707,6 +5715,52 @@
}/*WDI_TrafficStatsInd*/
+#ifdef WLAN_FEATURE_11W
+/**
+ @brief WDI_ExcludeUnencryptedInd
+ Register with HAL to receive/drop unencrypted frames
+
+ @param WDI_ExcludeUnencryptIndType
+
+ @see
+
+ @return Status of the request
+*/
+WDI_Status
+WDI_ExcludeUnencryptedInd
+(
+ WDI_ExcludeUnencryptIndType *pWdiExcUnencParams
+)
+{
+
+ WDI_EventInfoType wdiEventData;
+ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+ /*------------------------------------------------------------------------
+ Sanity Check
+ ------------------------------------------------------------------------*/
+ if ( eWLAN_PAL_FALSE == gWDIInitialized )
+ {
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "WDI API call before module is initialized - Fail request");
+
+ return WDI_STATUS_E_NOT_ALLOWED;
+ }
+
+ /*------------------------------------------------------------------------
+ Fill in Event data and post to the Main FSM
+ ------------------------------------------------------------------------*/
+ wdiEventData.wdiRequest = WDI_EXCLUDE_UNENCRYPTED_IND;
+ wdiEventData.pEventData = pWdiExcUnencParams;
+ wdiEventData.uEventDataSize = sizeof(*pWdiExcUnencParams);
+ wdiEventData.pCBfnc = NULL;
+ wdiEventData.pUserData = NULL;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+
+}/*WDI_TrafficStatsInd*/
+#endif
+
/**
@brief WDI_HALDumpCmdReq
Post HAL DUMP Command Event
@@ -10511,6 +10565,78 @@
return ( wdiStatus != WDI_STATUS_SUCCESS )?wdiStatus:WDI_STATUS_SUCCESS_SYNC;
}/*WDI_ProcessTrafficStatsInd*/
+#ifdef WLAN_FEATURE_11W
+/**
+ @brief Process Exclude Unencrypted Indications function (called
+ when Main FSM allows it)
+
+ @param pWDICtx: pointer to the WLAN DAL context
+ pEventData: pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessExcludeUnencryptInd
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_ExcludeUnencryptIndType* pWDIExcUnencIndParams;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usDataOffset = 0;
+ wpt_uint16 usSendSize = 0;
+ WDI_Status wdiStatus;
+ tHalWlanExcludeUnEncryptedIndParam* pHalExcUnencIndParams;
+ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+ /*-------------------------------------------------------------------------
+ Sanity check
+ -------------------------------------------------------------------------*/
+ if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters in Exclude Unencrypted ind",__func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ pWDIExcUnencIndParams = (WDI_ExcludeUnencryptIndType *)pEventData->pEventData;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+ WDI_EXCLUDE_UNENCRYPTED_IND,
+ sizeof(tHalWlanExcludeUnEncryptedIndParam),
+ &pSendBuffer, &usDataOffset, &usSendSize))||
+ (usSendSize < (usDataOffset + sizeof(tHalWlanExcludeUnEncryptedIndParam))))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_FATAL,
+ "Unable to get send buffer in Exclude Unencrypted Ind ");
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ pHalExcUnencIndParams = (tHalWlanExcludeUnEncryptedIndParam*)(pSendBuffer+usDataOffset);
+
+ pHalExcUnencIndParams->bDot11ExcludeUnencrypted = pWDIExcUnencIndParams->bExcludeUnencrypt;
+
+ wpalMemoryCopy(pHalExcUnencIndParams->bssId,
+ pWDIExcUnencIndParams->bssid, WDI_MAC_ADDR_LEN);
+
+ /*-------------------------------------------------------------------------
+ Send Suspend Request to HAL
+ -------------------------------------------------------------------------*/
+ pWDICtx->wdiReqStatusCB = pWDIExcUnencIndParams->wdiReqStatusCB;
+ pWDICtx->pReqStatusUserData = pWDIExcUnencIndParams->pUserData;
+
+ wdiStatus = WDI_SendIndication( pWDICtx, pSendBuffer, usSendSize);
+ return ( wdiStatus != WDI_STATUS_SUCCESS )?wdiStatus:WDI_STATUS_SUCCESS_SYNC;
+}/*WDI_ProcessExcludeUnencryptInd*/
+#endif
+
/*==========================================================================
MISC CONTROL PROCESSING REQUEST API
==========================================================================*/
@@ -21620,6 +21746,10 @@
return WLAN_HAL_HOST_SUSPEND_IND;
case WDI_TRAFFIC_STATS_IND:
return WLAN_HAL_CLASS_B_STATS_IND;
+#ifdef WLAN_FEATURE_11W
+ case WDI_EXCLUDE_UNENCRYPTED_IND:
+ return WLAN_HAL_EXCLUDE_UNENCRYPTED_IND;
+#endif
case WDI_KEEP_ALIVE_REQ:
return WLAN_HAL_KEEP_ALIVE_REQ;
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi_dp.c b/CORE/WDI/CP/src/wlan_qct_wdi_dp.c
index 6e21572..36e2b8e 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi_dp.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi_dp.c
@@ -840,7 +840,25 @@
if(!ucUnicastDst)
pBd->dpuDescIdx = pSta->bcastMgmtDpuIndex; /* IGTK */
else
- pBd->dpuDescIdx = pSta->dpuIndex; /* PTK */
+ {
+ wpt_uint8 peerStaId;
+
+ //We need to find the peer's station's DPU index to send this
+ //frame using PTK
+ wdiStatus = WDI_STATableFindStaidByAddr( pWDICtx,
+ *(wpt_macAddr*)pDestMacAddr, &peerStaId );
+ if (WDI_STATUS_SUCCESS != wdiStatus)
+ {
+ WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s failed to find peer sta %02X-%02X-%02X-%02X-%02X-%02X",
+ __FUNCTION__, ((wpt_uint8 *)pDestMacAddr)[0],
+ ((wpt_uint8 *)pDestMacAddr)[1], ((wpt_uint8 *)pDestMacAddr)[5],
+ ((wpt_uint8 *)pDestMacAddr)[3], ((wpt_uint8 *)pDestMacAddr)[4],
+ ((wpt_uint8 *)pDestMacAddr)[5]);
+ return WDI_STATUS_E_FAILURE;
+ }
+ pBd->dpuDescIdx = ((WDI_StaStruct*)pWDICtx->staTable)[peerStaId].dpuIndex; /* PTK */
+ }
}
else
{
diff --git a/CORE/WDI/DP/inc/wlan_qct_wdi_ds.h b/CORE/WDI/DP/inc/wlan_qct_wdi_ds.h
index 1b9f125..c23d2cb 100644
--- a/CORE/WDI/DP/inc/wlan_qct_wdi_ds.h
+++ b/CORE/WDI/DP/inc/wlan_qct_wdi_ds.h
@@ -162,6 +162,10 @@
wpt_uint32 rssi0;
wpt_uint32 rssi1;
+
+#ifdef WLAN_FEATURE_11W
+ wpt_uint32 rmf:1;
+#endif
} WDI_DS_RxMetaInfoType;
typedef struct sPktMetaInfo
diff --git a/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c b/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c
index 040996f..1c9b4e7 100644
--- a/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c
+++ b/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c
@@ -611,6 +611,9 @@
pRxMetadata->rateIndex = WDI_RX_BD_GET_RATEINDEX(pBDHeader);
pRxMetadata->rxpFlags = WDI_RX_BD_GET_RXPFLAGS(pBDHeader);
pRxMetadata->mclkRxTimestamp = WDI_RX_BD_GET_TIMESTAMP(pBDHeader);
+#ifdef WLAN_FEATURE_11W
+ pRxMetadata->rmf = WDI_RX_BD_GET_RMF(pBDHeader);
+#endif
/* typeSubtype in BD doesn't look like correct. Fill from frame ctrl
TL does it for Volans but TL does not know BD for Prima. WDI should do it */