• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** \file utils.h
2  *  \brief utils API
3  *
4  *  \see utils.c
5  */
6 /****************************************************************************
7 **+-----------------------------------------------------------------------+**
8 **|                                                                       |**
9 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
10 **| All rights reserved.                                                  |**
11 **|                                                                       |**
12 **| Redistribution and use in source and binary forms, with or without    |**
13 **| modification, are permitted provided that the following conditions    |**
14 **| are met:                                                              |**
15 **|                                                                       |**
16 **|  * Redistributions of source code must retain the above copyright     |**
17 **|    notice, this list of conditions and the following disclaimer.      |**
18 **|  * Redistributions in binary form must reproduce the above copyright  |**
19 **|    notice, this list of conditions and the following disclaimer in    |**
20 **|    the documentation and/or other materials provided with the         |**
21 **|    distribution.                                                      |**
22 **|  * Neither the name Texas Instruments nor the names of its            |**
23 **|    contributors may be used to endorse or promote products derived    |**
24 **|    from this software without specific prior written permission.      |**
25 **|                                                                       |**
26 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
27 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
28 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
29 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
30 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
31 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
32 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
33 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
34 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
35 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
36 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
37 **|                                                                       |**
38 **+-----------------------------------------------------------------------+**
39 ****************************************************************************/
40 
41 /****************************************************************************/
42 /*                                                                          */
43 /*    MODULE:   utils.h                                                     */
44 /*    PURPOSE:  utilities API, contains some utilites function to be used   */
45 /*              by the COre & HAL                                           */
46 /*                                                                          */
47 /***************************************************************************/
48 #ifndef __UTILS_H__
49 #define __UTILS_H__
50 
51 #include "osTIType.h"
52 #include "commonTypes.h"
53 #include "memMngrEx.h"
54 #include "802_11Defs.h"
55 
56 /* TODO: replace the following macros with a faster code. */
57 #define MAC_COPY(pOsContext,pDstMac,pSrcMac)         \
58         os_memoryCopy(pOsContext, (void *)((pDstMac)->addr), (void *)((pSrcMac)->addr), MAC_ADDR_LEN)
59 #define MAC_EQUAL(pDstMac,pSrcMac)                   \
60         ((pDstMac)->addr[0] == (pSrcMac)->addr[0] && \
61          (pDstMac)->addr[1] == (pSrcMac)->addr[1] && \
62          (pDstMac)->addr[2] == (pSrcMac)->addr[2] && \
63          (pDstMac)->addr[3] == (pSrcMac)->addr[3] && \
64          (pDstMac)->addr[4] == (pSrcMac)->addr[4] && \
65          (pDstMac)->addr[5] == (pSrcMac)->addr[5])
66 #define MAC_BROADCAST(pMac)                          \
67          ((pMac)->addr[0] == 0xFF &&                 \
68           (pMac)->addr[1] == 0xFF &&                 \
69           (pMac)->addr[2] == 0xFF &&                 \
70           (pMac)->addr[3] == 0xFF &&                 \
71           (pMac)->addr[4] == 0xFF &&                 \
72           (pMac)->addr[5] == 0xFF)
73 #define MAC_MULTICAST(pMac) ((pMac)->addr[0] & 0x01)
74 #define MAC_NULL(pMac)                               \
75         ((pMac)->addr[0] == 0x00 &&                  \
76          (pMac)->addr[1] == 0x00 &&                  \
77          (pMac)->addr[2] == 0x00 &&                  \
78          (pMac)->addr[3] == 0x00 &&                  \
79          (pMac)->addr[4] == 0x00 &&                  \
80          (pMac)->addr[5] == 0x00)
81 
82 
83 #ifndef offsetof
84 #define offsetof(type, field)    ((unsigned int) (&(((type *)(0))->field)))
85 #endif
86 
87 
88 /* NOTE - Network byte order is BIG endian. */
89 
__byte_swap_16(unsigned short int __bsx)90 static __inline unsigned short int __byte_swap_16 (unsigned short int __bsx) {
91   return ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8));
92 }
93 
__byte_swap_32(unsigned int __bsx)94 static __inline unsigned int __byte_swap_32 (unsigned int __bsx) {
95   return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >>  8) |
96           (((__bsx) & 0x0000ff00) <<  8) | (((__bsx) & 0x000000ff) << 24));
97 }
98 
99 
100 #ifdef __BYTE_ORDER_BIG_ENDIAN
101 
102 
103 #define wlan_ntohl(x)       (x)
104 #define wlan_ntohs(x)       (x)
105 #define wlan_htonl(x)       (x)
106 #define wlan_htons(x)       (x)
107 
108 #define ENDIAN_HANDLE_WORD(x)   __byte_swap_16 (x)
109 #define ENDIAN_HANDLE_LONG(x)   __byte_swap_32 (x)
110 
111 /* int64 handling macros */
112 #define INT64_LOWER(x) *(((UINT32*)&(x))+1)
113 #define INT64_HIGHER(x) *((UINT32*)&(x))
114 
115 #else
116 
117 #ifdef __BYTE_ORDER_LITTLE_ENDIAN
118 
119 #define wlan_ntohl(x)       __byte_swap_32 (x)
120 #define wlan_ntohs(x)       __byte_swap_16 (x)
121 #define wlan_htonl(x)       __byte_swap_32 (x)
122 #define wlan_htons(x)       __byte_swap_16 (x)
123 
124 #define ENDIAN_HANDLE_WORD(x)   (x)
125 #define ENDIAN_HANDLE_LONG(x)   (x)
126 
127 /* int64 handling macros */
128 #define INT64_HIGHER(x) *(((UINT32*)&(x))+1)
129 #define INT64_LOWER(x) *((UINT32*)&(x))
130 
131 /*#define COPY_UNALIGNED_WORD(srcWord, destWord)        ((UINT8 *)&destWord)[0] = ((UINT8 *)&srcWord)[0]; ((UINT8 *)&destWord)[1] = ((UINT8 *)&srcWord)[1];
132 #define COPY_UNALIGNED_LONG(srcLong, destLong)      ((UINT8 *)&destWord)[0] = ((UINT8 *)&srcWord)[0]; ((UINT8 *)&destWord)[1] = ((UINT8 *)&srcWord)[1];((UINT8 *)&destWord)[2] = ((UINT8 *)&srcWord)[2]; ((UINT8 *)&destWord)[3] = ((UINT8 *)&srcWord)[3];
133 */
134 #else
135 
136 #error "MUST define byte order (BIG/LITTLE ENDIAN)"
137 
138 #endif
139 #endif
140 
141 #define COPY_UNALIGNED_WORD(pDest, pSrc)           {((UINT8 *)(pDest))[0] = ((UINT8 *)(pSrc))[0];\
142                                                     ((UINT8 *)(pDest))[1] = ((UINT8 *)(pSrc))[1];}
143 
144 #define COPY_UNALIGNED_LONG(pDest, pSrc)           {((UINT8 *)(pDest))[0] = ((UINT8 *)(pSrc))[0];\
145                                                     ((UINT8 *)(pDest))[1] = ((UINT8 *)(pSrc))[1];\
146                                                     ((UINT8 *)(pDest))[2] = ((UINT8 *)(pSrc))[2];\
147                                                     ((UINT8 *)(pDest))[3] = ((UINT8 *)(pSrc))[3];}
148 
149 void utils_nullMemoryFree(void* pOsContext,
150                           void* pMemPtr,
151                           unsigned long size);
152 
153 void utils_nullTimerDestroy(void* pOsContext,
154                          void* pTimerHandle);
155 
156 #define MAX(a,b)  (((a) > (b)) ? (a) : (b))
157 #define MIN(a,b)  (((a) < (b)) ? (a) : (b))
158 
159 #ifndef min
160 # define min MIN
161 #endif
162 
163 #ifndef max
164 # define max MAX
165 #endif
166 
167 
168 #define MAKE_BASIC_RATE(rate)                           rate |= 0x80
169 
170 #define IS_BASIC_RATE(rate)                             rate & 0x80
171 
172 #define IS_ACTIVE_RATE(rate)                            !(rate & 0x80)
173 
174 rate_e networkToHostRate(UINT8 rate);
175 
176 UINT8 hostToNetworkRate(rate_e rate);
177 
178 
179 UINT8 getMaxBasicRatefromString(UINT8 *ratesString, UINT8 len, UINT8 maxRate);
180 
181 rate_e getMaxRatefromBitmap(UINT32 ratesBitMap);
182 
183 UINT8 getMaxActiveRatefromString(UINT8 *ratesString, UINT8 len, UINT8 maxRate);
184 
185 TI_STATUS validateNetworkRate(UINT8 rate);
186 
187 UINT8 hostToUtilityRate(rate_e rate);
188 
189 rate_e utilityToHostRate(UINT8 rate);
190 
191 UINT8 hostRateToNumber(rate_e rate);
192 rate_e  RateNumberToHost(UINT8 rateIn);
193 
194 void bitMapToNetworkStringRates(UINT32 suppRatesBitMap, UINT32 basicRatesBitMap,
195                                 UINT8 *string, UINT32 *len,
196                                 UINT32 *firstOFDMrateLoc);
197 
198 void networkStringToBitMapSuppRates(UINT32 *bitMap, UINT8 *string, UINT32 len);
199 void networkStringToBitMapBasicRates(UINT32 *bitMap, UINT8 *string, UINT32 len);
200 
201 UINT32 translateBasicRateValueToMask(UINT32 value, BOOL dot11a);
202 UINT32 translateSupportedRateValueToMask(UINT32 value, BOOL dot11a);
203 void validateRates(UINT32 *pBasicRateMask, UINT32 *pSuppRateMask, UINT32 *pTxRate, modulationType_e *modulation, BOOL dot11a);
204 rate_e calculateMaxSupportedRate(UINT32 *pSuppRateMask);
205 rate_e findMaxActiveRate(UINT32 ratesBitMap);
206 void   validateRatesVsBand(UINT32 *supportedMask, UINT32 *basicMask, BOOL dot11a);
207 
208 BOOL utils_isAnySSID(ssid_t *pSsid);
209 BOOL utils_isJunkSSID(ssid_t *pSsid);
210 BOOL utils_isIESSID_Broadcast(dot11_SSID_t *pIESsid); /* routinte to check for Junk SSID in SSID IE */
211 void    MsduContentDump (mem_MSDU_T* pMsdu, char *str);
212 
213 
214 void HexDumpData (UINT8 *data, int datalen);
215 void msduContentDump (mem_MSDU_T* pMsdu, char *str);
216 
217 
218 BOOL parseIeBuffer(TI_HANDLE hOs, UINT8 *pIeBuffer, UINT16 length, UINT8 desiredIeId, UINT8 **pDesiredIe, UINT8 *pMatchBuffer, UINT8 matchBufferLen);
219 void TiWlanIntToStr(UINT8 number , char *string, UINT8 radix);
220 
221 UINT32 getBasicRateMaskForSpecialBGchannel(void);
222 UINT32 getSupportedRateMaskForSpecialBGchannel(void);
223 
224 int ConvertHwBitRateToAppRate(UINT32 HwRate,rate_e *AppRate);
225 
226 
227 void getMaxRate(UINT32 ratesBitMap, rate_e *rate, modulationType_e *modulation, dot11mode_e operationMode);
228 void getMinRate(UINT32 ratesBitMap, rate_e *rate, modulationType_e *modulation, dot11mode_e operationMode);
229 
230 UINT32 reminder64( UINT64 dividee, UINT32 divider );
231 int ConvertHwBitRateToAppRate(UINT32 HwRate,rate_e *AppRate);
232 int ConvertAppRatesToBitmap(UINT16 AppRatesBitmap, UINT32 *HwRatesBitmap);
233 int ConvertAppRateToHwBitMapRate(UINT32 AppRate, UINT32 *HwRate);
234 void convert_hex_to_string(tiUINT8 *pBuffer, char *pString, tiUINT8 Size);
235 rate_e ConvertHwRateToDrvRate(UINT8 HwRate, BOOL bOFDMMudulation);
236 UINT8 ConvertDrvRate2HwRate(rate_e eRate);
237 RateIndex_e rateNumberToIndex(UINT8 uRate);
238 
239 /* returns TI_STATUS as string */
240 char* convertTI_STATUS_toString(TI_STATUS status);
241 
242 /*
243 ++++++++ Profiling code ++++++++
244 */
245 #define UTIL_DEBUG_PROFILE (0)
246 
247 void convert_hex_to_string(tiUINT8 *pBuffer, char *pString, tiUINT8 Size);
248 
249 /*
250 * Small macro to convert Dbm units into Dbm/10 units. This macro is important
251 * in order to avoid over-flow of Dbm units bigger than 25
252 */
253 #define DBM2DBMDIV10(uTxPower) \
254 	((uTxPower) > (MAX_TX_POWER / DBM_TO_TX_POWER_FACTOR) ? \
255 		MAX_TX_POWER : (uTxPower) * DBM_TO_TX_POWER_FACTOR)
256 
257 #if UTIL_DEBUG_PROFILE
258 typedef struct
259 {
260     UINT32 TIWlanModuleLogName;
261     UINT32 Event;
262     UINT32 Param_1;
263     UINT32 Param_2;
264     UINT32 timeStamp;
265 } profileInfoElement_t;
266 
267 enum
268 {
269     PROFILE_BUFFER_SIZE = 10000
270 };
271 
272 typedef struct
273 {
274     profileInfoElement_t profileInfoElement[PROFILE_BUFFER_SIZE];
275     UINT32 currentInfoElement;
276     BOOL overlap;
277 } profileInfo_t;
278 
279 void util_initProfile(void);
280 
281 void util_recordProfile(UINT32 theTIWlanModuleLogName,
282                         UINT32 theEvent,
283                         UINT32 theParam_1,
284                         UINT32 theParam_2);
285 
286 void util_printProfile(void);
287 #endif /* UTIL_DEBUG_PROFILE */
288 
289 
290 #endif /* __UTILS_H__ */
291