@@ -36,6 +36,28 @@ extern "C" {
#define LIBBPF_API __attribute__((visibility("default")))
#endif
+/* Helper macro to declare and initialize libbpf options struct
+ *
+ * This dance with uninitialized declaration, followed by memset to zero,
+ * followed by assignment using compound literal syntax is done to preserve
+ * ability to use a nice struct field initialization syntax and **hopefully**
+ * have all the padding bytes initialized to zero. It's not guaranteed though,
+ * when copying literal, that compiler won't copy garbage in literal's padding
+ * bytes, but that's the best way I've found and it seems to work in practice.
+ *
+ * Macro declares opts struct of given type and name, zero-initializes,
+ * including any extra padding, it with memset() and then assigns initial
+ * values provided by users in struct initializer-syntax as varargs.
+ */
+#define DECLARE_LIBBPF_OPTS(TYPE, NAME, ...) \
+ struct TYPE NAME = ({ \
+ memset(&NAME, 0, sizeof(struct TYPE)); \
+ (struct TYPE) { \
+ .sz = sizeof(struct TYPE), \
+ __VA_ARGS__ \
+ }; \
+ })
+
struct bpf_create_map_attr {
const char *name;
enum bpf_map_type map_type;
@@ -46,7 +46,6 @@
#include <gelf.h>
#include "libbpf.h"
-#include "bpf.h"
#include "btf.h"
#include "str_error.h"
#include "libbpf_internal.h"
@@ -17,6 +17,8 @@
#include <sys/types.h> // for size_t
#include <linux/bpf.h>
+#include "bpf.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -67,28 +69,6 @@ struct bpf_object_open_attr {
enum bpf_prog_type prog_type;
};
-/* Helper macro to declare and initialize libbpf options struct
- *
- * This dance with uninitialized declaration, followed by memset to zero,
- * followed by assignment using compound literal syntax is done to preserve
- * ability to use a nice struct field initialization syntax and **hopefully**
- * have all the padding bytes initialized to zero. It's not guaranteed though,
- * when copying literal, that compiler won't copy garbage in literal's padding
- * bytes, but that's the best way I've found and it seems to work in practice.
- *
- * Macro declares opts struct of given type and name, zero-initializes,
- * including any extra padding, it with memset() and then assigns initial
- * values provided by users in struct initializer-syntax as varargs.
- */
-#define DECLARE_LIBBPF_OPTS(TYPE, NAME, ...) \
- struct TYPE NAME = ({ \
- memset(&NAME, 0, sizeof(struct TYPE)); \
- (struct TYPE) { \
- .sz = sizeof(struct TYPE), \
- __VA_ARGS__ \
- }; \
- })
-
struct bpf_object_open_opts {
/* size of this struct, for forward/backward compatiblity */
size_t sz;
DECLARE_LIBBPF_OPTS is the way to use option structures in a backward compatible and extensible way. It's available only in libbpf.h. Though public interfaces in bpf.h have the same requirement to accept options in a way that can be simply extended w/o introducing new xattr-functions every time. libbpf.c depends on bpf.h, hence to share the macros a couple of options exist: * either a common header should be introduced; * or the macro can be moved to bpf.h and used by libbpf.h from there; The former seems to be an overkill, so do the latter: * move DECLARE_LIBBPF_OPTS from libbpf.h to bpf.h; * move `#include "bpf.h"` from libbpf.c to libbpf.h not to break users of the macro who already include only libbpf.h. That makes the macro available to use in bpf.{h,c} and should not break those who already use it. Signed-off-by: Andrey Ignatov <rdna@fb.com> --- tools/lib/bpf/bpf.h | 22 ++++++++++++++++++++++ tools/lib/bpf/libbpf.c | 1 - tools/lib/bpf/libbpf.h | 24 ++---------------------- 3 files changed, 24 insertions(+), 23 deletions(-)