From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752833AbdLGSke (ORCPT ); Thu, 7 Dec 2017 13:40:34 -0500 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:41336 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752709AbdLGSkK (ORCPT ); Thu, 7 Dec 2017 13:40:10 -0500 From: Roman Gushchin To: CC: , , , , , , , Quentin Monnet , David Ahern Subject: [PATCH v2 net-next 4/4] bpftool: implement cgroup bpf operations Date: Thu, 7 Dec 2017 18:39:09 +0000 Message-ID: <20171207183909.16240-5-guro@fb.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171207183909.16240-1-guro@fb.com> References: <20171207183909.16240-1-guro@fb.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [2620:10d:c092:200::1:e273] X-ClientProxiedBy: AM0PR0202CA0031.eurprd02.prod.outlook.com (2603:10a6:208:1::44) To CO1PR15MB1079.namprd15.prod.outlook.com (2a01:111:e400:7b66::9) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d24d37d1-1f4d-438f-603e-08d53da1e354 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603286);SRVR:CO1PR15MB1079; X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1079;3:J6NEZn4oPhvci0zg/LgIlbMnJBLKpiIAzju8/rvHa6KHhtISFj8/guWZycZhEDTYBZtXZ0YmyduHuGw+fs3lXE5vr+rVwIDfvnQdJXNcmgU+Pyd2g2EsijJsZSTUaSPK4C1GMsuTvah2RB0QbhJsY7Sn9pf/SH0AU4idI/f33Y8RA+nsY47m+06iJM9AvEdoekkcWSSDYTj8kb8gE4BVVnKjvkLJt7F6CBVrEFiEwzulqy3iEx7eK/qlx7iwgILQ;25:/tyQP+ucYZwpLOln7jyyQ2AoOzflqntjhMyj354sdi5l6m+JSdXkfDN8lvP34At7yZiihzmYmJUQvjaWca/35BWeUwGGxO3976e1hjUlsdsTDFJQir3NjednH6MjGFqjesHkiZ8Qx4WDer/VU1A5XnfqElkAiBWYPkGut+u8NpKbv6SQHM5Icy3bw/NMzsCIlLsgTcLPHvS2W+2FZXP6mhV0sRuNPVsPulOpCsyR7ovtEyBN4SC5ipoqTBH21sHi4bV+7bGrrmFh1w333BBGa+vYVB5C4A23bf00zmSxWLOJ5936LYZUNzqgXTf64fNBLXBoQw0UImFSSn9vBmUAUg==;31:f+E4U+pnGhKbgXwVLntZJA+/z6p6Oxg/FXc3OCgW9rgXVxF6kyE6cVauZt0ZI5ygrq8IIp6/FkoSO7BhYE/ALObGN+IYcsdBBxYgbBCG2uVTBUkhyV0f9ZXybFbjjcq3Ol23B6eJ1PwU9euoIUiFMqFw2DCA7JNqE0Zkd6sEsrfI2ljjm9pUeynIV6RfdjRW+teZ0Ooc9triBtsMe1+4dGKqCVeiOWi0vsV7hOq75Q8= X-MS-TrafficTypeDiagnostic: CO1PR15MB1079: X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1079;20:RTihZVkM2cmnHc1G6PUG+6Ti/HbchFTWMlreBQ8tmc4qVknGXJC3QYfNLGmttY3KM4HIhfAfIQQyCOebFHJnAns/x9Le4DKXOgQChlhjaRbiOwqWTBAuvJSn1UiIR4Raqoqh0LhjyKwv/icCtle2BQohQMdO72eig8YlGrZ04+J3s9LPPcriYhneoZl1eU122i9p5EJ9QDPrgc+/WEWlLESlu9lZDlmD947FjpE87JthSuP6Utpf8ySFnod1bMIngBXWCoFQvV1XuMMISkjKmWCXYdvN9ySE3kBWIezheqAbe1F+/9D4eBAd39HSDRqh37hgj80V8dWO+eSkvaPMiZXJNgcuDshLZs5PdOKT1w58LlfYSZU7pv5VW3KOpN9rgtDYXYmoKE1t0UteLeMEpd2vpGnJzofyv0NSD/fP2tFgf42NHnJPsVKGxCE6C8cjFfrcrgcusr/owdLNy65UqgnT2gSEhyjN5wbD69gIDolxCcMNAVNUEMU1tjw5vNpL;4:u2rboXCH3mz0uk9Z/3/GNcXrj40Tvqz1TvsGO0iq1KqWud9lbDZoQ8wQGEZgpnyTQXtKtG14oeDP8M20dRh02/YgAceHtN26w9MoTSGWZEGJrivQNRZW+eA0PJrBFLspRuQIngI3kI7mkaO3cNGG3OEVfwTW9fTUw5sUE7muMGqdtKh9XR4gk6G2ZqDbLPwrYv99PIU9sEjdzvKaHc5jC7r5Xk6crN+MD93KmElHAfgeIIHgyv3hooEFJF3JT/c7OptGqauctObhOCVFtew+dtCQ/h/JCEUDQEqkDxjDlmm2ze+OD32aj4mf5uhSnQsxYLbjiPsOyS7ZN13WZ4RwtNGIu2Dx8Ew3HxUhcYcChdI= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(67672495146484)(81227570615382); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(11241501159)(6040450)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3231022)(3002001)(6041248)(20161123560025)(20161123562025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123558100)(6072148)(201708071742011);SRVR:CO1PR15MB1079;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:CO1PR15MB1079; X-Forefront-PRVS: 05143A8241 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(39860400002)(366004)(346002)(376002)(199004)(189003)(101416001)(52116002)(6506006)(6486002)(8936002)(52396003)(478600001)(6512007)(97736004)(16586007)(316002)(36756003)(69596002)(5890100001)(6116002)(1076002)(5660300001)(6916009)(2950100002)(53416004)(54906003)(81166006)(81156014)(8676002)(305945005)(7736002)(105586002)(106356001)(33646002)(50226002)(76176011)(2361001)(68736007)(2351001)(25786009)(6666003)(50466002)(47776003)(48376002)(2906002)(4326008)(575784001)(51416003)(86362001)(39060400002)(53936002)(2004002)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:CO1PR15MB1079;H:castle.thefacebook.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CO1PR15MB1079;23:EepjWRWhmkxOy/uExo8JjtLTNIeu3wz+YI9Mtb+PQ?= =?us-ascii?Q?gHp9ByJaPsB0BDAHQlhrmjmmmerS5VQIgfmw2mVJhfPxwP7t8KnpGSBFV5qd?= =?us-ascii?Q?4wrm0FamsffWoh6m2YUbiJxXdJ8tlwoODXweRlZoPaZjnh6Z2KZyjfVPko+5?= =?us-ascii?Q?3NkHCt1AwjY9oJXSlB+iubjZu6DZkwef3A19vjIG5Bl7+fPy2qJ2sXb/FJlq?= =?us-ascii?Q?cIqQiMZ3TVtVdib0vluGkpNx9nOBsQpWO4UDeMAx/gLbcI1K8HXmwgRXM745?= =?us-ascii?Q?q4tEmkBp8+m2LbWbG1XjR7FJlb8RyXf7dj6hZx1NHzdn5lUcXvAiphV+b5VY?= =?us-ascii?Q?kukqNpc938UCbDB0GbtrmV6lk98m27AxSjkXSssbjj9VDMjC0mQMGxrxkxHh?= =?us-ascii?Q?1zVrkZMdEWVo7YTcof8bNmPlpxIYPEVT1Dt1zM5ssawHGzdaOEzqWDRFvsC0?= =?us-ascii?Q?tvtc5jkmJdlLmMoywGk+S7cK2j+SxGuY7z+4lYh03OcUBcCH834P+c2b5MDC?= =?us-ascii?Q?myFPLGGd7FEnePEWU4dMxE1oLgVaf4uhjl86BwwHw+SMXdFOPBRuLqOscFFz?= =?us-ascii?Q?ecwtz9aoUUZwW+MKFnU3DpYoI7mLWLAnbUoFKb+rbkb6DeHl9wba2DeXl6UP?= =?us-ascii?Q?bRDGf0fxQlt6pWw7y5CEIAuJ+Lo8m64F0eUtcNstrHTlK+nV9D2UhORfM+Ti?= =?us-ascii?Q?WzFHVjfy35yF4VbGP7zD8JhY3T5B2dNSoC4DkZPQUGKYEebvd0kszfmgjZR3?= =?us-ascii?Q?7fPa8YI4/QNV/TBf9DaO3MBNrVuDZ9tvQ+7x5KqGZy61ayBF5H1JdqvVPUI3?= =?us-ascii?Q?UHcmCfKEM5h223O9tGBlJ08Yaq/vjB7GgKGycXNB3NUXkg3DR1h4Q/ArDkoe?= =?us-ascii?Q?iUimZXrnTE0LmZ3/EUgRAhf5RYMswrHHmVBvT53LBD+JLRcKNsABs4nSbHy7?= =?us-ascii?Q?UAD0bsvyrXKp82n5yGq9tkCgzgP2LvKM0fkao/ROInA6GsqYW7mrvhV/4Qsl?= =?us-ascii?Q?vWDOGQlrNegNXtB8vxbJ1zaGrPRdj9dgiKU1ZR7gw+2wwFmdJEZvqcUpfI5b?= =?us-ascii?Q?QG0FcgmnIbZwk/9BzEj9nI1r6Kcq7/OwqjIsvMnxkNPvpvZ9MK289JzIYvYw?= =?us-ascii?Q?uzvPybuUXqnRlWyauTgHyF9R6RXCjv9ltpvNyfhUt3VwSADPhOR4JH5B/d7a?= =?us-ascii?Q?yrjXan9cIy7uHMcFrDgr9u2Z595/Wk0QLznhO0kPfLMWhFiJtvTpRjujStXZ?= =?us-ascii?Q?p9HZC5tIEEj7GK1zxo=3D?= X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1079;6:O/rlol393xAVotKlMH9WrQIns2usWw964t3slOa+hOTif/PCBjrsYCOLHcfGHbQMiU0BGhYD+M3CMpSlNAsadMaSSjjOMNoTIGHPGwKjslEpMWxgVfagztpiq/igQXkfqVIIwYpjhKppjsXvI3E27zP+XXSv4kvvA8thmIKOFr4XPOwT6pqe+ScQOaiqXX43IR3s8vzZe9sNBkrhAMJ5mTf7xhRCCmgANVLQKTxCkpTz21Ex+Q8Q/RwNWwMWLttyj0aJukn7IBu32kQ64diWuEfkmI6lRix4vmJCcZl/qaJ0g3lVsx+VBcmXETL9wydyNl6en63P1DFiWXJEimR92oPkvZUw41ErMGL4tntq4hQ=;5:PGuK6hbm1Ab6tgTuBQ+4aSP1uqE7siS8eZ66QQOeHuB4c0QqHDUFT+vtnxXC9YXvENW5/90iqK8ampBqdCfQ1vj2H7TCmImbM6l0k2vVA0FsBufc47lZt3qGWQwot/p5eSAP6/aV7hRG42dGB46DWI4aPYifV+SLJBqJgvYjqOk=;24:KzKEF9F96rSismX6gyLpD2UeMHhWlh2lRlvdjhgk6LNmG1a+KgykXGKvo0WVlVHK2zKq4ZD50hQ4+FMuqO5+hi4QhXXKSDSabDi886tgQQw=;7:8K4zRFeDFQjH3ZKP7sPr1JUb14/+rpEcrPV88EEYTxPDuyybGUqMfOglBntwk12uagUnVtUy2UtZAe0agVYVlP/m0Ge1tOegd6P+IE8pN8viw6FBxHQwmMy2ra+fvZhXkDocS13cOdzTicm0sYtXcUMcGItKXYfOKfjFJlMP0fvNOny9WaGCogDtUG02LhIgd5O2mwmP+KbWMeEHONAbzWkxxbMGvP/ZAQ82kl6hS2tc06pa1PuyKza4Mw7KXqST SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1079;20:0qJFltwBmFBLeQg2vl+0/0YoJvYDWvhdfsHCJSOwCTgb9j2WDPg/a3c/IizS/b7Fn8B/V1qh3jywv0e6O9nZcYvRUIlVjm9YOiRXwDxhGc7D/tRITOCySKiQvTFtcwFsDNE5xEdZ0/Gq7mmGi1RcBBfYs6LqQ3kxCQpwo2l08RM= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Dec 2017 18:39:43.5309 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d24d37d1-1f4d-438f-603e-08d53da1e354 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8ae927fe-1255-47a7-a2af-5f3a069daaa2 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR15MB1079 X-OriginatorOrg: fb.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-12-07_08:,, signatures=0 X-Proofpoint-Spam-Reason: safe X-FB-Internal: Safe Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds basic cgroup bpf operations to bpftool: cgroup list, attach and detach commands. Usage is described in the corresponding man pages, and examples are provided. Syntax: $ bpftool cgroup list CGROUP $ bpftool cgroup attach CGROUP ATTACH_TYPE PROG [ATTACH_FLAGS] $ bpftool cgroup detach CGROUP ATTACH_TYPE PROG Signed-off-by: Roman Gushchin Cc: Alexei Starovoitov Cc: Daniel Borkmann Cc: Jakub Kicinski Cc: Martin KaFai Lau Cc: Quentin Monnet Cc: David Ahern --- tools/bpf/bpftool/Documentation/bpftool-cgroup.rst | 92 +++++++ tools/bpf/bpftool/Documentation/bpftool-map.rst | 2 +- tools/bpf/bpftool/Documentation/bpftool-prog.rst | 2 +- tools/bpf/bpftool/Documentation/bpftool.rst | 6 +- tools/bpf/bpftool/cgroup.c | 305 +++++++++++++++++++++ tools/bpf/bpftool/main.c | 3 +- tools/bpf/bpftool/main.h | 1 + 7 files changed, 406 insertions(+), 5 deletions(-) create mode 100644 tools/bpf/bpftool/Documentation/bpftool-cgroup.rst create mode 100644 tools/bpf/bpftool/cgroup.c diff --git a/tools/bpf/bpftool/Documentation/bpftool-cgroup.rst b/tools/bpf/bpftool/Documentation/bpftool-cgroup.rst new file mode 100644 index 000000000000..61ded613aee1 --- /dev/null +++ b/tools/bpf/bpftool/Documentation/bpftool-cgroup.rst @@ -0,0 +1,92 @@ +================ +bpftool-cgroup +================ +------------------------------------------------------------------------------- +tool for inspection and simple manipulation of eBPF progs +------------------------------------------------------------------------------- + +:Manual section: 8 + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **cgroup** *COMMAND* + + *OPTIONS* := { { **-j** | **--json** } [{ **-p** | **--pretty** }] | { **-f** | **--bpffs** } } + + *COMMANDS* := + { **list** | **attach** | **detach** | **help** } + +MAP COMMANDS +============= + +| **bpftool** **cgroup list** *CGROUP* +| **bpftool** **cgroup attach** *CGROUP* *ATTACH_TYPE* *PROG* [*ATTACH_FLAGS*] +| **bpftool** **cgroup detach** *CGROUP* *ATTACH_TYPE* *PROG* +| **bpftool** **cgroup help** +| +| *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* } + +DESCRIPTION +=========== + **bpftool cgroup list** *CGROUP* + List all programs attached to the cgroup *CGROUP*. + + Output will start with program ID followed by attach type, + attach flags and program name. + + **bpftool cgroup attach** *CGROUP* *ATTACH_TYPE* *PROG* [*ATTACH_FLAGS*] + Attach program *PROG* to the cgroup *CGROUP* with attach type + *ATTACH_TYPE* and optional *ATTACH_FLAGS*. + + **bpftool cgroup detach** *CGROUP* *ATTACH_TYPE* *PROG* + Detach *PROG* from the cgroup *CGROUP* and attach type + *ATTACH_TYPE*. + + **bpftool prog help** + Print short help message. + +OPTIONS +======= + -h, --help + Print short generic help message (similar to **bpftool help**). + + -v, --version + Print version number (similar to **bpftool version**). + + -j, --json + Generate JSON output. For commands that cannot produce JSON, this + option has no effect. + + -p, --pretty + Generate human-readable JSON output. Implies **-j**. + + -f, --bpffs + Show file names of pinned programs. + +EXAMPLES +======== +| +| **# mount -t bpf none /sys/fs/bpf/** +| **# mkdir /sys/fs/cgroup/test.slice** +| **# bpftool prog load ./device_cgroup.o /sys/fs/bpf/prog** +| **# bpftool cgroup attach /sys/fs/cgroup/test.slice/ device id 1 allow_multi** + +**# bpftool cgroup list /sys/fs/cgroup/test.slice/** + +:: + + ID AttachType AttachFlags Name + 1 device allow_multi bpf_prog1 + +| +| **# bpftool cgroup detach /sys/fs/cgroup/test.slice/ device id 1** +| **# bpftool cgroup list /sys/fs/cgroup/test.slice/** + +:: + + ID AttachType AttachFlags Name + +SEE ALSO +======== + **bpftool**\ (8), **bpftool-prog**\ (8), **bpftool-map**\ (8) diff --git a/tools/bpf/bpftool/Documentation/bpftool-map.rst b/tools/bpf/bpftool/Documentation/bpftool-map.rst index 9f51a268eb06..421cabc417e6 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-map.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-map.rst @@ -128,4 +128,4 @@ EXAMPLES SEE ALSO ======== - **bpftool**\ (8), **bpftool-prog**\ (8) + **bpftool**\ (8), **bpftool-prog**\ (8), **bpftool-cgroup**\ (8) diff --git a/tools/bpf/bpftool/Documentation/bpftool-prog.rst b/tools/bpf/bpftool/Documentation/bpftool-prog.rst index 827b415f8ab6..61229a1779a3 100644 --- a/tools/bpf/bpftool/Documentation/bpftool-prog.rst +++ b/tools/bpf/bpftool/Documentation/bpftool-prog.rst @@ -155,4 +155,4 @@ EXAMPLES SEE ALSO ======== - **bpftool**\ (8), **bpftool-map**\ (8) + **bpftool**\ (8), **bpftool-map**\ (8), **bpftool-cgroup**\ (8) diff --git a/tools/bpf/bpftool/Documentation/bpftool.rst b/tools/bpf/bpftool/Documentation/bpftool.rst index f547a0c0aa34..6732a5a617e4 100644 --- a/tools/bpf/bpftool/Documentation/bpftool.rst +++ b/tools/bpf/bpftool/Documentation/bpftool.rst @@ -16,7 +16,7 @@ SYNOPSIS **bpftool** **version** - *OBJECT* := { **map** | **program** } + *OBJECT* := { **map** | **program** | **cgroup** } *OPTIONS* := { { **-V** | **--version** } | { **-h** | **--help** } | { **-j** | **--json** } [{ **-p** | **--pretty** }] } @@ -28,6 +28,8 @@ SYNOPSIS *PROG-COMMANDS* := { **show** | **dump jited** | **dump xlated** | **pin** | **load** | **help** } + *CGROUP-COMMANDS* := { **list** | **attach** | **detach** | **help** } + DESCRIPTION =========== *bpftool* allows for inspection and simple modification of BPF objects @@ -53,4 +55,4 @@ OPTIONS SEE ALSO ======== - **bpftool-map**\ (8), **bpftool-prog**\ (8) + **bpftool-map**\ (8), **bpftool-prog**\ (8), **bpftool-cgroup**\ (8) diff --git a/tools/bpf/bpftool/cgroup.c b/tools/bpf/bpftool/cgroup.c new file mode 100644 index 000000000000..88d67f74313f --- /dev/null +++ b/tools/bpf/bpftool/cgroup.c @@ -0,0 +1,305 @@ +/* + * Copyright (C) 2017 Facebook + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Author: Roman Gushchin + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include "main.h" + +static const char * const attach_type_strings[] = { + [BPF_CGROUP_INET_INGRESS] = "ingress", + [BPF_CGROUP_INET_EGRESS] = "egress", + [BPF_CGROUP_INET_SOCK_CREATE] = "sock_create", + [BPF_CGROUP_SOCK_OPS] = "sock_ops", + [BPF_CGROUP_DEVICE] = "device", + [__MAX_BPF_ATTACH_TYPE] = NULL, +}; + +static enum bpf_attach_type parse_attach_type(const char *str) +{ + enum bpf_attach_type type; + + for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) { + if (attach_type_strings[type] && + strcmp(str, attach_type_strings[type]) == 0) + return type; + } + + return __MAX_BPF_ATTACH_TYPE; +} + +static int list_bpf_prog(int id, const char *attach_type_str, + const char *attach_flags_str) +{ + struct bpf_prog_info info = {}; + __u32 info_len = sizeof(info); + int prog_fd; + + prog_fd = bpf_prog_get_fd_by_id(id); + if (prog_fd < 0) + return -1; + + if (bpf_obj_get_info_by_fd(prog_fd, &info, &info_len)) { + close(prog_fd); + return -1; + } + + if (json_output) { + jsonw_start_object(json_wtr); + jsonw_uint_field(json_wtr, "id", info.id); + jsonw_string_field(json_wtr, "attach_type", + attach_type_str); + jsonw_string_field(json_wtr, "attach_flags", + attach_flags_str); + jsonw_string_field(json_wtr, "name", info.name); + jsonw_end_object(json_wtr); + } else { + printf("%-8u %-15s %-15s %-15s\n", info.id, + attach_type_str, + attach_flags_str, + info.name); + } + + close(prog_fd); + return 0; +} + +static int list_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type) +{ + __u32 attach_flags; + __u32 prog_ids[1024] = {0}; + __u32 prog_cnt, iter; + char *attach_flags_str; + int ret; + + prog_cnt = ARRAY_SIZE(prog_ids); + ret = bpf_prog_query(cgroup_fd, type, 0, &attach_flags, prog_ids, + &prog_cnt); + if (ret) + return ret; + + if (prog_cnt == 0) + return 0; + + switch (attach_flags) { + case BPF_F_ALLOW_MULTI: + attach_flags_str = "allow_multi"; + break; + case BPF_F_ALLOW_OVERRIDE: + attach_flags_str = "allow_override"; + break; + case 0: + attach_flags_str = ""; + break; + default: + attach_flags_str = "unknown"; + } + + for (iter = 0; iter < prog_cnt; iter++) + list_bpf_prog(prog_ids[iter], attach_type_strings[type], + attach_flags_str); + + return 0; +} + +static int do_list(int argc, char **argv) +{ + enum bpf_attach_type type; + int cgroup_fd; + int ret = -1; + + if (argc < 1) { + p_err("too few parameters for cgroup list\n"); + goto exit; + } else if (argc > 1) { + p_err("too many parameters for cgroup list\n"); + goto exit; + } + + cgroup_fd = open(argv[0], O_RDONLY); + if (cgroup_fd < 0) { + p_err("can't open cgroup %s\n", argv[1]); + goto exit; + } + + if (json_output) + jsonw_start_array(json_wtr); + else + printf("%-8s %-15s %-15s %-15s\n", "ID", "AttachType", + "AttachFlags", "Name"); + + for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) { + /* + * Not all attach types may be supported, so it's expected, + * that some requests will fail. + * If we were able to get the list for at least one + * attach type, let's return 0. + */ + if (list_attached_bpf_progs(cgroup_fd, type) == 0) + ret = 0; + } + + if (json_output) + jsonw_end_array(json_wtr); + + close(cgroup_fd); +exit: + return ret; +} + +static int do_attach(int argc, char **argv) +{ + int cgroup_fd, prog_fd; + enum bpf_attach_type attach_type; + int attach_flags = 0; + int i; + int ret = -1; + + if (argc < 4) { + p_err("too few parameters for cgroup attach\n"); + goto exit; + } + + cgroup_fd = open(argv[0], O_RDONLY); + if (cgroup_fd < 0) { + p_err("can't open cgroup %s\n", argv[1]); + goto exit; + } + + attach_type = parse_attach_type(argv[1]); + if (attach_type == __MAX_BPF_ATTACH_TYPE) { + p_err("invalid attach type\n"); + goto exit_cgroup; + } + + argc -= 2; + argv = &argv[2]; + prog_fd = prog_parse_fd(&argc, &argv); + if (prog_fd < 0) + goto exit_cgroup; + + for (i = 0; i < argc; i++) { + if (strcmp(argv[i], "allow_multi") == 0) { + attach_flags |= BPF_F_ALLOW_MULTI; + } else if (strcmp(argv[i], "allow_override") == 0) { + attach_flags |= BPF_F_ALLOW_OVERRIDE; + } else { + p_err("unknown option: %s\n", argv[i]); + goto exit_cgroup; + } + } + + if (bpf_prog_attach(prog_fd, cgroup_fd, attach_type, attach_flags)) { + p_err("failed to attach program"); + goto exit_prog; + } + + if (json_output) + jsonw_null(json_wtr); + + ret = 0; + +exit_prog: + close(prog_fd); +exit_cgroup: + close(cgroup_fd); +exit: + return ret; +} + +static int do_detach(int argc, char **argv) +{ + int prog_fd, cgroup_fd; + enum bpf_attach_type attach_type; + int ret = -1; + + if (argc < 4) { + p_err("too few parameters for cgroup detach\n"); + goto exit; + } + + cgroup_fd = open(argv[0], O_RDONLY); + if (cgroup_fd < 0) { + p_err("can't open cgroup %s\n", argv[1]); + goto exit; + } + + attach_type = parse_attach_type(argv[1]); + if (attach_type == __MAX_BPF_ATTACH_TYPE) { + p_err("invalid attach type"); + goto exit_cgroup; + } + + argc -= 2; + argv = &argv[2]; + prog_fd = prog_parse_fd(&argc, &argv); + if (prog_fd < 0) + goto exit_cgroup; + + if (bpf_prog_detach2(prog_fd, cgroup_fd, attach_type)) { + p_err("failed to attach program"); + goto exit_prog; + } + + if (json_output) + jsonw_null(json_wtr); + + ret = 0; + +exit_prog: + close(prog_fd); +exit_cgroup: + close(cgroup_fd); +exit: + return ret; +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %s %s list CGROUP\n" + " %s %s attach CGROUP TYPE PROG [ATTACH_FLAGS]\n" + " %s %s detach CGROUP TYPE PROG\n" + " %s %s help\n" + "\n" + " ATTACH_FLAGS := { allow_multi | allow_override }" + " " HELP_SPEC_PROGRAM "\n" + " " HELP_SPEC_OPTIONS "\n" + "", + bin_name, argv[-2], bin_name, argv[-2], + bin_name, argv[-2], bin_name, argv[-2]); + + return 0; +} + +static const struct cmd cmds[] = { + { "list", do_list }, + { "attach", do_attach }, + { "detach", do_detach }, + { "help", do_help }, + { 0 } +}; + +int do_cgroup(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/tools/bpf/bpftool/main.c b/tools/bpf/bpftool/main.c index d294bc8168be..ecd53ccf1239 100644 --- a/tools/bpf/bpftool/main.c +++ b/tools/bpf/bpftool/main.c @@ -85,7 +85,7 @@ static int do_help(int argc, char **argv) " %s batch file FILE\n" " %s version\n" "\n" - " OBJECT := { prog | map }\n" + " OBJECT := { prog | map | cgroup }\n" " " HELP_SPEC_OPTIONS "\n" "", bin_name, bin_name, bin_name); @@ -173,6 +173,7 @@ static const struct cmd cmds[] = { { "batch", do_batch }, { "prog", do_prog }, { "map", do_map }, + { "cgroup", do_cgroup }, { "version", do_version }, { 0 } }; diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h index bec1ccbb49c7..8f6d3cac0347 100644 --- a/tools/bpf/bpftool/main.h +++ b/tools/bpf/bpftool/main.h @@ -115,6 +115,7 @@ int do_pin_fd(int fd, const char *name); int do_prog(int argc, char **arg); int do_map(int argc, char **arg); +int do_cgroup(int argc, char **arg); int prog_parse_fd(int *argc, char ***argv); -- 2.14.3