aboutsummaryrefslogtreecommitdiffstats
path: root/tools/bpf/bpftool/prog.c
diff options
context:
space:
mode:
authorJohn Fastabend <john.fastabend@gmail.com>2018-10-15 14:19:50 -0400
committerAlexei Starovoitov <ast@kernel.org>2018-10-15 19:13:14 -0400
commitb7d3826c2ed6c3e626e7ae796c5df2c0d2551c6a (patch)
tree3db8e75d2aeddd47eddd3c03cc3d46de09b29333 /tools/bpf/bpftool/prog.c
parent7d1f12b8b2abab0a7af240b89b5ad68bf7f183e7 (diff)
bpf: bpftool, add support for attaching programs to maps
Sock map/hash introduce support for attaching programs to maps. To date I have been doing this with custom tooling but this is less than ideal as we shift to using bpftool as the single CLI for our BPF uses. This patch adds new sub commands 'attach' and 'detach' to the 'prog' command to attach programs to maps and then detach them. Signed-off-by: John Fastabend <john.fastabend@gmail.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'tools/bpf/bpftool/prog.c')
-rw-r--r--tools/bpf/bpftool/prog.c99
1 files changed, 98 insertions, 1 deletions
diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
index b1cd3bc8db70..99ab42c56724 100644
--- a/tools/bpf/bpftool/prog.c
+++ b/tools/bpf/bpftool/prog.c
@@ -77,6 +77,26 @@ static const char * const prog_type_name[] = {
77 [BPF_PROG_TYPE_FLOW_DISSECTOR] = "flow_dissector", 77 [BPF_PROG_TYPE_FLOW_DISSECTOR] = "flow_dissector",
78}; 78};
79 79
80static const char * const attach_type_strings[] = {
81 [BPF_SK_SKB_STREAM_PARSER] = "stream_parser",
82 [BPF_SK_SKB_STREAM_VERDICT] = "stream_verdict",
83 [BPF_SK_MSG_VERDICT] = "msg_verdict",
84 [__MAX_BPF_ATTACH_TYPE] = NULL,
85};
86
87enum bpf_attach_type parse_attach_type(const char *str)
88{
89 enum bpf_attach_type type;
90
91 for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) {
92 if (attach_type_strings[type] &&
93 is_prefix(str, attach_type_strings[type]))
94 return type;
95 }
96
97 return __MAX_BPF_ATTACH_TYPE;
98}
99
80static void print_boot_time(__u64 nsecs, char *buf, unsigned int size) 100static void print_boot_time(__u64 nsecs, char *buf, unsigned int size)
81{ 101{
82 struct timespec real_time_ts, boot_time_ts; 102 struct timespec real_time_ts, boot_time_ts;
@@ -697,6 +717,77 @@ int map_replace_compar(const void *p1, const void *p2)
697 return a->idx - b->idx; 717 return a->idx - b->idx;
698} 718}
699 719
720static int do_attach(int argc, char **argv)
721{
722 enum bpf_attach_type attach_type;
723 int err, mapfd, progfd;
724
725 if (!REQ_ARGS(5)) {
726 p_err("too few parameters for map attach");
727 return -EINVAL;
728 }
729
730 progfd = prog_parse_fd(&argc, &argv);
731 if (progfd < 0)
732 return progfd;
733
734 attach_type = parse_attach_type(*argv);
735 if (attach_type == __MAX_BPF_ATTACH_TYPE) {
736 p_err("invalid attach type");
737 return -EINVAL;
738 }
739 NEXT_ARG();
740
741 mapfd = map_parse_fd(&argc, &argv);
742 if (mapfd < 0)
743 return mapfd;
744
745 err = bpf_prog_attach(progfd, mapfd, attach_type, 0);
746 if (err) {
747 p_err("failed prog attach to map");
748 return -EINVAL;
749 }
750
751 if (json_output)
752 jsonw_null(json_wtr);
753 return 0;
754}
755
756static int do_detach(int argc, char **argv)
757{
758 enum bpf_attach_type attach_type;
759 int err, mapfd, progfd;
760
761 if (!REQ_ARGS(5)) {
762 p_err("too few parameters for map detach");
763 return -EINVAL;
764 }
765
766 progfd = prog_parse_fd(&argc, &argv);
767 if (progfd < 0)
768 return progfd;
769
770 attach_type = parse_attach_type(*argv);
771 if (attach_type == __MAX_BPF_ATTACH_TYPE) {
772 p_err("invalid attach type");
773 return -EINVAL;
774 }
775 NEXT_ARG();
776
777 mapfd = map_parse_fd(&argc, &argv);
778 if (mapfd < 0)
779 return mapfd;
780
781 err = bpf_prog_detach2(progfd, mapfd, attach_type);
782 if (err) {
783 p_err("failed prog detach from map");
784 return -EINVAL;
785 }
786
787 if (json_output)
788 jsonw_null(json_wtr);
789 return 0;
790}
700static int do_load(int argc, char **argv) 791static int do_load(int argc, char **argv)
701{ 792{
702 enum bpf_attach_type expected_attach_type; 793 enum bpf_attach_type expected_attach_type;
@@ -942,6 +1033,8 @@ static int do_help(int argc, char **argv)
942 " %s %s pin PROG FILE\n" 1033 " %s %s pin PROG FILE\n"
943 " %s %s load OBJ FILE [type TYPE] [dev NAME] \\\n" 1034 " %s %s load OBJ FILE [type TYPE] [dev NAME] \\\n"
944 " [map { idx IDX | name NAME } MAP]\n" 1035 " [map { idx IDX | name NAME } MAP]\n"
1036 " %s %s attach PROG ATTACH_TYPE MAP\n"
1037 " %s %s detach PROG ATTACH_TYPE MAP\n"
945 " %s %s help\n" 1038 " %s %s help\n"
946 "\n" 1039 "\n"
947 " " HELP_SPEC_MAP "\n" 1040 " " HELP_SPEC_MAP "\n"
@@ -953,10 +1046,12 @@ static int do_help(int argc, char **argv)
953 " cgroup/bind4 | cgroup/bind6 | cgroup/post_bind4 |\n" 1046 " cgroup/bind4 | cgroup/bind6 | cgroup/post_bind4 |\n"
954 " cgroup/post_bind6 | cgroup/connect4 | cgroup/connect6 |\n" 1047 " cgroup/post_bind6 | cgroup/connect4 | cgroup/connect6 |\n"
955 " cgroup/sendmsg4 | cgroup/sendmsg6 }\n" 1048 " cgroup/sendmsg4 | cgroup/sendmsg6 }\n"
1049 " ATTACH_TYPE := { msg_verdict | skb_verdict | skb_parse }\n"
956 " " HELP_SPEC_OPTIONS "\n" 1050 " " HELP_SPEC_OPTIONS "\n"
957 "", 1051 "",
958 bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], 1052 bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],
959 bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2]); 1053 bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],
1054 bin_name, argv[-2], bin_name, argv[-2]);
960 1055
961 return 0; 1056 return 0;
962} 1057}
@@ -968,6 +1063,8 @@ static const struct cmd cmds[] = {
968 { "dump", do_dump }, 1063 { "dump", do_dump },
969 { "pin", do_pin }, 1064 { "pin", do_pin },
970 { "load", do_load }, 1065 { "load", do_load },
1066 { "attach", do_attach },
1067 { "detach", do_detach },
971 { 0 } 1068 { 0 }
972}; 1069};
973 1070