From patchwork Mon Aug 6 13:58:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mauricio Vasquez X-Patchwork-Id: 953894 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=polito.it Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41kg1j1Z4Mz9s0R for ; Tue, 7 Aug 2018 00:26:17 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732079AbeHFQfg (ORCPT ); Mon, 6 Aug 2018 12:35:36 -0400 Received: from fm2nodo1.polito.it ([130.192.180.17]:37847 "EHLO fm2nodo1.polito.it" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727451AbeHFQfg (ORCPT ); Mon, 6 Aug 2018 12:35:36 -0400 Received: from polito.it (frontmail2.polito.it [130.192.180.42]) by fm2nodo1.polito.it with ESMTP id w76DwkXF009983-w76DwkXJ009983 (version=TLSv1.0 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=CAFAIL); Mon, 6 Aug 2018 15:58:48 +0200 X-ExtScanner: Niversoft's FindAttachments (free) Received: from [130.192.225.196] (account d040768@polito.it HELO [127.0.1.1]) by polito.it (CommuniGate Pro SMTP 6.2.5) with ESMTPSA id 78232756; Mon, 06 Aug 2018 15:58:47 +0200 Subject: [PATCH bpf-next 3/3] bpf: add sample for BPF_MAP_TYPE_QUEUE From: Mauricio Vasquez B To: Alexei Starovoitov , Daniel Borkmann Cc: netdev@vger.kernel.org Date: Mon, 06 Aug 2018 15:58:47 +0200 Message-ID: <153356392410.6981.1290059578982921349.stgit@kernel> In-Reply-To: <153356387977.6981.12236150594041620482.stgit@kernel> References: <153356387977.6981.12236150594041620482.stgit@kernel> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The example is made by two parts, a eBPF program that consumes elements from a FIFO queue and prints them in the screen and a user space application that inserts new elements into the queue each time this is executed. Signed-off-by: Mauricio Vasquez B --- samples/bpf/.gitignore | 1 + samples/bpf/Makefile | 3 ++ samples/bpf/test_map_in_map_user.c | 9 +----- samples/bpf/test_queuemap.sh | 37 +++++++++++++++++++++++++ samples/bpf/test_queuemap_kern.c | 51 +++++++++++++++++++++++++++++++++++ samples/bpf/test_queuemap_user.c | 53 ++++++++++++++++++++++++++++++++++++ 6 files changed, 147 insertions(+), 7 deletions(-) create mode 100755 samples/bpf/test_queuemap.sh create mode 100644 samples/bpf/test_queuemap_kern.c create mode 100644 samples/bpf/test_queuemap_user.c diff --git a/samples/bpf/.gitignore b/samples/bpf/.gitignore index 8ae4940025f8..d7e518c1b3ed 100644 --- a/samples/bpf/.gitignore +++ b/samples/bpf/.gitignore @@ -26,6 +26,7 @@ test_lru_dist test_map_in_map test_overhead test_probe_write_user +test_queuemap trace_event trace_output tracex1 diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index f88d5683d6ee..624f4f4b81db 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -53,6 +53,7 @@ hostprogs-y += xdpsock hostprogs-y += xdp_fwd hostprogs-y += task_fd_query hostprogs-y += xdp_sample_pkts +hostprogs-y += test_queuemap # Libbpf dependencies LIBBPF = $(TOOLS_PATH)/lib/bpf/libbpf.a @@ -109,6 +110,7 @@ xdpsock-objs := xdpsock_user.o xdp_fwd-objs := xdp_fwd_user.o task_fd_query-objs := bpf_load.o task_fd_query_user.o $(TRACE_HELPERS) xdp_sample_pkts-objs := xdp_sample_pkts_user.o $(TRACE_HELPERS) +test_queuemap-objs := bpf_load.o test_queuemap_user.o # Tell kbuild to always build the programs always := $(hostprogs-y) @@ -166,6 +168,7 @@ always += xdpsock_kern.o always += xdp_fwd_kern.o always += task_fd_query_kern.o always += xdp_sample_pkts_kern.o +always += test_queuemap_kern.o HOSTCFLAGS += -I$(objtree)/usr/include HOSTCFLAGS += -I$(srctree)/tools/lib/ diff --git a/samples/bpf/test_map_in_map_user.c b/samples/bpf/test_map_in_map_user.c index e308858f7bcf..28edac94234e 100644 --- a/samples/bpf/test_map_in_map_user.c +++ b/samples/bpf/test_map_in_map_user.c @@ -1,10 +1,5 @@ -/* - * Copyright (c) 2017 Facebook - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - */ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2018 Politecnico di Torino */ #include #include #include diff --git a/samples/bpf/test_queuemap.sh b/samples/bpf/test_queuemap.sh new file mode 100755 index 000000000000..ed08c1fa8c2c --- /dev/null +++ b/samples/bpf/test_queuemap.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +[[ -z $TC ]] && TC='tc' +[[ -z $IP ]] && IP='ip' + +TEST_QUEUE_USER='./test_queuemap' +TEST_QUEUE_BPF='./test_queuemap_kern.o' + +function config { + $IP netns add ns1 + $IP link add ve1 type veth peer name vens1 + $IP link set dev ve1 up + $IP link set dev ve1 mtu 1500 + $IP link set dev vens1 netns ns1 + + $IP -n ns1 link set dev lo up + $IP -n ns1 link set dev vens1 up + $IP -n ns1 addr add 10.1.1.101/24 dev vens1 + + $IP addr add 10.1.1.1/24 dev ve1 + $TC qdisc add dev ve1 clsact + $TC filter add dev ve1 ingress bpf da obj $TEST_QUEUE_BPF sec test_queue +} + +function cleanup { + set +e + [[ -z $DEBUG ]] || set +x + $IP netns delete ns1 >& /dev/null + $IP link del ve1 >& /dev/null + rm -f /sys/fs/bpf/tc/globals/queue + [[ -z $DEBUG ]] || set -x + set -e +} + +cleanup +config diff --git a/samples/bpf/test_queuemap_kern.c b/samples/bpf/test_queuemap_kern.c new file mode 100644 index 000000000000..2b496dafaffd --- /dev/null +++ b/samples/bpf/test_queuemap_kern.c @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2018 Politecnico di Torino */ +#define KBUILD_MODNAME "foo" +#include +#include +#include +#include +#include +#include "bpf_helpers.h" + +#define PIN_GLOBAL_NS 2 + +struct bpf_elf_map { + __u32 type; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 flags; + __u32 id; + __u32 pinning; +}; + +/* map #0 */ +struct bpf_elf_map SEC("maps") queue = { + .type = BPF_MAP_TYPE_QUEUE, + .key_size = 0, + .value_size = sizeof(u32), + .flags = BPF_F_QUEUE_FIFO, + .max_entries = 1024, + .pinning = PIN_GLOBAL_NS, +}; + +SEC("test_queue") +int _test_queue(struct __sk_buff *skb) +{ + char msg[] = "element is %u\n"; + char msg_no[] = "there are not elements\n"; + + u32 *val = bpf_map_lookup_elem(&queue, NULL); + + if (!val) { + bpf_trace_printk(msg_no, sizeof(msg_no)); + return TC_ACT_OK; + } + + bpf_trace_printk(msg, sizeof(msg), *val); + return TC_ACT_OK; +} + +char _license[] SEC("license") = "GPL"; +u32 _version SEC("version") = LINUX_VERSION_CODE; diff --git a/samples/bpf/test_queuemap_user.c b/samples/bpf/test_queuemap_user.c new file mode 100644 index 000000000000..68f9a5d54596 --- /dev/null +++ b/samples/bpf/test_queuemap_user.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018 Politecnico di Torino + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bpf_load.h" + +int queue_map; + +static void test_queue_map(void) +{ + int ret; + uint32_t i; + + queue_map = bpf_obj_get("/sys/fs/bpf/tc/globals/queue"); + if (queue_map < 0) { + fprintf(stderr, "error getting map"); + return; + } + + for (i = 0; i < 256; i++) { + uint32_t v = 1000 - i*3; + + ret = bpf_map_update_elem(queue_map, NULL, &v, 0); + if (ret) + fprintf(stderr, "ret is %d\n", ret); + } +} + +int main(int argc, char **argv) +{ + struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; + char filename[256]; + + assert(!setrlimit(RLIMIT_MEMLOCK, &r)); + + snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); + + test_queue_map(); + + return 0; +}