2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2009-2012 Daniel Borkmann.
5 * Subject to the GPL, version 2.
11 #include <linux/if_packet.h>
22 /* /sys/devices/system/cpu/cpuX/cache/indexX/coherency_line_size */
24 #if defined(__amd64__) || defined(__x86_64__) || defined(__AMD64__) || \
25 defined(_M_X64) || defined(__amd64)
26 # define CO_IN_CACHE_SHIFT 7
27 #elif defined(__i386__) || defined(__x86__) || defined(__X86__) || \
28 defined(_M_IX86) || defined(__i386)
29 # define CO_IN_CACHE_SHIFT 7
30 #elif defined(__ia64__) || defined(__IA64__) || defined(__M_IA64)
31 # define CO_IN_CACHE_SHIFT 6
32 #elif defined(__SPU__)
33 # define CO_IN_CACHE_SHIFT 7
34 #elif defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) || \
36 # define CO_IN_CACHE_SHIFT 8
37 #elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) || \
39 # define CO_IN_CACHE_SHIFT 7
40 #elif defined(__sparcv9__) || defined(__sparcv9)
41 # define CO_IN_CACHE_SHIFT 6
42 #elif defined(__sparc_v8__)
43 # define CO_IN_CACHE_SHIFT 5
44 #elif defined(__sparc__) || defined(__sparc)
45 # define CO_IN_CACHE_SHIFT 5
46 #elif defined(__ARM_EABI__)
47 # define CO_IN_CACHE_SHIFT 5
48 #elif defined(__arm__)
49 # define CO_IN_CACHE_SHIFT 5
50 #elif defined(__mips__) || defined(__mips) || defined(__MIPS__)
52 # define CO_IN_CACHE_SHIFT 5
53 # elif defined(_ABIN32)
54 # define CO_IN_CACHE_SHIFT 5
56 # define CO_IN_CACHE_SHIFT 6
59 # define CO_IN_CACHE_SHIFT 5
62 #ifndef CO_CACHE_LINE_SIZE
63 # define CO_CACHE_LINE_SIZE (1 << CO_IN_CACHE_SHIFT)
67 # define __aligned_16 __attribute__((aligned(16)))
70 #ifndef __cacheline_aligned
71 # define __cacheline_aligned __attribute__((aligned(CO_CACHE_LINE_SIZE)))
74 #ifndef __aligned_tpacket
75 # define __aligned_tpacket __attribute__((aligned(TPACKET_ALIGNMENT)))
78 #ifndef __check_format_printf
79 # define __check_format_printf(pos_fmtstr, pos_fmtargs) \
80 __attribute__ ((format (printf, (pos_fmtstr), (pos_fmtargs))))
84 # define __packed __attribute__((packed))
88 # define round_up(x, alignment) (((x) + (alignment) - 1) & ~((alignment) - 1))
91 #ifndef round_up_cacheline
92 # define round_up_cacheline(x) round_up((x), CO_CACHE_LINE_SIZE)
96 # define likely(x) __builtin_expect(!!(x), 1)
100 # define unlikely(x) __builtin_expect(!!(x), 0)
104 # define constant(x) __builtin_constant_p(x)
108 # define fmemset __builtin_memset
112 # define fmemcpy __builtin_memcpy
115 #ifndef atomic_cmp_swp
116 # define atomic_cmp_swp __sync_val_compare_and_swap
120 # define __deprecated /* unimplemented */
123 #ifndef EXPORT_SYMBOL
124 # define EXPORT_SYMBOL(x) /* empty, just for readability */
128 # define unreachable() do { } while (1)
132 # define __unused __attribute__ ((__unused__))
136 # define noinline __attribute__((noinline))
139 #ifndef __always_inline
140 # define __always_inline inline
144 # define __hidden __attribute__((visibility("hidden")))
148 # define __pure __attribute__ ((pure))
152 # define force_cast(type, arg) ((type) (arg))
156 # define access_once(x) (*(volatile typeof(x) *) &(x))
162 typeof (a) _a = (a); \
163 typeof (b) _b = (b); \
171 typeof (a) _a = (a); \
172 typeof (b) _b = (b); \
178 # define ispow2(x) ({ !!((x) && !((x) & ((x) - 1))); })
182 # define offsetof(type, member) ((size_t) &((type *) 0)->member)
186 # define container_of(ptr, type, member) \
188 const typeof(((type *) 0)->member) * __mptr = (ptr); \
189 (type *) ((char *) __mptr - offsetof(type, member)); \
194 # define array_size(x) (sizeof(x) / sizeof((x)[0]) + __must_be_array(x))
197 #ifndef __must_be_array
198 # define __must_be_array(x) \
199 build_bug_on_zero(__builtin_types_compatible_p(typeof(x), \
203 #ifndef build_bug_on_zero
204 # define build_bug_on_zero(e) (sizeof(char[1 - 2 * !!(e)]) - 1)
208 # define bug_on(cond) assert(!(cond))
212 # define bug assert(0)
215 #define PAGE_SIZE (getpagesize())
216 #define PAGE_MASK (~(PAGE_SIZE - 1))
217 #define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK)
219 #if __BYTE_ORDER == __LITTLE_ENDIAN
220 static inline uint64_t htonll(uint64_t x
)
225 static inline uint64_t ntohll(uint64_t x
)
229 #elif __BYTE_ORDER == __BIG_ENDIAN
230 static inline uint64_t htonll(uint64_t x
)
235 static inline uint64_t ntohll(uint64_t x
)
240 # error __BYTE_ORDER is neither __LITTLE_ENDIAN nor __BIG_ENDIAN
243 #if __BYTE_ORDER == __LITTLE_ENDIAN
244 static inline u16
cpu_to_be16(u16 val
)
246 return bswap_16(val
);
249 static inline u32
cpu_to_be32(u32 val
)
251 return bswap_32(val
);
254 static inline u64
cpu_to_be64(u64 val
)
256 return bswap_64(val
);
259 static inline u16
cpu_to_le16(u16 val
)
264 static inline u32
cpu_to_le32(u32 val
)
269 static inline u64
cpu_to_le64(u64 val
)
273 #elif __BYTE_ORDER == __BIG_ENDIAN
274 static inline u16
cpu_to_be16(u16 val
)
279 static inline u32
cpu_to_be32(u32 val
)
284 static inline u64
cpu_to_be64(u64 val
)
289 static inline u16
cpu_to_le16(u16 val
)
291 return bswap_16(val
);
294 static inline u32
cpu_to_le32(u32 val
)
296 return bswap_32(val
);
299 static inline u64
cpu_to_le64(u64 val
)
301 return bswap_64(val
);
304 # error __BYTE_ORDER is neither __LITTLE_ENDIAN nor __BIG_ENDIAN
307 #define le64_to_cpu cpu_to_le64
308 #define le32_to_cpu cpu_to_le32
309 #define le16_to_cpu cpu_to_le16
310 #define be64_to_cpu cpu_to_be64
311 #define be32_to_cpu cpu_to_be32
312 #define be16_to_cpu cpu_to_be16
317 #define memset fmemset
318 #define memcpy fmemcpy
320 #endif /* BUILT_IN_H */