From patchwork Wed Jan 23 17:22:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 1030079 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=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="Ax7KN1Wp"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43lBtk2sJsz9s4s for ; Thu, 24 Jan 2019 04:22:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726225AbfAWRWg (ORCPT ); Wed, 23 Jan 2019 12:22:36 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:44107 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725945AbfAWRWg (ORCPT ); Wed, 23 Jan 2019 12:22:36 -0500 Received: by mail-pl1-f195.google.com with SMTP id e11so1482932plt.11 for ; Wed, 23 Jan 2019 09:22:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=5yMVFgmImpmjOizVKLJ2aFrsggbx5bwJu8EFrgRNp1o=; b=Ax7KN1WpPZ7HAKtGK2Hj6582LqPQAtZ4EyNtIGhiboDIdRUgy+tdBr0pmjCVNdaa3A cpziFr0ChcbvksDFSOMPp3yamjcrCFHi9CrKGEpH34/gH81jYa++rHElFjJia5IaoXn0 0GAh7YOusIbEyofKu9/IhtusfR4/LVrCELipTjKj/6jKT9dngJRZqgoMuxz83bJp1wa7 8OvWcsT0xQsjKgTir+KsIyZL7OL5Qgy8r/p3LuoDKb6FxpuIas+TpCZy9axKOyGeG9Zb 0ncj42JDTZhydyQ8CkaVIk8U+0BkNqtYoOeRCPwoNg4Sk63i0vDZTTBe+OLUIoXpnwYn 2GGw== 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:mime-version :content-transfer-encoding; bh=5yMVFgmImpmjOizVKLJ2aFrsggbx5bwJu8EFrgRNp1o=; b=s/TqgsUfaAGCpRSpPRMe44aBkc1gmC0Wr9ulfAWoRT+WBW/HoUoZN5odDdsgJ5s4qK /UC1Ay+qlernkUUTc2o9YvVuxoSiwsszcimLmwqWnMOFd8TJ5OV0VKiLwAuDQ2K09kaR l7aW+2L42+n8MXvR5SGZHHoWF34cIJPHQWQcSVdIU5ZeIUot5ip5LU8wXndwFMnrMSFt pjqILZ26HgvLF5391o/fVsMxJxHDmHw+YiIn8qZ+q2kJ947ieX3xl6Oo5MgB3CCY4A+x w1sh8X8Fb5XjgEat8qMTSZm33TsvNCBV8+32xTvBrd03/n2viDI6MrAasGFXHRPA6LgZ Hz0g== X-Gm-Message-State: AJcUukfao/DKQwTGcFviYVIwf4WuHxLIMmqmGVfl4Eg+WOTfa9k7ixd0 O9Fh6oaXHXucSNiMQrybCNIWRw== X-Google-Smtp-Source: ALg8bN55olsNo173uyUEoVIw6koj9as+5dBKCZFe0clfvJZoXoi/C5bUKOOwa3mNMpQ1qbulb+4gDQ== X-Received: by 2002:a17:902:b406:: with SMTP id x6mr2888963plr.329.1548264155583; Wed, 23 Jan 2019 09:22:35 -0800 (PST) Received: from localhost ([2620:15c:2c4:201:f5a:7eca:440a:3ead]) by smtp.gmail.com with ESMTPSA id m19sm39458290pgn.35.2019.01.23.09.22.34 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 23 Jan 2019 09:22:34 -0800 (PST) From: Eric Dumazet To: Alexei Starovoitov Cc: Daniel Borkmann , netdev , Eric Dumazet , Eric Dumazet , Eddie Hao , Martin KaFai Lau Subject: [PATCH v3 bpf-next] bpf: allow BPF programs access skb_shared_info->gso_segs field Date: Wed, 23 Jan 2019 09:22:27 -0800 Message-Id: <20190123172227.203429-1-edumazet@google.com> X-Mailer: git-send-email 2.20.1.321.g9e740568ce-goog MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This adds the ability to read gso_segs from a BPF program. v3: Use BPF_REG_AX instead of BPF_REG_TMP for the temporary register, as suggested by Martin. v2: refined Eddie Hao patch to address Alexei feedback. Signed-off-by: Eric Dumazet Cc: Eddie Hao Cc: Martin KaFai Lau Acked-by: Martin KaFai Lau --- include/uapi/linux/bpf.h | 1 + net/core/filter.c | 21 ++++++++++++ tools/include/uapi/linux/bpf.h | 1 + tools/testing/selftests/bpf/test_verifier.c | 36 +++++++++++++++++++++ 4 files changed, 59 insertions(+) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 91c43884f295f60a85268ddf0020bf8aa47f8329..2940a9854f6d8e493518ca894e0c9c630ae4ab7a 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -2540,6 +2540,7 @@ struct __sk_buff { __bpf_md_ptr(struct bpf_flow_keys *, flow_keys); __u64 tstamp; __u32 wire_len; + __u32 gso_segs; }; struct bpf_tunnel_key { diff --git a/net/core/filter.c b/net/core/filter.c index 2b3b436ef5457bf44c99780d6dec0b5f403f005c..8e587dd1da200494b900bd14eec7f875f5453773 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -6700,6 +6700,27 @@ static u32 bpf_convert_ctx_access(enum bpf_access_type type, target_size)); break; + case offsetof(struct __sk_buff, gso_segs): + /* si->dst_reg = skb_shinfo(SKB); */ +#ifdef NET_SKBUFF_DATA_USES_OFFSET + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct sk_buff, head), + si->dst_reg, si->src_reg, + offsetof(struct sk_buff, head)); + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct sk_buff, end), + BPF_REG_AX, si->src_reg, + offsetof(struct sk_buff, end)); + *insn++ = BPF_ALU64_REG(BPF_ADD, si->dst_reg, BPF_REG_AX); +#else + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct sk_buff, end), + si->dst_reg, si->src_reg, + offsetof(struct sk_buff, end)); +#endif + *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct skb_shared_info, gso_segs), + si->dst_reg, si->dst_reg, + bpf_target_off(struct skb_shared_info, + gso_segs, 2, + target_size)); + break; case offsetof(struct __sk_buff, wire_len): BUILD_BUG_ON(FIELD_SIZEOF(struct qdisc_skb_cb, pkt_len) != 4); diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 91c43884f295f60a85268ddf0020bf8aa47f8329..2940a9854f6d8e493518ca894e0c9c630ae4ab7a 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -2540,6 +2540,7 @@ struct __sk_buff { __bpf_md_ptr(struct bpf_flow_keys *, flow_keys); __u64 tstamp; __u32 wire_len; + __u32 gso_segs; }; struct bpf_tunnel_key { diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c index 2fd90d4568926d13542783c870507d43a6d6bb64..2c46531044bdf9ec1e4fa47e2c94c9edb0ac3d08 100644 --- a/tools/testing/selftests/bpf/test_verifier.c +++ b/tools/testing/selftests/bpf/test_verifier.c @@ -5663,6 +5663,42 @@ static struct bpf_test tests[] = { .result = ACCEPT, .prog_type = BPF_PROG_TYPE_CGROUP_SKB, }, + { + "read gso_segs from CGROUP_SKB", + .insns = { + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, + offsetof(struct __sk_buff, gso_segs)), + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }, + .result = ACCEPT, + .prog_type = BPF_PROG_TYPE_CGROUP_SKB, + }, + { + "write gso_segs from CGROUP_SKB", + .insns = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, + offsetof(struct __sk_buff, gso_segs)), + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }, + .result = REJECT, + .result_unpriv = REJECT, + .errstr = "invalid bpf_context access off=164 size=4", + .prog_type = BPF_PROG_TYPE_CGROUP_SKB, + }, + { + "read gso_segs from CLS", + .insns = { + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, + offsetof(struct __sk_buff, gso_segs)), + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }, + .result = ACCEPT, + .prog_type = BPF_PROG_TYPE_SCHED_CLS, + }, { "multiple registers share map_lookup_elem result", .insns = {