diff options
| author | Leela Venkata Kiran Kumar Reddy Chirala <kchirala@qca.qualcomm.com> | 2014-06-16 23:03:04 -0700 |
|---|---|---|
| committer | Pitani Venkata Rajesh Kumar <c_vpitan@qti.qualcomm.com> | 2014-07-09 12:13:21 +0530 |
| commit | ec9f730119e9aaf98c91e7d4a9506d5de986663e (patch) | |
| tree | abd71b1d255b2ead080ea02bc18748ba68e109e6 | |
| parent | b18f94228f714d319624af79692c10d3a7f2ea96 (diff) | |
WLAN:CORESTACK:Add support for roam offload feature in MAC/SME
Add support for ini param and init params in core stack
Change-Id: I20cf3e8c73f4fe5bd8451a6b392de4be361610bf
CRs-fixed: 682509
| -rw-r--r-- | CORE/MAC/inc/sirApi.h | 39 | ||||
| -rw-r--r-- | CORE/SME/inc/csrApi.h | 19 | ||||
| -rw-r--r-- | CORE/SME/inc/csrInternal.h | 4 | ||||
| -rw-r--r-- | CORE/SME/inc/sme_Api.h | 26 | ||||
| -rw-r--r-- | CORE/SME/src/csr/csrApiRoam.c | 89 | ||||
| -rw-r--r-- | CORE/SME/src/csr/csrInsideApi.h | 12 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_Api.c | 58 |
7 files changed, 242 insertions, 5 deletions
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h index 470746128a38..54eb1c5dd3bd 100644 --- a/CORE/MAC/inc/sirApi.h +++ b/CORE/MAC/inc/sirApi.h @@ -173,6 +173,21 @@ typedef enum #endif /* FEATURE_WLAN_EXTSCAN */ +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +#define SIR_KRK_KEY_LEN 16 +#define SIR_BTK_KEY_LEN 32 + +#define SIR_UAPSD_BITOFFSET_ACVO 0 +#define SIR_UAPSD_BITOFFSET_ACVI 1 +#define SIR_UAPSD_BITOFFSET_ACBK 2 +#define SIR_UAPSD_BITOFFSET_ACBE 3 + +#define SIR_UAPSD_FLAG_ACVO (1 << SIR_UAPSD_BITOFFSET_ACVO) +#define SIR_UAPSD_FLAG_ACVI (1 << SIR_UAPSD_BITOFFSET_ACVI) +#define SIR_UAPSD_FLAG_ACBK (1 << SIR_UAPSD_BITOFFSET_ACBK) +#define SIR_UAPSD_FLAG_ACBE (1 << SIR_UAPSD_BITOFFSET_ACBE) +#define SIR_UAPSD_GET(ac, mask) (((mask) & (SIR_UAPSD_FLAG_ ## ac)) >> SIR_UAPSD_BITOFFSET_ ## ac) +#endif enum eSirHostMsgTypes { SIR_HAL_APP_SETUP_NTF = SIR_HAL_HOST_MSG_START, @@ -3626,6 +3641,9 @@ typedef struct sSirUpdateAPWPARSNIEsReq #define SIR_ROAM_SCAN_RESERVED_BYTES 61 #endif //WLAN_FEATURE_ROAM_SCAN_OFFLOAD +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +#define SIR_ROAM_SCAN_PSK_SIZE 32 +#endif // SME -> HAL - This is the host offload request. #define SIR_IPV4_ARP_REPLY_OFFLOAD 0 #define SIR_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD 1 @@ -3903,6 +3921,16 @@ typedef struct } tSirPrefNetworkFoundInd, *tpSirPrefNetworkFoundInd; #endif //FEATURE_WLAN_SCAN_PNO +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +typedef struct { + tANI_U8 acvo_uapsd: 1; + tANI_U8 acvi_uapsd: 1; + tANI_U8 acbk_uapsd: 1; + tANI_U8 acbe_uapsd: 1; + tANI_U8 reserved: 4; +} tSirAcUapsd, *tpSirAcUapsd; +#endif + #ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD typedef struct { @@ -3970,6 +3998,17 @@ typedef struct sSirRoamOffloadScanReq tANI_U8 RoamBmissFinalBcnt; tANI_U8 RoamBeaconRssiWeight; eSirDFSRoamScanMode allowDFSChannelRoam; +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + tANI_U8 RoamOffloadEnabled; + tANI_U8 PSK[SIR_ROAM_SCAN_PSK_SIZE]; + tANI_U8 Prefer5GHz; + tANI_U8 RoamRssiCatGap; + tANI_U8 Select5GHzMargin; + tANI_U8 KRK[SIR_KRK_KEY_LEN]; + tANI_U8 BTK[SIR_BTK_KEY_LEN]; + tANI_U32 ReassocFailureTimeout; + tSirAcUapsd AcUapsd; +#endif } tSirRoamOffloadScanReq, *tpSirRoamOffloadScanReq; #endif //WLAN_FEATURE_ROAM_SCAN_OFFLOAD diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h index 26809678300e..f9b9fc7e7d78 100644 --- a/CORE/SME/inc/csrApi.h +++ b/CORE/SME/inc/csrApi.h @@ -92,6 +92,9 @@ typedef enum #endif /* FEATURE_WLAN_WAPI */ #ifdef FEATURE_WLAN_ESE eCSR_ENCRYPT_TYPE_KRK, +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + eCSR_ENCRYPT_TYPE_BTK, +#endif #endif /* FEATURE_WLAN_ESE */ #ifdef WLAN_FEATURE_11W //11w BIP @@ -229,7 +232,6 @@ typedef enum #endif - typedef struct tagCsrChannelInfo { tANI_U8 numOfChannels; @@ -347,7 +349,10 @@ typedef struct tagCsrEseCckmInfo { tANI_U32 reassoc_req_num; tANI_BOOLEAN krk_plumbed; - tANI_U8 krk[CSR_KRK_KEY_LEN]; + tANI_U8 krk[SIR_KRK_KEY_LEN]; +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + tANI_U8 btk[SIR_BTK_KEY_LEN]; +#endif } tCsrEseCckmInfo; #endif @@ -1207,6 +1212,10 @@ typedef struct tagCsrConfigParam tANI_U8 cc_switch_mode; #endif tANI_U8 allowDFSChannelRoam; +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + tANI_BOOLEAN isRoamOffloadEnabled; +#endif + }tCsrConfigParam; //Tush @@ -1214,6 +1223,12 @@ typedef struct tagCsrUpdateConfigParam { tCsr11dinfo Csr11dinfo; }tCsrUpdateConfigParam; +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +#define csrRoamIsRoamOffloadEnabled(pMac)\ + (pMac->roam.configParam.isRoamOffloadEnabled) + +#define DEFAULT_REASSOC_FAILURE_TIMEOUT 1000 +#endif #ifdef WLAN_FEATURE_ROAM_OFFLOAD #define CSR_ROAM_AUTH_STATUS_CONNECTED 0x1 /** connected, diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h index ab1e179c3ec8..01b66cc089a6 100644 --- a/CORE/SME/inc/csrInternal.h +++ b/CORE/SME/inc/csrInternal.h @@ -690,6 +690,9 @@ typedef struct tagCsrConfig tANI_U8 cc_switch_mode; #endif tANI_U8 allowDFSChannelRoam; +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + tANI_BOOLEAN isRoamOffloadEnabled; +#endif }tCsrConfig; typedef struct tagCsrChannelPowerInfo @@ -1015,6 +1018,7 @@ typedef struct tagCsrRoamSession #endif #ifdef WLAN_FEATURE_ROAM_OFFLOAD tCsrRoamOffloadSynchStruct roamOffloadSynchParams; + tANI_U8 psk[SIR_ROAM_SCAN_PSK_SIZE]; #endif } tCsrRoamSession; diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h index 6d73a75aabbf..1dff4c3b8013 100644 --- a/CORE/SME/inc/sme_Api.h +++ b/CORE/SME/inc/sme_Api.h @@ -840,6 +840,18 @@ eHalStatus sme_RoamFreeConnectProfile(tHalHandle hHal, eHalStatus sme_RoamSetPMKIDCache( tHalHandle hHal, tANI_U8 sessionId, tPmkidCacheInfo *pPMKIDCache, tANI_U32 numItems ); +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +/* --------------------------------------------------------------------------- + * \fn sme_RoamSetPSK + * \brief a wrapper function to request CSR to save PSK + * This is a synchronous call. + * \param hHal - Global structure + * \param sessionId - SME sessionId + * \param pPSK - pointer to an array of Psk[] + *\return eHalStatus -status whether PSK is set or not + * ---------------------------------------------------------------------------*/ +eHalStatus sme_RoamSetPSK ( tHalHandle hHal, tANI_U8 sessionId, tANI_U8 *pPSK ); +#endif /* --------------------------------------------------------------------------- \fn sme_RoamGetSecurityReqIE \brief a wrapper function to request CSR to return the WPA or RSN or WAPI IE CSR @@ -3785,7 +3797,6 @@ eHalStatus sme_ExtScanRegisterCallback (tHalHandle hHal, \param hHal - The handle returned by macOpen. \return eHalStatus ---------------------------------------------------------------------------*/ - eHalStatus sme_abortRoamScan(tHalHandle hHal); #endif //#if WLAN_FEATURE_ROAM_SCAN_OFFLOAD @@ -3837,4 +3848,17 @@ eHalStatus sme_SetLinkLayerStatsIndCB #endif /* WLAN_FEATURE_LINK_LAYER_STATS */ +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +/*-------------------------------------------------------------------------- + \brief sme_UpdateRoamOffloadEnabled() - enable/disable roam offload feature + This is a synchronous call + \param hHal - The handle returned by macOpen. + \param nRoamOffloadEnabled - The boolean to update with + \return eHAL_STATUS_SUCCESS - SME update config successfully. + Other status means SME is failed to update. + \sa + --------------------------------------------------------------------------*/ +eHalStatus sme_UpdateRoamOffloadEnabled(tHalHandle hHal, + v_BOOL_t nRoamOffloadEnabled); +#endif #endif //#if !defined( __SME_API_H ) diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c index 866184ae7db0..ce6a211ffe1e 100644 --- a/CORE/SME/src/csr/csrApiRoam.c +++ b/CORE/SME/src/csr/csrApiRoam.c @@ -843,7 +843,12 @@ eHalStatus csrRoamCopyConnectProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tC { vos_mem_copy (pProfile->eseCckmInfo.krk, pSession->connectedProfile.eseCckmInfo.krk, - CSR_KRK_KEY_LEN); + SIR_KRK_KEY_LEN); +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + vos_mem_copy (pProfile->eseCckmInfo.btk, + pSession->connectedProfile.eseCckmInfo.btk, + SIR_BTK_KEY_LEN); +#endif pProfile->eseCckmInfo.reassoc_req_num= pSession->connectedProfile.eseCckmInfo.reassoc_req_num; pProfile->eseCckmInfo.krk_plumbed = @@ -1857,6 +1862,10 @@ eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pPa pMac->roam.configParam.cc_switch_mode = pParam->cc_switch_mode; #endif pMac->roam.configParam.allowDFSChannelRoam = pParam->allowDFSChannelRoam; +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + pMac->roam.configParam.isRoamOffloadEnabled = + pParam->isRoamOffloadEnabled; +#endif } return status; @@ -1999,6 +2008,10 @@ eHalStatus csrGetConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam) pMac->roam.configParam.allowDFSChannelRoam; pParam->nInitialDwellTime = pMac->roam.configParam.nInitialDwellTime; +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + pParam->isRoamOffloadEnabled = + pMac->roam.configParam.isRoamOffloadEnabled; +#endif csrSetChannels(pMac, pParam); status = eHAL_STATUS_SUCCESS; @@ -8834,6 +8847,20 @@ static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessi status = eHAL_STATUS_SUCCESS; break; } +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + else if (eCSR_ENCRYPT_TYPE_BTK == pSetKey->encType) { + if (pSetKey->keyLength < SIR_BTK_KEY_LEN) { + smsLog(pMac, LOGW, + "LFR3:Invalid BTK keylength [= %d] in SetContext call", + pSetKey->keyLength); + break; + } + vos_mem_copy(pSession->eseCckmInfo.btk, pSetKey->Key, + SIR_BTK_KEY_LEN); + status = eHAL_STATUS_SUCCESS; + break; + } +#endif #endif /* FEATURE_WLAN_ESE */ #ifdef WLAN_FEATURE_11W @@ -8872,6 +8899,9 @@ static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessi ( (!HAL_STATUS_SUCCESS( status ) ) #ifdef FEATURE_WLAN_ESE || ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType ) +#ifdef WLAN_FEATURE_WLAN_ROAM + || ( eCSR_ENCRYPT_TYPE_BTK == pSetKey->encType ) +#endif /* WLAN_FEATURE_WLAN_ROAM */ #endif /* FEATURE_WLAN_ESE */ ) ) { @@ -12368,6 +12398,19 @@ tANI_U32 csrRoamGetNumBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId) return (pMac->roam.roamSession[sessionId].NumBkidCache); } #endif /* FEATURE_WLAN_WAPI */ +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +eHalStatus csrRoamSetPSK (tpAniSirGlobal pMac, tANI_U32 sessionId, + tANI_U8 *pPSK) +{ + tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId); + if (!pSession) { + smsLog(pMac, LOGE, FL("session %d not found"), sessionId); + return eHAL_STATUS_FAILURE; + } + vos_mem_copy(pSession->psk, pPSK, sizeof(pSession->psk)); + return eHAL_STATUS_SUCCESS; +} +#endif /* WLAN_FEATURE_ROAM_OFFLOAD */ eHalStatus csrRoamSetPMKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId, tPmkidCacheInfo *pPMKIDCache, tANI_U32 numItems ) { @@ -16318,7 +16361,42 @@ csrRoamScanOffloadPrepareProbeReqTemplate(tpAniSirGlobal pMac, *pusLen = nPayload + sizeof(tSirMacMgmtHdr); return eSIR_SUCCESS; } - +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +void csrRoamOffload(tpAniSirGlobal pMac, tSirRoamOffloadScanReq *pRequestBuf, + tCsrRoamSession *pSession) +{ + vos_mem_copy(pRequestBuf->PSK, pSession->psk, sizeof(pRequestBuf->PSK)); + pRequestBuf->Prefer5GHz = pMac->roam.configParam.nRoamPrefer5GHz; + pRequestBuf->RoamRssiCatGap = pMac->roam.configParam.bCatRssiOffset; + pRequestBuf->Select5GHzMargin = pMac->roam.configParam.nSelect5GHzMargin; + if (wlan_cfgGetInt(pMac, WNI_CFG_REASSOCIATION_FAILURE_TIMEOUT, + (tANI_U32 *)&pRequestBuf->ReassocFailureTimeout) + != eSIR_SUCCESS) + { + /** + * Could not get ReassocFailureTimeout value + * from CFG. Log error and set some default value + */ + smsLog(pMac, LOGE, FL("could not retrieve ReassocFailureTimeout value")); + pRequestBuf->ReassocFailureTimeout = DEFAULT_REASSOC_FAILURE_TIMEOUT; + } +#ifdef FEATURE_WLAN_ESE + if (csrIsAuthTypeESE(pRequestBuf->ConnectedNetwork.authentication)) { + vos_mem_copy(pRequestBuf->KRK,pSession->eseCckmInfo.krk, SIR_KRK_KEY_LEN); + vos_mem_copy(pRequestBuf->BTK,pSession->eseCckmInfo.btk, SIR_BTK_KEY_LEN); + pRequestBuf->IsESEConnection = eANI_BOOLEAN_TRUE; + } +#endif + pRequestBuf->AcUapsd.acbe_uapsd = + SIR_UAPSD_GET(ACBE, pMac->lim.gUapsdPerAcBitmask); + pRequestBuf->AcUapsd.acbk_uapsd = + SIR_UAPSD_GET(ACBK, pMac->lim.gUapsdPerAcBitmask); + pRequestBuf->AcUapsd.acvi_uapsd = + SIR_UAPSD_GET(ACVI, pMac->lim.gUapsdPerAcBitmask); + pRequestBuf->AcUapsd.acvo_uapsd = + SIR_UAPSD_GET(ACVO, pMac->lim.gUapsdPerAcBitmask); +} +#endif eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 command, tANI_U8 reason) { vos_msg_t msg; @@ -16631,6 +16709,13 @@ eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 command, tANI_U8 reas &pRequestBuf->us5GProbeTemplateLen, pSession); pRequestBuf->allowDFSChannelRoam = pMac->roam.configParam.allowDFSChannelRoam; +#ifdef WLAN_FEATURE_ROAM_OFFLOAD + pRequestBuf->RoamOffloadEnabled = csrRoamIsRoamOffloadEnabled(pMac); + /* Roam Offload piggybacks upon the Roam Scan offload command.*/ + if (pRequestBuf->RoamOffloadEnabled){ + csrRoamOffload(pMac, pRequestBuf, pSession); + } +#endif msg.type = WDA_ROAM_SCAN_OFFLOAD_REQ; msg.reserved = 0; msg.bodyptr = pRequestBuf; diff --git a/CORE/SME/src/csr/csrInsideApi.h b/CORE/SME/src/csr/csrInsideApi.h index b041e959236b..ab6cf8146ff7 100644 --- a/CORE/SME/src/csr/csrInsideApi.h +++ b/CORE/SME/src/csr/csrInsideApi.h @@ -748,6 +748,18 @@ eHalStatus csrRoamReconnect(tpAniSirGlobal pMac, tANI_U32 sessionId); -------------------------------------------------------------------------------*/ eHalStatus csrRoamSetPMKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId, tPmkidCacheInfo *pPMKIDCache, tANI_U32 numItems ); +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +/* --------------------------------------------------------------------------- + *\fn csrRoamSetPSK + *\brief store PSK + *\param pMac - pointer to global structure for MAC + *\param sessionId - Sme session id + *\param pPSK - pointer to an array of Psk + *\return eHalStatus - usually it succeed unless sessionId is not found + *\Note: + *-------------------------------------------------------------------------------*/ +eHalStatus csrRoamSetPSK (tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U8 *pPSK); +#endif /* --------------------------------------------------------------------------- \fn csrRoamGetWpaRsnReqIE \brief return the WPA or RSN IE CSR passes to PE to JOIN request or START_BSS request diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c index e7ca12b9a6fe..f302867575de 100644 --- a/CORE/SME/src/sme_common/sme_Api.c +++ b/CORE/SME/src/sme_common/sme_Api.c @@ -3928,6 +3928,33 @@ eHalStatus sme_RoamDelPMKIDfromCache( tHalHandle hHal, tANI_U8 sessionId, tANI_U } return (status); } +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +/* --------------------------------------------------------------------------- + *\fn sme_RoamSetPSK + *\brief a wrapper function to request CSR to save PSK + * This is a synchronous call. + *\param hHal - Global structure + *\param sessionId - SME sessionId + *\param pPSK - pointer to an array of Psk[] + *\return eHalStatus -status whether PSK is set or not + *---------------------------------------------------------------------------*/ +eHalStatus sme_RoamSetPSK (tHalHandle hHal, tANI_U8 sessionId, tANI_U8 *pPSK) +{ + eHalStatus status = eHAL_STATUS_FAILURE; + tpAniSirGlobal pMac = PMAC_STRUCT(hHal); + status = sme_AcquireGlobalLock(&pMac->sme); + if (HAL_STATUS_SUCCESS(status)) { + if (CSR_IS_SESSION_VALID(pMac, sessionId)) { + status = csrRoamSetPSK(pMac, sessionId, pPSK); + } + else { + status = eHAL_STATUS_INVALID_PARAMETER; + } + sme_ReleaseGlobalLock(&pMac->sme); + } + return (status); +} +#endif /* --------------------------------------------------------------------------- \fn sme_RoamGetSecurityReqIE \brief a wrapper function to request CSR to return the WPA or RSN or WAPI IE CSR @@ -13416,3 +13443,34 @@ eHalStatus sme_SetLinkLayerStatsIndCB } #endif /* WLAN_FEATURE_LINK_LAYER_STATS */ +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +/*-------------------------------------------------------------------------- + \brief sme_UpdateRoamOffloadEnabled() - enable/disable roam offload feaure + It is used at in the REG_DYNAMIC_VARIABLE macro definition of + \param hHal - The handle returned by macOpen. + \param nRoamOffloadEnabled - The boolean to update with + \return eHAL_STATUS_SUCCESS - SME update config successfully. + Other status means SME is failed to update. + \sa + --------------------------------------------------------------------------*/ + +eHalStatus sme_UpdateRoamOffloadEnabled(tHalHandle hHal, + v_BOOL_t nRoamOffloadEnabled) +{ + tpAniSirGlobal pMac = PMAC_STRUCT(hHal); + eHalStatus status = eHAL_STATUS_SUCCESS; + + status = sme_AcquireGlobalLock(&pMac->sme); + if (HAL_STATUS_SUCCESS(status)) + { + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, + "%s: LFR3:gRoamOffloadEnabled is changed from %d to %d", __func__, + pMac->roam.configParam.isRoamOffloadEnabled, + nRoamOffloadEnabled); + pMac->roam.configParam.isRoamOffloadEnabled = nRoamOffloadEnabled; + sme_ReleaseGlobalLock(&pMac->sme); + } + + return status ; +} +#endif |
