From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4E47FC282CC for ; Tue, 5 Feb 2019 17:36:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 223F1217D6 for ; Tue, 5 Feb 2019 17:36:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ORVS681j" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729437AbfBERgr (ORCPT ); Tue, 5 Feb 2019 12:36:47 -0500 Received: from mail-it1-f202.google.com ([209.85.166.202]:39861 "EHLO mail-it1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726550AbfBERgp (ORCPT ); Tue, 5 Feb 2019 12:36:45 -0500 Received: by mail-it1-f202.google.com with SMTP id k133so6875355ite.4 for ; Tue, 05 Feb 2019 09:36:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=EUPKO4t71/d9w34OjWYVPDR8nFKW4Bmy3TKhiFBDKC4=; b=ORVS681jPMPX4RxslK1J5tJli8Br+1w1MhDKSGQMJv+iDX40nkMYXILO78lVBV7Z9C PliObCMm2QRiF6fWJphXLK85Qhh0r0qSR6adK5ylpwp56Ag9H7H4EU/sPxB2PPBgH+Hg TrP6TUsjEHbB+1oU6BpyNWmEi+olr+oMSfqiQEGTanULg7Zj7yEWOYmrmBIFB+VidiFN cK1iVo3Vq2p0R13a5SzbTE0EIPpgGJSVGup5ObWWO4n/utCoTAMieXS4xuElzHwd/mVk Y7WGhV6GqO2wr1PIKRBo2XxNf5mu3kGvP5Q2aRm35B9xMn5/cWhdHbWaYQ3nSGT9EcNc eEiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=EUPKO4t71/d9w34OjWYVPDR8nFKW4Bmy3TKhiFBDKC4=; b=C8iHdYd/Wr1cWTMR/5peFGF2a391dTSFe1OFvrccGjQ+v8LWW+UcoZGtClSuvey6ok LrDt1hBmHnxJ2LYb/boXLi4AsI9lpw3P9mTU5tL8xeDZlM7RAELqmyrE7UoWOT1EAVkT 4P5LOcedwv8EZjhUmdVqqh49bx5Uq/inLU4/pjJsuaHr6qvFRYOIeRruyy2OdnE6WA9B S9ki0h5oPl5hG7PLDbjsREbKK+laykcM/pUxu210d5VG3u80M8eFNqP4Thukk/44QwaY 6h++PmNbuvo6+3Chk/LrKIwSflfvJWsQCZ6oaoYZypF0NjSjdWPsS1Rwc3QLDh5c8BQr wf/A== X-Gm-Message-State: AHQUAubRoIxbN/gNLTBxGRZZWK4d3WXWiFgVZuW7oDnN5bTmQNzoiiLx kLwrzU+8TtvjY7KUG1X42WrHY8c5kJ7N6gQEvDJnrKLMPBT0G8REhNVSUP5asqkbVFSLXIQu1d/ MxYfJMdR/wa0HC3n2Hc1eAUAxr9LpIdfCsNY6TIilhcSZySsq7p3VYg== X-Google-Smtp-Source: AHgI3IZbmJHoNyrM/M4cRBNVD2xCtdEKilXuu2ZchOEx+SIOiVmcKE50H4T/L3G81GIC4xaUz+Y+9Q4= X-Received: by 2002:a24:100a:: with SMTP id 10mr3668588ity.34.1549388204686; Tue, 05 Feb 2019 09:36:44 -0800 (PST) Date: Tue, 5 Feb 2019 09:36:27 -0800 In-Reply-To: <20190205173629.160717-1-sdf@google.com> Message-Id: <20190205173629.160717-6-sdf@google.com> Mime-Version: 1.0 References: <20190205173629.160717-1-sdf@google.com> X-Mailer: git-send-email 2.20.1.611.gfbb209baf1-goog Subject: [RFC bpf-next 5/7] bpf: when doing BPF_PROG_TEST_RUN for flow dissector use no-skb mode From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, simon.horman@netronome.com, willemb@google.com, Stanislav Fomichev Content-Type: text/plain; charset="UTF-8" Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Now that we have __flow_bpf_dissect which works on raw data (by constructing temporary on-stack skb), use it when doing BPF_PROG_TEST_RUN for flow dissector. This should help us catch any possible bugs due to missing shinfo on the on-stack skb. Note that existing __skb_flow_bpf_dissect swallows L2 headers and returns nhoff=0, we need to preserve the existing behavior. Signed-off-by: Stanislav Fomichev --- net/bpf/test_run.c | 52 +++++++++++++++------------------------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 2c5172b33209..502ae0e866d3 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -249,10 +249,8 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog, u32 repeat = kattr->test.repeat; struct bpf_flow_keys flow_keys; u64 time_start, time_spent = 0; - struct bpf_skb_data_end *cb; + const struct ethhdr *eth; u32 retval, duration; - struct sk_buff *skb; - struct sock *sk; void *data; int ret; u32 i; @@ -260,35 +258,14 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog, if (prog->type != BPF_PROG_TYPE_FLOW_DISSECTOR) return -EINVAL; - data = bpf_test_init(kattr, size, NET_SKB_PAD + NET_IP_ALIGN, - SKB_DATA_ALIGN(sizeof(struct skb_shared_info))); + if (size < ETH_HLEN) + return -EINVAL; + + data = bpf_test_init(kattr, size, 0, 0); if (IS_ERR(data)) return PTR_ERR(data); - sk = kzalloc(sizeof(*sk), GFP_USER); - if (!sk) { - kfree(data); - return -ENOMEM; - } - sock_net_set(sk, current->nsproxy->net_ns); - sock_init_data(NULL, sk); - - skb = build_skb(data, 0); - if (!skb) { - kfree(data); - kfree(sk); - return -ENOMEM; - } - skb->sk = sk; - - skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN); - __skb_put(skb, size); - skb->protocol = eth_type_trans(skb, - current->nsproxy->net_ns->loopback_dev); - skb_reset_network_header(skb); - - cb = (struct bpf_skb_data_end *)skb->cb; - cb->qdisc_cb.flow_keys = &flow_keys; + eth = (struct ethhdr *)data; if (!repeat) repeat = 1; @@ -297,9 +274,15 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog, for (i = 0; i < repeat; i++) { preempt_disable(); rcu_read_lock(); - retval = __skb_flow_bpf_dissect(prog, skb, - &flow_keys_dissector, - &flow_keys); + retval = __flow_bpf_dissect(prog, data, + eth->h_proto, ETH_HLEN, + size, + &flow_keys_dissector, + &flow_keys); + if (flow_keys.nhoff >= ETH_HLEN) + flow_keys.nhoff -= ETH_HLEN; + if (flow_keys.thoff >= ETH_HLEN) + flow_keys.thoff -= ETH_HLEN; rcu_read_unlock(); preempt_enable(); @@ -317,8 +300,7 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog, ret = bpf_test_finish(kattr, uattr, &flow_keys, sizeof(flow_keys), retval, duration); - - kfree_skb(skb); - kfree(sk); + kfree(data); return ret; + } -- 2.20.1.611.gfbb209baf1-goog