1 /* 2 * wpa_supplicant/hostapd / common helper functions, etc. 3 * Copyright (c) 2002-2006, Jouni Malinen <j (at) w1.fi> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * Alternatively, this software may be distributed under the terms of BSD 10 * license. 11 * 12 * See README and COPYING for more details. 13 */ 14 15 #ifndef COMMON_H 16 #define COMMON_H 17 18 #include "os.h" 19 20 #ifdef __linux__ 21 #include <endian.h> 22 #include <byteswap.h> 23 #endif /* __linux__ */ 24 25 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) 26 #include <sys/types.h> 27 #include <sys/endian.h> 28 #define __BYTE_ORDER _BYTE_ORDER 29 #define __LITTLE_ENDIAN _LITTLE_ENDIAN 30 #define __BIG_ENDIAN _BIG_ENDIAN 31 #define bswap_16 bswap16 32 #define bswap_32 bswap32 33 #define bswap_64 bswap64 34 #endif /* defined(__FreeBSD__) || defined(__NetBSD__) || 35 * defined(__DragonFly__) */ 36 37 #ifdef CONFIG_TI_COMPILER 38 #define __BIG_ENDIAN 4321 39 #define __LITTLE_ENDIAN 1234 40 #ifdef __big_endian__ 41 #define __BYTE_ORDER __BIG_ENDIAN 42 #else 43 #define __BYTE_ORDER __LITTLE_ENDIAN 44 #endif 45 #endif /* CONFIG_TI_COMPILER */ 46 47 #ifdef CONFIG_NATIVE_WINDOWS 48 #include <winsock.h> 49 50 typedef int socklen_t; 51 52 #ifndef MSG_DONTWAIT 53 #define MSG_DONTWAIT 0 /* not supported */ 54 #endif 55 56 #endif /* CONFIG_NATIVE_WINDOWS */ 57 58 #if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS) 59 60 #ifdef _MSC_VER 61 #define inline __inline 62 #endif /* _MSC_VER */ 63 64 static inline unsigned short wpa_swap_16(unsigned short v) 65 { 66 return ((v & 0xff) << 8) | (v >> 8); 67 } 68 69 static inline unsigned int wpa_swap_32(unsigned int v) 70 { 71 return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | 72 ((v & 0xff0000) >> 8) | (v >> 24); 73 } 74 75 #define le_to_host16(n) (n) 76 #define host_to_le16(n) (n) 77 #define be_to_host16(n) wpa_swap_16(n) 78 #define host_to_be16(n) wpa_swap_16(n) 79 #define le_to_host32(n) (n) 80 #define be_to_host32(n) wpa_swap_32(n) 81 #define host_to_be32(n) wpa_swap_32(n) 82 83 #else /* __CYGWIN__ */ 84 85 #ifndef __BYTE_ORDER 86 #ifndef __LITTLE_ENDIAN 87 #ifndef __BIG_ENDIAN 88 #define __LITTLE_ENDIAN 1234 89 #define __BIG_ENDIAN 4321 90 #if defined(sparc) 91 #define __BYTE_ORDER __BIG_ENDIAN 92 #endif 93 #endif /* __BIG_ENDIAN */ 94 #endif /* __LITTLE_ENDIAN */ 95 #endif /* __BYTE_ORDER */ 96 97 #if __BYTE_ORDER == __LITTLE_ENDIAN 98 #define le_to_host16(n) (n) 99 #define host_to_le16(n) (n) 100 #define be_to_host16(n) bswap_16(n) 101 #define host_to_be16(n) bswap_16(n) 102 #define le_to_host32(n) (n) 103 #define be_to_host32(n) bswap_32(n) 104 #define host_to_be32(n) bswap_32(n) 105 #define le_to_host64(n) (n) 106 #define host_to_le64(n) (n) 107 #define be_to_host64(n) bswap_64(n) 108 #define host_to_be64(n) bswap_64(n) 109 #elif __BYTE_ORDER == __BIG_ENDIAN 110 #define le_to_host16(n) bswap_16(n) 111 #define host_to_le16(n) bswap_16(n) 112 #define be_to_host16(n) (n) 113 #define host_to_be16(n) (n) 114 #define le_to_host32(n) bswap_32(n) 115 #define be_to_host32(n) (n) 116 #define host_to_be32(n) (n) 117 #define le_to_host64(n) bswap_64(n) 118 #define host_to_le64(n) bswap_64(n) 119 #define be_to_host64(n) (n) 120 #define host_to_be64(n) (n) 121 #ifndef WORDS_BIGENDIAN 122 #define WORDS_BIGENDIAN 123 #endif 124 #else 125 #error Could not determine CPU byte order 126 #endif 127 128 #endif /* __CYGWIN__ */ 129 130 /* Macros for handling unaligned 16-bit variables */ 131 #define WPA_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1])) 132 #define WPA_PUT_BE16(a, val) \ 133 do { \ 134 (a)[0] = ((u16) (val)) >> 8; \ 135 (a)[1] = ((u16) (val)) & 0xff; \ 136 } while (0) 137 138 #define WPA_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0])) 139 #define WPA_PUT_LE16(a, val) \ 140 do { \ 141 (a)[1] = ((u16) (val)) >> 8; \ 142 (a)[0] = ((u16) (val)) & 0xff; \ 143 } while (0) 144 145 #define WPA_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \ 146 ((u32) (a)[2])) 147 #define WPA_PUT_BE24(a, val) \ 148 do { \ 149 (a)[0] = (u8) (((u32) (val)) >> 16); \ 150 (a)[1] = (u8) (((u32) (val)) >> 8); \ 151 (a)[2] = (u8) (((u32) (val)) & 0xff); \ 152 } while (0) 153 154 #define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ 155 (((u32) (a)[2]) << 8) | ((u32) (a)[3])) 156 #define WPA_PUT_BE32(a, val) \ 157 do { \ 158 (a)[0] = (u8) (((u32) (val)) >> 24); \ 159 (a)[1] = (u8) (((u32) (val)) >> 16); \ 160 (a)[2] = (u8) (((u32) (val)) >> 8); \ 161 (a)[3] = (u8) (((u32) (val)) & 0xff); \ 162 } while (0) 163 164 #define WPA_PUT_BE64(a, val) \ 165 do { \ 166 (a)[0] = (u8) (((u64) (val)) >> 56); \ 167 (a)[1] = (u8) (((u64) (val)) >> 48); \ 168 (a)[2] = (u8) (((u64) (val)) >> 40); \ 169 (a)[3] = (u8) (((u64) (val)) >> 32); \ 170 (a)[4] = (u8) (((u64) (val)) >> 24); \ 171 (a)[5] = (u8) (((u64) (val)) >> 16); \ 172 (a)[6] = (u8) (((u64) (val)) >> 8); \ 173 (a)[7] = (u8) (((u64) (val)) & 0xff); \ 174 } while (0) 175 176 177 #ifndef ETH_ALEN 178 #define ETH_ALEN 6 179 #endif 180 181 #ifdef _MSC_VER 182 typedef UINT64 u64; 183 typedef UINT32 u32; 184 typedef UINT16 u16; 185 typedef UINT8 u8; 186 typedef INT64 s64; 187 typedef INT32 s32; 188 typedef INT16 s16; 189 typedef INT8 s8; 190 #define WPA_TYPES_DEFINED 191 #endif /* _MSC_VER */ 192 193 #ifdef __vxworks 194 typedef unsigned long long u64; 195 typedef UINT32 u32; 196 typedef UINT16 u16; 197 typedef UINT8 u8; 198 typedef long long s64; 199 typedef INT32 s32; 200 typedef INT16 s16; 201 typedef INT8 s8; 202 #define WPA_TYPES_DEFINED 203 #endif /* __vxworks */ 204 205 #ifdef CONFIG_TI_COMPILER 206 #ifdef _LLONG_AVAILABLE 207 typedef unsigned long long u64; 208 #else 209 /* 210 * TODO: 64-bit variable not available. Using long as a workaround to test the 211 * build, but this will likely not work for all operations. 212 */ 213 typedef unsigned long u64; 214 #endif 215 typedef unsigned int u32; 216 typedef unsigned short u16; 217 typedef unsigned char u8; 218 #define WPA_TYPES_DEFINED 219 #endif /* CONFIG_TI_COMPILER */ 220 221 #ifndef WPA_TYPES_DEFINED 222 #ifdef CONFIG_USE_INTTYPES_H 223 #include <inttypes.h> 224 #else 225 #include <stdint.h> 226 #endif 227 typedef uint64_t u64; 228 typedef uint32_t u32; 229 typedef uint16_t u16; 230 typedef uint8_t u8; 231 typedef int64_t s64; 232 typedef int32_t s32; 233 typedef int16_t s16; 234 typedef int8_t s8; 235 #define WPA_TYPES_DEFINED 236 #endif /* !WPA_TYPES_DEFINED */ 237 238 #define hostapd_get_rand os_get_random 239 int hwaddr_aton(const char *txt, u8 *addr); 240 int hexstr2bin(const char *hex, u8 *buf, size_t len); 241 void inc_byte_array(u8 *counter, size_t len); 242 void wpa_get_ntp_timestamp(u8 *buf); 243 244 245 #ifdef __GNUC__ 246 #define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b)))) 247 #define STRUCT_PACKED __attribute__ ((packed)) 248 #else 249 #define PRINTF_FORMAT(a,b) 250 #define STRUCT_PACKED 251 #endif 252 253 254 /* Debugging function - conditional printf and hex dump. Driver wrappers can 255 * use these for debugging purposes. */ 256 257 enum { MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR }; 258 259 #ifdef ANDROID 260 261 #define wpa_debug_print_timestamp() do {} while (0) 262 #define wpa_hexdump(...) do {} while (0) 263 #define wpa_hexdump_key(...) do {} while (0) 264 #define wpa_hexdump_ascii(...) do {} while (0) 265 #define wpa_hexdump_ascii_key(...) do {} while (0) 266 #define wpa_debug_open_file(...) do {} while (0) 267 #define wpa_debug_close_file() do {} while (0) 268 269 void android_printf(int level, char *format, ...); 270 271 #define wpa_printf(level, ...) \ 272 do { \ 273 if ((level) >= MSG_INFO) { \ 274 android_printf((level), __VA_ARGS__); \ 275 } \ 276 } while (0) 277 278 #else /* ANDROID */ 279 280 #ifdef CONFIG_NO_STDOUT_DEBUG 281 282 #define wpa_debug_print_timestamp() do { } while (0) 283 #define wpa_printf(args...) do { } while (0) 284 #define wpa_hexdump(l,t,b,le) do { } while (0) 285 #define wpa_hexdump_key(l,t,b,le) do { } while (0) 286 #define wpa_hexdump_ascii(l,t,b,le) do { } while (0) 287 #define wpa_hexdump_ascii_key(l,t,b,le) do { } while (0) 288 #define wpa_debug_open_file(p) do { } while (0) 289 #define wpa_debug_close_file() do { } while (0) 290 291 #else /* CONFIG_NO_STDOUT_DEBUG */ 292 293 int wpa_debug_open_file(const char *path); 294 void wpa_debug_close_file(void); 295 296 /** 297 * wpa_debug_printf_timestamp - Print timestamp for debug output 298 * 299 * This function prints a timestamp in <seconds from 1970>.<microsoconds> 300 * format if debug output has been configured to include timestamps in debug 301 * messages. 302 */ 303 void wpa_debug_print_timestamp(void); 304 305 /** 306 * wpa_printf - conditional printf 307 * @level: priority level (MSG_*) of the message 308 * @fmt: printf format string, followed by optional arguments 309 * 310 * This function is used to print conditional debugging and error messages. The 311 * output may be directed to stdout, stderr, and/or syslog based on 312 * configuration. 313 * 314 * Note: New line '\n' is added to the end of the text when printing to stdout. 315 */ 316 void wpa_printf(int level, char *fmt, ...) 317 PRINTF_FORMAT(2, 3); 318 319 /** 320 * wpa_hexdump - conditional hex dump 321 * @level: priority level (MSG_*) of the message 322 * @title: title of for the message 323 * @buf: data buffer to be dumped 324 * @len: length of the buf 325 * 326 * This function is used to print conditional debugging and error messages. The 327 * output may be directed to stdout, stderr, and/or syslog based on 328 * configuration. The contents of buf is printed out has hex dump. 329 */ 330 void wpa_hexdump(int level, const char *title, const u8 *buf, size_t len); 331 332 /** 333 * wpa_hexdump_key - conditional hex dump, hide keys 334 * @level: priority level (MSG_*) of the message 335 * @title: title of for the message 336 * @buf: data buffer to be dumped 337 * @len: length of the buf 338 * 339 * This function is used to print conditional debugging and error messages. The 340 * output may be directed to stdout, stderr, and/or syslog based on 341 * configuration. The contents of buf is printed out has hex dump. This works 342 * like wpa_hexdump(), but by default, does not include secret keys (passwords, 343 * etc.) in debug output. 344 */ 345 void wpa_hexdump_key(int level, const char *title, const u8 *buf, size_t len); 346 347 /** 348 * wpa_hexdump_ascii - conditional hex dump 349 * @level: priority level (MSG_*) of the message 350 * @title: title of for the message 351 * @buf: data buffer to be dumped 352 * @len: length of the buf 353 * 354 * This function is used to print conditional debugging and error messages. The 355 * output may be directed to stdout, stderr, and/or syslog based on 356 * configuration. The contents of buf is printed out has hex dump with both 357 * the hex numbers and ASCII characters (for printable range) are shown. 16 358 * bytes per line will be shown. 359 */ 360 void wpa_hexdump_ascii(int level, const char *title, const u8 *buf, 361 size_t len); 362 363 /** 364 * wpa_hexdump_ascii_key - conditional hex dump, hide keys 365 * @level: priority level (MSG_*) of the message 366 * @title: title of for the message 367 * @buf: data buffer to be dumped 368 * @len: length of the buf 369 * 370 * This function is used to print conditional debugging and error messages. The 371 * output may be directed to stdout, stderr, and/or syslog based on 372 * configuration. The contents of buf is printed out has hex dump with both 373 * the hex numbers and ASCII characters (for printable range) are shown. 16 374 * bytes per line will be shown. This works like wpa_hexdump_ascii(), but by 375 * default, does not include secret keys (passwords, etc.) in debug output. 376 */ 377 void wpa_hexdump_ascii_key(int level, const char *title, const u8 *buf, 378 size_t len); 379 380 #endif /* CONFIG_NO_STDOUT_DEBUG */ 381 382 #endif /* ANDROID */ 383 384 #ifdef CONFIG_NO_WPA_MSG 385 #define wpa_msg(args...) do { } while (0) 386 #define wpa_msg_register_cb(f) do { } while (0) 387 #else /* CONFIG_NO_WPA_MSG */ 388 /** 389 * wpa_msg - Conditional printf for default target and ctrl_iface monitors 390 * @ctx: Pointer to context data; this is the ctx variable registered 391 * with struct wpa_driver_ops::init() 392 * @level: priority level (MSG_*) of the message 393 * @fmt: printf format string, followed by optional arguments 394 * 395 * This function is used to print conditional debugging and error messages. The 396 * output may be directed to stdout, stderr, and/or syslog based on 397 * configuration. This function is like wpa_printf(), but it also sends the 398 * same message to all attached ctrl_iface monitors. 399 * 400 * Note: New line '\n' is added to the end of the text when printing to stdout. 401 */ 402 void wpa_msg(void *ctx, int level, char *fmt, ...) PRINTF_FORMAT(3, 4); 403 404 typedef void (*wpa_msg_cb_func)(void *ctx, int level, const char *txt, 405 size_t len); 406 407 /** 408 * wpa_msg_register_cb - Register callback function for wpa_msg() messages 409 * @func: Callback function (%NULL to unregister) 410 */ 411 void wpa_msg_register_cb(wpa_msg_cb_func func); 412 #endif /* CONFIG_NO_WPA_MSG */ 413 414 415 int wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len); 416 int wpa_snprintf_hex_uppercase(char *buf, size_t buf_size, const u8 *data, 417 size_t len); 418 419 420 #ifdef EAPOL_TEST 421 #define WPA_ASSERT(a) \ 422 do { \ 423 if (!(a)) { \ 424 printf("WPA_ASSERT FAILED '" #a "' " \ 425 "%s %s:%d\n", \ 426 __FUNCTION__, __FILE__, __LINE__); \ 427 exit(1); \ 428 } \ 429 } while (0) 430 #else 431 #define WPA_ASSERT(a) do { } while (0) 432 #endif 433 434 435 #ifdef _MSC_VER 436 #undef vsnprintf 437 #define vsnprintf _vsnprintf 438 #undef close 439 #define close closesocket 440 #endif /* _MSC_VER */ 441 442 443 #ifdef CONFIG_ANSI_C_EXTRA 444 445 #if !defined(_MSC_VER) || _MSC_VER < 1400 446 /* snprintf - used in number of places; sprintf() is _not_ a good replacement 447 * due to possible buffer overflow; see, e.g., 448 * http://www.ijs.si/software/snprintf/ for portable implementation of 449 * snprintf. */ 450 int snprintf(char *str, size_t size, const char *format, ...); 451 452 /* vsnprintf - only used for wpa_msg() in wpa_supplicant.c */ 453 int vsnprintf(char *str, size_t size, const char *format, va_list ap); 454 #endif /* !defined(_MSC_VER) || _MSC_VER < 1400 */ 455 456 /* getopt - only used in main.c */ 457 int getopt(int argc, char *const argv[], const char *optstring); 458 extern char *optarg; 459 extern int optind; 460 461 #ifndef CONFIG_NO_SOCKLEN_T_TYPEDEF 462 #ifndef __socklen_t_defined 463 typedef int socklen_t; 464 #endif 465 #endif 466 467 /* inline - define as __inline or just define it to be empty, if needed */ 468 #ifdef CONFIG_NO_INLINE 469 #define inline 470 #else 471 #define inline __inline 472 #endif 473 474 #ifndef __func__ 475 #define __func__ "__func__ not defined" 476 #endif 477 478 #ifndef bswap_16 479 #define bswap_16(a) ((((u16) (a) << 8) & 0xff00) | (((u16) (a) >> 8) & 0xff)) 480 #endif 481 482 #ifndef bswap_32 483 #define bswap_32(a) ((((u32) (a) << 24) & 0xff000000) | \ 484 (((u32) (a) << 8) & 0xff0000) | \ 485 (((u32) (a) >> 8) & 0xff00) | \ 486 (((u32) (a) >> 24) & 0xff)) 487 #endif 488 489 #ifndef MSG_DONTWAIT 490 #define MSG_DONTWAIT 0 491 #endif 492 493 #ifdef _WIN32_WCE 494 void perror(const char *s); 495 #endif /* _WIN32_WCE */ 496 497 #endif /* CONFIG_ANSI_C_EXTRA */ 498 499 #define wpa_zalloc(s) os_zalloc((s)) 500 501 #ifdef CONFIG_NATIVE_WINDOWS 502 void wpa_unicode2ascii_inplace(TCHAR *str); 503 TCHAR * wpa_strdup_tchar(const char *str); 504 #else /* CONFIG_NATIVE_WINDOWS */ 505 #define wpa_unicode2ascii_inplace(s) do { } while (0) 506 #define wpa_strdup_tchar(s) strdup((s)) 507 #endif /* CONFIG_NATIVE_WINDOWS */ 508 509 const char * wpa_ssid_txt(u8 *ssid, size_t ssid_len); 510 511 #ifndef ANDROID 512 typedef u32 __be32; 513 typedef u64 __be64; 514 #endif /* Dm: */ 515 516 #endif /* COMMON_H */ 517