wlan: Monitor Mode.
This change contains
1)interaction with user using iwpriv commands.
2)interaction with firmware using WDI req/resp
in case of monitor mode.
3)Start req send to firmware will share the
monitor mode configuration with firmware
as per user request.
Change-Id: Iba823320f1a111910d8c8094aca5723640d1eb9c
CRs-Fixed: 816464
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index aa80d4d..8d18a9d 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -1522,7 +1522,9 @@
tANI_U8* wlan_hdd_get_intf_addr(hdd_context_t* pHddCtx);
void wlan_hdd_release_intf_addr(hdd_context_t* pHddCtx, tANI_U8* releaseAddr);
v_U8_t hdd_get_operating_channel( hdd_context_t *pHddCtx, device_mode_t mode );
-
+void wlan_hdd_mon_set_typesubtype( hdd_mon_ctx_t *pMonCtx,int type);
+VOS_STATUS wlan_hdd_mon_poststartmsg( hdd_mon_ctx_t *pMonCtx );
+void wlan_hdd_mon_poststopmsg( void );
void hdd_set_conparam ( v_UINT_t newParam );
tVOS_CON_MODE hdd_get_conparam( void );
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 7bea316..80dd5cb 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -8196,6 +8196,52 @@
spin_unlock(&hdd_context_lock);
}
+void wlan_hdd_mon_set_typesubtype( hdd_mon_ctx_t *pMonCtx,int type)
+{
+ pMonCtx->typeSubtypeBitmap = 0;
+ if( type%10 ) /* Management Packets */
+ pMonCtx->typeSubtypeBitmap |= 0xFFFF;
+ type/=10;
+ if( type%10 ) /* Control Packets */
+ pMonCtx->typeSubtypeBitmap |= 0xFFFF0000;
+ type/=10;
+ if( type%10 ) /* Data Packets */
+ pMonCtx->typeSubtypeBitmap |= 0xFFFF00000000;
+}
+
+VOS_STATUS wlan_hdd_mon_poststartmsg( hdd_mon_ctx_t *pMonCtx )
+{
+ vos_msg_t monMsg;
+
+ monMsg.type = WDA_MON_START_REQ;
+ monMsg.reserved = 0;
+ monMsg.bodyptr = (v_U8_t*)pMonCtx;
+ monMsg.bodyval = 0;
+
+ if (VOS_STATUS_SUCCESS != vos_mq_post_message(
+ VOS_MODULE_ID_WDA,(vos_msg_t *)&monMsg)) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ return VOS_STATUS_SUCCESS;
+}
+
+void wlan_hdd_mon_poststopmsg(void)
+{
+ vos_msg_t monMsg;
+
+ monMsg.type = WDA_MON_STOP_REQ;
+ monMsg.reserved = 0;
+ monMsg.bodyptr = NULL;
+ monMsg.bodyval = 0;
+
+ if (VOS_STATUS_SUCCESS != vos_mq_post_message(
+ VOS_MODULE_ID_WDA,(vos_msg_t *)&monMsg)) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
+ }
+}
+
void wlan_hdd_mon_close(hdd_context_t *pHddCtx)
{
VOS_STATUS vosStatus;
@@ -8208,6 +8254,8 @@
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
return ;
}
+
+ wlan_hdd_mon_poststopmsg();
hdd_UnregisterWext(pAdapter->dev);
vos_mon_stop( pVosContext );
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 087e9cd..83be8ea 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -171,7 +171,7 @@
#define WE_SET_TDLS_2040_BSS_COEXISTENCE 20
#endif
#define WE_SET_RTS_CTS_HTVHT 21
-
+#define WE_SET_MONITOR_STATE 22
/* Private ioctls and their sub-ioctls */
#define WLAN_PRIV_SET_NONE_GET_INT (SIOCIWFIRSTPRIV + 1)
@@ -256,6 +256,8 @@
#define WE_MTRACE_DUMP_CMD 8
#define WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD 9
+#define WE_CONFIGURE_MONITOR_MODE 10
+#define WE_SET_MONITOR_MODE_FILTER 11
#ifdef FEATURE_WLAN_TDLS
#undef MAX_VAR_ARGS
@@ -5364,6 +5366,7 @@
tHalHandle hHal;
hdd_wext_state_t *pWextState;
hdd_context_t *pHddCtx;
+ hdd_mon_ctx_t *pMonCtx = NULL;
int *value = (int *)extra;
int sub_cmd = value[0];
int set_value = value[1];
@@ -5894,6 +5897,24 @@
}
break;
}
+ case WE_SET_MONITOR_STATE:
+ {
+
+ pMonCtx = WLAN_HDD_GET_MONITOR_CTX_PTR(pAdapter);
+ if( pMonCtx == NULL )
+ {
+ hddLog(LOGE, "Monitor Context NULL");
+ break;
+ }
+ pMonCtx->state = set_value;
+ if( set_value )
+ wlan_hdd_mon_poststartmsg(pMonCtx);
+ else
+ wlan_hdd_mon_poststopmsg();
+
+ break;
+ }
+
default:
{
hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
@@ -7141,8 +7162,10 @@
int sub_cmd;
int *apps_args = (int *) extra;
hdd_station_ctx_t *pStaCtx = NULL ;
+ hdd_mon_ctx_t *pMonCtx = NULL;
hdd_context_t *pHddCtx = NULL;
hdd_ap_ctx_t *pAPCtx = NULL;
+ v_CONTEXT_t pVosContext;
int cmd = 0;
int staId = 0;
int ret = 0;
@@ -7161,6 +7184,7 @@
"%s: Adapter is NULL",__func__);
return -EINVAL;
}
+ pVosContext = ( WLAN_HDD_GET_CTX(pAdapter))->pvosContext;
pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
ret = wlan_hdd_validate_context(pHddCtx);
if (0 != ret)
@@ -7301,6 +7325,66 @@
}
break;
#endif
+ case WE_CONFIGURE_MONITOR_MODE:
+ {
+ pMonCtx = WLAN_HDD_GET_MONITOR_CTX_PTR(pAdapter);
+ if( pMonCtx == NULL )
+ {
+ hddLog(LOGE, "Monitor Context NULL");
+ break;
+ }
+ hddLog(LOG1, "%s: Monitor MOde Configuration: ChNo=%d ChBW=%d CRCCheck=%d type=%d ConversionBit=%d",
+ __func__, apps_args[0], apps_args[1], apps_args[2],
+ apps_args[3], apps_args[4]);
+ /* Input Validation part of FW */
+ pMonCtx->ChannelNo = apps_args[0];
+ pMonCtx->ChannelBW = apps_args[1];
+ pMonCtx->crcCheckEnabled = apps_args[2];
+ wlan_hdd_mon_set_typesubtype( pMonCtx,apps_args[3]);
+ pMonCtx->is80211to803ConReq = apps_args[4];
+ WLANTL_SetIsConversionReq(pVosContext,apps_args[4]);
+ if( pMonCtx->is80211to803ConReq )
+ pAdapter->dev->type = ARPHRD_ETHER;
+ else
+ pAdapter->dev->type = ARPHRD_IEEE80211_RADIOTAP;
+ if( (apps_args[3]!= 100 && apps_args[3]!= 0) && apps_args[4] )
+ {
+ hddLog(LOGE, "%s: Filtering data packets as management and control"
+ " cannot be converted to 802.3 ",__func__);
+ pMonCtx->typeSubtypeBitmap = 0xFFFF00000000;
+ }
+ if( pMonCtx->state )
+ wlan_hdd_mon_poststartmsg(pMonCtx);
+ }
+ break;
+
+ case WE_SET_MONITOR_MODE_FILTER:
+ {
+ pMonCtx = WLAN_HDD_GET_MONITOR_CTX_PTR(pAdapter);
+ if( pMonCtx == NULL )
+ {
+ hddLog(LOGE, "Monitor Context NULL");
+ break;
+ }
+ /* Input Validation Part of FW */
+ pMonCtx->numOfMacFilters=1;
+ pMonCtx->mmFilters[0].macAddr.bytes[0]=apps_args[0];
+ pMonCtx->mmFilters[0].macAddr.bytes[1]=apps_args[1];
+ pMonCtx->mmFilters[0].macAddr.bytes[2]=apps_args[2];
+ pMonCtx->mmFilters[0].macAddr.bytes[3]=apps_args[3];
+ pMonCtx->mmFilters[0].macAddr.bytes[4]=apps_args[4];
+ pMonCtx->mmFilters[0].macAddr.bytes[5]=apps_args[5];
+ pMonCtx->mmFilters[0].isA1filter = apps_args[6];
+ pMonCtx->mmFilters[0].isA2filter = apps_args[7];
+ pMonCtx->mmFilters[0].isA3filter = apps_args[8];
+ hddLog(LOG1, "%s: Monitor Filter: %pM A1=%d A2=%d A3=%d ",
+ __func__, pMonCtx->mmFilters[0].macAddr.bytes,
+ apps_args[6], apps_args[7], apps_args[8]);
+ if( pMonCtx->state )
+ wlan_hdd_mon_poststartmsg(pMonCtx);
+ }
+ break;
+
default:
{
hddLog(LOGE, "%s: Invalid IOCTL command %d",
@@ -10026,6 +10110,10 @@
/*Maximum command length can be only 15 */
static const struct iw_priv_args we_private_args[] = {
+ { WE_SET_MONITOR_STATE,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0, "monitor" },
+
/* handlers for main ioctl */
{ WLAN_PRIV_SET_INT_GET_NONE,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
@@ -10433,6 +10521,18 @@
"setTdlsConfig" },
#endif
+ {
+ WE_CONFIGURE_MONITOR_MODE,
+ IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
+ 0,
+ "MonitorModeConf" },
+
+ {
+ WE_SET_MONITOR_MODE_FILTER,
+ IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
+ 0,
+ "MonitorFilter" },
+
/* handlers for main ioctl */
{ WLAN_PRIV_ADD_TSPEC,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | HDD_WLAN_WMM_PARAM_COUNT,
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index b7ff619..fd711be 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -709,6 +709,8 @@
#define SIR_HAL_NAN_REQUEST (SIR_HAL_ITC_MSG_TYPES_BEGIN + 267)
#define SIR_HAL_SET_RTS_CTS_HTVHT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 268)
+#define SIR_HAL_MON_START_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 269)
+#define SIR_HAL_MON_STOP_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 270)
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
// CFG message types
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 2671fd8..719dcc1 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1248,6 +1248,8 @@
#define WDA_FW_STATS_GET_REQ SIR_HAL_FW_STATS_GET_REQ
#define WDA_SET_RTS_CTS_HTVHT SIR_HAL_SET_RTS_CTS_HTVHT
+#define WDA_MON_START_REQ SIR_HAL_MON_START_REQ
+#define WDA_MON_STOP_REQ SIR_HAL_MON_STOP_REQ
tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg);
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 453d6a9..7957ca9 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -260,6 +260,8 @@
tANI_U32 val);
+VOS_STATUS WDA_ProcessMonStartReq( tWDA_CbContext *pWDA, void* wdaRequest);
+VOS_STATUS WDA_ProcessMonStopReq( tWDA_CbContext *pWDA, void* wdaRequest);
/*
* FUNCTION: WDA_ProcessNanRequest
* Process NAN request
@@ -14143,6 +14145,18 @@
WDA_ProcessSetRtsCtsHTVhtInd( pWDA, pMsg->bodyval);
break;
}
+
+ case WDA_MON_START_REQ:
+ {
+ WDA_ProcessMonStartReq(pWDA,(v_PVOID_t)pMsg->bodyptr);
+ break;
+ }
+ case WDA_MON_STOP_REQ:
+ {
+ WDA_ProcessMonStopReq(pWDA,NULL);
+ break;
+ }
+
default:
{
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
@@ -19044,3 +19058,107 @@
}
return CONVERT_WDI2VOS_STATUS(status) ;
}
+void WDA_MonStartRspCallback(void *pEventData, void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "<------ %s " ,__func__);
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return ;
+ }
+
+ vos_mem_free(pWdaParams) ;
+
+ return;
+}
+
+
+VOS_STATUS WDA_ProcessMonStartReq( tWDA_CbContext *pWDA, void* wdaRequest)
+{
+
+ WDI_Status status = WDI_STATUS_SUCCESS;
+ tWDA_ReqParams *pWdaParams;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ FL("%s: "), __func__);
+ pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ FL("%s: VOS MEM Alloc Failure"), __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_NOMEM;
+ }
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = wdaRequest;
+ pWdaParams->wdaWdiApiMsgParam = NULL;
+
+ status = WDI_MonStartReq((void *)wdaRequest,
+ (WDI_MonStartRspCb)WDA_MonStartRspCallback,
+ (void *)pWdaParams);
+ if (IS_WDI_STATUS_FAILURE(status))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure to request. Free all the memory " );
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+ return CONVERT_WDI2VOS_STATUS(status);
+}
+
+void WDA_MonStopRspCallback(void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "<------ %s " ,__func__);
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0) ;
+ return ;
+ }
+
+ vos_mem_free(pWdaParams) ;
+
+ return;
+}
+
+VOS_STATUS WDA_ProcessMonStopReq( tWDA_CbContext *pWDA, void* wdaRequest)
+{
+
+ WDI_Status status = WDI_STATUS_SUCCESS;
+ tWDA_ReqParams *pWdaParams;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ FL("%s: "), __func__);
+ pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
+ if (NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ FL("%s: VOS MEM Alloc Failure"), __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_NOMEM;
+ }
+ pWdaParams->pWdaContext = pWDA;
+ pWdaParams->wdaMsgParam = wdaRequest;
+ pWdaParams->wdaWdiApiMsgParam = NULL;
+
+ status = WDI_MonStopReq((WDI_MonStopRspCb)WDA_MonStopRspCallback,
+ (void *)pWdaParams);
+
+ if (IS_WDI_STATUS_FAILURE(status))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure to request. Free all the memory " );
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+ return CONVERT_WDI2VOS_STATUS(status);
+}
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index 5052932..c1d9ac1 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -6065,6 +6065,31 @@
wpt_payload data;
}wpt_pkt80211;
+#define NUM_FILTERS_SUPPORTED 1
+typedef struct
+{
+ wpt_macAddr macAddr;
+ wpt_uint8 isA1filter;
+ wpt_uint8 isA2filter;
+ wpt_uint8 isA3filter;
+}WDI_filter;
+
+typedef struct
+{
+ /* start or stop */
+ wpt_uint8 state;
+ /*Conversion of packet required or not*/
+ wpt_uint8 is80211to803ConReq;
+ wpt_uint32 ChannelNo;
+ wpt_uint32 ChannelBW;
+ wpt_uint8 crcCheckEnabled;
+ wpt_uint8 numOfMacFilters;
+ WDI_filter mmFilters[NUM_FILTERS_SUPPORTED];
+ wpt_uint64 typeSubtypeBitmap;
+ wpt_uint64 rsvd;
+
+}WDI_MonStartReqType;
+
/*----------------------------------------------------------------------------
* WDI callback types
*--------------------------------------------------------------------------*/
@@ -7982,6 +8007,9 @@
typedef void (*WDI_GetFrameLogRspCb)(
WDI_GetFrameLogRspParamType *wdiRsp, void *pUserData);
+typedef void (*WDI_MonStartRspCb)(void *pEventData,void *pUserData);
+typedef void (*WDI_MonStopRspCb)(void *pUserData);
+
/*========================================================================
* Function Declarations and Documentation
==========================================================================*/
@@ -11332,6 +11360,19 @@
wpt_uint32 pUserData
);
+WDI_Status WDI_MonStartReq
+(
+ WDI_MonStartReqType* pwdiMonStartReqParams,
+ WDI_MonStartRspCb wdiMonStartRspCb,
+ void* pUserData
+);
+
+WDI_Status WDI_MonStopReq
+(
+ WDI_MonStopRspCb wdiMonStopRspCb,
+ void* pUserData
+);
+
#ifdef FEATURE_WLAN_BATCH_SCAN
/**
@brief WDI_SetBatchScanReq
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
index a1970f4..a8d78f5 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
@@ -476,6 +476,9 @@
/* NAN Request */
WDI_NAN_REQUEST = 106,
+ WDI_MON_START_REQ = 107,
+ WDI_MON_STOP_REQ = 108,
+
WDI_MAX_REQ,
/*Send a suspend Indication down to HAL*/
@@ -812,6 +815,9 @@
WDI_NAN_RESPONSE = 106,
+ WDI_MON_START_RSP = 107,
+ WDI_MON_STOP_RSP = 108,
+
/*-------------------------------------------------------------------------
Indications
!! Keep these last in the enum if possible
@@ -6226,6 +6232,33 @@
WDI_EventInfoType* pEventData
);
+WDI_Status
+WDI_ProcessMonStartReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessMonStartRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessMonStopReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
+
+WDI_Status
+WDI_ProcessMonStopRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+);
#endif /*WLAN_QCT_WDI_I_H*/
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 404c69c..a64a63e 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -476,6 +476,8 @@
WDI_ProcessNanRequest, /* WDI_NAN_REQUEST*/
+ WDI_ProcessMonStartReq, /* WDI_MON_START_REQ */
+ WDI_ProcessMonStopReq, /* WDI_MON_STOP_REQ */
/*-------------------------------------------------------------------------
Indications
-------------------------------------------------------------------------*/
@@ -745,6 +747,8 @@
WDI_ProcessNanResponse, /* WDI_NAN_RESPONSE */
+ WDI_ProcessMonStartRsp, /* WDI_MON_START_RSP*/
+ WDI_ProcessMonStopRsp, /* WDI_MON_STOP_RSP*/
/*---------------------------------------------------------------------
Indications
---------------------------------------------------------------------*/
@@ -1170,6 +1174,8 @@
CASE_RETURN_STRING( WDI_GET_FRAME_LOG_REQ);
CASE_RETURN_STRING( WDI_NAN_REQUEST );
CASE_RETURN_STRING( WDI_SET_RTS_CTS_HTVHT_IND );
+ CASE_RETURN_STRING( WDI_MON_START_REQ );
+ CASE_RETURN_STRING( WDI_MON_STOP_REQ );
default:
return "Unknown WDI MessageId";
}
@@ -24136,7 +24142,10 @@
return WLAN_HAL_NAN_REQ;
case WDI_SET_RTS_CTS_HTVHT_IND:
return WLAN_HAL_SET_RTS_CTS_HTVHT_IND;
-
+ case WDI_MON_START_REQ:
+ return WLAN_HAL_ENABLE_MONITOR_MODE_REQ;
+ case WDI_MON_STOP_REQ:
+ return WLAN_HAL_DISABLE_MONITOR_MODE_REQ;
default:
return WLAN_HAL_MSG_MAX;
}
@@ -24462,7 +24471,10 @@
return WDI_NAN_RESPONSE;
case WLAN_HAL_NAN_EVT:
return WDI_HAL_NAN_EVENT;
-
+ case WLAN_HAL_ENABLE_MONITOR_MODE_RSP:
+ return WDI_MON_START_RSP;
+ case WLAN_HAL_DISABLE_MONITOR_MODE_RSP:
+ return WDI_MON_STOP_RSP;
default:
return eDRIVER_TYPE_MAX;
}
@@ -29512,6 +29524,75 @@
return featSupported;
}
+wpt_uint8 WDI_selectCbMode( wpt_uint8 channel, wpt_uint8 ChannelBW )
+{
+ /* 5gHz Channel */
+ if( channel >= 34 && channel <= 165 )
+ {
+ if( ChannelBW == 80 && WDI_getFwWlanFeatCaps(DOT11AC) )
+ {
+ if ( channel== 36 || channel == 52 || channel == 100 ||
+ channel == 116 || channel == 149 )
+ {
+ return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
+ }
+ else if ( channel == 40 || channel == 56 || channel == 104 ||
+ channel == 120 || channel == 153 )
+ {
+ return PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
+ }
+ else if ( channel == 44 || channel == 60 || channel == 108 ||
+ channel == 124 || channel == 157 )
+ {
+ return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
+ }
+ else if ( channel == 48 || channel == 64 || channel == 112 ||
+ channel == 128 || channel == 144 || channel == 161 )
+ {
+ return PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
+ }
+ else if ( channel == 165 )
+ {
+ return PHY_SINGLE_CHANNEL_CENTERED;
+ }
+ }
+
+ else
+ {
+ if ( channel== 40 || channel == 48 || channel == 56 ||
+ channel == 64 || channel == 104 || channel == 112 ||
+ channel == 120 || channel == 128 || channel == 136 ||
+ channel == 144 || channel == 153 || channel == 161 )
+ {
+ return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+ }
+ else if ( channel== 36 || channel == 44 || channel == 52 ||
+ channel == 60 || channel == 100 || channel == 108 ||
+ channel == 116 || channel == 124 || channel == 132 ||
+ channel == 140 || channel == 149 || channel == 157 )
+ {
+ return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
+ }
+ else if ( channel == 165 )
+ {
+ return PHY_SINGLE_CHANNEL_CENTERED;
+ }
+ }
+ }
+
+ /* 2.4Ghz Channel */
+ if( ChannelBW == 40 && WDI_getFwWlanFeatCaps(HT40_OBSS_SCAN) )
+ {
+ if (channel >= 1 && channel <= 7)
+ return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
+ else if (channel >= 8 && channel <= 13)
+ return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+ else if (channel ==14)
+ return PHY_SINGLE_CHANNEL_CENTERED;
+ }
+ return PHY_SINGLE_CHANNEL_CENTERED;
+}
+
#ifdef WLAN_FEATURE_11AC
WDI_Status
WDI_ProcessUpdateVHTOpModeReq
@@ -31949,6 +32030,248 @@
}
+WDI_Status
+WDI_MonStartReq(WDI_MonStartReqType* pwdiMonStartReqParams,
+ WDI_MonStartRspCb wdiMonStartRspCb,
+ void* pUserData)
+{
+ WDI_EventInfoType wdiEventData;
+
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+ "%s", __func__);
+
+ if ( eWLAN_PAL_FALSE == gWDIInitialized )
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_ERROR,
+ "WDI API call before module is initialized - Fail request");
+
+ return WDI_STATUS_E_NOT_ALLOWED;
+ }
+
+ wdiEventData.wdiRequest = WDI_MON_START_REQ;
+ wdiEventData.pEventData = pwdiMonStartReqParams;
+ wdiEventData.uEventDataSize = sizeof(*pwdiMonStartReqParams);
+ wdiEventData.pCBfnc = wdiMonStartRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+WDI_Status
+WDI_ProcessMonStartReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_MonStartReqType* pwdiMonStartReqParams;
+ WDI_MonStartRspCb wdiMonStartCb;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usSendSize = 0;
+ wpt_uint16 usDataOffset = 0;
+ tHalEnableMonitorModeReqParams halEnableMonitorModeParams;
+
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+ "%s", __func__);
+
+ if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
+ ( NULL == pEventData->pCBfnc ))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ pwdiMonStartReqParams = (WDI_MonStartReqType*)pEventData->pEventData;
+ wdiMonStartCb = (WDI_MonStartRspCb)pEventData->pCBfnc;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ ! TO DO : proper conversion into the HAL Message Request Format
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(
+ pWDICtx,
+ WDI_MON_START_REQ,
+ sizeof(tHalEnableMonitorModeReqParams),
+ &pSendBuffer, &usDataOffset,
+ &usSendSize))||
+ ( usSendSize < (usDataOffset + sizeof(halEnableMonitorModeParams) )))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "Unable to get send buffer in %s %p %p %p", __func__,
+ pEventData, pwdiMonStartReqParams, wdiMonStartCb);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ halEnableMonitorModeParams.channelNumber = pwdiMonStartReqParams->ChannelNo;
+ halEnableMonitorModeParams.cbState = WDI_selectCbMode(pwdiMonStartReqParams->ChannelNo,
+ pwdiMonStartReqParams->ChannelBW);
+ halEnableMonitorModeParams.maxAmpduLen = 0x1FFFF;
+ halEnableMonitorModeParams.maxMpduInAmpduLen = 0xF20-0x4C;
+ halEnableMonitorModeParams.crcCheckEnabled = pwdiMonStartReqParams->crcCheckEnabled;
+ halEnableMonitorModeParams.numMacFilters = pwdiMonStartReqParams->numOfMacFilters;
+ wpalMemoryCopy(halEnableMonitorModeParams.macFilters[0].macAddr,
+ pwdiMonStartReqParams->mmFilters[0].macAddr,
+ sizeof( wpt_macAddr ));
+ halEnableMonitorModeParams.macFilters[0].isA1filteringNeeded = pwdiMonStartReqParams->mmFilters[0].isA1filter;
+ halEnableMonitorModeParams.macFilters[0].isA2filteringNeeded = pwdiMonStartReqParams->mmFilters[0].isA2filter;
+ halEnableMonitorModeParams.macFilters[0].isA3filteringNeeded = pwdiMonStartReqParams->mmFilters[0].isA3filter;
+ halEnableMonitorModeParams.typeSubtypeBitmap = pwdiMonStartReqParams->typeSubtypeBitmap;
+
+ wpalMemoryCopy(pSendBuffer+usDataOffset,
+ &halEnableMonitorModeParams,
+ sizeof(halEnableMonitorModeParams));
+
+ pWDICtx->pReqStatusUserData = pEventData->pUserData;
+
+ return WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiMonStartCb, pEventData->pUserData,
+ WDI_MON_START_RSP);
+}
+
+WDI_Status
+WDI_ProcessMonStartRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_MonStartRspCb wdiMonStartRspCb;
+
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s: Enter ", __func__);
+ /*-------------------------------------------------------------------------
+ Sanity check
+ -------------------------------------------------------------------------*/
+ if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+ ( NULL == pEventData->pEventData))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ wdiMonStartRspCb = (WDI_MonStartRspCb)pWDICtx->pfncRspCB;
+
+ wdiMonStartRspCb((void *) pEventData->pEventData, pWDICtx->pRspCBUserData);
+
+ return WDI_STATUS_SUCCESS;
+}
+
+WDI_Status
+WDI_MonStopReq(WDI_MonStopRspCb wdiMonStopRspCb,
+ void* pUserData)
+{
+ WDI_EventInfoType wdiEventData;
+
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+ "%s", __func__);
+
+ if ( eWLAN_PAL_FALSE == gWDIInitialized )
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_ERROR,
+ "WDI API call before module is initialized - Fail request");
+
+ return WDI_STATUS_E_NOT_ALLOWED;
+ }
+
+ wdiEventData.wdiRequest = WDI_MON_STOP_REQ;
+ wdiEventData.pEventData = NULL;
+ wdiEventData.uEventDataSize = sizeof(NULL);
+ wdiEventData.pCBfnc = wdiMonStopRspCb;
+ wdiEventData.pUserData = pUserData;
+
+ return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+WDI_Status
+WDI_ProcessMonStopReq
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_MonStopRspCb wdiMonStopCb;
+ wpt_uint8* pSendBuffer = NULL;
+ wpt_uint16 usSendSize = 0;
+ wpt_uint16 usDataOffset = 0;
+ wpt_uint8 resetConfiguration;
+
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+ "%s", __func__);
+
+ if (( NULL == pEventData ) || ( NULL == pEventData->pCBfnc ))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ wdiMonStopCb = (WDI_MonStopRspCb)pEventData->pCBfnc;
+
+ /*-----------------------------------------------------------------------
+ Get message buffer
+ ! TO DO : proper conversion into the HAL Message Request Format
+ -----------------------------------------------------------------------*/
+ if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(
+ pWDICtx,
+ WDI_MON_STOP_REQ,
+ sizeof(wpt_uint8),
+ &pSendBuffer, &usDataOffset,
+ &usSendSize))||
+ ( usSendSize < (usDataOffset + sizeof(wpt_uint8) )))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "Unable to get send buffer in %s %p %p", __func__,
+ pEventData, wdiMonStopCb);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ wpalMemoryCopy(pSendBuffer+usDataOffset,
+ &resetConfiguration,
+ sizeof(wpt_uint8));
+
+ pWDICtx->pReqStatusUserData = pEventData->pUserData;
+
+ return WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+ wdiMonStopCb, pEventData->pUserData,
+ WDI_MON_STOP_RSP);
+}
+
+WDI_Status
+WDI_ProcessMonStopRsp
+(
+ WDI_ControlBlockType* pWDICtx,
+ WDI_EventInfoType* pEventData
+)
+{
+ WDI_MonStopRspCb wdiMonStopRspCb;
+
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s: Enter ", __func__);
+ /*-------------------------------------------------------------------------
+ Sanity check
+ -------------------------------------------------------------------------*/
+ if (( NULL == pWDICtx ) || ( NULL == pEventData ))
+ {
+ WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "%s: Invalid parameters", __func__);
+ WDI_ASSERT(0);
+ return WDI_STATUS_E_FAILURE;
+ }
+
+ wdiMonStopRspCb = (WDI_MonStopRspCb)pWDICtx->pfncRspCB;
+
+ wdiMonStopRspCb(pWDICtx->pRspCBUserData);
+
+ return WDI_STATUS_SUCCESS;
+}
+
#ifdef WLAN_FEATURE_EXTSCAN
/**
diff --git a/riva/inc/wlan_hal_msg.h b/riva/inc/wlan_hal_msg.h
index 9cd6157..6dea310 100644
--- a/riva/inc/wlan_hal_msg.h
+++ b/riva/inc/wlan_hal_msg.h
@@ -534,6 +534,7 @@
WLAN_HAL_DISABLE_MONITOR_MODE_REQ = 304,
WLAN_HAL_DISABLE_MONITOR_MODE_RSP = 305,
+
WLAN_HAL_SET_RTS_CTS_HTVHT_IND = 306,
WLAN_HAL_MSG_MAX = WLAN_HAL_MSG_TYPE_MAX_ENUM_SIZE
@@ -8525,6 +8526,89 @@
tMgmtLoggingInitResp tMgmtLoggingInitRespParams;
} tMgmtLoggingInitRespMsg, * tpMgmtLoggingInitRespMsg;
+/*---------------------------------------------------------------------------
+* WLAN_HAL_ENABLE_MONITOR_MODE_REQ
+*-------------------------------------------------------------------------*/
+
+/* only 1 filter is supported as of now */
+#define NUM_FILTERS_SUPPORTED 1
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tSirMacAddr macAddr;
+ tANI_U8 isA1filteringNeeded;
+ tANI_U8 isA2filteringNeeded;
+ tANI_U8 isA3filteringNeeded;
+}tHalMacFilter, *tpHalMacFilter;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tANI_U8 channelNumber;
+ ePhyChanBondState cbState;
+
+ tANI_U32 maxAmpduLen;
+ tANI_U32 maxMpduInAmpduLen;
+
+ tANI_U8 crcCheckEnabled;
+
+ /* value is "1" for this FR. "0" means no filter, RECEIVE ALL PACKETS */
+ tANI_U8 numMacFilters;
+ tHalMacFilter macFilters[NUM_FILTERS_SUPPORTED];
+
+ /* Each bit position maps to IEEE convention of typeSubtype */
+ tANI_U64 typeSubtypeBitmap;
+
+ tANI_U64 reserved;
+
+}tHalEnableMonitorModeReqParams, *tpHalEnableMonitorModeReqParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tHalMsgHeader header;
+ tHalEnableMonitorModeReqParams enableMonitorModeReqParams;
+}tHalEnableMonitorModeReqMsg, *tpHalEnableMonitorModeReqMsg;
+
+
+/*---------------------------------------------------------------------------
+* WLAN_HAL_ENABLE_MONITOR_MODE_RSP
+*-------------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tANI_U32 status;
+}tHalEnableMonitorModeRspParams, *tpHalEnableMonitorModeRspParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tHalMsgHeader header;
+ tHalEnableMonitorModeRspParams enableMonitorModeRspParams;
+}tHalEnableMonitorModeRspMsg, *tpHalEnableMonitorModeRspMsg;
+
+/*---------------------------------------------------------------------------
+* WLAN_HAL_DISABLE_MONITOR_MODE_REQ
+*-------------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tHalMsgHeader header;
+ tANI_U8 resetConfiguration;
+}tHalDisableMonitorModeReqMsg, *tpHalDisableMonitorModeReqMsg;
+
+/*---------------------------------------------------------------------------
+* WLAN_HAL_DISABLE_MONITOR_MODE_RSP
+*-------------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tANI_U32 status;
+}tHalDisableMonitorModeRspParams, *tpHalDisableMonitorModeRspParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+ tHalMsgHeader header;
+ tHalDisableMonitorModeRspParams disableMonitorModeRspParams;
+}tHalDisableMonitorModeRspMsg, *tpHalDisableMonitorModeRspMsg;
+
#if defined(__ANI_COMPILER_PRAGMA_PACK_STACK)
#pragma pack(pop)
#elif defined(__ANI_COMPILER_PRAGMA_PACK)