[PATCH 3/6] bpf: implement decoding of BPF_PROG_LOAD fd_array field
Paul Chaignon
paul at isovalent.com
Wed Dec 29 18:25:13 UTC 2021
* src/bpf_attr.h (BPF_PROG_LOAD_struct): Add fd_array field introduced by
Linux kernel commit v5.6-rc1~151^2~46^2~37^2~5.
(expected_BPF_PROG_LOAD_struct_size): Update.
* src/bpf.c (BEGIN_BPF_CMD_DECODER(BPF_PROG_LOAD)): Decode the new field.
* NEWS: Mention this.
* tests/bpf-obj_get_info_by_fd.c (print_prog_load): Update expected
output.
* tests/bpf.c (BPF_PROG_LOAD_checks): Likewise.
* tests/kernel_version.c (print_bpf_attr): Likewise.
Signed-off-by: Paul Chaignon <paul at isovalent.com>
---
NEWS | 2 +-
src/bpf.c | 6 ++++++
src/bpf_attr.h | 6 ++++--
tests/bpf-obj_get_info_by_fd.c | 2 ++
tests/bpf.c | 5 +++--
tests/kernel_version.c | 3 ++-
6 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/NEWS b/NEWS
index a890f6226..aa6a2385c 100644
--- a/NEWS
+++ b/NEWS
@@ -4,7 +4,7 @@ Noteworthy changes in release ?.?? (????-??-??)
* Improvements
* Updated lists of ioctl commands from Linux 5.16.
* Updated lists of BPF_* constants.
- * Enhanced decoding of BPF_MAP_CREATE bpf syscall command.
+ * Enhanced decoding of BPF_MAP_CREATE and BPF_PROG_LOAD bpf syscall commands.
* Bug fixes
diff --git a/src/bpf.c b/src/bpf.c
index 5c1e7d7ba..c909d93cf 100644
--- a/src/bpf.c
+++ b/src/bpf.c
@@ -414,6 +414,12 @@ BEGIN_BPF_CMD_DECODER(BPF_PROG_LOAD)
break;
tprint_struct_next();
PRINT_FIELD_FD(attr, attach_prog_fd, tcp);
+
+ /* fd_array was added in Linux commit v5.14-rc1~119^2~501^2~2^2~13. */
+ if (len <= offsetof(struct BPF_PROG_LOAD_struct, fd_array))
+ break;
+ tprint_struct_next();
+ PRINT_FIELD_ADDR64(attr, fd_array);
}
END_BPF_CMD_DECODER(RVAL_DECODED | RVAL_FD)
diff --git a/src/bpf_attr.h b/src/bpf_attr.h
index 7dad083dd..45e866e1e 100644
--- a/src/bpf_attr.h
+++ b/src/bpf_attr.h
@@ -128,11 +128,13 @@ struct BPF_PROG_LOAD_struct {
uint32_t line_info_cnt;
uint32_t attach_btf_id;
uint32_t attach_prog_fd;
+ uint32_t pad;
+ uint64_t ATTRIBUTE_ALIGNED(8) fd_array;
};
# define BPF_PROG_LOAD_struct_size \
- offsetofend(struct BPF_PROG_LOAD_struct, attach_prog_fd)
-# define expected_BPF_PROG_LOAD_struct_size 116
+ sizeof(struct BPF_PROG_LOAD_struct)
+# define expected_BPF_PROG_LOAD_struct_size 128
struct BPF_OBJ_PIN_struct {
uint64_t ATTRIBUTE_ALIGNED(8) pathname;
diff --git a/tests/bpf-obj_get_info_by_fd.c b/tests/bpf-obj_get_info_by_fd.c
index e2123eeee..95392cd53 100644
--- a/tests/bpf-obj_get_info_by_fd.c
+++ b/tests/bpf-obj_get_info_by_fd.c
@@ -231,6 +231,8 @@ print_prog_load(void *attr_void, size_t size, long rc)
printf(", attach_btf_id=0");
if (size > offsetof(struct BPF_PROG_LOAD_struct, attach_prog_fd))
printf(", attach_prog_fd=0</dev/null>");
+ if (size > offsetof(struct BPF_PROG_LOAD_struct, fd_array))
+ printf(", fd_array=NULL");
printf("}, %zu) = ", size);
if (rc >= 0)
printf("%ld<anon_inode:bpf-prog>\n", rc);
diff --git a/tests/bpf.c b/tests/bpf.c
index befb34cbd..eeba43821 100644
--- a/tests/bpf.c
+++ b/tests/bpf.c
@@ -786,9 +786,9 @@ static struct bpf_attr_check BPF_PROG_LOAD_checks[] = {
.line_info_cnt = 0xdad7bef8,
.attach_btf_id = 0xdad7befa,
.attach_prog_fd = 0xbadc0def,
+ .fd_array = 0xfaceb00c,
} },
- .size = offsetofend(struct BPF_PROG_LOAD_struct,
- attach_prog_fd),
+ .size = offsetofend(struct BPF_PROG_LOAD_struct, fd_array),
.str = "prog_type=BPF_PROG_TYPE_UNSPEC"
", insn_cnt=0"
", insns=NULL"
@@ -810,6 +810,7 @@ static struct bpf_attr_check BPF_PROG_LOAD_checks[] = {
", line_info_cnt=3671572216"
", attach_btf_id=3671572218"
", attach_prog_fd=-1159983633"
+ ", fd_array=0xfaceb00c"
},
};
diff --git a/tests/kernel_version.c b/tests/kernel_version.c
index fc270cd2a..228d3bccd 100644
--- a/tests/kernel_version.c
+++ b/tests/kernel_version.c
@@ -71,7 +71,8 @@ print_bpf_attr(void)
", line_info=NULL"
", line_info_cnt=0"
", attach_btf_id=0"
- ", attach_prog_fd=0}");
+ ", attach_prog_fd=0"
+ ", fd_array=NULL}");
}
int
--
2.25.1
More information about the Strace-devel
mailing list