2 * wpa_supplicant/hostapd / common helper functions, etc.
3 * Copyright (c) 2002-2005, Jouni Malinen <jkmaline@cc.hut.fi>
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.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
14 * $DragonFly: src/usr.sbin/802_11/wpa_supplicant/Attic/common.h,v 1.1 2006/06/24 07:29:44 sephe Exp $
23 #endif /* __linux__ */
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__) || defined(__DragonFly__) */
36 #ifdef CONFIG_NATIVE_WINDOWS
39 static inline int daemon(int nochdir
, int noclose
)
41 printf("Windows - daemon() not supported yet\n");
45 static inline void sleep(int seconds
)
47 Sleep(seconds
* 1000);
50 static inline void usleep(unsigned long usec
)
56 #define timersub(a, b, res) do { \
57 (res)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
58 (res)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
59 if ((res)->tv_usec < 0) { \
61 (res)->tv_usec += 1000000; \
71 int gettimeofday(struct timeval
*tv
, struct timezone
*tz
);
73 static inline long int random(void)
79 typedef int socklen_t
;
82 #define MSG_DONTWAIT 0 /* not supported */
85 #endif /* CONFIG_NATIVE_WINDOWS */
87 #if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS)
89 static inline unsigned short wpa_swap_16(unsigned short v
)
91 return ((v
& 0xff) << 8) | (v
>> 8);
94 static inline unsigned int wpa_swap_32(unsigned int v
)
96 return ((v
& 0xff) << 24) | ((v
& 0xff00) << 8) |
97 ((v
& 0xff0000) >> 8) | (v
>> 24);
100 #define le_to_host16(n) (n)
101 #define host_to_le16(n) (n)
102 #define be_to_host16(n) wpa_swap_16(n)
103 #define host_to_be16(n) wpa_swap_16(n)
104 #define le_to_host32(n) (n)
105 #define be_to_host32(n) wpa_swap_32(n)
106 #define host_to_be32(n) wpa_swap_32(n)
108 #else /* __CYGWIN__ */
110 #if __BYTE_ORDER == __LITTLE_ENDIAN
111 #define le_to_host16(n) (n)
112 #define host_to_le16(n) (n)
113 #define be_to_host16(n) bswap_16(n)
114 #define host_to_be16(n) bswap_16(n)
115 #define le_to_host32(n) (n)
116 #define be_to_host32(n) bswap_32(n)
117 #define host_to_be32(n) bswap_32(n)
118 #elif __BYTE_ORDER == __BIG_ENDIAN
119 #define le_to_host16(n) bswap_16(n)
120 #define host_to_le16(n) bswap_16(n)
121 #define be_to_host16(n) (n)
122 #define host_to_be16(n) (n)
123 #define le_to_host32(n) bswap_32(n)
124 #define be_to_host32(n) (n)
125 #define host_to_be32(n) (n)
126 #ifndef WORDS_BIGENDIAN
127 #define WORDS_BIGENDIAN
130 #error Could not determine CPU byte order
133 #endif /* __CYGWIN__ */
135 /* Macros for handling unaligned 16-bit variables */
136 #define WPA_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1]))
137 #define WPA_PUT_BE16(a, val) \
139 (a)[0] = ((u16) (val)) >> 8; \
140 (a)[1] = ((u16) (val)) & 0xff; \
143 #define WPA_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0]))
144 #define WPA_PUT_LE16(a, val) \
146 (a)[1] = ((u16) (val)) >> 8; \
147 (a)[0] = ((u16) (val)) & 0xff; \
150 #define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \
151 (((u32) (a)[2]) << 8) | ((u32) (a)[3]))
159 typedef uint64_t u64
;
160 typedef uint32_t u32
;
161 typedef uint16_t u16
;
168 int hostapd_get_rand(u8
*buf
, size_t len
);
169 void hostapd_hexdump(const char *title
, const u8
*buf
, size_t len
);
170 int hwaddr_aton(const char *txt
, u8
*addr
);
171 int hexstr2bin(const char *hex
, u8
*buf
, size_t len
);
172 char * rel2abs_path(const char *rel_path
);
173 void inc_byte_array(u8
*counter
, size_t len
);
174 void print_char(char c
);
175 void fprint_char(FILE *f
, char c
);
178 /* Debugging function - conditional printf and hex dump. Driver wrappers can
179 * use these for debugging purposes. */
181 enum { MSG_MSGDUMP
, MSG_DEBUG
, MSG_INFO
, MSG_WARNING
, MSG_ERROR
};
183 #ifdef CONFIG_NO_STDOUT_DEBUG
185 #define wpa_debug_print_timestamp() do { } while (0)
186 #define wpa_printf(args...) do { } while (0)
187 #define wpa_hexdump(args...) do { } while (0)
188 #define wpa_hexdump_key(args...) do { } while (0)
189 #define wpa_hexdump_ascii(args...) do { } while (0)
190 #define wpa_hexdump_ascii_key(args...) do { } while (0)
192 #else /* CONFIG_NO_STDOUT_DEBUG */
195 * wpa_debug_printf_timestamp - Print timestamp for debug output
197 * This function prints a timestamp in <seconds from 1970>.<microsoconds>
198 * format if debug output has been configured to include timestamps in debug
201 void wpa_debug_print_timestamp(void);
204 * wpa_printf - conditional printf
205 * @level: priority level (MSG_*) of the message
206 * @fmt: printf format string, followed by optional arguments
208 * This function is used to print conditional debugging and error messages. The
209 * output may be directed to stdout, stderr, and/or syslog based on
212 * Note: New line '\n' is added to the end of the text when printing to stdout.
214 void wpa_printf(int level
, char *fmt
, ...)
215 __attribute__ ((format (printf
, 2, 3)));
218 * wpa_hexdump - conditional hex dump
219 * @level: priority level (MSG_*) of the message
220 * @title: title of for the message
221 * @buf: data buffer to be dumped
222 * @len: length of the buf
224 * This function is used to print conditional debugging and error messages. The
225 * output may be directed to stdout, stderr, and/or syslog based on
226 * configuration. The contents of buf is printed out has hex dump.
228 void wpa_hexdump(int level
, const char *title
, const u8
*buf
, size_t len
);
231 * wpa_hexdump_key - conditional hex dump, hide keys
232 * @level: priority level (MSG_*) of the message
233 * @title: title of for the message
234 * @buf: data buffer to be dumped
235 * @len: length of the buf
237 * This function is used to print conditional debugging and error messages. The
238 * output may be directed to stdout, stderr, and/or syslog based on
239 * configuration. The contents of buf is printed out has hex dump. This works
240 * like wpa_hexdump(), but by default, does not include secret keys (passwords,
241 * etc.) in debug output.
243 void wpa_hexdump_key(int level
, const char *title
, const u8
*buf
, size_t len
);
246 * wpa_hexdump_ascii - conditional hex dump
247 * @level: priority level (MSG_*) of the message
248 * @title: title of for the message
249 * @buf: data buffer to be dumped
250 * @len: length of the buf
252 * This function is used to print conditional debugging and error messages. The
253 * output may be directed to stdout, stderr, and/or syslog based on
254 * configuration. The contents of buf is printed out has hex dump with both
255 * the hex numbers and ASCII characters (for printable range) are shown. 16
256 * bytes per line will be shown.
258 void wpa_hexdump_ascii(int level
, const char *title
, const u8
*buf
,
262 * wpa_hexdump_ascii_key - conditional hex dump, hide keys
263 * @level: priority level (MSG_*) of the message
264 * @title: title of for the message
265 * @buf: data buffer to be dumped
266 * @len: length of the buf
268 * This function is used to print conditional debugging and error messages. The
269 * output may be directed to stdout, stderr, and/or syslog based on
270 * configuration. The contents of buf is printed out has hex dump with both
271 * the hex numbers and ASCII characters (for printable range) are shown. 16
272 * bytes per line will be shown. This works like wpa_hexdump_ascii(), but by
273 * default, does not include secret keys (passwords, etc.) in debug output.
275 void wpa_hexdump_ascii_key(int level
, const char *title
, const u8
*buf
,
278 #endif /* CONFIG_NO_STDOUT_DEBUG */
282 #define WPA_ASSERT(a) \
285 printf("WPA_ASSERT FAILED '" #a "' " \
287 __FUNCTION__, __FILE__, __LINE__); \
292 #define WPA_ASSERT(a) do { } while (0)
295 #endif /* COMMON_H */