]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
tests: (test_mkfds::bpf-prog) report id and tag
authorMasatake YAMATO <yamato@redhat.com>
Fri, 25 Oct 2024 20:32:47 +0000 (05:32 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Fri, 25 Oct 2024 20:55:36 +0000 (05:55 +0900)
Signed-off-by: Masatake YAMATO <yamato@redhat.com>
tests/helpers/test_mkfds.c
tests/ts/lsfd/mkfds-bpf-prog

index 677d34f8745f3be88e66b8d3744bf0dedc85aea7..a85abd229c382c7b9d7ce2fc9b47e9c8117abb52 100644 (file)
@@ -2644,6 +2644,8 @@ static void *make_bpf_prog(const struct factory *factory, struct fdesc fdescs[],
                },
        };
 
+       struct bpf_prog_info info = {};
+
        memset(&attr, 0, sizeof(attr));
        attr.prog_type = iprog_type_id;
        attr.insns = (uint64_t)(unsigned long)insns;
@@ -2658,6 +2660,14 @@ static void *make_bpf_prog(const struct factory *factory, struct fdesc fdescs[],
        if (bfd < 0)
                err_nosys(EXIT_FAILURE, "failed in bpf(BPF_PROG_LOAD)");
 
+
+       memset(&attr, 0, sizeof(attr));
+       attr.info.bpf_fd = bfd;
+       attr.info.info_len = sizeof(info);
+       attr.info.info = (uint64_t)(unsigned long)&info;
+       if (syscall(SYS_bpf, BPF_OBJ_GET_INFO_BY_FD, &attr, sizeof(attr)) < 0)
+               err_nosys(EXIT_FAILURE, "failed in bpf(BPF_OBJ_GET_INFO_BY_FD)");
+
        if (bfd != fdescs[0].fd) {
                if (dup2(bfd, fdescs[0].fd) < 0) {
                        err(EXIT_FAILURE, "failed to dup %d -> %d", bfd, fdescs[0].fd);
@@ -2671,7 +2681,38 @@ static void *make_bpf_prog(const struct factory *factory, struct fdesc fdescs[],
                .data  = NULL
        };
 
-       return NULL;
+       return xmemdup(&info, sizeof(info));
+}
+
+enum ritem_bpf_prog {
+       RITEM_BPF_PROG_ID,
+       RITEM_BPF_PROG_TAG,
+};
+
+static void report_bpf_prog(const struct factory *factory _U_,
+                           int nth, void *data, FILE *fp)
+{
+       struct bpf_prog_info *info = data;
+
+       switch (nth) {
+       case RITEM_BPF_PROG_ID:
+               fprintf(fp, "%u", info->id);
+               break;
+       case RITEM_BPF_PROG_TAG:
+               for (size_t i = 0; i < BPF_TAG_SIZE; i++) {
+                       unsigned char ch = (info->tag[i] >> 4);
+                       unsigned char cl = info->tag[i] & 0x0f;
+
+                       fprintf(fp, "%x", (unsigned int)ch);
+                       fprintf(fp, "%x", (unsigned int)cl);
+               }
+               break;
+       }
+}
+
+static void free_bpf_prog(const struct factory * factory _U_, void *data)
+{
+       free(data);
 }
 
 static void *make_some_pipes(const struct factory *factory _U_, struct fdesc fdescs[],
@@ -3929,7 +3970,10 @@ static const struct factory factories[] = {
                .priv = true,
                .N    = 1,
                .EX_N = 0,
+               .EX_O = 2,
                .make = make_bpf_prog,
+               .report = report_bpf_prog,
+               .free = free_bpf_prog,
                .params = (struct parameter []) {
                        {
                                .name = "prog-type-id",
@@ -3944,7 +3988,11 @@ static const struct factory factories[] = {
                                .defv.string = "mkfds_bpf_prog",
                        },
                        PARAM_END
-               }
+               },
+               .o_descs = (const char *[]) {
+                       [RITEM_BPF_PROG_ID]  = "the id of bpf prog object",
+                       [RITEM_BPF_PROG_TAG] = "the tag of bpf prog object",
+               },
        },
        {
                .name = "multiplexing",
index b2a7275f66da0d89a6226a8fad5c851f8e487c4b..1c1df1ef59f94bce958f528a8a8370a0a390dcc6 100755 (executable)
@@ -33,7 +33,7 @@ FD=3
 NAME=mkdfs_prog
 {
     coproc MKFDS { "$TS_HELPER_MKFDS" bpf-prog "$FD" prog-type-id=2 name="$NAME"; }
-    if read -r -u "${MKFDS[0]}" PID; then
+    if read -r -u "${MKFDS[0]}" PID UNUSED; then
        "${TS_CMD_LSFD}" -r -n -oBPF-PROG.TYPE,BPF-PROG.TYPE.RAW,BPF.NAME -p "${PID}" -Q "(FD == $FD)"
        echo "BPF-PROG.TYPE,BPF-PROG.TYPE.RAW,BPF.NAME": $?