261 lines · c
1// SPDX-License-Identifier: GPL-2.02// Copyright (c) 2018 Facebook3#include <test_progs.h>4 5static int duration = 0;6 7struct sec_name_test {8 const char sec_name[32];9 struct {10 int rc;11 enum bpf_prog_type prog_type;12 enum bpf_attach_type expected_attach_type;13 } expected_load;14 struct {15 int rc;16 enum bpf_attach_type attach_type;17 } expected_attach;18};19 20static struct sec_name_test tests[] = {21 {"InvAliD", {-ESRCH, 0, 0}, {-EINVAL, 0} },22 {"cgroup", {-ESRCH, 0, 0}, {-EINVAL, 0} },23 {"socket", {0, BPF_PROG_TYPE_SOCKET_FILTER, 0}, {-EINVAL, 0} },24 {"kprobe/", {0, BPF_PROG_TYPE_KPROBE, 0}, {-EINVAL, 0} },25 {"uprobe/", {0, BPF_PROG_TYPE_KPROBE, 0}, {-EINVAL, 0} },26 {"kretprobe/", {0, BPF_PROG_TYPE_KPROBE, 0}, {-EINVAL, 0} },27 {"uretprobe/", {0, BPF_PROG_TYPE_KPROBE, 0}, {-EINVAL, 0} },28 {"classifier", {0, BPF_PROG_TYPE_SCHED_CLS, 0}, {-EINVAL, 0} },29 {"action", {0, BPF_PROG_TYPE_SCHED_ACT, 0}, {-EINVAL, 0} },30 {"tracepoint/", {0, BPF_PROG_TYPE_TRACEPOINT, 0}, {-EINVAL, 0} },31 {"tp/", {0, BPF_PROG_TYPE_TRACEPOINT, 0}, {-EINVAL, 0} },32 {33 "raw_tracepoint/",34 {0, BPF_PROG_TYPE_RAW_TRACEPOINT, 0},35 {-EINVAL, 0},36 },37 {"raw_tp/", {0, BPF_PROG_TYPE_RAW_TRACEPOINT, 0}, {-EINVAL, 0} },38 {"xdp", {0, BPF_PROG_TYPE_XDP, BPF_XDP}, {0, BPF_XDP} },39 {"perf_event", {0, BPF_PROG_TYPE_PERF_EVENT, 0}, {-EINVAL, 0} },40 {"lwt_in", {0, BPF_PROG_TYPE_LWT_IN, 0}, {-EINVAL, 0} },41 {"lwt_out", {0, BPF_PROG_TYPE_LWT_OUT, 0}, {-EINVAL, 0} },42 {"lwt_xmit", {0, BPF_PROG_TYPE_LWT_XMIT, 0}, {-EINVAL, 0} },43 {"lwt_seg6local", {0, BPF_PROG_TYPE_LWT_SEG6LOCAL, 0}, {-EINVAL, 0} },44 {45 "cgroup_skb/ingress",46 {0, BPF_PROG_TYPE_CGROUP_SKB, BPF_CGROUP_INET_INGRESS},47 {0, BPF_CGROUP_INET_INGRESS},48 },49 {50 "cgroup_skb/egress",51 {0, BPF_PROG_TYPE_CGROUP_SKB, BPF_CGROUP_INET_EGRESS},52 {0, BPF_CGROUP_INET_EGRESS},53 },54 {"cgroup/skb", {0, BPF_PROG_TYPE_CGROUP_SKB, 0}, {-EINVAL, 0} },55 {56 "cgroup/sock",57 {0, BPF_PROG_TYPE_CGROUP_SOCK, BPF_CGROUP_INET_SOCK_CREATE},58 {0, BPF_CGROUP_INET_SOCK_CREATE},59 },60 {61 "cgroup/post_bind4",62 {0, BPF_PROG_TYPE_CGROUP_SOCK, BPF_CGROUP_INET4_POST_BIND},63 {0, BPF_CGROUP_INET4_POST_BIND},64 },65 {66 "cgroup/post_bind6",67 {0, BPF_PROG_TYPE_CGROUP_SOCK, BPF_CGROUP_INET6_POST_BIND},68 {0, BPF_CGROUP_INET6_POST_BIND},69 },70 {71 "cgroup/dev",72 {0, BPF_PROG_TYPE_CGROUP_DEVICE, BPF_CGROUP_DEVICE},73 {0, BPF_CGROUP_DEVICE},74 },75 {76 "sockops",77 {0, BPF_PROG_TYPE_SOCK_OPS, BPF_CGROUP_SOCK_OPS},78 {0, BPF_CGROUP_SOCK_OPS},79 },80 {81 "sk_skb/stream_parser",82 {0, BPF_PROG_TYPE_SK_SKB, BPF_SK_SKB_STREAM_PARSER},83 {0, BPF_SK_SKB_STREAM_PARSER},84 },85 {86 "sk_skb/stream_verdict",87 {0, BPF_PROG_TYPE_SK_SKB, BPF_SK_SKB_STREAM_VERDICT},88 {0, BPF_SK_SKB_STREAM_VERDICT},89 },90 {"sk_skb", {0, BPF_PROG_TYPE_SK_SKB, 0}, {-EINVAL, 0} },91 {92 "sk_msg",93 {0, BPF_PROG_TYPE_SK_MSG, BPF_SK_MSG_VERDICT},94 {0, BPF_SK_MSG_VERDICT},95 },96 {97 "lirc_mode2",98 {0, BPF_PROG_TYPE_LIRC_MODE2, BPF_LIRC_MODE2},99 {0, BPF_LIRC_MODE2},100 },101 {102 "flow_dissector",103 {0, BPF_PROG_TYPE_FLOW_DISSECTOR, BPF_FLOW_DISSECTOR},104 {0, BPF_FLOW_DISSECTOR},105 },106 {107 "cgroup/bind4",108 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_BIND},109 {0, BPF_CGROUP_INET4_BIND},110 },111 {112 "cgroup/bind6",113 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_BIND},114 {0, BPF_CGROUP_INET6_BIND},115 },116 {117 "cgroup/connect4",118 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_CONNECT},119 {0, BPF_CGROUP_INET4_CONNECT},120 },121 {122 "cgroup/connect6",123 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_CONNECT},124 {0, BPF_CGROUP_INET6_CONNECT},125 },126 {127 "cgroup/connect_unix",128 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_CONNECT},129 {0, BPF_CGROUP_UNIX_CONNECT},130 },131 {132 "cgroup/sendmsg4",133 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_SENDMSG},134 {0, BPF_CGROUP_UDP4_SENDMSG},135 },136 {137 "cgroup/sendmsg6",138 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_SENDMSG},139 {0, BPF_CGROUP_UDP6_SENDMSG},140 },141 {142 "cgroup/sendmsg_unix",143 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_SENDMSG},144 {0, BPF_CGROUP_UNIX_SENDMSG},145 },146 {147 "cgroup/recvmsg4",148 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_RECVMSG},149 {0, BPF_CGROUP_UDP4_RECVMSG},150 },151 {152 "cgroup/recvmsg6",153 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_RECVMSG},154 {0, BPF_CGROUP_UDP6_RECVMSG},155 },156 {157 "cgroup/recvmsg_unix",158 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_RECVMSG},159 {0, BPF_CGROUP_UNIX_RECVMSG},160 },161 {162 "cgroup/sysctl",163 {0, BPF_PROG_TYPE_CGROUP_SYSCTL, BPF_CGROUP_SYSCTL},164 {0, BPF_CGROUP_SYSCTL},165 },166 {167 "cgroup/getsockopt",168 {0, BPF_PROG_TYPE_CGROUP_SOCKOPT, BPF_CGROUP_GETSOCKOPT},169 {0, BPF_CGROUP_GETSOCKOPT},170 },171 {172 "cgroup/setsockopt",173 {0, BPF_PROG_TYPE_CGROUP_SOCKOPT, BPF_CGROUP_SETSOCKOPT},174 {0, BPF_CGROUP_SETSOCKOPT},175 },176 {177 "cgroup/getpeername4",178 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETPEERNAME},179 {0, BPF_CGROUP_INET4_GETPEERNAME},180 },181 {182 "cgroup/getpeername6",183 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETPEERNAME},184 {0, BPF_CGROUP_INET6_GETPEERNAME},185 },186 {187 "cgroup/getpeername_unix",188 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_GETPEERNAME},189 {0, BPF_CGROUP_UNIX_GETPEERNAME},190 },191 {192 "cgroup/getsockname4",193 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETSOCKNAME},194 {0, BPF_CGROUP_INET4_GETSOCKNAME},195 },196 {197 "cgroup/getsockname6",198 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETSOCKNAME},199 {0, BPF_CGROUP_INET6_GETSOCKNAME},200 },201 {202 "cgroup/getsockname_unix",203 {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UNIX_GETSOCKNAME},204 {0, BPF_CGROUP_UNIX_GETSOCKNAME},205 },206};207 208static void test_prog_type_by_name(const struct sec_name_test *test)209{210 enum bpf_attach_type expected_attach_type;211 enum bpf_prog_type prog_type;212 int rc;213 214 rc = libbpf_prog_type_by_name(test->sec_name, &prog_type,215 &expected_attach_type);216 217 CHECK(rc != test->expected_load.rc, "check_code",218 "prog: unexpected rc=%d for %s\n", rc, test->sec_name);219 220 if (rc)221 return;222 223 CHECK(prog_type != test->expected_load.prog_type, "check_prog_type",224 "prog: unexpected prog_type=%d for %s\n",225 prog_type, test->sec_name);226 227 CHECK(expected_attach_type != test->expected_load.expected_attach_type,228 "check_attach_type", "prog: unexpected expected_attach_type=%d for %s\n",229 expected_attach_type, test->sec_name);230}231 232static void test_attach_type_by_name(const struct sec_name_test *test)233{234 enum bpf_attach_type attach_type;235 int rc;236 237 rc = libbpf_attach_type_by_name(test->sec_name, &attach_type);238 239 CHECK(rc != test->expected_attach.rc, "check_ret",240 "attach: unexpected rc=%d for %s\n", rc, test->sec_name);241 242 if (rc)243 return;244 245 CHECK(attach_type != test->expected_attach.attach_type,246 "check_attach_type", "attach: unexpected attach_type=%d for %s\n",247 attach_type, test->sec_name);248}249 250void test_section_names(void)251{252 int i;253 254 for (i = 0; i < ARRAY_SIZE(tests); ++i) {255 struct sec_name_test *test = &tests[i];256 257 test_prog_type_by_name(test);258 test_attach_type_by_name(test);259 }260}261