From patchwork Wed Apr 18 04:29:41 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: 899918 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="zmPZGjPR"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Qs7x1G1Dz9s1v for ; Wed, 18 Apr 2018 16:06:37 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752710AbeDRGFw (ORCPT ); Wed, 18 Apr 2018 02:05:52 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:42124 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752633AbeDRGFu (ORCPT ); Wed, 18 Apr 2018 02:05:50 -0400 Received: by mail-pl0-f66.google.com with SMTP id t20-v6so455042ply.9 for ; Tue, 17 Apr 2018 23:05:50 -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=hJY/2bk41zsPt1c8hEWT+qvutcA7iestdxRJ4lUNFZM=; b=zmPZGjPR+wH45UxpeZ3HpgpqxEwgblTrEuRXO8Bk288G73wpL7ASrQanWIGrdtA5FS z3hZU/grLfgCdA2XNkJtSg2AhIlZqsdPyLPTusfJAvhuQHxvGWpd1OW8Qc1R+DMM9o58 2qRQYTA3OgtQJSY1HPTXaE6CnffUonXVRj3Gqshnk8djWoclbi1BsQC1b0Klmmm2MyKg XhDpdSi1GVB6/e7q7lpmMW8XyuY/IFRKAI/VSW4DzAxHGczAVw0tS239V/+R0fbOXaFD D40mtx+p2ZOJZDVH2IC/OwIzEsrdDJfKwNjIuKQXqBIg5QvCe1pJsTy58uCNkcQxrUHf StQA== 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=hJY/2bk41zsPt1c8hEWT+qvutcA7iestdxRJ4lUNFZM=; b=JRvzWvQk7+5YwFwR4MUBUJASlInwWJjf9oHGEbCY0LvGoNKMFJcI4hhLU8clKdeSNS psJ6wl4riupJcrEXYbpB6vOLyvUrgTALV7hubYi76bgGTwJPRm7RTzpQU5m+908yEJfx IN7xcCJ3kZHEuwXjzdWVCV6nm8CUW9Q7CzTKHQxh5uv40M407vHRB5073cdFhLlMDPJk kUIhlOWUNPJwaWUakv8K9/kf5nF8VnlGjRNU3gdMaFmUc8g7xGSNmTcBAIVThUbZnoJV mj836yuzGG05Z7KakQnbuNhbox5Ec8znH3/GOCyF2E2SrcUMuzEGVadf+E8rEnZPhI4P P0uQ== X-Gm-Message-State: ALQs6tAN9Z3wuhbJYqWrL9aRyrrxmBGDhm2KIMLe8Z4Oexhl1+AgLo12 WUXse1kRKmC1KXKvHdhyitV/1w== X-Google-Smtp-Source: AIpwx49ceA3UhV1sIqk0X3qq8wMmFMt65D2RYFXjaIyUAWKfxj/pvg0ttIOLNxu91L1KB/tt3E2LWQ== X-Received: by 2002:a17:902:7084:: with SMTP id z4-v6mr830863plk.364.1524031549841; Tue, 17 Apr 2018 23:05:49 -0700 (PDT) Received: from maindev.thefacebook.com ([199.201.64.2]) by smtp.gmail.com with ESMTPSA id a6sm799141pfo.157.2018.04.17.23.05.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 23:05:49 -0700 (PDT) From: "Nikita V. Shirokov" To: Alexei Starovoitov , Daniel Borkmann Cc: netdev@vger.kernel.org, "Nikita V. Shirokov" Subject: [PATCH bpf-next v2 01/11] bpf: adding bpf_xdp_adjust_tail helper Date: Tue, 17 Apr 2018 21:29:41 -0700 Message-Id: <20180418042951.17183-2-tehnerd@tehnerd.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180418042951.17183-1-tehnerd@tehnerd.com> References: <20180418042951.17183-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. --- 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); }