These were introduced by Linux commit v4.15-rc1~84^2~384^2~4.
* bpf_attr.h (struct BPF_OBJ_PIN_struct): Add file_flags field.
(struct BPF_PROG_GET_NEXT_ID_struct, struct BPF_PROG_GET_FD_BY_ID_struct,
struct BPF_MAP_GET_FD_BY_ID_struct): Add open_flags field.
(BPF_OBJ_PIN_struct_size, expected_BPF_OBJ_PIN_struct_size,
expected_BPF_PROG_GET_NEXT_ID_struct_size,
expected_BPF_PROG_GET_FD_BY_ID_struct_size,
expected_BPF_MAP_GET_FD_BY_ID_struct_size): Update.
* bpf.c (DEF_BPF_CMD_DECODER(BPF_OBJ_PIN)): Check the length, skip
printing the rest of attributes if it is less than offset of the
end of the bpf_fd field, print file_flags field otherwise.
(DEF_BPF_CMD_DECODER(BPF_PROG_GET_NEXT_ID),
DEF_BPF_CMD_DECODER(BPF_PROG_GET_FD_BY_ID),
DEF_BPF_CMD_DECODER(BPF_MAP_GET_FD_BY_ID)): Check the length, skip
printing the rest of attributes if it is less than offset of the
end of the next_id field, print open_flags field otherwise.
* xlat/bpf_file_mode_flags.in: New file.
* tests/bpf.c (BPF_OBJ_PIN_checks, BPF_PROG_GET_NEXT_ID_checks,
BPF_PROG_GET_FD_BY_ID_checks, BPF_MAP_GET_FD_BY_ID_checks): Check it.
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
#include "bpf_attr.h"
#include "xlat/bpf_commands.h"
+#include "xlat/bpf_file_mode_flags.h"
#include "xlat/bpf_map_types.h"
#include "xlat/bpf_map_flags.h"
#include "xlat/bpf_prog_types.h"
{
PRINT_FIELD_PATH("{", attr, pathname, tcp);
PRINT_FIELD_FD(", ", attr, bpf_fd, tcp);
+ if (len <= offsetofend(struct BPF_OBJ_PIN_struct, bpf_fd))
+ break;
+
+ /* file_flags field was added in Linux v4.15-rc1~84^2~384^2~4 */
+ PRINT_FIELD_FLAGS(", ", attr, file_flags, bpf_file_mode_flags,
+ "BPF_F_???");
}
END_BPF_CMD_DECODER(RVAL_DECODED | RVAL_FD)
{
PRINT_FIELD_U("{", attr, start_id);
PRINT_FIELD_U(", ", attr, next_id);
+ if (len <= offsetofend(struct BPF_PROG_GET_NEXT_ID_struct, next_id))
+ break;
+
+ /* open_flags field has been added in Linux v4.15-rc1~84^2~384^2~4 */
+ PRINT_FIELD_FLAGS(", ", attr, open_flags, bpf_file_mode_flags,
+ "BPF_F_???");
}
END_BPF_CMD_DECODER(RVAL_DECODED)
{
PRINT_FIELD_U("{", attr, prog_id);
PRINT_FIELD_U(", ", attr, next_id);
+ if (len <= offsetofend(struct BPF_PROG_GET_FD_BY_ID_struct, next_id))
+ break;
+
+ /* open_flags field has been added in Linux v4.15-rc1~84^2~384^2~4 */
+ PRINT_FIELD_FLAGS(", ", attr, open_flags, bpf_file_mode_flags,
+ "BPF_F_???");
}
END_BPF_CMD_DECODER(RVAL_DECODED)
{
PRINT_FIELD_U("{", attr, map_id);
PRINT_FIELD_U(", ", attr, next_id);
+ if (len <= offsetofend(struct BPF_MAP_GET_FD_BY_ID_struct, next_id))
+ break;
+
+ /* open_flags field has been added in Linux v4.15-rc1~84^2~384^2~4 */
+ PRINT_FIELD_FLAGS(", ", attr, open_flags, bpf_file_mode_flags,
+ "BPF_F_???");
}
END_BPF_CMD_DECODER(RVAL_DECODED)
struct BPF_OBJ_PIN_struct {
uint64_t ATTRIBUTE_ALIGNED(8) pathname;
uint32_t bpf_fd;
+ uint32_t file_flags;
};
#define BPF_OBJ_PIN_struct_size \
- offsetofend(struct BPF_OBJ_PIN_struct, bpf_fd)
-#define expected_BPF_OBJ_PIN_struct_size 12
+ sizeof(struct BPF_OBJ_PIN_struct)
+#define expected_BPF_OBJ_PIN_struct_size 16
#define BPF_OBJ_GET_struct BPF_OBJ_PIN_struct
#define BPF_OBJ_GET_struct_size BPF_OBJ_PIN_struct_size
struct BPF_PROG_GET_NEXT_ID_struct {
uint32_t start_id;
uint32_t next_id;
+ uint32_t open_flags;
};
#define BPF_PROG_GET_NEXT_ID_struct_size \
sizeof(struct BPF_PROG_GET_NEXT_ID_struct)
-#define expected_BPF_PROG_GET_NEXT_ID_struct_size 8
+#define expected_BPF_PROG_GET_NEXT_ID_struct_size 12
#define BPF_MAP_GET_NEXT_ID_struct BPF_PROG_GET_NEXT_ID_struct
#define BPF_MAP_GET_NEXT_ID_struct_size BPF_PROG_GET_NEXT_ID_struct_size
struct BPF_PROG_GET_FD_BY_ID_struct {
uint32_t prog_id;
uint32_t next_id;
+ uint32_t open_flags;
};
#define BPF_PROG_GET_FD_BY_ID_struct_size \
sizeof(struct BPF_PROG_GET_FD_BY_ID_struct)
-#define expected_BPF_PROG_GET_FD_BY_ID_struct_size 8
+#define expected_BPF_PROG_GET_FD_BY_ID_struct_size 12
struct BPF_MAP_GET_FD_BY_ID_struct {
uint32_t map_id;
uint32_t next_id;
+ uint32_t open_flags;
};
#define BPF_MAP_GET_FD_BY_ID_struct_size \
sizeof(struct BPF_MAP_GET_FD_BY_ID_struct)
-#define expected_BPF_MAP_GET_FD_BY_ID_struct_size 8
+#define expected_BPF_MAP_GET_FD_BY_ID_struct_size 12
struct BPF_OBJ_GET_INFO_BY_FD_struct /* info */ {
uint32_t bpf_fd;
.size = offsetofend(struct BPF_OBJ_PIN_struct, bpf_fd),
.init_fn = init_BPF_OBJ_PIN_attr,
.str = "pathname=\"/sys/fs/bpf/foo/bar\", bpf_fd=-1"
+ },
+ {
+ .data = { .BPF_OBJ_PIN_data = {
+ .bpf_fd = -1,
+ .file_flags = 0x18
+ } },
+ .size = offsetofend(struct BPF_OBJ_PIN_struct, file_flags),
+ .init_fn = init_BPF_OBJ_PIN_attr,
+ .str = "pathname=\"/sys/fs/bpf/foo/bar\", bpf_fd=-1"
+ ", file_flags=BPF_F_RDONLY|BPF_F_WRONLY"
}
};
} },
.size = offsetofend(struct BPF_PROG_GET_NEXT_ID_struct, next_id),
.str = "start_id=3134983661, next_id=3405705229"
+ },
+ {
+ .data = { .BPF_PROG_GET_NEXT_ID_data = {
+ .start_id = 0xbadc0ded,
+ .next_id = 0xcafef00d,
+ .open_flags = 0xffffff27
+ } },
+ .size = offsetofend(struct BPF_PROG_GET_NEXT_ID_struct, open_flags),
+ .str = "start_id=3134983661, next_id=3405705229"
+ ", open_flags=0xffffff27 /* BPF_F_??? */"
}
};
} },
.size = offsetofend(struct BPF_PROG_GET_FD_BY_ID_struct, next_id),
.str = "prog_id=3134983661, next_id=3405705229"
+ },
+ {
+ .data = { .BPF_PROG_GET_FD_BY_ID_data = {
+ .prog_id = 0xbadc0ded,
+ .next_id = 0xcafef00d,
+ .open_flags = 0xffffff27
+ } },
+ .size = offsetofend(struct BPF_PROG_GET_FD_BY_ID_struct, open_flags),
+ .str = "prog_id=3134983661, next_id=3405705229"
+ ", open_flags=0xffffff27 /* BPF_F_??? */"
}
};
} },
.size = offsetofend(struct BPF_MAP_GET_FD_BY_ID_struct, next_id),
.str = "map_id=3134983661, next_id=3405705229"
+ },
+ {
+ .data = { .BPF_MAP_GET_FD_BY_ID_data = {
+ .map_id = 0xbadc0ded,
+ .next_id = 0xcafef00d,
+ .open_flags = 0xffffff27
+ } },
+ .size = offsetofend(struct BPF_MAP_GET_FD_BY_ID_struct, open_flags),
+ .str = "map_id=3134983661, next_id=3405705229"
+ ", open_flags=0xffffff27 /* BPF_F_??? */"
}
};
--- /dev/null
+BPF_F_RDONLY (1U << 3)
+BPF_F_WRONLY (1U << 4)