OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / system / wlan / ti / wilink_6_1 / stad / src / Data_link / txCtrlServ.c
1 /*
2  * txCtrlServ.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
35 /****************************************************************************/
36 /*                                                                          */
37 /*  MODULE:     txCtrlServ.c                                                */
38 /*                                                                          */
39 /*  PURPOSE:    Tx services module, e.g. send-null packet.                  */
40 /*              A sub-module of TxCtrl module (uses it's object).           */
41 /*                                                                          */
42 /****************************************************************************/
43
44 #define __FILE_ID__  FILE_ID_58
45 #include "paramOut.h"
46 #include "osApi.h"
47 #include "TWDriver.h"
48 #include "report.h"
49 #include "txCtrl.h"
50 #include "Ethernet.h"
51 #include "qosMngr_API.h"
52
53
54
55 /***********************************************************************
56  *                        txCtrlServ_buildNullFrame
57  ***********************************************************************
58
59 DESCRIPTION:    Build Null frame Function.
60                 The function does the following:
61                 -   Builds Null Data Frame, considering current QoS mode.
62
63 INPUT:      hTxCtrl     - Tx Ctrl module handle (the txServ uses the txCtrl object!!).
64             pFrame      - A pointer to a buffer where the frame should be stored
65             pLength     - A pointer to a placeholder for the frame length
66
67 ************************************************************************/
68 TI_STATUS txCtrlServ_buildNullFrame(TI_HANDLE hTxCtrl, TI_UINT8* pFrame, TI_UINT32* pLength)
69 {
70     txCtrl_t            *pTxCtrl = (txCtrl_t *)hTxCtrl;
71     EHeaderConvertMode  qosMode = pTxCtrl->headerConverMode;
72     dot11_header_t      *pHeader; /* Note : there is no body for null frame */
73     TI_STATUS           status;
74     TI_UINT16           fc;
75
76     pHeader = (dot11_header_t*)(pFrame);
77
78     if (qosMode == HDR_CONVERT_QOS)
79     {
80         *pLength = WLAN_QOS_HDR_LEN;
81                 SET_WLAN_WORD(&pHeader->qosControl, 0);     /* We are using user priority 0 (BE) so no need for shift and endianess */
82     }
83     else
84     {
85         *pLength = WLAN_HDR_LEN;
86     }
87
88
89     /* Set the Frame Control with Null Data type, QoS or non-QoS */
90     if (qosMode == HDR_CONVERT_QOS)
91         fc = DOT11_FC_DATA_NULL_QOS | DOT11_FC_TO_DS;
92     else
93         fc = DOT11_FC_DATA_NULL_FUNCTION | DOT11_FC_TO_DS;
94     COPY_WLAN_WORD(&pHeader->fc, &fc); /* copy with endianess handling. */
95
96     /* copy destination mac address */
97     status = ctrlData_getParamBssid(pTxCtrl->hCtrlData, CTRL_DATA_CURRENT_BSSID_PARAM, pHeader->address3);
98     if (status != TI_OK)
99     {
100         return TI_NOK;
101     }
102
103     /* copy source mac address */
104     status = ctrlData_getParamBssid(pTxCtrl->hCtrlData, CTRL_DATA_MAC_ADDRESS, pHeader->address2);
105     if (status != TI_OK)
106     {
107         return TI_NOK;
108     }
109
110     /* copy BSSID (destination mac address) */
111     MAC_COPY (pHeader->address1, pHeader->address3);
112
113     return status;
114 }
115
116
117 /***********************************************************************
118  *                        txCtrlServ_buildWlanHeader
119  ***********************************************************************
120
121 DESCRIPTION:    Build WLAN header from Ethernet header.
122
123 INPUT:      hTxCtrl     - Tx Ctrl module handle (the txServ uses the txCtrl object!!).
124             pFrame      - A pointer to a buffer where the frame should be stored
125             pLength     - A pointer to a placeholder for the frame length
126
127 ************************************************************************/
128 TI_STATUS txCtrlServ_buildWlanHeader(TI_HANDLE hTxCtrl, TI_UINT8* pFrame, TI_UINT32* pLength)
129 {
130     txCtrl_t         *pTxCtrl = (txCtrl_t *)hTxCtrl;
131     TI_STATUS        status;
132     TMacAddr         daBssid;
133     TMacAddr         saBssid;
134     EQosProtocol     qosProt;
135     ScanBssType_e    currBssType;
136     TMacAddr         currBssId;
137     TI_UINT32        headerLength;
138     TI_UINT16        headerFlags;
139     TI_BOOL          currentPrivacyInvokedMode;
140     TI_UINT8         encryptionFieldSize;
141     TTxCtrlBlk       tPktCtrlBlk;
142     dot11_header_t   *pDot11Header = (dot11_header_t*)(tPktCtrlBlk.aPktHdr);
143     Wlan_LlcHeader_T *pWlanSnapHeader;
144
145     /* 
146      * If QoS is used, add two bytes padding before the header for 4-bytes alignment.
147      * Note that the header length doesn't include it, so the txCtrl detects the pad existence
148      *   by checking if the header-length is a multiple of 4. 
149      */
150     qosMngr_getParamsActiveProtocol(pTxCtrl->hQosMngr, &qosProt);
151
152     if (qosProt == QOS_WME)  
153     {
154         headerLength = WLAN_QOS_HDR_LEN;
155         headerFlags  = DOT11_FC_DATA_QOS | DOT11_FC_TO_DS;
156         pDot11Header->qosControl = 0;
157     }
158     else
159     {
160         headerLength = WLAN_HDR_LEN;
161         headerFlags  = DOT11_FC_DATA | DOT11_FC_TO_DS;
162     }
163
164     /* 
165      * Handle encryption if needed (decision was done at RSN and is provided by TxCtrl):
166      *   - Set WEP bit in header.
167      *   - Add padding for FW security overhead: 4 bytes for TKIP, 8 for AES.  
168      */
169     txCtrlParams_getCurrentEncryptionInfo (hTxCtrl, 
170                                            &currentPrivacyInvokedMode,
171                                            &encryptionFieldSize);
172     if (currentPrivacyInvokedMode)
173     {
174         headerFlags |= DOT11_FC_WEP;
175         headerLength += encryptionFieldSize;
176     }
177     
178     COPY_WLAN_WORD (&pDot11Header->fc, &headerFlags); /* copy with endianess handling. */
179
180     /* Get the Destination MAC address */
181     status = ctrlData_getParamBssid (pTxCtrl->hCtrlData, CTRL_DATA_CURRENT_BSSID_PARAM, daBssid);
182     if (status != TI_OK)
183     {
184         return TI_NOK;
185     }
186
187     /* Get the Source MAC address */
188     status = ctrlData_getParamBssid (pTxCtrl->hCtrlData, CTRL_DATA_MAC_ADDRESS, saBssid);
189     if (status != TI_OK)
190     {
191         return TI_NOK;
192     }
193
194     /* receive BssId and Bss Type from control module */
195     ctrlData_getCurrBssTypeAndCurrBssId (pTxCtrl->hCtrlData, &currBssId, &currBssType);
196     if (currBssType != BSS_INFRASTRUCTURE)
197     {
198         return TI_NOK;
199     }
200
201     /* copy BSSID */
202     MAC_COPY (pDot11Header->address1, currBssId);
203     /* copy source mac address */
204     MAC_COPY (pDot11Header->address2, saBssid);
205     /* copy destination mac address*/
206     MAC_COPY (pDot11Header->address3, daBssid);
207
208
209     /* Set the SNAP header pointer right after the other header parts handled above. */
210     pWlanSnapHeader = (Wlan_LlcHeader_T *)&(tPktCtrlBlk.aPktHdr[headerLength]);
211     
212         pWlanSnapHeader->DSAP = SNAP_CHANNEL_ID;
213         pWlanSnapHeader->SSAP = SNAP_CHANNEL_ID;
214         pWlanSnapHeader->Control = LLC_CONTROL_UNNUMBERED_INFORMATION;
215
216     /* add RFC1042. */
217         pWlanSnapHeader->OUI[0] = SNAP_OUI_RFC1042_BYTE0;
218         pWlanSnapHeader->OUI[1] = SNAP_OUI_RFC1042_BYTE1;
219         pWlanSnapHeader->OUI[2] = SNAP_OUI_RFC1042_BYTE2;
220
221     /* set ETH type to IP */
222     pWlanSnapHeader->Type = HTOWLANS(ETHERTYPE_IP);
223
224     /* Add the SNAP length to the total header length. */
225     headerLength += sizeof(Wlan_LlcHeader_T);
226
227     /* copy WLAN header */
228     os_memoryCopy (pTxCtrl->hOs, pFrame, tPktCtrlBlk.aPktHdr, headerLength);
229     *pLength = headerLength;
230
231     return TI_OK;
232 }
233