]> granicus.if.org Git - strace/commitdiff
bpf: add support for file mode flags
authorEugene Syromyatnikov <evgsyr@gmail.com>
Mon, 26 Feb 2018 18:40:08 +0000 (19:40 +0100)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 4 Apr 2018 16:33:19 +0000 (16:33 +0000)
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>
bpf.c
bpf_attr.h
tests/bpf.c
xlat/bpf_file_mode_flags.in [new file with mode: 0644]

diff --git a/bpf.c b/bpf.c
index 0a12f342ed056d0140de87eb9d9bf9737c8813ee..5d79e5b4c38447d784337897868d71a85b51bf03 100644 (file)
--- a/bpf.c
+++ b/bpf.c
@@ -36,6 +36,7 @@
 #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"
@@ -187,6 +188,12 @@ BEGIN_BPF_CMD_DECODER(BPF_OBJ_PIN)
 {
        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)
 
@@ -227,6 +234,12 @@ BEGIN_BPF_CMD_DECODER(BPF_PROG_GET_NEXT_ID)
 {
        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)
 
@@ -236,6 +249,12 @@ BEGIN_BPF_CMD_DECODER(BPF_PROG_GET_FD_BY_ID)
 {
        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)
 
@@ -243,6 +262,12 @@ BEGIN_BPF_CMD_DECODER(BPF_MAP_GET_FD_BY_ID)
 {
        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)
 
index f284e6d36f8a773d54f6fe2fa917598e0567e09e..664968389d9c73bee256f49c62a65c0dc64cea89 100644 (file)
@@ -101,11 +101,12 @@ struct BPF_PROG_LOAD_struct {
 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
@@ -149,11 +150,12 @@ struct BPF_PROG_TEST_RUN_struct /* test */ {
 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
@@ -161,20 +163,22 @@ struct BPF_PROG_GET_NEXT_ID_struct {
 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;
index 21d1c49b820533dd606029c9cb2bbe002ed39c07..2c111a1248139e9542155029d1efdd4a4ede77aa 100644 (file)
@@ -392,6 +392,16 @@ static struct bpf_attr_check BPF_OBJ_PIN_checks[] = {
                .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"
        }
 };
 
@@ -478,6 +488,16 @@ static const struct bpf_attr_check BPF_PROG_GET_NEXT_ID_checks[] = {
                } },
                .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_??? */"
        }
 };
 
@@ -498,6 +518,16 @@ static const struct bpf_attr_check BPF_PROG_GET_FD_BY_ID_checks[] = {
                } },
                .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_??? */"
        }
 };
 
@@ -516,6 +546,16 @@ static const struct bpf_attr_check BPF_MAP_GET_FD_BY_ID_checks[] = {
                } },
                .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_??? */"
        }
 };
 
diff --git a/xlat/bpf_file_mode_flags.in b/xlat/bpf_file_mode_flags.in
new file mode 100644 (file)
index 0000000..c345891
--- /dev/null
@@ -0,0 +1,2 @@
+BPF_F_RDONLY   (1U << 3)
+BPF_F_WRONLY   (1U << 4)