test_section_names.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2018 Facebook
  3. #include <err.h>
  4. #include <bpf/libbpf.h>
  5. #include "bpf_util.h"
  6. struct sec_name_test {
  7. const char sec_name[32];
  8. struct {
  9. int rc;
  10. enum bpf_prog_type prog_type;
  11. enum bpf_attach_type expected_attach_type;
  12. } expected_load;
  13. struct {
  14. int rc;
  15. enum bpf_attach_type attach_type;
  16. } expected_attach;
  17. };
  18. static struct sec_name_test tests[] = {
  19. {"InvAliD", {-EINVAL, 0, 0}, {-EINVAL, 0} },
  20. {"cgroup", {-EINVAL, 0, 0}, {-EINVAL, 0} },
  21. {"socket", {0, BPF_PROG_TYPE_SOCKET_FILTER, 0}, {-EINVAL, 0} },
  22. {"kprobe/", {0, BPF_PROG_TYPE_KPROBE, 0}, {-EINVAL, 0} },
  23. {"kretprobe/", {0, BPF_PROG_TYPE_KPROBE, 0}, {-EINVAL, 0} },
  24. {"classifier", {0, BPF_PROG_TYPE_SCHED_CLS, 0}, {-EINVAL, 0} },
  25. {"action", {0, BPF_PROG_TYPE_SCHED_ACT, 0}, {-EINVAL, 0} },
  26. {"tracepoint/", {0, BPF_PROG_TYPE_TRACEPOINT, 0}, {-EINVAL, 0} },
  27. {
  28. "raw_tracepoint/",
  29. {0, BPF_PROG_TYPE_RAW_TRACEPOINT, 0},
  30. {-EINVAL, 0},
  31. },
  32. {"xdp", {0, BPF_PROG_TYPE_XDP, 0}, {-EINVAL, 0} },
  33. {"perf_event", {0, BPF_PROG_TYPE_PERF_EVENT, 0}, {-EINVAL, 0} },
  34. {"lwt_in", {0, BPF_PROG_TYPE_LWT_IN, 0}, {-EINVAL, 0} },
  35. {"lwt_out", {0, BPF_PROG_TYPE_LWT_OUT, 0}, {-EINVAL, 0} },
  36. {"lwt_xmit", {0, BPF_PROG_TYPE_LWT_XMIT, 0}, {-EINVAL, 0} },
  37. {"lwt_seg6local", {0, BPF_PROG_TYPE_LWT_SEG6LOCAL, 0}, {-EINVAL, 0} },
  38. {
  39. "cgroup_skb/ingress",
  40. {0, BPF_PROG_TYPE_CGROUP_SKB, 0},
  41. {0, BPF_CGROUP_INET_INGRESS},
  42. },
  43. {
  44. "cgroup_skb/egress",
  45. {0, BPF_PROG_TYPE_CGROUP_SKB, 0},
  46. {0, BPF_CGROUP_INET_EGRESS},
  47. },
  48. {"cgroup/skb", {0, BPF_PROG_TYPE_CGROUP_SKB, 0}, {-EINVAL, 0} },
  49. {
  50. "cgroup/sock",
  51. {0, BPF_PROG_TYPE_CGROUP_SOCK, 0},
  52. {0, BPF_CGROUP_INET_SOCK_CREATE},
  53. },
  54. {
  55. "cgroup/post_bind4",
  56. {0, BPF_PROG_TYPE_CGROUP_SOCK, BPF_CGROUP_INET4_POST_BIND},
  57. {0, BPF_CGROUP_INET4_POST_BIND},
  58. },
  59. {
  60. "cgroup/post_bind6",
  61. {0, BPF_PROG_TYPE_CGROUP_SOCK, BPF_CGROUP_INET6_POST_BIND},
  62. {0, BPF_CGROUP_INET6_POST_BIND},
  63. },
  64. {
  65. "cgroup/dev",
  66. {0, BPF_PROG_TYPE_CGROUP_DEVICE, 0},
  67. {0, BPF_CGROUP_DEVICE},
  68. },
  69. {"sockops", {0, BPF_PROG_TYPE_SOCK_OPS, 0}, {0, BPF_CGROUP_SOCK_OPS} },
  70. {
  71. "sk_skb/stream_parser",
  72. {0, BPF_PROG_TYPE_SK_SKB, 0},
  73. {0, BPF_SK_SKB_STREAM_PARSER},
  74. },
  75. {
  76. "sk_skb/stream_verdict",
  77. {0, BPF_PROG_TYPE_SK_SKB, 0},
  78. {0, BPF_SK_SKB_STREAM_VERDICT},
  79. },
  80. {"sk_skb", {0, BPF_PROG_TYPE_SK_SKB, 0}, {-EINVAL, 0} },
  81. {"sk_msg", {0, BPF_PROG_TYPE_SK_MSG, 0}, {0, BPF_SK_MSG_VERDICT} },
  82. {"lirc_mode2", {0, BPF_PROG_TYPE_LIRC_MODE2, 0}, {0, BPF_LIRC_MODE2} },
  83. {
  84. "flow_dissector",
  85. {0, BPF_PROG_TYPE_FLOW_DISSECTOR, 0},
  86. {0, BPF_FLOW_DISSECTOR},
  87. },
  88. {
  89. "cgroup/bind4",
  90. {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_BIND},
  91. {0, BPF_CGROUP_INET4_BIND},
  92. },
  93. {
  94. "cgroup/bind6",
  95. {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_BIND},
  96. {0, BPF_CGROUP_INET6_BIND},
  97. },
  98. {
  99. "cgroup/connect4",
  100. {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_CONNECT},
  101. {0, BPF_CGROUP_INET4_CONNECT},
  102. },
  103. {
  104. "cgroup/connect6",
  105. {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_CONNECT},
  106. {0, BPF_CGROUP_INET6_CONNECT},
  107. },
  108. {
  109. "cgroup/sendmsg4",
  110. {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_SENDMSG},
  111. {0, BPF_CGROUP_UDP4_SENDMSG},
  112. },
  113. {
  114. "cgroup/sendmsg6",
  115. {0, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_SENDMSG},
  116. {0, BPF_CGROUP_UDP6_SENDMSG},
  117. },
  118. };
  119. static int test_prog_type_by_name(const struct sec_name_test *test)
  120. {
  121. enum bpf_attach_type expected_attach_type;
  122. enum bpf_prog_type prog_type;
  123. int rc;
  124. rc = libbpf_prog_type_by_name(test->sec_name, &prog_type,
  125. &expected_attach_type);
  126. if (rc != test->expected_load.rc) {
  127. warnx("prog: unexpected rc=%d for %s", rc, test->sec_name);
  128. return -1;
  129. }
  130. if (rc)
  131. return 0;
  132. if (prog_type != test->expected_load.prog_type) {
  133. warnx("prog: unexpected prog_type=%d for %s", prog_type,
  134. test->sec_name);
  135. return -1;
  136. }
  137. if (expected_attach_type != test->expected_load.expected_attach_type) {
  138. warnx("prog: unexpected expected_attach_type=%d for %s",
  139. expected_attach_type, test->sec_name);
  140. return -1;
  141. }
  142. return 0;
  143. }
  144. static int test_attach_type_by_name(const struct sec_name_test *test)
  145. {
  146. enum bpf_attach_type attach_type;
  147. int rc;
  148. rc = libbpf_attach_type_by_name(test->sec_name, &attach_type);
  149. if (rc != test->expected_attach.rc) {
  150. warnx("attach: unexpected rc=%d for %s", rc, test->sec_name);
  151. return -1;
  152. }
  153. if (rc)
  154. return 0;
  155. if (attach_type != test->expected_attach.attach_type) {
  156. warnx("attach: unexpected attach_type=%d for %s", attach_type,
  157. test->sec_name);
  158. return -1;
  159. }
  160. return 0;
  161. }
  162. static int run_test_case(const struct sec_name_test *test)
  163. {
  164. if (test_prog_type_by_name(test))
  165. return -1;
  166. if (test_attach_type_by_name(test))
  167. return -1;
  168. return 0;
  169. }
  170. static int run_tests(void)
  171. {
  172. int passes = 0;
  173. int fails = 0;
  174. int i;
  175. for (i = 0; i < ARRAY_SIZE(tests); ++i) {
  176. if (run_test_case(&tests[i]))
  177. ++fails;
  178. else
  179. ++passes;
  180. }
  181. printf("Summary: %d PASSED, %d FAILED\n", passes, fails);
  182. return fails ? -1 : 0;
  183. }
  184. int main(int argc, char **argv)
  185. {
  186. return run_tests();
  187. }