From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jiri Pirko Subject: [patch iproute2 net-next v7 3/3] tc: implement filter block sharing to ingress and clsact qdiscs Date: Tue, 9 Jan 2018 15:19:18 +0100 Message-ID: <20180109141918.1120-3-jiri@resnulli.us> References: <20180109140731.1022-1-jiri@resnulli.us> 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 To: netdev@vger.kernel.org Return-path: Received: from mail-wm0-f68.google.com ([74.125.82.68]:45257 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752840AbeAIOTY (ORCPT ); Tue, 9 Jan 2018 09:19:24 -0500 Received: by mail-wm0-f68.google.com with SMTP id i186so4421590wmi.4 for ; Tue, 09 Jan 2018 06:19:24 -0800 (PST) In-Reply-To: <20180109140731.1022-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org List-ID: From: Jiri Pirko Signed-off-by: Jiri Pirko --- include/uapi/linux/pkt_sched.h | 11 +++++++++ tc/q_clsact.c | 52 ++++++++++++++++++++++++++++++++++++++---- tc/q_ingress.c | 30 +++++++++++++++++++++--- 3 files changed, 85 insertions(+), 8 deletions(-) diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h index 37b5096..8cc554a 100644 --- a/include/uapi/linux/pkt_sched.h +++ b/include/uapi/linux/pkt_sched.h @@ -934,4 +934,15 @@ enum { #define TCA_CBS_MAX (__TCA_CBS_MAX - 1) +/* Ingress/clsact */ + +enum { + TCA_CLSACT_UNSPEC, + TCA_CLSACT_INGRESS_BLOCK, + TCA_CLSACT_EGRESS_BLOCK, + __TCA_CLSACT_MAX +}; + +#define TCA_CLSACT_MAX (__TCA_CLSACT_MAX - 1) + #endif diff --git a/tc/q_clsact.c b/tc/q_clsact.c index 341f653..c15d01c 100644 --- a/tc/q_clsact.c +++ b/tc/q_clsact.c @@ -7,23 +7,65 @@ static void explain(void) { - fprintf(stderr, "Usage: ... clsact\n"); + fprintf(stderr, "Usage: ... clsact [ingress_block BLOCK_INDEX] [egress_block BLOCK_INDEX]\n"); } static int clsact_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { - if (argc > 0) { - fprintf(stderr, "What is \"%s\"?\n", *argv); - explain(); - return -1; + struct rtattr *tail; + __u32 ingress_block = 0; + __u32 egress_block = 0; + + while (argc > 0) { + if (strcmp(*argv, "ingress_block") == 0) { + NEXT_ARG(); + if (get_u32(&ingress_block, *argv, 0) || !ingress_block) + invarg("invalid ingress block index value", *argv); + } else if (strcmp(*argv, "egress_block") == 0) { + NEXT_ARG(); + if (get_u32(&egress_block, *argv, 0) || !egress_block) + invarg("invalid egress block index value", *argv); + } else { + fprintf(stderr, "What is \"%s\"?\n", *argv); + explain(); + return -1; + } + NEXT_ARG_FWD(); } + tail = NLMSG_TAIL(n); + addattr_l(n, 1024, TCA_OPTIONS, NULL, 0); + if (ingress_block) + addattr32(n, 1024, TCA_CLSACT_INGRESS_BLOCK, ingress_block); + if (egress_block) + addattr32(n, 1024, TCA_CLSACT_EGRESS_BLOCK, egress_block); + tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail; return 0; } static int clsact_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) { + struct rtattr *tb[TCA_CLSACT_MAX + 1]; + __u32 block; + + if (!opt) + return 0; + + parse_rtattr_nested(tb, TCA_CLSACT_MAX, opt); + + if (tb[TCA_CLSACT_INGRESS_BLOCK] && + RTA_PAYLOAD(tb[TCA_CLSACT_INGRESS_BLOCK]) >= sizeof(__u32)) { + block = rta_getattr_u32(tb[TCA_CLSACT_INGRESS_BLOCK]); + print_uint(PRINT_ANY, "ingress_block", + "ingress_block %u ", block); + } + if (tb[TCA_CLSACT_EGRESS_BLOCK] && + RTA_PAYLOAD(tb[TCA_CLSACT_EGRESS_BLOCK]) >= sizeof(__u32)) { + block = rta_getattr_u32(tb[TCA_CLSACT_EGRESS_BLOCK]); + print_uint(PRINT_ANY, "egress_block", + "egress_block %u ", block); + } return 0; } diff --git a/tc/q_ingress.c b/tc/q_ingress.c index 1e42229..c3fcac7 100644 --- a/tc/q_ingress.c +++ b/tc/q_ingress.c @@ -17,30 +17,54 @@ static void explain(void) { - fprintf(stderr, "Usage: ... ingress\n"); + fprintf(stderr, "Usage: ... ingress [block BLOCK_INDEX]\n"); } static int ingress_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev) { + struct rtattr *tail; + __u32 block_index = 0; + while (argc > 0) { if (strcmp(*argv, "handle") == 0) { NEXT_ARG(); - argc--; argv++; + } else if (strcmp(*argv, "block") == 0) { + NEXT_ARG(); + if (get_u32(&block_index, *argv, 0) || !block_index) + invarg("invalid block index value", *argv); } else { fprintf(stderr, "What is \"%s\"?\n", *argv); explain(); return -1; } + NEXT_ARG_FWD(); } + tail = NLMSG_TAIL(n); + addattr_l(n, 1024, TCA_OPTIONS, NULL, 0); + if (block_index) + addattr32(n, 1024, TCA_CLSACT_INGRESS_BLOCK, block_index); + tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail; return 0; } static int ingress_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) { - fprintf(f, "---------------- "); + struct rtattr *tb[TCA_CLSACT_MAX + 1]; + __u32 block_index; + + if (!opt) + return 0; + + parse_rtattr_nested(tb, TCA_CLSACT_MAX, opt); + + if (tb[TCA_CLSACT_INGRESS_BLOCK] && + RTA_PAYLOAD(tb[TCA_CLSACT_INGRESS_BLOCK]) >= sizeof(__u32)) { + block_index = rta_getattr_u32(tb[TCA_CLSACT_INGRESS_BLOCK]); + print_uint(PRINT_ANY, "block", "block %u ", block_index); + } return 0; } -- 2.9.5