From f38f33f8693ed7a4f883b18862e47f822ff8a62d Mon Sep 17 00:00:00 2001 From: Andrea Claudi Date: Tue, 18 Jun 2019 20:04:42 +0200 Subject: [PATCH] tc: implement ingress/egress block index attributes for qdiscs Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1721291 Upstream Status: iproute2.git commit 063463efd7f0d Conflicts: adjust the code to make it compile due to missing commit c91d262f414d2 ("tc: jsonify qdisc core") commit 063463efd7f0d91b7372b089a7b7aff7fc9ac0f6 Author: Jiri Pirko Date: Sat Jan 20 11:00:29 2018 +0100 tc: implement ingress/egress block index attributes for qdiscs 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 Signed-off-by: David Ahern --- man/man8/tc.8 | 6 +++++- tc/tc_qdisc.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/man/man8/tc.8 b/man/man8/tc.8 index c493ccfa7c900..c89a7a8ecf83b 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 f8e06ccf205a0..26d23f43007ae 100644 --- a/tc/tc_qdisc.c +++ b/tc/tc_qdisc.c @@ -32,6 +32,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 ]\n"); @@ -62,6 +63,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) { @@ -122,6 +125,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 { @@ -139,6 +150,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)) @@ -252,6 +270,22 @@ int print_qdisc(const struct sockaddr_nl *who, if (t->tcm_info != 1) fprintf(fp, "refcnt %d ", t->tcm_info); + if (tb[TCA_INGRESS_BLOCK] && + RTA_PAYLOAD(tb[TCA_INGRESS_BLOCK]) >= sizeof(__u32)) { + __u32 block = rta_getattr_u32(tb[TCA_INGRESS_BLOCK]); + + if (block) + fprintf(fp, "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) + fprintf(fp, "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"); -- 2.21.0