From patchwork Wed Jan 17 10:48:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 862188 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="GwLBOCt6"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zM3jK5DKJz9sDB for ; Wed, 17 Jan 2018 21:48:37 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752909AbeAQKsg (ORCPT ); Wed, 17 Jan 2018 05:48:36 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:34807 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752635AbeAQKsV (ORCPT ); Wed, 17 Jan 2018 05:48:21 -0500 Received: by mail-wm0-f66.google.com with SMTP id 81so21267782wmb.1 for ; Wed, 17 Jan 2018 02:48:21 -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=0xlGxPbiNS6qv70L0bF0e241CELhuT5btCl3O1BIFgE=; b=GwLBOCt6BV6+7HFQ23vCfkAWZlKkZAdEZA06fjpCWIWV7sMEsILefAdI4tsKpOlWhV Fw+w7aIO247ofVSrZkkNDQsCq2ByLIGfk5NK520kdYO3wBw267TvJSyvDgVob78OMxnU HrHvk3m5J6CoQW4qM7ZdUWNfwBNvIaU3CEFl26P+XcVkW+SHb2CGoiJw42Ef5DPHQxad cEn6ypsqN6tunAxwEiqUcBSPdPbYCheetmDXAXyzDqXl+3Btudey6GgWAQXw44dkt6iH GItk23hCrEYm8R9otNyPmeD/LEstrijSjnEVoSUHmTVDfdkdo1swzWMv+T9ciJlHD32e IL2Q== 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=0xlGxPbiNS6qv70L0bF0e241CELhuT5btCl3O1BIFgE=; b=fHHfkYwSwhFO0POtawnp2POUkKSX6d8YuLX+biryu6e+CnHWu6xoRy/HVYIiQ3CRUJ VetpiaJ9EVTr534yvV5WJRXEgsxAp4AephbuN3hc1cacP8GWzpGvYexuwvB73HvP0SaF JtcmfFdBMTWJVNOBGx3D4q8dbuyvuLjwaDIEahV/qHCCxZYtTkUntTOCdifpKrl1w6Vo ZR0Oom8JAhM+fJsEm5ZrRewsglsdAgFGvi0bY/PQVZmi8sRyelaTSIIeSfabajaANLKf snu04sGeokWNWUikeTqulzetqZy5qHJxJaLQbisZ+KTssW3M472SYjTBDkXC9Zp8bfsE HGEw== X-Gm-Message-State: AKwxytdwArfokJsWJrW7e1CoGNovkQ7QRIcAYQp3NbAmtuzNoU+Pfh8d CKixtnzv3hxwsRJzjJ6kLDVSJh5F X-Google-Smtp-Source: ACJfBosiyl2snWK/33zvXD1k5D2aM43FBkOhe//ClShh1PIeIyhRDBgXPTVX5O0ap9wccKTex8DjEg== X-Received: by 10.28.206.12 with SMTP id e12mr1852735wmg.73.1516186100187; Wed, 17 Jan 2018 02:48:20 -0800 (PST) Received: from localhost (ip-89-177-135-29.net.upcbroadband.cz. [89.177.135.29]) by smtp.gmail.com with ESMTPSA id g64sm3371456wmf.20.2018.01.17.02.48.19 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 17 Jan 2018 02:48:19 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, jhs@mojatatu.com, xiyou.wangcong@gmail.com, mlxsw@mellanox.com, andrew@lunn.ch, vivien.didelot@savoirfairelinux.com, f.fainelli@gmail.com, michael.chan@broadcom.com, ganeshgr@chelsio.com, saeedm@mellanox.com, matanb@mellanox.com, leonro@mellanox.com, idosch@mellanox.com, jakub.kicinski@netronome.com, simon.horman@netronome.com, pieter.jansenvanvuuren@netronome.com, john.hurley@netronome.com, alexander.h.duyck@intel.com, ogerlitz@mellanox.com, john.fastabend@gmail.com, daniel@iogearbox.net, dsahern@gmail.com Subject: [patch iproute2 net-next v11 3/4] tc: introduce support for block-handle for filter operations Date: Wed, 17 Jan 2018 11:48:16 +0100 Message-Id: <20180117104817.8702-3-jiri@resnulli.us> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20180117104657.8605-1-jiri@resnulli.us> References: <20180117104657.8605-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 --- 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 ff071b3..d65f058 100644 --- a/man/man8/tc.8 +++ b/man/man8/tc.8 @@ -43,6 +43,19 @@ tc \- show / manipulate traffic control settings .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 " ]" .B qdisc show [ dev \fIDEV\fR @@ -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 7dd123a..b29f808 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\" 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, @@ -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\" 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, @@ -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)