common.h revision 189251
1189251Ssam/* 2189251Ssam * wpa_supplicant/hostapd / common helper functions, etc. 3189251Ssam * Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi> 4189251Ssam * 5189251Ssam * This program is free software; you can redistribute it and/or modify 6189251Ssam * it under the terms of the GNU General Public License version 2 as 7189251Ssam * published by the Free Software Foundation. 8189251Ssam * 9189251Ssam * Alternatively, this software may be distributed under the terms of BSD 10189251Ssam * license. 11189251Ssam * 12189251Ssam * See README and COPYING for more details. 13189251Ssam */ 14189251Ssam 15189251Ssam#ifndef COMMON_H 16189251Ssam#define COMMON_H 17189251Ssam 18189251Ssam#include "os.h" 19189251Ssam 20189251Ssam#ifdef __linux__ 21189251Ssam#include <endian.h> 22189251Ssam#include <byteswap.h> 23189251Ssam#endif /* __linux__ */ 24189251Ssam 25189251Ssam#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) 26189251Ssam#include <sys/types.h> 27189251Ssam#include <sys/endian.h> 28189251Ssam#define __BYTE_ORDER _BYTE_ORDER 29189251Ssam#define __LITTLE_ENDIAN _LITTLE_ENDIAN 30189251Ssam#define __BIG_ENDIAN _BIG_ENDIAN 31189251Ssam#define bswap_16 bswap16 32189251Ssam#define bswap_32 bswap32 33189251Ssam#define bswap_64 bswap64 34189251Ssam#endif /* defined(__FreeBSD__) || defined(__NetBSD__) || 35189251Ssam * defined(__DragonFly__) */ 36189251Ssam 37189251Ssam#ifdef __APPLE__ 38189251Ssam#include <sys/types.h> 39189251Ssam#include <machine/endian.h> 40189251Ssam#define __BYTE_ORDER _BYTE_ORDER 41189251Ssam#define __LITTLE_ENDIAN _LITTLE_ENDIAN 42189251Ssam#define __BIG_ENDIAN _BIG_ENDIAN 43189251Ssamstatic inline unsigned short bswap_16(unsigned short v) 44189251Ssam{ 45189251Ssam return ((v & 0xff) << 8) | (v >> 8); 46189251Ssam} 47189251Ssam 48189251Ssamstatic inline unsigned int bswap_32(unsigned int v) 49189251Ssam{ 50189251Ssam return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | 51189251Ssam ((v & 0xff0000) >> 8) | (v >> 24); 52189251Ssam} 53189251Ssam#endif /* __APPLE__ */ 54189251Ssam 55189251Ssam#ifdef CONFIG_TI_COMPILER 56189251Ssam#define __BIG_ENDIAN 4321 57189251Ssam#define __LITTLE_ENDIAN 1234 58189251Ssam#ifdef __big_endian__ 59189251Ssam#define __BYTE_ORDER __BIG_ENDIAN 60189251Ssam#else 61189251Ssam#define __BYTE_ORDER __LITTLE_ENDIAN 62189251Ssam#endif 63189251Ssam#endif /* CONFIG_TI_COMPILER */ 64189251Ssam 65189251Ssam#ifdef __SYMBIAN32__ 66189251Ssam#define __BIG_ENDIAN 4321 67189251Ssam#define __LITTLE_ENDIAN 1234 68189251Ssam#define __BYTE_ORDER __LITTLE_ENDIAN 69189251Ssam#endif /* __SYMBIAN32__ */ 70189251Ssam 71189251Ssam#ifdef CONFIG_NATIVE_WINDOWS 72189251Ssam#include <winsock.h> 73189251Ssam 74189251Ssamtypedef int socklen_t; 75189251Ssam 76189251Ssam#ifndef MSG_DONTWAIT 77189251Ssam#define MSG_DONTWAIT 0 /* not supported */ 78189251Ssam#endif 79189251Ssam 80189251Ssam#endif /* CONFIG_NATIVE_WINDOWS */ 81189251Ssam 82189251Ssam#ifdef _MSC_VER 83189251Ssam#define inline __inline 84189251Ssam 85189251Ssam#undef vsnprintf 86189251Ssam#define vsnprintf _vsnprintf 87189251Ssam#undef close 88189251Ssam#define close closesocket 89189251Ssam#endif /* _MSC_VER */ 90189251Ssam 91189251Ssam 92189251Ssam/* Define platform specific integer types */ 93189251Ssam 94189251Ssam#ifdef _MSC_VER 95189251Ssamtypedef UINT64 u64; 96189251Ssamtypedef UINT32 u32; 97189251Ssamtypedef UINT16 u16; 98189251Ssamtypedef UINT8 u8; 99189251Ssamtypedef INT64 s64; 100189251Ssamtypedef INT32 s32; 101189251Ssamtypedef INT16 s16; 102189251Ssamtypedef INT8 s8; 103189251Ssam#define WPA_TYPES_DEFINED 104189251Ssam#endif /* _MSC_VER */ 105189251Ssam 106189251Ssam#ifdef __vxworks 107189251Ssamtypedef unsigned long long u64; 108189251Ssamtypedef UINT32 u32; 109189251Ssamtypedef UINT16 u16; 110189251Ssamtypedef UINT8 u8; 111189251Ssamtypedef long long s64; 112189251Ssamtypedef INT32 s32; 113189251Ssamtypedef INT16 s16; 114189251Ssamtypedef INT8 s8; 115189251Ssam#define WPA_TYPES_DEFINED 116189251Ssam#endif /* __vxworks */ 117189251Ssam 118189251Ssam#ifdef CONFIG_TI_COMPILER 119189251Ssam#ifdef _LLONG_AVAILABLE 120189251Ssamtypedef unsigned long long u64; 121189251Ssam#else 122189251Ssam/* 123189251Ssam * TODO: 64-bit variable not available. Using long as a workaround to test the 124189251Ssam * build, but this will likely not work for all operations. 125189251Ssam */ 126189251Ssamtypedef unsigned long u64; 127189251Ssam#endif 128189251Ssamtypedef unsigned int u32; 129189251Ssamtypedef unsigned short u16; 130189251Ssamtypedef unsigned char u8; 131189251Ssam#define WPA_TYPES_DEFINED 132189251Ssam#endif /* CONFIG_TI_COMPILER */ 133189251Ssam 134189251Ssam#ifdef __SYMBIAN32__ 135189251Ssam#define __REMOVE_PLATSEC_DIAGNOSTICS__ 136189251Ssam#include <e32def.h> 137189251Ssamtypedef TUint64 u64; 138189251Ssamtypedef TUint32 u32; 139189251Ssamtypedef TUint16 u16; 140189251Ssamtypedef TUint8 u8; 141189251Ssam#define WPA_TYPES_DEFINED 142189251Ssam#endif /* __SYMBIAN32__ */ 143189251Ssam 144189251Ssam#ifndef WPA_TYPES_DEFINED 145189251Ssam#ifdef CONFIG_USE_INTTYPES_H 146189251Ssam#include <inttypes.h> 147189251Ssam#else 148189251Ssam#include <stdint.h> 149189251Ssam#endif 150189251Ssamtypedef uint64_t u64; 151189251Ssamtypedef uint32_t u32; 152189251Ssamtypedef uint16_t u16; 153189251Ssamtypedef uint8_t u8; 154189251Ssamtypedef int64_t s64; 155189251Ssamtypedef int32_t s32; 156189251Ssamtypedef int16_t s16; 157189251Ssamtypedef int8_t s8; 158189251Ssam#define WPA_TYPES_DEFINED 159189251Ssam#endif /* !WPA_TYPES_DEFINED */ 160189251Ssam 161189251Ssam 162189251Ssam/* Define platform specific byte swapping macros */ 163189251Ssam 164189251Ssam#if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS) 165189251Ssam 166189251Ssamstatic inline unsigned short wpa_swap_16(unsigned short v) 167189251Ssam{ 168189251Ssam return ((v & 0xff) << 8) | (v >> 8); 169189251Ssam} 170189251Ssam 171189251Ssamstatic inline unsigned int wpa_swap_32(unsigned int v) 172189251Ssam{ 173189251Ssam return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | 174189251Ssam ((v & 0xff0000) >> 8) | (v >> 24); 175189251Ssam} 176189251Ssam 177189251Ssam#define le_to_host16(n) (n) 178189251Ssam#define host_to_le16(n) (n) 179189251Ssam#define be_to_host16(n) wpa_swap_16(n) 180189251Ssam#define host_to_be16(n) wpa_swap_16(n) 181189251Ssam#define le_to_host32(n) (n) 182189251Ssam#define be_to_host32(n) wpa_swap_32(n) 183189251Ssam#define host_to_be32(n) wpa_swap_32(n) 184189251Ssam 185189251Ssam#define WPA_BYTE_SWAP_DEFINED 186189251Ssam 187189251Ssam#endif /* __CYGWIN__ || CONFIG_NATIVE_WINDOWS */ 188189251Ssam 189189251Ssam 190189251Ssam#ifndef WPA_BYTE_SWAP_DEFINED 191189251Ssam 192189251Ssam#ifndef __BYTE_ORDER 193189251Ssam#ifndef __LITTLE_ENDIAN 194189251Ssam#ifndef __BIG_ENDIAN 195189251Ssam#define __LITTLE_ENDIAN 1234 196189251Ssam#define __BIG_ENDIAN 4321 197189251Ssam#if defined(sparc) 198189251Ssam#define __BYTE_ORDER __BIG_ENDIAN 199189251Ssam#endif 200189251Ssam#endif /* __BIG_ENDIAN */ 201189251Ssam#endif /* __LITTLE_ENDIAN */ 202189251Ssam#endif /* __BYTE_ORDER */ 203189251Ssam 204189251Ssam#if __BYTE_ORDER == __LITTLE_ENDIAN 205189251Ssam#define le_to_host16(n) ((__force u16) (le16) (n)) 206189251Ssam#define host_to_le16(n) ((__force le16) (u16) (n)) 207189251Ssam#define be_to_host16(n) bswap_16((__force u16) (be16) (n)) 208189251Ssam#define host_to_be16(n) ((__force be16) bswap_16((n))) 209189251Ssam#define le_to_host32(n) ((__force u32) (le32) (n)) 210189251Ssam#define host_to_le32(n) ((__force le32) (u32) (n)) 211189251Ssam#define be_to_host32(n) bswap_32((__force u32) (be32) (n)) 212189251Ssam#define host_to_be32(n) ((__force be32) bswap_32((n))) 213189251Ssam#define le_to_host64(n) ((__force u64) (le64) (n)) 214189251Ssam#define host_to_le64(n) ((__force le64) (u64) (n)) 215189251Ssam#define be_to_host64(n) bswap_64((__force u64) (be64) (n)) 216189251Ssam#define host_to_be64(n) ((__force be64) bswap_64((n))) 217189251Ssam#elif __BYTE_ORDER == __BIG_ENDIAN 218189251Ssam#define le_to_host16(n) bswap_16(n) 219189251Ssam#define host_to_le16(n) bswap_16(n) 220189251Ssam#define be_to_host16(n) (n) 221189251Ssam#define host_to_be16(n) (n) 222189251Ssam#define le_to_host32(n) bswap_32(n) 223189251Ssam#define be_to_host32(n) (n) 224189251Ssam#define host_to_be32(n) (n) 225189251Ssam#define le_to_host64(n) bswap_64(n) 226189251Ssam#define host_to_le64(n) bswap_64(n) 227189251Ssam#define be_to_host64(n) (n) 228189251Ssam#define host_to_be64(n) (n) 229189251Ssam#ifndef WORDS_BIGENDIAN 230189251Ssam#define WORDS_BIGENDIAN 231189251Ssam#endif 232189251Ssam#else 233189251Ssam#error Could not determine CPU byte order 234189251Ssam#endif 235189251Ssam 236189251Ssam#define WPA_BYTE_SWAP_DEFINED 237189251Ssam#endif /* !WPA_BYTE_SWAP_DEFINED */ 238189251Ssam 239189251Ssam 240189251Ssam/* Macros for handling unaligned memory accesses */ 241189251Ssam 242189251Ssam#define WPA_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1])) 243189251Ssam#define WPA_PUT_BE16(a, val) \ 244189251Ssam do { \ 245189251Ssam (a)[0] = ((u16) (val)) >> 8; \ 246189251Ssam (a)[1] = ((u16) (val)) & 0xff; \ 247189251Ssam } while (0) 248189251Ssam 249189251Ssam#define WPA_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0])) 250189251Ssam#define WPA_PUT_LE16(a, val) \ 251189251Ssam do { \ 252189251Ssam (a)[1] = ((u16) (val)) >> 8; \ 253189251Ssam (a)[0] = ((u16) (val)) & 0xff; \ 254189251Ssam } while (0) 255189251Ssam 256189251Ssam#define WPA_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \ 257189251Ssam ((u32) (a)[2])) 258189251Ssam#define WPA_PUT_BE24(a, val) \ 259189251Ssam do { \ 260189251Ssam (a)[0] = (u8) ((((u32) (val)) >> 16) & 0xff); \ 261189251Ssam (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ 262189251Ssam (a)[2] = (u8) (((u32) (val)) & 0xff); \ 263189251Ssam } while (0) 264189251Ssam 265189251Ssam#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ 266189251Ssam (((u32) (a)[2]) << 8) | ((u32) (a)[3])) 267189251Ssam#define WPA_PUT_BE32(a, val) \ 268189251Ssam do { \ 269189251Ssam (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ 270189251Ssam (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ 271189251Ssam (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ 272189251Ssam (a)[3] = (u8) (((u32) (val)) & 0xff); \ 273189251Ssam } while (0) 274189251Ssam 275189251Ssam#define WPA_GET_LE32(a) ((((u32) (a)[3]) << 24) | (((u32) (a)[2]) << 16) | \ 276189251Ssam (((u32) (a)[1]) << 8) | ((u32) (a)[0])) 277189251Ssam#define WPA_PUT_LE32(a, val) \ 278189251Ssam do { \ 279189251Ssam (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ 280189251Ssam (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ 281189251Ssam (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ 282189251Ssam (a)[0] = (u8) (((u32) (val)) & 0xff); \ 283189251Ssam } while (0) 284189251Ssam 285189251Ssam#define WPA_GET_BE64(a) ((((u64) (a)[0]) << 56) | (((u64) (a)[1]) << 48) | \ 286189251Ssam (((u64) (a)[2]) << 40) | (((u64) (a)[3]) << 32) | \ 287189251Ssam (((u64) (a)[4]) << 24) | (((u64) (a)[5]) << 16) | \ 288189251Ssam (((u64) (a)[6]) << 8) | ((u64) (a)[7])) 289189251Ssam#define WPA_PUT_BE64(a, val) \ 290189251Ssam do { \ 291189251Ssam (a)[0] = (u8) (((u64) (val)) >> 56); \ 292189251Ssam (a)[1] = (u8) (((u64) (val)) >> 48); \ 293189251Ssam (a)[2] = (u8) (((u64) (val)) >> 40); \ 294189251Ssam (a)[3] = (u8) (((u64) (val)) >> 32); \ 295189251Ssam (a)[4] = (u8) (((u64) (val)) >> 24); \ 296189251Ssam (a)[5] = (u8) (((u64) (val)) >> 16); \ 297189251Ssam (a)[6] = (u8) (((u64) (val)) >> 8); \ 298189251Ssam (a)[7] = (u8) (((u64) (val)) & 0xff); \ 299189251Ssam } while (0) 300189251Ssam 301189251Ssam#define WPA_GET_LE64(a) ((((u64) (a)[7]) << 56) | (((u64) (a)[6]) << 48) | \ 302189251Ssam (((u64) (a)[5]) << 40) | (((u64) (a)[4]) << 32) | \ 303189251Ssam (((u64) (a)[3]) << 24) | (((u64) (a)[2]) << 16) | \ 304189251Ssam (((u64) (a)[1]) << 8) | ((u64) (a)[0])) 305189251Ssam 306189251Ssam 307189251Ssam#ifndef ETH_ALEN 308189251Ssam#define ETH_ALEN 6 309189251Ssam#endif 310189251Ssam 311189251Ssam 312189251Ssam#ifdef __GNUC__ 313189251Ssam#define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b)))) 314189251Ssam#define STRUCT_PACKED __attribute__ ((packed)) 315189251Ssam#else 316189251Ssam#define PRINTF_FORMAT(a,b) 317189251Ssam#define STRUCT_PACKED 318189251Ssam#endif 319189251Ssam 320189251Ssam 321189251Ssam#ifdef CONFIG_ANSI_C_EXTRA 322189251Ssam 323189251Ssam#if !defined(_MSC_VER) || _MSC_VER < 1400 324189251Ssam/* snprintf - used in number of places; sprintf() is _not_ a good replacement 325189251Ssam * due to possible buffer overflow; see, e.g., 326189251Ssam * http://www.ijs.si/software/snprintf/ for portable implementation of 327189251Ssam * snprintf. */ 328189251Ssamint snprintf(char *str, size_t size, const char *format, ...); 329189251Ssam 330189251Ssam/* vsnprintf - only used for wpa_msg() in wpa_supplicant.c */ 331189251Ssamint vsnprintf(char *str, size_t size, const char *format, va_list ap); 332189251Ssam#endif /* !defined(_MSC_VER) || _MSC_VER < 1400 */ 333189251Ssam 334189251Ssam/* getopt - only used in main.c */ 335189251Ssamint getopt(int argc, char *const argv[], const char *optstring); 336189251Ssamextern char *optarg; 337189251Ssamextern int optind; 338189251Ssam 339189251Ssam#ifndef CONFIG_NO_SOCKLEN_T_TYPEDEF 340189251Ssam#ifndef __socklen_t_defined 341189251Ssamtypedef int socklen_t; 342189251Ssam#endif 343189251Ssam#endif 344189251Ssam 345189251Ssam/* inline - define as __inline or just define it to be empty, if needed */ 346189251Ssam#ifdef CONFIG_NO_INLINE 347189251Ssam#define inline 348189251Ssam#else 349189251Ssam#define inline __inline 350189251Ssam#endif 351189251Ssam 352189251Ssam#ifndef __func__ 353189251Ssam#define __func__ "__func__ not defined" 354189251Ssam#endif 355189251Ssam 356189251Ssam#ifndef bswap_16 357189251Ssam#define bswap_16(a) ((((u16) (a) << 8) & 0xff00) | (((u16) (a) >> 8) & 0xff)) 358189251Ssam#endif 359189251Ssam 360189251Ssam#ifndef bswap_32 361189251Ssam#define bswap_32(a) ((((u32) (a) << 24) & 0xff000000) | \ 362189251Ssam (((u32) (a) << 8) & 0xff0000) | \ 363189251Ssam (((u32) (a) >> 8) & 0xff00) | \ 364189251Ssam (((u32) (a) >> 24) & 0xff)) 365189251Ssam#endif 366189251Ssam 367189251Ssam#ifndef MSG_DONTWAIT 368189251Ssam#define MSG_DONTWAIT 0 369189251Ssam#endif 370189251Ssam 371189251Ssam#ifdef _WIN32_WCE 372189251Ssamvoid perror(const char *s); 373189251Ssam#endif /* _WIN32_WCE */ 374189251Ssam 375189251Ssam#endif /* CONFIG_ANSI_C_EXTRA */ 376189251Ssam 377189251Ssam#ifndef MAC2STR 378189251Ssam#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] 379189251Ssam#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" 380189251Ssam#endif 381189251Ssam 382189251Ssam#ifndef BIT 383189251Ssam#define BIT(x) (1 << (x)) 384189251Ssam#endif 385189251Ssam 386189251Ssam/* 387189251Ssam * Definitions for sparse validation 388189251Ssam * (http://kernel.org/pub/linux/kernel/people/josh/sparse/) 389189251Ssam */ 390189251Ssam#ifdef __CHECKER__ 391189251Ssam#define __force __attribute__((force)) 392189251Ssam#define __bitwise __attribute__((bitwise)) 393189251Ssam#else 394189251Ssam#define __force 395189251Ssam#define __bitwise 396189251Ssam#endif 397189251Ssam 398189251Ssamtypedef u16 __bitwise be16; 399189251Ssamtypedef u16 __bitwise le16; 400189251Ssamtypedef u32 __bitwise be32; 401189251Ssamtypedef u32 __bitwise le32; 402189251Ssamtypedef u64 __bitwise be64; 403189251Ssamtypedef u64 __bitwise le64; 404189251Ssam 405189251Ssam#ifndef __must_check 406189251Ssam#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) 407189251Ssam#define __must_check __attribute__((__warn_unused_result__)) 408189251Ssam#else 409189251Ssam#define __must_check 410189251Ssam#endif /* __GNUC__ */ 411189251Ssam#endif /* __must_check */ 412189251Ssam 413189251Ssamint hwaddr_aton(const char *txt, u8 *addr); 414189251Ssamint hexstr2bin(const char *hex, u8 *buf, size_t len); 415189251Ssamvoid inc_byte_array(u8 *counter, size_t len); 416189251Ssamvoid wpa_get_ntp_timestamp(u8 *buf); 417189251Ssamint wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len); 418189251Ssamint wpa_snprintf_hex_uppercase(char *buf, size_t buf_size, const u8 *data, 419189251Ssam size_t len); 420189251Ssam 421189251Ssam#ifdef CONFIG_NATIVE_WINDOWS 422189251Ssamvoid wpa_unicode2ascii_inplace(TCHAR *str); 423189251SsamTCHAR * wpa_strdup_tchar(const char *str); 424189251Ssam#else /* CONFIG_NATIVE_WINDOWS */ 425189251Ssam#define wpa_unicode2ascii_inplace(s) do { } while (0) 426189251Ssam#define wpa_strdup_tchar(s) strdup((s)) 427189251Ssam#endif /* CONFIG_NATIVE_WINDOWS */ 428189251Ssam 429189251Ssamconst char * wpa_ssid_txt(const u8 *ssid, size_t ssid_len); 430189251Ssam 431189251Ssamstatic inline int is_zero_ether_addr(const u8 *a) 432189251Ssam{ 433189251Ssam return !(a[0] | a[1] | a[2] | a[3] | a[4] | a[5]); 434189251Ssam} 435189251Ssam 436189251Ssam#include "wpa_debug.h" 437189251Ssam 438189251Ssam#endif /* COMMON_H */ 439