DPDK 25.03.0-rc1
|
#include <assert.h>
#include <limits.h>
#include <stdint.h>
#include <stdalign.h>
#include <rte_config.h>
#include <rte_os.h>
Go to the source code of this file.
Macros | |
#define | __rte_aligned(a) __attribute__((__aligned__(a))) |
#define | __rte_packed (RTE_DEPRECATED(__rte_packed) __attribute__((__packed__))) |
#define | __rte_packed_begin |
#define | __rte_may_alias __attribute__((__may_alias__)) |
#define | RTE_DEPRECATED(x) |
#define | __rte_diagnostic_push _Pragma("GCC diagnostic push") |
#define | __rte_diagnostic_ignored_wcast_qual _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") |
#define | __rte_weak __attribute__((__weak__)) |
#define | __rte_pure __attribute__((pure)) |
#define | __rte_used __attribute__((used)) |
#define | __rte_unused __attribute__((__unused__)) |
#define | __rte_restrict __restrict |
#define | RTE_SET_USED(x) (void)(x) |
#define | __rte_format_printf(format_index, first_arg) __attribute__((format(printf, format_index, first_arg))) |
#define | __rte_section(name) __attribute__((section(name))) |
#define | __rte_alloc_size(...) |
#define | __rte_alloc_align(argno) |
#define | __rte_malloc |
#define | __rte_dealloc(dealloc, argno) |
#define | RTE_INIT_PRIO(func, prio) static void __attribute__((constructor(RTE_PRIO(prio)), used)) func(void) |
#define | RTE_INIT(func) RTE_INIT_PRIO(func, LAST) |
#define | RTE_FINI_PRIO(func, prio) static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void) |
#define | RTE_FINI(func) RTE_FINI_PRIO(func, LAST) |
#define | __rte_noreturn __attribute__((noreturn)) |
#define | __rte_unreachable() __assume(0) |
#define | __rte_warn_unused_result __attribute__((warn_unused_result)) |
#define | __rte_always_inline inline __attribute__((always_inline)) |
#define | __rte_noinline __attribute__((noinline)) |
#define | __rte_hot __attribute__((hot)) |
#define | __rte_cold __attribute__((cold)) |
#define | __rte_assume(condition) __assume(condition) |
#define | __rte_no_asan |
#define | RTE_PTR_ADD(ptr, x) ((void*)((uintptr_t)(ptr) + (x))) |
#define | RTE_PTR_SUB(ptr, x) ((void *)((uintptr_t)(ptr) - (x))) |
#define | RTE_PTR_DIFF(ptr1, ptr2) ((uintptr_t)(ptr1) - (uintptr_t)(ptr2)) |
#define | RTE_PTR_UNQUAL(X) ((void *)(uintptr_t)(X)) |
#define | RTE_CAST_PTR(type, ptr) ((type)(uintptr_t)(ptr)) |
#define | RTE_CAST_FIELD(var, field, type) (*(type *)((uintptr_t)(var) + offsetof(typeof(*(var)), field))) |
#define | RTE_PTR_ALIGN_FLOOR(ptr, align) ((typeof(ptr))RTE_ALIGN_FLOOR((uintptr_t)(ptr), align)) |
#define | RTE_ALIGN_FLOOR(val, align) (typeof(val))((val) & (~((typeof(val))((align) - 1)))) |
#define | RTE_PTR_ALIGN_CEIL(ptr, align) RTE_PTR_ALIGN_FLOOR((typeof(ptr))RTE_PTR_ADD(ptr, (align) - 1), align) |
#define | RTE_ALIGN_CEIL(val, align) RTE_ALIGN_FLOOR(((val) + ((typeof(val)) (align) - 1)), align) |
#define | RTE_PTR_ALIGN(ptr, align) RTE_PTR_ALIGN_CEIL(ptr, align) |
#define | RTE_ALIGN(val, align) RTE_ALIGN_CEIL(val, align) |
#define | RTE_ALIGN_MUL_CEIL(v, mul) ((((v) + (typeof(v))(mul) - 1) / ((typeof(v))(mul))) * (typeof(v))(mul)) |
#define | RTE_ALIGN_MUL_FLOOR(v, mul) (((v) / ((typeof(v))(mul))) * (typeof(v))(mul)) |
#define | RTE_ALIGN_MUL_NEAR(v, mul) |
#define | RTE_BUILD_BUG_ON(condition) do { static_assert(!(condition), #condition); } while (0) |
#define | RTE_CACHE_LINE_MASK (RTE_CACHE_LINE_SIZE-1) |
#define | RTE_CACHE_LINE_ROUNDUP(size) RTE_ALIGN_CEIL(size, RTE_CACHE_LINE_SIZE) |
#define | RTE_CACHE_LINE_MIN_SIZE 64 |
#define | __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE) |
#define | __rte_cache_min_aligned __rte_aligned(RTE_CACHE_LINE_MIN_SIZE) |
#define | RTE_CACHE_GUARD _RTE_CACHE_GUARD_HELPER1(__COUNTER__) |
#define | RTE_MIN(a, b) |
#define | RTE_MIN_T(a, b, t) ((t)(a) < (t)(b) ? (t)(a) : (t)(b)) |
#define | RTE_MAX(a, b) |
#define | RTE_MAX_T(a, b, t) ((t)(a) > (t)(b) ? (t)(a) : (t)(b)) |
#define | offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) |
#define | container_of(ptr, type, member) |
#define | RTE_SWAP(a, b) |
#define | RTE_SIZEOF_FIELD(type, field) (sizeof(((type *)0)->field)) |
#define | RTE_STR(x) _RTE_STR(x) |
#define | RTE_FMT(fmt, ...) fmt "%.0s", __VA_ARGS__ "" |
#define | RTE_LEN2MASK(ln, tp) ((tp)((uint64_t)-1 >> (sizeof(uint64_t) * CHAR_BIT - (ln)))) |
#define | RTE_DIM(a) (sizeof (a) / sizeof ((a)[0])) |
Typedefs | |
typedef uint64_t | phys_addr_t |
typedef uint64_t | rte_iova_t |
Functions | |
static int | rte_is_aligned (const void *const __rte_restrict ptr, const unsigned int align) |
uint64_t | rte_str_to_size (const char *str) |
__rte_noreturn void | rte_exit (int exit_code, const char *format,...) __rte_format_printf(2 |
Variables | |
__extension__ typedef void * | RTE_MARKER [0] |
__extension__ typedef uint8_t | RTE_MARKER8 [0] |
__extension__ typedef uint16_t | RTE_MARKER16 [0] |
__extension__ typedef uint32_t | RTE_MARKER32 [0] |
__extension__ typedef uint64_t | RTE_MARKER64 [0] |
Generic, commonly-used macro and inline function definitions for DPDK.
Definition in file rte_common.h.
#define __rte_aligned | ( | a | ) | __attribute__((__aligned__(a))) |
Force type alignment
This macro should be used when alignment of a struct or union type is required. For toolchain compatibility it should appear between the {struct,union} keyword and tag. e.g.
struct __rte_aligned(8) tag { ... };
If alignment of an object/variable is required then this macro should not be used, instead prefer C11 alignas(a).
Definition at line 87 of file rte_common.h.
#define __rte_packed (RTE_DEPRECATED(__rte_packed) __attribute__((__packed__))) |
Force a structure to be packed
Definition at line 110 of file rte_common.h.
#define __rte_packed_begin |
Force a structure to be packed Usage: struct __rte_packed_begin mystruct { ... } __rte_packed_end; union __rte_packed_begin myunion { ... } __rte_packed_end; Note: alignment attributes when present should precede __rte_packed_begin.
Definition at line 124 of file rte_common.h.
#define __rte_may_alias __attribute__((__may_alias__)) |
Macro to mark a type that is not subject to type-based aliasing rules
Definition at line 134 of file rte_common.h.
#define RTE_DEPRECATED | ( | x | ) |
Macro to mark macros and defines scheduled for removal
Definition at line 154 of file rte_common.h.
#define __rte_diagnostic_push _Pragma("GCC diagnostic push") |
Macros to cause the compiler to remember the state of the diagnostics as of each push, and restore to that point at each pop.
Definition at line 162 of file rte_common.h.
#define __rte_diagnostic_ignored_wcast_qual _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") |
Macro to disable compiler warnings about removing a type qualifier from the target type.
Definition at line 174 of file rte_common.h.
#define __rte_weak __attribute__((__weak__)) |
Mark a function or variable to a weak reference.
Definition at line 182 of file rte_common.h.
#define __rte_pure __attribute__((pure)) |
Mark a function to be pure.
Definition at line 190 of file rte_common.h.
#define __rte_used __attribute__((used)) |
Force symbol to be generated even if it appears to be unused.
Definition at line 199 of file rte_common.h.
#define __rte_unused __attribute__((__unused__)) |
short definition to mark a function parameter unused
Definition at line 210 of file rte_common.h.
#define __rte_restrict __restrict |
Mark pointer as restricted with regard to pointer aliasing.
Definition at line 217 of file rte_common.h.
#define RTE_SET_USED | ( | x | ) | (void)(x) |
definition to mark a variable or function parameter as used so as to avoid a compiler warning
Definition at line 226 of file rte_common.h.
#define __rte_format_printf | ( | format_index, | |
first_arg | |||
) | __attribute__((format(printf, format_index, first_arg))) |
Check format string and its arguments at compile-time.
GCC on Windows assumes MS-specific format string by default, even if the underlying stdio implementation is ANSI-compliant, so this must be overridden.
Definition at line 242 of file rte_common.h.
#define __rte_section | ( | name | ) | __attribute__((section(name))) |
Specify data or function section/segment.
Definition at line 254 of file rte_common.h.
#define __rte_alloc_size | ( | ... | ) |
Tells compiler that the function returns a value that points to memory, where the size is given by the one or two arguments. Used by compiler to validate object size.
Definition at line 267 of file rte_common.h.
#define __rte_alloc_align | ( | argno | ) |
Tells the compiler that the function returns a value that points to memory aligned by a function argument.
Note: not enabled on Clang because it warns if align argument is zero.
Definition at line 280 of file rte_common.h.
#define __rte_malloc |
Tells the compiler this is a function like malloc and that the pointer returned cannot alias any other pointer (ie new memory).
Definition at line 290 of file rte_common.h.
#define __rte_dealloc | ( | dealloc, | |
argno | |||
) |
With recent GCC versions also able to track that proper deallocator function is used for this pointer.
Definition at line 301 of file rte_common.h.
#define RTE_INIT_PRIO | ( | func, | |
prio | |||
) | static void __attribute__((constructor(RTE_PRIO(prio)), used)) func(void) |
Run function before main() with high priority.
func | Constructor function. |
prio | Priority number must be above 100. Lowest number is the first to run. |
Definition at line 323 of file rte_common.h.
#define RTE_INIT | ( | func | ) | RTE_INIT_PRIO(func, LAST) |
Run function before main() with low priority.
The constructor will be run after prioritized constructors.
func | Constructor function. |
Definition at line 355 of file rte_common.h.
#define RTE_FINI_PRIO | ( | func, | |
prio | |||
) | static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void) |
Run after main() with low priority.
func | Destructor function name. |
prio | Priority number must be above 100. Lowest number is the last to run. |
Definition at line 369 of file rte_common.h.
#define RTE_FINI | ( | func | ) | RTE_FINI_PRIO(func, LAST) |
Run after main() with high priority.
The destructor will be run before prioritized destructors.
func | Destructor function name. |
Definition at line 396 of file rte_common.h.
#define __rte_noreturn __attribute__((noreturn)) |
Hint never returning function
Definition at line 405 of file rte_common.h.
#define __rte_unreachable | ( | ) | __assume(0) |
Hint point in program never reached
Definition at line 414 of file rte_common.h.
#define __rte_warn_unused_result __attribute__((warn_unused_result)) |
Issue a warning in case the function's return value is ignored.
The use of this attribute should be restricted to cases where ignoring the marked function's return value is almost always a bug. With GCC, some effort is required to make clear that ignoring the return value is intentional. The usual void-casting method to mark something unused as used does not suppress the warning with this compiler.
Definition at line 443 of file rte_common.h.
#define __rte_always_inline inline __attribute__((always_inline)) |
Force a function to be inlined
Definition at line 452 of file rte_common.h.
#define __rte_noinline __attribute__((noinline)) |
Force a function to be noinlined
Definition at line 461 of file rte_common.h.
#define __rte_hot __attribute__((hot)) |
Hint function in the hot path
Definition at line 470 of file rte_common.h.
#define __rte_cold __attribute__((cold)) |
Hint function in the cold path
Definition at line 479 of file rte_common.h.
#define __rte_assume | ( | condition | ) | __assume(condition) |
Hint precondition
condition
might be executed. This currently only occurs with GCC prior to version 13. Definition at line 495 of file rte_common.h.
#define __rte_no_asan |
Disable AddressSanitizer on some code
Definition at line 508 of file rte_common.h.
#define RTE_PTR_ADD | ( | ptr, | |
x | |||
) | ((void*)((uintptr_t)(ptr) + (x))) |
add a byte-value offset to a pointer
Definition at line 516 of file rte_common.h.
#define RTE_PTR_SUB | ( | ptr, | |
x | |||
) | ((void *)((uintptr_t)(ptr) - (x))) |
subtract a byte-value offset from a pointer
Definition at line 521 of file rte_common.h.
#define RTE_PTR_DIFF | ( | ptr1, | |
ptr2 | |||
) | ((uintptr_t)(ptr1) - (uintptr_t)(ptr2)) |
get the difference between two pointer values, i.e. how far apart in bytes are the locations they point two. It is assumed that ptr1 is greater than ptr2.
Definition at line 528 of file rte_common.h.
#define RTE_PTR_UNQUAL | ( | X | ) | ((void *)(uintptr_t)(X)) |
Macro to discard qualifiers (such as const, volatile, restrict) from a pointer, without the compiler emitting a warning.
Definition at line 536 of file rte_common.h.
#define RTE_CAST_PTR | ( | type, | |
ptr | |||
) | ((type)(uintptr_t)(ptr)) |
Macro to cast a pointer to a specific type, without the compiler emitting a warning about discarding qualifiers.
struct s { uint16_t a; uint8_t b; uint8_t c; uint8_t d; } v; uint16_t * p = RTE_CAST_PTR(uint16_t *, &v.c); // "p" is not 16 bit aligned!
Definition at line 555 of file rte_common.h.
#define RTE_CAST_FIELD | ( | var, | |
field, | |||
type | |||
) | (*(type *)((uintptr_t)(var) + offsetof(typeof(*(var)), field))) |
Workaround to cast a const field of a structure to non-const type.
Definition at line 560 of file rte_common.h.
#define RTE_PTR_ALIGN_FLOOR | ( | ptr, | |
align | |||
) | ((typeof(ptr))RTE_ALIGN_FLOOR((uintptr_t)(ptr), align)) |
Macro to align a pointer to a given power-of-two. The resultant pointer will be a pointer of the same type as the first parameter, and point to an address no higher than the first parameter. Second parameter must be a power-of-two value.
Definition at line 572 of file rte_common.h.
#define RTE_ALIGN_FLOOR | ( | val, | |
align | |||
) | (typeof(val))((val) & (~((typeof(val))((align) - 1)))) |
Macro to align a value to a given power-of-two. The resultant value will be of the same type as the first parameter, and will be no bigger than the first parameter. Second parameter must be a power-of-two value.
Definition at line 581 of file rte_common.h.
#define RTE_PTR_ALIGN_CEIL | ( | ptr, | |
align | |||
) | RTE_PTR_ALIGN_FLOOR((typeof(ptr))RTE_PTR_ADD(ptr, (align) - 1), align) |
Macro to align a pointer to a given power-of-two. The resultant pointer will be a pointer of the same type as the first parameter, and point to an address no lower than the first parameter. Second parameter must be a power-of-two value.
Definition at line 590 of file rte_common.h.
#define RTE_ALIGN_CEIL | ( | val, | |
align | |||
) | RTE_ALIGN_FLOOR(((val) + ((typeof(val)) (align) - 1)), align) |
Macro to align a value to a given power-of-two. The resultant value will be of the same type as the first parameter, and will be no lower than the first parameter. Second parameter must be a power-of-two value.
Definition at line 599 of file rte_common.h.
#define RTE_PTR_ALIGN | ( | ptr, | |
align | |||
) | RTE_PTR_ALIGN_CEIL(ptr, align) |
Macro to align a pointer to a given power-of-two. The resultant pointer will be a pointer of the same type as the first parameter, and point to an address no lower than the first parameter. Second parameter must be a power-of-two value. This function is the same as RTE_PTR_ALIGN_CEIL
Definition at line 609 of file rte_common.h.
#define RTE_ALIGN | ( | val, | |
align | |||
) | RTE_ALIGN_CEIL(val, align) |
Macro to align a value to a given power-of-two. The resultant value will be of the same type as the first parameter, and will be no lower than the first parameter. Second parameter must be a power-of-two value. This function is the same as RTE_ALIGN_CEIL
Definition at line 618 of file rte_common.h.
#define RTE_ALIGN_MUL_CEIL | ( | v, | |
mul | |||
) | ((((v) + (typeof(v))(mul) - 1) / ((typeof(v))(mul))) * (typeof(v))(mul)) |
Macro to align a value to the multiple of given value. The resultant value will be of the same type as the first parameter and will be no lower than the first parameter.
Definition at line 625 of file rte_common.h.
#define RTE_ALIGN_MUL_FLOOR | ( | v, | |
mul | |||
) | (((v) / ((typeof(v))(mul))) * (typeof(v))(mul)) |
Macro to align a value to the multiple of given value. The resultant value will be of the same type as the first parameter and will be no higher than the first parameter.
Definition at line 633 of file rte_common.h.
#define RTE_ALIGN_MUL_NEAR | ( | v, | |
mul | |||
) |
Macro to align value to the nearest multiple of the given value. The resultant value might be greater than or less than the first parameter whichever difference is the lowest.
Definition at line 641 of file rte_common.h.
#define RTE_BUILD_BUG_ON | ( | condition | ) | do { static_assert(!(condition), #condition); } while (0) |
Triggers an error at compilation time if the condition is true.
The do { } while(0) exists to workaround a bug in clang (#55821) where it would not handle _Static_assert in a switch case.
Definition at line 678 of file rte_common.h.
#define RTE_CACHE_LINE_MASK (RTE_CACHE_LINE_SIZE-1) |
Cache line mask.
Definition at line 683 of file rte_common.h.
#define RTE_CACHE_LINE_ROUNDUP | ( | size | ) | RTE_ALIGN_CEIL(size, RTE_CACHE_LINE_SIZE) |
Return the first cache-aligned value greater or equal to size.
Definition at line 686 of file rte_common.h.
#define RTE_CACHE_LINE_MIN_SIZE 64 |
Cache line size in terms of log2 Minimum Cache line size.
Definition at line 698 of file rte_common.h.
#define __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE) |
Force alignment to cache line.
Definition at line 701 of file rte_common.h.
#define __rte_cache_min_aligned __rte_aligned(RTE_CACHE_LINE_MIN_SIZE) |
Force minimum cache line alignment.
Definition at line 704 of file rte_common.h.
#define RTE_CACHE_GUARD _RTE_CACHE_GUARD_HELPER1(__COUNTER__) |
Empty cache lines, to guard against false sharing-like effects on systems with a next-N-lines hardware prefetcher.
Use as spacing between data accessed by different lcores, to prevent cache thrashing on hardware with speculative prefetching.
Definition at line 717 of file rte_common.h.
#define RTE_MIN | ( | a, | |
b | |||
) |
Macro to return the minimum of two numbers
Definition at line 757 of file rte_common.h.
#define RTE_MIN_T | ( | a, | |
b, | |||
t | |||
) | ((t)(a) < (t)(b) ? (t)(a) : (t)(b)) |
Macro to return the minimum of two numbers
As opposed to RTE_MIN, it does not use temporary variables so it is not safe if a or b is an expression. Yet it is guaranteed to be constant for use in static_assert().
Definition at line 771 of file rte_common.h.
#define RTE_MAX | ( | a, | |
b | |||
) |
Macro to return the maximum of two numbers
Definition at line 777 of file rte_common.h.
#define RTE_MAX_T | ( | a, | |
b, | |||
t | |||
) | ((t)(a) > (t)(b) ? (t)(a) : (t)(b)) |
Macro to return the maximum of two numbers
As opposed to RTE_MAX, it does not use temporary variables so it is not safe if a or b is an expression. Yet it is guaranteed to be constant for use in static_assert().
Definition at line 791 of file rte_common.h.
#define offsetof | ( | TYPE, | |
MEMBER | |||
) | __builtin_offsetof (TYPE, MEMBER) |
Return the offset of a field in a structure.
Definition at line 798 of file rte_common.h.
#define container_of | ( | ptr, | |
type, | |||
member | |||
) |
Return pointer to the wrapping struct instance.
Example:
struct wrapper { ... struct child c; ... };
struct child *x = obtain(...); struct wrapper *w = container_of(x, struct wrapper, c);
Definition at line 820 of file rte_common.h.
#define RTE_SWAP | ( | a, | |
b | |||
) |
Swap two variables.
Definition at line 830 of file rte_common.h.
#define RTE_SIZEOF_FIELD | ( | type, | |
field | |||
) | (sizeof(((type *)0)->field)) |
Get the size of a field in a structure.
type | The type of the structure. |
field | The field in the structure. |
Definition at line 847 of file rte_common.h.
#define RTE_STR | ( | x | ) | _RTE_STR(x) |
Take a macro value and get a string version of it
Definition at line 851 of file rte_common.h.
#define RTE_FMT | ( | fmt, | |
... | |||
) | fmt "%.0s", __VA_ARGS__ "" |
ISO C helpers to modify format strings using variadic macros. This is a replacement for the ", ## __VA_ARGS__" GNU extension. An empty s argument is appended to avoid a dangling comma.
Definition at line 858 of file rte_common.h.
#define RTE_LEN2MASK | ( | ln, | |
tp | |||
) | ((tp)((uint64_t)-1 >> (sizeof(uint64_t) * CHAR_BIT - (ln)))) |
Mask value of type "tp" for the first "ln" bit set.
Definition at line 863 of file rte_common.h.
#define RTE_DIM | ( | a | ) | (sizeof (a) / sizeof ((a)[0])) |
Number of elements in the array.
Definition at line 867 of file rte_common.h.
typedef uint64_t phys_addr_t |
Physical address
Definition at line 722 of file rte_common.h.
typedef uint64_t rte_iova_t |
IO virtual address type. When the physical addressing mode (IOVA as PA) is in use, the translation from an IO virtual address (IOVA) to a physical address is a direct mapping, i.e. the same value. Otherwise, in virtual mode (IOVA as VA), an IOMMU may do the translation.
Definition at line 732 of file rte_common.h.
|
inlinestatic |
Checks if a pointer is aligned to a given power-of-two value
ptr | The pointer whose alignment is to be checked |
align | The power-of-two value to which the ptr should be aligned |
Definition at line 660 of file rte_common.h.
uint64_t rte_str_to_size | ( | const char * | str | ) |
Converts a numeric string to the equivalent uint64_t value. As well as straight number conversion, also recognises the suffixes k, m and g for kilobytes, megabytes and gigabytes respectively.
If a negative number is passed in i.e. a string with the first non-black character being "-", zero is returned. Zero is also returned in the case of an error with the strtoull call in the function.
str | String containing number to convert. |
__rte_noreturn void rte_exit | ( | int | exit_code, |
const char * | format, | ||
... | |||
) |
Function to terminate the application immediately, printing an error message and returning the exit_code back to the shell.
This function never returns
exit_code | The exit code to be returned by the application |
format | The format string to be used for printing the message. This can include printf format characters which will be expanded using any further parameters to the function. |
__extension__ typedef void* RTE_MARKER[0] |
Generic marker for any place in a structure.
Definition at line 740 of file rte_common.h.
__extension__ typedef uint8_t RTE_MARKER8[0] |
Marker for 1B alignment in a structure.
Definition at line 742 of file rte_common.h.
__extension__ typedef uint16_t RTE_MARKER16[0] |
Marker for 2B alignment in a structure.
Definition at line 744 of file rte_common.h.
__extension__ typedef uint32_t RTE_MARKER32[0] |
Marker for 4B alignment in a structure.
Definition at line 746 of file rte_common.h.
__extension__ typedef uint64_t RTE_MARKER64[0] |
Marker for 8B alignment in a structure.
Definition at line 748 of file rte_common.h.