139beb93cSSam Leffler /* 239beb93cSSam Leffler * wpa_supplicant/hostapd / common helper functions, etc. 339beb93cSSam Leffler * Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi> 439beb93cSSam Leffler * 5f05cddf9SRui Paulo * This software may be distributed under the terms of the BSD license. 6f05cddf9SRui Paulo * See README for more details. 739beb93cSSam Leffler */ 839beb93cSSam Leffler 939beb93cSSam Leffler #ifndef COMMON_H 1039beb93cSSam Leffler #define COMMON_H 1139beb93cSSam Leffler 1239beb93cSSam Leffler #include "os.h" 1339beb93cSSam Leffler 14e28a4053SRui Paulo #if defined(__linux__) || defined(__GLIBC__) 1539beb93cSSam Leffler #include <endian.h> 1639beb93cSSam Leffler #include <byteswap.h> 1739beb93cSSam Leffler #endif /* __linux__ */ 1839beb93cSSam Leffler 193157ba21SRui Paulo #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ 203157ba21SRui Paulo defined(__OpenBSD__) 2139beb93cSSam Leffler #include <sys/types.h> 2239beb93cSSam Leffler #include <sys/endian.h> 2339beb93cSSam Leffler #define __BYTE_ORDER _BYTE_ORDER 2439beb93cSSam Leffler #define __LITTLE_ENDIAN _LITTLE_ENDIAN 2539beb93cSSam Leffler #define __BIG_ENDIAN _BIG_ENDIAN 263157ba21SRui Paulo #ifdef __OpenBSD__ 273157ba21SRui Paulo #define bswap_16 swap16 283157ba21SRui Paulo #define bswap_32 swap32 293157ba21SRui Paulo #define bswap_64 swap64 303157ba21SRui Paulo #else /* __OpenBSD__ */ 3139beb93cSSam Leffler #define bswap_16 bswap16 3239beb93cSSam Leffler #define bswap_32 bswap32 3339beb93cSSam Leffler #define bswap_64 bswap64 343157ba21SRui Paulo #endif /* __OpenBSD__ */ 3539beb93cSSam Leffler #endif /* defined(__FreeBSD__) || defined(__NetBSD__) || 363157ba21SRui Paulo * defined(__DragonFly__) || defined(__OpenBSD__) */ 3739beb93cSSam Leffler 3839beb93cSSam Leffler #ifdef __APPLE__ 3939beb93cSSam Leffler #include <sys/types.h> 4039beb93cSSam Leffler #include <machine/endian.h> 4139beb93cSSam Leffler #define __BYTE_ORDER _BYTE_ORDER 4239beb93cSSam Leffler #define __LITTLE_ENDIAN _LITTLE_ENDIAN 4339beb93cSSam Leffler #define __BIG_ENDIAN _BIG_ENDIAN 4439beb93cSSam Leffler static inline unsigned short bswap_16(unsigned short v) 4539beb93cSSam Leffler { 4639beb93cSSam Leffler return ((v & 0xff) << 8) | (v >> 8); 4739beb93cSSam Leffler } 4839beb93cSSam Leffler 4939beb93cSSam Leffler static inline unsigned int bswap_32(unsigned int v) 5039beb93cSSam Leffler { 5139beb93cSSam Leffler return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | 5239beb93cSSam Leffler ((v & 0xff0000) >> 8) | (v >> 24); 5339beb93cSSam Leffler } 5439beb93cSSam Leffler #endif /* __APPLE__ */ 5539beb93cSSam Leffler 5685732ac8SCy Schubert #ifdef __rtems__ 5785732ac8SCy Schubert #include <rtems/endian.h> 5885732ac8SCy Schubert #define __BYTE_ORDER BYTE_ORDER 5985732ac8SCy Schubert #define __LITTLE_ENDIAN LITTLE_ENDIAN 6085732ac8SCy Schubert #define __BIG_ENDIAN BIG_ENDIAN 6185732ac8SCy Schubert #define bswap_16 CPU_swap_u16 6285732ac8SCy Schubert #define bswap_32 CPU_swap_u32 6385732ac8SCy Schubert #endif /* __rtems__ */ 6485732ac8SCy Schubert 6539beb93cSSam Leffler #ifdef CONFIG_NATIVE_WINDOWS 6639beb93cSSam Leffler #include <winsock.h> 6739beb93cSSam Leffler 6839beb93cSSam Leffler typedef int socklen_t; 6939beb93cSSam Leffler 7039beb93cSSam Leffler #ifndef MSG_DONTWAIT 7139beb93cSSam Leffler #define MSG_DONTWAIT 0 /* not supported */ 7239beb93cSSam Leffler #endif 7339beb93cSSam Leffler 7439beb93cSSam Leffler #endif /* CONFIG_NATIVE_WINDOWS */ 7539beb93cSSam Leffler 7639beb93cSSam Leffler #ifdef _MSC_VER 7739beb93cSSam Leffler #define inline __inline 7839beb93cSSam Leffler 7939beb93cSSam Leffler #undef vsnprintf 8039beb93cSSam Leffler #define vsnprintf _vsnprintf 8139beb93cSSam Leffler #undef close 8239beb93cSSam Leffler #define close closesocket 8339beb93cSSam Leffler #endif /* _MSC_VER */ 8439beb93cSSam Leffler 8539beb93cSSam Leffler 8639beb93cSSam Leffler /* Define platform specific integer types */ 8739beb93cSSam Leffler 8839beb93cSSam Leffler #ifdef _MSC_VER 8939beb93cSSam Leffler typedef UINT64 u64; 9039beb93cSSam Leffler typedef UINT32 u32; 9139beb93cSSam Leffler typedef UINT16 u16; 9239beb93cSSam Leffler typedef UINT8 u8; 9339beb93cSSam Leffler typedef INT64 s64; 9439beb93cSSam Leffler typedef INT32 s32; 9539beb93cSSam Leffler typedef INT16 s16; 9639beb93cSSam Leffler typedef INT8 s8; 9739beb93cSSam Leffler #define WPA_TYPES_DEFINED 9839beb93cSSam Leffler #endif /* _MSC_VER */ 9939beb93cSSam Leffler 10039beb93cSSam Leffler #ifdef __vxworks 10139beb93cSSam Leffler typedef unsigned long long u64; 10239beb93cSSam Leffler typedef UINT32 u32; 10339beb93cSSam Leffler typedef UINT16 u16; 10439beb93cSSam Leffler typedef UINT8 u8; 10539beb93cSSam Leffler typedef long long s64; 10639beb93cSSam Leffler typedef INT32 s32; 10739beb93cSSam Leffler typedef INT16 s16; 10839beb93cSSam Leffler typedef INT8 s8; 10939beb93cSSam Leffler #define WPA_TYPES_DEFINED 11039beb93cSSam Leffler #endif /* __vxworks */ 11139beb93cSSam Leffler 11239beb93cSSam Leffler #ifndef WPA_TYPES_DEFINED 11339beb93cSSam Leffler #ifdef CONFIG_USE_INTTYPES_H 11439beb93cSSam Leffler #include <inttypes.h> 11539beb93cSSam Leffler #else 11639beb93cSSam Leffler #include <stdint.h> 11739beb93cSSam Leffler #endif 11839beb93cSSam Leffler typedef uint64_t u64; 11939beb93cSSam Leffler typedef uint32_t u32; 12039beb93cSSam Leffler typedef uint16_t u16; 12139beb93cSSam Leffler typedef uint8_t u8; 12239beb93cSSam Leffler typedef int64_t s64; 12339beb93cSSam Leffler typedef int32_t s32; 12439beb93cSSam Leffler typedef int16_t s16; 12539beb93cSSam Leffler typedef int8_t s8; 12639beb93cSSam Leffler #define WPA_TYPES_DEFINED 12739beb93cSSam Leffler #endif /* !WPA_TYPES_DEFINED */ 12839beb93cSSam Leffler 12939beb93cSSam Leffler 13039beb93cSSam Leffler /* Define platform specific byte swapping macros */ 13139beb93cSSam Leffler 13239beb93cSSam Leffler #if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS) 13339beb93cSSam Leffler 13439beb93cSSam Leffler static inline unsigned short wpa_swap_16(unsigned short v) 13539beb93cSSam Leffler { 13639beb93cSSam Leffler return ((v & 0xff) << 8) | (v >> 8); 13739beb93cSSam Leffler } 13839beb93cSSam Leffler 13939beb93cSSam Leffler static inline unsigned int wpa_swap_32(unsigned int v) 14039beb93cSSam Leffler { 14139beb93cSSam Leffler return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | 14239beb93cSSam Leffler ((v & 0xff0000) >> 8) | (v >> 24); 14339beb93cSSam Leffler } 14439beb93cSSam Leffler 14539beb93cSSam Leffler #define le_to_host16(n) (n) 14639beb93cSSam Leffler #define host_to_le16(n) (n) 14739beb93cSSam Leffler #define be_to_host16(n) wpa_swap_16(n) 14839beb93cSSam Leffler #define host_to_be16(n) wpa_swap_16(n) 14939beb93cSSam Leffler #define le_to_host32(n) (n) 1505b9c547cSRui Paulo #define host_to_le32(n) (n) 15139beb93cSSam Leffler #define be_to_host32(n) wpa_swap_32(n) 15239beb93cSSam Leffler #define host_to_be32(n) wpa_swap_32(n) 15385732ac8SCy Schubert #define host_to_le64(n) (n) 15439beb93cSSam Leffler 15539beb93cSSam Leffler #define WPA_BYTE_SWAP_DEFINED 15639beb93cSSam Leffler 15739beb93cSSam Leffler #endif /* __CYGWIN__ || CONFIG_NATIVE_WINDOWS */ 15839beb93cSSam Leffler 15939beb93cSSam Leffler 16039beb93cSSam Leffler #ifndef WPA_BYTE_SWAP_DEFINED 16139beb93cSSam Leffler 16239beb93cSSam Leffler #ifndef __BYTE_ORDER 16339beb93cSSam Leffler #ifndef __LITTLE_ENDIAN 16439beb93cSSam Leffler #ifndef __BIG_ENDIAN 16539beb93cSSam Leffler #define __LITTLE_ENDIAN 1234 16639beb93cSSam Leffler #define __BIG_ENDIAN 4321 16739beb93cSSam Leffler #if defined(sparc) 16839beb93cSSam Leffler #define __BYTE_ORDER __BIG_ENDIAN 16939beb93cSSam Leffler #endif 17039beb93cSSam Leffler #endif /* __BIG_ENDIAN */ 17139beb93cSSam Leffler #endif /* __LITTLE_ENDIAN */ 17239beb93cSSam Leffler #endif /* __BYTE_ORDER */ 17339beb93cSSam Leffler 17439beb93cSSam Leffler #if __BYTE_ORDER == __LITTLE_ENDIAN 17539beb93cSSam Leffler #define le_to_host16(n) ((__force u16) (le16) (n)) 17639beb93cSSam Leffler #define host_to_le16(n) ((__force le16) (u16) (n)) 17739beb93cSSam Leffler #define be_to_host16(n) bswap_16((__force u16) (be16) (n)) 17839beb93cSSam Leffler #define host_to_be16(n) ((__force be16) bswap_16((n))) 17939beb93cSSam Leffler #define le_to_host32(n) ((__force u32) (le32) (n)) 18039beb93cSSam Leffler #define host_to_le32(n) ((__force le32) (u32) (n)) 18139beb93cSSam Leffler #define be_to_host32(n) bswap_32((__force u32) (be32) (n)) 18239beb93cSSam Leffler #define host_to_be32(n) ((__force be32) bswap_32((n))) 18339beb93cSSam Leffler #define le_to_host64(n) ((__force u64) (le64) (n)) 18439beb93cSSam Leffler #define host_to_le64(n) ((__force le64) (u64) (n)) 18539beb93cSSam Leffler #define be_to_host64(n) bswap_64((__force u64) (be64) (n)) 18639beb93cSSam Leffler #define host_to_be64(n) ((__force be64) bswap_64((n))) 18739beb93cSSam Leffler #elif __BYTE_ORDER == __BIG_ENDIAN 18839beb93cSSam Leffler #define le_to_host16(n) bswap_16(n) 18939beb93cSSam Leffler #define host_to_le16(n) bswap_16(n) 19039beb93cSSam Leffler #define be_to_host16(n) (n) 19139beb93cSSam Leffler #define host_to_be16(n) (n) 19239beb93cSSam Leffler #define le_to_host32(n) bswap_32(n) 1935b9c547cSRui Paulo #define host_to_le32(n) bswap_32(n) 19439beb93cSSam Leffler #define be_to_host32(n) (n) 19539beb93cSSam Leffler #define host_to_be32(n) (n) 19639beb93cSSam Leffler #define le_to_host64(n) bswap_64(n) 19739beb93cSSam Leffler #define host_to_le64(n) bswap_64(n) 19839beb93cSSam Leffler #define be_to_host64(n) (n) 19939beb93cSSam Leffler #define host_to_be64(n) (n) 20039beb93cSSam Leffler #ifndef WORDS_BIGENDIAN 20139beb93cSSam Leffler #define WORDS_BIGENDIAN 20239beb93cSSam Leffler #endif 20339beb93cSSam Leffler #else 20439beb93cSSam Leffler #error Could not determine CPU byte order 20539beb93cSSam Leffler #endif 20639beb93cSSam Leffler 20739beb93cSSam Leffler #define WPA_BYTE_SWAP_DEFINED 20839beb93cSSam Leffler #endif /* !WPA_BYTE_SWAP_DEFINED */ 20939beb93cSSam Leffler 21039beb93cSSam Leffler 21139beb93cSSam Leffler /* Macros for handling unaligned memory accesses */ 21239beb93cSSam Leffler 2135b9c547cSRui Paulo static inline u16 WPA_GET_BE16(const u8 *a) 2145b9c547cSRui Paulo { 2155b9c547cSRui Paulo return (a[0] << 8) | a[1]; 2165b9c547cSRui Paulo } 21739beb93cSSam Leffler 2185b9c547cSRui Paulo static inline void WPA_PUT_BE16(u8 *a, u16 val) 2195b9c547cSRui Paulo { 2205b9c547cSRui Paulo a[0] = val >> 8; 2215b9c547cSRui Paulo a[1] = val & 0xff; 2225b9c547cSRui Paulo } 22339beb93cSSam Leffler 2245b9c547cSRui Paulo static inline u16 WPA_GET_LE16(const u8 *a) 2255b9c547cSRui Paulo { 2265b9c547cSRui Paulo return (a[1] << 8) | a[0]; 2275b9c547cSRui Paulo } 22839beb93cSSam Leffler 2295b9c547cSRui Paulo static inline void WPA_PUT_LE16(u8 *a, u16 val) 2305b9c547cSRui Paulo { 2315b9c547cSRui Paulo a[1] = val >> 8; 2325b9c547cSRui Paulo a[0] = val & 0xff; 2335b9c547cSRui Paulo } 23439beb93cSSam Leffler 2355b9c547cSRui Paulo static inline u32 WPA_GET_BE24(const u8 *a) 2365b9c547cSRui Paulo { 2375b9c547cSRui Paulo return (a[0] << 16) | (a[1] << 8) | a[2]; 2385b9c547cSRui Paulo } 23939beb93cSSam Leffler 2405b9c547cSRui Paulo static inline void WPA_PUT_BE24(u8 *a, u32 val) 2415b9c547cSRui Paulo { 2425b9c547cSRui Paulo a[0] = (val >> 16) & 0xff; 2435b9c547cSRui Paulo a[1] = (val >> 8) & 0xff; 2445b9c547cSRui Paulo a[2] = val & 0xff; 2455b9c547cSRui Paulo } 24639beb93cSSam Leffler 247*a90b9d01SCy Schubert static inline u32 WPA_GET_LE24(const u8 *a) 248*a90b9d01SCy Schubert { 249*a90b9d01SCy Schubert return (a[2] << 16) | (a[1] << 8) | a[0]; 250*a90b9d01SCy Schubert } 251*a90b9d01SCy Schubert 252*a90b9d01SCy Schubert static inline void WPA_PUT_LE24(u8 *a, u32 val) 253*a90b9d01SCy Schubert { 254*a90b9d01SCy Schubert a[2] = (val >> 16) & 0xff; 255*a90b9d01SCy Schubert a[1] = (val >> 8) & 0xff; 256*a90b9d01SCy Schubert a[0] = val & 0xff; 257*a90b9d01SCy Schubert } 258*a90b9d01SCy Schubert 2595b9c547cSRui Paulo static inline u32 WPA_GET_BE32(const u8 *a) 2605b9c547cSRui Paulo { 261325151a3SRui Paulo return ((u32) a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]; 2625b9c547cSRui Paulo } 2635b9c547cSRui Paulo 2645b9c547cSRui Paulo static inline void WPA_PUT_BE32(u8 *a, u32 val) 2655b9c547cSRui Paulo { 2665b9c547cSRui Paulo a[0] = (val >> 24) & 0xff; 2675b9c547cSRui Paulo a[1] = (val >> 16) & 0xff; 2685b9c547cSRui Paulo a[2] = (val >> 8) & 0xff; 2695b9c547cSRui Paulo a[3] = val & 0xff; 2705b9c547cSRui Paulo } 2715b9c547cSRui Paulo 2725b9c547cSRui Paulo static inline u32 WPA_GET_LE32(const u8 *a) 2735b9c547cSRui Paulo { 274325151a3SRui Paulo return ((u32) a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0]; 2755b9c547cSRui Paulo } 2765b9c547cSRui Paulo 2775b9c547cSRui Paulo static inline void WPA_PUT_LE32(u8 *a, u32 val) 2785b9c547cSRui Paulo { 2795b9c547cSRui Paulo a[3] = (val >> 24) & 0xff; 2805b9c547cSRui Paulo a[2] = (val >> 16) & 0xff; 2815b9c547cSRui Paulo a[1] = (val >> 8) & 0xff; 2825b9c547cSRui Paulo a[0] = val & 0xff; 2835b9c547cSRui Paulo } 2845b9c547cSRui Paulo 2855b9c547cSRui Paulo static inline u64 WPA_GET_BE64(const u8 *a) 2865b9c547cSRui Paulo { 2875b9c547cSRui Paulo return (((u64) a[0]) << 56) | (((u64) a[1]) << 48) | 2885b9c547cSRui Paulo (((u64) a[2]) << 40) | (((u64) a[3]) << 32) | 2895b9c547cSRui Paulo (((u64) a[4]) << 24) | (((u64) a[5]) << 16) | 2905b9c547cSRui Paulo (((u64) a[6]) << 8) | ((u64) a[7]); 2915b9c547cSRui Paulo } 2925b9c547cSRui Paulo 2935b9c547cSRui Paulo static inline void WPA_PUT_BE64(u8 *a, u64 val) 2945b9c547cSRui Paulo { 2955b9c547cSRui Paulo a[0] = val >> 56; 2965b9c547cSRui Paulo a[1] = val >> 48; 2975b9c547cSRui Paulo a[2] = val >> 40; 2985b9c547cSRui Paulo a[3] = val >> 32; 2995b9c547cSRui Paulo a[4] = val >> 24; 3005b9c547cSRui Paulo a[5] = val >> 16; 3015b9c547cSRui Paulo a[6] = val >> 8; 3025b9c547cSRui Paulo a[7] = val & 0xff; 3035b9c547cSRui Paulo } 3045b9c547cSRui Paulo 3055b9c547cSRui Paulo static inline u64 WPA_GET_LE64(const u8 *a) 3065b9c547cSRui Paulo { 3075b9c547cSRui Paulo return (((u64) a[7]) << 56) | (((u64) a[6]) << 48) | 3085b9c547cSRui Paulo (((u64) a[5]) << 40) | (((u64) a[4]) << 32) | 3095b9c547cSRui Paulo (((u64) a[3]) << 24) | (((u64) a[2]) << 16) | 3105b9c547cSRui Paulo (((u64) a[1]) << 8) | ((u64) a[0]); 3115b9c547cSRui Paulo } 3125b9c547cSRui Paulo 3135b9c547cSRui Paulo static inline void WPA_PUT_LE64(u8 *a, u64 val) 3145b9c547cSRui Paulo { 3155b9c547cSRui Paulo a[7] = val >> 56; 3165b9c547cSRui Paulo a[6] = val >> 48; 3175b9c547cSRui Paulo a[5] = val >> 40; 3185b9c547cSRui Paulo a[4] = val >> 32; 3195b9c547cSRui Paulo a[3] = val >> 24; 3205b9c547cSRui Paulo a[2] = val >> 16; 3215b9c547cSRui Paulo a[1] = val >> 8; 3225b9c547cSRui Paulo a[0] = val & 0xff; 3235b9c547cSRui Paulo } 32439beb93cSSam Leffler 32539beb93cSSam Leffler 32639beb93cSSam Leffler #ifndef ETH_ALEN 32739beb93cSSam Leffler #define ETH_ALEN 6 32839beb93cSSam Leffler #endif 3295b9c547cSRui Paulo #ifndef ETH_HLEN 3305b9c547cSRui Paulo #define ETH_HLEN 14 3315b9c547cSRui Paulo #endif 332e28a4053SRui Paulo #ifndef IFNAMSIZ 333e28a4053SRui Paulo #define IFNAMSIZ 16 334e28a4053SRui Paulo #endif 335e28a4053SRui Paulo #ifndef ETH_P_ALL 336e28a4053SRui Paulo #define ETH_P_ALL 0x0003 337e28a4053SRui Paulo #endif 338780fb4a2SCy Schubert #ifndef ETH_P_IP 339780fb4a2SCy Schubert #define ETH_P_IP 0x0800 340780fb4a2SCy Schubert #endif 341f05cddf9SRui Paulo #ifndef ETH_P_80211_ENCAP 342f05cddf9SRui Paulo #define ETH_P_80211_ENCAP 0x890d /* TDLS comes under this category */ 343f05cddf9SRui Paulo #endif 344e28a4053SRui Paulo #ifndef ETH_P_PAE 345e28a4053SRui Paulo #define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ 346e28a4053SRui Paulo #endif /* ETH_P_PAE */ 347e28a4053SRui Paulo #ifndef ETH_P_EAPOL 348e28a4053SRui Paulo #define ETH_P_EAPOL ETH_P_PAE 349e28a4053SRui Paulo #endif /* ETH_P_EAPOL */ 350e28a4053SRui Paulo #ifndef ETH_P_RSN_PREAUTH 351e28a4053SRui Paulo #define ETH_P_RSN_PREAUTH 0x88c7 352e28a4053SRui Paulo #endif /* ETH_P_RSN_PREAUTH */ 353e28a4053SRui Paulo #ifndef ETH_P_RRB 354e28a4053SRui Paulo #define ETH_P_RRB 0x890D 355e28a4053SRui Paulo #endif /* ETH_P_RRB */ 35685732ac8SCy Schubert #ifndef ETH_P_OUI 35785732ac8SCy Schubert #define ETH_P_OUI 0x88B7 35885732ac8SCy Schubert #endif /* ETH_P_OUI */ 359c1d255d3SCy Schubert #ifndef ETH_P_8021Q 360c1d255d3SCy Schubert #define ETH_P_8021Q 0x8100 361c1d255d3SCy Schubert #endif /* ETH_P_8021Q */ 36239beb93cSSam Leffler 36339beb93cSSam Leffler 36439beb93cSSam Leffler #ifdef __GNUC__ 36539beb93cSSam Leffler #define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b)))) 36639beb93cSSam Leffler #define STRUCT_PACKED __attribute__ ((packed)) 36739beb93cSSam Leffler #else 36839beb93cSSam Leffler #define PRINTF_FORMAT(a,b) 36939beb93cSSam Leffler #define STRUCT_PACKED 37039beb93cSSam Leffler #endif 37139beb93cSSam Leffler 37239beb93cSSam Leffler 37339beb93cSSam Leffler #ifdef CONFIG_ANSI_C_EXTRA 37439beb93cSSam Leffler 37539beb93cSSam Leffler #if !defined(_MSC_VER) || _MSC_VER < 1400 37639beb93cSSam Leffler /* snprintf - used in number of places; sprintf() is _not_ a good replacement 37739beb93cSSam Leffler * due to possible buffer overflow; see, e.g., 37839beb93cSSam Leffler * http://www.ijs.si/software/snprintf/ for portable implementation of 37939beb93cSSam Leffler * snprintf. */ 38039beb93cSSam Leffler int snprintf(char *str, size_t size, const char *format, ...); 38139beb93cSSam Leffler 38239beb93cSSam Leffler /* vsnprintf - only used for wpa_msg() in wpa_supplicant.c */ 38339beb93cSSam Leffler int vsnprintf(char *str, size_t size, const char *format, va_list ap); 38439beb93cSSam Leffler #endif /* !defined(_MSC_VER) || _MSC_VER < 1400 */ 38539beb93cSSam Leffler 38639beb93cSSam Leffler /* getopt - only used in main.c */ 38739beb93cSSam Leffler int getopt(int argc, char *const argv[], const char *optstring); 38839beb93cSSam Leffler extern char *optarg; 38939beb93cSSam Leffler extern int optind; 39039beb93cSSam Leffler 39139beb93cSSam Leffler #ifndef CONFIG_NO_SOCKLEN_T_TYPEDEF 39239beb93cSSam Leffler #ifndef __socklen_t_defined 39339beb93cSSam Leffler typedef int socklen_t; 39439beb93cSSam Leffler #endif 39539beb93cSSam Leffler #endif 39639beb93cSSam Leffler 39739beb93cSSam Leffler /* inline - define as __inline or just define it to be empty, if needed */ 39839beb93cSSam Leffler #ifdef CONFIG_NO_INLINE 39939beb93cSSam Leffler #define inline 40039beb93cSSam Leffler #else 40139beb93cSSam Leffler #define inline __inline 40239beb93cSSam Leffler #endif 40339beb93cSSam Leffler 40439beb93cSSam Leffler #ifndef __func__ 40539beb93cSSam Leffler #define __func__ "__func__ not defined" 40639beb93cSSam Leffler #endif 40739beb93cSSam Leffler 40839beb93cSSam Leffler #ifndef bswap_16 40939beb93cSSam Leffler #define bswap_16(a) ((((u16) (a) << 8) & 0xff00) | (((u16) (a) >> 8) & 0xff)) 41039beb93cSSam Leffler #endif 41139beb93cSSam Leffler 41239beb93cSSam Leffler #ifndef bswap_32 41339beb93cSSam Leffler #define bswap_32(a) ((((u32) (a) << 24) & 0xff000000) | \ 41439beb93cSSam Leffler (((u32) (a) << 8) & 0xff0000) | \ 41539beb93cSSam Leffler (((u32) (a) >> 8) & 0xff00) | \ 41639beb93cSSam Leffler (((u32) (a) >> 24) & 0xff)) 41739beb93cSSam Leffler #endif 41839beb93cSSam Leffler 41939beb93cSSam Leffler #ifndef MSG_DONTWAIT 42039beb93cSSam Leffler #define MSG_DONTWAIT 0 42139beb93cSSam Leffler #endif 42239beb93cSSam Leffler 42339beb93cSSam Leffler #ifdef _WIN32_WCE 42439beb93cSSam Leffler void perror(const char *s); 42539beb93cSSam Leffler #endif /* _WIN32_WCE */ 42639beb93cSSam Leffler 42739beb93cSSam Leffler #endif /* CONFIG_ANSI_C_EXTRA */ 42839beb93cSSam Leffler 42939beb93cSSam Leffler #ifndef MAC2STR 43039beb93cSSam Leffler #define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] 43139beb93cSSam Leffler #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" 432f05cddf9SRui Paulo 433f05cddf9SRui Paulo /* 434f05cddf9SRui Paulo * Compact form for string representation of MAC address 435f05cddf9SRui Paulo * To be used, e.g., for constructing dbus paths for P2P Devices 436f05cddf9SRui Paulo */ 437f05cddf9SRui Paulo #define COMPACT_MACSTR "%02x%02x%02x%02x%02x%02x" 43839beb93cSSam Leffler #endif 43939beb93cSSam Leffler 44039beb93cSSam Leffler #ifndef BIT 441325151a3SRui Paulo #define BIT(x) (1U << (x)) 44239beb93cSSam Leffler #endif 44339beb93cSSam Leffler 444*a90b9d01SCy Schubert #ifndef MIN 445*a90b9d01SCy Schubert #define MIN(a, b) ((a) < (b) ? (a) : (b)) 446*a90b9d01SCy Schubert #endif 447*a90b9d01SCy Schubert #ifndef MAX 448*a90b9d01SCy Schubert #define MAX(a, b) (((a) > (b)) ? (a) : (b)) 449*a90b9d01SCy Schubert #endif 450*a90b9d01SCy Schubert 45139beb93cSSam Leffler /* 45239beb93cSSam Leffler * Definitions for sparse validation 45339beb93cSSam Leffler * (http://kernel.org/pub/linux/kernel/people/josh/sparse/) 45439beb93cSSam Leffler */ 45539beb93cSSam Leffler #ifdef __CHECKER__ 45639beb93cSSam Leffler #define __force __attribute__((force)) 457780fb4a2SCy Schubert #undef __bitwise 45839beb93cSSam Leffler #define __bitwise __attribute__((bitwise)) 45939beb93cSSam Leffler #else 46039beb93cSSam Leffler #define __force 46185732ac8SCy Schubert #undef __bitwise 46239beb93cSSam Leffler #define __bitwise 46339beb93cSSam Leffler #endif 46439beb93cSSam Leffler 46539beb93cSSam Leffler typedef u16 __bitwise be16; 46639beb93cSSam Leffler typedef u16 __bitwise le16; 46739beb93cSSam Leffler typedef u32 __bitwise be32; 46839beb93cSSam Leffler typedef u32 __bitwise le32; 46939beb93cSSam Leffler typedef u64 __bitwise be64; 47039beb93cSSam Leffler typedef u64 __bitwise le64; 47139beb93cSSam Leffler 47239beb93cSSam Leffler #ifndef __must_check 47339beb93cSSam Leffler #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) 47439beb93cSSam Leffler #define __must_check __attribute__((__warn_unused_result__)) 47539beb93cSSam Leffler #else 47639beb93cSSam Leffler #define __must_check 47739beb93cSSam Leffler #endif /* __GNUC__ */ 47839beb93cSSam Leffler #endif /* __must_check */ 47939beb93cSSam Leffler 4805b9c547cSRui Paulo #ifndef __maybe_unused 4815b9c547cSRui Paulo #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) 4825b9c547cSRui Paulo #define __maybe_unused __attribute__((unused)) 4835b9c547cSRui Paulo #else 4845b9c547cSRui Paulo #define __maybe_unused 4855b9c547cSRui Paulo #endif /* __GNUC__ */ 4865b9c547cSRui Paulo #endif /* __must_check */ 4875b9c547cSRui Paulo 488780fb4a2SCy Schubert #define SSID_MAX_LEN 32 489780fb4a2SCy Schubert 490780fb4a2SCy Schubert struct wpa_ssid_value { 491780fb4a2SCy Schubert u8 ssid[SSID_MAX_LEN]; 492780fb4a2SCy Schubert size_t ssid_len; 493780fb4a2SCy Schubert }; 494780fb4a2SCy Schubert 49539beb93cSSam Leffler int hwaddr_aton(const char *txt, u8 *addr); 4965b9c547cSRui Paulo int hwaddr_masked_aton(const char *txt, u8 *addr, u8 *mask, u8 maskable); 497f05cddf9SRui Paulo int hwaddr_compact_aton(const char *txt, u8 *addr); 498e28a4053SRui Paulo int hwaddr_aton2(const char *txt, u8 *addr); 499*a90b9d01SCy Schubert int hex2num(char c); 500f05cddf9SRui Paulo int hex2byte(const char *hex); 50139beb93cSSam Leffler int hexstr2bin(const char *hex, u8 *buf, size_t len); 50239beb93cSSam Leffler void inc_byte_array(u8 *counter, size_t len); 503206b73d0SCy Schubert void buf_shift_right(u8 *buf, size_t len, size_t bits); 50439beb93cSSam Leffler void wpa_get_ntp_timestamp(u8 *buf); 505c1d255d3SCy Schubert int wpa_scnprintf(char *buf, size_t size, const char *fmt, ...) 506c1d255d3SCy Schubert PRINTF_FORMAT(3, 4); 507325151a3SRui Paulo int wpa_snprintf_hex_sep(char *buf, size_t buf_size, const u8 *data, size_t len, 508325151a3SRui Paulo char sep); 50939beb93cSSam Leffler int wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len); 51039beb93cSSam Leffler int wpa_snprintf_hex_uppercase(char *buf, size_t buf_size, const u8 *data, 51139beb93cSSam Leffler size_t len); 51239beb93cSSam Leffler 5135b9c547cSRui Paulo int hwaddr_mask_txt(char *buf, size_t len, const u8 *addr, const u8 *mask); 514780fb4a2SCy Schubert int ssid_parse(const char *buf, struct wpa_ssid_value *ssid); 5155b9c547cSRui Paulo 51639beb93cSSam Leffler #ifdef CONFIG_NATIVE_WINDOWS 51739beb93cSSam Leffler void wpa_unicode2ascii_inplace(TCHAR *str); 51839beb93cSSam Leffler TCHAR * wpa_strdup_tchar(const char *str); 51939beb93cSSam Leffler #else /* CONFIG_NATIVE_WINDOWS */ 52039beb93cSSam Leffler #define wpa_unicode2ascii_inplace(s) do { } while (0) 52139beb93cSSam Leffler #define wpa_strdup_tchar(s) strdup((s)) 52239beb93cSSam Leffler #endif /* CONFIG_NATIVE_WINDOWS */ 52339beb93cSSam Leffler 524f05cddf9SRui Paulo void printf_encode(char *txt, size_t maxlen, const u8 *data, size_t len); 525f05cddf9SRui Paulo size_t printf_decode(u8 *buf, size_t maxlen, const char *str); 526f05cddf9SRui Paulo 52739beb93cSSam Leffler const char * wpa_ssid_txt(const u8 *ssid, size_t ssid_len); 52839beb93cSSam Leffler 529f05cddf9SRui Paulo char * wpa_config_parse_string(const char *value, size_t *len); 530f05cddf9SRui Paulo int is_hex(const u8 *data, size_t len); 531780fb4a2SCy Schubert int has_ctrl_char(const u8 *data, size_t len); 532780fb4a2SCy Schubert int has_newline(const char *str); 533f05cddf9SRui Paulo size_t merge_byte_arrays(u8 *res, size_t res_len, 534f05cddf9SRui Paulo const u8 *src1, size_t src1_len, 535f05cddf9SRui Paulo const u8 *src2, size_t src2_len); 5365b9c547cSRui Paulo char * dup_binstr(const void *src, size_t len); 537f05cddf9SRui Paulo 53839beb93cSSam Leffler static inline int is_zero_ether_addr(const u8 *a) 53939beb93cSSam Leffler { 54039beb93cSSam Leffler return !(a[0] | a[1] | a[2] | a[3] | a[4] | a[5]); 54139beb93cSSam Leffler } 54239beb93cSSam Leffler 543f05cddf9SRui Paulo static inline int is_broadcast_ether_addr(const u8 *a) 544f05cddf9SRui Paulo { 545f05cddf9SRui Paulo return (a[0] & a[1] & a[2] & a[3] & a[4] & a[5]) == 0xff; 546f05cddf9SRui Paulo } 547f05cddf9SRui Paulo 548325151a3SRui Paulo static inline int is_multicast_ether_addr(const u8 *a) 549325151a3SRui Paulo { 550325151a3SRui Paulo return a[0] & 0x01; 551325151a3SRui Paulo } 552325151a3SRui Paulo 553*a90b9d01SCy Schubert static inline bool ether_addr_equal(const u8 *a, const u8 *b) 554*a90b9d01SCy Schubert { 555*a90b9d01SCy Schubert return os_memcmp(a, b, ETH_ALEN) == 0; 556*a90b9d01SCy Schubert } 557*a90b9d01SCy Schubert 558f05cddf9SRui Paulo #define broadcast_ether_addr (const u8 *) "\xff\xff\xff\xff\xff\xff" 559f05cddf9SRui Paulo 56039beb93cSSam Leffler #include "wpa_debug.h" 56139beb93cSSam Leffler 5623157ba21SRui Paulo 5635b9c547cSRui Paulo struct wpa_freq_range_list { 5645b9c547cSRui Paulo struct wpa_freq_range { 5655b9c547cSRui Paulo unsigned int min; 5665b9c547cSRui Paulo unsigned int max; 5675b9c547cSRui Paulo } *range; 5685b9c547cSRui Paulo unsigned int num; 5695b9c547cSRui Paulo }; 5705b9c547cSRui Paulo 5715b9c547cSRui Paulo int freq_range_list_parse(struct wpa_freq_range_list *res, const char *value); 5725b9c547cSRui Paulo int freq_range_list_includes(const struct wpa_freq_range_list *list, 5735b9c547cSRui Paulo unsigned int freq); 5745b9c547cSRui Paulo char * freq_range_list_str(const struct wpa_freq_range_list *list); 5755b9c547cSRui Paulo 576c1d255d3SCy Schubert size_t int_array_len(const int *a); 5775b9c547cSRui Paulo void int_array_concat(int **res, const int *a); 5785b9c547cSRui Paulo void int_array_sort_unique(int *a); 5795b9c547cSRui Paulo void int_array_add_unique(int **res, int a); 580*a90b9d01SCy Schubert bool int_array_includes(int *arr, int val); 5815b9c547cSRui Paulo 5825b9c547cSRui Paulo #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) 5835b9c547cSRui Paulo 5845b9c547cSRui Paulo void str_clear_free(char *str); 5855b9c547cSRui Paulo void bin_clear_free(void *bin, size_t len); 5865b9c547cSRui Paulo 5875b9c547cSRui Paulo int random_mac_addr(u8 *addr); 5885b9c547cSRui Paulo int random_mac_addr_keep_oui(u8 *addr); 5895b9c547cSRui Paulo 590325151a3SRui Paulo const char * cstr_token(const char *str, const char *delim, const char **last); 5915b9c547cSRui Paulo char * str_token(char *str, const char *delim, char **context); 5925b9c547cSRui Paulo size_t utf8_escape(const char *inp, size_t in_size, 5935b9c547cSRui Paulo char *outp, size_t out_size); 5945b9c547cSRui Paulo size_t utf8_unescape(const char *inp, size_t in_size, 5955b9c547cSRui Paulo char *outp, size_t out_size); 596325151a3SRui Paulo int is_ctrl_char(char c); 5975b9c547cSRui Paulo 598780fb4a2SCy Schubert int str_starts(const char *str, const char *start); 599780fb4a2SCy Schubert 60085732ac8SCy Schubert u8 rssi_to_rcpi(int rssi); 6014bc52338SCy Schubert char * get_param(const char *cmd, const char *param); 6025b9c547cSRui Paulo 603*a90b9d01SCy Schubert #define for_each_link(__links, __i) \ 604*a90b9d01SCy Schubert for ((__i) = 0; (__i) < MAX_NUM_MLD_LINKS; (__i)++) \ 605*a90b9d01SCy Schubert if ((__links) & BIT(__i)) 606*a90b9d01SCy Schubert 607*a90b9d01SCy Schubert /* Iterate all links, or, if no link is defined, iterate given index */ 608*a90b9d01SCy Schubert #define for_each_link_default(_links, _i, _def_idx) \ 609*a90b9d01SCy Schubert for ((_i) = (_links) ? 0 : (_def_idx); \ 610*a90b9d01SCy Schubert (_i) < MAX_NUM_MLD_LINKS || \ 611*a90b9d01SCy Schubert (!(_links) && (_i) == (_def_idx)); \ 612*a90b9d01SCy Schubert (_i)++) \ 613*a90b9d01SCy Schubert if (!(_links) || (_links) & BIT(_i)) 614*a90b9d01SCy Schubert 615206b73d0SCy Schubert void forced_memzero(void *ptr, size_t len); 616206b73d0SCy Schubert 6173157ba21SRui Paulo /* 6183157ba21SRui Paulo * gcc 4.4 ends up generating strict-aliasing warnings about some very common 6193157ba21SRui Paulo * networking socket uses that do not really result in a real problem and 6203157ba21SRui Paulo * cannot be easily avoided with union-based type-punning due to struct 6213157ba21SRui Paulo * definitions including another struct in system header files. To avoid having 6223157ba21SRui Paulo * to fully disable strict-aliasing warnings, provide a mechanism to hide the 6233157ba21SRui Paulo * typecast from aliasing for now. A cleaner solution will hopefully be found 6243157ba21SRui Paulo * in the future to handle these cases. 6253157ba21SRui Paulo */ 6263157ba21SRui Paulo void * __hide_aliasing_typecast(void *foo); 6273157ba21SRui Paulo #define aliasing_hide_typecast(a,t) (t *) __hide_aliasing_typecast((a)) 6283157ba21SRui Paulo 629f05cddf9SRui Paulo #ifdef CONFIG_VALGRIND 630f05cddf9SRui Paulo #include <valgrind/memcheck.h> 631f05cddf9SRui Paulo #define WPA_MEM_DEFINED(ptr, len) VALGRIND_MAKE_MEM_DEFINED((ptr), (len)) 632f05cddf9SRui Paulo #else /* CONFIG_VALGRIND */ 633f05cddf9SRui Paulo #define WPA_MEM_DEFINED(ptr, len) do { } while (0) 634f05cddf9SRui Paulo #endif /* CONFIG_VALGRIND */ 635f05cddf9SRui Paulo 63639beb93cSSam Leffler #endif /* COMMON_H */ 637