xref: /freebsd-src/contrib/wpa/src/utils/common.h (revision a90b9d0159070121c221b966469c3e36d912bf82)
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