From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753211AbdK3No0 (ORCPT ); Thu, 30 Nov 2017 08:44:26 -0500 Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:37324 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752312AbdK3Nn5 (ORCPT ); Thu, 30 Nov 2017 08:43:57 -0500 From: Roman Gushchin To: CC: , , , , , , Subject: [PATCH net-next 3/5] bpftool: implement cgattach command Date: Thu, 30 Nov 2017 13:43:00 +0000 Message-ID: <20171130134302.2840-4-guro@fb.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171130134302.2840-1-guro@fb.com> References: <20171130134302.2840-1-guro@fb.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [2620:10d:c092:200::1:638c] X-ClientProxiedBy: VI1PR0602CA0010.eurprd06.prod.outlook.com (2603:10a6:800:bc::20) To CO1PR15MB1079.namprd15.prod.outlook.com (2a01:111:e400:7b66::9) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b0ce6e9a-a09d-4cb7-738c-08d537f85b17 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603286);SRVR:CO1PR15MB1079; X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1079;3:vBkHT+wNIxl+jWE3RGpSaOZgTUMJiH9Zm6YXj96gFcSpXV3PjKIB+tuj+eeIjQCGfUyO2NwPKCB0OYlJbjihDnLj0iTlM22b3RxukgZ0s7qMcqozsvZEVT9JKoLpJ61mm0NGBCydqy2BeDL+03y+QuBV9vgQkbH1MQ0u7k27w6DwTBx/xulqriPPlZ6jhsOeZ5avCnEIRd5Z0famP7cPhRJzH1usPSfY8hMzAwRMJH1iatMpxEZKUX3MD1Oqt/XS;25:PD9/Y+gde+3s5VHErUTAITBMaNsPusyqj/qSQoDdLqNvmK4uH7APYWBsesZ5OTAvfL07+T6wW0/s6tO0LKTY09p93S7vTUuNTh14LGAUZVxRVsNqxSPp9iG5E0fQ0gNSKAdPy7zjidFeCbY252+ajDcelAhx/txpTNz1II5oesAsP+FIAVFpJqcF7T6+hQj++iGt12OpABa+mEkNQeoljIuF8l6kImWWs2+FJVU1VZ6L8GXsesOnHofLER5Zngl+Tiq5ygEbUjsuOl5Cn4aXixsj4jAjCPkhQbX9ouK1pgUb1xy0zRMVIuHwNgX4incWK0DJZd6NwQ+7rFtSypc6WA==;31:U4yifw51VRUIFF4ZmWGtrwC4suNsC5l0yGyOYUyeheT9qBDyLr4aUGc+a1BnZlVh/KFkEtdJshc9CnplWgFr9iLHtoeQBEz8gN8EEXXD1AWlkDCZdvUmgrzV5U/NNiXpYn7K0YiUSPYHTTxKz7C2CvQXb5gj2dLHwf/SoqcTyAwV2DG9mcLj/IMSBVwLO4XLv8+yGhjnoaWqT4PWelzT8uMdAii7unkbkKEztyE752U= X-MS-TrafficTypeDiagnostic: CO1PR15MB1079: X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1079;20:Lc1QuvI4G9sXs/nlgUq+f9ixM+CUegpIZfCa+YmHQ2QPDDEHAexLkrUT8osr3uksUVI2nTeLdPLW4u9BtH4z/P/+0rnThCcsZk7F0/upd6LJqVt2a8cWGt87oTeti6lXavv5YKmxkNpZV5V1twixzPr7e3YXPPTeCjODkyU+bd5D07PIFXFHfkRgQEiqkq5Kl5spsTzKAyBlzC+tB70130NKkQMIMXgYYdDLanGNfIiVjFNie0j/+AlVZa0HaTugOBrrYbeNcWgN4cns7g7LIb4g9HIzdAZuJU2glf/sVAVkm4lwMDKcn47YP+4pkaCRXMFEm6rdlwjpYznG55Pt3LS3JS4C4G7qS/9GKU2m4cZyQhnd5LgABRPYcNDMdEj9GGNKKTRnZaN/2L9qDAVrpfOjgWxA+smxkDaaS67/oJpiTORcp6ntweOTd/SePN5wctxXvm9Y2qgOEG54F/InVcDtTqfJh6ESM4bNsEqrpUrTtHELKnLfomr0RXHKutTJ;4:fSBEQTcOR559WHTbJooV7oOOApwYz906QmjSAQTCzfgxOuy47MYbSlVJPzDPHoH7WWihBQByreOANmpzVjOdlcbRSGgPzg4E3Ej8Kq6CsFeDV1ZMVPXpmkbKkzkRcutrubVFLaFYBJK9fSruVL9jgIMJLu2jJjAp8qF+fZu5kCcvV7k1KPuUuXoFjbn5LOqVtPF+3WZWs6dm9d7wjtnp0CJVwjiIikXtwrSSBFFq1Yb3CzPzUrWv+/5b/vmDRLFXcf7Sess81jE89Fi6hGF8ZLz18A75uumz1CFWBdFUqMVRJ+r1DCJOHImc95EqUg65 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(67672495146484); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(11241501159)(6040450)(2401047)(8121501046)(5005006)(3002001)(10201501046)(93006095)(93001095)(3231022)(6041248)(20161123562025)(20161123555025)(20161123560025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(6072148)(201708071742011);SRVR:CO1PR15MB1079;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:CO1PR15MB1079; X-Forefront-PRVS: 05079D8470 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6009001)(376002)(346002)(366004)(199003)(189002)(68736007)(48376002)(53416004)(86362001)(478600001)(189998001)(50466002)(52396003)(52116002)(39060400002)(53936002)(2906002)(50986010)(6116002)(81156014)(81166006)(51416003)(1076002)(8676002)(8936002)(76176010)(5890100001)(50226002)(97736004)(105586002)(2361001)(2351001)(5660300001)(6512007)(101416001)(7736002)(305945005)(6486002)(4326008)(6506006)(25786009)(106356001)(69596002)(6666003)(33646002)(2950100002)(6916009)(36756003)(47776003)(316002)(16586007)(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:IZJzx5IksQJCq5LGtq0VBshco2bnKq623cm48kh7U?= =?us-ascii?Q?Ph82TaSv9usl2w7CZ8EyHa7y/Zy7yf5fDiQ800uMw0XCcWxjkWWvTlbuO2QX?= =?us-ascii?Q?ieLTDxwLhHimtnVWJp2s9PAenh1fW33VEFafDL9vJdgYu62dUeR7cg0r1wQ4?= =?us-ascii?Q?QWBWhpQIp2Ezx1wICLP9XELwbUnqaEZfODFXSMTYnGA/xzdMg5fir5cPsBW7?= =?us-ascii?Q?pCv3bLtrvUQYIwMoSTZSzTb4lJyIs7Zz0ZbOMr/c+5YIaxtdR3HNMtYFb4Rh?= =?us-ascii?Q?nFXDf6O6p/qImS5JTLLLmcEKzs9RfLItSdZAH9g+p6e/nSgre9l35EIkM0Zk?= =?us-ascii?Q?oJaC0rVcVzJ87tAPqvxX3wHRe98ma1vxXas5Q6U5vGlgGRipDfOdbbvzaHzX?= =?us-ascii?Q?b1/srwINou/QesZl/kFC0xXnCUuE7NlR8IytghZnax5Y/ymU84rX6SZwRee9?= =?us-ascii?Q?PLdJUvwtOicVHsZPHdPZ3x3IBhcbh5i/ie3nJqtIFotIkJUdsN0EJ04lx6Ah?= =?us-ascii?Q?8911OmnPz4vFyXqbsHU2uRAr9XmCiDpamVz0mllu9wxYwSRu1bmPrtMDJjLb?= =?us-ascii?Q?iAw/wHeIQAzrQsBB9ym5nsYVOctyYRI0XjypuHSi/RuQc2FrDZ+25OvJ5fe7?= =?us-ascii?Q?JIL3ui0BAcyGEBvGhK+y0PpWqCGs1bhnvEZjoLe7Fn5dH5baYPoA0PMZh8ko?= =?us-ascii?Q?pUYYJRrgJKLExwDIQsyFwuu4wCUtk+lGmV9VNrofkd0Htulzr7S0NDWVr/iq?= =?us-ascii?Q?7aR5phD7IC+FbwX69muzsJEYVuoyKMQPM5jzZsEFx3nvQHS+nozzs7dGj5vN?= =?us-ascii?Q?by6hko6DGbgomQwz+FpuRZkhZsjIG8eq04XvB9GyaMgpayF5A0YPlqqqfN8m?= =?us-ascii?Q?yWJyGzrcsV7nNtl+6A50EG8puLYOnzyJAwyXAmeihpNJBvZ5wzZ4j+HShFY+?= =?us-ascii?Q?cJ0gdokrNMvKebdsrMQIwcvPaENwEBVoIGiWQWXwyaYmvF+U4ktWNBAXurax?= =?us-ascii?Q?u282zlbd63bgoEORnsl8JsKWZ26baD2Q5h5mD96ny4+/E8Iws9nDqEqN9dJ5?= =?us-ascii?Q?Jj06+rRIxuZbGy4mxTqAHwJ9NOVmZv5OThSS3eSuXPHeiUwFLfeo+nuwjHWM?= =?us-ascii?Q?G92/N/tz2Yj6LMUdhYky8lQPzHZ5YJdYSnirqxZAh6f0ku4uW+/ma2CzI3yP?= =?us-ascii?Q?dpvqF8BcuVJ7pCtRyaqCRFoz7ZYfzj/fMu1ORxdBqQJTO2ie4zWKZXINA=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1079;6:SD/tZNdavk3QZTZ5CecSBxbMRYC+yeGfVdnBK6LHwzQROHE2aY8hkmEYt0pQiXWl/ykwJ8KjcAZXuERMmov2JK9XNAIOChxSw1d5Cdr7FFqwK6LWrcUIoD6E0natC7Ctwn1kG5YkBMCsgqRXw9RLi6mft0GkafmQjHJlU7vH4FYQViCvk9FJczj+CAXhhrc9HuLnN8i9J7orv9aFXZROHCKyfy1x0KHW+I3LD3wzK78aaVW8O0WS/BYLq6Tp65xfU6TtPMfxDWZNu1A9d15qfc6cFBmRBijXyIw4sUn3yymRcBhnKaIvCRXhwH8cBXdvUIql/Ru7DaV3RKFNKLboo+MjI7/s7dtYA1YnWs03Wxc=;5:jkoH0V4QMYgkSA2A3azoOvNlXTKMB5jK7kbGkSHNRGT2M54fIBUHpCzXYBOyP2y165cTe9QC3ir3J3j43vRI7poPGWnSeu0009XKxOttfmX0l1Sni57Ce2alWqNjzAOL4MAl7D7EczgDoBfI/EEq0yRZlLchBLyEL7liUFhAsms=;24:5oq4UmxECBvHcHHyFETvMNneclA+/0D+MCfANMn2243JkASCxj1C/HgZE1p24QRyZt8/R5aaWi+0yjlws7qzV5Kw8+BJrQpdHFwkJkcw9W8=;7:u3wJ0IgB/HV6qmPSCmT9/q2B8gH+r00xdnqJ+hSBd9qonGQyTKRFf8AuVrdWzNTOyYhC1SiIrQTniyWNfwOj+kGs2n8JFz/NMeWe0Uv8H9XsnoSKBSLBmkjBFt6eVywxRFVW7iwvHg/dfKfjpzfDFX/n3a9+hU69d8Jk9xNSyoD8o+VChYKvdc/wJNBaVvpQ1WvAlA3LwtXPsmB3W5W2HhA/EfEAvioHnBOubY7ApC8LRlj3nFpBxRdHMXEQDfEp SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CO1PR15MB1079;20:tKwOdO1rKQEdHUzO5WNv3upz8Jnm8RgIOTTV4qhldndouSBAbzafnKDRglmzSsKtC6g3roqc0AO/acZ8ZdX75cBavTmAILl93UJ14F2KicOiMgMx0Fj9q+OKhQpLmyR7MaLZRD/YVpkBlcuu2QTFX4m0GvuMvdhLqkiYdAJmPFM= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2017 13:43:34.2160 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b0ce6e9a-a09d-4cb7-738c-08d537f85b17 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-11-30_04:,, 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 add the cgattach command to bpftool. It allows to load a bpf program from a binary file and attach it to a given cgroup. Example: $ bpftool cgattach ./mybpfprog.o /sys/fs/cgroup/user.slice/ ingress Signed-off-by: Roman Gushchin Cc: Alexei Starovoitov Cc: Daniel Borkmann Cc: Jakub Kicinski Cc: Martin KaFai Lau --- tools/bpf/bpftool/main.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/tools/bpf/bpftool/main.c b/tools/bpf/bpftool/main.c index d6e4762170a4..8eb3b9bf5bb2 100644 --- a/tools/bpf/bpftool/main.c +++ b/tools/bpf/bpftool/main.c @@ -41,9 +41,14 @@ #include #include #include +#include #include +#include +#include +#include #include +#include #include "main.h" @@ -75,12 +80,13 @@ static int do_help(int argc, char **argv) fprintf(stderr, "Usage: %s [OPTIONS] OBJECT { COMMAND | help }\n" " %s batch file FILE\n" + " %s cgattach FILE CGROUP TYPE\n" " %s version\n" "\n" " OBJECT := { prog | map }\n" " " HELP_SPEC_OPTIONS "\n" "", - bin_name, bin_name, bin_name); + bin_name, bin_name, bin_name, bin_name); return 0; } @@ -159,12 +165,14 @@ void fprint_hex(FILE *f, void *arg, unsigned int n, const char *sep) } static int do_batch(int argc, char **argv); +static int do_cgattach(int argc, char **argv); static const struct cmd cmds[] = { { "help", do_help }, { "batch", do_batch }, { "prog", do_prog }, { "map", do_map }, + { "cgattach", do_cgattach }, { "version", do_version }, { 0 } }; @@ -259,6 +267,77 @@ static int do_batch(int argc, char **argv) return err; } +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, +}; + +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 do_cgattach(int argc, char **argv) +{ + struct bpf_object *obj; + int prog_fd, cgroup_fd; + enum bpf_attach_type attach_type; + + if (argc < 3) { + p_err("too few parameters for cgattach\n"); + return -1; + } else if (argc > 3) { + p_err("too many parameters for cgattach\n"); + return -1; + } + + if (bpf_prog_load(argv[0], BPF_PROG_TYPE_UNSPEC, &obj, &prog_fd)) + return -1; + + cgroup_fd = open(argv[1], O_RDONLY); + if (cgroup_fd < 0) { + bpf_object__close(obj); + close(prog_fd); + p_err("can't open cgroup %s\n", argv[1]); + return -1; + } + + attach_type = parse_attach_type(argv[2]); + if (attach_type == __MAX_BPF_ATTACH_TYPE) { + bpf_object__close(obj); + close(prog_fd); + close(cgroup_fd); + p_err("Invalid attach type\n"); + return -1; + } + + if (bpf_prog_attach(prog_fd, cgroup_fd, attach_type, 0)) { + bpf_object__close(obj); + close(prog_fd); + close(cgroup_fd); + p_err("Failed to attach program"); + return -1; + } + + bpf_object__close(obj); + close(prog_fd); + close(cgroup_fd); + + return 0; +} + int main(int argc, char **argv) { static const struct option options[] = { -- 2.14.3