|
Packit |
c5a612 |
#ifndef NFTABLES_UTILS_H
|
|
Packit |
c5a612 |
#define NFTABLES_UTILS_H
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#include <asm/byteorder.h>
|
|
Packit |
c5a612 |
#include <stdint.h>
|
|
Packit |
c5a612 |
#include <stdbool.h>
|
|
Packit |
c5a612 |
#include <stdarg.h>
|
|
Packit |
c5a612 |
#include <stdio.h>
|
|
Packit |
c5a612 |
#include <unistd.h>
|
|
Packit |
c5a612 |
#include <assert.h>
|
|
Packit |
c5a612 |
#include <list.h>
|
|
Packit |
c5a612 |
#include <gmputil.h>
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#include "config.h"
|
|
Packit |
c5a612 |
#ifdef HAVE_VISIBILITY_HIDDEN
|
|
Packit |
c5a612 |
# define __visible __attribute__((visibility("default")))
|
|
Packit |
c5a612 |
# define EXPORT_SYMBOL(x) typeof(x) (x) __visible;
|
|
Packit |
c5a612 |
#else
|
|
Packit |
c5a612 |
# define EXPORT_SYMBOL
|
|
Packit |
c5a612 |
#endif
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define BITS_PER_BYTE 8
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define pr_debug(fmt, arg...) printf(fmt, ##arg)
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#if defined(HAVE_LIBGMP)
|
|
Packit |
c5a612 |
#define pr_gmp_debug(fmt, arg...) gmp_printf(fmt, ##arg)
|
|
Packit |
c5a612 |
#else
|
|
Packit |
c5a612 |
#define pr_gmp_debug(fmt, arg...) ({ if (false) {}; 0; })
|
|
Packit |
c5a612 |
#endif
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define __fmtstring(x, y) __attribute__((format(printf, x, y)))
|
|
Packit |
c5a612 |
#if 0
|
|
Packit |
c5a612 |
#define __gmp_fmtstring(x, y) __fmtstring(x, y)
|
|
Packit |
c5a612 |
#else
|
|
Packit |
c5a612 |
#define __gmp_fmtstring(x, y)
|
|
Packit |
c5a612 |
#endif
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define __must_check __attribute__((warn_unused_result))
|
|
Packit |
c5a612 |
#define __noreturn __attribute__((__noreturn__))
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define BUG(fmt, arg...) ({ fprintf(stderr, "BUG: " fmt, ##arg); assert(0); })
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
|
|
Packit |
c5a612 |
#define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1)
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define __must_be_array(a) \
|
|
Packit |
c5a612 |
BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define container_of(ptr, type, member) ({ \
|
|
Packit |
c5a612 |
typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
|
Packit |
c5a612 |
(type *)( (void *)__mptr - offsetof(type,member) );})
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
/**
|
|
Packit |
c5a612 |
* Return a pointer to a constant variable of a size smaller than the variable.
|
|
Packit |
c5a612 |
*/
|
|
Packit |
c5a612 |
#ifdef __LITTLE_ENDIAN_BITFIELD
|
|
Packit |
c5a612 |
#define constant_data_ptr(val, len) \
|
|
Packit |
c5a612 |
((void *)&(val))
|
|
Packit |
c5a612 |
#elif defined(__BIG_ENDIAN_BITFIELD)
|
|
Packit |
c5a612 |
#define constant_data_ptr(val, len) \
|
|
Packit |
c5a612 |
((void *)&(val) + sizeof(val) - div_round_up(len, BITS_PER_BYTE))
|
|
Packit |
c5a612 |
#else
|
|
Packit |
c5a612 |
#error "byteorder undefined"
|
|
Packit |
c5a612 |
#endif
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define field_sizeof(t, f) (sizeof(((t *)NULL)->f))
|
|
Packit |
c5a612 |
#define array_size(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
|
|
Packit |
c5a612 |
#define div_round_up(n, d) (((n) + (d) - 1) / (d))
|
|
Packit |
c5a612 |
#define round_up(n, b) (div_round_up(n, b) * b)
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define min(_x, _y) ({ \
|
|
Packit |
c5a612 |
_x < _y ? _x : _y; })
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define max(_x, _y) ({ \
|
|
Packit |
c5a612 |
_x > _y ? _x : _y; })
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define SNPRINTF_BUFFER_SIZE(ret, size, len, offset) \
|
|
Packit |
c5a612 |
if (ret < 0) \
|
|
Packit |
c5a612 |
abort(); \
|
|
Packit |
c5a612 |
offset += ret; \
|
|
Packit |
c5a612 |
assert(ret < len); \
|
|
Packit |
c5a612 |
if (ret > len) \
|
|
Packit |
c5a612 |
ret = len; \
|
|
Packit |
c5a612 |
size += ret; \
|
|
Packit |
c5a612 |
len -= ret;
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define MSEC_PER_SEC 1000L
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
/**
|
|
Packit |
c5a612 |
* fls - find last (most-significant) bit set
|
|
Packit |
c5a612 |
* @x: the word to search
|
|
Packit |
c5a612 |
*
|
|
Packit |
c5a612 |
* This is defined the same way as ffs.
|
|
Packit |
c5a612 |
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
|
|
Packit |
c5a612 |
*/
|
|
Packit |
c5a612 |
static inline int fls(int x)
|
|
Packit |
c5a612 |
{
|
|
Packit |
c5a612 |
int r = 32;
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
if (!x)
|
|
Packit |
c5a612 |
return 0;
|
|
Packit |
c5a612 |
if (!(x & 0xffff0000u)) {
|
|
Packit |
c5a612 |
x <<= 16;
|
|
Packit |
c5a612 |
r -= 16;
|
|
Packit |
c5a612 |
}
|
|
Packit |
c5a612 |
if (!(x & 0xff000000u)) {
|
|
Packit |
c5a612 |
x <<= 8;
|
|
Packit |
c5a612 |
r -= 8;
|
|
Packit |
c5a612 |
}
|
|
Packit |
c5a612 |
if (!(x & 0xf0000000u)) {
|
|
Packit |
c5a612 |
x <<= 4;
|
|
Packit |
c5a612 |
r -= 4;
|
|
Packit |
c5a612 |
}
|
|
Packit |
c5a612 |
if (!(x & 0xc0000000u)) {
|
|
Packit |
c5a612 |
x <<= 2;
|
|
Packit |
c5a612 |
r -= 2;
|
|
Packit |
c5a612 |
}
|
|
Packit |
c5a612 |
if (!(x & 0x80000000u)) {
|
|
Packit |
c5a612 |
x <<= 1;
|
|
Packit |
c5a612 |
r -= 1;
|
|
Packit |
c5a612 |
}
|
|
Packit |
c5a612 |
return r;
|
|
Packit |
c5a612 |
}
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
extern void __memory_allocation_error(const char *filename, uint32_t line) __noreturn;
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#define memory_allocation_error() \
|
|
Packit |
c5a612 |
__memory_allocation_error(__FILE__, __LINE__);
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
extern void xfree(const void *ptr);
|
|
Packit |
c5a612 |
extern void *xmalloc(size_t size);
|
|
Packit |
c5a612 |
extern void *xmalloc_array(size_t nmemb, size_t size);
|
|
Packit |
c5a612 |
extern void *xrealloc(void *ptr, size_t size);
|
|
Packit |
c5a612 |
extern void *xzalloc(size_t size);
|
|
Packit |
c5a612 |
extern char *xstrdup(const char *s);
|
|
Packit |
c5a612 |
extern void xstrunescape(const char *in, char *out);
|
|
Packit |
c5a612 |
|
|
Packit |
c5a612 |
#endif /* NFTABLES_UTILS_H */
|