From patchwork Wed Apr 18 04:42:13 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: 900110 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="xQ1/HbAn"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40R2pV5Bfwz9s3Z for ; Wed, 18 Apr 2018 23:22:10 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753928AbeDRNWI (ORCPT ); Wed, 18 Apr 2018 09:22:08 -0400 Received: from mail-pl0-f67.google.com ([209.85.160.67]:44038 "EHLO mail-pl0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753896AbeDRNWG (ORCPT ); Wed, 18 Apr 2018 09:22:06 -0400 Received: by mail-pl0-f67.google.com with SMTP id s13-v6so1110678plq.11 for ; Wed, 18 Apr 2018 06:22:06 -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=FAA28oXYCEJG6N9ulEKYDWLu6uTXFnU0VI555lC514I=; b=xQ1/HbAn3AXymqmh2+mCtpu4f6y/bDghPe7QNDfWxuRWsaw4yUlL+v3tEDVtnN7rtA CFGwyqRosFofUJgHfoM24qahdqhAqtcWsG2Upy/k239jyX8tSNRdwBdRIf8o01FX0hE7 nLhIR3T/2SBoGz8XODScHihZox2ccMI4VSyVrXOkHc/4Jd4me3Xi305iasLuw4AhX6/q 08ENN4KVOq/LygqXXjTGWW7aCA3hd9oCB+v4nN4S3HQq9nhwzfC9Y9La8Grmq77uNcAS TAhmADeGVnyEnC/YaCmNh5f3FwgmqF6oyXjVcvaLcOq5dLchCTCIZfiJLNJjbA8Wx9S2 iJkA== 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=FAA28oXYCEJG6N9ulEKYDWLu6uTXFnU0VI555lC514I=; b=ul6CU4Iwh8L2oU0iVw/mJLr/2r9p69QyqdMce6wQZ4nYR5TvMKWMnm17wLSo/mWcdH SFpNRRZmEHiOe/tPPlVCGvg63YvnA5is1dPCrjmbg3QRl5p5PCvIftWGNtEkeAoAGoCa W5W0gJnpNciDSFnPH2caDzHyVu00yJIpkH7ZK4JISY1C7cWvE8JwKU9n5/86NxAv32Q2 coEqXLcYmsOC6kAyl81Zo1qjjhv5GX3ujJXvX0i/8w96hjn2Q8v+sqX7QrzKpaH5MxH/ P9cNLByaJnOfhnBWSld4KzUuQBZd0s2fp+IBaSPr0M4fhuC9fmgx/bFX4Pj0jlhg/suJ zjIg== X-Gm-Message-State: ALQs6tDmWN+alCwFwA34PtQlwJuwIJ9YKBQUN+GVdzovdhf9nDDhzGP9 k8nSSjYErGNvYy7nuSOmqE8h7w== X-Google-Smtp-Source: AIpwx49nlPXqSbmzRS3puTDFYPKQhq0Rk8/hVfW8zL/X9I4TEz9P1277mKp7+aDvh4A1MNV8uDcANA== X-Received: by 2002:a17:902:b595:: with SMTP id a21-v6mr2115016pls.68.1524057725734; Wed, 18 Apr 2018 06:22:05 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id u7sm3836378pfa.96.2018.04.18.06.22.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 18 Apr 2018 06:22:05 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v3 01/11] bpf: adding bpf_xdp_adjust_tail helper Date: Tue, 17 Apr 2018 21:42:13 -0700 Message-Id: <20180418044223.17685-2-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418044223.17685-1-tehnerd@tehnerd.com> References: <20180418044223.17685-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 Acked-by: Alexei Starovoitov --- 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 a374b8560bc4..29318598fd60 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -2725,6 +2725,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) +{ + void *data_end = xdp->data_end + offset; + + /* only shrinking is allowed for now. */ + if (unlikely(offset >= 0)) + return -EINVAL; + + 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; @@ -3074,7 +3098,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; @@ -3888,6 +3913,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); }