From patchwork Wed Sep 12 00:36:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joe Stringer X-Patchwork-Id: 968774 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=wand.net.nz Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="OMQNWghu"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4292sZ0YS7z9s3Z for ; Wed, 12 Sep 2018 10:36:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726636AbeILFif (ORCPT ); Wed, 12 Sep 2018 01:38:35 -0400 Received: from mail-oi0-f68.google.com ([209.85.218.68]:34097 "EHLO mail-oi0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726454AbeILFie (ORCPT ); Wed, 12 Sep 2018 01:38:34 -0400 Received: by mail-oi0-f68.google.com with SMTP id 13-v6so357697ois.1 for ; Tue, 11 Sep 2018 17:36:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id; bh=91aTdaKMAhm7vFOrSz76s0WuLRE9r+7ZstLLzeLQG1w=; b=OMQNWghup542XYHCcAbvJIEU78IssPj2QafH+TEWLdWZCh7OEuAtOZ7KNeuCWtE/AS bbYiWLOj6W5hUMWOG9Udj8Kk217IFco301IFxkzuLzIWuzZtNxGkO5xOp4e3rSMT4aTC Ln6uXxwdd9uExm6iINxbiSkGy3R46PYwoyVu4qtBYa6fs1xIdwGArSC2c8S/F3hWnXMu SZw+rD+zEobacH1VenbA/pjofqTk0UWaPWfFoKtzq59gxgvxAICN3AvNztLevGbexGDk t+eVehvOYIdTfRDAI5+29pckFzFQaWYLztEK/NbaGUFdiUHdXNYU8kwtSqL4xH8SrQ3R s9BQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=91aTdaKMAhm7vFOrSz76s0WuLRE9r+7ZstLLzeLQG1w=; b=XkYIkrljSuenAXpiB/uXq7Ox9j/xHsWeOnsYH1Kz0WpGqhrH+9lEaMA+FFHyePRiUH GeU7XO3GQD7MPeC2auYfE+xWIekR+gq1J/cduUPBTsI3O6emJQXZdpIMtPLyER3fMnko G31wR5yep/HciiNjmAUyZMt0+SUXCsAT8ZceZZ0PgSu7pbI7LN1pQYcTQu/ETe73GWH3 mNZzRS3y9tst437stvTmJaV/zyfDS0MKn3MnjE7mKbDOvfHjCDDaKHQS40bXAG++OzsM BcQGaxGmjL26qFEPGL7FUQJk97+LW9L8Xk/wjwoj0dOqGc16AHU8IetoSYvSa/T3DeTl RUUA== X-Gm-Message-State: APzg51DikWbISXIgmlti1x8zp234rQkRa6CPLbwHYNzQ4o3D/4aUuYJE TihjDLijvLiONGXoPFU+saU= X-Google-Smtp-Source: ANB0VdaM3IAibi0sXzoDdTl0ckFqU+OZTGPy8UYV/tBLq73nMEyRWbIyaLzSPDtgMISzmLC0tKgwVg== X-Received: by 2002:aca:3e03:: with SMTP id l3-v6mr31805154oia.54.1536712605215; Tue, 11 Sep 2018 17:36:45 -0700 (PDT) Received: from allosaurus.lan ([99.0.85.34]) by smtp.gmail.com with ESMTPSA id s145-v6sm39598850oih.16.2018.09.11.17.36.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Sep 2018 17:36:43 -0700 (PDT) From: Joe Stringer To: daniel@iogearbox.net Cc: netdev@vger.kernel.org, ast@kernel.org, john.fastabend@gmail.com, tgraf@suug.ch, kafai@fb.com, nitin.hande@gmail.com, mauricio.vasquez@polito.it Subject: [PATCH bpf-next 00/11] Add socket lookup support Date: Tue, 11 Sep 2018 17:36:29 -0700 Message-Id: <20180912003640.28316-1-joe@wand.net.nz> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This series proposes a new helper for the BPF API which allows BPF programs to perform lookups for sockets in a network namespace. This would allow programs to determine early on in processing whether the stack is expecting to receive the packet, and perform some action (eg drop, forward somewhere) based on this information. The series is structured roughly into: * Misc refactor * Add the socket pointer type * Add reference tracking to ensure that socket references are freed * Extend the BPF API to add sk_lookup_xxx() / sk_release() functions * Add tests/documentation The helper proposed in this series includes a parameter for a tuple which must be filled in by the caller to determine the socket to look up. The simplest case would be filling with the contents of the packet, ie mapping the packet's 5-tuple into the parameter. In common cases, it may alternatively be useful to reverse the direction of the tuple and perform a lookup, to find the socket that initiates this connection; and if the BPF program ever performs a form of IP address translation, it may further be useful to be able to look up arbitrary tuples that are not based upon the packet, but instead based on state held in BPF maps or hardcoded in the BPF program. Currently, access into the socket's fields are limited to those which are otherwise already accessible, and are restricted to read-only access. Changes since RFC: * Split up sk_lookup() into sk_lookup_tcp(), sk_lookup_udp(). * Only take references on the socket when necessary. * Make sk_release() only free the socket reference in this case. * Fix some runtime reference leaks: * Disallow BPF_LD_[ABS|IND] instructions while holding a reference. * Disallow bpf_tail_call() while holding a reference. * Prevent the same instruction being used for reference and other pointer type. * Simplify locating copies of a reference during helper calls by caching the pointer id from the caller. * Fix kbuild compilation warnings with particular configs. * Improve code comments describing the new verifier pieces. * Testing courtesy of Nitin * Rebase This tree is also available at: https://github.com/joestringer/linux/commits/submit/sk-lookup-v1 Joe Stringer (11): bpf: Add iterator for spilled registers bpf: Simplify ptr_min_max_vals adjustment bpf: Generalize ptr_or_null regs check bpf: Add PTR_TO_SOCKET verifier type bpf: Macrofy stack state copy bpf: Add reference tracking to verifier bpf: Add helper to retrieve socket in BPF selftests/bpf: Add tests for reference tracking libbpf: Support loading individual progs selftests/bpf: Add C tests for reference tracking Documentation: Describe bpf reference tracking Documentation/networking/filter.txt | 64 ++ include/linux/bpf.h | 17 + include/linux/bpf_verifier.h | 37 +- include/uapi/linux/bpf.h | 54 +- kernel/bpf/verifier.c | 599 ++++++++++++++---- net/core/filter.c | 175 ++++- tools/include/uapi/linux/bpf.h | 54 +- tools/lib/bpf/libbpf.c | 4 +- tools/lib/bpf/libbpf.h | 3 + tools/testing/selftests/bpf/Makefile | 2 +- tools/testing/selftests/bpf/bpf_helpers.h | 12 + tools/testing/selftests/bpf/test_progs.c | 38 ++ .../selftests/bpf/test_sk_lookup_kern.c | 128 ++++ tools/testing/selftests/bpf/test_verifier.c | 373 ++++++++++- 14 files changed, 1426 insertions(+), 134 deletions(-) create mode 100644 tools/testing/selftests/bpf/test_sk_lookup_kern.c