From patchwork Wed Nov 7 22:43:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 10673197 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 17CE517D4 for ; Wed, 7 Nov 2018 22:44:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 092F32D3DC for ; Wed, 7 Nov 2018 22:44:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EE3942D3FA; Wed, 7 Nov 2018 22:44:07 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9990C2D3D5 for ; Wed, 7 Nov 2018 22:44:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727446AbeKHIQg (ORCPT ); Thu, 8 Nov 2018 03:16:36 -0500 Received: from mail-ot1-f74.google.com ([209.85.210.74]:47130 "EHLO mail-ot1-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727442AbeKHIQg (ORCPT ); Thu, 8 Nov 2018 03:16:36 -0500 Received: by mail-ot1-f74.google.com with SMTP id m21so12016861otl.14 for ; Wed, 07 Nov 2018 14:44:06 -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=ORL5j8b/m1OmB7Hasq8yWBseIa8g/+0VcfbWrTQqk8U=; b=OVzb0h6CmnIKSbAjoB63T4/CYgFOsw7ZjNCA1+jef626WQt9U++G6N83+k7bcaHeID 40ww9DQP20X1oYGHhxnj3ww8kpg+QG1p/c4tp3ig6PUomQQAZrvyqysOnxrPHk094lzc sA2pcx6DIhTIamZmT/Bg6wTydzl1Zuv3pafpBjEApIb5kLQ7G6RmNQP/qQ8UV2YKuRh3 4OMVElU9IUYYUuTamusmiUpHTQLtEmAsIFIXhC/7wSjH+8IQRemy7WnntJpB02cLOwTw xtQX93WGvnEEW67iv4eyfzvLITlNYoMPcsmbg8cSaAd9rikr59CaYK8uq/lH9nxOBvHI gXYw== 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=ORL5j8b/m1OmB7Hasq8yWBseIa8g/+0VcfbWrTQqk8U=; b=sJXRRdAK4/aZTRy82zwaoMUA7Q43sFWQI6Eu8fuUK96QM+reDEeS3aO/4So1DQVo3R U7sPTwaGfbYlNfHYAfuGvOGPXGS7wrNBuDl+Pd+dsQOnVI8xKvcejMbj+ED0V7fqB31D tJTjLf4wCA5vETv1YcSNvGO95wcAAaNDIniCBejYas6obL6TG2IU3aRX2kShSqoA0l4e 1rxptpY6fH6TNahwkn0SYCCKNx6XKu6x7D22/ilIFBMVv4D27bl1fId2Fd0ljrZ+oFpY tE58/AbU/Q4/PABQ8OzOAG87ibOgi1NJZ5g4/hTden/pTbLOZIXoeY0cA8lSlJFJAoic K39g== X-Gm-Message-State: AGRZ1gIrulRLe4QOHeR55fGel1OgeSyJZJblM2dvw45Pk+7Seq2yrBuq 6rsc6imjT+k5eVriCKYgDwY7Od0= X-Google-Smtp-Source: AJdET5euuI6LTICVwftbBrzjkOm7UIBYWVLrP4Bq4p0PKudlrj3KThmYqlEc6Tw8vMUyd0NJMaugrH8= X-Received: by 2002:a9d:2caa:: with SMTP id p39mr1501486otb.36.1541630646414; Wed, 07 Nov 2018 14:44:06 -0800 (PST) Date: Wed, 7 Nov 2018 14:43:54 -0800 In-Reply-To: <20181107224356.73080-1-sdf@google.com> Message-Id: <20181107224356.73080-2-sdf@google.com> Mime-Version: 1.0 References: <20181107224356.73080-1-sdf@google.com> X-Mailer: git-send-email 2.19.1.930.g4563a0d9d0-goog Subject: [PATCH bpf-next 1/3] selftests/bpf: rename flow dissector section to flow_dissector From: Stanislav Fomichev To: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, ast@kernel.org, daniel@iogearbox.net, shuah@kernel.org, jakub.kicinski@netronome.com, quentin.monnet@netronome.com Cc: guro@fb.com, jiong.wang@netronome.com, sdf@google.com, bhole_prashant_q7@lab.ntt.co.jp, john.fastabend@gmail.com, jbenc@redhat.com, treeze.taeung@gmail.com, yhs@fb.com, osk@fb.com, sandipan@linux.vnet.ibm.com Sender: linux-kselftest-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Makes it compatible with the logic that derives program type from section name in libbpf_prog_type_by_name. Signed-off-by: Stanislav Fomichev --- tools/testing/selftests/bpf/bpf_flow.c | 2 +- tools/testing/selftests/bpf/test_flow_dissector.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/bpf_flow.c b/tools/testing/selftests/bpf/bpf_flow.c index 107350a7821d..b9798f558ca7 100644 --- a/tools/testing/selftests/bpf/bpf_flow.c +++ b/tools/testing/selftests/bpf/bpf_flow.c @@ -116,7 +116,7 @@ static __always_inline int parse_eth_proto(struct __sk_buff *skb, __be16 proto) return BPF_DROP; } -SEC("dissect") +SEC("flow_dissector") int _dissect(struct __sk_buff *skb) { if (!skb->vlan_present) diff --git a/tools/testing/selftests/bpf/test_flow_dissector.sh b/tools/testing/selftests/bpf/test_flow_dissector.sh index c0fb073b5eab..d23d4da66b83 100755 --- a/tools/testing/selftests/bpf/test_flow_dissector.sh +++ b/tools/testing/selftests/bpf/test_flow_dissector.sh @@ -59,7 +59,7 @@ else fi # Attach BPF program -./flow_dissector_load -p bpf_flow.o -s dissect +./flow_dissector_load -p bpf_flow.o -s flow_dissector # Setup tc qdisc add dev lo ingress From patchwork Wed Nov 7 22:43:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 10673199 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 86FF113A4 for ; Wed, 7 Nov 2018 22:44:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7A1D12D353 for ; Wed, 7 Nov 2018 22:44:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6D82B2D3FA; Wed, 7 Nov 2018 22:44:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0C76A2BE12 for ; Wed, 7 Nov 2018 22:44:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727525AbeKHIQj (ORCPT ); Thu, 8 Nov 2018 03:16:39 -0500 Received: from mail-qk1-f201.google.com ([209.85.222.201]:48040 "EHLO mail-qk1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726896AbeKHIQj (ORCPT ); Thu, 8 Nov 2018 03:16:39 -0500 Received: by mail-qk1-f201.google.com with SMTP id f81-v6so34063420qkb.14 for ; Wed, 07 Nov 2018 14:44:09 -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=ITaH908544W3r0Lffx6rTGx68a49RgNIMs0BR9o+fME=; b=fcFkjL4hFUI+iNHSp5fM8ZeOXJvyrEKIYTKu0ut3yk5Q7B1RRSSDFrKLSwFT5h/klG rz6ZRGFsaTPQd+f9Zgw7jz6XDRK17qVaQVJ2iy2qt8mO9iPABtsFimHhRWIilZ24ntkh ZBu186PNaDoxDxf+ge6C+guB9eJmi2MBro7wm57pjbzLRVmY+4S1GBbZ8y2Fa3xiYXV8 WmCMl+OkcJ60WmXWJmMxDbnzkLm0ce5OsonYc4+Zd18tViy41VcU3TAVnWnv8QaW8BKH IeuIcg+p6q7ewVVg5EEMbU0uD5P2N+36zyKNN+rqyN2mS83HRjaweloI+wp1M2LeYeo9 PYLw== 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=ITaH908544W3r0Lffx6rTGx68a49RgNIMs0BR9o+fME=; b=FVQQA37fFcbn9L6LlERg73x/oU/z7QIlwGI40DaWD3J6gLdDJf0U9SkFokheBqT2qP kEsfJPJN2L7iRuwoXVyBZDeNTtIKFml9/LwITwjwJY7dVumk4yLqz6FBw7W6ouaCf1RD Xxe4Q/sZP+YRXj/izDABNVVKNiOhDZ6aVharzPFfO1U+/DHgm2ndsI1G9cJD2j3qXvoC xSanxYOAZ5+tLr+ut68MayOE6hVmbzJI1FxhkEC++r68eO46AeVgDYrmqrcYB+SSz44T RqPKKnUkTw3/RZ9wcPc56xZ2dUW20FjkC5LQ0PrLv4IDAV5j0Sel4FoUz2/XAfgfUhrY 4Abw== X-Gm-Message-State: AGRZ1gK7gWOmeZ7f0tP0sVBei0pXevpbARHHtn1rcj++IAWqHA2S9rlf Gblqo/aAvwXUUI4YbcThT9muPEI= X-Google-Smtp-Source: AJdET5cNPJMRNbbViifIchMoL3ETzZP0pvJDEumxT27Sfjv8b/X497dNQymCCn7ihTf/ugN7GPiy8js= X-Received: by 2002:ac8:2aa5:: with SMTP id b34mr1460681qta.36.1541630648791; Wed, 07 Nov 2018 14:44:08 -0800 (PST) Date: Wed, 7 Nov 2018 14:43:55 -0800 In-Reply-To: <20181107224356.73080-1-sdf@google.com> Message-Id: <20181107224356.73080-3-sdf@google.com> Mime-Version: 1.0 References: <20181107224356.73080-1-sdf@google.com> X-Mailer: git-send-email 2.19.1.930.g4563a0d9d0-goog Subject: [PATCH bpf-next 2/3] libbpf: cleanup after partial failure in bpf_object__pin From: Stanislav Fomichev To: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, ast@kernel.org, daniel@iogearbox.net, shuah@kernel.org, jakub.kicinski@netronome.com, quentin.monnet@netronome.com Cc: guro@fb.com, jiong.wang@netronome.com, sdf@google.com, bhole_prashant_q7@lab.ntt.co.jp, john.fastabend@gmail.com, jbenc@redhat.com, treeze.taeung@gmail.com, yhs@fb.com, osk@fb.com, sandipan@linux.vnet.ibm.com Sender: linux-kselftest-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP bpftool will use bpf_object__pin in the next commit to pin all programs and maps from the file; in case of a partial failure, we need to get back to the clean state (undo previous program/map pins). Signed-off-by: Stanislav Fomichev --- tools/lib/bpf/libbpf.c | 58 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index d6e62e90e8d4..309abe7196f3 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -1803,14 +1803,17 @@ int bpf_object__pin(struct bpf_object *obj, const char *path) len = snprintf(buf, PATH_MAX, "%s/%s", path, bpf_map__name(map)); - if (len < 0) - return -EINVAL; - else if (len >= PATH_MAX) - return -ENAMETOOLONG; + if (len < 0) { + err = -EINVAL; + goto err_unpin_maps; + } else if (len >= PATH_MAX) { + err = -ENAMETOOLONG; + goto err_unpin_maps; + } err = bpf_map__pin(map, buf); if (err) - return err; + goto err_unpin_maps; } bpf_object__for_each_program(prog, obj) { @@ -1819,17 +1822,52 @@ int bpf_object__pin(struct bpf_object *obj, const char *path) len = snprintf(buf, PATH_MAX, "%s/%s", path, prog->section_name); - if (len < 0) - return -EINVAL; - else if (len >= PATH_MAX) - return -ENAMETOOLONG; + if (len < 0) { + err = -EINVAL; + goto err_unpin_programs; + } else if (len >= PATH_MAX) { + err = -ENAMETOOLONG; + goto err_unpin_programs; + } err = bpf_program__pin(prog, buf); if (err) - return err; + goto err_unpin_programs; } return 0; + +err_unpin_programs: + bpf_object__for_each_program(prog, obj) { + char buf[PATH_MAX]; + int len; + + len = snprintf(buf, PATH_MAX, "%s/%s", path, + prog->section_name); + if (len < 0) + continue; + else if (len >= PATH_MAX) + continue; + + unlink(buf); + } + +err_unpin_maps: + bpf_map__for_each(map, obj) { + char buf[PATH_MAX]; + int len; + + len = snprintf(buf, PATH_MAX, "%s/%s", path, + bpf_map__name(map)); + if (len < 0) + continue; + else if (len >= PATH_MAX) + continue; + + unlink(buf); + } + + return err; } void bpf_object__close(struct bpf_object *obj) From patchwork Wed Nov 7 22:43:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 10673201 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BE8FB13A4 for ; Wed, 7 Nov 2018 22:44:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AE01B2D3D5 for ; Wed, 7 Nov 2018 22:44:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id ABCF72D3E9; Wed, 7 Nov 2018 22:44:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B9C7C2D3E7 for ; Wed, 7 Nov 2018 22:44:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727446AbeKHIQm (ORCPT ); Thu, 8 Nov 2018 03:16:42 -0500 Received: from mail-it1-f202.google.com ([209.85.166.202]:58856 "EHLO mail-it1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727573AbeKHIQm (ORCPT ); Thu, 8 Nov 2018 03:16:42 -0500 Received: by mail-it1-f202.google.com with SMTP id j7so22743027itd.8 for ; Wed, 07 Nov 2018 14:44:11 -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=QyMrESQzwJLFNLw1wAVlNkVtHxpAISx7XM1wD8cD3vc=; b=JcpOa3YPZkf8egwcS9b+U5TCBK3JeoM6mt6zjQ7Mo5A9pLL9bQcSMTiYNDzE16VGdX ZXvX8ls2qtuKi7DtUPQGhsQFEzyLxN1tvBtT/9237DD+k6M6BWw1HSxjUSx1G01iz8zQ fynxC9/Hi5D/h9F7VkLwCRFpayz/gwN/18xEV1T16haPCcFX8HmHh/cyiXowBKH15w4m 7aBixpq+0ttEhXRtZOkXWkNuA4W5ARd3G634VK9Fi3QCPF+y2XHJqcs9s6AkVZxXOYRF aSGNWo41mMQQhGZLY49nHRqAwEMtTxu/4D5CFy7EZ0xxRFSlZKIp0rmFzbEIgYqENkvx glRg== 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=QyMrESQzwJLFNLw1wAVlNkVtHxpAISx7XM1wD8cD3vc=; b=FHbQBxEh5rHmbQre07mHQXYAVvLxgpu7gwMxFcMSOMl5bzJa3kYDlTV/xc2A8b9wS9 qEVp2dI50f9sEwUNTmUwrI25E7WIsmigeB2uHUazPuqsuYb5nq7GEZYJQqvzZXkdaNFs GyxtwQv+GnSFjJXW0eScPv4fBm8/JkYS0Xwf65JFDo/cAV3s1GvY+WCSilVVv3TOieiq qdILsec5S/zLuUWEQMbYI1hEKwaWsdMH2F6gOiQd0EB5O4reTBBa6jxG0huMdBEnBjQ8 RjXFKvxfXYi3++AXwFjvYDiOU8EIXR0kGEWZZH4w5afiNi4UTMXkwDt54NFxj6dQtFCG AXGA== X-Gm-Message-State: AGRZ1gK1WYkNDcLJOkE1ANRsqs6VwUEuyDHMfJ2biBeQL93l2T+0WR5Y TxbmBgDQb7fPQYuj/Qauwj9fO4g= X-Google-Smtp-Source: AJdET5dKUazO5wA1y2ljJ0oryc0bWm8Fn62PqBlsxHLnWzPug+lfVMt66Vqj8yNBOKYAMfQHcGEUUEE= X-Received: by 2002:a24:3303:: with SMTP id k3-v6mr1770911itk.2.1541630651000; Wed, 07 Nov 2018 14:44:11 -0800 (PST) Date: Wed, 7 Nov 2018 14:43:56 -0800 In-Reply-To: <20181107224356.73080-1-sdf@google.com> Message-Id: <20181107224356.73080-4-sdf@google.com> Mime-Version: 1.0 References: <20181107224356.73080-1-sdf@google.com> X-Mailer: git-send-email 2.19.1.930.g4563a0d9d0-goog Subject: [PATCH bpf-next 3/3] bpftool: support loading flow dissector From: Stanislav Fomichev To: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, ast@kernel.org, daniel@iogearbox.net, shuah@kernel.org, jakub.kicinski@netronome.com, quentin.monnet@netronome.com Cc: guro@fb.com, jiong.wang@netronome.com, sdf@google.com, bhole_prashant_q7@lab.ntt.co.jp, john.fastabend@gmail.com, jbenc@redhat.com, treeze.taeung@gmail.com, yhs@fb.com, osk@fb.com, sandipan@linux.vnet.ibm.com Sender: linux-kselftest-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This commit adds support for loading/attaching/detaching flow dissector program. The structure of the flow dissector program is assumed to be the same as in the selftests: * flow_dissector section with the main entry point * a bunch of tail call progs * a jmp_table map that is populated with the tail call progs When `bpftool load` is called with a flow_dissector prog (i.e. when the first section is flow_dissector of 'type flow_dissector' argument is passed), we load and pin all the programs/maps. User is responsible to construct the jump table for the tail calls. The last argument of `bpftool attach` is made optional for this use case. Example: bpftool prog load tools/testing/selftests/bpf/bpf_flow.o \ /sys/fs/bpf/flow type flow_dissector bpftool map update pinned /sys/fs/bpf/flow/jmp_table \ key 0 0 0 0 \ value pinned /sys/fs/bpf/flow/IP/0 bpftool map update pinned /sys/fs/bpf/flow/jmp_table \ key 1 0 0 0 \ value pinned /sys/fs/bpf/flow/IPV6/0 bpftool map update pinned /sys/fs/bpf/flow/jmp_table \ key 2 0 0 0 \ value pinned /sys/fs/bpf/flow/IPV6OP/0 bpftool map update pinned /sys/fs/bpf/flow/jmp_table \ key 3 0 0 0 \ value pinned /sys/fs/bpf/flow/IPV6FR/0 bpftool map update pinned /sys/fs/bpf/flow/jmp_table \ key 4 0 0 0 \ value pinned /sys/fs/bpf/flow/MPLS/0 bpftool map update pinned /sys/fs/bpf/flow/jmp_table \ key 5 0 0 0 \ value pinned /sys/fs/bpf/flow/VLAN/0 bpftool prog attach pinned /sys/fs/bpf/flow/flow_dissector/0 flow_dissector Tested by using the above lines to load the prog in the test_flow_dissector.sh selftest. Signed-off-by: Stanislav Fomichev --- .../bpftool/Documentation/bpftool-prog.rst | 26 +++-- tools/bpf/bpftool/bash-completion/bpftool | 2 +- tools/bpf/bpftool/common.c | 30 +++--- tools/bpf/bpftool/main.h | 1 + tools/bpf/bpftool/prog.c | 94 ++++++++++++++----- 5 files changed, 101 insertions(+), 52 deletions(-) diff --git a/tools/bpf/bpftool/Documentation/bpftool-prog.rst b/tools/bpf/bpftool/Documentation/bpftool-prog.rst index ac4e904b10fb..a7b6934a8ac9 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-prog.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-prog.rst @@ -25,8 +25,8 @@ MAP COMMANDS | **bpftool** **prog dump jited** *PROG* [{**file** *FILE* | **opcodes**}] | **bpftool** **prog pin** *PROG* *FILE* | **bpftool** **prog load** *OBJ* *FILE* [**type** *TYPE*] [**map** {**idx** *IDX* | **name** *NAME*} *MAP*] [**dev** *NAME*] -| **bpftool** **prog attach** *PROG* *ATTACH_TYPE* *MAP* -| **bpftool** **prog detach** *PROG* *ATTACH_TYPE* *MAP* +| **bpftool** **prog attach** *PROG* *ATTACH_TYPE* [*MAP*] +| **bpftool** **prog detach** *PROG* *ATTACH_TYPE* [*MAP*] | **bpftool** **prog help** | | *MAP* := { **id** *MAP_ID* | **pinned** *FILE* } @@ -39,7 +39,9 @@ MAP COMMANDS | **cgroup/bind4** | **cgroup/bind6** | **cgroup/post_bind4** | **cgroup/post_bind6** | | **cgroup/connect4** | **cgroup/connect6** | **cgroup/sendmsg4** | **cgroup/sendmsg6** | } -| *ATTACH_TYPE* := { **msg_verdict** | **skb_verdict** | **skb_parse** } +| *ATTACH_TYPE* := { +| **msg_verdict** | **skb_verdict** | **skb_parse** | **flow_dissector** +| } DESCRIPTION @@ -97,13 +99,17 @@ DESCRIPTION contain a dot character ('.'), which is reserved for future extensions of *bpffs*. - **bpftool prog attach** *PROG* *ATTACH_TYPE* *MAP* - Attach bpf program *PROG* (with type specified by *ATTACH_TYPE*) - to the map *MAP*. - - **bpftool prog detach** *PROG* *ATTACH_TYPE* *MAP* - Detach bpf program *PROG* (with type specified by *ATTACH_TYPE*) - from the map *MAP*. + **bpftool prog attach** *PROG* *ATTACH_TYPE* [*MAP*] + Attach bpf program *PROG* (with type specified by + *ATTACH_TYPE*). Most *ATTACH_TYPEs* require a *MAP* + parameter, with the exception of *flow_dissector* which is + attached to current networking name space. + + **bpftool prog detach** *PROG* *ATTACH_TYPE* [*MAP*] + Detach bpf program *PROG* (with type specified by + *ATTACH_TYPE*). Most *ATTACH_TYPEs* require a *MAP* + parameter, with the exception of *flow_dissector* which is + detached from the current networking name space. **bpftool prog help** Print short help message. diff --git a/tools/bpf/bpftool/bash-completion/bpftool b/tools/bpf/bpftool/bash-completion/bpftool index 3f78e6404589..4ab892adfa9f 100644 --- a/tools/bpf/bpftool/bash-completion/bpftool +++ b/tools/bpf/bpftool/bash-completion/bpftool @@ -299,7 +299,7 @@ _bpftool() fi if [[ ${#words[@]} == 6 ]]; then - COMPREPLY=( $( compgen -W "msg_verdict skb_verdict skb_parse" -- "$cur" ) ) + COMPREPLY=( $( compgen -W "msg_verdict skb_verdict skb_parse flow_dissector" -- "$cur" ) ) return 0 fi diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c index 25af85304ebe..f671a921dec5 100644 --- a/tools/bpf/bpftool/common.c +++ b/tools/bpf/bpftool/common.c @@ -169,34 +169,24 @@ int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type) return fd; } -int do_pin_fd(int fd, const char *name) +int mount_bpffs_for_pin(const char *name) { char err_str[ERR_MAX_LEN]; char *file; char *dir; int err = 0; - err = bpf_obj_pin(fd, name); - if (!err) - goto out; - file = malloc(strlen(name) + 1); strcpy(file, name); dir = dirname(file); - if (errno != EPERM || is_bpffs(dir)) { - p_err("can't pin the object (%s): %s", name, strerror(errno)); + if (is_bpffs(dir)) { + /* nothing to do if already mounted */ goto out_free; } - /* Attempt to mount bpffs, then retry pinning. */ err = mnt_bpffs(dir, err_str, ERR_MAX_LEN); - if (!err) { - err = bpf_obj_pin(fd, name); - if (err) - p_err("can't pin the object (%s): %s", name, - strerror(errno)); - } else { + if (err) { err_str[ERR_MAX_LEN - 1] = '\0'; p_err("can't mount BPF file system to pin the object (%s): %s", name, err_str); @@ -204,10 +194,20 @@ int do_pin_fd(int fd, const char *name) out_free: free(file); -out: return err; } +int do_pin_fd(int fd, const char *name) +{ + int err; + + err = mount_bpffs_for_pin(name); + if (err) + return err; + + return bpf_obj_pin(fd, name); +} + int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32)) { unsigned int id; diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h index 28322ace2856..1383824c9baf 100644 --- a/tools/bpf/bpftool/main.h +++ b/tools/bpf/bpftool/main.h @@ -129,6 +129,7 @@ const char *get_fd_type_name(enum bpf_obj_type type); char *get_fdinfo(int fd, const char *key); int open_obj_pinned(char *path); int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type); +int mount_bpffs_for_pin(const char *name); int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32)); int do_pin_fd(int fd, const char *name); diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index 5302ee282409..feee1d184433 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c @@ -81,6 +81,7 @@ static const char * const attach_type_strings[] = { [BPF_SK_SKB_STREAM_PARSER] = "stream_parser", [BPF_SK_SKB_STREAM_VERDICT] = "stream_verdict", [BPF_SK_MSG_VERDICT] = "msg_verdict", + [BPF_FLOW_DISSECTOR] = "flow_dissector", [__MAX_BPF_ATTACH_TYPE] = NULL, }; @@ -724,10 +725,11 @@ int map_replace_compar(const void *p1, const void *p2) static int do_attach(int argc, char **argv) { enum bpf_attach_type attach_type; - int err, mapfd, progfd; + int err, progfd; + int mapfd = 0; - if (!REQ_ARGS(5)) { - p_err("too few parameters for map attach"); + if (!REQ_ARGS(3)) { + p_err("too few parameters for attach"); return -EINVAL; } @@ -740,11 +742,17 @@ static int do_attach(int argc, char **argv) p_err("invalid attach type"); return -EINVAL; } - NEXT_ARG(); + if (attach_type != BPF_FLOW_DISSECTOR) { + NEXT_ARG(); + if (!REQ_ARGS(2)) { + p_err("too few parameters for map attach"); + return -EINVAL; + } - mapfd = map_parse_fd(&argc, &argv); - if (mapfd < 0) - return mapfd; + mapfd = map_parse_fd(&argc, &argv); + if (mapfd < 0) + return mapfd; + } err = bpf_prog_attach(progfd, mapfd, attach_type, 0); if (err) { @@ -760,10 +768,11 @@ static int do_attach(int argc, char **argv) static int do_detach(int argc, char **argv) { enum bpf_attach_type attach_type; - int err, mapfd, progfd; + int err, progfd; + int mapfd = 0; - if (!REQ_ARGS(5)) { - p_err("too few parameters for map detach"); + if (!REQ_ARGS(3)) { + p_err("too few parameters for detach"); return -EINVAL; } @@ -776,11 +785,17 @@ static int do_detach(int argc, char **argv) p_err("invalid attach type"); return -EINVAL; } - NEXT_ARG(); + if (attach_type != BPF_FLOW_DISSECTOR) { + NEXT_ARG(); + if (!REQ_ARGS(2)) { + p_err("too few parameters for map detach"); + return -EINVAL; + } - mapfd = map_parse_fd(&argc, &argv); - if (mapfd < 0) - return mapfd; + mapfd = map_parse_fd(&argc, &argv); + if (mapfd < 0) + return mapfd; + } err = bpf_prog_detach2(progfd, mapfd, attach_type); if (err) { @@ -792,6 +807,7 @@ static int do_detach(int argc, char **argv) jsonw_null(json_wtr); return 0; } + static int do_load(int argc, char **argv) { enum bpf_attach_type expected_attach_type; @@ -799,8 +815,8 @@ static int do_load(int argc, char **argv) .prog_type = BPF_PROG_TYPE_UNSPEC, }; struct map_replace *map_replace = NULL; + struct bpf_program *prog = NULL, *pos; unsigned int old_map_fds = 0; - struct bpf_program *prog; struct bpf_object *obj; struct bpf_map *map; const char *pinfile; @@ -918,13 +934,14 @@ static int do_load(int argc, char **argv) goto err_free_reuse_maps; } - prog = bpf_program__next(NULL, obj); - if (!prog) { - p_err("object file doesn't contain any bpf program"); - goto err_close_obj; + if (attr.prog_type != BPF_PROG_TYPE_FLOW_DISSECTOR) { + prog = bpf_program__next(NULL, obj); + if (!prog) { + p_err("object file doesn't contain any bpf program"); + goto err_close_obj; + } } - bpf_program__set_ifindex(prog, ifindex); if (attr.prog_type == BPF_PROG_TYPE_UNSPEC) { const char *sec_name = bpf_program__title(prog, false); @@ -936,8 +953,13 @@ static int do_load(int argc, char **argv) goto err_close_obj; } } - bpf_program__set_type(prog, attr.prog_type); - bpf_program__set_expected_attach_type(prog, expected_attach_type); + + bpf_object__for_each_program(pos, obj) { + bpf_program__set_ifindex(pos, ifindex); + bpf_program__set_type(pos, attr.prog_type); + bpf_program__set_expected_attach_type(pos, + expected_attach_type); + } qsort(map_replace, old_map_fds, sizeof(*map_replace), map_replace_compar); @@ -1001,9 +1023,28 @@ static int do_load(int argc, char **argv) goto err_close_obj; } - if (do_pin_fd(bpf_program__fd(prog), pinfile)) + err = mount_bpffs_for_pin(pinfile); + if (err) goto err_close_obj; + if (attr.prog_type == BPF_PROG_TYPE_FLOW_DISSECTOR) { + /* flow dissector consist of multiple programs, + * we want to pin them all + */ + err = bpf_object__pin(obj, pinfile); + if (err) { + p_err("failed to pin flow dissector object"); + goto err_close_obj; + } + } else { + err = bpf_obj_pin(bpf_program__fd(prog), pinfile); + if (err) { + p_err("failed to pin program %s", + bpf_program__title(prog, false)); + goto err_close_obj; + } + } + if (json_output) jsonw_null(json_wtr); @@ -1037,8 +1078,8 @@ static int do_help(int argc, char **argv) " %s %s pin PROG FILE\n" " %s %s load OBJ FILE [type TYPE] [dev NAME] \\\n" " [map { idx IDX | name NAME } MAP]\n" - " %s %s attach PROG ATTACH_TYPE MAP\n" - " %s %s detach PROG ATTACH_TYPE MAP\n" + " %s %s attach PROG ATTACH_TYPE [MAP]\n" + " %s %s detach PROG ATTACH_TYPE [MAP]\n" " %s %s help\n" "\n" " " HELP_SPEC_MAP "\n" @@ -1050,7 +1091,8 @@ static int do_help(int argc, char **argv) " cgroup/bind4 | cgroup/bind6 | cgroup/post_bind4 |\n" " cgroup/post_bind6 | cgroup/connect4 | cgroup/connect6 |\n" " cgroup/sendmsg4 | cgroup/sendmsg6 }\n" - " ATTACH_TYPE := { msg_verdict | skb_verdict | skb_parse }\n" + " ATTACH_TYPE := { msg_verdict | skb_verdict | skb_parse |\n" + " flow_dissector }\n" " " HELP_SPEC_OPTIONS "\n" "", bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],