]>
Commit | Line | Data |
---|---|---|
6fc6879b JM |
1 | /* |
2 | * wpa_supplicant/hostapd / common helper functions, etc. | |
3 | * Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi> | |
4 | * | |
0f3d578e JM |
5 | * This software may be distributed under the terms of the BSD license. |
6 | * See README for more details. | |
6fc6879b JM |
7 | */ |
8 | ||
9 | #ifndef COMMON_H | |
10 | #define COMMON_H | |
11 | ||
12 | #include "os.h" | |
13 | ||
09bd6e8c | 14 | #if defined(__linux__) || defined(__GLIBC__) |
6fc6879b JM |
15 | #include <endian.h> |
16 | #include <byteswap.h> | |
17 | #endif /* __linux__ */ | |
18 | ||
80cc6bf6 MH |
19 | #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ |
20 | defined(__OpenBSD__) | |
6fc6879b JM |
21 | #include <sys/types.h> |
22 | #include <sys/endian.h> | |
23 | #define __BYTE_ORDER _BYTE_ORDER | |
24 | #define __LITTLE_ENDIAN _LITTLE_ENDIAN | |
25 | #define __BIG_ENDIAN _BIG_ENDIAN | |
80cc6bf6 MH |
26 | #ifdef __OpenBSD__ |
27 | #define bswap_16 swap16 | |
28 | #define bswap_32 swap32 | |
29 | #define bswap_64 swap64 | |
30 | #else /* __OpenBSD__ */ | |
6fc6879b JM |
31 | #define bswap_16 bswap16 |
32 | #define bswap_32 bswap32 | |
33 | #define bswap_64 bswap64 | |
80cc6bf6 | 34 | #endif /* __OpenBSD__ */ |
6fc6879b | 35 | #endif /* defined(__FreeBSD__) || defined(__NetBSD__) || |
80cc6bf6 | 36 | * defined(__DragonFly__) || defined(__OpenBSD__) */ |
6fc6879b JM |
37 | |
38 | #ifdef __APPLE__ | |
39 | #include <sys/types.h> | |
40 | #include <machine/endian.h> | |
41 | #define __BYTE_ORDER _BYTE_ORDER | |
42 | #define __LITTLE_ENDIAN _LITTLE_ENDIAN | |
43 | #define __BIG_ENDIAN _BIG_ENDIAN | |
44 | static inline unsigned short bswap_16(unsigned short v) | |
45 | { | |
46 | return ((v & 0xff) << 8) | (v >> 8); | |
47 | } | |
48 | ||
49 | static inline unsigned int bswap_32(unsigned int v) | |
50 | { | |
51 | return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | | |
52 | ((v & 0xff0000) >> 8) | (v >> 24); | |
53 | } | |
54 | #endif /* __APPLE__ */ | |
55 | ||
56 | #ifdef CONFIG_TI_COMPILER | |
57 | #define __BIG_ENDIAN 4321 | |
58 | #define __LITTLE_ENDIAN 1234 | |
59 | #ifdef __big_endian__ | |
60 | #define __BYTE_ORDER __BIG_ENDIAN | |
61 | #else | |
62 | #define __BYTE_ORDER __LITTLE_ENDIAN | |
63 | #endif | |
64 | #endif /* CONFIG_TI_COMPILER */ | |
65 | ||
6fc6879b JM |
66 | #ifdef CONFIG_NATIVE_WINDOWS |
67 | #include <winsock.h> | |
68 | ||
69 | typedef int socklen_t; | |
70 | ||
71 | #ifndef MSG_DONTWAIT | |
72 | #define MSG_DONTWAIT 0 /* not supported */ | |
73 | #endif | |
74 | ||
75 | #endif /* CONFIG_NATIVE_WINDOWS */ | |
76 | ||
77 | #ifdef _MSC_VER | |
78 | #define inline __inline | |
79 | ||
80 | #undef vsnprintf | |
81 | #define vsnprintf _vsnprintf | |
82 | #undef close | |
83 | #define close closesocket | |
84 | #endif /* _MSC_VER */ | |
85 | ||
86 | ||
87 | /* Define platform specific integer types */ | |
88 | ||
89 | #ifdef _MSC_VER | |
90 | typedef UINT64 u64; | |
91 | typedef UINT32 u32; | |
92 | typedef UINT16 u16; | |
93 | typedef UINT8 u8; | |
94 | typedef INT64 s64; | |
95 | typedef INT32 s32; | |
96 | typedef INT16 s16; | |
97 | typedef INT8 s8; | |
98 | #define WPA_TYPES_DEFINED | |
99 | #endif /* _MSC_VER */ | |
100 | ||
101 | #ifdef __vxworks | |
102 | typedef unsigned long long u64; | |
103 | typedef UINT32 u32; | |
104 | typedef UINT16 u16; | |
105 | typedef UINT8 u8; | |
106 | typedef long long s64; | |
107 | typedef INT32 s32; | |
108 | typedef INT16 s16; | |
109 | typedef INT8 s8; | |
110 | #define WPA_TYPES_DEFINED | |
111 | #endif /* __vxworks */ | |
112 | ||
113 | #ifdef CONFIG_TI_COMPILER | |
114 | #ifdef _LLONG_AVAILABLE | |
115 | typedef unsigned long long u64; | |
116 | #else | |
117 | /* | |
118 | * TODO: 64-bit variable not available. Using long as a workaround to test the | |
119 | * build, but this will likely not work for all operations. | |
120 | */ | |
121 | typedef unsigned long u64; | |
122 | #endif | |
123 | typedef unsigned int u32; | |
124 | typedef unsigned short u16; | |
125 | typedef unsigned char u8; | |
126 | #define WPA_TYPES_DEFINED | |
127 | #endif /* CONFIG_TI_COMPILER */ | |
128 | ||
6fc6879b JM |
129 | #ifndef WPA_TYPES_DEFINED |
130 | #ifdef CONFIG_USE_INTTYPES_H | |
131 | #include <inttypes.h> | |
132 | #else | |
133 | #include <stdint.h> | |
134 | #endif | |
135 | typedef uint64_t u64; | |
136 | typedef uint32_t u32; | |
137 | typedef uint16_t u16; | |
138 | typedef uint8_t u8; | |
139 | typedef int64_t s64; | |
140 | typedef int32_t s32; | |
141 | typedef int16_t s16; | |
142 | typedef int8_t s8; | |
143 | #define WPA_TYPES_DEFINED | |
144 | #endif /* !WPA_TYPES_DEFINED */ | |
145 | ||
146 | ||
147 | /* Define platform specific byte swapping macros */ | |
148 | ||
149 | #if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS) | |
150 | ||
151 | static inline unsigned short wpa_swap_16(unsigned short v) | |
152 | { | |
153 | return ((v & 0xff) << 8) | (v >> 8); | |
154 | } | |
155 | ||
156 | static inline unsigned int wpa_swap_32(unsigned int v) | |
157 | { | |
158 | return ((v & 0xff) << 24) | ((v & 0xff00) << 8) | | |
159 | ((v & 0xff0000) >> 8) | (v >> 24); | |
160 | } | |
161 | ||
162 | #define le_to_host16(n) (n) | |
163 | #define host_to_le16(n) (n) | |
164 | #define be_to_host16(n) wpa_swap_16(n) | |
165 | #define host_to_be16(n) wpa_swap_16(n) | |
166 | #define le_to_host32(n) (n) | |
167 | #define be_to_host32(n) wpa_swap_32(n) | |
168 | #define host_to_be32(n) wpa_swap_32(n) | |
169 | ||
170 | #define WPA_BYTE_SWAP_DEFINED | |
171 | ||
172 | #endif /* __CYGWIN__ || CONFIG_NATIVE_WINDOWS */ | |
173 | ||
174 | ||
175 | #ifndef WPA_BYTE_SWAP_DEFINED | |
176 | ||
177 | #ifndef __BYTE_ORDER | |
178 | #ifndef __LITTLE_ENDIAN | |
179 | #ifndef __BIG_ENDIAN | |
180 | #define __LITTLE_ENDIAN 1234 | |
181 | #define __BIG_ENDIAN 4321 | |
182 | #if defined(sparc) | |
183 | #define __BYTE_ORDER __BIG_ENDIAN | |
184 | #endif | |
185 | #endif /* __BIG_ENDIAN */ | |
186 | #endif /* __LITTLE_ENDIAN */ | |
187 | #endif /* __BYTE_ORDER */ | |
188 | ||
189 | #if __BYTE_ORDER == __LITTLE_ENDIAN | |
190 | #define le_to_host16(n) ((__force u16) (le16) (n)) | |
191 | #define host_to_le16(n) ((__force le16) (u16) (n)) | |
192 | #define be_to_host16(n) bswap_16((__force u16) (be16) (n)) | |
193 | #define host_to_be16(n) ((__force be16) bswap_16((n))) | |
194 | #define le_to_host32(n) ((__force u32) (le32) (n)) | |
195 | #define host_to_le32(n) ((__force le32) (u32) (n)) | |
196 | #define be_to_host32(n) bswap_32((__force u32) (be32) (n)) | |
197 | #define host_to_be32(n) ((__force be32) bswap_32((n))) | |
198 | #define le_to_host64(n) ((__force u64) (le64) (n)) | |
199 | #define host_to_le64(n) ((__force le64) (u64) (n)) | |
200 | #define be_to_host64(n) bswap_64((__force u64) (be64) (n)) | |
201 | #define host_to_be64(n) ((__force be64) bswap_64((n))) | |
202 | #elif __BYTE_ORDER == __BIG_ENDIAN | |
203 | #define le_to_host16(n) bswap_16(n) | |
204 | #define host_to_le16(n) bswap_16(n) | |
205 | #define be_to_host16(n) (n) | |
206 | #define host_to_be16(n) (n) | |
207 | #define le_to_host32(n) bswap_32(n) | |
182b2e53 | 208 | #define host_to_le32(n) bswap_32(n) |
6fc6879b JM |
209 | #define be_to_host32(n) (n) |
210 | #define host_to_be32(n) (n) | |
211 | #define le_to_host64(n) bswap_64(n) | |
212 | #define host_to_le64(n) bswap_64(n) | |
213 | #define be_to_host64(n) (n) | |
214 | #define host_to_be64(n) (n) | |
215 | #ifndef WORDS_BIGENDIAN | |
216 | #define WORDS_BIGENDIAN | |
217 | #endif | |
218 | #else | |
219 | #error Could not determine CPU byte order | |
220 | #endif | |
221 | ||
222 | #define WPA_BYTE_SWAP_DEFINED | |
223 | #endif /* !WPA_BYTE_SWAP_DEFINED */ | |
224 | ||
225 | ||
226 | /* Macros for handling unaligned memory accesses */ | |
227 | ||
301ed630 JM |
228 | static inline u16 WPA_GET_BE16(const u8 *a) |
229 | { | |
230 | return (a[0] << 8) | a[1]; | |
231 | } | |
232 | ||
233 | static inline void WPA_PUT_BE16(u8 *a, u16 val) | |
234 | { | |
235 | a[0] = val >> 8; | |
236 | a[1] = val & 0xff; | |
237 | } | |
238 | ||
239 | static inline u16 WPA_GET_LE16(const u8 *a) | |
240 | { | |
241 | return (a[1] << 8) | a[0]; | |
242 | } | |
243 | ||
244 | static inline void WPA_PUT_LE16(u8 *a, u16 val) | |
245 | { | |
246 | a[1] = val >> 8; | |
247 | a[0] = val & 0xff; | |
248 | } | |
249 | ||
250 | static inline u32 WPA_GET_BE24(const u8 *a) | |
251 | { | |
252 | return (a[0] << 16) | (a[1] << 8) | a[2]; | |
253 | } | |
254 | ||
255 | static inline void WPA_PUT_BE24(u8 *a, u32 val) | |
256 | { | |
257 | a[0] = (val >> 16) & 0xff; | |
258 | a[1] = (val >> 8) & 0xff; | |
259 | a[2] = val & 0xff; | |
260 | } | |
261 | ||
262 | static inline u32 WPA_GET_BE32(const u8 *a) | |
263 | { | |
264 | return (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]; | |
265 | } | |
266 | ||
267 | static inline void WPA_PUT_BE32(u8 *a, u32 val) | |
268 | { | |
269 | a[0] = (val >> 24) & 0xff; | |
270 | a[1] = (val >> 16) & 0xff; | |
271 | a[2] = (val >> 8) & 0xff; | |
272 | a[3] = val & 0xff; | |
273 | } | |
274 | ||
275 | static inline u32 WPA_GET_LE32(const u8 *a) | |
276 | { | |
277 | return (a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0]; | |
278 | } | |
279 | ||
280 | static inline void WPA_PUT_LE32(u8 *a, u32 val) | |
281 | { | |
282 | a[3] = (val >> 24) & 0xff; | |
283 | a[2] = (val >> 16) & 0xff; | |
284 | a[1] = (val >> 8) & 0xff; | |
285 | a[0] = val & 0xff; | |
286 | } | |
287 | ||
288 | static inline u64 WPA_GET_BE64(const u8 *a) | |
289 | { | |
290 | return (((u64) a[0]) << 56) | (((u64) a[1]) << 48) | | |
291 | (((u64) a[2]) << 40) | (((u64) a[3]) << 32) | | |
292 | (((u64) a[4]) << 24) | (((u64) a[5]) << 16) | | |
293 | (((u64) a[6]) << 8) | ((u64) a[7]); | |
294 | } | |
295 | ||
296 | static inline void WPA_PUT_BE64(u8 *a, u64 val) | |
297 | { | |
298 | a[0] = val >> 56; | |
299 | a[1] = val >> 48; | |
300 | a[2] = val >> 40; | |
301 | a[3] = val >> 32; | |
302 | a[4] = val >> 24; | |
303 | a[5] = val >> 16; | |
304 | a[6] = val >> 8; | |
305 | a[7] = val & 0xff; | |
306 | } | |
307 | ||
308 | static inline u64 WPA_GET_LE64(const u8 *a) | |
309 | { | |
310 | return (((u64) a[7]) << 56) | (((u64) a[6]) << 48) | | |
311 | (((u64) a[5]) << 40) | (((u64) a[4]) << 32) | | |
312 | (((u64) a[3]) << 24) | (((u64) a[2]) << 16) | | |
313 | (((u64) a[1]) << 8) | ((u64) a[0]); | |
314 | } | |
315 | ||
316 | static inline void WPA_PUT_LE64(u8 *a, u64 val) | |
317 | { | |
318 | a[7] = val >> 56; | |
319 | a[6] = val >> 48; | |
320 | a[5] = val >> 40; | |
321 | a[4] = val >> 32; | |
322 | a[3] = val >> 24; | |
323 | a[2] = val >> 16; | |
324 | a[1] = val >> 8; | |
325 | a[0] = val & 0xff; | |
326 | } | |
6fc6879b JM |
327 | |
328 | ||
329 | #ifndef ETH_ALEN | |
330 | #define ETH_ALEN 6 | |
331 | #endif | |
d994a9b5 JM |
332 | #ifndef IFNAMSIZ |
333 | #define IFNAMSIZ 16 | |
334 | #endif | |
335 | #ifndef ETH_P_ALL | |
336 | #define ETH_P_ALL 0x0003 | |
337 | #endif | |
281ff0aa GP |
338 | #ifndef ETH_P_80211_ENCAP |
339 | #define ETH_P_80211_ENCAP 0x890d /* TDLS comes under this category */ | |
340 | #endif | |
d994a9b5 JM |
341 | #ifndef ETH_P_PAE |
342 | #define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ | |
343 | #endif /* ETH_P_PAE */ | |
344 | #ifndef ETH_P_EAPOL | |
345 | #define ETH_P_EAPOL ETH_P_PAE | |
346 | #endif /* ETH_P_EAPOL */ | |
347 | #ifndef ETH_P_RSN_PREAUTH | |
348 | #define ETH_P_RSN_PREAUTH 0x88c7 | |
349 | #endif /* ETH_P_RSN_PREAUTH */ | |
350 | #ifndef ETH_P_RRB | |
351 | #define ETH_P_RRB 0x890D | |
352 | #endif /* ETH_P_RRB */ | |
6fc6879b JM |
353 | |
354 | ||
355 | #ifdef __GNUC__ | |
356 | #define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b)))) | |
357 | #define STRUCT_PACKED __attribute__ ((packed)) | |
358 | #else | |
359 | #define PRINTF_FORMAT(a,b) | |
360 | #define STRUCT_PACKED | |
361 | #endif | |
362 | ||
363 | ||
364 | #ifdef CONFIG_ANSI_C_EXTRA | |
365 | ||
366 | #if !defined(_MSC_VER) || _MSC_VER < 1400 | |
367 | /* snprintf - used in number of places; sprintf() is _not_ a good replacement | |
368 | * due to possible buffer overflow; see, e.g., | |
369 | * http://www.ijs.si/software/snprintf/ for portable implementation of | |
370 | * snprintf. */ | |
371 | int snprintf(char *str, size_t size, const char *format, ...); | |
372 | ||
373 | /* vsnprintf - only used for wpa_msg() in wpa_supplicant.c */ | |
374 | int vsnprintf(char *str, size_t size, const char *format, va_list ap); | |
375 | #endif /* !defined(_MSC_VER) || _MSC_VER < 1400 */ | |
376 | ||
377 | /* getopt - only used in main.c */ | |
378 | int getopt(int argc, char *const argv[], const char *optstring); | |
379 | extern char *optarg; | |
380 | extern int optind; | |
381 | ||
382 | #ifndef CONFIG_NO_SOCKLEN_T_TYPEDEF | |
383 | #ifndef __socklen_t_defined | |
384 | typedef int socklen_t; | |
385 | #endif | |
386 | #endif | |
387 | ||
388 | /* inline - define as __inline or just define it to be empty, if needed */ | |
389 | #ifdef CONFIG_NO_INLINE | |
390 | #define inline | |
391 | #else | |
392 | #define inline __inline | |
393 | #endif | |
394 | ||
395 | #ifndef __func__ | |
396 | #define __func__ "__func__ not defined" | |
397 | #endif | |
398 | ||
399 | #ifndef bswap_16 | |
400 | #define bswap_16(a) ((((u16) (a) << 8) & 0xff00) | (((u16) (a) >> 8) & 0xff)) | |
401 | #endif | |
402 | ||
403 | #ifndef bswap_32 | |
404 | #define bswap_32(a) ((((u32) (a) << 24) & 0xff000000) | \ | |
405 | (((u32) (a) << 8) & 0xff0000) | \ | |
406 | (((u32) (a) >> 8) & 0xff00) | \ | |
407 | (((u32) (a) >> 24) & 0xff)) | |
408 | #endif | |
409 | ||
410 | #ifndef MSG_DONTWAIT | |
411 | #define MSG_DONTWAIT 0 | |
412 | #endif | |
413 | ||
414 | #ifdef _WIN32_WCE | |
415 | void perror(const char *s); | |
416 | #endif /* _WIN32_WCE */ | |
417 | ||
418 | #endif /* CONFIG_ANSI_C_EXTRA */ | |
419 | ||
420 | #ifndef MAC2STR | |
421 | #define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] | |
422 | #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" | |
0c11c633 JB |
423 | |
424 | /* | |
425 | * Compact form for string representation of MAC address | |
426 | * To be used, e.g., for constructing dbus paths for P2P Devices | |
427 | */ | |
428 | #define COMPACT_MACSTR "%02x%02x%02x%02x%02x%02x" | |
6fc6879b JM |
429 | #endif |
430 | ||
431 | #ifndef BIT | |
432 | #define BIT(x) (1 << (x)) | |
433 | #endif | |
434 | ||
435 | /* | |
436 | * Definitions for sparse validation | |
437 | * (http://kernel.org/pub/linux/kernel/people/josh/sparse/) | |
438 | */ | |
439 | #ifdef __CHECKER__ | |
440 | #define __force __attribute__((force)) | |
441 | #define __bitwise __attribute__((bitwise)) | |
442 | #else | |
443 | #define __force | |
444 | #define __bitwise | |
445 | #endif | |
446 | ||
447 | typedef u16 __bitwise be16; | |
448 | typedef u16 __bitwise le16; | |
449 | typedef u32 __bitwise be32; | |
450 | typedef u32 __bitwise le32; | |
451 | typedef u64 __bitwise be64; | |
452 | typedef u64 __bitwise le64; | |
453 | ||
454 | #ifndef __must_check | |
455 | #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) | |
456 | #define __must_check __attribute__((__warn_unused_result__)) | |
457 | #else | |
458 | #define __must_check | |
459 | #endif /* __GNUC__ */ | |
460 | #endif /* __must_check */ | |
1450e1e3 JM |
461 | |
462 | #ifndef __maybe_unused | |
463 | #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) | |
464 | #define __maybe_unused __attribute__((unused)) | |
465 | #else | |
466 | #define __maybe_unused | |
467 | #endif /* __GNUC__ */ | |
468 | #endif /* __must_check */ | |
6fc6879b JM |
469 | |
470 | int hwaddr_aton(const char *txt, u8 *addr); | |
0c11c633 | 471 | int hwaddr_compact_aton(const char *txt, u8 *addr); |
448a0a19 | 472 | int hwaddr_aton2(const char *txt, u8 *addr); |
b3a6d9d4 | 473 | int hex2byte(const char *hex); |
6fc6879b JM |
474 | int hexstr2bin(const char *hex, u8 *buf, size_t len); |
475 | void inc_byte_array(u8 *counter, size_t len); | |
476 | void wpa_get_ntp_timestamp(u8 *buf); | |
477 | int wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len); | |
478 | int wpa_snprintf_hex_uppercase(char *buf, size_t buf_size, const u8 *data, | |
479 | size_t len); | |
480 | ||
481 | #ifdef CONFIG_NATIVE_WINDOWS | |
482 | void wpa_unicode2ascii_inplace(TCHAR *str); | |
483 | TCHAR * wpa_strdup_tchar(const char *str); | |
484 | #else /* CONFIG_NATIVE_WINDOWS */ | |
485 | #define wpa_unicode2ascii_inplace(s) do { } while (0) | |
486 | #define wpa_strdup_tchar(s) strdup((s)) | |
487 | #endif /* CONFIG_NATIVE_WINDOWS */ | |
488 | ||
0d7773b6 JM |
489 | void printf_encode(char *txt, size_t maxlen, const u8 *data, size_t len); |
490 | size_t printf_decode(u8 *buf, size_t maxlen, const char *str); | |
491 | ||
6fc6879b JM |
492 | const char * wpa_ssid_txt(const u8 *ssid, size_t ssid_len); |
493 | ||
b87d70c8 | 494 | char * wpa_config_parse_string(const char *value, size_t *len); |
e122bb70 | 495 | int is_hex(const u8 *data, size_t len); |
c781eb84 | 496 | int find_first_bit(u32 value); |
3489cfb0 JM |
497 | size_t merge_byte_arrays(u8 *res, size_t res_len, |
498 | const u8 *src1, size_t src1_len, | |
499 | const u8 *src2, size_t src2_len); | |
5e24dc8a | 500 | char * dup_binstr(const void *src, size_t len); |
b87d70c8 | 501 | |
a8e16edc JM |
502 | static inline int is_zero_ether_addr(const u8 *a) |
503 | { | |
504 | return !(a[0] | a[1] | a[2] | a[3] | a[4] | a[5]); | |
505 | } | |
6fc6879b | 506 | |
7d23e971 JM |
507 | static inline int is_broadcast_ether_addr(const u8 *a) |
508 | { | |
509 | return (a[0] & a[1] & a[2] & a[3] & a[4] & a[5]) == 0xff; | |
510 | } | |
511 | ||
0382097e JM |
512 | #define broadcast_ether_addr (const u8 *) "\xff\xff\xff\xff\xff\xff" |
513 | ||
6fc6879b JM |
514 | #include "wpa_debug.h" |
515 | ||
0ae7b086 | 516 | |
af8a827b JM |
517 | struct wpa_freq_range_list { |
518 | struct wpa_freq_range { | |
519 | unsigned int min; | |
520 | unsigned int max; | |
521 | } *range; | |
522 | unsigned int num; | |
523 | }; | |
524 | ||
525 | int freq_range_list_parse(struct wpa_freq_range_list *res, const char *value); | |
526 | int freq_range_list_includes(const struct wpa_freq_range_list *list, | |
527 | unsigned int freq); | |
528 | char * freq_range_list_str(const struct wpa_freq_range_list *list); | |
529 | ||
98eda9c2 JM |
530 | int int_array_len(const int *a); |
531 | void int_array_concat(int **res, const int *a); | |
532 | void int_array_sort_unique(int *a); | |
533 | void int_array_add_unique(int **res, int a); | |
534 | ||
39044a70 JM |
535 | #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) |
536 | ||
af8a827b | 537 | |
19c48da0 JM |
538 | void str_clear_free(char *str); |
539 | void bin_clear_free(void *bin, size_t len); | |
540 | ||
4d8fb637 JM |
541 | int random_mac_addr(u8 *addr); |
542 | ||
19c48da0 | 543 | |
0ae7b086 JM |
544 | /* |
545 | * gcc 4.4 ends up generating strict-aliasing warnings about some very common | |
546 | * networking socket uses that do not really result in a real problem and | |
547 | * cannot be easily avoided with union-based type-punning due to struct | |
548 | * definitions including another struct in system header files. To avoid having | |
549 | * to fully disable strict-aliasing warnings, provide a mechanism to hide the | |
550 | * typecast from aliasing for now. A cleaner solution will hopefully be found | |
551 | * in the future to handle these cases. | |
552 | */ | |
553 | void * __hide_aliasing_typecast(void *foo); | |
554 | #define aliasing_hide_typecast(a,t) (t *) __hide_aliasing_typecast((a)) | |
555 | ||
c0647147 JM |
556 | #ifdef CONFIG_VALGRIND |
557 | #include <valgrind/memcheck.h> | |
558 | #define WPA_MEM_DEFINED(ptr, len) VALGRIND_MAKE_MEM_DEFINED((ptr), (len)) | |
559 | #else /* CONFIG_VALGRIND */ | |
560 | #define WPA_MEM_DEFINED(ptr, len) do { } while (0) | |
561 | #endif /* CONFIG_VALGRIND */ | |
562 | ||
6fc6879b | 563 | #endif /* COMMON_H */ |