From patchwork Sat Jan 20 10:00:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 863942 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="QTeEdSVT"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zNtVk2bK3z9s82 for ; Sat, 20 Jan 2018 21:00:46 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755008AbeATKAk (ORCPT ); Sat, 20 Jan 2018 05:00:40 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:33287 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751334AbeATKAd (ORCPT ); Sat, 20 Jan 2018 05:00:33 -0500 Received: by mail-wr0-f194.google.com with SMTP id p6so3725350wrd.0 for ; Sat, 20 Jan 2018 02:00:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=X72UmLsVOLwmway5yN4Q8gYRt3UaIC9mpwd2f9ogikM=; b=QTeEdSVTJVdUzDxdzhPP9/2jxRdHRQfKEUlKjZkorTpGaYAmsbmvVYVwcImqi0oYmb hGnQVsSgpecbI45JEozHByFiI7JTkSXdGIwhDaYGTaZba+lcW+GSRYCxTFvDBwsco7wX nHFaZPZlqfqs5NbgxGZQj3JTAn8H6nfkHR8EIN6B+aB4RaYB4Qsw54sOvBnye5rQYdXs 8BVTA58qV+KBDOpT+nPIo8qhDzRQaUeJxN84Nb45RU4JF2TyVbkb9D5SMlqiFl4xEQEY IWiPHKwO0UW4w0JyVw+fohiMs9cXQ8cF1heFqELJWbm4AUqfLyUFpqfSg5SfdcecVeuJ RWjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=X72UmLsVOLwmway5yN4Q8gYRt3UaIC9mpwd2f9ogikM=; b=VgCZwKy3EtQMDxKVmrm5Tviq5azS7bOjdAaQhtG4UFjp4LhTg23IFgPY0eCyvwtlan eIHKMa0X/5JnfnsX+CyiJm2DDcJzfVnQLTqk1giYIA2yFOwom8hI1Q9L7HdVN0N9McFu IEfSkx1CyIrg4hn0zCalYIPCKULr+w2tfG1QkgjNqWtQ2AGqixWA4lw9kYuWU1EnioSg gcVG9UYAqS9QDzOQdn1uitjlZmoTyuUxTnP86q07kb5gAkw2YNBNaH+aSl4Mkui4lGUe VS5Igs8lZTEd9WDgDoFc70bgp/tDtNd9KUlOrzTcFascJUEf/G9oZQsIGFkgzuIPu3B0 QvyA== X-Gm-Message-State: AKwxyte4WtDCA0/p7b0ixJGRCCYOkkKqKX4KCURwxGCEy0+9Gj70jYMi HJsERsos4FipVjBScX0qws8DS6s/ X-Google-Smtp-Source: AH8x225r+tc9zweNzEWPFidh7KBgySAxLhLAQVEQzLMTD3h4ZQgwU3DM+vMw4fsDaNsINc3cXOmuHA== X-Received: by 10.223.192.139 with SMTP id d11mr870528wrf.260.1516442432148; Sat, 20 Jan 2018 02:00:32 -0800 (PST) Received: from localhost (jirka.pirko.cz. [84.16.102.26]) by smtp.gmail.com with ESMTPSA id o22sm26563571wra.51.2018.01.20.02.00.31 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 20 Jan 2018 02:00:31 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: mlxsw@mellanox.com, dsahern@gmail.com Subject: [patch iproute2 net-next v12 1/3] tc: introduce tc_qdisc_block_exists helper Date: Sat, 20 Jan 2018 11:00:27 +0100 Message-Id: <20180120100029.886-2-jiri@resnulli.us> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180120100029.886-1-jiri@resnulli.us> References: <20180120100029.886-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko This hepler used qdisc dump to list all qdisc and find if block index in question is used by any of them. That means the block with specified index exists. Signed-off-by: Jiri Pirko --- v11->v12: - fixed return type of tc_qdisc_block_exists - removed 0 checks for block in tc_qdisc_block_exists - rever xmas tree variables in tc_qdisc_block_exists --- tc/tc_qdisc.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tc/tc_util.h | 2 ++ 2 files changed, 63 insertions(+) diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c index 70279b9d..54701c26 100644 --- a/tc/tc_qdisc.c +++ b/tc/tc_qdisc.c @@ -412,3 +412,64 @@ int do_qdisc(int argc, char **argv) fprintf(stderr, "Command \"%s\" is unknown, try \"tc qdisc help\".\n", *argv); return -1; } + +struct tc_qdisc_block_exists_ctx { + __u32 block_index; + bool found; +}; + +static int tc_qdisc_block_exists_cb(const struct sockaddr_nl *who, + struct nlmsghdr *n, void *arg) +{ + struct tc_qdisc_block_exists_ctx *ctx = arg; + struct tcmsg *t = NLMSG_DATA(n); + struct rtattr *tb[TCA_MAX+1]; + int len = n->nlmsg_len; + + if (n->nlmsg_type != RTM_NEWQDISC) + return 0; + + len -= NLMSG_LENGTH(sizeof(*t)); + if (len < 0) + return -1; + + parse_rtattr(tb, TCA_MAX, TCA_RTA(t), len); + + if (tb[TCA_KIND] == NULL) + return -1; + + if (tb[TCA_INGRESS_BLOCK] && + RTA_PAYLOAD(tb[TCA_INGRESS_BLOCK]) >= sizeof(__u32)) { + __u32 block = rta_getattr_u32(tb[TCA_INGRESS_BLOCK]); + + if (block == ctx->block_index) + ctx->found = true; + } + + if (tb[TCA_EGRESS_BLOCK] && + RTA_PAYLOAD(tb[TCA_EGRESS_BLOCK]) >= sizeof(__u32)) { + __u32 block = rta_getattr_u32(tb[TCA_EGRESS_BLOCK]); + + if (block == ctx->block_index) + ctx->found = true; + } + return 0; +} + +bool tc_qdisc_block_exists(__u32 block_index) +{ + struct tc_qdisc_block_exists_ctx ctx = { .block_index = block_index }; + struct tcmsg t = { .tcm_family = AF_UNSPEC }; + + if (rtnl_dump_request(&rth, RTM_GETQDISC, &t, sizeof(t)) < 0) { + perror("Cannot send dump request"); + return false; + } + + if (rtnl_dump_filter(&rth, tc_qdisc_block_exists_cb, &ctx) < 0) { + perror("Dump terminated\n"); + return false; + } + + return ctx.found; +} diff --git a/tc/tc_util.h b/tc/tc_util.h index 1218610d..682dd4fd 100644 --- a/tc/tc_util.h +++ b/tc/tc_util.h @@ -132,4 +132,6 @@ int prio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt); int cls_names_init(char *path); void cls_names_uninit(void); +bool tc_qdisc_block_exists(__u32 block_index); + #endif From patchwork Sat Jan 20 10:00:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 863944 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="VCBhZmhq"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zNtVn4wLrz9s82 for ; Sat, 20 Jan 2018 21:00:49 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755324AbeATKAo (ORCPT ); Sat, 20 Jan 2018 05:00:44 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:37815 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751343AbeATKAe (ORCPT ); Sat, 20 Jan 2018 05:00:34 -0500 Received: by mail-wm0-f65.google.com with SMTP id v71so7934471wmv.2 for ; Sat, 20 Jan 2018 02:00:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=RNuHY8OA+Svj4k5b7m9KSRtkP+TLhCZJyVnBUlW7cJE=; b=VCBhZmhqXqBz5sCoally/KQ0I1NvWJi7KHDjgnWCfW3x204e3uiSZ7aOVeeSZLF2h/ PoKhmamVgPbukqayx+FERb8E4R/PVccddRn5IbPn8eokXQwQ/RMeGQ8Rn/N57gShPs+o oh6tZ6jY/VjULW4UM6fHmXy+LfKWW2HiyTOpYfkyovKBgZizRU660ENOCPdK1UhoUtZ4 dzTP8+1D0faiZag0tYFTydTEMVhb+tR0iiYlADMkideFblH54GJKDd9H/WaL4GXzx2mo s6r7VZeDxrUtI4yYU+LxZQTFfBbORwnjFczy+9kNh4wcEZ58uFOU1mGyqkqtiegU6yNI tcWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=RNuHY8OA+Svj4k5b7m9KSRtkP+TLhCZJyVnBUlW7cJE=; b=OCgfkUI8c6t50luFsw7Kg7oXM5Bewr0tEW+3bnafCxu+Q1CvOCyaSNEcssK30RH8Ff 3i5ZHPefJ1bY8S6Pu2IYCqm/ltMFRz+hA+ACOsgrYjXJStV847Gw066b+lw7xFbGHPoG 8nrP+NOr0Yv5jvTZB0NhFE7SVnFPdNi68KpLBmRdJjGzj3yFxxcwUSx3jkocDOqmWlK4 Biq5Cloq4ynDCz69ZDgIl/o3h1EL3p47W+wULcsW4WabsPoanVtXM092ymMGZI54EaDD pBTUnlIr5f2ky1qAOsu2+JtVzaZGQ8SvXt/wXLt5YNmNPOhIr5kjZVVHcTpZSgbht24s 6RuQ== X-Gm-Message-State: AKwxytdoy5NWijIRjgg4MFeU7Jbq5KGF+f+srtjCRFPHMD1R9idZ56vs b1JbsSiUB6p0jF0RwsvAEABLbtd2 X-Google-Smtp-Source: AH8x226E+masD2FPiiH9KAtvW6Mt4+z6fq1uklZSaNtFbYX5H0hLionxWQRNNyvaIfP19mib9SmA3g== X-Received: by 10.28.65.133 with SMTP id o127mr761241wma.130.1516442432927; Sat, 20 Jan 2018 02:00:32 -0800 (PST) Received: from localhost (jirka.pirko.cz. [84.16.102.26]) by smtp.gmail.com with ESMTPSA id f19sm1033205wmf.23.2018.01.20.02.00.32 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 20 Jan 2018 02:00:32 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: mlxsw@mellanox.com, dsahern@gmail.com Subject: [patch iproute2 net-next v12 2/3] tc: introduce support for block-handle for filter operations Date: Sat, 20 Jan 2018 11:00:28 +0100 Message-Id: <20180120100029.886-3-jiri@resnulli.us> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180120100029.886-1-jiri@resnulli.us> References: <20180120100029.886-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko So far, qdisc was the only handle that could be used to manipulate filters. Kernel added support for using block to manipulate it. So add the support to use block index to manipulate filters. The magic TCM_IFINDEX_MAGIC_BLOCK indicates the block index is in use. Signed-off-by: Jiri Pirko --- v11->v12: - fixes error message when both dev and block are on the command line --- man/man8/tc.8 | 18 ++++++++++ tc/tc_filter.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 106 insertions(+), 17 deletions(-) diff --git a/man/man8/tc.8 b/man/man8/tc.8 index ff071b33..d65f0583 100644 --- a/man/man8/tc.8 +++ b/man/man8/tc.8 @@ -41,6 +41,19 @@ tc \- show / manipulate traffic control settings .B flowid \fIflow-id\fR +.B tc +.RI "[ " OPTIONS " ]" +.B filter [ add | change | replace | delete | get ] block +\fIBLOCK_INDEX\fR +.B [ handle \fIfilter-id\fR ] +.B protocol +\fIprotocol\fR +.B prio +\fIpriority\fR filtertype +[ filtertype specific parameters ] +.B flowid +\fIflow-id\fR + .B tc .RI "[ " OPTIONS " ]" .RI "[ " FORMAT " ]" @@ -58,6 +71,11 @@ tc \- show / manipulate traffic control settings .RI "[ " OPTIONS " ]" .B filter show dev \fIDEV\fR +.P +.B tc +.RI "[ " OPTIONS " ]" +.B filter show block +\fIBLOCK_INDEX\fR .P .ti 8 diff --git a/tc/tc_filter.c b/tc/tc_filter.c index 7dd123ab..c619e464 100644 --- a/tc/tc_filter.c +++ b/tc/tc_filter.c @@ -28,14 +28,17 @@ static void usage(void) { fprintf(stderr, - "Usage: tc filter [ add | del | change | replace | show ] dev STRING\n" - "Usage: tc filter get dev STRING parent CLASSID protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n" + "Usage: tc filter [ add | del | change | replace | show ] [ dev STRING ]\n" + " tc filter [ add | del | change | replace | show ] [ block BLOCK_INDEX ]\n" + " tc filter get dev STRING parent CLASSID protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n" + " tc filter get block BLOCK_INDEX protocol PROTO handle FILTERID pref PRIO FILTER_TYPE\n" " [ pref PRIO ] protocol PROTO [ chain CHAIN_INDEX ]\n" " [ estimator INTERVAL TIME_CONSTANT ]\n" " [ root | ingress | egress | parent CLASSID ]\n" " [ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ]\n" "\n" " tc filter show [ dev STRING ] [ root | ingress | egress | parent CLASSID ]\n" + " tc filter show [ block BLOCK_INDEX ]\n" "Where:\n" "FILTER_TYPE := { rsvp | u32 | bpf | fw | route | etc. }\n" "FILTERID := ... format depends on classifier, see there\n" @@ -58,6 +61,7 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv, int chain_index_set = 0; char d[IFNAMSIZ] = {}; int protocol_set = 0; + __u32 block_index = 0; char *fhandle = NULL; __u32 protocol = 0; __u32 chain_index; @@ -89,7 +93,21 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv, NEXT_ARG(); if (d[0]) duparg("dev", *argv); + if (block_index) { + fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n"); + return -1; + } strncpy(d, *argv, sizeof(d)-1); + } else if (matches(*argv, "block") == 0) { + NEXT_ARG(); + if (block_index) + duparg("block", *argv); + if (d[0]) { + fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n"); + return -1; + } + if (get_u32(&block_index, *argv, 0) || !block_index) + invarg("invalid block index value", *argv); } else if (strcmp(*argv, "root") == 0) { if (req->t.tcm_parent) { fprintf(stderr, @@ -184,6 +202,9 @@ static int tc_filter_modify(int cmd, unsigned int flags, int argc, char **argv, fprintf(stderr, "Cannot find device \"%s\"\n", d); return 1; } + } else if (block_index) { + req->t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; + req->t.tcm_block_index = block_index; } if (q) { @@ -228,6 +249,7 @@ static __u32 filter_prio; static __u32 filter_protocol; static __u32 filter_chain_index; static int filter_chain_index_set; +static __u32 filter_block_index; __u16 f_proto; int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) @@ -274,20 +296,27 @@ int print_filter(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) print_bool(PRINT_ANY, "added", "added ", true); print_string(PRINT_FP, NULL, "filter ", NULL); - if (!filter_ifindex || filter_ifindex != t->tcm_ifindex) - print_string(PRINT_ANY, "dev", "dev %s ", - ll_index_to_name(t->tcm_ifindex)); - - if (!filter_parent || filter_parent != t->tcm_parent) { - if (t->tcm_parent == TC_H_ROOT) - print_bool(PRINT_ANY, "root", "root ", true); - else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS)) - print_bool(PRINT_ANY, "ingress", "ingress ", true); - else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_EGRESS)) - print_bool(PRINT_ANY, "egress", "egress ", true); - else { - print_tc_classid(abuf, sizeof(abuf), t->tcm_parent); - print_string(PRINT_ANY, "parent", "parent %s ", abuf); + if (t->tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK) { + if (!filter_block_index || + filter_block_index != t->tcm_block_index) + print_uint(PRINT_ANY, "block", "block %u ", + t->tcm_block_index); + } else { + if (!filter_ifindex || filter_ifindex != t->tcm_ifindex) + print_string(PRINT_ANY, "dev", "dev %s ", + ll_index_to_name(t->tcm_ifindex)); + + if (!filter_parent || filter_parent != t->tcm_parent) { + if (t->tcm_parent == TC_H_ROOT) + print_bool(PRINT_ANY, "root", "root ", true); + else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS)) + print_bool(PRINT_ANY, "ingress", "ingress ", true); + else if (t->tcm_parent == TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_EGRESS)) + print_bool(PRINT_ANY, "egress", "egress ", true); + else { + print_tc_classid(abuf, sizeof(abuf), t->tcm_parent); + print_string(PRINT_ANY, "parent", "parent %s ", abuf); + } } } @@ -367,6 +396,7 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) int protocol_set = 0; __u32 chain_index; int chain_index_set = 0; + __u32 block_index = 0; __u32 parent_handle = 0; char *fhandle = NULL; char d[IFNAMSIZ] = {}; @@ -377,7 +407,21 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) NEXT_ARG(); if (d[0]) duparg("dev", *argv); + if (block_index) { + fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n"); + return -1; + } strncpy(d, *argv, sizeof(d)-1); + } else if (matches(*argv, "block") == 0) { + NEXT_ARG(); + if (block_index) + duparg("block", *argv); + if (d[0]) { + fprintf(stderr, "Error: \"dev\" and \"block\" are mutually exlusive\n"); + return -1; + } + if (get_u32(&block_index, *argv, 0) || !block_index) + invarg("invalid block index value", *argv); } else if (strcmp(*argv, "root") == 0) { if (req.t.tcm_parent) { fprintf(stderr, @@ -491,8 +535,12 @@ static int tc_filter_get(int cmd, unsigned int flags, int argc, char **argv) return 1; } filter_ifindex = req.t.tcm_ifindex; + } else if (block_index) { + req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; + req.t.tcm_block_index = block_index; + filter_block_index = block_index; } else { - fprintf(stderr, "Must specify netdevice \"dev\"\n"); + fprintf(stderr, "Must specify netdevice \"dev\" or block index \"block\"\n"); return -1; } @@ -542,6 +590,7 @@ static int tc_filter_list(int argc, char **argv) __u32 prio = 0; __u32 protocol = 0; __u32 chain_index; + __u32 block_index = 0; char *fhandle = NULL; while (argc > 0) { @@ -549,7 +598,21 @@ static int tc_filter_list(int argc, char **argv) NEXT_ARG(); if (d[0]) duparg("dev", *argv); + if (block_index) { + fprintf(stderr, "Error: \"dev\" cannot be used in the same time as \"block\"\n"); + return -1; + } strncpy(d, *argv, sizeof(d)-1); + } else if (matches(*argv, "block") == 0) { + NEXT_ARG(); + if (block_index) + duparg("block", *argv); + if (d[0]) { + fprintf(stderr, "Error: \"block\" cannot be used in the same time as \"dev\"\n"); + return -1; + } + if (get_u32(&block_index, *argv, 0) || !block_index) + invarg("invalid block index value", *argv); } else if (strcmp(*argv, "root") == 0) { if (req.t.tcm_parent) { fprintf(stderr, @@ -638,6 +701,14 @@ static int tc_filter_list(int argc, char **argv) return 1; } filter_ifindex = req.t.tcm_ifindex; + } else if (block_index) { + if (!tc_qdisc_block_exists(block_index)) { + fprintf(stderr, "Cannot find block \"%u\"\n", block_index); + return 1; + } + req.t.tcm_ifindex = TCM_IFINDEX_MAGIC_BLOCK; + req.t.tcm_block_index = block_index; + filter_block_index = block_index; } if (filter_chain_index_set) From patchwork Sat Jan 20 10:00:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 863945 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="VQdFVXBv"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zNtVs46NSz9s82 for ; Sat, 20 Jan 2018 21:00:53 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755507AbeATKAv (ORCPT ); Sat, 20 Jan 2018 05:00:51 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:37663 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754548AbeATKAf (ORCPT ); Sat, 20 Jan 2018 05:00:35 -0500 Received: by mail-wr0-f194.google.com with SMTP id f11so3711723wre.4 for ; Sat, 20 Jan 2018 02:00:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=W1nDUl+X+PEn0XWK65NPEi/t8d6uTbZAlD4JoD9lnSU=; b=VQdFVXBvvxKOdPZ6ZS9YyqLBCPxMtkIrL3TaggjmAMsmvV3QNehG3fXjibZZ0Kb2BR KdWimsJLPMUfPYQv3Yndi2GTKR2iArv0pnzDDS+O+BLjZryr1NtfIeifvQCl+FURZdpT VuBopiBllleUrXnkcL3SfC9sIQ9VJTGjwMT20M3Pi3/K20to893/rmjHUy5MJ5fElRqw B3hTZQe+afJTIWVFAmNa17Rees7WYbCX5JN5/7/aC81jOjKT62CMUadMQVBZKm2VCI8u xKkW8ZSRlcb8tISVpCul1GFf1AR2hfPmYhVkx1XoRLp6UjYwXtDY6UeFSsk27z43fp18 ErZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=W1nDUl+X+PEn0XWK65NPEi/t8d6uTbZAlD4JoD9lnSU=; b=PDJ9eANwArdheF0g9xHShox9rI1HzotaWpxChx+Q/6NJVe1LXD+1hT8K5uxGyR/Uba 2xHwUKtZP7IzBbkEv79nqj2+ZoH2pbjZTq4eR2eKJEvJxvpq26lKl9n8llxVTgTGwPj5 dRnsu/kRQvArDdj9VnXQQCEK5VcMZt1/65HblA0pfgiuh8gtZleKeKBNTb67CNG+V01X v3YgLd5X02dpBLrV5aWxfguCj6A98dzZcnggo/gvfYNyuFZYnZ6DSjgYig5UULA1zWmw BlwDp4byI01pFsQujf1VkLfTUrdLPV8fd1ruDW7+c2oMo2jVSVkZFWUwL4CnQUOSeYk4 CQBw== X-Gm-Message-State: AKwxytdnCLBsevSdKf4oZyAkDZdVbhk51jhZT864D1NdkWGFczFk23+m AdEDhdcgFQwJ7q6P/YISrr+ykeAB X-Google-Smtp-Source: AH8x2242d+D5Khz8BmGTxnu/F6A1qdZ8Fdtw4djPRdTNwFSZF+m0jV3R7UfF0GXIHbxjZYzVR/6LIQ== X-Received: by 10.223.153.52 with SMTP id x49mr1174803wrb.195.1516442433712; Sat, 20 Jan 2018 02:00:33 -0800 (PST) Received: from localhost (jirka.pirko.cz. [84.16.102.26]) by smtp.gmail.com with ESMTPSA id i33sm8037915wri.70.2018.01.20.02.00.33 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 20 Jan 2018 02:00:33 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: mlxsw@mellanox.com, dsahern@gmail.com Subject: [patch iproute2 net-next v12 3/3] tc: implement ingress/egress block index attributes for qdiscs Date: Sat, 20 Jan 2018 11:00:29 +0100 Message-Id: <20180120100029.886-4-jiri@resnulli.us> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180120100029.886-1-jiri@resnulli.us> References: <20180120100029.886-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko During qdisc creation it is possible to specify shared block for bot ingress and egress. Pass this values to kernel according to the command line options. Signed-off-by: Jiri Pirko --- man/man8/tc.8 | 6 +++++- tc/tc_qdisc.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/man/man8/tc.8 b/man/man8/tc.8 index d65f0583..5ffea373 100644 --- a/man/man8/tc.8 +++ b/man/man8/tc.8 @@ -11,7 +11,11 @@ tc \- show / manipulate traffic control settings \fIqdisc-id\fR .B | root ] .B [ handle -\fIqdisc-id\fR ] qdisc +\fIqdisc-id\fR ] +.B [ ingress_block +\fIBLOCK_INDEX\fR ] +.B [ egress_block +\fIBLOCK_INDEX\fR ] qdisc [ qdisc specific parameters ] .P diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c index 54701c26..8cc4b73d 100644 --- a/tc/tc_qdisc.c +++ b/tc/tc_qdisc.c @@ -31,6 +31,7 @@ static int usage(void) fprintf(stderr, " [ handle QHANDLE ] [ root | ingress | clsact | parent CLASSID ]\n"); fprintf(stderr, " [ estimator INTERVAL TIME_CONSTANT ]\n"); fprintf(stderr, " [ stab [ help | STAB_OPTIONS] ]\n"); + fprintf(stderr, " [ ingress_block BLOCK_INDEX ] [ egress_block BLOCK_INDEX ]\n"); fprintf(stderr, " [ [ QDISC_KIND ] [ help | OPTIONS ] ]\n"); fprintf(stderr, "\n"); fprintf(stderr, " tc qdisc show [ dev STRING ] [ ingress | clsact ] [ invisible ]\n"); @@ -61,6 +62,8 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv) .n.nlmsg_type = cmd, .t.tcm_family = AF_UNSPEC, }; + __u32 ingress_block = 0; + __u32 egress_block = 0; while (argc > 0) { if (strcmp(*argv, "dev") == 0) { @@ -121,6 +124,14 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv) if (parse_size_table(&argc, &argv, &stab.szopts) < 0) return -1; continue; + } else if (matches(*argv, "ingress_block") == 0) { + NEXT_ARG(); + if (get_u32(&ingress_block, *argv, 0) || !ingress_block) + invarg("invalid ingress block index value", *argv); + } else if (matches(*argv, "egress_block") == 0) { + NEXT_ARG(); + if (get_u32(&egress_block, *argv, 0) || !egress_block) + invarg("invalid egress block index value", *argv); } else if (matches(*argv, "help") == 0) { usage(); } else { @@ -138,6 +149,13 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv) if (est.ewma_log) addattr_l(&req.n, sizeof(req), TCA_RATE, &est, sizeof(est)); + if (ingress_block) + addattr32(&req.n, sizeof(req), + TCA_INGRESS_BLOCK, ingress_block); + if (egress_block) + addattr32(&req.n, sizeof(req), + TCA_EGRESS_BLOCK, egress_block); + if (q) { if (q->parse_qopt) { if (q->parse_qopt(q, argc, argv, &req.n, d)) @@ -270,6 +288,24 @@ int print_qdisc(const struct sockaddr_nl *who, (rta_getattr_u8(tb[TCA_HW_OFFLOAD]))) print_bool(PRINT_ANY, "offloaded", "offloaded ", true); + if (tb[TCA_INGRESS_BLOCK] && + RTA_PAYLOAD(tb[TCA_INGRESS_BLOCK]) >= sizeof(__u32)) { + __u32 block = rta_getattr_u32(tb[TCA_INGRESS_BLOCK]); + + if (block) + print_uint(PRINT_ANY, "ingress_block", + "ingress_block %u ", block); + } + + if (tb[TCA_EGRESS_BLOCK] && + RTA_PAYLOAD(tb[TCA_EGRESS_BLOCK]) >= sizeof(__u32)) { + __u32 block = rta_getattr_u32(tb[TCA_EGRESS_BLOCK]); + + if (block) + print_uint(PRINT_ANY, "egress_block", + "egress_block %u ", block); + } + /* pfifo_fast is generic enough to warrant the hardcoding --JHS */ if (strcmp("pfifo_fast", RTA_DATA(tb[TCA_KIND])) == 0) q = get_qdisc_kind("prio");