From patchwork Wed Aug 27 02:29:40 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexei Starovoitov X-Patchwork-Id: 383259 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id BACFA140086 for ; Wed, 27 Aug 2014 12:32:36 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932256AbaH0CcB (ORCPT ); Tue, 26 Aug 2014 22:32:01 -0400 Received: from mail-pa0-f50.google.com ([209.85.220.50]:64197 "EHLO mail-pa0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756740AbaH0CbI (ORCPT ); Tue, 26 Aug 2014 22:31:08 -0400 Received: by mail-pa0-f50.google.com with SMTP id et14so24346438pad.37 for ; Tue, 26 Aug 2014 19:31:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=twuGG8kvIlEbdAYzBtbZPeh4pM0Ow16sGV8QfHl7jzM=; b=FeYezsnb2eEUPitktRuG07C0ByohcmzGUFbKlRE9JVVety3+YO5jcUqUt/pPtEJWlC Rfsf5k0/9upI3AwaLuVUcw4h9y9FWPi6rPc2VcqWs2ThyQTRBC5VZzgsrUjfyGfyXXy9 TgJDc2LUqdqe/iWN8FT+9gYAfIZ2gTxRGhEnO0JAMaJ7S7NaR3JqT1diXOYxEgB7ESe6 k8Uti9r+PjAKlSiyd/3zk2lI1cylksWQG53t/o5V0iRB0OFINgpLeoQ0y2dDgTpldeST TVuWWSE0KtlCrg0Neo3XoLAXLJo5KdkEXJZae5UPuNLWOBNR65XP5zqEvbD5faUvjkGG Te8Q== X-Gm-Message-State: ALoCoQmsKdH+Fl/iNevEmDmdyCSJWgVUFF2GA8Ar33WEr6/BsyTnVQTjAQflBhU1avQuRfw6ir3H X-Received: by 10.68.69.3 with SMTP id a3mr42315617pbu.94.1409106668474; Tue, 26 Aug 2014 19:31:08 -0700 (PDT) Received: from pg-vmw-gw1.plumgrid.com ([67.21.3.149]) by mx.google.com with ESMTPSA id xj5sm4755897pbb.7.2014.08.26.19.31.05 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 26 Aug 2014 19:31:07 -0700 (PDT) From: Alexei Starovoitov To: "David S. Miller" Cc: Ingo Molnar , Linus Torvalds , Andy Lutomirski , Steven Rostedt , Daniel Borkmann , Chema Gonzalez , Eric Dumazet , Peter Zijlstra , Brendan Gregg , Namhyung Kim , "H. Peter Anvin" , Andrew Morton , Kees Cook , linux-api@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH RFC v7 net-next 26/28] samples: bpf: eBPF example in C Date: Tue, 26 Aug 2014 19:29:40 -0700 Message-Id: <1409106582-10095-27-git-send-email-ast@plumgrid.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1409106582-10095-1-git-send-email-ast@plumgrid.com> References: <1409106582-10095-1-git-send-email-ast@plumgrid.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org ex1_kern.c - C program which will be compiled into eBPF to filter netif_receive_skb events on skb->dev->name == "lo" ex1_user.c - corresponding user space component that forever reads /sys/.../trace_pipe Usage: $ sudo ex1 should see: writing bpf-4 -> /sys/kernel/debug/tracing/events/net/netif_receive_skb/filter ping-25476 [001] ..s3 5639.718218: __netif_receive_skb_core: skb 4d51700 dev b9e6000 ping-25476 [001] ..s3 5639.718262: __netif_receive_skb_core: skb 4d51400 dev b9e6000 ping-25476 [002] ..s3 5640.716233: __netif_receive_skb_core: skb 5d06500 dev b9e6000 ping-25476 [002] ..s3 5640.716272: __netif_receive_skb_core: skb 5d06300 dev b9e6000 Ctrl-C at any time, kernel will auto cleanup Signed-off-by: Alexei Starovoitov --- samples/bpf/Makefile | 15 +++++++++++++-- samples/bpf/ex1_kern.c | 27 +++++++++++++++++++++++++++ samples/bpf/ex1_user.c | 24 ++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 samples/bpf/ex1_kern.c create mode 100644 samples/bpf/ex1_user.c diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 7264ba51d496..7ce9e6b0d3d0 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -2,12 +2,23 @@ obj- := dummy.o # List of programs to build -hostprogs-y := dropmon test_verifier +hostprogs-y := dropmon test_verifier ex1 dropmon-objs := dropmon.o libbpf.o test_verifier-objs := test_verifier.o libbpf.o +ex1-objs := bpf_load.o libbpf.o ex1_user.o # Tell kbuild to always build the programs -always := $(hostprogs-y) +always := $(hostprogs-y) ex1_kern.o HOSTCFLAGS += -I$(objtree)/usr/include + +HOSTCFLAGS_bpf_load.o += -I$(objtree)/usr/include -Wno-unused-variable +HOSTLOADLIBES_ex1 += -lelf + +LLC=$(srctree)/tools/bpf/llvm/bld/Debug+Asserts/bin/llc + +%.o: %.c + clang $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) \ + -D__KERNEL__ -Wno-unused-value -Wno-pointer-sign \ + -O2 -emit-llvm -c $< -o -| $(LLC) -o $@ diff --git a/samples/bpf/ex1_kern.c b/samples/bpf/ex1_kern.c new file mode 100644 index 000000000000..05a06cccaadb --- /dev/null +++ b/samples/bpf/ex1_kern.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include +#include "bpf_helpers.h" + +SEC("events/net/netif_receive_skb") +int bpf_prog1(struct bpf_context *ctx) +{ + /* + * attaches to /sys/kernel/debug/tracing/events/net/netif_receive_skb + * prints events for loobpack device only + */ + char devname[] = "lo"; + struct net_device *dev; + struct sk_buff *skb = 0; + + skb = (struct sk_buff *) ctx->arg1; + dev = bpf_fetch_ptr(&skb->dev); + if (bpf_memcmp(dev->name, devname, 2) == 0) { + char fmt[] = "skb %x dev %x\n"; + bpf_printk(fmt, sizeof(fmt), skb, dev); + } + return 0; +} + +char license[] SEC("license") = "GPL"; diff --git a/samples/bpf/ex1_user.c b/samples/bpf/ex1_user.c new file mode 100644 index 000000000000..e85c1b483f57 --- /dev/null +++ b/samples/bpf/ex1_user.c @@ -0,0 +1,24 @@ +#include +#include +#include "libbpf.h" +#include "bpf_load.h" + +int main(int ac, char **argv) +{ + FILE *f; + char filename[256]; + + snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); + + if (load_bpf_file(filename)) { + printf("%s", bpf_log_buf); + return 1; + } + + f = popen("ping -c5 localhost", "r"); + (void) f; + + read_trace_pipe(); + + return 0; +}