From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lawrence Brakmo Subject: [RFC PATCH net-next v2 02/15] bpf: program to load socketops BPF programs Date: Thu, 15 Jun 2017 13:08:31 -0700 Message-ID: <20170615200844.2752485-3-brakmo@fb.com> References: <20170615200844.2752485-1-brakmo@fb.com> Mime-Version: 1.0 Content-Type: text/plain Cc: Kernel Team , Blake Matheny , Alexei Starovoitov , Daniel Borkmann , David Ahern To: netdev Return-path: Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:48073 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752088AbdFOUIw (ORCPT ); Thu, 15 Jun 2017 16:08:52 -0400 Received: from pps.filterd (m0001255.ppops.net [127.0.0.1]) by mx0b-00082601.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v5FK6UjD001707 for ; Thu, 15 Jun 2017 13:08:52 -0700 Received: from mail.thefacebook.com ([199.201.64.23]) by mx0b-00082601.pphosted.com with ESMTP id 2b3vst100a-3 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Thu, 15 Jun 2017 13:08:52 -0700 Received: from facebook.com (2401:db00:11:d025:face:0:13:0) by mx-out.facebook.com (10.212.232.59) with ESMTP id 728aa76a520611e7b3f90002c991e86a-e44866b0 for ; Thu, 15 Jun 2017 13:08:50 -0700 In-Reply-To: <20170615200844.2752485-1-brakmo@fb.com> Sender: netdev-owner@vger.kernel.org List-ID: The program tcp_bpf can be used to remove current global sockops program and to load/replace sockops BPF programs. There is also an option to print the bpf trace buffer (for debugging purposes). USAGE: ./tcp_bpf [-r] [-l] [] WHERE: -r remove current loaded socketops BPF program not needed if loading a new program -l print BPF trace buffer. Used when loading a new program name of BPF sockeops program to load if does not end in ".o", then "_kern.o" is appended example: using tcp_rto will load tcp_rto_kern.o Signed-off-by: Lawrence Brakmo --- samples/bpf/Makefile | 3 ++ samples/bpf/tcp_bpf.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 samples/bpf/tcp_bpf.c diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index a0561dc..ed6bc75 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -36,6 +36,7 @@ hostprogs-y += lwt_len_hist hostprogs-y += xdp_tx_iptunnel hostprogs-y += test_map_in_map hostprogs-y += per_socket_stats_example +hostprogs-y += tcp_bpf # Libbpf dependencies LIBBPF := ../../tools/lib/bpf/bpf.o @@ -52,6 +53,7 @@ tracex3-objs := bpf_load.o $(LIBBPF) tracex3_user.o tracex4-objs := bpf_load.o $(LIBBPF) tracex4_user.o tracex5-objs := bpf_load.o $(LIBBPF) tracex5_user.o tracex6-objs := bpf_load.o $(LIBBPF) tracex6_user.o +tcp_bpf-objs := bpf_load.o $(LIBBPF) tcp_bpf.o test_probe_write_user-objs := bpf_load.o $(LIBBPF) test_probe_write_user_user.o trace_output-objs := bpf_load.o $(LIBBPF) trace_output_user.o lathist-objs := bpf_load.o $(LIBBPF) lathist_user.o @@ -130,6 +132,7 @@ HOSTLOADLIBES_tracex4 += -lelf -lrt HOSTLOADLIBES_tracex5 += -lelf HOSTLOADLIBES_tracex6 += -lelf HOSTLOADLIBES_test_cgrp2_sock2 += -lelf +HOSTLOADLIBES_tcp_bpf += -lelf HOSTLOADLIBES_test_probe_write_user += -lelf HOSTLOADLIBES_trace_output += -lelf -lrt HOSTLOADLIBES_lathist += -lelf diff --git a/samples/bpf/tcp_bpf.c b/samples/bpf/tcp_bpf.c new file mode 100644 index 0000000..9de18ea --- /dev/null +++ b/samples/bpf/tcp_bpf.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include +#include "libbpf.h" +#include "bpf_load.h" +#include +#include + +static void usage(char *pname) +{ + printf("USAGE:\n %s [-r] [-l] \n", pname); + printf("WHERE:\n"); + printf(" -r remove current loaded socketops BPF program\n"); + printf(" not needed if loading a new program\n"); + printf(" -l print out BPF log buffer\n"); + printf(" name of BPF sockeops program to load\n"); + printf(" if does not end in \".o\", then \"_kern.o\" " + "is appended\n"); + printf(" example: using tcp1 will load tcp1_kern.o\n"); + printf("\n"); + exit(1); +} + +int main(int argc, char **argv) +{ + union bpf_attr attr; + int k, logFlag = 0; + int error = -1; + char fn[500]; + + if (argc <= 1) + usage(argv[0]); + for (k = 1; k < argc; k++) { + if (!strcmp(argv[k], "-r")) { + /* A fd of zero is used as signal to remove the + * current SOCKET_OPS program + */ + attr.bpf_fd = 0; + syscall(__NR_bpf, BPF_PROG_LOAD_SOCKET_OPS, &attr, + sizeof(attr)); + } else if (!strcmp(argv[k], "-l")) { + logFlag = 1; + } else if (!strcmp(argv[k], "-h")) { + usage(argv[0]); + } else if (argv[k][0] == '-') { + printf("Error, unknown flag: %s\n", argv[k]); + exit(2); + } else if (strlen(argv[k]) > 450) { + printf("Error, program name too long %d\n", + (int) strlen(argv[k])); + exit(3); + } else { + if (!strcmp(argv[k]+strlen(argv[k])-2, ".o")) + strcpy(fn, argv[k]); + else + sprintf(fn, "%s_kern.o", argv[k]); + if (logFlag) + printf("loading bpf file:%s\n", fn); + if (load_bpf_file(fn)) { + printf("%s", bpf_log_buf); + return 1; + } + if (logFlag) { + printf("TCP BPF Loaded %s\n", fn); + printf("%s\n", bpf_log_buf); + } + attr.bpf_fd = prog_fd[0]; + error = syscall(__NR_bpf, BPF_PROG_LOAD_SOCKET_OPS, + &attr, sizeof(attr)); + if (error) { + printf("ERROR: syscall(BPF_PROG_SOCKET_OPS: %d\n", + error); + return 2; + } + if (logFlag) + read_trace_pipe(); + } + } + return 0; +} -- 2.9.3