qcacld-3.0: Implement NAN datapath interface create

qcacld-2.0 to qcacld-3.0 propagation

Add changes to support session and BSS creation in NDI mode.

CRs-Fixed: 962367
Change-Id: I585cd89702a2c412783ae93fb1558ed5bfe31fd9
This commit is contained in:
Deepak Dhamdhere
2016-05-27 15:05:51 -07:00
gecommit door Nandini Suresh
bovenliggende 412f23deb2
commit e2dd5440bf
21 gewijzigde bestanden met toevoegingen van 542 en 52 verwijderingen

Bestand weergeven

@@ -1591,6 +1591,9 @@ QDF_STATUS cds_get_vdev_types(enum tQDF_ADAPTER_MODE mode, uint32_t *type,
case QDF_MONITOR_MODE: case QDF_MONITOR_MODE:
*type = WMI_VDEV_TYPE_MONITOR; *type = WMI_VDEV_TYPE_MONITOR;
break; break;
case QDF_NDI_MODE:
*type = WMI_VDEV_TYPE_NDI;
break;
default: default:
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
"Invalid device mode %d", mode); "Invalid device mode %d", mode);

Bestand weergeven

@@ -727,7 +727,8 @@ tSirRetStatus cfg_get_capability_info(tpAniSirGlobal pMac, uint16_t *pCap,
else if (LIM_IS_AP_ROLE(sessionEntry) || else if (LIM_IS_AP_ROLE(sessionEntry) ||
LIM_IS_STA_ROLE(sessionEntry)) LIM_IS_STA_ROLE(sessionEntry))
pCapInfo->ess = 1; /* ESS bit */ pCapInfo->ess = 1; /* ESS bit */
else if (LIM_IS_P2P_DEVICE_ROLE(sessionEntry)) { else if (LIM_IS_P2P_DEVICE_ROLE(sessionEntry) ||
LIM_IS_NDI_ROLE(sessionEntry)) {
pCapInfo->ess = 0; pCapInfo->ess = 0;
pCapInfo->ibss = 0; pCapInfo->ibss = 0;
} else } else

Bestand weergeven

@@ -603,11 +603,12 @@ lim_mlm_add_bss(tpAniSirGlobal mac_ctx,
session->selfMacAddr, sizeof(tSirMacAddr)); session->selfMacAddr, sizeof(tSirMacAddr));
addbss_param->bssType = mlm_start_req->bssType; addbss_param->bssType = mlm_start_req->bssType;
if ((mlm_start_req->bssType == eSIR_IBSS_MODE)) { if (mlm_start_req->bssType == eSIR_IBSS_MODE)
addbss_param->operMode = BSS_OPERATIONAL_MODE_STA; addbss_param->operMode = BSS_OPERATIONAL_MODE_STA;
} else if (mlm_start_req->bssType == eSIR_INFRA_AP_MODE) { else if (mlm_start_req->bssType == eSIR_INFRA_AP_MODE)
addbss_param->operMode = BSS_OPERATIONAL_MODE_AP; addbss_param->operMode = BSS_OPERATIONAL_MODE_AP;
} else if (mlm_start_req->bssType == eSIR_NDI_MODE)
addbss_param->operMode = BSS_OPERATIONAL_MODE_NDI;
addbss_param->shortSlotTimeSupported = session->shortSlotTimeSupported; addbss_param->shortSlotTimeSupported = session->shortSlotTimeSupported;
addbss_param->beaconInterval = mlm_start_req->beaconPeriod; addbss_param->beaconInterval = mlm_start_req->beaconPeriod;

Bestand weergeven

@@ -49,6 +49,7 @@
#include "cds_utils.h" #include "cds_utils.h"
#include "lim_types.h" #include "lim_types.h"
#include "cds_concurrency.h" #include "cds_concurrency.h"
#include "nan_datapath.h"
#define MAX_SUPPORTED_PEERS_WEP 16 #define MAX_SUPPORTED_PEERS_WEP 16
@@ -254,12 +255,14 @@ void lim_process_mlm_start_cnf(tpAniSirGlobal pMac, uint32_t *pMsgBuf)
MTRACE(mac_trace MTRACE(mac_trace
(pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId, (pMac, TRACE_CODE_SME_STATE, psessionEntry->peSessionId,
psessionEntry->limSmeState)); psessionEntry->limSmeState));
if (psessionEntry->bssType == eSIR_INFRA_AP_MODE) { if (psessionEntry->bssType == eSIR_INFRA_AP_MODE)
lim_log(pMac, LOG1, lim_log(pMac, LOG1,
FL("*** Started BSS in INFRA AP SIDE***")); FL("*** Started BSS in INFRA AP SIDE***"));
} else { else if (psessionEntry->bssType == eSIR_NDI_MODE)
lim_log(pMac, LOG1,
FL("*** Started BSS in NDI mode ***"));
else
lim_log(pMac, LOG1, FL("*** Started BSS ***")); lim_log(pMac, LOG1, FL("*** Started BSS ***"));
}
} else { } else {
/* Start BSS is a failure */ /* Start BSS is a failure */
pe_delete_session(pMac, psessionEntry); pe_delete_session(pMac, psessionEntry);
@@ -2672,6 +2675,8 @@ void lim_process_mlm_add_bss_rsp(tpAniSirGlobal mac_ctx,
mlm_start_cnf.sessionId = session_entry->peSessionId; mlm_start_cnf.sessionId = session_entry->peSessionId;
if (eSIR_IBSS_MODE == bss_type) { if (eSIR_IBSS_MODE == bss_type) {
lim_process_ibss_mlm_add_bss_rsp(mac_ctx, msg, session_entry); lim_process_ibss_mlm_add_bss_rsp(mac_ctx, msg, session_entry);
} else if (eSIR_NDI_MODE == session_entry->bssType) {
lim_process_ndi_mlm_add_bss_rsp(mac_ctx, msg, session_entry);
} else { } else {
if (eLIM_SME_WT_START_BSS_STATE == session_entry->limSmeState) { if (eLIM_SME_WT_START_BSS_STATE == session_entry->limSmeState) {
if (eLIM_MLM_WT_ADD_BSS_RSP_STATE != if (eLIM_MLM_WT_ADD_BSS_RSP_STATE !=

Bestand weergeven

@@ -698,27 +698,34 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
} }
} }
/* Probe resp add ie */ if (QDF_NDI_MODE != sme_start_bss_req->bssPersona) {
lim_start_bss_update_add_ie_buffer(mac_ctx, /* Probe resp add ie */
&session->addIeParams.probeRespData_buff, lim_start_bss_update_add_ie_buffer(mac_ctx,
&session->addIeParams.probeRespDataLen, &session->addIeParams.probeRespData_buff,
sme_start_bss_req->addIeParams.probeRespData_buff, &session->addIeParams.probeRespDataLen,
sme_start_bss_req->addIeParams.probeRespDataLen); sme_start_bss_req->addIeParams.
probeRespData_buff,
sme_start_bss_req->addIeParams.
probeRespDataLen);
/* Probe Beacon add ie */ /* Probe Beacon add ie */
lim_start_bss_update_add_ie_buffer(mac_ctx, lim_start_bss_update_add_ie_buffer(mac_ctx,
&session->addIeParams.probeRespBCNData_buff, &session->addIeParams.probeRespBCNData_buff,
&session->addIeParams.probeRespBCNDataLen, &session->addIeParams.probeRespBCNDataLen,
sme_start_bss_req->addIeParams.probeRespBCNData_buff, sme_start_bss_req->addIeParams.
sme_start_bss_req->addIeParams.probeRespBCNDataLen); probeRespBCNData_buff,
sme_start_bss_req->addIeParams.
/* Assoc resp IE */ probeRespBCNDataLen);
lim_start_bss_update_add_ie_buffer(mac_ctx,
&session->addIeParams.assocRespData_buff,
&session->addIeParams.assocRespDataLen,
sme_start_bss_req->addIeParams.assocRespData_buff,
sme_start_bss_req->addIeParams.assocRespDataLen);
/* Assoc resp IE */
lim_start_bss_update_add_ie_buffer(mac_ctx,
&session->addIeParams.assocRespData_buff,
&session->addIeParams.assocRespDataLen,
sme_start_bss_req->addIeParams.
assocRespData_buff,
sme_start_bss_req->addIeParams.
assocRespDataLen);
}
/* Store the session related params in newly created session */ /* Store the session related params in newly created session */
session->pLimStartBssReq = sme_start_bss_req; session->pLimStartBssReq = sme_start_bss_req;
@@ -826,6 +833,10 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
session->vdev_nss = vdev_type_nss->ibss; session->vdev_nss = vdev_type_nss->ibss;
break; break;
case eSIR_NDI_MODE:
session->limSystemRole = eLIM_NDI_ROLE;
break;
/* /*
* There is one more mode called auto mode. * There is one more mode called auto mode.
@@ -861,7 +872,8 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
sizeof(tpSirAssocReq)), 0); sizeof(tpSirAssocReq)), 0);
} }
if (!sme_start_bss_req->channelId) { if (!sme_start_bss_req->channelId &&
sme_start_bss_req->bssType != eSIR_NDI_MODE) {
lim_log(mac_ctx, LOGE, lim_log(mac_ctx, LOGE,
FL("Received invalid eWNI_SME_START_BSS_REQ")); FL("Received invalid eWNI_SME_START_BSS_REQ"));
ret_code = eSIR_SME_INVALID_PARAMETERS; ret_code = eSIR_SME_INVALID_PARAMETERS;
@@ -924,7 +936,9 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
lim_set_rs_nie_wp_aiefrom_sme_start_bss_req_message(mac_ctx, lim_set_rs_nie_wp_aiefrom_sme_start_bss_req_message(mac_ctx,
&sme_start_bss_req->rsnIE, session); &sme_start_bss_req->rsnIE, session);
if (LIM_IS_AP_ROLE(session) || LIM_IS_IBSS_ROLE(session)) { if (LIM_IS_AP_ROLE(session) ||
LIM_IS_IBSS_ROLE(session) ||
LIM_IS_NDI_ROLE(session)) {
session->gLimProtectionControl = session->gLimProtectionControl =
sme_start_bss_req->protEnabled; sme_start_bss_req->protEnabled;
/* /*
@@ -962,7 +976,8 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf)
/* Fill PE session Id from the session Table */ /* Fill PE session Id from the session Table */
mlm_start_req->sessionId = session->peSessionId; mlm_start_req->sessionId = session->peSessionId;
if (mlm_start_req->bssType == eSIR_INFRA_AP_MODE) { if (mlm_start_req->bssType == eSIR_INFRA_AP_MODE ||
mlm_start_req->bssType == eSIR_NDI_MODE) {
/* /*
* Copy the BSSId from sessionTable to * Copy the BSSId from sessionTable to
* mlmStartReq struct * mlmStartReq struct

Bestand weergeven

@@ -612,6 +612,7 @@ lim_send_sme_start_bss_rsp(tpAniSirGlobal pMac,
pSirSmeRsp->bssDescription.channelId = pSirSmeRsp->bssDescription.channelId =
psessionEntry->currentOperChannel; psessionEntry->currentOperChannel;
if (!LIM_IS_NDI_ROLE(psessionEntry)) {
curLen = psessionEntry->schBeaconOffsetBegin - ieOffset; curLen = psessionEntry->schBeaconOffsetBegin - ieOffset;
qdf_mem_copy((uint8_t *) &pSirSmeRsp->bssDescription. qdf_mem_copy((uint8_t *) &pSirSmeRsp->bssDescription.
ieFields, ieFields,
@@ -630,6 +631,7 @@ lim_send_sme_start_bss_rsp(tpAniSirGlobal pMac,
sizeof(uint32_t) + ieLen; sizeof(uint32_t) + ieLen;
/* This is the size of the message, subtracting the size of the pointer to ieFields */ /* This is the size of the message, subtracting the size of the pointer to ieFields */
size += ieLen - sizeof(uint32_t); size += ieLen - sizeof(uint32_t);
}
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
if (psessionEntry->cc_switch_mode if (psessionEntry->cc_switch_mode
!= QDF_MCC_TO_SCC_SWITCH_DISABLE) { != QDF_MCC_TO_SCC_SWITCH_DISABLE) {

Bestand weergeven

@@ -409,6 +409,8 @@ lim_is_sme_start_bss_req_valid(tpAniSirGlobal mac_ctx,
break; break;
case eSIR_INFRA_AP_MODE: case eSIR_INFRA_AP_MODE:
break; break;
case eSIR_NDI_MODE:
break;
default: default:
/** /**
* Should not have received start BSS req with bssType * Should not have received start BSS req with bssType

Bestand weergeven

@@ -6749,6 +6749,7 @@ const char *lim_bss_type_to_string(const uint16_t bss_type)
CASE_RETURN_STRING(eSIR_INFRA_AP_MODE); CASE_RETURN_STRING(eSIR_INFRA_AP_MODE);
CASE_RETURN_STRING(eSIR_IBSS_MODE); CASE_RETURN_STRING(eSIR_IBSS_MODE);
CASE_RETURN_STRING(eSIR_AUTO_MODE); CASE_RETURN_STRING(eSIR_AUTO_MODE);
CASE_RETURN_STRING(eSIR_NDI_MODE);
default: default:
return "Unknown bss_type"; return "Unknown bss_type";
} }

Bestand weergeven

@@ -24,6 +24,8 @@
* MAC NAN Data path API implementation * MAC NAN Data path API implementation
*/ */
#include "lim_utils.h"
#include "lim_api.h"
#include "nan_datapath.h" #include "nan_datapath.h"
/** /**
@@ -49,3 +51,49 @@ QDF_STATUS handle_ndp_event_message(tpAniSirGlobal mac_ctx, tpSirMsgQ msg)
{ {
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
/**
* lim_process_ndi_mlm_add_bss_rsp() - Process ADD_BSS response for NDI
* @mac_ctx: Pointer to Global MAC structure
* @lim_msgq: The MsgQ header, which contains the response buffer
* @session_entry: PE session
*
* Return: None
*/
void lim_process_ndi_mlm_add_bss_rsp(tpAniSirGlobal mac_ctx, tpSirMsgQ lim_msgq,
tpPESession session_entry)
{
tLimMlmStartCnf mlm_start_cnf;
tpAddBssParams add_bss_params = (tpAddBssParams) lim_msgq->bodyptr;
lim_log(mac_ctx, LOG1, FL("Status %d"), add_bss_params->status);
if (NULL == add_bss_params) {
lim_log(mac_ctx, LOGE, FL("Invalid body pointer in message"));
goto end;
}
if (QDF_STATUS_SUCCESS == add_bss_params->status) {
lim_log(mac_ctx, LOG1,
FL("WDA_ADD_BSS_RSP returned QDF_STATUS_SUCCESS"));
session_entry->limMlmState = eLIM_MLM_BSS_STARTED_STATE;
MTRACE(mac_trace(mac_ctx, TRACE_CODE_MLM_STATE,
session_entry->peSessionId,
session_entry->limMlmState));
session_entry->bssIdx = (uint8_t) add_bss_params->bssIdx;
session_entry->limSystemRole = eLIM_NDI_ROLE;
session_entry->statypeForBss = STA_ENTRY_SELF;
/* Apply previously set configuration at HW */
lim_apply_configuration(mac_ctx, session_entry);
mlm_start_cnf.resultCode = eSIR_SME_SUCCESS;
} else {
lim_log(mac_ctx, LOGE,
FL("WDA_ADD_BSS_REQ failed with status %d"),
add_bss_params->status);
mlm_start_cnf.resultCode = eSIR_SME_HAL_SEND_MESSAGE_FAIL;
}
mlm_start_cnf.sessionId = session_entry->peSessionId;
lim_post_sme_message(mac_ctx, LIM_MLM_START_CNF,
(uint32_t *) &mlm_start_cnf);
end:
qdf_mem_free(lim_msgq->bodyptr);
lim_msgq->bodyptr = NULL;
}

Bestand weergeven

@@ -106,6 +106,9 @@ QDF_STATUS lim_handle_ndp_request_message(tpAniSirGlobal mac_ctx,
/* Function to process NDP events */ /* Function to process NDP events */
QDF_STATUS lim_handle_ndp_event_message(tpAniSirGlobal mac_ctx, QDF_STATUS lim_handle_ndp_event_message(tpAniSirGlobal mac_ctx,
tpSirMsgQ msg); tpSirMsgQ msg);
void lim_process_ndi_mlm_add_bss_rsp(tpAniSirGlobal mac_ctx,
tpSirMsgQ lim_msg_q,
tpPESession session_entry);
#else #else
/* Function to process NDP requests */ /* Function to process NDP requests */
static inline QDF_STATUS lim_handle_ndp_request_message(tpAniSirGlobal mac_ctx, static inline QDF_STATUS lim_handle_ndp_request_message(tpAniSirGlobal mac_ctx,
@@ -119,6 +122,14 @@ static inline QDF_STATUS lim_handle_ndp_event_message(tpAniSirGlobal mac_ctx,
{ {
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
/* Function to process NDP events */
static inline void lim_process_ndi_mlm_add_bss_rsp(tpAniSirGlobal mac_ctx,
tpSirMsgQ lim_msg_q,
tpPESession session_entry)
{
}
#endif /* WLAN_FEATURE_NAN_DATAPATH */ #endif /* WLAN_FEATURE_NAN_DATAPATH */
#endif /* __MAC_NAN_DATAPATH_H */ #endif /* __MAC_NAN_DATAPATH_H */

Bestand weergeven

@@ -667,6 +667,10 @@ typedef enum {
eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED, eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED,
/* Disconnecting with AP or stop connecting process */ /* Disconnecting with AP or stop connecting process */
eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTING, eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTING,
/* NAN Data interface not started */
eCSR_CONNECT_STATE_TYPE_NDI_NOT_STARTED,
/* NAN Data inteface started */
eCSR_CONNECT_STATE_TYPE_NDI_STARTED,
} eCsrConnectState; } eCsrConnectState;
@@ -1616,9 +1620,19 @@ typedef QDF_STATUS (*csr_roamSessionCloseCallback)(void *pContext);
(pProfile)->BSSType) (pProfile)->BSSType)
#define CSR_IS_INFRA_AP(pProfile) (eCSR_BSS_TYPE_INFRA_AP == \ #define CSR_IS_INFRA_AP(pProfile) (eCSR_BSS_TYPE_INFRA_AP == \
(pProfile)->BSSType) (pProfile)->BSSType)
#define CSR_IS_NDI(pProfile) (eCSR_BSS_TYPE_NDI == (pProfile)->BSSType) #ifdef WLAN_FEATURE_NAN_DATAPATH
#define CSR_IS_NDI(profile) (eCSR_BSS_TYPE_NDI == (profile)->BSSType)
#else
#define CSR_IS_NDI(profile) (false)
#endif
#define CSR_IS_CONN_INFRA_AP(pProfile) (eCSR_BSS_TYPE_INFRA_AP == \ #define CSR_IS_CONN_INFRA_AP(pProfile) (eCSR_BSS_TYPE_INFRA_AP == \
(pProfile)->BSSType) (pProfile)->BSSType)
#ifdef WLAN_FEATURE_NAN_DATAPATH
#define CSR_IS_CONN_NDI(profile) (eCSR_BSS_TYPE_NDI == (profile)->BSSType)
#else
#define CSR_IS_CONN_NDI(profile) (false)
#endif
#define CSR_IS_CLOSE_SESSION_COMMAND(pCommand) \ #define CSR_IS_CLOSE_SESSION_COMMAND(pCommand) \
((pCommand)->command == eSmeCommandDelStaSession) ((pCommand)->command == eSmeCommandDelStaSession)

Bestand weergeven

@@ -27,6 +27,9 @@
#ifndef __SME_NAN_DATAPATH_H #ifndef __SME_NAN_DATAPATH_H
#define __SME_NAN_DATAPATH_H #define __SME_NAN_DATAPATH_H
#ifdef WLAN_FEATURE_NAN_DATAPATH
#include "qdf_types.h"
#include "sir_api.h"
#include "ani_global.h" #include "ani_global.h"
/* NAN initiator request handler */ /* NAN initiator request handler */
@@ -48,4 +51,59 @@ QDF_STATUS sme_ndp_sched_req_handler(uint32_t session_id,
/* Function to handle NDP messages from lower layers */ /* Function to handle NDP messages from lower layers */
void sme_ndp_message_processor(tpAniSirGlobal mac_ctx, uint16_t msg_type, void sme_ndp_message_processor(tpAniSirGlobal mac_ctx, uint16_t msg_type,
void *msg); void *msg);
/* Start NDI BSS */
QDF_STATUS csr_roam_start_ndi(tpAniSirGlobal mac_ctx, uint32_t session_id,
tCsrRoamProfile *profile);
void csr_roam_fill_roaminfo_ndp(tpAniSirGlobal mac_ctx,
tCsrRoamInfo *roam_info,
eCsrRoamResult roam_result,
tSirResultCodes status_code,
uint32_t reason_code,
uint32_t transaction_id);
void csr_roam_save_ndi_connected_info(tpAniSirGlobal mac_ctx,
uint32_t session_id,
tCsrRoamProfile *roam_profile,
tSirBssDescription *bss_desc);
void csr_roam_update_ndp_return_params(tpAniSirGlobal mac_ctx,
uint32_t result,
uint32_t *roam_status,
uint32_t *roam_result);
#else
/* Start NDI BSS */
static inline QDF_STATUS csr_roam_start_ndi(tpAniSirGlobal mac_ctx,
uint32_t session_id,
tCsrRoamProfile *profile)
{
return QDF_STATUS_SUCCESS;
}
/* Fill in ndp information in roam_info */
static inline void csr_roam_fill_roaminfo_ndp(tpAniSirGlobal mac_ctx,
tCsrRoamInfo *roam_info,
eCsrRoamResult roam_result,
tSirResultCodes status_code,
uint32_t reason_code,
uint32_t transaction_id)
{
}
static inline void csr_roam_save_ndi_connected_info(tpAniSirGlobal mac_ctx,
uint32_t session_id,
tCsrRoamProfile *roam_profile,
tSirBssDescription *bss_desc)
{
}
static inline void csr_roam_update_ndp_return_params(tpAniSirGlobal mac_ctx,
uint32_t result,
uint32_t *roam_status,
uint32_t *roam_result)
{
}
#endif /* WLAN_FEATURE_NAN_DATAPATH */
#endif /* __SME_NAN_DATAPATH_H */ #endif /* __SME_NAN_DATAPATH_H */

Bestand weergeven

@@ -54,6 +54,7 @@
#include "sme_power_save_api.h" #include "sme_power_save_api.h"
#include "wma.h" #include "wma.h"
#include "cds_concurrency.h" #include "cds_concurrency.h"
#include "sme_nan_datapath.h"
#define MAX_PWR_FCC_CHAN_12 8 #define MAX_PWR_FCC_CHAN_12 8
#define MAX_PWR_FCC_CHAN_13 2 #define MAX_PWR_FCC_CHAN_13 2
@@ -177,11 +178,6 @@ static void csr_roam_update_connected_profile_from_new_bss(tpAniSirGlobal pMac,
uint32_t sessionId, uint32_t sessionId,
tSirSmeNewBssInfo * tSirSmeNewBssInfo *
pNewBss); pNewBss);
static void csr_roam_prepare_bss_params(tpAniSirGlobal pMac, uint32_t sessionId,
tCsrRoamProfile *pProfile,
tSirBssDescription *pBssDesc,
tBssConfigParam *pBssConfig,
tDot11fBeaconIEs *pIes);
static ePhyChanBondState csr_get_cb_mode_from_ies(tpAniSirGlobal pMac, static ePhyChanBondState csr_get_cb_mode_from_ies(tpAniSirGlobal pMac,
uint8_t primaryChn, uint8_t primaryChn,
tDot11fBeaconIEs *pIes); tDot11fBeaconIEs *pIes);
@@ -3862,7 +3858,7 @@ QDF_STATUS csr_roam_prepare_bss_config(tpAniSirGlobal pMac,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
static QDF_STATUS csr_roam_prepare_bss_config_from_profile(tpAniSirGlobal pMac, QDF_STATUS csr_roam_prepare_bss_config_from_profile(tpAniSirGlobal pMac,
tCsrRoamProfile *pProfile, tCsrRoamProfile *pProfile,
tBssConfigParam * tBssConfigParam *
pBssConfig, pBssConfig,
@@ -5162,6 +5158,13 @@ static void csr_roam_join_handle_profile(tpAniSirGlobal mac_ctx,
*roam_state = eCsrContinueRoaming; *roam_state = eCsrContinueRoaming;
else else
*roam_state = eCsrStopRoaming; *roam_state = eCsrStopRoaming;
} else if (CSR_IS_NDI(profile)) {
csr_roam_assign_default_param(mac_ctx, cmd);
status = csr_roam_start_ndi(mac_ctx, session_id, profile);
if (QDF_IS_STATUS_SUCCESS(status))
*roam_state = eCsrContinueRoaming;
else
*roam_state = eCsrStopRoaming;
} else { } else {
/* Nothing we can do */ /* Nothing we can do */
sms_log(mac_ctx, LOGW, FL("cannot continue without BSS list")); sms_log(mac_ctx, LOGW, FL("cannot continue without BSS list"));
@@ -6284,11 +6287,23 @@ static void csr_roam_process_start_bss_success(tpAniSirGlobal mac_ctx,
else if (CSR_IS_INFRA_AP(profile)) else if (CSR_IS_INFRA_AP(profile))
session->connectState = session->connectState =
eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED; eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
else if (CSR_IS_NDI(profile))
session->connectState = eCSR_CONNECT_STATE_TYPE_NDI_STARTED;
else else
session->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED; session->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
bss_desc = &start_bss_rsp->bssDescription;
if (CSR_IS_NDI(profile)) {
csr_roam_state_change(mac_ctx, eCSR_ROAMING_STATE_JOINED,
session_id);
csr_roam_save_ndi_connected_info(mac_ctx, session_id, profile,
bss_desc);
roam_info.u.pConnectedProfile = &session->connectedProfile;
qdf_mem_copy(&roam_info.bssid, &bss_desc->bssId,
sizeof(struct qdf_mac_addr));
}
csr_roam_state_change(mac_ctx, eCSR_ROAMING_STATE_JOINED, csr_roam_state_change(mac_ctx, eCSR_ROAMING_STATE_JOINED,
session_id); session_id);
bss_desc = &start_bss_rsp->bssDescription;
if (!QDF_IS_STATUS_SUCCESS if (!QDF_IS_STATUS_SUCCESS
(csr_get_parsed_bss_description_ies(mac_ctx, bss_desc, (csr_get_parsed_bss_description_ies(mac_ctx, bss_desc,
&ies_ptr))) { &ies_ptr))) {
@@ -6308,12 +6323,10 @@ static void csr_roam_process_start_bss_success(tpAniSirGlobal mac_ctx,
csr_roam_save_connected_bss_desc(mac_ctx, session_id, bss_desc); csr_roam_save_connected_bss_desc(mac_ctx, session_id, bss_desc);
csr_roam_free_connect_profile(&session->connectedProfile); csr_roam_free_connect_profile(&session->connectedProfile);
csr_roam_free_connected_info(mac_ctx, &session->connectedInfo); csr_roam_free_connected_info(mac_ctx, &session->connectedInfo);
if (bss_desc) { csr_roam_save_connected_infomation(mac_ctx, session_id,
csr_roam_save_connected_infomation(mac_ctx, session_id, profile, bss_desc, ies_ptr);
profile, bss_desc, ies_ptr); qdf_mem_copy(&roam_info.bssid, &bss_desc->bssId,
qdf_mem_copy(&roam_info.bssid, &bss_desc->bssId,
sizeof(struct qdf_mac_addr)); sizeof(struct qdf_mac_addr));
}
/* We are done with the IEs so free it */ /* We are done with the IEs so free it */
qdf_mem_free(ies_ptr); qdf_mem_free(ies_ptr);
#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
@@ -6383,19 +6396,28 @@ static void csr_roam_process_start_bss_success(tpAniSirGlobal mac_ctx,
roam_status = eCSR_ROAM_INFRA_IND; roam_status = eCSR_ROAM_INFRA_IND;
roam_result = eCSR_ROAM_RESULT_INFRA_STARTED; roam_result = eCSR_ROAM_RESULT_INFRA_STARTED;
} }
if (CSR_IS_NDI(profile)) {
csr_roam_update_ndp_return_params(mac_ctx,
eCsrStartBssSuccess,
&roam_status, &roam_result);
csr_roam_fill_roaminfo_ndp(mac_ctx, &roam_info,
roam_result,
start_bss_rsp->statusCode,
0, 0);
}
/* /*
* Only tell upper layer is we start the BSS because Vista * Only tell upper layer is we start the BSS because Vista
* doesn't like multiple connection indications. If we don't * doesn't like multiple connection indications. If we don't
* start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS * start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS
* will trigger the connection start indication in Vista * will trigger the connection start indication in Vista
*/ */
qdf_mem_set(&roam_info, sizeof(tCsrRoamInfo), 0);
roam_info.statusCode = session->joinFailStatusCode.statusCode; roam_info.statusCode = session->joinFailStatusCode.statusCode;
roam_info.reasonCode = session->joinFailStatusCode.reasonCode; roam_info.reasonCode = session->joinFailStatusCode.reasonCode;
/* We start the IBSS (didn't find any matched IBSS out there) */ /* We start the IBSS (didn't find any matched IBSS out there) */
roam_info.pBssDesc = bss_desc; roam_info.pBssDesc = bss_desc;
roam_info.staId = (uint8_t) start_bss_rsp->staId; roam_info.staId = (uint8_t) start_bss_rsp->staId;
qdf_mem_copy(roam_info.bssid.bytes, bss_desc->bssId, if (bss_desc)
qdf_mem_copy(roam_info.bssid.bytes, bss_desc->bssId,
sizeof(struct qdf_mac_addr)); sizeof(struct qdf_mac_addr));
if (!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) && if (!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
(csr_is_concurrent_session_running(mac_ctx))) { (csr_is_concurrent_session_running(mac_ctx))) {
@@ -6823,6 +6845,7 @@ static bool csr_roam_process_results(tpAniSirGlobal mac_ctx, tSmeCmd *cmd,
eRoamCmdStatus roam_status; eRoamCmdStatus roam_status;
eCsrRoamResult roam_result; eCsrRoamResult roam_result;
host_log_ibss_pkt_type *ibss_log; host_log_ibss_pkt_type *ibss_log;
tSirSmeStartBssRsp *start_bss_rsp = NULL;
if (!session) { if (!session) {
sms_log(mac_ctx, LOGE, FL("session %d not found "), session_id); sms_log(mac_ctx, LOGE, FL("session %d not found "), session_id);
@@ -6846,18 +6869,29 @@ static bool csr_roam_process_results(tpAniSirGlobal mac_ctx, tSmeCmd *cmd,
WLAN_HOST_DIAG_LOG_REPORT(ibss_log); WLAN_HOST_DIAG_LOG_REPORT(ibss_log);
} }
#endif #endif
start_bss_rsp = (tSirSmeStartBssRsp *)context;
qdf_mem_set(&roam_info, sizeof(roam_info), 0);
roam_status = eCSR_ROAM_IBSS_IND; roam_status = eCSR_ROAM_IBSS_IND;
roam_result = eCSR_ROAM_RESULT_IBSS_STARTED; roam_result = eCSR_ROAM_RESULT_IBSS_STARTED;
if (CSR_IS_INFRA_AP(profile)) { if (CSR_IS_INFRA_AP(profile)) {
roam_status = eCSR_ROAM_INFRA_IND; roam_status = eCSR_ROAM_INFRA_IND;
roam_result = eCSR_ROAM_RESULT_INFRA_START_FAILED; roam_result = eCSR_ROAM_RESULT_INFRA_START_FAILED;
} }
if (CSR_IS_NDI(profile)) {
csr_roam_update_ndp_return_params(mac_ctx,
eCsrStartBssFailure,
&roam_status, &roam_result);
csr_roam_fill_roaminfo_ndp(mac_ctx, &roam_info,
roam_result,
(start_bss_rsp) ? start_bss_rsp->statusCode :
QDF_STATUS_E_FAILURE, 0, 0);
}
if (context) { if (context) {
bss_desc = (tSirBssDescription *) context; bss_desc = (tSirBssDescription *) context;
} else { } else {
bss_desc = NULL; bss_desc = NULL;
} }
qdf_mem_set(&roam_info, sizeof(tCsrRoamInfo), 0);
roam_info.pBssDesc = bss_desc; roam_info.pBssDesc = bss_desc;
csr_roam_call_callback(mac_ctx, session_id, &roam_info, csr_roam_call_callback(mac_ctx, session_id, &roam_info,
cmd->u.roamCmd.roamId, roam_status, cmd->u.roamCmd.roamId, roam_status,
@@ -7537,13 +7571,14 @@ QDF_STATUS csr_roam_connect(tpAniSirGlobal pMac, uint32_t sessionId,
} }
} else if (NULL != pProfile) { } else if (NULL != pProfile) {
/* Check whether it is for start ibss */ /* Check whether it is for start ibss */
if (CSR_IS_START_IBSS(pProfile)) { if (CSR_IS_START_IBSS(pProfile) ||
CSR_IS_NDI(pProfile)) {
status = csr_roam_issue_connect(pMac, sessionId, status = csr_roam_issue_connect(pMac, sessionId,
pProfile, NULL, eCsrHddIssued, pProfile, NULL, eCsrHddIssued,
roamId, false, false); roamId, false, false);
if (!QDF_IS_STATUS_SUCCESS(status)) { if (!QDF_IS_STATUS_SUCCESS(status)) {
sms_log(pMac, LOGE, sms_log(pMac, LOGE,
FL("CSR failed to issue startIBSS cmd with status = 0x%08X"), FL("Failed with status = 0x%08X"),
status); status);
fCallCallback = true; fCallCallback = true;
} }
@@ -8604,7 +8639,8 @@ csr_roaming_state_config_cnf_processor(tpAniSirGlobal mac_ctx,
bss_desc = &scan_result->Result.BssDescriptor; bss_desc = &scan_result->Result.BssDescriptor;
} }
if (csr_is_bss_type_ibss(cmd->u.roamCmd.roamProfile.BSSType) if (csr_is_bss_type_ibss(cmd->u.roamCmd.roamProfile.BSSType)
|| CSR_IS_INFRA_AP(&cmd->u.roamCmd.roamProfile)) { || CSR_IS_INFRA_AP(&cmd->u.roamCmd.roamProfile)
|| CSR_IS_NDI(&cmd->u.roamCmd.roamProfile)) {
if (!QDF_IS_STATUS_SUCCESS(csr_roam_issue_start_bss(mac_ctx, if (!QDF_IS_STATUS_SUCCESS(csr_roam_issue_start_bss(mac_ctx,
session_id, &session->bssParams, session_id, &session->bssParams,
&cmd->u.roamCmd.roamProfile, &cmd->u.roamCmd.roamProfile,
@@ -12743,7 +12779,7 @@ QDF_STATUS csr_roam_issue_start_bss(tpAniSirGlobal pMac, uint32_t sessionId,
return status; return status;
} }
static void csr_roam_prepare_bss_params(tpAniSirGlobal pMac, uint32_t sessionId, void csr_roam_prepare_bss_params(tpAniSirGlobal pMac, uint32_t sessionId,
tCsrRoamProfile *pProfile, tCsrRoamProfile *pProfile,
tSirBssDescription *pBssDesc, tSirBssDescription *pBssDesc,
tBssConfigParam *pBssConfig, tBssConfigParam *pBssConfig,
@@ -12760,7 +12796,11 @@ static void csr_roam_prepare_bss_params(tpAniSirGlobal pMac, uint32_t sessionId,
if (pBssDesc) { if (pBssDesc) {
csr_roam_get_bss_start_parms_from_bss_desc(pMac, pBssDesc, pIes, csr_roam_get_bss_start_parms_from_bss_desc(pMac, pBssDesc, pIes,
&pSession->bssParams); &pSession->bssParams);
if (CSR_IS_NDI(pProfile)) {
qdf_copy_macaddr(&pSession->bssParams.bssid,
&pSession->selfMacAddr);
}
} else { } else {
csr_roam_get_bss_start_parms(pMac, pProfile, &pSession->bssParams); csr_roam_get_bss_start_parms(pMac, pProfile, &pSession->bssParams);
/* Use the first SSID */ /* Use the first SSID */

Bestand weergeven

@@ -1070,3 +1070,16 @@ bool is_disconnect_pending(tpAniSirGlobal mac_ctx,
void csr_scan_active_list_timeout_handle(void *userData); void csr_scan_active_list_timeout_handle(void *userData);
QDF_STATUS csr_prepare_disconnect_command(tpAniSirGlobal mac, QDF_STATUS csr_prepare_disconnect_command(tpAniSirGlobal mac,
uint32_t session_id, tSmeCmd **sme_cmd); uint32_t session_id, tSmeCmd **sme_cmd);
QDF_STATUS csr_roam_prepare_bss_config_from_profile(tpAniSirGlobal mac_ctx,
tCsrRoamProfile *profile, tBssConfigParam *bss_cfg,
tSirBssDescription *bss_desc);
void csr_roam_prepare_bss_params(tpAniSirGlobal mac_ctx, uint32_t session_id,
tCsrRoamProfile *profile, tSirBssDescription *bss_desc,
tBssConfigParam *bss_cfg, tDot11fBeaconIEs *ies);
QDF_STATUS csr_roam_set_bss_config_cfg(tpAniSirGlobal mac_ctx,
uint32_t session_id,
tCsrRoamProfile *profile, tSirBssDescription *bss_desc,
tBssConfigParam *bss_cfg, tDot11fBeaconIEs *ies,
bool reset_country);

Bestand weergeven

@@ -1961,6 +1961,14 @@ csr_isconcurrentsession_valid(tpAniSirGlobal mac_ctx, uint32_t cur_sessionid,
QDF_TRACE_LEVEL_INFO, QDF_TRACE_LEVEL_INFO,
FL("**P2P-Client session**")); FL("**P2P-Client session**"));
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
case QDF_NDI_MODE:
if (bss_persona != QDF_STA_MODE) {
QDF_TRACE(QDF_MODULE_ID_SME,
QDF_TRACE_LEVEL_ERROR,
FL("***NDI mode can co-exist only with STA ***"));
return QDF_STATUS_E_FAILURE;
}
break;
default: default:
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE(QDF_MODULE_ID_SME,
QDF_TRACE_LEVEL_ERROR, QDF_TRACE_LEVEL_ERROR,
@@ -5339,6 +5347,9 @@ tSirBssType csr_translate_bsstype_to_mac_type(eCsrRoamBssType csrtype)
case eCSR_BSS_TYPE_INFRA_AP: case eCSR_BSS_TYPE_INFRA_AP:
ret = eSIR_INFRA_AP_MODE; ret = eSIR_INFRA_AP_MODE;
break; break;
case eCSR_BSS_TYPE_NDI:
ret = eSIR_NDI_MODE;
break;
case eCSR_BSS_TYPE_ANY: case eCSR_BSS_TYPE_ANY:
default: default:
ret = eSIR_AUTO_MODE; ret = eSIR_AUTO_MODE;

Bestand weergeven

@@ -23,6 +23,11 @@
* *
* SME NAN Data path API implementation * SME NAN Data path API implementation
*/ */
#include "sms_debug.h"
#include "sme_api.h"
#include "csr_inside_api.h"
#include "sme_inside.h"
#include "csr_internal.h"
#include "sme_nan_datapath.h" #include "sme_nan_datapath.h"
/** /**
@@ -78,4 +83,152 @@ QDF_STATUS sme_ndp_sched_req_handler(uint32_t session_id,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
/**
* csr_roam_start_ndi() - Start connection for NAN datapath
* @mac_ctx: Global MAC context
* @session: SME session ID
* @profile: Configuration profile
*
* Return: Success or failure code
*/
QDF_STATUS csr_roam_start_ndi(tpAniSirGlobal mac_ctx, uint32_t session,
tCsrRoamProfile *profile)
{
QDF_STATUS status;
tBssConfigParam bss_cfg = {0};
/* Build BSS configuration from profile */
status = csr_roam_prepare_bss_config_from_profile(mac_ctx, profile,
&bss_cfg, NULL);
if (QDF_IS_STATUS_SUCCESS(status)) {
mac_ctx->roam.roamSession[session].bssParams.uCfgDot11Mode
= bss_cfg.uCfgDot11Mode;
/* Copy profile parameters to PE session */
csr_roam_prepare_bss_params(mac_ctx, session, profile, NULL,
&bss_cfg, NULL);
/*
* Following routine will eventually call
* csrRoamIssueStartBss through csrRoamCcmCfgSetCallback
*/
status = csr_roam_set_bss_config_cfg(mac_ctx, session, profile,
NULL, &bss_cfg, NULL, false);
}
if (QDF_IS_STATUS_SUCCESS(status))
sms_log(mac_ctx, LOG1, FL("Profile config is valid"));
else
sms_log(mac_ctx, LOGE,
FL("Profile config is invalid. status = 0x%x"), status);
return status;
}
/**
* csr_roam_fill_roaminfo_ndp() - fill the ndi create struct inside roam info
* @mac_ctx: Global MAC context
* @roam_info: roam info to be updated with ndi create params
* @roam_result: roam result to update
* @status_code: status code to update
* @reason_code: reason code to update
* @transaction_id: transcation id to update
*
* Return: None
*/
void csr_roam_fill_roaminfo_ndp(tpAniSirGlobal mac_ctx,
tCsrRoamInfo *roam_info,
eCsrRoamResult roam_result,
tSirResultCodes status_code,
uint32_t reason_code,
uint32_t transaction_id)
{
struct ndi_create_rsp *rsp_params;
sms_log(mac_ctx, LOG1,
FL("reason 0x%x, status 0x%x, transaction_id %d"),
reason_code, status_code, transaction_id);
rsp_params = (struct ndi_create_rsp *)
&roam_info->ndp.ndi_create_params;
rsp_params->reason = reason_code;
rsp_params->status = status_code;
rsp_params->transaction_id = transaction_id;
}
/**
* csr_roam_save_ndi_connected_info() - Save connected profile parameters
* @mac_ctx: Global MAC context
* @session_id: Session ID
* @roam_profile: Profile given for starting BSS
* @bssdesc: BSS description from tSirSmeStartBssRsp response
*
* Saves NDI profile parameters into session's connected profile.
*
* Return: None
*/
void csr_roam_save_ndi_connected_info(tpAniSirGlobal mac_ctx,
uint32_t session_id,
tCsrRoamProfile *roam_profile,
tSirBssDescription *bssdesc)
{
tCsrRoamSession *roam_session = NULL;
tCsrRoamConnectedProfile *connect_profile = NULL;
roam_session = CSR_GET_SESSION(mac_ctx, session_id);
if (NULL == roam_session) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
FL("session %d not found"), session_id);
return;
}
connect_profile = &roam_session->connectedProfile;
qdf_mem_set(&roam_session->connectedProfile,
sizeof(connect_profile), 0);
connect_profile->AuthType = roam_profile->negotiatedAuthType;
connect_profile->AuthInfo = roam_profile->AuthType;
connect_profile->CBMode = roam_profile->CBMode;
connect_profile->EncryptionType =
roam_profile->negotiatedUCEncryptionType;
connect_profile->EncryptionInfo = roam_profile->EncryptionType;
connect_profile->mcEncryptionType =
roam_profile->negotiatedMCEncryptionType;
connect_profile->mcEncryptionInfo =
roam_profile->mcEncryptionType;
connect_profile->BSSType = roam_profile->BSSType;
connect_profile->modifyProfileFields.uapsd_mask =
roam_profile->uapsd_mask;
connect_profile->operationChannel = bssdesc->channelId;
connect_profile->beaconInterval = 0;
qdf_mem_copy(&connect_profile->Keys, &roam_profile->Keys,
sizeof(roam_profile->Keys));
csr_get_bss_id_bss_desc(mac_ctx, bssdesc, &connect_profile->bssid);
connect_profile->SSID.length = 0;
csr_free_connect_bss_desc(mac_ctx, session_id);
connect_profile->qap = false;
connect_profile->qosConnection = false;
}
/**
* csr_roam_update_ndp_return_params() - updates ndp return parameters
* @mac_ctx: MAC context handle
* @result: result of the roaming command
* @roam_status: roam status returned to the roam command initiator
* @roam_result: roam result returned to the roam command initiator
*
* Results: None
*/
void csr_roam_update_ndp_return_params(tpAniSirGlobal mac_ctx,
uint32_t result,
uint32_t *roam_status,
uint32_t *roam_result)
{
switch (result) {
case eCsrStartBssSuccess:
case eCsrStartBssFailure:
*roam_status = eCSR_ROAM_NDP_STATUS_UPDATE;
*roam_result = eCSR_ROAM_RESULT_NDP_CREATE_RSP;
break;
default:
sms_log(mac_ctx, LOGE,
FL("Invalid CSR Roam result code: %d"), result);
break;
}
}

Bestand weergeven

@@ -48,6 +48,7 @@
#include "lim_types.h" #include "lim_types.h"
#include "wmi_unified_api.h" #include "wmi_unified_api.h"
#include "cdp_txrx_cmn.h" #include "cdp_txrx_cmn.h"
#include "ol_defines.h"
/* Platform specific configuration for max. no. of fragments */ /* Platform specific configuration for max. no. of fragments */
#define QCA_OL_11AC_TX_MAX_FRAGS 2 #define QCA_OL_11AC_TX_MAX_FRAGS 2

Bestand weergeven

@@ -28,6 +28,10 @@
#ifndef WMA_INTERNAL_H #ifndef WMA_INTERNAL_H
#define WMA_INTERNAL_H #define WMA_INTERNAL_H
#if !defined(REMOVE_PKT_LOG)
#include "pktlog_ac.h"
#endif
/* ################### defines ################### */ /* ################### defines ################### */
/* /*
* TODO: Following constant should be shared by firwmare in * TODO: Following constant should be shared by firwmare in

Bestand weergeven

@@ -76,6 +76,7 @@
#include "cds_concurrency.h" #include "cds_concurrency.h"
#include "wma_nan_datapath.h"
/** /**
* wma_find_vdev_by_addr() - find vdev_id from mac address * wma_find_vdev_by_addr() - find vdev_id from mac address
@@ -210,6 +211,9 @@ enum wlan_op_mode wma_get_txrx_vdev_type(uint32_t type)
case WMI_VDEV_TYPE_MONITOR: case WMI_VDEV_TYPE_MONITOR:
vdev_type = wlan_op_mode_monitor; vdev_type = wlan_op_mode_monitor;
break; break;
case WMI_VDEV_TYPE_NDI:
vdev_type = wlan_op_mode_ndi;
break;
default: default:
WMA_LOGE("Invalid vdev type %u", type); WMA_LOGE("Invalid vdev type %u", type);
vdev_type = wlan_op_mode_unknown; vdev_type = wlan_op_mode_unknown;
@@ -1584,7 +1588,8 @@ ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle,
if (((self_sta_req->type == WMI_VDEV_TYPE_AP) && if (((self_sta_req->type == WMI_VDEV_TYPE_AP) &&
(self_sta_req->sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE)) || (self_sta_req->sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE)) ||
(self_sta_req->type == WMI_VDEV_TYPE_OCB) || (self_sta_req->type == WMI_VDEV_TYPE_OCB) ||
(self_sta_req->type == WMI_VDEV_TYPE_MONITOR)) { (self_sta_req->type == WMI_VDEV_TYPE_MONITOR) ||
(self_sta_req->type == WMI_VDEV_TYPE_NDI)) {
WMA_LOGA("Creating self peer %pM, vdev_id %hu", WMA_LOGA("Creating self peer %pM, vdev_id %hu",
self_sta_req->self_mac_addr, self_sta_req->session_id); self_sta_req->self_mac_addr, self_sta_req->session_id);
status = wma_create_peer(wma_handle, txrx_pdev, status = wma_create_peer(wma_handle, txrx_pdev,
@@ -3286,6 +3291,10 @@ void wma_add_bss(tp_wma_handle wma, tpAddBssParams params)
break; break;
#endif #endif
case QDF_NDI_MODE:
wma_add_bss_ndi_mode(wma, params);
break;
default: default:
wma_add_bss_sta_mode(wma, params); wma_add_bss_sta_mode(wma, params);
break; break;

Bestand weergeven

@@ -24,8 +24,12 @@
* WMA NAN Data path API implementation * WMA NAN Data path API implementation
*/ */
#include "wma.h"
#include "wma_api.h"
#include "wmi_unified_api.h"
#include "wmi_unified.h"
#include "wma_nan_datapath.h" #include "wma_nan_datapath.h"
#include "wma_internal.h"
/** /**
* wma_handle_ndp_initiator_req() - NDP initiator request handler * wma_handle_ndp_initiator_req() - NDP initiator request handler
@@ -162,3 +166,90 @@ QDF_STATUS wma_ndp_sched_update_rsp_event_handler(void *handle,
{ {
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
/**
* wma_add_bss_ndi_mode() - Process BSS creation request while adding NaN
* Data interface
* @wma: wma handle
* @add_bss: Parameters for ADD_BSS command
*
* Sends VDEV_START command to firmware
* Return: None
*/
void wma_add_bss_ndi_mode(tp_wma_handle wma, tpAddBssParams add_bss)
{
ol_txrx_pdev_handle pdev;
struct wma_vdev_start_req req;
ol_txrx_peer_handle peer = NULL;
struct wma_target_req *msg;
u_int8_t vdev_id, peer_id;
QDF_STATUS status;
struct vdev_set_params param = {0};
WMA_LOGI("%s: enter", __func__);
if (NULL == wma_find_vdev_by_addr(wma, add_bss->bssId, &vdev_id)) {
WMA_LOGE("%s: Failed to find vdev", __func__);
goto send_fail_resp;
}
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
if (pdev) {
WMA_LOGE("%s: Failed to get pdev", __func__);
goto send_fail_resp;
}
wma_set_bss_rate_flags(&wma->interfaces[vdev_id], add_bss);
peer = ol_txrx_find_peer_by_addr(pdev, add_bss->selfMacAddr, &peer_id);
if (!peer) {
WMA_LOGE("%s Failed to find peer %pM", __func__,
add_bss->selfMacAddr);
goto send_fail_resp;
}
msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
WMA_TARGET_REQ_TYPE_VDEV_START, add_bss,
WMA_VDEV_START_REQUEST_TIMEOUT);
if (!msg) {
WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
__func__, vdev_id);
goto send_fail_resp;
}
add_bss->staContext.staIdx = ol_txrx_local_peer_id(peer);
/*
* beacon_intval, dtim_period, hidden_ssid, is_dfs, ssid
* will be ignored for NDI device.
*/
qdf_mem_zero(&req, sizeof(req));
req.vdev_id = vdev_id;
req.chan = add_bss->currentOperChannel;
req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
req.vht_capable = add_bss->vhtCapable;
req.max_txpow = add_bss->maxTxPower;
req.oper_mode = add_bss->operMode;
status = wma_vdev_start(wma, &req, false);
if (status != QDF_STATUS_SUCCESS) {
wma_remove_vdev_req(wma, vdev_id,
WMA_TARGET_REQ_TYPE_VDEV_START);
goto send_fail_resp;
}
WMA_LOGI("%s: vdev start request for NDI sent to target", __func__);
/* Initialize protection mode to no protection */
param.if_id = vdev_id;
param.param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
param.param_value = WMI_VDEV_PARAM_PROTECTION_MODE;
if (wmi_unified_vdev_set_param_send(wma->wmi_handle, &param))
WMA_LOGE("Failed to initialize protection mode");
return;
send_fail_resp:
add_bss->status = QDF_STATUS_E_FAILURE;
wma_send_msg(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
}

Bestand weergeven

@@ -32,6 +32,8 @@
#ifdef WLAN_FEATURE_NAN_DATAPATH #ifdef WLAN_FEATURE_NAN_DATAPATH
void wma_add_bss_ndi_mode(tp_wma_handle wma, tpAddBssParams add_bss);
/** /**
* wma_update_hdd_cfg_ndp() - Update target device NAN datapath capability * wma_update_hdd_cfg_ndp() - Update target device NAN datapath capability
* @wma_handle: pointer to WMA context * @wma_handle: pointer to WMA context
@@ -51,6 +53,11 @@ static inline void wma_update_hdd_cfg_ndp(tp_wma_handle wma_handle,
{ {
return; return;
} }
static inline void wma_add_bss_ndi_mode(tp_wma_handle wma,
tpAddBssParams add_bss)
{
return;
}
#endif /* WLAN_FEATURE_NAN_DATAPATH */ #endif /* WLAN_FEATURE_NAN_DATAPATH */