From patchwork Tue Apr 17 06:51:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899084 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=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="RiMZ71aK"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGBc2pCYz9rx7 for ; Tue, 17 Apr 2018 16:51:52 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751297AbeDQGvu (ORCPT ); Tue, 17 Apr 2018 02:51:50 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:46300 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751147AbeDQGvt (ORCPT ); Tue, 17 Apr 2018 02:51:49 -0400 Received: by mail-pf0-f194.google.com with SMTP id h69so11705369pfe.13 for ; Mon, 16 Apr 2018 23:51:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Z4uzUKxxr9kdef4KY+zFklvUJpS3JZflZGFcdn3mCLI=; b=RiMZ71aKVXWa5l6DcKP35nLQh4pjVmiRXyozL1KbeeiYUlNgr/CGzZA24p7TRsYrJp OlxXwLTHZASuVmIvrAjz8ZNhotwg7t/IsajmNonn3kqdFX8ZCKs+TgyRNjQm6PTFpcG7 OKP9OWyV2FXz4V9662SVN8ZRQ+hHHjDh92XUWX9XQlTNFjLp4QxMr3ya7hK1T1yLEGUC VRbXLCLoYeU0/UiulsdRFBPNHiQZnxP1OxJ3oF/d95fqVy5stoK13jIAoWN/7aSTdbdP wQoLt1dueDfSgB/dlML8QCxyzXuNSXztSMRsywJ8rB1KHVhHHqzXu4WWt5PEE1blObSA 7jvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Z4uzUKxxr9kdef4KY+zFklvUJpS3JZflZGFcdn3mCLI=; b=dLgxN5ofgymefH5sSGDwiLOn9QSAo8b3mRWJjSdXRkJ/TxSMdRvN0QlYuJKWJBc/1p 13FwzcMQX01eYEVTzXIJfiKncJKOtpacdujVSqYpuBq0l5IfrWhtJEvKsTHLTViSkIVR BibR7z50xu3FSix0EoEJvQT2G1mVugurfIPFDSFHaYn0+SWJJK1R/SkB9I9ALRz34ihC TMLSoZJwAE8sNK5hq2lP/5JmdNaodcW9Jpv14cKiI0ieNh/rODFfD5zMk+EmtgIa6rO6 lOlnFTXunqFAsyLBQcF4XXqV4zBqBAhJ9hiXEufqZmekUJF7NDILPvLicHC5/RuiBDz0 A9og== X-Gm-Message-State: ALQs6tC+u1fuIx+qcrg+T4GYI7WvIoVCEJKpc2Zri1ONRVfeYpoMAvYd 114so4W2CUj+Yhp51LV22q5RnQ== X-Google-Smtp-Source: AIpwx49PLuvtumxmO5xFHtrvw7IOdyfqCJ3kNiuaJR/FXTDn4jf8iz823ZJb0jZu9HAoqD7oZv8qkg== X-Received: by 10.99.98.66 with SMTP id w63mr781180pgb.377.1523947908846; Mon, 16 Apr 2018 23:51:48 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.51.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:51:48 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next 01/10] [bpf]: adding bpf_xdp_adjust_tail helper Date: Mon, 16 Apr 2018 23:51:22 -0700 Message-Id: <20180417065131.3632-2-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Adding new bpf helper which would allow us to manipulate xdp's data_end pointer, and allow us to reduce packet's size indended use case: to generate ICMP messages from XDP context, where such message would contain truncated original packet. Signed-off-by: Nikita V. Shirokov --- include/uapi/linux/bpf.h | 10 +++++++++- net/core/filter.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index c5ec89732a8d..9a2d1a04eb24 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -755,6 +755,13 @@ union bpf_attr { * @addr: pointer to struct sockaddr to bind socket to * @addr_len: length of sockaddr structure * Return: 0 on success or negative error code + * + * int bpf_xdp_adjust_tail(xdp_md, delta) + * Adjust the xdp_md.data_end by delta. Only shrinking of packet's + * size is supported. + * @xdp_md: pointer to xdp_md + * @delta: A negative integer to be added to xdp_md.data_end + * Return: 0 on success or negative on error */ #define __BPF_FUNC_MAPPER(FN) \ FN(unspec), \ @@ -821,7 +828,8 @@ union bpf_attr { FN(msg_apply_bytes), \ FN(msg_cork_bytes), \ FN(msg_pull_data), \ - FN(bind), + FN(bind), \ + FN(xdp_adjust_tail), /* integer value in 'imm' field of BPF_CALL instruction selects which helper * function eBPF program intends to call diff --git a/net/core/filter.c b/net/core/filter.c index d31aff93270d..6c8ac7b548d6 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -2717,6 +2717,30 @@ static const struct bpf_func_proto bpf_xdp_adjust_head_proto = { .arg2_type = ARG_ANYTHING, }; +BPF_CALL_2(bpf_xdp_adjust_tail, struct xdp_buff *, xdp, int, offset) +{ + /* only shrinking is allowed for now. */ + if (unlikely(offset > 0)) + return -EINVAL; + + void *data_end = xdp->data_end + offset; + + if (unlikely(data_end < xdp->data + ETH_HLEN)) + return -EINVAL; + + xdp->data_end = data_end; + + return 0; +} + +static const struct bpf_func_proto bpf_xdp_adjust_tail_proto = { + .func = bpf_xdp_adjust_tail, + .gpl_only = false, + .ret_type = RET_INTEGER, + .arg1_type = ARG_PTR_TO_CTX, + .arg2_type = ARG_ANYTHING, +}; + BPF_CALL_2(bpf_xdp_adjust_meta, struct xdp_buff *, xdp, int, offset) { void *meta = xdp->data_meta + offset; @@ -3053,7 +3077,8 @@ bool bpf_helper_changes_pkt_data(void *func) func == bpf_l4_csum_replace || func == bpf_xdp_adjust_head || func == bpf_xdp_adjust_meta || - func == bpf_msg_pull_data) + func == bpf_msg_pull_data || + func == bpf_xdp_adjust_tail) return true; return false; @@ -3867,6 +3892,8 @@ xdp_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) return &bpf_xdp_redirect_proto; case BPF_FUNC_redirect_map: return &bpf_xdp_redirect_map_proto; + case BPF_FUNC_xdp_adjust_tail: + return &bpf_xdp_adjust_tail_proto; default: return bpf_base_func_proto(func_id); } From patchwork Tue Apr 17 06:51:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899090 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=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="VmdjetQD"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGC94RDfz9s1P for ; Tue, 17 Apr 2018 16:52:21 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752027AbeDQGvy (ORCPT ); Tue, 17 Apr 2018 02:51:54 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:33322 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751147AbeDQGvv (ORCPT ); Tue, 17 Apr 2018 02:51:51 -0400 Received: by mail-pf0-f196.google.com with SMTP id f15so11732650pfn.0 for ; Mon, 16 Apr 2018 23:51:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=U0VTms/Ck5tS+LAs4sa6eQk51nDMKIMXTDiAC1ZS2So=; b=VmdjetQDlqK1Ifyqzdd6BmkoPyGIw64pX7N7dMecGVKW8sWwexxJ4TpK+rWZ59t4q4 zUmayJ02qak7szQCMzXwnZamOkRtuWBjitsbM1H+yeziUZklvBjbw+XjgeDsbWW1F6Gu telpkKMSPZQDGYSfETEFMofkUPvd/rpTdG2RamlLgJCPoiQJ1evAY6xqziFTMOf4fNUj neNgtTLfNiUjzZizpi+VwTDcOV/we8b1IPbm0R4IaubJuUDX3jxoYWAjPzxAxs4dWxOy 6r8Z3xBqdUE1Dp3IxOP3q0Wd0EZCysbmkKMlnuw6UzP7ZAqPWQEbWAnuI28kJBrZgODg CN8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=U0VTms/Ck5tS+LAs4sa6eQk51nDMKIMXTDiAC1ZS2So=; b=DIeDNnKvpKYhnSJ2YhU18W3+2LAGX+qbTbU2GF6pHcBsNnNFbSA/dCoTomnKiajaEf ysQcMMPec9iGj/uA8ASzxCDg3o72DqXnCQX7LAbj0ubTJyISu/yUVYwojvZmIp7VjRHR Z6LukP0l3a4+x/IYFMr8q3UVav89EvZ0rfSvJMWpicKVKKT1Ec9UJPZKN17ns9EP6R4b TJ2J0WomxRgT8G5RRWtZXIrR79HivfwgpzfpTOH/erRgq2ptgTKSgZORCQ6lFfjqAvb1 YvUKgh0Sn348ze+PDIJAn3GIguV/1IntZgU1nag99xfXMXl4B5eOmBKgYq9pFrxXEg4D bKMg== X-Gm-Message-State: ALQs6tCTnVd8wjBLYzG86awILPOcxOe93kEfLpz82/JV0452wOoDTy9+ eft5q/ntiU1xrxQDQY1SbJL7PlwXdX4= X-Google-Smtp-Source: AIpwx48FRxEQuPKhW81FJjp9KcBIUnhq9r3KIDwXtfkJ0EEbzKjZhIThc1K0IbOb3iGDqLUsy7OQeg== X-Received: by 10.101.78.205 with SMTP id w13mr794317pgq.83.1523947911280; Mon, 16 Apr 2018 23:51:51 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.51.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:51:50 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next 02/10] [bpf]: adding tests for bpf_xdp_adjust_tail Date: Mon, 16 Apr 2018 23:51:23 -0700 Message-Id: <20180417065131.3632-3-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org adding selftests for bpf_xdp_adjust_tail helper. in this syntetic test we are testing that 1) if data_end < data helper will return EINVAL 2) for normal use case packet's length would be reduced. aside from adding new tests i'm changing behaviour of bpf_prog_test_run so it would recalculate packet's length if only data_end pointer was changed Signed-off-by: Nikita V. Shirokov --- net/bpf/test_run.c | 3 ++- tools/include/uapi/linux/bpf.h | 11 ++++++++- tools/testing/selftests/bpf/Makefile | 2 +- tools/testing/selftests/bpf/bpf_helpers.h | 3 +++ tools/testing/selftests/bpf/test_adjust_tail.c | 29 +++++++++++++++++++++++ tools/testing/selftests/bpf/test_progs.c | 32 ++++++++++++++++++++++++++ 6 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 tools/testing/selftests/bpf/test_adjust_tail.c diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 2ced48662c1f..68c3578343b4 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -170,7 +170,8 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr, xdp.rxq = &rxqueue->xdp_rxq; retval = bpf_test_run(prog, &xdp, repeat, &duration); - if (xdp.data != data + XDP_PACKET_HEADROOM + NET_IP_ALIGN) + if (xdp.data != data + XDP_PACKET_HEADROOM + NET_IP_ALIGN || + xdp.data_end != xdp.data + size) size = xdp.data_end - xdp.data; ret = bpf_test_finish(kattr, uattr, xdp.data, size, retval, duration); kfree(data); diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 9d07465023a2..9a2d1a04eb24 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -755,6 +755,13 @@ union bpf_attr { * @addr: pointer to struct sockaddr to bind socket to * @addr_len: length of sockaddr structure * Return: 0 on success or negative error code + * + * int bpf_xdp_adjust_tail(xdp_md, delta) + * Adjust the xdp_md.data_end by delta. Only shrinking of packet's + * size is supported. + * @xdp_md: pointer to xdp_md + * @delta: A negative integer to be added to xdp_md.data_end + * Return: 0 on success or negative on error */ #define __BPF_FUNC_MAPPER(FN) \ FN(unspec), \ @@ -821,7 +828,8 @@ union bpf_attr { FN(msg_apply_bytes), \ FN(msg_cork_bytes), \ FN(msg_pull_data), \ - FN(bind), + FN(bind), \ + FN(xdp_adjust_tail), /* integer value in 'imm' field of BPF_CALL instruction selects which helper * function eBPF program intends to call @@ -864,6 +872,7 @@ enum bpf_func_id { /* BPF_FUNC_skb_set_tunnel_key flags. */ #define BPF_F_ZERO_CSUM_TX (1ULL << 1) #define BPF_F_DONT_FRAGMENT (1ULL << 2) +#define BPF_F_SEQ_NUMBER (1ULL << 3) /* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and * BPF_FUNC_perf_event_read_value flags. diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index 0a315ddabbf4..3e819dc70bee 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -31,7 +31,7 @@ TEST_GEN_FILES = test_pkt_access.o test_xdp.o test_l4lb.o test_tcp_estats.o test sockmap_verdict_prog.o dev_cgroup.o sample_ret0.o test_tracepoint.o \ test_l4lb_noinline.o test_xdp_noinline.o test_stacktrace_map.o \ sample_map_ret0.o test_tcpbpf_kern.o test_stacktrace_build_id.o \ - sockmap_tcp_msg_prog.o connect4_prog.o connect6_prog.o + sockmap_tcp_msg_prog.o connect4_prog.o connect6_prog.o test_adjust_tail.o # Order correspond to 'make run_tests' order TEST_PROGS := test_kmod.sh \ diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h index d8223d99f96d..50c607014b22 100644 --- a/tools/testing/selftests/bpf/bpf_helpers.h +++ b/tools/testing/selftests/bpf/bpf_helpers.h @@ -96,6 +96,9 @@ static int (*bpf_msg_pull_data)(void *ctx, int start, int end, int flags) = (void *) BPF_FUNC_msg_pull_data; static int (*bpf_bind)(void *ctx, void *addr, int addr_len) = (void *) BPF_FUNC_bind; +static int (*bpf_xdp_adjust_tail)(void *ctx, int offset) = + (void *) BPF_FUNC_xdp_adjust_tail; + /* llvm builtin functions that eBPF C program may use to * emit BPF_LD_ABS and BPF_LD_IND instructions diff --git a/tools/testing/selftests/bpf/test_adjust_tail.c b/tools/testing/selftests/bpf/test_adjust_tail.c new file mode 100644 index 000000000000..86239e792d6d --- /dev/null +++ b/tools/testing/selftests/bpf/test_adjust_tail.c @@ -0,0 +1,29 @@ +/* Copyright (c) 2016,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. + */ +#include +#include +#include "bpf_helpers.h" + +int _version SEC("version") = 1; + +SEC("xdp_adjust_tail") +int _xdp_adjust_tail(struct xdp_md *xdp) +{ + void *data_end = (void *)(long)xdp->data_end; + void *data = (void *)(long)xdp->data; + int offset = 0; + + if (data_end - data == 54) + offset = 256; + else + offset = 20; + if (bpf_xdp_adjust_tail(xdp, 0 - offset)) + return XDP_DROP; + return XDP_TX; +} + +char _license[] SEC("license") = "GPL"; diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index faadbe233966..eedda98d7bb1 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c @@ -166,6 +166,37 @@ static void test_xdp(void) bpf_object__close(obj); } +static void test_xdp_adjust_tail(void) +{ + const char *file = "./test_adjust_tail.o"; + struct bpf_object *obj; + char buf[128]; + __u32 duration, retval, size; + int err, prog_fd; + + err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd); + if (err) { + error_cnt++; + return; + } + + err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), + buf, &size, &retval, &duration); + + CHECK(err || errno || retval != XDP_DROP, + "ipv4", "err %d errno %d retval %d size %d\n", + err, errno, retval, size); + + err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6), + buf, &size, &retval, &duration); + CHECK(err || errno || retval != XDP_TX || size != 54, + "ipv6", "err %d errno %d retval %d size %d\n", + err, errno, retval, size); + bpf_object__close(obj); +} + + + #define MAGIC_VAL 0x1234 #define NUM_ITER 100000 #define VIP_NUM 5 @@ -1177,6 +1208,7 @@ int main(void) { test_pkt_access(); test_xdp(); + test_xdp_adjust_tail(); test_l4lb_all(); test_xdp_noinline(); test_tcp_estats(); From patchwork Tue Apr 17 06:51:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899085 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=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="KkCfkDVb"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGBj2sPcz9rx7 for ; Tue, 17 Apr 2018 16:51:57 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752116AbeDQGvz (ORCPT ); Tue, 17 Apr 2018 02:51:55 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:39429 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751793AbeDQGvx (ORCPT ); Tue, 17 Apr 2018 02:51:53 -0400 Received: by mail-pl0-f66.google.com with SMTP id e7-v6so11455899plt.6 for ; Mon, 16 Apr 2018 23:51:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=BnJ+nkAG3ZFgK+znFNjekInXrt7T7v9ZzqVEvXLhl1c=; b=KkCfkDVbk7fdIPHDqggHCe2wdZA6J6cC7lJZ7UjhTSy55/mS2O2bsuM74G3AZjmyDr uz7EeK0ShYlO8TdqvTWArd7UBqf94kbgX1TY5MnQDxWOlhp4GVs41QpmDWecsuZgyuMA 1THPkO3GZ1QETn74I462hxrGXRpLmmWVLeZ06vYI4S2T0JHV9WIXZBMYp0A+Tl5JGX+e QQ0i1cyHwTgn8Q8rQ/NHJ1uI084TCoSGo923qfp6OXqQWgoXhDVHHokBTwMxPDkJM67I t9+9H7k7AGmaFIAx9VpLW+qB8w9ZlkVCo0dxv5WsxIUKfje3I+FouirLe7A+ZbSF94ex xPsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=BnJ+nkAG3ZFgK+znFNjekInXrt7T7v9ZzqVEvXLhl1c=; b=tby4qmBqu9sHXeHmQxfJbBOiClFA4Xf7wH3gL9TiQVF2bxzct6mPu/+BABBthXrGXN B1nqOUcxd7zfA67AROQw0nJgDDKmBTiKT7pS6uG+/WFVGg3gSsk76HTTJQ0BvUmf1sTd bRkhodgBa4WuL8q3mVG//f3moGAHWOV4bXmmd82SeFcmVjmeLpNAyoG6lKlCJehgfdMM 4nIBX00tCI+EdnQQ1ClipS8FaKF26Ez2mj/fxGa4ZvUsf+3XJ4WwUQziKItu/wmU+RBO /347UPyf3Erp+G40tQzej6Ys0r7wqsbPuztc6ZJKFM0fURRbTrbfb1cPG6QxUL0Wr5YP IM/w== X-Gm-Message-State: ALQs6tDC269gxld/udlOklwd3GdTeKMqK2Ipf/GJtDN8h7VDNXBdG5ef NclNDBTr/uy/EQRgg3w3HxHR1w== X-Google-Smtp-Source: AIpwx4/fTXQMnfq4IR7gTHxONk0TWoMjyLThe06mKMO1Y2WwnsYZOdOSU6S7NDM1XzPnLGyBCeGVlw== X-Received: by 2002:a17:902:5609:: with SMTP id h9-v6mr948839pli.121.1523947912336; Mon, 16 Apr 2018 23:51:52 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.51.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:51:51 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next 03/10] [bpf]: add bpf_xdp_adjust_tail sample prog Date: Mon, 16 Apr 2018 23:51:24 -0700 Message-Id: <20180417065131.3632-4-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org adding bpf's sample program which is using bpf_xdp_adjust_tail helper by generating ICMPv4 "packet to big" message if ingress packet's size is bigger then 600 bytes Signed-off-by: Nikita V. Shirokov --- samples/bpf/Makefile | 4 + samples/bpf/xdp_adjust_tail_kern.c | 151 ++++++++++++++++++++++++++++++ samples/bpf/xdp_adjust_tail_user.c | 141 ++++++++++++++++++++++++++++ tools/testing/selftests/bpf/bpf_helpers.h | 2 + 4 files changed, 298 insertions(+) create mode 100644 samples/bpf/xdp_adjust_tail_kern.c create mode 100644 samples/bpf/xdp_adjust_tail_user.c diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 4d6a6edd4bf6..aa8c392e2e52 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -44,6 +44,7 @@ hostprogs-y += xdp_monitor hostprogs-y += xdp_rxq_info hostprogs-y += syscall_tp hostprogs-y += cpustat +hostprogs-y += xdp_adjust_tail # Libbpf dependencies LIBBPF := ../../tools/lib/bpf/bpf.o ../../tools/lib/bpf/nlattr.o @@ -95,6 +96,7 @@ xdp_monitor-objs := bpf_load.o $(LIBBPF) xdp_monitor_user.o xdp_rxq_info-objs := bpf_load.o $(LIBBPF) xdp_rxq_info_user.o syscall_tp-objs := bpf_load.o $(LIBBPF) syscall_tp_user.o cpustat-objs := bpf_load.o $(LIBBPF) cpustat_user.o +xdp_adjust_tail-objs := bpf_load.o $(LIBBPF) xdp_adjust_tail_user.o # Tell kbuild to always build the programs always := $(hostprogs-y) @@ -148,6 +150,7 @@ always += xdp_rxq_info_kern.o always += xdp2skb_meta_kern.o always += syscall_tp_kern.o always += cpustat_kern.o +always += xdp_adjust_tail_kern.o HOSTCFLAGS += -I$(objtree)/usr/include HOSTCFLAGS += -I$(srctree)/tools/lib/ @@ -193,6 +196,7 @@ HOSTLOADLIBES_xdp_monitor += -lelf HOSTLOADLIBES_xdp_rxq_info += -lelf HOSTLOADLIBES_syscall_tp += -lelf HOSTLOADLIBES_cpustat += -lelf +HOSTLOADLIBES_xdp_adjust_tail += -lelf # Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on cmdline: # make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang diff --git a/samples/bpf/xdp_adjust_tail_kern.c b/samples/bpf/xdp_adjust_tail_kern.c new file mode 100644 index 000000000000..17570559fd08 --- /dev/null +++ b/samples/bpf/xdp_adjust_tail_kern.c @@ -0,0 +1,151 @@ +/* Copyright (c) 2018 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. + * + * This program shows how to use bpf_xdp_adjust_tail() by + * generating ICMPv4 "packet to big" (unreachable/ df bit set frag needed + * to be more preice in case of v4)" where receiving packets bigger then + * 600 bytes. + */ +#define KBUILD_MODNAME "foo" +#include +#include +#include +#include +#include +#include +#include +#include "bpf_helpers.h" + +#define DEFAULT_TTL 64 +#define MAX_PCKT_SIZE 600 +#define ICMP_TOOBIG_SIZE 98 +#define ICMP_TOOBIG_PAYLOAD_SIZE 92 + +struct bpf_map_def SEC("maps") icmpcnt = { + .type = BPF_MAP_TYPE_ARRAY, + .key_size = sizeof(__u32), + .value_size = sizeof(__u64), + .max_entries = 1, +}; + +static __always_inline void count_icmp(void) +{ + u64 key = 0; + u64 *icmp_count; + + icmp_count = bpf_map_lookup_elem(&icmpcnt, &key); + if (icmp_count) + *icmp_count += 1; +} + +static __always_inline void swap_mac(void *data, struct ethhdr *orig_eth) +{ + struct ethhdr *eth; + + eth = data; + memcpy(eth->h_source, orig_eth->h_dest, ETH_ALEN); + memcpy(eth->h_dest, orig_eth->h_source, ETH_ALEN); + eth->h_proto = orig_eth->h_proto; +} + +static __always_inline __u16 csum_fold_helper(__u32 csum) +{ + return ~((csum & 0xffff) + (csum >> 16)); +} + +static __always_inline void ipv4_csum(void *data_start, int data_size, + __u32 *csum) +{ + *csum = bpf_csum_diff(0, 0, data_start, data_size, *csum); + *csum = csum_fold_helper(*csum); +} + +static __always_inline int send_icmp4_too_big(struct xdp_md *xdp) +{ + int headroom = (int)sizeof(struct iphdr) + (int)sizeof(struct icmphdr); + + if (bpf_xdp_adjust_head(xdp, 0 - headroom)) + return XDP_DROP; + void *data = (void *)(long)xdp->data; + void *data_end = (void *)(long)xdp->data_end; + + if (data + (ICMP_TOOBIG_SIZE + headroom) > data_end) + return XDP_DROP; + + struct iphdr *iph, *orig_iph; + struct icmphdr *icmp_hdr; + struct ethhdr *orig_eth; + __u32 csum = 0; + __u64 off = 0; + + orig_eth = data + headroom; + swap_mac(data, orig_eth); + off += sizeof(struct ethhdr); + iph = data + off; + off += sizeof(struct iphdr); + icmp_hdr = data + off; + off += sizeof(struct icmphdr); + orig_iph = data + off; + icmp_hdr->type = ICMP_DEST_UNREACH; + icmp_hdr->code = ICMP_FRAG_NEEDED; + icmp_hdr->un.frag.mtu = htons(MAX_PCKT_SIZE-sizeof(struct ethhdr)); + icmp_hdr->checksum = 0; + ipv4_csum(icmp_hdr, ICMP_TOOBIG_PAYLOAD_SIZE, &csum); + icmp_hdr->checksum = csum; + iph->ttl = DEFAULT_TTL; + iph->daddr = orig_iph->saddr; + iph->saddr = orig_iph->daddr; + iph->version = 4; + iph->ihl = 5; + iph->protocol = IPPROTO_ICMP; + iph->tos = 0; + iph->tot_len = htons( + ICMP_TOOBIG_SIZE + headroom - sizeof(struct ethhdr)); + iph->check = 0; + csum = 0; + ipv4_csum(iph, sizeof(struct iphdr), &csum); + iph->check = csum; + count_icmp(); + return XDP_TX; +} + + +static __always_inline int handle_ipv4(struct xdp_md *xdp) +{ + void *data_end = (void *)(long)xdp->data_end; + void *data = (void *)(long)xdp->data; + int pckt_size = data_end - data; + int offset; + + if (pckt_size > MAX_PCKT_SIZE) { + offset = pckt_size - ICMP_TOOBIG_SIZE; + if (bpf_xdp_adjust_tail(xdp, 0 - offset)) + return XDP_PASS; + return send_icmp4_too_big(xdp); + } + return XDP_PASS; +} + +SEC("xdp_icmp") +int _xdp_icmp(struct xdp_md *xdp) +{ + void *data_end = (void *)(long)xdp->data_end; + void *data = (void *)(long)xdp->data; + struct ethhdr *eth = data; + __u16 h_proto; + + if (eth + 1 > data_end) + return XDP_DROP; + + h_proto = eth->h_proto; + + if (h_proto == htons(ETH_P_IP)) + return handle_ipv4(xdp); + else + return XDP_PASS; +} + +char _license[] SEC("license") = "GPL"; diff --git a/samples/bpf/xdp_adjust_tail_user.c b/samples/bpf/xdp_adjust_tail_user.c new file mode 100644 index 000000000000..8a2b8879ac66 --- /dev/null +++ b/samples/bpf/xdp_adjust_tail_user.c @@ -0,0 +1,141 @@ +/* Copyright (c) 2018 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. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bpf_load.h" +#include "libbpf.h" +#include "bpf_util.h" + +#define STATS_INTERVAL_S 2U + +static int ifindex = -1; +static __u32 xdp_flags; + +static void int_exit(int sig) +{ + if (ifindex > -1) + bpf_set_link_xdp_fd(ifindex, -1, xdp_flags); + exit(0); +} + +/* simple "icmp packet too big sent" counter + */ +static void poll_stats(unsigned int kill_after_s) +{ + time_t started_at = time(NULL); + __u64 value = 0; + int key = 0; + + + while (!kill_after_s || time(NULL) - started_at <= kill_after_s) { + sleep(STATS_INTERVAL_S); + + assert(bpf_map_lookup_elem(map_fd[0], &key, &value) == 0); + + printf("icmp \"packet too big\" sent: %10llu pkts\n", value); + } +} + +static void usage(const char *cmd) +{ + printf("Start a XDP prog which send ICMP \"packet too big\" \n" + "messages if ingress packet is bigger then MAX_SIZE bytes\n"); + printf("Usage: %s [...]\n", cmd); + printf(" -i Interface Index\n"); + printf(" -T Default: 0 (forever)\n"); + printf(" -S use skb-mode\n"); + printf(" -N enforce native mode\n"); + printf(" -h Display this help\n"); +} + +int main(int argc, char **argv) +{ + unsigned char opt_flags[256] = {}; + unsigned int kill_after_s = 0; + const char *optstr = "i:T:SNh"; + struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; + char filename[256]; + int opt; + int i; + + + for (i = 0; i < strlen(optstr); i++) + if (optstr[i] != 'h' && 'a' <= optstr[i] && optstr[i] <= 'z') + opt_flags[(unsigned char)optstr[i]] = 1; + + while ((opt = getopt(argc, argv, optstr)) != -1) { + + switch (opt) { + case 'i': + ifindex = atoi(optarg); + break; + case 'T': + kill_after_s = atoi(optarg); + break; + case 'S': + xdp_flags |= XDP_FLAGS_SKB_MODE; + break; + case 'N': + xdp_flags |= XDP_FLAGS_DRV_MODE; + break; + default: + usage(argv[0]); + return 1; + } + opt_flags[opt] = 0; + } + + for (i = 0; i < strlen(optstr); i++) { + if (opt_flags[(unsigned int)optstr[i]]) { + fprintf(stderr, "Missing argument -%c\n", optstr[i]); + usage(argv[0]); + return 1; + } + } + + if (setrlimit(RLIMIT_MEMLOCK, &r)) { + perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)"); + return 1; + } + + snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); + + if (load_bpf_file(filename)) { + printf("%s", bpf_log_buf); + return 1; + } + + if (!prog_fd[0]) { + printf("load_bpf_file: %s\n", strerror(errno)); + return 1; + } + + signal(SIGINT, int_exit); + signal(SIGTERM, int_exit); + + if (bpf_set_link_xdp_fd(ifindex, prog_fd[0], xdp_flags) < 0) { + printf("link set xdp fd failed\n"); + return 1; + } + + poll_stats(kill_after_s); + + bpf_set_link_xdp_fd(ifindex, -1, xdp_flags); + + return 0; +} diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h index 50c607014b22..9271576bdc8f 100644 --- a/tools/testing/selftests/bpf/bpf_helpers.h +++ b/tools/testing/selftests/bpf/bpf_helpers.h @@ -132,6 +132,8 @@ static int (*bpf_l3_csum_replace)(void *ctx, int off, int from, int to, int flag (void *) BPF_FUNC_l3_csum_replace; static int (*bpf_l4_csum_replace)(void *ctx, int off, int from, int to, int flags) = (void *) BPF_FUNC_l4_csum_replace; +static int (*bpf_csum_diff)(void *from, int from_size, void *to, int to_size, int seed) = + (void *) BPF_FUNC_csum_diff; static int (*bpf_skb_under_cgroup)(void *ctx, void *map, int index) = (void *) BPF_FUNC_skb_under_cgroup; static int (*bpf_skb_change_head)(void *, int len, int flags) = From patchwork Tue Apr 17 06:51:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899091 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=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="koQZ5RD1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGCC3BYkz9s1P for ; Tue, 17 Apr 2018 16:52:23 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752497AbeDQGwV (ORCPT ); Tue, 17 Apr 2018 02:52:21 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:36709 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751840AbeDQGvy (ORCPT ); Tue, 17 Apr 2018 02:51:54 -0400 Received: by mail-pl0-f68.google.com with SMTP id 91-v6so11460377pld.3 for ; Mon, 16 Apr 2018 23:51:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lkhdeeA0/Y7sax7EwcGSwCUbzMaLGs8proR78S9GZO4=; b=koQZ5RD1eiAAtdtGJ/8w0Boep1qFu840Eq9CBS4rPxKvl5edBkGugRkQbjuLKSzXNx rpBEaN/LOMUOdjwV9YPncWY8nirfUQuif49Z76bZc4SF3jdLz8BKdYg+KMjnJ185mBrw 9wRmUUG1ZYiMtm6VWV/VLQsbxQifc0Ea8Z4ZyZbYc+/V+q6CxCUWV4gcjC2ZFtFlKgH5 Vmr1Osj0V/gQOKBqEKsFtRhULlf52MiIfseoPr2Ok4h3ZIYgs/bs9yjN24yDqlIEbTyM /O9OLzx1hSoW0dnWfAD7bH8ZnU5/4m6blV7KKhQS0VVEAK199UCdrD7Md7J+A5gDkkhg TtLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=lkhdeeA0/Y7sax7EwcGSwCUbzMaLGs8proR78S9GZO4=; b=m1VIn1QZLYmbbYAuojONDIOnuSyN5oSHozIV/cI729Hs0w0i915OKzAvGPADcEwzL9 TKIrlV3P1CoYW+/4aTxRcIFQxEtu+2logJvsd+tTp9vzE6B9QVXDjuqxaqtAmW8dIsSL UxiWoSzollIJLne4blMneZqCzhmdp0pIVbceJXRqCPP/MObpYGcyasIdBZe+YHhIKpJc fVgnSZRubMgWbb5M5Gfq+5mNwKvsds7AfVu+fUVnxyb7jmDI3H1rrDRb7Jywx/Eket5X lAC7olnpB/sunjiy7k0KFzUw8pRRX+8CBoowYsYg/K7yH5S2kZWoXtkKbYu0g7Zl1Dia 24vA== X-Gm-Message-State: ALQs6tCMdghk3w04iTfmCCLi1I66DTw2zLT9LttDj4PQCBG1FOy3xZZ9 X0dILjxtIghl1HvF0bWLzAZSrxiWMRKddw== X-Google-Smtp-Source: AIpwx49uroscGUHJNClcD8vvSr7c4CXOZ2oYm9iLyPXYnUuHJEkXSZuVh6VB26I8znu81MJ8vzD1nQ== X-Received: by 2002:a17:902:7d10:: with SMTP id z16-v6mr931416pll.79.1523947913527; Mon, 16 Apr 2018 23:51:53 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.51.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:51:53 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , "David S. Miller " Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next 04/10] [bpf]: make generic xdp compatible w/ bpf_xdp_adjust_tail Date: Mon, 16 Apr 2018 23:51:25 -0700 Message-Id: <20180417065131.3632-5-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for generic XDP we need to reflect this packet's length change by adjusting skb's tail pointer Signed-off-by: Nikita V. Shirokov Acked-by: Alexei Starovoitov --- net/core/dev.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/net/core/dev.c b/net/core/dev.c index 969462ebb296..11c789231a03 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3996,9 +3996,9 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, struct bpf_prog *xdp_prog) { struct netdev_rx_queue *rxqueue; + void *orig_data, *orig_data_end; u32 metalen, act = XDP_DROP; struct xdp_buff xdp; - void *orig_data; int hlen, off; u32 mac_len; @@ -4037,6 +4037,7 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, xdp.data_meta = xdp.data; xdp.data_end = xdp.data + hlen; xdp.data_hard_start = skb->data - skb_headroom(skb); + orig_data_end = xdp.data_end; orig_data = xdp.data; rxqueue = netif_get_rxqueue(skb); @@ -4051,6 +4052,13 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, __skb_push(skb, -off); skb->mac_header += off; + /* check if bpf_xdp_adjust_tail was used. it can only "shrink" + * pckt. + */ + off = orig_data_end - xdp.data_end; + if (off != 0) + skb_set_tail_pointer(skb, xdp.data_end - xdp.data); + switch (act) { case XDP_REDIRECT: case XDP_TX: From patchwork Tue Apr 17 06:51:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899089 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=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="aowmE8js"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGC51NBRz9s1P for ; Tue, 17 Apr 2018 16:52:17 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752326AbeDQGwO (ORCPT ); Tue, 17 Apr 2018 02:52:14 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:34964 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752078AbeDQGvz (ORCPT ); Tue, 17 Apr 2018 02:51:55 -0400 Received: by mail-pf0-f194.google.com with SMTP id j5so2189200pfh.2 for ; Mon, 16 Apr 2018 23:51:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fAVNHwqdGhPXqTnLz5ZoIB+lMpiBx04tssZQzOM5jJI=; b=aowmE8jsRD7ANc4NtJ0iz7siqtBFMm6UQPNmx0YJ80Y3Myzqhq5N0qkPuteOcNGcUq 10ttpjv8KW3pPZfMZPmkmk3elVs/OfliDTJHqWWyIHTflLmpNAEYwodFecqMG6oUmSWY K0H+hF8Wc5c3jIV8UhXkQET0Cx7l+ZxUZNIqI7jSvW9uGJCSgbzlRReXCwFaN2AuVtV1 cFyO3bE4awYhLkbOYGvaZKJb3BVUwtYP1uFTMr8/STb13JSMYKT3lMbAK1c7QwhG1TDA LuqNpqEXlanDdmkou3M9Nq+cEw/74w/9ulURZGpF6TOQ2KQcRNuJFZqOJ1xfDybLJyG2 pwjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fAVNHwqdGhPXqTnLz5ZoIB+lMpiBx04tssZQzOM5jJI=; b=WFwXB2u6p7V/OHJbDQep4/Ku2YL5WQmppprfCIFhOhibPUyhyZ2Wfcv+GJNkIPppo7 Xsm10MkDT66cxbQMDtqcUw7/KxfsA5TIINzgbdM3FPLmCuuqf5lQY4gLJOyQk1a2ozlB tw27y3Lg6sAxrWHXvzRAml/rZQ/rauOAqQJKwDmorU+O2MYcRNn+sWJVZiXJqNtIAgKS pqqCOFis9jyukM1T8Oh2w1HNswJK0khk/syLRZ9BrEH59BpyRwgq7uAdYF0lStwqeFyr rA15dWsBooHlIcTlE5oguteN9MtfcGn+MRTszQHc3TGmgQ8CkpyBX5loMyTDr9O+rKeY RHAw== X-Gm-Message-State: ALQs6tCSe21D3Ojca0ywxVcb22aNrJp0xc9+DOeMOXRetud/iUnJAsLG LZPAhAoq39RAlIWRAfVQPfPelw== X-Google-Smtp-Source: AIpwx49vmH3Vq08rV1Ld0VlmKhIB3oo+h9S036wLMkR8+74LBGyIStUrcf/MpFHf2Q5GkBuFNwF+jw== X-Received: by 10.101.96.47 with SMTP id p15mr809381pgu.430.1523947914708; Mon, 16 Apr 2018 23:51:54 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.51.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:51:54 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , Tariq Toukan Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next 05/10] [bpf]: make mlx4 compatible w/ bpf_xdp_adjust_tail Date: Mon, 16 Apr 2018 23:51:26 -0700 Message-Id: <20180417065131.3632-6-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for mlx4 driver we will just calculate packet's length unconditionally (the same way as it's already being done in mlx5) Signed-off-by: Nikita V. Shirokov Acked-by: Alexei Starovoitov --- drivers/net/ethernet/mellanox/mlx4/en_rx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c index 5c613c6663da..efc55feddc5c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c @@ -775,8 +775,8 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud act = bpf_prog_run_xdp(xdp_prog, &xdp); + length = xdp.data_end - xdp.data; if (xdp.data != orig_data) { - length = xdp.data_end - xdp.data; frags[0].page_offset = xdp.data - xdp.data_hard_start; va = xdp.data; From patchwork Tue Apr 17 06:51:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899087 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=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="OlMVCttb"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGBs04mbz9ry1 for ; Tue, 17 Apr 2018 16:52:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752177AbeDQGv6 (ORCPT ); Tue, 17 Apr 2018 02:51:58 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:41698 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752086AbeDQGv4 (ORCPT ); Tue, 17 Apr 2018 02:51:56 -0400 Received: by mail-pl0-f66.google.com with SMTP id bj1-v6so11441451plb.8 for ; Mon, 16 Apr 2018 23:51:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=03lYhmDXyRFPmR1kQrR1VSic6FNgLis9OKHdIgJ/WQ0=; b=OlMVCttbPkG/XnrK/8NXqvNhDz9zs37fAIel2piYpv1fXZcN9z1+BGctnnvxppykpg MlYke+lXU+2Rdmw08MQuXOzdC+k+DZwnJWKEH6z8p4fkRSG5s3puUWLD3u9fvW6rtZAh /hLhblFZ32VJKBmJu9gkafVZhn6oT00o3R+iT6SVNTmDv7knvcGi4CYjtWnLDwEjxIzd owO0icLUPeU1fGLqN6dmJVDCirDJKNAAudV7VYaSzqr48Gk8Dow8joIxzeZm59wjy1WD tNZTlMwElsSPcfQ9dJOGv7EfbirsHYbgXq3DU4NqPIt1nENSSmTsNdik4ULRc+a0gbaj 3kZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=03lYhmDXyRFPmR1kQrR1VSic6FNgLis9OKHdIgJ/WQ0=; b=PPHbLBJACDvsNINMlGj5fmjDFfV7F9x6pOr8K5lL4V08lIqwphKr+VBeQW14Fg6+zW MCq9qFibRbo7webQER3WRlTOlI1TcC05NmGguV03vB1je+x9zLI8hpOwgVgQiNtHXRgv LvVMoMgubrWcIKGuvzP3fSGEXuEvw4qbHs0SimcbIHhPvNgEq26nKY/HUx1dg9kiO2bM zkdM4oIMhCBcIy4OwHlHZDbVTRLF4iIZJDBurLJy6FBZhNKxYMKMZIINUJgWq4CGCMTb Gb/DaGR2hWBcoKSBaL0W2XTdPa5xBosM4CPmnaZpKbVkHxbUhW4nfwiI4gamk1DlIXmR qmRQ== X-Gm-Message-State: ALQs6tB75TTFjuxCFwCnvIImUdHTJJdHZoHQRVZ/XlQEpoyZsUqAdN1u oWrFwULGI5sdD7GLdzM2VvCkJ3almOGqHg== X-Google-Smtp-Source: AIpwx4/K7aOrfWSHvuv48y8Y0sdrj5UNE5PoGqV0p7g8TsUzL7XILLs+HNkYZ8+zz14vwh5WR0rxYA== X-Received: by 2002:a17:902:227:: with SMTP id 36-v6mr965343plc.134.1523947916000; Mon, 16 Apr 2018 23:51:56 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.51.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:51:55 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , Michael Chan Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next 06/10] [bpf]: make bnxt compatible w/ bpf_xdp_adjust_tail Date: Mon, 16 Apr 2018 23:51:27 -0700 Message-Id: <20180417065131.3632-7-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for bnxt driver we will just calculate packet's length unconditionally Signed-off-by: Nikita V. Shirokov Acked-by: Alexei Starovoitov --- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c index 1389ab5e05df..1f0e872d0667 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c @@ -113,10 +113,10 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, if (tx_avail != bp->tx_ring_size) *event &= ~BNXT_RX_EVENT; + *len = xdp.data_end - xdp.data; if (orig_data != xdp.data) { offset = xdp.data - xdp.data_hard_start; *data_ptr = xdp.data_hard_start + offset; - *len = xdp.data_end - xdp.data; } switch (act) { case XDP_PASS: From patchwork Tue Apr 17 06:51:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899086 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=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="rCIxMttk"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGBp5bXZz9rx7 for ; Tue, 17 Apr 2018 16:52:02 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752199AbeDQGwA (ORCPT ); Tue, 17 Apr 2018 02:52:00 -0400 Received: from mail-pl0-f67.google.com ([209.85.160.67]:33754 "EHLO mail-pl0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751793AbeDQGv5 (ORCPT ); Tue, 17 Apr 2018 02:51:57 -0400 Received: by mail-pl0-f67.google.com with SMTP id w12-v6so10535365plp.0 for ; Mon, 16 Apr 2018 23:51:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2HPn7mf3+lcNObNtZCZIUizS65m0vjYZjzYnpPaqbq0=; b=rCIxMttk2vXaG/jePy2wmUr+VuhodZYlI3v5DKPYn7qsnml/4uOh5bW03VSdjfRERP RbeUhBgekE/udqKneTqSTXBuBaHQku71Vumuys8AnoeqQW8GT+11apL3hzyz3v/qYGAD bNd1uOELT67NLd8XCIKglEBBRN+UPpgl68fws/xZMRvTdIu1+lrG00trEQ5A8TWeDDI6 0Z+xq4zgCY3sujmRlHYA4wb6fDxcjDKa/qkiWMDIBX8hXqFVA/gOec3RXIhMy6oLKWhI EU7i7GtM0AxQfd33fcYNmYog3Rj/QHXj00qMiYPkny8G2CWEEsvbD0w7kKkJHhoYH4eM BZgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2HPn7mf3+lcNObNtZCZIUizS65m0vjYZjzYnpPaqbq0=; b=LDefU+RGpYzWhtdhHIGcAsorO2XAKjm7TpGBVid8G06dNyT16pZoI2N/Zmfr7/vqXn eV1jsF4hlbT5DhMnWZHH0EQuxeo7YUx0jeC42YC9KLVrC1b2rQHMZmnU+65SJ3l/0bf6 CCME8YZP2LtoO15vh5vNMoK6/uQUK6fXH7ClsVdulil9WHcyy2IYOrsUSHBm1i/yiPuA oK5X+iG8x48G/0l7Ytg6SR5inViWq5KMSQz4HlDFNzHrnuwpKHbtwbSCyWiI2XsWw8S+ aWyP8aNfdZPEX2MuXJ3zuiPp0+l3j8VbU04hD4M96oPi4noAQpzpn8Kh+ZcwBzfuhxnA hAtw== X-Gm-Message-State: ALQs6tCJ5SJgaMd0Lg2/6gN6oeV8o5YcxN019frzXEPm7pCaE+sGk7qQ RCsgf45ADeGgE0jo6dVHwiM+7KHxSxYzTw== X-Google-Smtp-Source: AIpwx4/XuMN0eF/t7Xc5nmqQ3xDvhN6LKLvHYktEwlmZJXbkEk2jnLnGziONK+YskeNywt8l8apxkQ== X-Received: by 2002:a17:902:a70c:: with SMTP id w12-v6mr946921plq.74.1523947917194; Mon, 16 Apr 2018 23:51:57 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.51.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:51:56 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , Robert Richter , Sunil Goutham Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next 07/10] [bpf]: make cavium thunder compatible w/ bpf_xdp_adjust_tail Date: Mon, 16 Apr 2018 23:51:28 -0700 Message-Id: <20180417065131.3632-8-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for cavium's thunder driver we will just calculate packet's length unconditionally Signed-off-by: Nikita V. Shirokov Acked-by: Alexei Starovoitov --- drivers/net/ethernet/cavium/thunder/nicvf_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c index 707db3304396..7135db45927e 100644 --- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c +++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c @@ -538,9 +538,9 @@ static inline bool nicvf_xdp_rx(struct nicvf *nic, struct bpf_prog *prog, action = bpf_prog_run_xdp(prog, &xdp); rcu_read_unlock(); + len = xdp.data_end - xdp.data; /* Check if XDP program has changed headers */ if (orig_data != xdp.data) { - len = xdp.data_end - xdp.data; offset = orig_data - xdp.data; dma_addr -= offset; } From patchwork Tue Apr 17 06:51:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899088 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=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="odF0CLhP"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGBx301zz9ry1 for ; Tue, 17 Apr 2018 16:52:09 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752250AbeDQGwF (ORCPT ); Tue, 17 Apr 2018 02:52:05 -0400 Received: from mail-pg0-f68.google.com ([74.125.83.68]:36472 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752145AbeDQGv6 (ORCPT ); Tue, 17 Apr 2018 02:51:58 -0400 Received: by mail-pg0-f68.google.com with SMTP id z135so2562649pgz.3 for ; Mon, 16 Apr 2018 23:51:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZSkw1ZA1261DaStlytHc0xDCbeaqhx8dwZf6J9LrX24=; b=odF0CLhPdg2lDHADv6wagoungqTLQIAhwNqftGCOYTpWWqwas72BMTHFAGty3OB+Bb 3jdOTC4bvYWTImucMzrbTkwVcjOrYPZhNA995kFfd8KXukEsIpMyVAWoh1AMnFAC5d0P IB3kwesHo+KyR4PrfBGE9FpOsXcQHV6YPw1DLDkRYk9F0I+Le6Xoiv78x/MalSxrQamI aHqq+dqpYujnNxjaayzVA6glvkVz2Pm7GiE9sm9lLWKPjaRlEEdE4fINCE51NmjvrzFK DQR2sTn9OMlF2riUJkN18StqWW8KTFgIyq4wbCAWh1+rZUsq7J8JGKe1Ov7qCMqGNZ7V hosw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZSkw1ZA1261DaStlytHc0xDCbeaqhx8dwZf6J9LrX24=; b=RQ/WaKfQyLJfsgQcV3EjZ6g/VqRfaksNV1DSjhZagohZ96f/BZJxWc67vxQ1hhSuUZ f4VdQZyUQd8C4zJSzjvtEzSWI0IX+U8gpw7irBz62G/NmLJKalv01r88Y6F80laaeVFV GedhQ4hyDDsxcV7aTr/DOufH4asaNVg1Nhef7qKaRG1SqXC9pigu40dusDHuRes6t7/o ZLEljl/5T2iG5THH71eDXIaOHD4yB3zO9t8Yy80T9TtgdmtyM0I4lO5UNLgpTTbC8GOg tBXsOPlyOUNcpicaeID7KUV4XJ0qHGED7HlA02rnID5sbRg+MynoTLmvi3oY7aao7fkY Fxuw== X-Gm-Message-State: ALQs6tAzjN7W6lNvzaWsZf4hVrQw0aqSQSL2sQbBt0pNu6o3fYX4jSD5 tWDsgUpsJCrI5/PxEysQ52u0r2bqgf6vWw== X-Google-Smtp-Source: AIpwx49q6GW0gs1F/g/UtmzpmxigavbqWrThd2HyNsvjeasVY56jAJ1KVqiCrMsDgVGsdQ+HMCA0vg== X-Received: by 10.98.207.130 with SMTP id b124mr926454pfg.9.1523947918244; Mon, 16 Apr 2018 23:51:58 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.51.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:51:57 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , Jakub Kicinski Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next 08/10] [bpf]: make netronome nfp compatible w/ bpf_xdp_adjust_tail Date: Mon, 16 Apr 2018 23:51:29 -0700 Message-Id: <20180417065131.3632-9-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for nfp driver we will just calculate packet's length unconditionally Signed-off-by: Nikita V. Shirokov Acked-by: Jakub Kicinski --- drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 1eb6549f2a54..d9111c077699 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c @@ -1722,7 +1722,7 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget) act = bpf_prog_run_xdp(xdp_prog, &xdp); - pkt_len -= xdp.data - orig_data; + pkt_len = xdp.data_end - xdp.data; pkt_off += xdp.data - orig_data; switch (act) { From patchwork Tue Apr 17 06:51:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899092 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=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="HxgTFd/w"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGFW4cjbz9s1P for ; Tue, 17 Apr 2018 16:54:23 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752087AbeDQGyV (ORCPT ); Tue, 17 Apr 2018 02:54:21 -0400 Received: from mail-pl0-f65.google.com ([209.85.160.65]:39583 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751147AbeDQGyT (ORCPT ); Tue, 17 Apr 2018 02:54:19 -0400 Received: by mail-pl0-f65.google.com with SMTP id e7-v6so11458720plt.6 for ; Mon, 16 Apr 2018 23:54:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gJaFrczty5UhggSEE01VPAo4QH1KQHq2caxWQ7xIzVg=; b=HxgTFd/w2NZt/eg//NOwPb8gIiPq88yq3TgL4eoCwCAXVn/gwGUmhImPgX2pb0pH6T q5m0XBUmWBCfNJm/u10gsjCgZDWNIhHBjKIIGp/UCMp10aTD3+UtQgytI0fEJ2E3WucL /d/fdeNtnVL2fyu109P7gi6Af/o1c3aJw3/RKQ9fYcHuA/u4LAeYojJd4nJYjq/yNbgM gYXBRfcISZnbUQcEuZP7t0OkEhgD8LkTNgY2HdhG5kpiSIJQGNmdGv3qDRRXGKxULM9U NisBHs3qM6Z+LorKLVRRbYJb/3SN7VgGMzbRLUKmuGrE0TOK2GFNo9v4xy8RCnt8lhoN KKJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=gJaFrczty5UhggSEE01VPAo4QH1KQHq2caxWQ7xIzVg=; b=b1WJS2/pSGm1LT7QdRl0QTEDkp/euOnDmlaFDwihOoiNHIls97TpdGSVmCnAfGz9c0 JQEKCVHzrHX2w4BxPghDU2EVr3M5382Ye4frDQN/Aek6TQ1PauZNwoNwX+P7Ohd3xacr M/pj0AMyTFerKc5CO5Tw6L7itycquAlH+bQZJGLjhIuWpnAD35p+wnmMKoe77V3nAHQP cmbxhn2Yqkqse33enkCKpyn+1TsTZYPFi42bGWHL5LEECFOlYxS888xIxx141lzztHKu +zE/75SXPDrDpqMYxhegRxtql9rm0UT/vLHMIlQ7p22ytRr22sAwDUIZzuPmluCT57bV ixvQ== X-Gm-Message-State: ALQs6tB80IRKOFe3Nuu2hUsg4VTXTduoOwSvCr+VbQwZqLh2ruA9m0Xj 9yaHL3HWtlqF5aIdkn5+zQteKMzAIueNvw== X-Google-Smtp-Source: AIpwx4/l2b7B21kV6kagPJskE/dmMGYFoOSoePxEALdVX5OzNIthWphO3M+7wYDmFc5csCrMdGNGGg== X-Received: by 2002:a17:902:b112:: with SMTP id q18-v6mr494297plr.371.1523948059074; Mon, 16 Apr 2018 23:54:19 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.54.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:54:18 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , Jason Wang , mst@redhat.com Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next 09/10] [bpf]: make tun compatible w/ bpf_xdp_adjust_tail Date: Mon, 16 Apr 2018 23:51:30 -0700 Message-Id: <20180417065131.3632-10-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for tun driver we need to adjust XDP_PASS handling by recalculating length of the packet if it was passed to the TCP/IP stack (in case if after xdp's prog run data_end pointer was adjusted) Signed-off-by: Nikita V. Shirokov Reviewed-by: Jason Wang --- drivers/net/tun.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 28583aa0c17d..0b488a958076 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1688,6 +1688,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, return NULL; case XDP_PASS: delta = orig_data - xdp.data; + len = xdp.data_end - xdp.data; break; default: bpf_warn_invalid_xdp_action(act); @@ -1708,7 +1709,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, } skb_reserve(skb, pad - delta); - skb_put(skb, len + delta); + skb_put(skb, len); get_page(alloc_frag->page); alloc_frag->offset += buflen; From patchwork Tue Apr 17 06:51:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nikita V. Shirokov" X-Patchwork-Id: 899093 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=tehnerd.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=tehnerd-com.20150623.gappssmtp.com header.i=@tehnerd-com.20150623.gappssmtp.com header.b="vEc4aPYL"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40QGFZ1G1Xz9ry1 for ; Tue, 17 Apr 2018 16:54:26 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752189AbeDQGyX (ORCPT ); Tue, 17 Apr 2018 02:54:23 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:40782 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751218AbeDQGyU (ORCPT ); Tue, 17 Apr 2018 02:54:20 -0400 Received: by mail-pg0-f66.google.com with SMTP id e9so3875108pgr.7 for ; Mon, 16 Apr 2018 23:54:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tehnerd-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=DpPTMXtPesPSxFFXaR/RGexmbNalYdNC4J5MMbY8gAw=; b=vEc4aPYLYcoo+4Bw5YdrJLLqg+lodC6ncTf63u9BcBtRfNczZGstiDRo78IWaeGKwy gwmWRDEprUMRJs7jSOToCWbNSUeZCYipaihn75UW8+CpAku1Ji9jQN/7JlCbkDaD7BZJ uy30533hKGOjHXwT7IDvkJaRqf7xevT/7+/763oo/JAR27oXPzHwJI8ujf+AnhlREDSX /3nzdt0/JfFT5IaEvCZTVQW59EpwTZLHBrNKF7+F1ce1+QIFBK5DfThuOya9Rj6BhS0V 0L/BwXfgr7GQIUcv3UHxV/vz7AcHz7fp67z7jpDvJ3euG3PU1GPONVLm4UptuzIgmABT pHew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=DpPTMXtPesPSxFFXaR/RGexmbNalYdNC4J5MMbY8gAw=; b=rLKVc3HPSf99SGrvH4ReVa4leWmA8h9jUOAa4Ss16Ivu6SPwGNyMrfYy/sb3/08DWz vMgk1OCQqPskEdB0WjTsWlYM9ErjlmBQap5BQNOobNd9nD6Aa/5ltLrMtvBQXsnpMjBa sy1bQweVXYml9KSg9Q4+1/CbPIoBmQMyPvv8LMbWX9qvZCbw9+RO87zk2atezvFvRo7T qFe7IMvgrYQ4krv1fMBN9PBRkeXPv0SK/8mooZqKb4LMcr+S9HDMc1kzPHUWvaHFJdbC CZJ6P0nIvM62ZapH3YBXKkwCe5mQKsNYD5tAmgEoTqvq4mXVgpkbyAqpOiOoFSaaiJG9 K2sw== X-Gm-Message-State: ALQs6tCsk2TAYlmWLIiOcyZazJ4cznQnTCNaxcNeUeVjnQx7qDwzsFn6 JU5Nv37fKHs2aAsZtUws9X3tIjgfexDiNg== X-Google-Smtp-Source: AIpwx49TpRlZiZpKRzhkDrnRumDF6qvxVJB1/IrKGNsgARXgJqNoTE8qoSeJHWbGur/03Mtxw1SfVg== X-Received: by 10.98.93.20 with SMTP id r20mr920574pfb.53.1523948060077; Mon, 16 Apr 2018 23:54:20 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u13sm32268031pfd.112.2018.04.16.23.54.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 23:54:19 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann , "Michael S. Tsirkin mst @ redhat . com , Jason Wang " Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next 10/10] [bpf]: make virtio compatible w/ bpf_xdp_adjust_tail Date: Mon, 16 Apr 2018 23:51:31 -0700 Message-Id: <20180417065131.3632-11-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180417065131.3632-1-tehnerd@tehnerd.com> References: <20180417065131.3632-1-tehnerd@tehnerd.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org w/ bpf_xdp_adjust_tail helper xdp's data_end pointer could be changed as well (only "decrease" of pointer's location is going to be supported). changing of this pointer will change packet's size. for virtio driver we need to adjust XDP_PASS handling by recalculating length of the packet if it was passed to the TCP/IP stack Signed-off-by: Nikita V. Shirokov Reviewed-by: Jason Wang --- drivers/net/virtio_net.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 7b187ec7411e..115d85f7360a 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -604,6 +604,7 @@ static struct sk_buff *receive_small(struct net_device *dev, case XDP_PASS: /* Recalculate length in case bpf program changed it */ delta = orig_data - xdp.data; + len = xdp.data_end - xdp.data; break; case XDP_TX: sent = __virtnet_xdp_xmit(vi, &xdp); @@ -637,7 +638,7 @@ static struct sk_buff *receive_small(struct net_device *dev, goto err; } skb_reserve(skb, headroom - delta); - skb_put(skb, len + delta); + skb_put(skb, len); if (!delta) { buf += header_offset; memcpy(skb_vnet_hdr(skb), buf, vi->hdr_len); @@ -752,6 +753,10 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, offset = xdp.data - page_address(xdp_page) - vi->hdr_len; + /* recalculate len if xdp.data or xdp.data_end were + * adjusted + */ + len = xdp.data_end - xdp.data; /* We can only create skb based on xdp_page. */ if (unlikely(xdp_page != page)) { rcu_read_unlock();