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); }