]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/bpf: Use bpf_link attachments in test_sockmap
authorGeliang Tang <tanggeliang@kylinos.cn>
Thu, 23 May 2024 06:49:59 +0000 (14:49 +0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Mon, 3 Jun 2024 17:32:54 +0000 (19:32 +0200)
Switch attachments to bpf_link using bpf_program__attach_sockmap() instead
of bpf_prog_attach().

This patch adds a new array progs[] to replace prog_fd[] array, set in
populate_progs() for each program in bpf object.

And another new array links[] to save the attached bpf_link. It is
initalized as NULL in populate_progs, set as the return valuses of
bpf_program__attach_sockmap(), and detached by bpf_link__detach().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Tested-by: Jakub Sitnicki <jakub@cloudflare.com>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/32cf8376a810e2e9c719f8e4cfb97132ed2d1f9c.1716446893.git.tanggeliang@kylinos.cn
tools/testing/selftests/bpf/test_sockmap.c

index 6d724fea59fbf2fc44a854946483ad6dbc22a9c1..81e7a57c727c482d1b4d3bb61d3a68aeca8e3673 100644 (file)
@@ -64,6 +64,8 @@ int failed;
 int map_fd[9];
 struct bpf_map *maps[9];
 int prog_fd[9];
+struct bpf_program *progs[9];
+struct bpf_link *links[9];
 
 int txmsg_pass;
 int txmsg_redir;
@@ -960,43 +962,39 @@ static int run_options(struct sockmap_options *options, int cg_fd,  int test)
 
        /* Attach programs to sockmap */
        if (!txmsg_omit_skb_parser) {
-               err = bpf_prog_attach(prog_fd[0], map_fd[0],
-                                     BPF_SK_SKB_STREAM_PARSER, 0);
-               if (err) {
+               links[0] = bpf_program__attach_sockmap(progs[0], map_fd[0]);
+               if (!links[0]) {
                        fprintf(stderr,
-                               "ERROR: bpf_prog_attach (sockmap %i->%i): %d (%s)\n",
-                               prog_fd[0], map_fd[0], err, strerror(errno));
-                       return err;
+                               "ERROR: bpf_program__attach_sockmap (sockmap %i->%i): (%s)\n",
+                               bpf_program__fd(progs[0]), map_fd[0], strerror(errno));
+                       return -1;
                }
        }
 
-       err = bpf_prog_attach(prog_fd[1], map_fd[0],
-                               BPF_SK_SKB_STREAM_VERDICT, 0);
-       if (err) {
-               fprintf(stderr, "ERROR: bpf_prog_attach (sockmap): %d (%s)\n",
-                       err, strerror(errno));
-               return err;
+       links[1] = bpf_program__attach_sockmap(progs[1], map_fd[0]);
+       if (!links[1]) {
+               fprintf(stderr, "ERROR: bpf_program__attach_sockmap (sockmap): (%s)\n",
+                       strerror(errno));
+               return -1;
        }
 
        /* Attach programs to TLS sockmap */
        if (txmsg_ktls_skb) {
                if (!txmsg_omit_skb_parser) {
-                       err = bpf_prog_attach(prog_fd[0], map_fd[8],
-                                             BPF_SK_SKB_STREAM_PARSER, 0);
-                       if (err) {
+                       links[2] = bpf_program__attach_sockmap(progs[0], map_fd[8]);
+                       if (!links[2]) {
                                fprintf(stderr,
-                                       "ERROR: bpf_prog_attach (TLS sockmap %i->%i): %d (%s)\n",
-                                       prog_fd[0], map_fd[8], err, strerror(errno));
-                               return err;
+                                       "ERROR: bpf_program__attach_sockmap (TLS sockmap %i->%i): (%s)\n",
+                                       bpf_program__fd(progs[0]), map_fd[8], strerror(errno));
+                               return -1;
                        }
                }
 
-               err = bpf_prog_attach(prog_fd[2], map_fd[8],
-                                     BPF_SK_SKB_STREAM_VERDICT, 0);
-               if (err) {
-                       fprintf(stderr, "ERROR: bpf_prog_attach (TLS sockmap): %d (%s)\n",
-                               err, strerror(errno));
-                       return err;
+               links[3] = bpf_program__attach_sockmap(progs[2], map_fd[8]);
+               if (!links[3]) {
+                       fprintf(stderr, "ERROR: bpf_program__attach_sockmap (TLS sockmap): (%s)\n",
+                               strerror(errno));
+                       return -1;
                }
        }
 
@@ -1281,10 +1279,11 @@ run:
 out:
        /* Detatch and zero all the maps */
        bpf_prog_detach2(prog_fd[3], cg_fd, BPF_CGROUP_SOCK_OPS);
-       bpf_prog_detach2(prog_fd[0], map_fd[0], BPF_SK_SKB_STREAM_PARSER);
-       bpf_prog_detach2(prog_fd[1], map_fd[0], BPF_SK_SKB_STREAM_VERDICT);
-       bpf_prog_detach2(prog_fd[0], map_fd[8], BPF_SK_SKB_STREAM_PARSER);
-       bpf_prog_detach2(prog_fd[2], map_fd[8], BPF_SK_SKB_STREAM_VERDICT);
+
+       for (i = 0; i < ARRAY_SIZE(links); i++) {
+               if (links[i])
+                       bpf_link__detach(links[i]);
+       }
 
        if (tx_prog_fd > 0)
                bpf_prog_detach2(tx_prog_fd, map_fd[1], BPF_SK_MSG_VERDICT);
@@ -1805,6 +1804,7 @@ static int populate_progs(char *bpf_file)
        i = bpf_object__load(obj);
        i = 0;
        bpf_object__for_each_program(prog, obj) {
+               progs[i] = prog;
                prog_fd[i] = bpf_program__fd(prog);
                i++;
        }
@@ -1819,6 +1819,9 @@ static int populate_progs(char *bpf_file)
                }
        }
 
+       for (i = 0; i < ARRAY_SIZE(links); i++)
+               links[i] = NULL;
+
        return 0;
 }