Subject: Re: [PATCH iproute2-next 1/2] tc: Look for blocks in qevents

From: Petr Machata <[email-masked]>
Date: Thu, 16 Jul 2020 15:36:49 +0200

Jiri Pirko <[email-masked]> writes:

>>diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c
>>index 8eb08c34..bea8d3c0 100644
>>--- a/tc/tc_qdisc.c
>>+++ b/tc/tc_qdisc.c
>>@@ -477,7 +477,9 @@ static int tc_qdisc_block_exists_cb(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];
>>+	struct qdisc_util *q = NULL;
>
> Pointless initialization.

Ack.

>> 	int len = n->nlmsg_len;
>>+	const char *kind;
>>
>> 	if (n->nlmsg_type != RTM_NEWQDISC)
>> 		return 0;
>>@@ -506,6 +508,14 @@ static int tc_qdisc_block_exists_cb(struct nlmsghdr *n, void *arg)
>> 		if (block == ctx->block_index)
>> 			ctx->found = true;
>> 	}
>>+
>>+	kind = rta_getattr_str(tb[TCA_KIND]);
>>+	q = get_qdisc_kind(kind);
>>+	if (!q)
>>+		return -1;
>>+	if (q->has_block)
>>+		q->has_block(q, tb[TCA_OPTIONS], ctx->block_index, &ctx->found);
>
> Op returns int yet you don't use it. Perhaps it can directly return
> bool?

In theory it could return actual errors (such as an attribute reporting
block 0). I'll have it handle the return value through the usual "err ="
stanza.

>
>>+
>> 	return 0;
>> }
>>
>>diff --git a/tc/tc_qevent.c b/tc/tc_qevent.c
>>index 1f8e6506..2c010fcf 100644
>>--- a/tc/tc_qevent.c
>>+++ b/tc/tc_qevent.c
>>@@ -92,6 +92,21 @@ void qevents_print(struct qevent_util *qevents, FILE *f)
>> 		close_json_array(PRINT_ANY, "");
>> }
>>
>>+bool qevents_have_block(struct qevent_util *qevents, __u32 block_idx)
>>+{
>>+	if (!qevents)
>>+		return false;
>>+
>>+	for (; qevents->id; qevents++) {
>>+		struct qevent_base *qeb = qevents->data;
>>+
>>+		if (qeb->block_idx == block_idx)
>>+			return true;
>>+	}
>>+
>>+	return false;
>>+}
>>+
>> int qevents_dump(struct qevent_util *qevents, struct nlmsghdr *n)
>> {
>> 	int err;
>>diff --git a/tc/tc_qevent.h b/tc/tc_qevent.h
>>index 574e7cff..d60c3f75 100644
>>--- a/tc/tc_qevent.h
>>+++ b/tc/tc_qevent.h
>>@@ -2,6 +2,7 @@
>> #ifndef _TC_QEVENT_H_
>> #define _TC_QEVENT_H_
>>
>>+#include <stdbool.h>
>> #include <linux/types.h>
>> #include <libnetlink.h>
>>
>>@@ -37,6 +38,7 @@ int qevent_parse(struct qevent_util *qevents, int *p_argc, char ***p_argv);
>> int qevents_read(struct qevent_util *qevents, struct rtattr **tb);
>> int qevents_dump(struct qevent_util *qevents, struct nlmsghdr *n);
>> void qevents_print(struct qevent_util *qevents, FILE *f);
>>+bool qevents_have_block(struct qevent_util *qevents, __u32 block_idx);
>>
>> struct qevent_plain {
>> 	struct qevent_base base;
>>diff --git a/tc/tc_util.h b/tc/tc_util.h
>>index edc39138..c8af4e95 100644
>>--- a/tc/tc_util.h
>>+++ b/tc/tc_util.h
>>@@ -5,6 +5,7 @@
>> #define MAX_MSG 16384
>> #include <limits.h>
>> #include <linux/if.h>
>>+#include <stdbool.h>
>>
>> #include <linux/pkt_sched.h>
>> #include <linux/pkt_cls.h>
>>@@ -40,6 +41,7 @@ struct qdisc_util {
>> 	int (*parse_copt)(struct qdisc_util *qu, int argc,
>> 			  char **argv, struct nlmsghdr *n, const char *dev);
>> 	int (*print_copt)(struct qdisc_util *qu, FILE *f, struct rtattr *opt);
>>+	int (*has_block)(struct qdisc_util *qu, struct rtattr *opt, __u32 block_idx, bool *p_has);
>> };
>>
>> extern __u16 f_proto;
>>--
>>2.20.1
>>