wlan: TL: Add host scan mac-spoofing support
Extend the functionality of spoofing of mac addr
in host initiated scans. Now both FW initiated
scans and host initiated scans will be spoofed.
- Use selfsta addr even for spoofed probe req packets
to find selfstaidx to fill TxBDs.
Change-Id: Ic2ca2744452c7e558468efbacf7e2960d16b2f48
CRs-Fixed: 737889
diff --git a/CORE/TL/inc/wlan_qct_tl.h b/CORE/TL/inc/wlan_qct_tl.h
index 8b268da..f807c52 100644
--- a/CORE/TL/inc/wlan_qct_tl.h
+++ b/CORE/TL/inc/wlan_qct_tl.h
@@ -149,6 +149,12 @@
WLANTL_AC_VO = 3
}WLANTL_ACEnumType;
+typedef struct
+{
+ v_MACADDR_t selfMac;
+ v_MACADDR_t spoofMac;
+}WLANTL_SpoofMacAddr;
+
/*---------------------------------------------------------------------------
STA Type
---------------------------------------------------------------------------*/
@@ -1718,6 +1724,42 @@
/*==========================================================================
+ FUNCTION WLANTL_updateSpoofMacAddr
+
+ DESCRIPTION
+ Called by HDD to update macaddr
+
+ DEPENDENCIES
+ TL must be initialized before this API can be called.
+
+ PARAMETERS
+
+ IN
+ pvosGCtx: pointer to the global vos context; a handle to
+ TL's control block can be extracted from its context
+ spoofMacAddr: spoofed mac adderess
+ selfMacAddr: self Mac Address
+
+ RETURN VALUE
+ The result code associated with performing the operation
+
+ VOS_STATUS_E_INVAL: Input parameters are invalid
+ VOS_STATUS_E_FAULT: pointer to TL cb is NULL ; access would cause a
+ page fault
+ VOS_STATUS_SUCCESS: Everything is good :)
+
+ SIDE EFFECTS
+
+============================================================================*/
+VOS_STATUS
+WLANTL_updateSpoofMacAddr
+(
+ v_PVOID_t pvosGCtx,
+ v_MACADDR_t* spoofMacAddr,
+ v_MACADDR_t* selfMacAddr
+);
+/*==========================================================================
+
FUNCTION WLANTL_RegisterMgmtFrmClient
DESCRIPTION
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 6f35dad..288eb50 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -204,6 +204,9 @@
( ( WLANTL_80211_MGMT_ACTION_SUBTYPE == ( (_type_sub) & 0xF )) || \
( WLANTL_80211_MGMT_ACTION_NO_ACK_SUBTYPE == ( (_type_sub) & 0xF ))))
+#define WLANTL_IS_PROBE_REQ(_type_sub) \
+ ( WLANTL_MGMT_PROBE_REQ_FRAME_TYPE == ( (_type_sub) & 0x3F ))
+
#define WLANTL_IS_CTRL_FRAME(_type_sub) \
( WLANTL_CTRL_FRAME_TYPE == ( (_type_sub) & 0x30 ))
@@ -2973,7 +2976,78 @@
/*----------------------------------------------------------------------------
INTERACTION WITH PE
---------------------------------------------------------------------------*/
+/*==========================================================================
+ FUNCTION WLANTL_updateSpoofMacAddr
+
+ DESCRIPTION
+ Called by HDD to update macaddr
+
+ DEPENDENCIES
+ TL must be initialized before this API can be called.
+
+ PARAMETERS
+
+ IN
+ pvosGCtx: pointer to the global vos context; a handle to
+ TL's control block can be extracted from its context
+ spoofMacAddr: spoofed mac adderess
+ selfMacAddr: self Mac Address
+
+ RETURN VALUE
+ The result code associated with performing the operation
+
+ VOS_STATUS_E_INVAL: Input parameters are invalid
+ VOS_STATUS_E_FAULT: pointer to TL cb is NULL ; access would cause a
+ page fault
+ VOS_STATUS_SUCCESS: Everything is good :)
+
+ SIDE EFFECTS
+
+============================================================================*/
+VOS_STATUS
+WLANTL_updateSpoofMacAddr
+(
+ v_PVOID_t pvosGCtx,
+ v_MACADDR_t* spoofMacAddr,
+ v_MACADDR_t* selfMacAddr
+)
+{
+ WLANTL_CbType* pTLCb = NULL;
+ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+
+ /*------------------------------------------------------------------------
+ Sanity check
+ ------------------------------------------------------------------------*/
+ if ( NULL == spoofMacAddr || NULL == selfMacAddr)
+ {
+ VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "WLAN TL:Invalid parameter sent on WLANTL_updateSpoofMacAddr");
+ return VOS_STATUS_E_INVAL;
+ }
+
+ /*------------------------------------------------------------------------
+ Extract TL control block
+ ------------------------------------------------------------------------*/
+ pTLCb = VOS_GET_TL_CB(pvosGCtx);
+ if ( NULL == pTLCb )
+ {
+ VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "WLAN TL:Invalid TL pointer from pvosGCtx on WLANTL_ChangeSTAState");
+ return VOS_STATUS_E_FAULT;
+ }
+
+ vos_mem_copy(pTLCb->spoofMacAddr.selfMac.bytes, selfMacAddr,
+ VOS_MAC_ADDRESS_LEN);
+ vos_mem_copy(pTLCb->spoofMacAddr.spoofMac.bytes, spoofMacAddr,
+ VOS_MAC_ADDRESS_LEN);
+
+ VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,
+ "TL: SelfSTA mac Addr for current Scan "MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(pTLCb->spoofMacAddr.selfMac.bytes));
+
+ return VOS_STATUS_SUCCESS;
+}/* WLANTL_updateSpoofMacAddr */
/*==========================================================================
FUNCTION WLANTL_RegisterMgmtFrmClient
@@ -3316,12 +3390,25 @@
{
uQosHdr = VOS_TRUE;
}
+
+ if (WLANTL_IS_PROBE_REQ(wFrmType))
+ {
+ if (VOS_TRUE == vos_mem_compare((v_VOID_t*) pvAddr2MacAddr,
+ (v_VOID_t*) &pTLCb->spoofMacAddr.spoofMac, VOS_MAC_ADDRESS_LEN))
+ {
+ pvAddr2MacAddr = (v_PVOID_t)pTLCb->spoofMacAddr.selfMac.bytes;
+ VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
+ "TL: using self sta addr to get staidx for spoofed probe req "
+ MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pvAddr2MacAddr->bytes));
+ }
+ }
+
/*----------------------------------------------------------------------
Call WDA to build TX header
----------------------------------------------------------------------*/
vosStatus = WDA_DS_BuildTxPacketInfo( pvosGCtx, vosFrmBuf , &vDestMacAddr,
1 /* always 802.11 frames*/, &usPktLen, uQosHdr /*qos not enabled !!!*/,
- 0 /* WDS off */, 0, wFrmType, pvAddr2MacAddr, ucTid,
+ 0 /* WDS off */, 0, wFrmType, pvAddr2MacAddr, ucTid,
ucAckResponse, usTimeStamp, 0, 0 );
diff --git a/CORE/TL/src/wlan_qct_tli.h b/CORE/TL/src/wlan_qct_tli.h
index 1215177..baabbfd 100644
--- a/CORE/TL/src/wlan_qct_tli.h
+++ b/CORE/TL/src/wlan_qct_tli.h
@@ -168,6 +168,8 @@
#define WLANTL_CTRL_FRAME_TYPE 0x10
#define WLANTL_DATA_FRAME_TYPE 0x20
+#define WLANTL_MGMT_PROBE_REQ_FRAME_TYPE 0x04
+
/*Value of the data type field in the 802.11 frame */
#define WLANTL_80211_DATA_TYPE 0x02
#define WLANTL_80211_DATA_QOS_SUBTYPE 0x08
@@ -863,6 +865,8 @@
/* Current served station ID in round-robin method to traverse all stations.*/
WLANTL_ACEnumType uCurServedAC;
+ WLANTL_SpoofMacAddr spoofMacAddr;
+
/* How many weights have not been served in current AC. */
v_U8_t ucCurLeftWeight;