1/* 2 * wpa_supplicant/hostapd / common helper functions, etc. 3 * Copyright (c) 2002-2006, Jouni Malinen <j@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 50typedef 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 64static inline unsigned short wpa_swap_16(unsigned short v) 65{ 66 return ((v & 0xff) << 8) | (v >> 8); 67} 68 69static 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 182typedef UINT64 u64; 183typedef UINT32 u32; 184typedef UINT16 u16; 185typedef UINT8 u8; 186typedef INT64 s64; 187typedef INT32 s32; 188typedef INT16 s16; 189typedef INT8 s8; 190#define WPA_TYPES_DEFINED 191#endif /* _MSC_VER */ 192 193#ifdef __vxworks 194typedef unsigned long long u64; 195typedef UINT32 u32; 196typedef UINT16 u16; 197typedef UINT8 u8; 198typedef long long s64; 199typedef INT32 s32; 200typedef INT16 s16; 201typedef INT8 s8; 202#define WPA_TYPES_DEFINED 203#endif /* __vxworks */ 204 205#ifdef CONFIG_TI_COMPILER 206#ifdef _LLONG_AVAILABLE 207typedef 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 */ 213typedef unsigned long u64; 214#endif 215typedef unsigned int u32; 216typedef unsigned short u16; 217typedef 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 227typedef uint64_t u64; 228typedef uint32_t u32; 229typedef uint16_t u16; 230typedef uint8_t u8; 231typedef int64_t s64; 232typedef int32_t s32; 233typedef int16_t s16; 234typedef int8_t s8; 235#define WPA_TYPES_DEFINED 236#endif /* !WPA_TYPES_DEFINED */ 237 238#define hostapd_get_rand os_get_random 239int hwaddr_aton(const char *txt, u8 *addr); 240int hexstr2bin(const char *hex, u8 *buf, size_t len); 241void inc_byte_array(u8 *counter, size_t len); 242void 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 257enum { 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 269void 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 293int wpa_debug_open_file(const char *path); 294void 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 */ 303void 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 */ 316void wpa_printf(int level, char *fmt, ...) 317PRINTF_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 */ 330void 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 */ 345void 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 */ 360void 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 */ 377void 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 */ 402void wpa_msg(void *ctx, int level, char *fmt, ...) PRINTF_FORMAT(3, 4); 403 404typedef 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 */ 411void wpa_msg_register_cb(wpa_msg_cb_func func); 412#endif /* CONFIG_NO_WPA_MSG */ 413 414 415int wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len); 416int 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. */ 450int snprintf(char *str, size_t size, const char *format, ...); 451 452/* vsnprintf - only used for wpa_msg() in wpa_supplicant.c */ 453int 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 */ 457int getopt(int argc, char *const argv[], const char *optstring); 458extern char *optarg; 459extern int optind; 460 461#ifndef CONFIG_NO_SOCKLEN_T_TYPEDEF 462#ifndef __socklen_t_defined 463typedef 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 494void 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 502void wpa_unicode2ascii_inplace(TCHAR *str); 503TCHAR * 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 509const char * wpa_ssid_txt(u8 *ssid, size_t ssid_len); 510 511#ifndef ANDROID 512typedef u32 __be32; 513typedef u64 __be64; 514#endif /* Dm: */ 515 516#endif /* COMMON_H */ 517