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