1/*
2 * mlmeBuilder.c
3 *
4 * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 *  * Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 *  * Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in
15 *    the documentation and/or other materials provided with the
16 *    distribution.
17 *  * Neither the name Texas Instruments nor the names of its
18 *    contributors may be used to endorse or promote products derived
19 *    from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 /** \file mlmeBuilder.c
35 *  \brief 802.11 MLME Builder
36 *
37 *  \see mlmeBuilder.h
38 */
39
40
41/***************************************************************************/
42/*																		   */
43/*		MODULE:	mlmeBuilder.c											   */
44/*    PURPOSE:	802.11 MLME Builder										   */
45/*																	 	   */
46/***************************************************************************/
47
48#define __FILE_ID__  FILE_ID_67
49#include "tidef.h"
50#include "osApi.h"
51#include "paramOut.h"
52#include "report.h"
53#include "802_11Defs.h"
54#include "DataCtrl_Api.h"
55#include "mlmeApi.h"
56#include "mlmeSm.h"
57#include "mlmeBuilder.h"
58#include "TWDriver.h"
59#include "connApi.h"
60/* Constants */
61
62/* Enumerations */
63
64/* Typedefs */
65
66/* Structures */
67
68/* External data definitions */
69
70/* External functions definitions */
71
72/* Local function prototypes */
73
74/* Functions */
75
76TI_STATUS mlmeBuilder_sendFrame(TI_HANDLE hMlme,
77							 dot11MgmtSubType_e type,
78							 TI_UINT8   *pDataBuff,
79							 TI_UINT32  dataLen,
80							 TI_UINT8	setWepOpt)
81{
82	mlme_t			*pHandle = (mlme_t*)hMlme;
83	TI_STATUS		status;
84    TTxCtrlBlk      *pPktCtrlBlk;
85    TI_UINT8        *pPktBuffer;
86	TMacAddr		daBssid, saBssid;
87	dot11_mgmtHeader_t	*pDot11Header;
88
89	/* Allocate a TxCtrlBlk and data buffer (large enough for the max management packet) */
90    pPktCtrlBlk = TWD_txCtrlBlk_Alloc (pHandle->hTWD);
91    pPktBuffer  = txCtrl_AllocPacketBuffer (pHandle->hTxCtrl,
92                                            pPktCtrlBlk,
93                                            MAX_MANAGEMENT_FRAME_BODY_LEN + WLAN_HDR_LEN);
94    if (pPktBuffer == NULL)
95    {
96        TRACE0(pHandle->hReport, REPORT_SEVERITY_ERROR , ": No memory\n");
97        TWD_txCtrlBlk_Free (pHandle->hTWD, pPktCtrlBlk);
98        return TI_NOK;
99    }
100
101	pDot11Header = (dot11_mgmtHeader_t *)(pPktCtrlBlk->aPktHdr);
102
103	status = mlmeBuilder_buildFrameCtrl (pHandle, type, (TI_UINT16 *)&pDot11Header->fc, setWepOpt);
104	if (status != TI_OK)
105	{
106        txCtrl_FreePacket (pHandle->hTxCtrl, pPktCtrlBlk, TI_NOK);
107		return TI_NOK;
108	}
109
110    status = ctrlData_getParamBssid(pHandle->hCtrlData, CTRL_DATA_CURRENT_BSSID_PARAM, daBssid);
111	if (status != TI_OK)
112	{
113        txCtrl_FreePacket (pHandle->hTxCtrl, pPktCtrlBlk, TI_NOK);
114		return TI_NOK;
115	}
116
117	/* copy destination mac address */
118	MAC_COPY (pDot11Header->DA, daBssid);
119
120    status = ctrlData_getParamBssid(pHandle->hCtrlData, CTRL_DATA_MAC_ADDRESS, saBssid);
121	if (status != TI_OK)
122	{
123        txCtrl_FreePacket (pHandle->hTxCtrl, pPktCtrlBlk, TI_NOK);
124		return TI_NOK;
125	}
126
127	/* copy source mac address */
128	MAC_COPY (pDot11Header->SA, saBssid);
129
130	/* copy BSSID (destination mac address) */
131	MAC_COPY (pDot11Header->BSSID, daBssid);
132
133	if (pDataBuff != NULL)
134	{
135		os_memoryCopy (pHandle->hOs, pPktBuffer, pDataBuff, dataLen);
136	}
137
138    /* Update packet parameters (start-time, length, pkt-type) */
139    pPktCtrlBlk->tTxDescriptor.startTime = os_timeStampMs (pHandle->hOs);
140    pPktCtrlBlk->tTxPktParams.uPktType   = TX_PKT_TYPE_MGMT;
141    BUILD_TX_TWO_BUF_PKT_BDL (pPktCtrlBlk, (TI_UINT8 *)pDot11Header, WLAN_HDR_LEN, pPktBuffer, dataLen)
142
143	/* Enqueue packet in the mgmt-queues and run the scheduler. */
144	status = txMgmtQ_Xmit (pHandle->hTxMgmtQ, pPktCtrlBlk, TI_FALSE);
145
146	return status;
147}
148
149
150TI_STATUS mlmeBuilder_buildFrameCtrl(mlme_t* pMlme, dot11MgmtSubType_e type, TI_UINT16* pFctrl, TI_UINT8 setWepOpt)
151{
152	TI_UINT16	fc = 0;
153
154	switch (type)
155	{
156	case ASSOC_REQUEST:
157		fc |= DOT11_FC_ASSOC_REQ;
158		break;
159	case ASSOC_RESPONSE:
160		fc |= DOT11_FC_ASSOC_RESP;
161		break;
162	case RE_ASSOC_REQUEST:
163		fc |= DOT11_FC_REASSOC_REQ;
164		break;
165	case RE_ASSOC_RESPONSE:
166		fc |= DOT11_FC_REASSOC_RESP;
167		break;
168	case DIS_ASSOC:
169		fc |= DOT11_FC_DISASSOC;
170		break;
171	case AUTH:
172		fc |= DOT11_FC_AUTH;
173		break;
174	case DE_AUTH:
175		fc |= DOT11_FC_DEAUTH;
176		break;
177	case ACTION:
178		fc |= DOT11_FC_ACTION;
179		break;
180	default:
181		*pFctrl = 0;
182		return TI_NOK;
183	}
184
185	if (setWepOpt)
186	{
187		fc |= DOT11_FC_WEP;
188	}
189
190	COPY_WLAN_WORD(pFctrl, &fc); /* copy with endianess handling. */
191
192	return TI_OK;
193}
194
195