From patchwork Tue Jan 9 14:19:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 857546 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="0urrh379"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGDmf1tfRz9s75 for ; Wed, 10 Jan 2018 01:19:46 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753977AbeAIOTi (ORCPT ); Tue, 9 Jan 2018 09:19:38 -0500 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) 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=JPBCSuB++nYBG5u4EM5dId55KrA4YdLbl+HOObkz0uo=; b=0urrh379/cTOaHVSokjcvBbLfRe4aWTQlTGksZ/esv52hT3uhxv8S81vaTj6o6BqAs 2I1crbHgRl9P0xq16oMa4axF5My4i8bKO5aTTM89bjQ6sWLB/eczpUQEW0kJSMnczNPL hFnxYYqGGvh+11qbmJKqa0zl6nIV9H3Az+3O/PJvEKfh8wm+3oKFFW+JwosN0zWCLEMn txSXiTIFLisdhZfTORCJAgcCtooReNLLUNw6+5r2lO73/2nK86HKq8b2A5MzQh0U0lpP CluwLJ3ZTBGQkZ8/SKyXXZNfKc2NoydRt1GfyE09PjZF21hq/4aFs5JwQidOnu+owCY9 tbzw== 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=JPBCSuB++nYBG5u4EM5dId55KrA4YdLbl+HOObkz0uo=; b=lg0Y6RotlI4zIiVAVHGc4Wwz2OVgAhhE3YXk9WBa/gcVJeVkVEE4yOmDZZy8G/bVT9 qoHlLA6Bel0PbCEA05B96y8WWg7N/OpesVDUGiV0Wp0jsQ3CSHlvGbrlG26AG3CDP8R5 HuVycY2VQk+RL3sW8bLLZQIqeCZNfKK6xCW0crViA+a9Yl4dljTrsFjAoxzMZPjq3ymT 2C0G6LMFFWn4u1iCgJzAmo9N3PWJGfxaNQ1j9fTQBXhwv7ZH1hhWni3fKIna10nesoit 8p1t5wdJ//WD4EwuCoOxZ629B48CvCZvabbOJ7ZL4lBjvp3rYDnfH8PgycPfeHWUQYzV Q8MA== X-Gm-Message-State: AKGB3mIFNnUzJAHCYmSahohOcUKuqzK09oAq9iXkAwAPdlwi1J0vZ6BJ C6sn1Cp7x4OxitCsmezkhnKYKvUo X-Google-Smtp-Source: ACJfBotuaexUihxXwj7yshztf6hODgRJC7yveQAe6/1GDxCB2vW0B8HOMuasNHxFqzg6Vsn4fluYiA== X-Received: by 10.28.105.193 with SMTP id z62mr12304743wmh.136.1515507563372; Tue, 09 Jan 2018 06:19:23 -0800 (PST) Received: from localhost (ip-94-113-220-78.net.upcbroadband.cz. [94.113.220.78]) by smtp.gmail.com with ESMTPSA id d8sm8563067wrh.62.2018.01.09.06.19.22 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 09 Jan 2018 06:19:23 -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 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> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20180109140731.1022-1-jiri@resnulli.us> References: <20180109140731.1022-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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; }