Home | History | Annotate | Download | only in utils
      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 
     90 static __inline unsigned short int __byte_swap_16 (unsigned short int __bsx) {
     91   return ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8));
     92 }
     93 
     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