]> git.proxmox.com Git - mirror_ovs.git/blame - lib/util.h
ovsdb-data: Add support for integer ranges in database commands
[mirror_ovs.git] / lib / util.h
CommitLineData
064af421 1/*
b54d69df 2 * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
064af421 3 *
a14bc59f
BP
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
064af421 7 *
a14bc59f
BP
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
064af421
BP
15 */
16
17#ifndef UTIL_H
18#define UTIL_H 1
19
b2fc6a74 20#include <arpa/inet.h>
437d0d22 21#include <inttypes.h>
a656cb77 22#include <limits.h>
91883334 23#include <stdarg.h>
064af421 24#include <stdio.h>
ccc09689 25#include <stdlib.h>
064af421
BP
26#include <string.h>
27#include "compiler.h"
ee89ea7b 28#include "util.h"
b0248b2a 29#include "openvswitch/util.h"
064af421 30
91e12f0d 31extern char *program_name;
064af421 32
878f1972
FL
33#define __ARRAY_SIZE_NOCHECK(ARRAY) (sizeof(ARRAY) / sizeof((ARRAY)[0]))
34#ifdef __GNUC__
35/* return 0 for array types, 1 otherwise */
36#define __ARRAY_CHECK(ARRAY) \
37 !__builtin_types_compatible_p(typeof(ARRAY), typeof(&ARRAY[0]))
38
39/* compile-time fail if not array */
40#define __ARRAY_FAIL(ARRAY) (sizeof(char[-2*!__ARRAY_CHECK(ARRAY)]))
41#define __ARRAY_SIZE(ARRAY) \
42 __builtin_choose_expr(__ARRAY_CHECK(ARRAY), \
43 __ARRAY_SIZE_NOCHECK(ARRAY), __ARRAY_FAIL(ARRAY))
44#else
45#define __ARRAY_SIZE(ARRAY) __ARRAY_SIZE_NOCHECK(ARRAY)
46#endif
47
e93ab553 48
e2051008
BP
49/* This system's cache line size, in bytes.
50 * Being wrong hurts performance but not correctness. */
51#define CACHE_LINE_SIZE 64
52BUILD_ASSERT_DECL(IS_POW2(CACHE_LINE_SIZE));
53
124f09c9
JR
54static inline void
55ovs_prefetch_range(const void *start, size_t size)
56{
57 const char *addr = (const char *)start;
58 size_t ofs;
59
60 for (ofs = 0; ofs < size; ofs += CACHE_LINE_SIZE) {
61 OVS_PREFETCH(addr + ofs);
62 }
63}
64
064af421
BP
65#ifndef MIN
66#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
67#endif
68
69#ifndef MAX
70#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
71#endif
72
a489b168
DDP
73/* Comparisons for ints with modular arithmetic */
74#define INT_MOD_LT(a,b) ((int) ((a)-(b)) < 0)
75#define INT_MOD_LEQ(a,b) ((int) ((a)-(b)) <= 0)
76#define INT_MOD_GT(a,b) ((int) ((a)-(b)) > 0)
77#define INT_MOD_GEQ(a,b) ((int) ((a)-(b)) >= 0)
78
79#define INT_MOD_MIN(a, b) ((INT_MOD_LT(a, b)) ? (a) : (b))
80#define INT_MOD_MAX(a, b) ((INT_MOD_GT(a, b)) ? (a) : (b))
81
428b2edd 82#define OVS_NOT_REACHED() abort()
064af421 83
34582733
AS
84/* Use "%"PRIuSIZE to format size_t with printf(). */
85#ifdef _WIN32
86#define PRIdSIZE "Id"
87#define PRIiSIZE "Ii"
88#define PRIoSIZE "Io"
89#define PRIuSIZE "Iu"
90#define PRIxSIZE "Ix"
91#define PRIXSIZE "IX"
92#else
93#define PRIdSIZE "zd"
94#define PRIiSIZE "zi"
95#define PRIoSIZE "zo"
96#define PRIuSIZE "zu"
97#define PRIxSIZE "zx"
98#define PRIXSIZE "zX"
99#endif
100
b57c6aaa
BP
101#ifndef _WIN32
102typedef uint32_t HANDLE;
103#endif
104
064af421
BP
105#ifdef __cplusplus
106extern "C" {
107#endif
108
55d5bb44 109#define set_program_name(name) \
b0248b2a 110 ovs_set_program_name(name, OVS_PACKAGE_VERSION)
064af421 111
bc9fb3a9 112const char *get_subprogram_name(void);
40e7cf56 113 void set_subprogram_name(const char *);
bc9fb3a9 114
55d5bb44 115void ovs_print_version(uint8_t min_ofp, uint8_t max_ofp);
064af421 116
cab50449 117OVS_NO_RETURN void out_of_memory(void);
064af421
BP
118void *xmalloc(size_t) MALLOC_LIKE;
119void *xcalloc(size_t, size_t) MALLOC_LIKE;
ec6fde61 120void *xzalloc(size_t) MALLOC_LIKE;
064af421
BP
121void *xrealloc(void *, size_t);
122void *xmemdup(const void *, size_t) MALLOC_LIKE;
123char *xmemdup0(const char *, size_t) MALLOC_LIKE;
124char *xstrdup(const char *) MALLOC_LIKE;
2225c0b9 125char *nullable_xstrdup(const char *) MALLOC_LIKE;
aacf18c3 126bool nullable_string_is_equal(const char *a, const char *b);
cab50449
TG
127char *xasprintf(const char *format, ...) OVS_PRINTF_FORMAT(1, 2) MALLOC_LIKE;
128char *xvasprintf(const char *format, va_list) OVS_PRINTF_FORMAT(1, 0) MALLOC_LIKE;
064af421
BP
129void *x2nrealloc(void *p, size_t *n, size_t s);
130
2fec66db
BP
131void *xmalloc_cacheline(size_t) MALLOC_LIKE;
132void *xzalloc_cacheline(size_t) MALLOC_LIKE;
133void free_cacheline(void *);
134
064af421 135void ovs_strlcpy(char *dst, const char *src, size_t size);
71d7c22f 136void ovs_strzcpy(char *dst, const char *src, size_t size);
064af421 137
cab50449
TG
138OVS_NO_RETURN void ovs_abort(int err_no, const char *format, ...)
139 OVS_PRINTF_FORMAT(2, 3);
140OVS_NO_RETURN void ovs_abort_valist(int err_no, const char *format, va_list)
141 OVS_PRINTF_FORMAT(2, 0);
142OVS_NO_RETURN void ovs_fatal(int err_no, const char *format, ...)
143 OVS_PRINTF_FORMAT(2, 3);
144OVS_NO_RETURN void ovs_fatal_valist(int err_no, const char *format, va_list)
145 OVS_PRINTF_FORMAT(2, 0);
146void ovs_error(int err_no, const char *format, ...) OVS_PRINTF_FORMAT(2, 3);
c1c8308a 147void ovs_error_valist(int err_no, const char *format, va_list)
cab50449 148 OVS_PRINTF_FORMAT(2, 0);
c18ea70d 149const char *ovs_retval_to_string(int);
5fcbed74 150const char *ovs_strerror(int);
064af421
BP
151void ovs_hex_dump(FILE *, const void *, size_t, uintptr_t offset, bool ascii);
152
153bool str_to_int(const char *, int base, int *);
154bool str_to_long(const char *, int base, long *);
155bool str_to_llong(const char *, int base, long long *);
1ab39058 156bool str_to_llong_with_tail(const char *, char **, int base, long long *);
4c21aa06 157bool str_to_uint(const char *, int base, unsigned int *);
1ab39058 158bool str_to_llong_range(const char *, int base, long long *, long long *);
064af421 159
cab50449 160bool ovs_scan(const char *s, const char *format, ...) OVS_SCANF_FORMAT(2, 3);
f071cbba 161bool ovs_scan_len(const char *s, int *n, const char *format, ...);
ed2232fc 162
f38b84ea
BP
163bool str_to_double(const char *, double *);
164
165int hexit_value(int c);
0429d959 166uintmax_t hexits_value(const char *s, size_t n, bool *ok);
f38b84ea 167
e7ae59f9
JG
168int parse_int_string(const char *s, uint8_t *valuep, int field_width,
169 char **tail);
170
44b4d050
BP
171const char *english_list_delimiter(size_t index, size_t total);
172
daf03c53 173char *get_cwd(void);
3c1150ce 174#ifndef _WIN32
29d4af60 175char *dir_name(const char *file_name);
e1aff6f9 176char *base_name(const char *file_name);
3c1150ce 177#endif
daf03c53 178char *abs_file_name(const char *dir, const char *file_name);
29d4af60 179
fee0c963
BP
180char *follow_symlinks(const char *filename);
181
c69ee87c 182void ignore(bool x OVS_UNUSED);
fe9d0898
BP
183\f
184/* Bitwise tests. */
0ee140fb 185
d43d314e
BP
186/* Returns the number of trailing 0-bits in 'n'. Undefined if 'n' == 0. */
187#if __GNUC__ >= 4
0ee140fb 188static inline int
d43d314e 189raw_ctz(uint64_t n)
0ee140fb 190{
d43d314e
BP
191 /* With GCC 4.7 on 32-bit x86, if a 32-bit integer is passed as 'n', using
192 * a plain __builtin_ctzll() here always generates an out-of-line function
193 * call. The test below helps it to emit a single 'bsf' instruction. */
194 return (__builtin_constant_p(n <= UINT32_MAX) && n <= UINT32_MAX
195 ? __builtin_ctz(n)
196 : __builtin_ctzll(n));
0ee140fb 197}
8c947903
JR
198
199static inline int
200raw_clz64(uint64_t n)
201{
202 return __builtin_clzll(n);
203}
25f45143
GS
204#elif _MSC_VER
205static inline int
206raw_ctz(uint64_t n)
207{
208#ifdef _WIN64
99970e95 209 unsigned long r = 0;
25f45143
GS
210 _BitScanForward64(&r, n);
211 return r;
212#else
99970e95 213 unsigned long low = n, high, r = 0;
25f45143
GS
214 if (_BitScanForward(&r, low)) {
215 return r;
216 }
217 high = n >> 32;
218 _BitScanForward(&r, high);
219 return r + 32;
220#endif
221}
222
223static inline int
224raw_clz64(uint64_t n)
225{
226#ifdef _WIN64
99970e95 227 unsigned long r = 0;
25f45143
GS
228 _BitScanReverse64(&r, n);
229 return 63 - r;
230#else
99970e95 231 unsigned long low, high = n >> 32, r = 0;
25f45143
GS
232 if (_BitScanReverse(&r, high)) {
233 return 31 - r;
234 }
235 low = n;
236 _BitScanReverse(&r, low);
237 return 63 - r;
238#endif
239}
0ee140fb
BP
240#else
241/* Defined in util.c. */
d43d314e 242int raw_ctz(uint64_t n);
8c947903 243int raw_clz64(uint64_t n);
0ee140fb
BP
244#endif
245
246/* Returns the number of trailing 0-bits in 'n', or 32 if 'n' is 0. */
247static inline int
d578065e 248ctz32(uint32_t n)
0ee140fb
BP
249{
250 return n ? raw_ctz(n) : 32;
251}
252
cc4c738e
JR
253/* Returns the number of trailing 0-bits in 'n', or 64 if 'n' is 0. */
254static inline int
255ctz64(uint64_t n)
256{
d43d314e 257 return n ? raw_ctz(n) : 64;
cc4c738e 258}
18b9283b 259
8c947903
JR
260/* Returns the number of leading 0-bits in 'n', or 32 if 'n' is 0. */
261static inline int
262clz32(uint32_t n)
263{
264 return n ? raw_clz64(n) - 32 : 32;
265}
266
267/* Returns the number of leading 0-bits in 'n', or 64 if 'n' is 0. */
268static inline int
269clz64(uint64_t n)
270{
271 return n ? raw_clz64(n) : 64;
272}
273
274/* Given a word 'n', calculates floor(log_2('n')). This is equivalent
275 * to finding the bit position of the most significant one bit in 'n'. It is
276 * an error to call this function with 'n' == 0. */
277static inline int
278log_2_floor(uint64_t n)
279{
280 return 63 - raw_clz64(n);
281}
282
283/* Given a word 'n', calculates ceil(log_2('n')). It is an error to
284 * call this function with 'n' == 0. */
285static inline int
286log_2_ceil(uint64_t n)
287{
288 return log_2_floor(n) + !is_pow2(n);
289}
290
381657b3
JR
291/* unsigned int count_1bits(uint64_t x):
292 *
293 * Returns the number of 1-bits in 'x', between 0 and 64 inclusive. */
294#if UINTPTR_MAX == UINT64_MAX
295static inline unsigned int
296count_1bits(uint64_t x)
297{
298#if __GNUC__ >= 4 && __POPCNT__
299 return __builtin_popcountll(x);
300#else
301 /* This portable implementation is the fastest one we know of for 64
302 * bits, and about 3x faster than GCC 4.7 __builtin_popcountll(). */
303 const uint64_t h55 = UINT64_C(0x5555555555555555);
304 const uint64_t h33 = UINT64_C(0x3333333333333333);
305 const uint64_t h0F = UINT64_C(0x0F0F0F0F0F0F0F0F);
306 const uint64_t h01 = UINT64_C(0x0101010101010101);
307 x -= (x >> 1) & h55; /* Count of each 2 bits in-place. */
308 x = (x & h33) + ((x >> 2) & h33); /* Count of each 4 bits in-place. */
309 x = (x + (x >> 4)) & h0F; /* Count of each 8 bits in-place. */
310 return (x * h01) >> 56; /* Sum of all bytes. */
311#endif
312}
313#else /* Not 64-bit. */
314#if __GNUC__ >= 4 && __POPCNT__
c3cc4d2d 315static inline unsigned int
381657b3 316count_1bits_32__(uint32_t x)
c3cc4d2d 317{
c3cc4d2d 318 return __builtin_popcount(x);
381657b3 319}
c3cc4d2d 320#else
381657b3
JR
321#define NEED_COUNT_1BITS_8 1
322extern const uint8_t count_1bits_8[256];
323static inline unsigned int
324count_1bits_32__(uint32_t x)
325{
c3cc4d2d
JR
326 /* This portable implementation is the fastest one we know of for 32 bits,
327 * and faster than GCC __builtin_popcount(). */
328 return (count_1bits_8[x & 0xff] +
329 count_1bits_8[(x >> 8) & 0xff] +
330 count_1bits_8[(x >> 16) & 0xff] +
331 count_1bits_8[x >> 24]);
c3cc4d2d 332}
381657b3 333#endif
c3cc4d2d
JR
334static inline unsigned int
335count_1bits(uint64_t x)
336{
381657b3 337 return count_1bits_32__(x) + count_1bits_32__(x >> 32);
c3cc4d2d 338}
381657b3 339#endif
8c947903 340
fe9d0898
BP
341/* Returns the rightmost 1-bit in 'x' (e.g. 01011000 => 00001000), or 0 if 'x'
342 * is 0. */
343static inline uintmax_t
344rightmost_1bit(uintmax_t x)
345{
346 return x & -x;
347}
348
349/* Returns 'x' with its rightmost 1-bit changed to a zero (e.g. 01011000 =>
350 * 01010000), or 0 if 'x' is 0. */
351static inline uintmax_t
352zero_rightmost_1bit(uintmax_t x)
353{
354 return x & (x - 1);
355}
35bedb61 356
4ed47144
BP
357/* Returns the index of the rightmost 1-bit in 'x' (e.g. 01011000 => 3), or an
358 * undefined value if 'x' is 0. */
795b3288 359static inline int
4ed47144 360rightmost_1bit_idx(uint64_t x)
35bedb61 361{
4ed47144 362 return ctz64(x);
35bedb61
BP
363}
364
4ed47144
BP
365/* Returns the index of the leftmost 1-bit in 'x' (e.g. 01011000 => 6), or an
366 * undefined value if 'x' is 0. */
35bedb61 367static inline uint32_t
4ed47144 368leftmost_1bit_idx(uint64_t x)
35bedb61 369{
4ed47144 370 return log_2_floor(x);
35bedb61 371}
86f35fb5
JR
372
373/* Return a ovs_be32 prefix in network byte order with 'plen' highest bits set.
374 * Shift with 32 is undefined behavior, but we rather use 64-bit shift than
375 * compare. */
376static inline ovs_be32 be32_prefix_mask(int plen)
377{
378 return htonl((uint64_t)UINT32_MAX << (32 - plen));
379}
fe9d0898 380\f
53cb9c3e
JR
381bool is_all_zeros(const void *, size_t);
382bool is_all_ones(const void *, size_t);
ddc4f8e2
BP
383void bitwise_copy(const void *src, unsigned int src_len, unsigned int src_ofs,
384 void *dst, unsigned int dst_len, unsigned int dst_ofs,
385 unsigned int n_bits);
6cc7ea5e
BP
386void bitwise_zero(void *dst_, unsigned int dst_len, unsigned dst_ofs,
387 unsigned int n_bits);
c2dd4932
BP
388void bitwise_one(void *dst_, unsigned int dst_len, unsigned dst_ofs,
389 unsigned int n_bits);
79a010aa
BP
390bool bitwise_is_all_zeros(const void *, unsigned int len, unsigned int ofs,
391 unsigned int n_bits);
099c06e3
BP
392unsigned int bitwise_scan(const void *, unsigned int len,
393 bool target, unsigned int start, unsigned int end);
95a92d5a
BP
394int bitwise_rscan(const void *, unsigned int len, bool target,
395 int start, int end);
ddc4f8e2
BP
396void bitwise_put(uint64_t value,
397 void *dst, unsigned int dst_len, unsigned int dst_ofs,
398 unsigned int n_bits);
399uint64_t bitwise_get(const void *src, unsigned int src_len,
400 unsigned int src_ofs, unsigned int n_bits);
95a92d5a
BP
401bool bitwise_get_bit(const void *src, unsigned int len, unsigned int ofs);
402void bitwise_put0(void *dst, unsigned int len, unsigned int ofs);
403void bitwise_put1(void *dst, unsigned int len, unsigned int ofs);
404void bitwise_put_bit(void *dst, unsigned int len, unsigned int ofs, bool);
405void bitwise_toggle_bit(void *dst, unsigned int len, unsigned int ofs);
75a75043 406
bdd7ecf5
JS
407/* Returns non-zero if the parameters have equal value. */
408static inline int
2ff8484b 409ovs_u128_equals(const ovs_u128 a, const ovs_u128 b)
bdd7ecf5 410{
2ff8484b 411 return (a.u64.hi == b.u64.hi) && (a.u64.lo == b.u64.lo);
bdd7ecf5
JS
412}
413
557344e3
JS
414/* Returns true if 'val' is 0. */
415static inline bool
2ff8484b 416ovs_u128_is_zero(const ovs_u128 val)
557344e3 417{
2ff8484b 418 return !(val.u64.hi || val.u64.lo);
557344e3
JS
419}
420
421/* Returns true if 'val' is all ones. */
422static inline bool
2ff8484b 423ovs_u128_is_ones(const ovs_u128 val)
557344e3 424{
2ff8484b 425 return ovs_u128_equals(val, OVS_U128_MAX);
557344e3
JS
426}
427
428/* Returns non-zero if the parameters have equal value. */
429static inline int
2ff8484b 430ovs_be128_equals(const ovs_be128 a, const ovs_be128 b)
557344e3 431{
2ff8484b 432 return (a.be64.hi == b.be64.hi) && (a.be64.lo == b.be64.lo);
557344e3
JS
433}
434
435/* Returns true if 'val' is 0. */
436static inline bool
2ff8484b 437ovs_be128_is_zero(const ovs_be128 val)
557344e3 438{
2ff8484b 439 return !(val.be64.hi || val.be64.lo);
557344e3
JS
440}
441
f2d105b5
JS
442static inline ovs_u128
443ovs_u128_and(const ovs_u128 a, const ovs_u128 b)
444{
445 ovs_u128 dst;
446
447 dst.u64.hi = a.u64.hi & b.u64.hi;
448 dst.u64.lo = a.u64.lo & b.u64.lo;
449
450 return dst;
451}
452
5fd2f418 453void xsleep(unsigned int seconds);
124f09c9 454
20174b74
QM
455bool is_stdout_a_tty(void);
456
06f14c92
GS
457#ifdef _WIN32
458\f
315ea327 459char *ovs_format_message(int error);
06f14c92 460char *ovs_lasterror_to_string(void);
daa04db8 461int ftruncate(int fd, off_t length);
06f14c92
GS
462#endif
463
064af421
BP
464#ifdef __cplusplus
465}
466#endif
467
468#endif /* util.h */