doc: new fedora/rhel maintainer
[netsniff-ng.git] / src / built_in.h
blob3cbbfa36be4c879a112683ff608d39cc5c52db30
1 /*
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.
6 */
8 #ifndef BUILT_IN_H
9 #define BUILT_IN_H
11 #include <linux/if_packet.h>
12 #include <assert.h>
13 #include <endian.h>
14 #include <byteswap.h>
15 #include <stdint.h>
17 typedef uint64_t u64;
18 typedef uint32_t u32;
19 typedef uint16_t u16;
20 typedef uint8_t u8;
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__) || \
35 defined(_ARCH_PPC64)
36 # define CO_IN_CACHE_SHIFT 8
37 #elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) || \
38 defined(_ARCH_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__)
51 # if defined(_ABIO32)
52 # define CO_IN_CACHE_SHIFT 5
53 # elif defined(_ABIN32)
54 # define CO_IN_CACHE_SHIFT 5
55 # else
56 # define CO_IN_CACHE_SHIFT 6
57 # endif
58 #else
59 # define CO_IN_CACHE_SHIFT 5
60 #endif
62 #ifndef CO_CACHE_LINE_SIZE
63 # define CO_CACHE_LINE_SIZE (1 << CO_IN_CACHE_SHIFT)
64 #endif
66 #ifndef __aligned_16
67 # define __aligned_16 __attribute__((aligned(16)))
68 #endif
70 #ifndef __cacheline_aligned
71 # define __cacheline_aligned __attribute__((aligned(CO_CACHE_LINE_SIZE)))
72 #endif
74 #ifndef __aligned_tpacket
75 # define __aligned_tpacket __attribute__((aligned(TPACKET_ALIGNMENT)))
76 #endif
78 #ifndef __packed
79 # define __packed __attribute__((packed))
80 #endif
82 #ifndef round_up
83 # define round_up(x, alignment) (((x) + (alignment) - 1) & ~((alignment) - 1))
84 #endif
86 #ifndef round_up_cacheline
87 # define round_up_cacheline(x) round_up((x), CO_CACHE_LINE_SIZE)
88 #endif
90 #ifndef likely
91 # define likely(x) __builtin_expect(!!(x), 1)
92 #endif
94 #ifndef unlikely
95 # define unlikely(x) __builtin_expect(!!(x), 0)
96 #endif
98 #ifndef prefetch_rd_hi
99 # define prefetch_rd_hi(addr) __builtin_prefetch(addr, 0, 3)
100 #endif
102 #ifndef prefetch_rd_lo
103 # define prefetch_rd_lo(addr) __builtin_prefetch(addr, 0, 0)
104 #endif
106 #ifndef prefetch_wr_hi
107 # define prefetch_wr_hi(addr) __builtin_prefetch(addr, 1, 3)
108 #endif
110 #ifndef prefetch_wr_lo
111 # define prefetch_wr_lo(addr) __builtin_prefetch(addr, 1, 0)
112 #endif
114 #ifndef fmemset
115 # define fmemset __builtin_memset
116 #endif
118 #ifndef fmemcpy
119 # define fmemcpy __builtin_memcpy
120 #endif
122 #ifndef atomic_cmp_swp
123 # define atomic_cmp_swp __sync_val_compare_and_swap
124 #endif
126 #ifndef __deprecated
127 # define __deprecated /* unimplemented */
128 #endif
130 #ifndef EXPORT_SYMBOL
131 # define EXPORT_SYMBOL(x) /* empty, just for readability */
132 #endif
134 #ifndef unreachable
135 # define unreachable() do { } while (1)
136 #endif
138 #ifndef __read_mostly
139 # define __read_mostly __attribute__((__section__(".data.read_mostly")))
140 #endif
142 #ifndef __unused
143 # define __unused __attribute__ ((__unused__))
144 #endif
146 #ifndef noinline
147 # define noinline __attribute__((noinline))
148 #endif
150 #ifndef __always_inline
151 # define __always_inline inline
152 #endif
154 #ifndef __hidden
155 # define __hidden __attribute__((visibility("hidden")))
156 #endif
158 #ifndef __pure
159 # define __pure __attribute__ ((pure))
160 #endif
162 #ifndef force_cast
163 # define force_cast(type, arg) ((type) (arg))
164 #endif
166 #ifndef access_once
167 # define access_once(x) (*(volatile typeof(x) *) &(x))
168 #endif
170 #ifndef max
171 # define max(a, b) \
172 ({ \
173 typeof (a) _a = (a); \
174 typeof (b) _b = (b); \
175 _a > _b ? _a : _b; \
177 #endif /* max */
179 #ifndef min
180 # define min(a, b) \
181 ({ \
182 typeof (a) _a = (a); \
183 typeof (b) _b = (b); \
184 _a < _b ? _a : _b; \
186 #endif /* min */
188 #ifndef ispow2
189 # define ispow2(x) ({ !!((x) && !((x) & ((x) - 1))); })
190 #endif
192 #ifndef offsetof
193 # define offsetof(type, member) ((size_t) &((type *) 0)->member)
194 #endif
196 #ifndef container_of
197 # define container_of(ptr, type, member) \
198 ({ \
199 const typeof(((type *) 0)->member) * __mptr = (ptr); \
200 (type *) ((char *) __mptr - offsetof(type, member)); \
202 #endif
204 #ifndef array_size
205 # define array_size(x) (sizeof(x) / sizeof((x)[0]) + __must_be_array(x))
206 #endif
208 #ifndef __must_be_array
209 # define __must_be_array(x) \
210 build_bug_on_zero(__builtin_types_compatible_p(typeof(x), \
211 typeof(&x[0])))
212 #endif
214 #ifndef build_bug_on_zero
215 # define build_bug_on_zero(e) (sizeof(char[1 - 2 * !!(e)]) - 1)
216 #endif
218 #ifndef bug_on
219 # define bug_on(cond) assert(!(cond))
220 #endif
222 #ifndef bug
223 # define bug assert(0)
224 #endif
226 #define PAGE_SIZE (getpagesize())
227 #define PAGE_MASK (~(PAGE_SIZE - 1))
228 #define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK)
230 #if __BYTE_ORDER == __LITTLE_ENDIAN
231 static inline uint64_t htonll(uint64_t x)
233 return bswap_64(x);
236 static inline uint64_t ntohll(uint64_t x)
238 return bswap_64(x);
240 #elif __BYTE_ORDER == __BIG_ENDIAN
241 static inline uint64_t htonll(uint64_t x)
243 return x;
246 static inline uint64_t ntohll(uint64_t x)
248 return x;
250 #else
251 # error __BYTE_ORDER is neither __LITTLE_ENDIAN nor __BIG_ENDIAN
252 #endif
254 #if __BYTE_ORDER == __LITTLE_ENDIAN
255 static inline u16 cpu_to_be16(u16 val)
257 return bswap_16(val);
260 static inline u32 cpu_to_be32(u32 val)
262 return bswap_32(val);
265 static inline u64 cpu_to_be64(u64 val)
267 return bswap_64(val);
270 static inline u16 cpu_to_le16(u16 val)
272 return val;
275 static inline u32 cpu_to_le32(u32 val)
277 return val;
280 static inline u64 cpu_to_le64(u64 val)
282 return val;
284 #elif __BYTE_ORDER == __BIG_ENDIAN
285 static inline u16 cpu_to_be16(u16 val)
287 return val;
290 static inline u32 cpu_to_be32(u32 val)
292 return val;
295 static inline u64 cpu_to_be64(u64 val)
297 return val;
300 static inline u16 cpu_to_le16(u16 val)
302 return bswap_16(val);
305 static inline u32 cpu_to_le32(u32 val)
307 return bswap_32(val);
310 static inline u64 cpu_to_le64(u64 val)
312 return bswap_64(val);
314 #else
315 # error __BYTE_ORDER is neither __LITTLE_ENDIAN nor __BIG_ENDIAN
316 #endif
318 #define le64_to_cpu cpu_to_le64
319 #define le32_to_cpu cpu_to_le32
320 #define le16_to_cpu cpu_to_le16
321 #define be64_to_cpu cpu_to_be64
322 #define be32_to_cpu cpu_to_be32
323 #define be16_to_cpu cpu_to_be16
325 #undef memset
326 #undef memcpy
328 #define memset fmemset
329 #define memcpy fmemcpy
331 #endif /* BUILT_IN_H */