blob: ce6812558287a415d2b1ee42058ccb84ff490a1d [file] [log] [blame]
David Ahernd39aec72020-05-29 16:07:16 -06001// SPDX-License-Identifier: GPL-2.0
2#include <uapi/linux/bpf.h>
3#include <linux/if_link.h>
4#include <test_progs.h>
5
6#include "test_xdp_devmap_helpers.skel.h"
Lorenzo Bianconi0c5e1182022-01-21 11:10:05 +01007#include "test_xdp_with_devmap_frags_helpers.skel.h"
David Ahernd39aec72020-05-29 16:07:16 -06008#include "test_xdp_with_devmap_helpers.skel.h"
9
10#define IFINDEX_LO 1
11
Andrii Nakryiko6972dc32021-10-22 15:32:25 -070012static void test_xdp_with_devmap_helpers(void)
David Ahernd39aec72020-05-29 16:07:16 -060013{
14 struct test_xdp_with_devmap_helpers *skel;
15 struct bpf_prog_info info = {};
16 struct bpf_devmap_val val = {
17 .ifindex = IFINDEX_LO,
18 };
19 __u32 len = sizeof(info);
David Ahernd39aec72020-05-29 16:07:16 -060020 int err, dm_fd, map_fd;
Kumar Kartikeya Dwivedi36246d52021-07-02 16:48:25 +053021 __u32 idx = 0;
David Ahernd39aec72020-05-29 16:07:16 -060022
23
24 skel = test_xdp_with_devmap_helpers__open_and_load();
Kumar Kartikeya Dwivedi36246d52021-07-02 16:48:25 +053025 if (!ASSERT_OK_PTR(skel, "test_xdp_with_devmap_helpers__open_and_load"))
David Ahernd39aec72020-05-29 16:07:16 -060026 return;
David Ahernd39aec72020-05-29 16:07:16 -060027
David Ahernd39aec72020-05-29 16:07:16 -060028 dm_fd = bpf_program__fd(skel->progs.xdp_redir_prog);
Andrii Nakryikoe4e284a2022-02-02 14:59:15 -080029 err = bpf_xdp_attach(IFINDEX_LO, dm_fd, XDP_FLAGS_SKB_MODE, NULL);
Kumar Kartikeya Dwivedi36246d52021-07-02 16:48:25 +053030 if (!ASSERT_OK(err, "Generic attach of program with 8-byte devmap"))
31 goto out_close;
32
Andrii Nakryikoe4e284a2022-02-02 14:59:15 -080033 err = bpf_xdp_detach(IFINDEX_LO, XDP_FLAGS_SKB_MODE, NULL);
Kumar Kartikeya Dwivedi36246d52021-07-02 16:48:25 +053034 ASSERT_OK(err, "XDP program detach");
David Ahernd39aec72020-05-29 16:07:16 -060035
36 dm_fd = bpf_program__fd(skel->progs.xdp_dummy_dm);
37 map_fd = bpf_map__fd(skel->maps.dm_ports);
Ilya Leoshkevichc5a237a2023-02-15 00:12:18 +010038 err = bpf_prog_get_info_by_fd(dm_fd, &info, &len);
39 if (!ASSERT_OK(err, "bpf_prog_get_info_by_fd"))
David Ahernd39aec72020-05-29 16:07:16 -060040 goto out_close;
41
42 val.bpf_prog.fd = dm_fd;
43 err = bpf_map_update_elem(map_fd, &idx, &val, 0);
Kumar Kartikeya Dwivedi36246d52021-07-02 16:48:25 +053044 ASSERT_OK(err, "Add program to devmap entry");
David Ahernd39aec72020-05-29 16:07:16 -060045
46 err = bpf_map_lookup_elem(map_fd, &idx, &val);
Kumar Kartikeya Dwivedi36246d52021-07-02 16:48:25 +053047 ASSERT_OK(err, "Read devmap entry");
48 ASSERT_EQ(info.id, val.bpf_prog.id, "Match program id to devmap entry prog_id");
David Ahernd39aec72020-05-29 16:07:16 -060049
50 /* can not attach BPF_XDP_DEVMAP program to a device */
Andrii Nakryikoe4e284a2022-02-02 14:59:15 -080051 err = bpf_xdp_attach(IFINDEX_LO, dm_fd, XDP_FLAGS_SKB_MODE, NULL);
Kumar Kartikeya Dwivedi36246d52021-07-02 16:48:25 +053052 if (!ASSERT_NEQ(err, 0, "Attach of BPF_XDP_DEVMAP program"))
Andrii Nakryikoe4e284a2022-02-02 14:59:15 -080053 bpf_xdp_detach(IFINDEX_LO, XDP_FLAGS_SKB_MODE, NULL);
David Ahernd39aec72020-05-29 16:07:16 -060054
55 val.ifindex = 1;
56 val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_prog);
57 err = bpf_map_update_elem(map_fd, &idx, &val, 0);
Kumar Kartikeya Dwivedi36246d52021-07-02 16:48:25 +053058 ASSERT_NEQ(err, 0, "Add non-BPF_XDP_DEVMAP program to devmap entry");
David Ahernd39aec72020-05-29 16:07:16 -060059
Lorenzo Bianconi0c5e1182022-01-21 11:10:05 +010060 /* Try to attach BPF_XDP program with frags to devmap when we have
61 * already loaded a BPF_XDP program on the map
62 */
63 idx = 1;
64 val.ifindex = 1;
65 val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_dm_frags);
66 err = bpf_map_update_elem(map_fd, &idx, &val, 0);
67 ASSERT_NEQ(err, 0, "Add BPF_XDP program with frags to devmap entry");
68
David Ahernd39aec72020-05-29 16:07:16 -060069out_close:
70 test_xdp_with_devmap_helpers__destroy(skel);
71}
72
Andrii Nakryiko6972dc32021-10-22 15:32:25 -070073static void test_neg_xdp_devmap_helpers(void)
David Ahernd39aec72020-05-29 16:07:16 -060074{
75 struct test_xdp_devmap_helpers *skel;
David Ahernd39aec72020-05-29 16:07:16 -060076
77 skel = test_xdp_devmap_helpers__open_and_load();
Kumar Kartikeya Dwivedi36246d52021-07-02 16:48:25 +053078 if (!ASSERT_EQ(skel, NULL,
79 "Load of XDP program accessing egress ifindex without attach type")) {
David Ahernd39aec72020-05-29 16:07:16 -060080 test_xdp_devmap_helpers__destroy(skel);
81 }
82}
83
Hou Tao5912fcb2022-02-08 14:54:44 +080084static void test_xdp_with_devmap_frags_helpers(void)
Lorenzo Bianconi0c5e1182022-01-21 11:10:05 +010085{
86 struct test_xdp_with_devmap_frags_helpers *skel;
87 struct bpf_prog_info info = {};
88 struct bpf_devmap_val val = {
89 .ifindex = IFINDEX_LO,
90 };
91 __u32 len = sizeof(info);
92 int err, dm_fd_frags, map_fd;
93 __u32 idx = 0;
94
95 skel = test_xdp_with_devmap_frags_helpers__open_and_load();
96 if (!ASSERT_OK_PTR(skel, "test_xdp_with_devmap_helpers__open_and_load"))
97 return;
98
99 dm_fd_frags = bpf_program__fd(skel->progs.xdp_dummy_dm_frags);
100 map_fd = bpf_map__fd(skel->maps.dm_ports);
Ilya Leoshkevichc5a237a2023-02-15 00:12:18 +0100101 err = bpf_prog_get_info_by_fd(dm_fd_frags, &info, &len);
102 if (!ASSERT_OK(err, "bpf_prog_get_info_by_fd"))
Lorenzo Bianconi0c5e1182022-01-21 11:10:05 +0100103 goto out_close;
104
105 val.bpf_prog.fd = dm_fd_frags;
106 err = bpf_map_update_elem(map_fd, &idx, &val, 0);
107 ASSERT_OK(err, "Add frags program to devmap entry");
108
109 err = bpf_map_lookup_elem(map_fd, &idx, &val);
110 ASSERT_OK(err, "Read devmap entry");
111 ASSERT_EQ(info.id, val.bpf_prog.id,
112 "Match program id to devmap entry prog_id");
113
114 /* Try to attach BPF_XDP program to devmap when we have
115 * already loaded a BPF_XDP program with frags on the map
116 */
117 idx = 1;
118 val.ifindex = 1;
119 val.bpf_prog.fd = bpf_program__fd(skel->progs.xdp_dummy_dm);
120 err = bpf_map_update_elem(map_fd, &idx, &val, 0);
121 ASSERT_NEQ(err, 0, "Add BPF_XDP program to devmap entry");
122
123out_close:
124 test_xdp_with_devmap_frags_helpers__destroy(skel);
125}
David Ahernd39aec72020-05-29 16:07:16 -0600126
Yucong Sund3f7b162021-10-06 11:56:19 -0700127void serial_test_xdp_devmap_attach(void)
David Ahernd39aec72020-05-29 16:07:16 -0600128{
129 if (test__start_subtest("DEVMAP with programs in entries"))
130 test_xdp_with_devmap_helpers();
131
Lorenzo Bianconi0c5e1182022-01-21 11:10:05 +0100132 if (test__start_subtest("DEVMAP with frags programs in entries"))
133 test_xdp_with_devmap_frags_helpers();
134
David Ahernd39aec72020-05-29 16:07:16 -0600135 if (test__start_subtest("Verifier check of DEVMAP programs"))
136 test_neg_xdp_devmap_helpers();
137}