164064216a8433360745f69edddce19a606659163The Android Open Source Project /** \file mlmeBuilder.c
264064216a8433360745f69edddce19a606659163The Android Open Source Project *  \brief 802.11 MLME Builder
364064216a8433360745f69edddce19a606659163The Android Open Source Project *
464064216a8433360745f69edddce19a606659163The Android Open Source Project *  \see mlmeBuilder.h
564064216a8433360745f69edddce19a606659163The Android Open Source Project */
664064216a8433360745f69edddce19a606659163The Android Open Source Project
764064216a8433360745f69edddce19a606659163The Android Open Source Project/****************************************************************************
864064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
964064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1064064216a8433360745f69edddce19a606659163The Android Open Source Project**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
1164064216a8433360745f69edddce19a606659163The Android Open Source Project**| All rights reserved.                                                  |**
1264064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1364064216a8433360745f69edddce19a606659163The Android Open Source Project**| Redistribution and use in source and binary forms, with or without    |**
1464064216a8433360745f69edddce19a606659163The Android Open Source Project**| modification, are permitted provided that the following conditions    |**
1564064216a8433360745f69edddce19a606659163The Android Open Source Project**| are met:                                                              |**
1664064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1764064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions of source code must retain the above copyright     |**
1864064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer.      |**
1964064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions in binary form must reproduce the above copyright  |**
2064064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer in    |**
2164064216a8433360745f69edddce19a606659163The Android Open Source Project**|    the documentation and/or other materials provided with the         |**
2264064216a8433360745f69edddce19a606659163The Android Open Source Project**|    distribution.                                                      |**
2364064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Neither the name Texas Instruments nor the names of its            |**
2464064216a8433360745f69edddce19a606659163The Android Open Source Project**|    contributors may be used to endorse or promote products derived    |**
2564064216a8433360745f69edddce19a606659163The Android Open Source Project**|    from this software without specific prior written permission.      |**
2664064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
2764064216a8433360745f69edddce19a606659163The Android Open Source Project**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
2864064216a8433360745f69edddce19a606659163The Android Open Source Project**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
2964064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
3064064216a8433360745f69edddce19a606659163The Android Open Source Project**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
3164064216a8433360745f69edddce19a606659163The Android Open Source Project**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
3264064216a8433360745f69edddce19a606659163The Android Open Source Project**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
3364064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
3464064216a8433360745f69edddce19a606659163The Android Open Source Project**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
3564064216a8433360745f69edddce19a606659163The Android Open Source Project**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
3664064216a8433360745f69edddce19a606659163The Android Open Source Project**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
3764064216a8433360745f69edddce19a606659163The Android Open Source Project**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
3864064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
3964064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
4064064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************/
4164064216a8433360745f69edddce19a606659163The Android Open Source Project
4264064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************/
4364064216a8433360745f69edddce19a606659163The Android Open Source Project/*																		   */
4464064216a8433360745f69edddce19a606659163The Android Open Source Project/*		MODULE:	mlmeBuilder.c											   */
4564064216a8433360745f69edddce19a606659163The Android Open Source Project/*    PURPOSE:	802.11 MLME Builder										   */
4664064216a8433360745f69edddce19a606659163The Android Open Source Project/*																	 	   */
4764064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************/
4864064216a8433360745f69edddce19a606659163The Android Open Source Project
4964064216a8433360745f69edddce19a606659163The Android Open Source Project
5064064216a8433360745f69edddce19a606659163The Android Open Source Project
5164064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osApi.h"
5264064216a8433360745f69edddce19a606659163The Android Open Source Project
5364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "paramOut.h"
5464064216a8433360745f69edddce19a606659163The Android Open Source Project#include "paramIn.h"
5564064216a8433360745f69edddce19a606659163The Android Open Source Project
5664064216a8433360745f69edddce19a606659163The Android Open Source Project#include "utils.h"
5764064216a8433360745f69edddce19a606659163The Android Open Source Project
5864064216a8433360745f69edddce19a606659163The Android Open Source Project#include "report.h"
5964064216a8433360745f69edddce19a606659163The Android Open Source Project
6064064216a8433360745f69edddce19a606659163The Android Open Source Project#include "802_11Defs.h"
6164064216a8433360745f69edddce19a606659163The Android Open Source Project
6264064216a8433360745f69edddce19a606659163The Android Open Source Project#include "DataCtrl_Api.h"
6364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "memMngrEx.h"
6464064216a8433360745f69edddce19a606659163The Android Open Source Project
6564064216a8433360745f69edddce19a606659163The Android Open Source Project#include "mlmeApi.h"
6664064216a8433360745f69edddce19a606659163The Android Open Source Project#include "mlmeSm.h"
6764064216a8433360745f69edddce19a606659163The Android Open Source Project#include "mlmeBuilder.h"
6864064216a8433360745f69edddce19a606659163The Android Open Source Project#include "srcApi.h"
6964064216a8433360745f69edddce19a606659163The Android Open Source Project#include "TNETW_Driver_types.h"
7064064216a8433360745f69edddce19a606659163The Android Open Source Project/* Constants */
7164064216a8433360745f69edddce19a606659163The Android Open Source Project
7264064216a8433360745f69edddce19a606659163The Android Open Source Project/* Enumerations */
7364064216a8433360745f69edddce19a606659163The Android Open Source Project
7464064216a8433360745f69edddce19a606659163The Android Open Source Project/* Typedefs */
7564064216a8433360745f69edddce19a606659163The Android Open Source Project
7664064216a8433360745f69edddce19a606659163The Android Open Source Project/* Structures */
7764064216a8433360745f69edddce19a606659163The Android Open Source Project
7864064216a8433360745f69edddce19a606659163The Android Open Source Project/* External data definitions */
7964064216a8433360745f69edddce19a606659163The Android Open Source Project
8064064216a8433360745f69edddce19a606659163The Android Open Source Project/* External functions definitions */
8164064216a8433360745f69edddce19a606659163The Android Open Source Project
8264064216a8433360745f69edddce19a606659163The Android Open Source Project/* Local function prototypes */
8364064216a8433360745f69edddce19a606659163The Android Open Source Project
8464064216a8433360745f69edddce19a606659163The Android Open Source Project/* Functions */
8564064216a8433360745f69edddce19a606659163The Android Open Source Project
8664064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS mlmeBuilder_sendFrame(TI_HANDLE hMlme,
8764064216a8433360745f69edddce19a606659163The Android Open Source Project							 dot11MgmtSubType_e type,
8864064216a8433360745f69edddce19a606659163The Android Open Source Project							 UINT8 *pDataBuff,
8964064216a8433360745f69edddce19a606659163The Android Open Source Project							 UINT32 dataLen,
9064064216a8433360745f69edddce19a606659163The Android Open Source Project							 UINT8	setWepOpt)
9164064216a8433360745f69edddce19a606659163The Android Open Source Project{
9264064216a8433360745f69edddce19a606659163The Android Open Source Project	TI_STATUS			status;
9364064216a8433360745f69edddce19a606659163The Android Open Source Project	mlme_t			*pHandle;
9464064216a8433360745f69edddce19a606659163The Android Open Source Project	mem_MSDU_T		*pMsdu;
9564064216a8433360745f69edddce19a606659163The Android Open Source Project	paramInfo_t		daParam, saParam;
9664064216a8433360745f69edddce19a606659163The Android Open Source Project	dot11_mgmtFrame_t	*pFrame;
9764064216a8433360745f69edddce19a606659163The Android Open Source Project
9864064216a8433360745f69edddce19a606659163The Android Open Source Project
9964064216a8433360745f69edddce19a606659163The Android Open Source Project
10064064216a8433360745f69edddce19a606659163The Android Open Source Project	if (hMlme == NULL)
10164064216a8433360745f69edddce19a606659163The Android Open Source Project	{
10264064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
10364064216a8433360745f69edddce19a606659163The Android Open Source Project	}
10464064216a8433360745f69edddce19a606659163The Android Open Source Project
10564064216a8433360745f69edddce19a606659163The Android Open Source Project	pHandle = (mlme_t*)hMlme;
10664064216a8433360745f69edddce19a606659163The Android Open Source Project
10764064216a8433360745f69edddce19a606659163The Android Open Source Project
10864064216a8433360745f69edddce19a606659163The Android Open Source Project	/* GET NEW MSDU !!! */
10964064216a8433360745f69edddce19a606659163The Android Open Source Project	status = wlan_memMngrAllocMSDU(pHandle->hMemMgr, &pMsdu,
11064064216a8433360745f69edddce19a606659163The Android Open Source Project        MAX_MANAGEMENT_FRAME_BODY_LEN +
11164064216a8433360745f69edddce19a606659163The Android Open Source Project            configMgr_getPacketHeaderLength(pHandle->hConfigMgr, NULL, TX_DATA_MGMT_MSDU),
11264064216a8433360745f69edddce19a606659163The Android Open Source Project        MLME_MODULE);
11364064216a8433360745f69edddce19a606659163The Android Open Source Project
11464064216a8433360745f69edddce19a606659163The Android Open Source Project    if (status != OK)
11564064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
11664064216a8433360745f69edddce19a606659163The Android Open Source Project	pFrame = (dot11_mgmtFrame_t*)(pMsdu->firstBDPtr->data + TX_TOTAL_OFFSET_BEFORE_DATA);
11764064216a8433360745f69edddce19a606659163The Android Open Source Project
11864064216a8433360745f69edddce19a606659163The Android Open Source Project	status = mlmeBuilder_buildFrameCtrl(pHandle, type, (UINT16 *)&pFrame->hdr.fc, setWepOpt);
11964064216a8433360745f69edddce19a606659163The Android Open Source Project	if (status != OK)
12064064216a8433360745f69edddce19a606659163The Android Open Source Project	{
12164064216a8433360745f69edddce19a606659163The Android Open Source Project		wlan_memMngrFreeMSDU(pHandle->hMemMgr, pMsdu->handle);
12264064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
12364064216a8433360745f69edddce19a606659163The Android Open Source Project	}
12464064216a8433360745f69edddce19a606659163The Android Open Source Project
12564064216a8433360745f69edddce19a606659163The Android Open Source Project	daParam.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
12664064216a8433360745f69edddce19a606659163The Android Open Source Project	status = ctrlData_getParam(pHandle->hCtrlData, &daParam);
12764064216a8433360745f69edddce19a606659163The Android Open Source Project	if (status != OK)
12864064216a8433360745f69edddce19a606659163The Android Open Source Project	{
12964064216a8433360745f69edddce19a606659163The Android Open Source Project		wlan_memMngrFreeMSDU(pHandle->hMemMgr, pMsdu->handle);
13064064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
13164064216a8433360745f69edddce19a606659163The Android Open Source Project	}
13264064216a8433360745f69edddce19a606659163The Android Open Source Project
13364064216a8433360745f69edddce19a606659163The Android Open Source Project	/* copy destination mac address */
13464064216a8433360745f69edddce19a606659163The Android Open Source Project	MAC_COPY(pHandle->hOs, (&pFrame->hdr.DA), (&daParam.content.ctrlDataCurrentBSSID));
13564064216a8433360745f69edddce19a606659163The Android Open Source Project
13664064216a8433360745f69edddce19a606659163The Android Open Source Project	saParam.paramType = CTRL_DATA_MAC_ADDRESS;
13764064216a8433360745f69edddce19a606659163The Android Open Source Project	status = ctrlData_getParam(pHandle->hCtrlData, &saParam);
13864064216a8433360745f69edddce19a606659163The Android Open Source Project	if (status != OK)
13964064216a8433360745f69edddce19a606659163The Android Open Source Project	{
14064064216a8433360745f69edddce19a606659163The Android Open Source Project		wlan_memMngrFreeMSDU(pHandle->hMemMgr, pMsdu->handle);
14164064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
14264064216a8433360745f69edddce19a606659163The Android Open Source Project	}
14364064216a8433360745f69edddce19a606659163The Android Open Source Project
14464064216a8433360745f69edddce19a606659163The Android Open Source Project	/* copy source mac address */
14564064216a8433360745f69edddce19a606659163The Android Open Source Project	MAC_COPY(pHandle->hOs, (&pFrame->hdr.SA), (&saParam.content.ctrlDataCurrentBSSID));
14664064216a8433360745f69edddce19a606659163The Android Open Source Project
14764064216a8433360745f69edddce19a606659163The Android Open Source Project	/* copy BSSID (destination mac address) */
14864064216a8433360745f69edddce19a606659163The Android Open Source Project	MAC_COPY(pHandle->hOs, (&pFrame->hdr.BSSID), (&daParam.content.ctrlDataCurrentBSSID));
14964064216a8433360745f69edddce19a606659163The Android Open Source Project
15064064216a8433360745f69edddce19a606659163The Android Open Source Project	if (pDataBuff != NULL)
15164064216a8433360745f69edddce19a606659163The Android Open Source Project	{
15264064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryCopy(pHandle->hOs, (void *)pFrame->body, pDataBuff, dataLen);
15364064216a8433360745f69edddce19a606659163The Android Open Source Project	}
15464064216a8433360745f69edddce19a606659163The Android Open Source Project
15564064216a8433360745f69edddce19a606659163The Android Open Source Project	/* Update MSDU parameters */
15664064216a8433360745f69edddce19a606659163The Android Open Source Project	pMsdu->headerLen = sizeof(dot11_mgmtHeader_t);
15764064216a8433360745f69edddce19a606659163The Android Open Source Project	pMsdu->dataLen = sizeof(dot11_mgmtHeader_t) + dataLen;
15864064216a8433360745f69edddce19a606659163The Android Open Source Project	pMsdu->firstBDPtr->dataOffset = TX_TOTAL_OFFSET_BEFORE_DATA;
15964064216a8433360745f69edddce19a606659163The Android Open Source Project    pMsdu->firstBDPtr->length = pMsdu->dataLen + pMsdu->firstBDPtr->dataOffset;
16064064216a8433360745f69edddce19a606659163The Android Open Source Project
16164064216a8433360745f69edddce19a606659163The Android Open Source Project	/* send the packet to the TX */
16264064216a8433360745f69edddce19a606659163The Android Open Source Project	pMsdu->qosTag = 0;
16364064216a8433360745f69edddce19a606659163The Android Open Source Project	pMsdu->txFlags |= TX_DATA_MGMT_MSDU;
16464064216a8433360745f69edddce19a606659163The Android Open Source Project
16564064216a8433360745f69edddce19a606659163The Android Open Source Project	/*
16664064216a8433360745f69edddce19a606659163The Android Open Source Project     * sign the Disassoc packet
16764064216a8433360745f69edddce19a606659163The Android Open Source Project     * A disassociate indication (if occurs) will be provided via TxComplete
16864064216a8433360745f69edddce19a606659163The Android Open Source Project     */
16964064216a8433360745f69edddce19a606659163The Android Open Source Project	if (type == DIS_ASSOC)
17064064216a8433360745f69edddce19a606659163The Android Open Source Project		pMsdu->txCompleteFlags |= TX_DATA_DISASSOC_SYNC_TRIG;
17164064216a8433360745f69edddce19a606659163The Android Open Source Project
17264064216a8433360745f69edddce19a606659163The Android Open Source Project	/* sign the De Auth packet
17364064216a8433360745f69edddce19a606659163The Android Open Source Project     * A De Auth indication (if occurs) will be provided via TxComplete
17464064216a8433360745f69edddce19a606659163The Android Open Source Project     */
17564064216a8433360745f69edddce19a606659163The Android Open Source Project	if (type == DE_AUTH)
17664064216a8433360745f69edddce19a606659163The Android Open Source Project		pMsdu->txCompleteFlags |= TX_DATA_DEAUTH_SYNC_TRIG;
17764064216a8433360745f69edddce19a606659163The Android Open Source Project
17864064216a8433360745f69edddce19a606659163The Android Open Source Project	status = txData_txSendMsdu(pHandle->hTxData, pMsdu);
17964064216a8433360745f69edddce19a606659163The Android Open Source Project
18064064216a8433360745f69edddce19a606659163The Android Open Source Project	return status;
18164064216a8433360745f69edddce19a606659163The Android Open Source Project}
18264064216a8433360745f69edddce19a606659163The Android Open Source Project
18364064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS mlmeBuilder_buildFrameCtrl(mlme_t* pMlme, dot11MgmtSubType_e type, UINT16* pFctrl, UINT8 setWepOpt)
18464064216a8433360745f69edddce19a606659163The Android Open Source Project{
18564064216a8433360745f69edddce19a606659163The Android Open Source Project	*pFctrl = 0;
18664064216a8433360745f69edddce19a606659163The Android Open Source Project
18764064216a8433360745f69edddce19a606659163The Android Open Source Project	switch (type)
18864064216a8433360745f69edddce19a606659163The Android Open Source Project	{
18964064216a8433360745f69edddce19a606659163The Android Open Source Project	case ASSOC_REQUEST:
19064064216a8433360745f69edddce19a606659163The Android Open Source Project		*pFctrl |= DOT11_FC_ASSOC_REQ;
19164064216a8433360745f69edddce19a606659163The Android Open Source Project		break;
19264064216a8433360745f69edddce19a606659163The Android Open Source Project	case ASSOC_RESPONSE:
19364064216a8433360745f69edddce19a606659163The Android Open Source Project		*pFctrl |= DOT11_FC_ASSOC_RESP;
19464064216a8433360745f69edddce19a606659163The Android Open Source Project		break;
19564064216a8433360745f69edddce19a606659163The Android Open Source Project	case RE_ASSOC_REQUEST:
19664064216a8433360745f69edddce19a606659163The Android Open Source Project		*pFctrl |= DOT11_FC_REASSOC_REQ;
19764064216a8433360745f69edddce19a606659163The Android Open Source Project		break;
19864064216a8433360745f69edddce19a606659163The Android Open Source Project	case RE_ASSOC_RESPONSE:
19964064216a8433360745f69edddce19a606659163The Android Open Source Project		*pFctrl |= DOT11_FC_REASSOC_RESP;
20064064216a8433360745f69edddce19a606659163The Android Open Source Project		break;
20164064216a8433360745f69edddce19a606659163The Android Open Source Project	case DIS_ASSOC:
20264064216a8433360745f69edddce19a606659163The Android Open Source Project		*pFctrl |= DOT11_FC_DISASSOC;
20364064216a8433360745f69edddce19a606659163The Android Open Source Project		break;
20464064216a8433360745f69edddce19a606659163The Android Open Source Project	case AUTH:
20564064216a8433360745f69edddce19a606659163The Android Open Source Project		*pFctrl |= DOT11_FC_AUTH;
20664064216a8433360745f69edddce19a606659163The Android Open Source Project		break;
20764064216a8433360745f69edddce19a606659163The Android Open Source Project	case DE_AUTH:
20864064216a8433360745f69edddce19a606659163The Android Open Source Project		*pFctrl |= DOT11_FC_DEAUTH;
20964064216a8433360745f69edddce19a606659163The Android Open Source Project		break;
21064064216a8433360745f69edddce19a606659163The Android Open Source Project	case ACTION:
21164064216a8433360745f69edddce19a606659163The Android Open Source Project		*pFctrl |= DOT11_FC_ACTION;
21264064216a8433360745f69edddce19a606659163The Android Open Source Project		break;
21364064216a8433360745f69edddce19a606659163The Android Open Source Project	default:
21464064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
21564064216a8433360745f69edddce19a606659163The Android Open Source Project	}
21664064216a8433360745f69edddce19a606659163The Android Open Source Project
21764064216a8433360745f69edddce19a606659163The Android Open Source Project	if (setWepOpt)
21864064216a8433360745f69edddce19a606659163The Android Open Source Project	{
21964064216a8433360745f69edddce19a606659163The Android Open Source Project		*pFctrl |= DOT11_FC_WEP;
22064064216a8433360745f69edddce19a606659163The Android Open Source Project	}
22164064216a8433360745f69edddce19a606659163The Android Open Source Project
22264064216a8433360745f69edddce19a606659163The Android Open Source Project
22364064216a8433360745f69edddce19a606659163The Android Open Source Project	return OK;
22464064216a8433360745f69edddce19a606659163The Android Open Source Project}
22564064216a8433360745f69edddce19a606659163The Android Open Source Project
226